Add TI Chronos linux software
authorDan White <dan@whiteaudio.com>
Sun, 8 Jan 2012 00:40:19 +0000 (18:40 -0600)
committerDan White <dan@whiteaudio.com>
Sun, 8 Jan 2012 00:40:19 +0000 (18:40 -0600)
687 files changed:
chronos-ti/Chronos-Setup [new file with mode: 0755]
chronos-ti/Control Center/Chronos Control Center/Media Player Control.ini [new file with mode: 0755]
chronos-ti/Control Center/Chronos Control Center/eZ430-Chronos CC 1_2.tcl [new file with mode: 0755]
chronos-ti/Control Center/Chronos Control Center/eZ430-Chronos-CC.ini [new file with mode: 0755]
chronos-ti/Control Center/Chronos Control Center/eZ430-Chronos_driver.tcl [new file with mode: 0755]
chronos-ti/Control Center/Chronos Control Center/iTunes Control.ini [new file with mode: 0755]
chronos-ti/Control Center/Chronos Control Center/ram_based_updater.txt [new file with mode: 0755]
chronos-ti/Control Center/Chronos Data Logger/eZ430-Chronos Datalogger 1_2.tcl [new file with mode: 0755]
chronos-ti/Control Center/Chronos Data Logger/eZ430-Chronos_driver.tcl [new file with mode: 0755]
chronos-ti/Control Center/Chronos Data Logger/ez430-Chronos-DL.ini [new file with mode: 0755]
chronos-ti/Control Center/Chronos Data Logger/ram_based_updater.txt [new file with mode: 0755]
chronos-ti/Control Center/readme.txt [new file with mode: 0755]
chronos-ti/Documentation/Schematics, Layout & BOM/eZ430-Chronos Access Point/eZ430-Chronos Access Point, BOM, 433 V1.0b.pdf [new file with mode: 0755]
chronos-ti/Documentation/Schematics, Layout & BOM/eZ430-Chronos Access Point/eZ430-Chronos Access Point, BOM, 868 V1.3d.pdf [new file with mode: 0755]
chronos-ti/Documentation/Schematics, Layout & BOM/eZ430-Chronos Access Point/eZ430-Chronos Access Point, BOM, 915 V1.3d.pdf [new file with mode: 0755]
chronos-ti/Documentation/Schematics, Layout & BOM/eZ430-Chronos Access Point/eZ430-Chronos Access Point, Gerbers, 433 V1.0.zip [new file with mode: 0755]
chronos-ti/Documentation/Schematics, Layout & BOM/eZ430-Chronos Access Point/eZ430-Chronos Access Point, Gerbers, 868, 915 V1.3d.zip [new file with mode: 0755]
chronos-ti/Documentation/Schematics, Layout & BOM/eZ430-Chronos Access Point/eZ430-Chronos Access Point, Schematics, 433 V1.0.pdf [new file with mode: 0755]
chronos-ti/Documentation/Schematics, Layout & BOM/eZ430-Chronos Access Point/eZ430-Chronos Access Point, Schematics, 868, 915 V1.3.pdf [new file with mode: 0755]
chronos-ti/Documentation/Schematics, Layout & BOM/eZ430-Chronos Debug Interface/eZ430-Chronos Debug IF BOM V2.0.pdf [new file with mode: 0755]
chronos-ti/Documentation/Schematics, Layout & BOM/eZ430-Chronos Debug Interface/eZ430-Chronos, Debug IF, Gerbers, V2.0.zip [new file with mode: 0755]
chronos-ti/Documentation/Schematics, Layout & BOM/eZ430-Chronos Debug Interface/eZ430-Chronos, Debug IF, Schematic, V2.0.pdf [new file with mode: 0755]
chronos-ti/Documentation/Schematics, Layout & BOM/eZ430-Chronos Watch/eZ430-Chronos Watch, BOM 433 V1.1.pdf [new file with mode: 0755]
chronos-ti/Documentation/Schematics, Layout & BOM/eZ430-Chronos Watch/eZ430-Chronos Watch, BOM, 868, 915 V1.5f.pdf [new file with mode: 0755]
chronos-ti/Documentation/Schematics, Layout & BOM/eZ430-Chronos Watch/eZ430-Chronos Watch, Gerbers, 433 V1.1.zip [new file with mode: 0755]
chronos-ti/Documentation/Schematics, Layout & BOM/eZ430-Chronos Watch/eZ430-Chronos Watch, Gerbers, 868, 915 V1.5.zip [new file with mode: 0755]
chronos-ti/Documentation/Schematics, Layout & BOM/eZ430-Chronos Watch/eZ430-Chronos Watch, Schematics, 433 V1.1.pdf [new file with mode: 0755]
chronos-ti/Documentation/Schematics, Layout & BOM/eZ430-Chronos Watch/eZ430-Chronos Watch, Schematics, 868, 915 V1.5.pdf [new file with mode: 0755]
chronos-ti/Documentation/slau292c.pdf [new file with mode: 0755]
chronos-ti/Recovery/Chronos Watch/Applications/Recovery_ez430_chronos_433MHz.txt [new file with mode: 0755]
chronos-ti/Recovery/Chronos Watch/Applications/Recovery_ez430_chronos_868MHz.txt [new file with mode: 0755]
chronos-ti/Recovery/Chronos Watch/Applications/Recovery_ez430_chronos_915MHz.txt [new file with mode: 0755]
chronos-ti/Recovery/Chronos Watch/Applications/Recovery_ez430_chronos_datalogger_433MHz.txt [new file with mode: 0755]
chronos-ti/Recovery/Chronos Watch/Applications/Recovery_ez430_chronos_datalogger_868MHz.txt [new file with mode: 0755]
chronos-ti/Recovery/Chronos Watch/Applications/Recovery_ez430_chronos_datalogger_915MHz.txt [new file with mode: 0755]
chronos-ti/Recovery/Chronos Watch/Wireless Updater/Recovery_eZ430_Chronos_rfbsl_433MHz_1_0.txt [new file with mode: 0755]
chronos-ti/Recovery/Chronos Watch/Wireless Updater/Recovery_eZ430_Chronos_rfbsl_868MHz_1_0.txt [new file with mode: 0755]
chronos-ti/Recovery/Chronos Watch/Wireless Updater/Recovery_eZ430_Chronos_rfbsl_915MHz_1_0.txt [new file with mode: 0755]
chronos-ti/Recovery/RF Access Point/Recovery_eZ430-Chronos_AP_433MHz_1_2.hex [new file with mode: 0755]
chronos-ti/Recovery/RF Access Point/Recovery_eZ430-Chronos_AP_868MHz_1_2.hex [new file with mode: 0755]
chronos-ti/Recovery/RF Access Point/Recovery_eZ430-Chronos_AP_915MHz_1_2.hex [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/.ccsproject [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/.cdtbuild [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/.cdtproject [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/.project [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/.settings/org.eclipse.cdt.managedbuilder.core.prefs [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/CC430F6137.ccxml [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/bluerobin/BlueRobin_RX_433MHz.lib [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/bluerobin/BlueRobin_RX_868MHz.lib [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/bluerobin/BlueRobin_RX_915MHz.lib [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/bluerobin/BlueRobin_RX_API.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/bluerobin/bm.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/change_record.txt [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/driver/adc12.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/driver/adc12.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/driver/buzzer.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/driver/buzzer.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/driver/display.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/driver/display.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/driver/ez430_chronos_datalogger_drivers.lib [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/driver/flash.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/driver/flash.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/driver/pmm.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/driver/pmm.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/driver/ports.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/driver/ports.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/driver/radio.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/driver/radio.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/driver/rf1a.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/driver/rf1a.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/driver/timer.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/driver/timer.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/driver/vti_as.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/driver/vti_as.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/driver/vti_ps.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/driver/vti_ps.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/include/project.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/lnk_cc430f6137.cmd [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/logic/acceleration.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/logic/acceleration.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/logic/altitude.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/logic/altitude.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/logic/battery.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/logic/battery.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/logic/bluerobin.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/logic/bluerobin.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/logic/clock.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/logic/clock.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/logic/datalog.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/logic/datalog.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/logic/date.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/logic/date.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/logic/menu.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/logic/menu.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/logic/rfbsl.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/logic/rfbsl.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/logic/rfsimpliciti.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/logic/rfsimpliciti.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/logic/temperature.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/logic/temperature.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/logic/user.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/logic/user.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/main.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/Applications/application/End Device/main_ED_BM.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/Applications/configuration/End Device/smpl_config.dat [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/Applications/configuration/smpl_nwk_config.dat [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/CC430_End_Device_433MHz.lib [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/CC430_End_Device_868MHz.lib [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/CC430_End_Device_915MHz.lib [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/Components/bsp/boards/CC430EM/bsp_board.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/Components/bsp/boards/CC430EM/bsp_board_defs.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/Components/bsp/boards/CC430EM/bsp_button_defs.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/Components/bsp/boards/CC430EM/bsp_config.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/Components/bsp/boards/CC430EM/bsp_driver_defs.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/Components/bsp/boards/CC430EM/bsp_drivers.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/Components/bsp/boards/CC430EM/bsp_external/mrfi_board_defs.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/Components/bsp/boards/CC430EM/bsp_led_defs.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/Components/bsp/bsp.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/Components/bsp/bsp.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/Components/bsp/bsp_macros.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/Components/bsp/drivers/bsp_buttons.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/Components/bsp/drivers/bsp_leds.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/Components/bsp/drivers/code/bsp_buttons.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/Components/bsp/drivers/code/bsp_generic_buttons.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/Components/bsp/drivers/code/bsp_generic_leds.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/Components/bsp/drivers/code/bsp_leds.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/Components/bsp/mcus/bsp_msp430_defs.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/Components/mrfi/mrfi.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/Components/mrfi/mrfi.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/Components/mrfi/mrfi_defs.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/Components/mrfi/radios/family5/mrfi_radio.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/Components/mrfi/radios/family5/mrfi_radio_interface.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/Components/mrfi/radios/family5/mrfi_radio_interface.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/Components/mrfi/smartrf/CC1101/smartrf_CC1101.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/Components/mrfi/smartrf/CC430/smartrf_CC430.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/Components/nwk/nwk.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/Components/nwk/nwk.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/Components/nwk/nwk_QMgmt.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/Components/nwk/nwk_QMgmt.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/Components/nwk/nwk_api.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/Components/nwk/nwk_api.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/Components/nwk/nwk_app.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/Components/nwk/nwk_frame.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/Components/nwk/nwk_frame.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/Components/nwk/nwk_globals.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/Components/nwk/nwk_globals.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/Components/nwk/nwk_types.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/Components/nwk_applications/nwk_freq.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/Components/nwk_applications/nwk_freq.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/Components/nwk_applications/nwk_ioctl.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/Components/nwk_applications/nwk_ioctl.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/Components/nwk_applications/nwk_join.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/Components/nwk_applications/nwk_join.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/Components/nwk_applications/nwk_link.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/Components/nwk_applications/nwk_link.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/Components/nwk_applications/nwk_mgmt.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/Components/nwk_applications/nwk_mgmt.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/Components/nwk_applications/nwk_ping.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/Components/nwk_applications/nwk_ping.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/Components/nwk_applications/nwk_security.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/Components/nwk_applications/nwk_security.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/simpliciti.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/simpliciti_readme.txt [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/.ccsproject [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/.cdtbuild [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/.cdtproject [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/.project [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/.settings/org.eclipse.cdt.managedbuilder.core.prefs [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/.settings/org.eclipse.ltk.core.refactoring.prefs [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/CC430F6137.ccxml [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/bluerobin/BlueRobin_RX_433MHz.lib [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/bluerobin/BlueRobin_RX_868MHz.lib [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/bluerobin/BlueRobin_RX_915MHz.lib [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/bluerobin/BlueRobin_RX_API.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/bluerobin/bm.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/change_record.txt [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/driver/adc12.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/driver/adc12.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/driver/buzzer.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/driver/buzzer.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/driver/display.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/driver/display.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/driver/ez430_chronos_drivers.lib [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/driver/pmm.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/driver/pmm.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/driver/ports.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/driver/ports.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/driver/radio.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/driver/radio.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/driver/rf1a.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/driver/rf1a.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/driver/timer.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/driver/timer.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/driver/vti_as.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/driver/vti_as.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/driver/vti_ps.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/driver/vti_ps.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/include/project.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/lnk_cc430f6137.cmd [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/logic/acceleration.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/logic/acceleration.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/logic/alarm.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/logic/alarm.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/logic/altitude.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/logic/altitude.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/logic/battery.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/logic/battery.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/logic/bluerobin.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/logic/bluerobin.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/logic/clock.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/logic/clock.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/logic/date.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/logic/date.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/logic/menu.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/logic/menu.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/logic/rfbsl.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/logic/rfbsl.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/logic/rfsimpliciti.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/logic/rfsimpliciti.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/logic/stopwatch.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/logic/stopwatch.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/logic/temperature.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/logic/temperature.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/logic/test.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/logic/test.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/logic/user.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/logic/user.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/main.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/simpliciti/Applications/application/End Device/main_ED_BM.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/simpliciti/Applications/configuration/End Device/smpl_config.dat [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/simpliciti/Applications/configuration/smpl_nwk_config.dat [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/simpliciti/CC430_End_Device_433MHz.lib [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/simpliciti/CC430_End_Device_868MHz.lib [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/simpliciti/CC430_End_Device_915MHz.lib [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/simpliciti/Components/bsp/boards/CC430EM/bsp_board.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/simpliciti/Components/bsp/boards/CC430EM/bsp_board_defs.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/simpliciti/Components/bsp/boards/CC430EM/bsp_button_defs.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/simpliciti/Components/bsp/boards/CC430EM/bsp_config.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/simpliciti/Components/bsp/boards/CC430EM/bsp_driver_defs.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/simpliciti/Components/bsp/boards/CC430EM/bsp_drivers.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/simpliciti/Components/bsp/boards/CC430EM/bsp_external/mrfi_board_defs.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/simpliciti/Components/bsp/boards/CC430EM/bsp_led_defs.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/simpliciti/Components/bsp/bsp.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/simpliciti/Components/bsp/bsp.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/simpliciti/Components/bsp/bsp_macros.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/simpliciti/Components/bsp/drivers/bsp_buttons.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/simpliciti/Components/bsp/drivers/bsp_leds.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/simpliciti/Components/bsp/drivers/code/bsp_buttons.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/simpliciti/Components/bsp/drivers/code/bsp_generic_buttons.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/simpliciti/Components/bsp/drivers/code/bsp_generic_leds.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/simpliciti/Components/bsp/drivers/code/bsp_leds.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/simpliciti/Components/bsp/mcus/bsp_msp430_defs.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/simpliciti/Components/mrfi/mrfi.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/simpliciti/Components/mrfi/mrfi.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/simpliciti/Components/mrfi/mrfi_defs.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/simpliciti/Components/mrfi/radios/family5/mrfi_radio.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/simpliciti/Components/mrfi/radios/family5/mrfi_radio_interface.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/simpliciti/Components/mrfi/radios/family5/mrfi_radio_interface.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/simpliciti/Components/mrfi/smartrf/CC430/smartrf_CC430.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/simpliciti/Components/nwk/nwk.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/simpliciti/Components/nwk/nwk.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/simpliciti/Components/nwk/nwk_QMgmt.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/simpliciti/Components/nwk/nwk_QMgmt.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/simpliciti/Components/nwk/nwk_api.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/simpliciti/Components/nwk/nwk_api.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/simpliciti/Components/nwk/nwk_app.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/simpliciti/Components/nwk/nwk_frame.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/simpliciti/Components/nwk/nwk_frame.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/simpliciti/Components/nwk/nwk_globals.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/simpliciti/Components/nwk/nwk_globals.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/simpliciti/Components/nwk/nwk_types.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/simpliciti/Components/nwk_applications/nwk_freq.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/simpliciti/Components/nwk_applications/nwk_freq.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/simpliciti/Components/nwk_applications/nwk_ioctl.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/simpliciti/Components/nwk_applications/nwk_ioctl.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/simpliciti/Components/nwk_applications/nwk_join.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/simpliciti/Components/nwk_applications/nwk_join.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/simpliciti/Components/nwk_applications/nwk_link.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/simpliciti/Components/nwk_applications/nwk_link.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/simpliciti/Components/nwk_applications/nwk_mgmt.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/simpliciti/Components/nwk_applications/nwk_mgmt.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/simpliciti/Components/nwk_applications/nwk_ping.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/simpliciti/Components/nwk_applications/nwk_ping.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/simpliciti/Components/nwk_applications/nwk_security.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/simpliciti/Components/nwk_applications/nwk_security.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/simpliciti/simpliciti.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/simpliciti/simpliciti_readme.txt [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/bluerobin/BlueRobin_RX_433MHz.r43 [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/bluerobin/BlueRobin_RX_868MHz.r43 [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/bluerobin/BlueRobin_RX_915MHz.r43 [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/bluerobin/BlueRobin_RX_API.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/bluerobin/bm.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/change_record.txt [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/driver/adc12.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/driver/adc12.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/driver/buzzer.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/driver/buzzer.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/driver/display.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/driver/display.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/driver/ez430_chronos_datalogger_codesize_limited_drivers.r43 [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/driver/flash.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/driver/flash.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/driver/pmm.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/driver/pmm.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/driver/ports.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/driver/ports.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/driver/radio.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/driver/radio.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/driver/rf1a.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/driver/rf1a.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/driver/timer.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/driver/timer.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/driver/vti_as.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/driver/vti_as.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/driver/vti_ps.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/driver/vti_ps.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/ez430_chronos_datalogger.ewd [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/ez430_chronos_datalogger.ewp [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/ez430_chronos_datalogger.eww [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/include/project.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/lnkcc430f6137.xcl [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/logic/acceleration.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/logic/acceleration.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/logic/altitude.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/logic/altitude.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/logic/battery.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/logic/battery.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/logic/bluerobin.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/logic/bluerobin.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/logic/clock.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/logic/clock.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/logic/datalog.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/logic/datalog.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/logic/date.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/logic/date.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/logic/menu.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/logic/menu.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/logic/rfbsl.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/logic/rfbsl.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/logic/rfsimpliciti.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/logic/rfsimpliciti.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/logic/temperature.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/logic/temperature.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/logic/user.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/logic/user.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/main.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/settings/ez430_chronos_datalogger.cspy.bat [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/settings/ez430_chronos_datalogger.dbgdt [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/settings/ez430_chronos_datalogger.dni [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/settings/ez430_chronos_datalogger.wsdt [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/Applications/application/End Device/main_ED_BM.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/Applications/configuration/End Device/smpl_config.dat [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/Applications/configuration/smpl_nwk_config.dat [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/CC430_End_Device_433MHz.r43 [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/CC430_End_Device_868MHz.r43 [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/CC430_End_Device_915MHz.r43 [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/Components/bsp/boards/CC430EM/bsp_board.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/Components/bsp/boards/CC430EM/bsp_board_defs.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/Components/bsp/boards/CC430EM/bsp_button_defs.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/Components/bsp/boards/CC430EM/bsp_config.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/Components/bsp/boards/CC430EM/bsp_driver_defs.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/Components/bsp/boards/CC430EM/bsp_drivers.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/Components/bsp/boards/CC430EM/bsp_external/mrfi_board_defs.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/Components/bsp/boards/CC430EM/bsp_led_defs.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/Components/bsp/bsp.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/Components/bsp/bsp.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/Components/bsp/bsp_macros.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/Components/bsp/drivers/bsp_buttons.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/Components/bsp/drivers/bsp_leds.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/Components/bsp/drivers/code/bsp_buttons.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/Components/bsp/drivers/code/bsp_generic_buttons.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/Components/bsp/drivers/code/bsp_generic_leds.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/Components/bsp/drivers/code/bsp_leds.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/Components/bsp/mcus/bsp_msp430_defs.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/Components/mrfi/mrfi.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/Components/mrfi/mrfi.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/Components/mrfi/mrfi_defs.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/Components/mrfi/radios/family5/mrfi_radio.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/Components/mrfi/radios/family5/mrfi_radio_interface.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/Components/mrfi/radios/family5/mrfi_radio_interface.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/Components/mrfi/smartrf/CC1101/smartrf_CC1101.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/Components/mrfi/smartrf/CC430/smartrf_CC430.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/Components/nwk/nwk.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/Components/nwk/nwk.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/Components/nwk/nwk_QMgmt.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/Components/nwk/nwk_QMgmt.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/Components/nwk/nwk_api.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/Components/nwk/nwk_api.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/Components/nwk/nwk_app.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/Components/nwk/nwk_frame.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/Components/nwk/nwk_frame.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/Components/nwk/nwk_globals.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/Components/nwk/nwk_globals.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/Components/nwk/nwk_types.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/Components/nwk_applications/nwk_freq.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/Components/nwk_applications/nwk_freq.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/Components/nwk_applications/nwk_ioctl.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/Components/nwk_applications/nwk_ioctl.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/Components/nwk_applications/nwk_join.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/Components/nwk_applications/nwk_join.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/Components/nwk_applications/nwk_link.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/Components/nwk_applications/nwk_link.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/Components/nwk_applications/nwk_mgmt.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/Components/nwk_applications/nwk_mgmt.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/Components/nwk_applications/nwk_ping.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/Components/nwk_applications/nwk_ping.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/Components/nwk_applications/nwk_security.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/Components/nwk_applications/nwk_security.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/simpliciti.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/simpliciti_readme.txt [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/bluerobin/BlueRobin_RX_433MHz.r43 [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/bluerobin/BlueRobin_RX_868MHz.r43 [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/bluerobin/BlueRobin_RX_915MHz.r43 [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/bluerobin/BlueRobin_RX_API.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/bluerobin/bm.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/change_record.txt [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/driver/adc12.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/driver/adc12.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/driver/buzzer.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/driver/buzzer.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/driver/display.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/driver/display.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/driver/ez430_chronos_drivers.r43 [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/driver/pmm.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/driver/pmm.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/driver/ports.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/driver/ports.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/driver/radio.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/driver/radio.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/driver/rf1a.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/driver/rf1a.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/driver/timer.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/driver/timer.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/driver/vti_as.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/driver/vti_as.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/driver/vti_ps.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/driver/vti_ps.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/ez430_chronos.ewd [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/ez430_chronos.ewp [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/ez430_chronos.eww [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/include/project.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/logic/acceleration.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/logic/acceleration.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/logic/alarm.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/logic/alarm.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/logic/altitude.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/logic/altitude.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/logic/battery.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/logic/battery.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/logic/bluerobin.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/logic/bluerobin.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/logic/clock.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/logic/clock.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/logic/date.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/logic/date.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/logic/menu.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/logic/menu.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/logic/rfbsl.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/logic/rfbsl.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/logic/rfsimpliciti.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/logic/rfsimpliciti.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/logic/stopwatch.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/logic/stopwatch.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/logic/temperature.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/logic/temperature.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/logic/test.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/logic/test.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/logic/user.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/logic/user.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/main.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/settings/ez430_chronos.cspy.bat [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/settings/ez430_chronos.dbgdt [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/settings/ez430_chronos.dni [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/settings/ez430_chronos.wsdt [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/Applications/application/End Device/main_ED_BM.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/Applications/configuration/End Device/smpl_config.dat [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/Applications/configuration/smpl_nwk_config.dat [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/CC430_End_Device_433MHz.r43 [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/CC430_End_Device_868MHz.r43 [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/CC430_End_Device_915MHz.r43 [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/Components/bsp/boards/CC430EM/bsp_board.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/Components/bsp/boards/CC430EM/bsp_board_defs.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/Components/bsp/boards/CC430EM/bsp_button_defs.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/Components/bsp/boards/CC430EM/bsp_config.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/Components/bsp/boards/CC430EM/bsp_driver_defs.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/Components/bsp/boards/CC430EM/bsp_drivers.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/Components/bsp/boards/CC430EM/bsp_external/mrfi_board_defs.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/Components/bsp/boards/CC430EM/bsp_led_defs.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/Components/bsp/bsp.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/Components/bsp/bsp.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/Components/bsp/bsp_macros.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/Components/bsp/drivers/bsp_buttons.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/Components/bsp/drivers/bsp_leds.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/Components/bsp/drivers/code/bsp_buttons.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/Components/bsp/drivers/code/bsp_generic_buttons.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/Components/bsp/drivers/code/bsp_generic_leds.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/Components/bsp/drivers/code/bsp_leds.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/Components/bsp/mcus/bsp_msp430_defs.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/Components/mrfi/mrfi.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/Components/mrfi/mrfi.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/Components/mrfi/mrfi_defs.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/Components/mrfi/radios/family5/mrfi_radio.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/Components/mrfi/radios/family5/mrfi_radio_interface.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/Components/mrfi/radios/family5/mrfi_radio_interface.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/Components/mrfi/smartrf/CC1101/smartrf_CC1101.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/Components/mrfi/smartrf/CC430/smartrf_CC430.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/Components/nwk/nwk.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/Components/nwk/nwk.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/Components/nwk/nwk_QMgmt.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/Components/nwk/nwk_QMgmt.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/Components/nwk/nwk_api.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/Components/nwk/nwk_api.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/Components/nwk/nwk_app.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/Components/nwk/nwk_frame.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/Components/nwk/nwk_frame.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/Components/nwk/nwk_globals.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/Components/nwk/nwk_globals.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/Components/nwk/nwk_types.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/Components/nwk_applications/nwk_freq.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/Components/nwk_applications/nwk_freq.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/Components/nwk_applications/nwk_ioctl.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/Components/nwk_applications/nwk_ioctl.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/Components/nwk_applications/nwk_join.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/Components/nwk_applications/nwk_join.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/Components/nwk_applications/nwk_link.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/Components/nwk_applications/nwk_link.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/Components/nwk_applications/nwk_mgmt.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/Components/nwk_applications/nwk_mgmt.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/Components/nwk_applications/nwk_ping.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/Components/nwk_applications/nwk_ping.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/Components/nwk_applications/nwk_security.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/Components/nwk_applications/nwk_security.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/simpliciti.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/simpliciti_readme.txt [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Wireless Update/RFBSL_Low_Level_Init.s43 [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Wireless Update/Wireless_Update.ewd [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Wireless Update/Wireless_Update.ewp [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Wireless Update/Wireless_Update.eww [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Wireless Update/display.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Wireless Update/display.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Wireless Update/display1.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Wireless Update/flash_based_lnkcc430F6137.xcl [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Wireless Update/project_defs.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Wireless Update/radio.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Wireless Update/radio.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Wireless Update/ram_based_lnkcc430F6137.xcl [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Wireless Update/rf1a.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Wireless Update/rf1a.h [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Wireless Update/settings/Wireless_Update.cspy.bat [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Wireless Update/settings/Wireless_Update.dbgdt [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Wireless Update/settings/Wireless_Update.dni [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Wireless Update/settings/Wireless_Update.wsdt [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Wireless Update/settings/flash_based_rfbsl.cspy.bat [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Wireless Update/settings/flash_based_rfbsl.dbgdt [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Wireless Update/settings/flash_based_rfbsl.dni [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Wireless Update/settings/flash_based_rfbsl.wsdt [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Wireless Update/wbsl.c [new file with mode: 0755]
chronos-ti/Software Projects/Chronos Watch/IAR/Wireless Update/wbsl.h [new file with mode: 0755]
chronos-ti/Software Projects/RF Access Point/IAR/BM_API.h [new file with mode: 0755]
chronos-ti/Software Projects/RF Access Point/IAR/HAL/include/hal.h [new file with mode: 0755]
chronos-ti/Software Projects/RF Access Point/IAR/HAL/include/hal_defs.h [new file with mode: 0755]
chronos-ti/Software Projects/RF Access Point/IAR/HAL/include/hal_int.h [new file with mode: 0755]
chronos-ti/Software Projects/RF Access Point/IAR/HAL/include/hal_led.h [new file with mode: 0755]
chronos-ti/Software Projects/RF Access Point/IAR/HAL/include/hal_mcu.h [new file with mode: 0755]
chronos-ti/Software Projects/RF Access Point/IAR/HAL/include/hal_types.h [new file with mode: 0755]
chronos-ti/Software Projects/RF Access Point/IAR/HAL/source/adcSampleSingle.c [new file with mode: 0755]
chronos-ti/Software Projects/RF Access Point/IAR/HAL/source/cc8051/hal_cc8051.h [new file with mode: 0755]
chronos-ti/Software Projects/RF Access Point/IAR/HAL/source/clock.c [new file with mode: 0755]
chronos-ti/Software Projects/RF Access Point/IAR/HAL/source/clock.h [new file with mode: 0755]
chronos-ti/Software Projects/RF Access Point/IAR/HAL/source/hal_assert.c [new file with mode: 0755]
chronos-ti/Software Projects/RF Access Point/IAR/HAL/source/hal_board.c [new file with mode: 0755]
chronos-ti/Software Projects/RF Access Point/IAR/HAL/source/hal_board.h [new file with mode: 0755]
chronos-ti/Software Projects/RF Access Point/IAR/HAL/source/hal_button.c [new file with mode: 0755]
chronos-ti/Software Projects/RF Access Point/IAR/HAL/source/hal_int.c [new file with mode: 0755]
chronos-ti/Software Projects/RF Access Point/IAR/HAL/source/hal_led.c [new file with mode: 0755]
chronos-ti/Software Projects/RF Access Point/IAR/HAL/source/hal_mcu.c [new file with mode: 0755]
chronos-ti/Software Projects/RF Access Point/IAR/HAL/source/rfConfig.c [new file with mode: 0755]
chronos-ti/Software Projects/RF Access Point/IAR/HAL/source/setTimer2Period.c [new file with mode: 0755]
chronos-ti/Software Projects/RF Access Point/IAR/HAL/source/setTimer34Period.c [new file with mode: 0755]
chronos-ti/Software Projects/RF Access Point/IAR/HAL/source/util_critical_section.s51 [new file with mode: 0755]
chronos-ti/Software Projects/RF Access Point/IAR/HAL/source/wait.c [new file with mode: 0755]
chronos-ti/Software Projects/RF Access Point/IAR/bm-br1/BlueRobin_TX_433MHz.r51 [new file with mode: 0755]
chronos-ti/Software Projects/RF Access Point/IAR/bm-br1/BlueRobin_TX_868MHz.r51 [new file with mode: 0755]
chronos-ti/Software Projects/RF Access Point/IAR/bm-br1/BlueRobin_TX_915MHz.r51 [new file with mode: 0755]
chronos-ti/Software Projects/RF Access Point/IAR/bm-br1/bm.h [new file with mode: 0755]
chronos-ti/Software Projects/RF Access Point/IAR/bm-br1/project.h [new file with mode: 0755]
chronos-ti/Software Projects/RF Access Point/IAR/cc1111_usb_dongle.ewd [new file with mode: 0755]
chronos-ti/Software Projects/RF Access Point/IAR/cc1111_usb_dongle.ewp [new file with mode: 0755]
chronos-ti/Software Projects/RF Access Point/IAR/cc1111_usb_dongle.eww [new file with mode: 0755]
chronos-ti/Software Projects/RF Access Point/IAR/change_record.txt [new file with mode: 0755]
chronos-ti/Software Projects/RF Access Point/IAR/flash.c [new file with mode: 0755]
chronos-ti/Software Projects/RF Access Point/IAR/flash.h [new file with mode: 0755]
chronos-ti/Software Projects/RF Access Point/IAR/main.c [new file with mode: 0755]
chronos-ti/Software Projects/RF Access Point/IAR/rftest.c [new file with mode: 0755]
chronos-ti/Software Projects/RF Access Point/IAR/rftest.h [new file with mode: 0755]
chronos-ti/Software Projects/RF Access Point/IAR/settings/cc1111_usb_dongle.cspy.bat [new file with mode: 0755]
chronos-ti/Software Projects/RF Access Point/IAR/settings/cc1111_usb_dongle.dbgdt [new file with mode: 0755]
chronos-ti/Software Projects/RF Access Point/IAR/settings/cc1111_usb_dongle.dni [new file with mode: 0755]
chronos-ti/Software Projects/RF Access Point/IAR/settings/cc1111_usb_dongle.wsdt [new file with mode: 0755]
chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/Applications/app_remap_led.h [new file with mode: 0755]
chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/Applications/main_AP_BM.c [new file with mode: 0755]
chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/CC1111 - Access Point - 433MHz.r51 [new file with mode: 0755]
chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/CC1111 - Access Point - 868MHz.r51 [new file with mode: 0755]
chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/CC1111 - Access Point - 915MHz.r51 [new file with mode: 0755]
chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/Components/bsp/boards/RFUSB/bsp_board.c [new file with mode: 0755]
chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/Components/bsp/boards/RFUSB/bsp_board_defs.h [new file with mode: 0755]
chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/Components/bsp/boards/RFUSB/bsp_button_defs.h [new file with mode: 0755]
chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/Components/bsp/boards/RFUSB/bsp_driver_defs.h [new file with mode: 0755]
chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/Components/bsp/boards/RFUSB/bsp_drivers.c [new file with mode: 0755]
chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/Components/bsp/boards/RFUSB/bsp_external/mrfi_board_defs.h [new file with mode: 0755]
chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/Components/bsp/boards/RFUSB/bsp_led_defs.h [new file with mode: 0755]
chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/Components/bsp/bsp.c [new file with mode: 0755]
chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/Components/bsp/bsp.h [new file with mode: 0755]
chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/Components/bsp/bsp_macros.h [new file with mode: 0755]
chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/Components/bsp/drivers/bsp_buttons.h [new file with mode: 0755]
chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/Components/bsp/drivers/bsp_leds.h [new file with mode: 0755]
chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/Components/bsp/drivers/code/bsp_buttons.c [new file with mode: 0755]
chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/Components/bsp/drivers/code/bsp_generic_buttons.h [new file with mode: 0755]
chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/Components/bsp/drivers/code/bsp_generic_leds.h [new file with mode: 0755]
chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/Components/bsp/drivers/code/bsp_leds.c [new file with mode: 0755]
chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/Components/bsp/mcus/bsp_8051_defs.h [new file with mode: 0755]
chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/Components/bsp/mcus/bsp_msp430_defs.h [new file with mode: 0755]
chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/Components/mrfi/mrfi.c [new file with mode: 0755]
chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/Components/mrfi/mrfi.h [new file with mode: 0755]
chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/Components/mrfi/mrfi_defs.h [new file with mode: 0755]
chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/Components/mrfi/radios/common/mrfi_f1f2.c [new file with mode: 0755]
chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/Components/mrfi/radios/common/mrfi_f1f2.h [new file with mode: 0755]
chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/Components/mrfi/radios/family2/mrfi_radio.c [new file with mode: 0755]
chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/Components/mrfi/smartrf/CC1111/smartrf_CC1111.h [new file with mode: 0755]
chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/Components/nwk/nwk.c [new file with mode: 0755]
chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/Components/nwk/nwk.h [new file with mode: 0755]
chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/Components/nwk/nwk_QMgmt.c [new file with mode: 0755]
chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/Components/nwk/nwk_QMgmt.h [new file with mode: 0755]
chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/Components/nwk/nwk_api.c [new file with mode: 0755]
chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/Components/nwk/nwk_api.h [new file with mode: 0755]
chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/Components/nwk/nwk_app.h [new file with mode: 0755]
chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/Components/nwk/nwk_frame.c [new file with mode: 0755]
chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/Components/nwk/nwk_frame.h [new file with mode: 0755]
chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/Components/nwk/nwk_globals.c [new file with mode: 0755]
chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/Components/nwk/nwk_globals.h [new file with mode: 0755]
chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/Components/nwk/nwk_types.h [new file with mode: 0755]
chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/Components/nwk_applications/nwk_freq.c [new file with mode: 0755]
chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/Components/nwk_applications/nwk_freq.h [new file with mode: 0755]
chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/Components/nwk_applications/nwk_ioctl.c [new file with mode: 0755]
chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/Components/nwk_applications/nwk_ioctl.h [new file with mode: 0755]
chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/Components/nwk_applications/nwk_join.c [new file with mode: 0755]
chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/Components/nwk_applications/nwk_join.h [new file with mode: 0755]
chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/Components/nwk_applications/nwk_link.c [new file with mode: 0755]
chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/Components/nwk_applications/nwk_link.h [new file with mode: 0755]
chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/Components/nwk_applications/nwk_mgmt.c [new file with mode: 0755]
chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/Components/nwk_applications/nwk_mgmt.h [new file with mode: 0755]
chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/Components/nwk_applications/nwk_ping.c [new file with mode: 0755]
chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/Components/nwk_applications/nwk_ping.h [new file with mode: 0755]
chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/Components/nwk_applications/nwk_security.c [new file with mode: 0755]
chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/Components/nwk_applications/nwk_security.h [new file with mode: 0755]
chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/Configuration/Access Point/smpl_config.dat [new file with mode: 0755]
chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/Configuration/smpl_nwk_config.dat [new file with mode: 0755]
chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/simpliciti.h [new file with mode: 0755]
chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/simpliciti_readme.txt [new file with mode: 0755]
chronos-ti/Software Projects/RF Access Point/IAR/timer1.c [new file with mode: 0755]
chronos-ti/Software Projects/RF Access Point/IAR/timer1.h [new file with mode: 0755]
chronos-ti/Software Projects/RF Access Point/IAR/usb/class_cdc/usb_cdc.h [new file with mode: 0755]
chronos-ti/Software Projects/RF Access Point/IAR/usb/class_cdc/usb_cdc_descriptor.s51 [new file with mode: 0755]
chronos-ti/Software Projects/RF Access Point/IAR/usb/class_cdc/usb_cdc_hooks.c [new file with mode: 0755]
chronos-ti/Software Projects/RF Access Point/IAR/usb/class_cdc/usb_firmware_library_config.c [new file with mode: 0755]
chronos-ti/Software Projects/RF Access Point/IAR/usb/class_cdc/usb_firmware_library_config.h [new file with mode: 0755]
chronos-ti/Software Projects/RF Access Point/IAR/usb/class_cdc/usb_firmware_library_headers.h [new file with mode: 0755]
chronos-ti/Software Projects/RF Access Point/IAR/usb/class_cdc/usb_uart.c [new file with mode: 0755]
chronos-ti/Software Projects/RF Access Point/IAR/usb/class_cdc/usb_uart.h [new file with mode: 0755]
chronos-ti/Software Projects/RF Access Point/IAR/usb/library/ccxx11/usb_interrupt.c [new file with mode: 0755]
chronos-ti/Software Projects/RF Access Point/IAR/usb/library/ccxx11/usb_suspend.c [new file with mode: 0755]
chronos-ti/Software Projects/RF Access Point/IAR/usb/library/usb_descriptor.h [new file with mode: 0755]
chronos-ti/Software Projects/RF Access Point/IAR/usb/library/usb_descriptor_parser.c [new file with mode: 0755]
chronos-ti/Software Projects/RF Access Point/IAR/usb/library/usb_descriptor_parser.h [new file with mode: 0755]
chronos-ti/Software Projects/RF Access Point/IAR/usb/library/usb_framework.c [new file with mode: 0755]
chronos-ti/Software Projects/RF Access Point/IAR/usb/library/usb_framework.h [new file with mode: 0755]
chronos-ti/Software Projects/RF Access Point/IAR/usb/library/usb_framework_structs.h [new file with mode: 0755]
chronos-ti/Software Projects/RF Access Point/IAR/usb/library/usb_interrupt.h [new file with mode: 0755]
chronos-ti/Software Projects/RF Access Point/IAR/usb/library/usb_reg.h [new file with mode: 0755]
chronos-ti/Software Projects/RF Access Point/IAR/usb/library/usb_standard_requests.c [new file with mode: 0755]
chronos-ti/Software Projects/RF Access Point/IAR/usb/library/usb_standard_requests.h [new file with mode: 0755]
chronos-ti/Software Projects/RF Access Point/IAR/usb/library/usb_suspend.h [new file with mode: 0755]
chronos-ti/Software Projects/RF Access Point/IAR/usb/usb_driver.r51 [new file with mode: 0755]
chronos-ti/Software Projects/RF Access Point/IAR/wbsl/ioCCxx10_bitdef.h [new file with mode: 0755]
chronos-ti/Software Projects/RF Access Point/IAR/wbsl/wbsl.c [new file with mode: 0755]
chronos-ti/Software Projects/RF Access Point/IAR/wbsl/wbsl.h [new file with mode: 0755]
chronos-ti/uninstall [new file with mode: 0755]

diff --git a/chronos-ti/Chronos-Setup b/chronos-ti/Chronos-Setup
new file mode 100755 (executable)
index 0000000..63177cf
Binary files /dev/null and b/chronos-ti/Chronos-Setup differ
diff --git a/chronos-ti/Control Center/Chronos Control Center/Media Player Control.ini b/chronos-ti/Control Center/Chronos Control Center/Media Player Control.ini
new file mode 100755 (executable)
index 0000000..07dfcd8
--- /dev/null
@@ -0,0 +1,16 @@
+pd_m1=F\r
+pd_m2=P\r
+pd_s1=B\r
+cb_m1_windows=0\r
+cb_m1_alt=0\r
+cb_m1_ctrl=1\r
+cb_m1_shift=0\r
+cb_s1_windows=0\r
+cb_s1_alt=0\r
+cb_s1_ctrl=1\r
+cb_s1_shift=0\r
+cb_m2_windows=0\r
+cb_m2_alt=0\r
+cb_m2_ctrl=1\r
+cb_m2_shift=0\r
+sync_use_metric_units=1\r
diff --git a/chronos-ti/Control Center/Chronos Control Center/eZ430-Chronos CC 1_2.tcl b/chronos-ti/Control Center/Chronos Control Center/eZ430-Chronos CC 1_2.tcl
new file mode 100755 (executable)
index 0000000..61415dc
--- /dev/null
@@ -0,0 +1,2324 @@
+#!/usr/bin/tclsh8.5
+\r
+\r
+# *************************************************************************************************\r
+#\r
+#      Copyright (C) 2010 Texas Instruments Incorporated - http://www.ti.com/ \r
+#       \r
+#       \r
+#        Redistribution and use in source and binary forms, with or without \r
+#        modification, are permitted provided that the following conditions \r
+#        are met:\r
+#      \r
+#          Redistributions of source code must retain the above copyright \r
+#          notice, this list of conditions and the following disclaimer.\r
+#       \r
+#          Redistributions in binary form must reproduce the above copyright\r
+#          notice, this list of conditions and the following disclaimer in the \r
+#          documentation and/or other materials provided with the   \r
+#          distribution.\r
+#       \r
+#          Neither the name of Texas Instruments Incorporated nor the names of\r
+#          its contributors may be used to endorse or promote products derived\r
+#          from this software without specific prior written permission.\r
+#      \r
+#        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \r
+#        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT \r
+#        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+#        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT \r
+#        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, \r
+#        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT \r
+#        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+#        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+#        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT \r
+#        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE \r
+#        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+#\r
+# *************************************************************************************************\r
+# ez430-Chronos Control Center TCL/Tk script\r
+# *************************************************************************************************\r
+#\r
+# Rev 1.2\r
+# - Use of combobox\r
+# - Bug fix windows 7\r
+# - Removed obsolete variables\r
+# - checks for leap years\r
+#\r
+# Rev 1.1  \r
+# - added ini file load/save dialog to load/save key settings to "Key Config" pane\r
+# - added 12H / 24H format switch for "Sync" pane\r
+# - added "RF BSL" pane and related functions \r
+# \r
+# Rev 1.0\r
+# - initial version released to manufacturing\r
+# *************************************************************************************************\r
+\r
+# ----------------------------------------------------------------------------------------\r
+# Load TCL packages and C library --------------------------------------------------------\r
+\r
+set exit_prog 0\r
+\r
+# load libraries -----------------------------------------------------\r
+package require Tk\r
+\r
+# Set COM port where RF access point is mounted\r
+set com "/dev/ttyACM0"\r
+\r
+# Include BlueRobin BM-USBD1 driver\r
+# This script file replaces the Windows DLL and adds the global handle "vcp" for the COM channel\r
+source "eZ430-Chronos_driver.tcl"\r
+\r
+# Open COM port
+if { [BM_OpenCOM $com 115200 30 0 0] == 0 } {\r
+  tk_dialog .dialog1 "Error" "Could not detect USB dongle. Press OK to close application." info 0 OK\r
+  set com_available 0\r
+  exit 0\r
+} else {\r
+  set com_available 1\r
+  flush $vcp\r
+  # Reset hardware\r
+  BM_Reset\r
+  after 20\r
+  # Flush channel\r
+  for {set i 0} {$i < 10} {incr i} {  \r
+    BM_GetStatus\r
+    after 10\r
+  }\r
+}\r
+\r
+#  Global variables -----------------------------------------------------------------------\r
+\r
+# Script revision number\r
+set revision                1.2\r
+\r
+# BlueRobin variables\r
+set bluerobin_on            0\r
+set heartrate               0\r
+set speed                   0.0\r
+set speed_limit_hi          25.0\r
+set distance                0.0\r
+set hr_sweep                0\r
+set speed_sweep             0\r
+set txid                    [expr 0xFFFF00 + round( rand() * 250)]\r
+set msg                     0\r
+set speed_is_mph            0\r
+set speed_is_mph0           0\r
+\r
+# SimpliciTi variables\r
+set simpliciti_on           0\r
+set simpliciti_sync_on      0\r
+set simpliciti_acc_on       0\r
+set simpliciti_ap_started   0\r
+set x                      0\r
+set y                       0\r
+set accel_x                 0\r
+set accel_y                 0\r
+set accel_z                 0\r
+set accel_x_offset          0\r
+set accel_y_offset          0\r
+set accel_z_offset          0\r
+set mouse_control           0\r
+set move_x                  0\r
+set move_y                  0\r
+set wave_x                  { 0 50 600 50 }\r
+set wave_y                  { 0 50 600 50 }\r
+set wave_z                  { 0 50 600 50 }\r
+\r
+# Key variables\r
+set ini_file                "eZ430-Chronos-CC.ini"\r
+set all_ini_files           { }\r
+set button_event_text       "No button"\r
+set button_event            0\r
+set button_timeout          0\r
+set event1                  { Arrow-Left Arrow-Right A B C D E F G H I J \\r
+                              K L M N O P Q R S T U V W X Y Z F5 Space }\r
+set event2                  { None Ctrl Alt Windows }\r
+set pd_m1                   "Arrow-Left"\r
+set pd_s1                   "Arrow-Right"\r
+set pd_m2                   "F5"\r
+set cb_m1_windows           0\r
+set cb_m1_alt               0\r
+set cb_m1_ctrl              0\r
+set cb_m1_shift             0\r
+set cb_s1_windows           0\r
+set cb_s1_alt               0\r
+set cb_s1_ctrl              0\r
+set cb_s1_shift             0\r
+set cb_m2_windows           0\r
+set cb_m2_alt               0\r
+set cb_m2_ctrl              0\r
+set cb_m2_shift             0\r
+\r
+# Sync global variables\r
+set sync_time_hours_24      4\r
+set sync_time_is_am         1\r
+set sync_time_hours_12      4\r
+set sync_time_minutes       30\r
+set sync_time_seconds       0\r
+set sync_date_year          2009\r
+set sync_date_month         9\r
+set sync_date_day           1\r
+set sync_alarm_hours        6\r
+set sync_alarm_minutes      30\r
+set sync_altitude_24        500\r
+set sync_altitude_12        1640\r
+set sync_temperature_24     22\r
+set sync_temperature_12     72\r
+set sync_use_metric_units   1\r
+\r
+set i -10\r
+while {$i < 41} {\r
+       lappend value_temperature_C $i\r
+       incr i\r
+       }\r
+set i 14\r
+while {$i < 105} {\r
+       lappend value_temperature_F $i\r
+       incr i\r
+}\r
+set i 0\r
+while {$i < 60} {\r
+       lappend values_60 $i\r
+       incr i\r
+}\r
+set i 1\r
+while {$i < 32} {\r
+       lappend values_31 $i\r
+       incr i\r
+}\r
+set i 1\r
+while {$i < 31} {\r
+       lappend values_30 $i\r
+       incr i\r
+}\r
+\r
+set i 1\r
+while {$i < 30} {\r
+       lappend values_29 $i\r
+       incr i\r
+}\r
+\r
+set i 1\r
+while {$i < 29} {\r
+       lappend values_28 $i\r
+       incr i\r
+}\r
+\r
+\r
+set i 0\r
+while {$i < 24} {\r
+       lappend values_24 $i\r
+       incr i\r
+}\r
+set i 1\r
+while {$i < 13} {\r
+       lappend values_12 $i\r
+       incr i\r
+}\r
+set i 2010\r
+while {$i < 2016} { \r
+       lappend values_years $i\r
+       incr i\r
+}\r
+set i -100\r
+while {$i < 2001} { \r
+       lappend values_altitude_meters $i\r
+       incr i\r
+}\r
+set i -328\r
+while {$i < 6563} { \r
+       lappend values_altitude_feet $i\r
+       incr i\r
+}\r
+\r
+# WBSL global variables\r
+set select_input_file       ""\r
+set call_wbsl_timer         0\r
+set call_wbsl_1             2\r
+set call_wbsl_2             3\r
+set wbsl_progress           0\r
+set wbsl_on                 0\r
+set wbsl_ap_started         0\r
+set fsize                   0\r
+set fp                      0\r
+set rData                   [list]\r
+set rData_index             0\r
+set low_index               0\r
+set list_count              0\r
+set wbsl_opcode             0\r
+set maxPayload              0\r
+set ram_updater_downloaded  0\r
+set wirelessUpdateStarted   0\r
+set wbsl_timer_enabled      0\r
+set wbsl_timer_counter      0\r
+set wbsl_timer_flag         0\r
+set wbsl_timer_timeout      0\r
+\r
+# Function required by WBSL\r
+proc ceil x  {expr {ceil($x)} }\r
+\r
+\r
+# ----------------------------------------------------------------------------------------\r
+# Function prototypes --------------------------------------------------------------------\r
+proc get_spl_data {} {}\r
+proc update_br_data {} {}\r
+proc check_rx_serial {} {}\r
+proc inc_heartrate {} {}\r
+proc inc_speed {} {}\r
+proc move_cursor {} {}\r
+proc get_wbsl_status {} {}\r
+proc wbsl_set_timer { timeout } {}\r
+proc wbsl_reset_timer {} {}\r
+\r
+# ----------------------------------------------------------------------------------------\r
+# Graphical user interface setup ---------------------------------------------------------\r
+\r
+# Some custom styles for graphical elements\r
+ttk::setTheme clam\r
+ttk::style configure custom.TCheckbutton -font "Helvetica 10"\r
+ttk::style configure custom.TLabelframe -font "Helvetica 12 bold"\r
+\r
+# Set default font size for the app\r
+font configure TkDefaultFont -family "tahoma" -size 8\r
+\r
+# Define basic window geometry\r
+wm title . "Texas Instruments eZ430-Chronos Control Center $revision"\r
+wm geometry . 700x490\r
+wm resizable . 0 0\r
+wm iconname . "ttknote"\r
+ttk::frame .f\r
+pack .f -fill both -expand 1\r
+set w .f\r
+\r
+# Map keys to internal functions \r
+bind . <Key-q> { exitpgm }\r
+bind . <Key-c> { calibrate_sensor }\r
+bind . <Key-m> { allow_mouse_control }\r
+\r
+# Make the notebook and set up Ctrl+Tab traversal\r
+ttk::notebook $w.note\r
+pack $w.note -fill both -expand 1 -padx 2 -pady 3\r
+ttk::notebook::enableTraversal $w.note\r
+\r
+# ----------------------------------------------------------------------------------------\r
+# SimpliciTI pane ------------------------------------------------------------------------\r
+ttk::frame $w.note.spl -style custom.TFrame \r
+$w.note add $w.note.spl -text "SimpliciTI\u2122 Acc / PPT" -underline 0 -padding 2 \r
+grid columnconfigure $w.note.spl {0 1} -weight 1 -uniform 1\r
+\r
+# Control buttons\r
+ttk::frame $w.note.spl.frame0 -borderwidth 0 -style custom.TLabelframe\r
+ttk::button $w.note.spl.frame0.btnStartStop -text "Start Access Point" -command { start_simpliciti_ap_acc } -width 16\r
+ttk::label $w.note.spl.frame0.key -textvariable button_event_text -width 20 -font "Helvetica 10 bold" -relief sunk  -style custom1.TLabel \r
+ttk::button $w.note.spl.frame0.btnMouseContrl -text "Mouse On (M)" -command { allow_mouse_control  }  -width 16\r
+ttk::button $w.note.spl.frame0.btnCalSensor -text "Calibrate (C)" -command { calibrate_sensor  } -width 16\r
+grid $w.note.spl.frame0 -row 0 -column 0 -pady 10 -padx 10 -sticky ew -columnspan 2\r
+pack $w.note.spl.frame0.btnStartStop -side left -fill x  -padx 10\r
+pack $w.note.spl.frame0.key -side left -fill x  -padx 10\r
+pack $w.note.spl.frame0.btnCalSensor -side right -fill x  -padx 10\r
+pack $w.note.spl.frame0.btnMouseContrl -side right -fill x -padx 10\r
+\r
+# X acceleration sensor values\r
+ttk::frame $w.note.spl.frame2x -style custom.TFrame\r
+ttk::label $w.note.spl.frame2x.txt -text "X" -font "Helvetica 48 bold"  -width 2 -anchor center -style custom.TLabel\r
+canvas $w.note.spl.frame2x.canvas -width 600 -height 100 -background "gray95" \r
+grid $w.note.spl.frame2x -row 1 -column 0 -pady 5 -padx 10 -sticky ew -columnspan 2 -rowspan 1\r
+pack $w.note.spl.frame2x.txt -side left -fill x \r
+pack $w.note.spl.frame2x.canvas -side left -fill x \r
+\r
+# Y acceleration sensor values\r
+ttk::frame $w.note.spl.frame2y -style custom.TFrame\r
+ttk::label $w.note.spl.frame2y.txt -text "Y" -font "Helvetica 48 bold"  -width 2 -anchor center  -style custom.TLabel\r
+canvas $w.note.spl.frame2y.canvas -width 600 -height 100 -background "gray95" \r
+grid $w.note.spl.frame2y -row 2 -column 0 -pady 5 -padx 10 -sticky ew -columnspan 2 -rowspan 1\r
+pack $w.note.spl.frame2y.txt -side left -fill x\r
+pack $w.note.spl.frame2y.canvas -side left -fill x \r
+\r
+# Z acceleration sensor values\r
+ttk::frame $w.note.spl.frame2z -style custom.TFrame\r
+ttk::label $w.note.spl.frame2z.txt -text "Z" -font "Helvetica 48 bold"  -width 2 -anchor center -style custom.TLabel\r
+canvas $w.note.spl.frame2z.canvas -width 600 -height 100 -background "gray95" \r
+grid $w.note.spl.frame2z -row 3 -column 0 -pady 5 -padx 10 -sticky ew -columnspan 2 -rowspan 1\r
+pack $w.note.spl.frame2z.txt -side left -fill x\r
+pack $w.note.spl.frame2z.canvas -side left -fill x \r
+\r
+# Status line\r
+labelframe $w.note.spl.frame0b -borderwidth 1 -background "Yellow"\r
+ttk::label $w.note.spl.frame0b.lblStatus -text "Status:" -font "Helvetica 10 bold" -background "Yellow"\r
+ttk::label $w.note.spl.frame0b.lblStatusText -text "Access Point is off." -font "Helvetica 10" -background "Yellow"\r
+grid $w.note.spl.frame0b -row 5 -column 0 -columnspan 2 -pady 18 -padx 10 -sticky ew\r
+pack $w.note.spl.frame0b.lblStatus -side left -fill y \r
+pack $w.note.spl.frame0b.lblStatusText -side left -fill x \r
+\r
+\r
+# ----------------------------------------------------------------------------------------\r
+# Keys pane ------------------------------------------------------------------------------\r
+ttk::frame $w.note.keys -style custom.TFrame \r
+$w.note add $w.note.keys -text "Key Config" -underline 0 -padding 2 \r
+grid columnconfigure $w.note.keys {0 1} -weight 1 -uniform 1\r
+\r
+# Heading\r
+ttk::label $w.note.keys.label0 -font "Helvetica 10" -wraplength 6i -text "Select the key events that will be triggered when pressing one of the watch buttons in PPT mode." \r
+grid $w.note.keys.label0 -row 0 -column 0 -pady 10 -padx 10 -sticky ew -columnspan 2 -rowspan 1\r
+\r
+# Load / save configuration file\r
+ttk::labelframe $w.note.keys.fSel -borderwidth 0 \r
+ttk::label $w.note.keys.fSel.lbl -text "Select file:" -anchor e -font "Helvetica 10 bold"\r
+ttk::combobox $w.note.keys.fSel.combo1 -textvariable ini_file -state readonly -values $all_ini_files -width 50\r
+ttk::button $w.note.keys.fSel.btn2 -text "Load" -command { load_ini_file } -width 10\r
+ttk::button $w.note.keys.fSel.btn3 -text "Save" -command { save_ini_file } -width 10\r
+grid $w.note.keys.fSel -row 1 -column 0 -pady 10 -sticky ew -columnspan 2\r
+pack $w.note.keys.fSel.lbl -side left -fill x -padx 10\r
+pack $w.note.keys.fSel.combo1 -side left -fill x -padx 5\r
+pack $w.note.keys.fSel.btn2 -side left -fill x -padx 5\r
+pack $w.note.keys.fSel.btn3 -side left -fill x -padx 5\r
+\r
+# Button *\r
+ttk::labelframe $w.note.keys.m1 -borderwidth 1 -text "Button (*)"\r
+ttk::label $w.note.keys.m1.label1 -text "First key" -width 15 -font "Helvetica 10 bold"\r
+ttk::combobox $w.note.keys.m1.combo1 -textvariable pd_m1 -state readonly -values $event1 -width 20\r
+ttk::label $w.note.keys.m1.label2 -text "Second key" -width 15 -font "Helvetica 10 bold"\r
+ttk::checkbutton $w.note.keys.m1.cb1 -text "Windows" -variable cb_m1_windows\r
+ttk::checkbutton $w.note.keys.m1.cb2 -text "Alt" -variable cb_m1_alt\r
+ttk::checkbutton $w.note.keys.m1.cb3 -text "Ctrl" -variable cb_m1_ctrl\r
+ttk::checkbutton $w.note.keys.m1.cb4 -text "Shift" -variable cb_m1_shift\r
+grid $w.note.keys.m1 -row 2 -column 0 -pady 5 -padx 10 -sticky ew -columnspan 2 -rowspan 1\r
+pack $w.note.keys.m1.label1 -side left -pady 5 -padx 10\r
+pack $w.note.keys.m1.combo1 -side left -pady 5 -padx 10\r
+pack $w.note.keys.m1.label2 -side left -pady 5 -padx 10\r
+pack $w.note.keys.m1.cb1 -side top -fill x -padx 10\r
+pack $w.note.keys.m1.cb2 -side top -fill x -padx 10\r
+pack $w.note.keys.m1.cb3 -side top -fill x -padx 10\r
+pack $w.note.keys.m1.cb4 -side top -fill x -padx 10\r
+\r
+# Button Up\r
+ttk::labelframe $w.note.keys.s1 -borderwidth 1 -text "Button (Up)"\r
+ttk::label $w.note.keys.s1.label1 -text "First key" -width 15 -font "Helvetica 10 bold"\r
+ttk::combobox $w.note.keys.s1.combo1 -textvariable pd_s1 -state readonly -values $event1 -width 20 \r
+ttk::label $w.note.keys.s1.label2 -text "Second key" -width 15 -font "Helvetica 10 bold"\r
+ttk::checkbutton $w.note.keys.s1.cb1 -text "Windows" -variable cb_s1_windows\r
+ttk::checkbutton $w.note.keys.s1.cb2 -text "Alt" -variable cb_s1_alt\r
+ttk::checkbutton $w.note.keys.s1.cb3 -text "Ctrl" -variable cb_s1_ctrl\r
+ttk::checkbutton $w.note.keys.s1.cb4 -text "Shift" -variable cb_s1_shift\r
+grid $w.note.keys.s1 -row 3 -column 0 -pady 5 -padx 10 -sticky ew -columnspan 2 -rowspan 1\r
+pack $w.note.keys.s1.label1 -side left -pady 5 -padx 10\r
+pack $w.note.keys.s1.combo1 -side left -pady 5 -padx 10\r
+pack $w.note.keys.s1.label2 -side left -pady 5 -padx 10\r
+pack $w.note.keys.s1.cb1 -side top -fill x -padx 10\r
+pack $w.note.keys.s1.cb2 -side top -fill x -padx 10\r
+pack $w.note.keys.s1.cb3 -side top -fill x -padx 10\r
+pack $w.note.keys.s1.cb4 -side top -fill x -padx 10\r
+\r
+# Button #\r
+ttk::labelframe $w.note.keys.m2 -borderwidth 1 -text "Button (#)"\r
+ttk::label $w.note.keys.m2.label1 -text "First key" -width 15 -font "Helvetica 10 bold"\r
+ttk::combobox $w.note.keys.m2.combo1 -textvariable pd_m2 -state readonly -values $event1 -width 20\r
+ttk::label $w.note.keys.m2.label2 -text "Second key" -width 15 -font "Helvetica 10 bold"\r
+ttk::checkbutton $w.note.keys.m2.cb1 -text "Windows" -variable cb_m2_windows\r
+ttk::checkbutton $w.note.keys.m2.cb2 -text "Alt" -variable cb_m2_alt\r
+ttk::checkbutton $w.note.keys.m2.cb3 -text "Ctrl" -variable cb_m2_ctrl\r
+ttk::checkbutton $w.note.keys.m2.cb4 -text "Shift" -variable cb_m2_shift\r
+grid $w.note.keys.m2 -row 4 -column 0 -pady 5 -padx 10 -sticky ew -columnspan 2 -rowspan 1\r
+pack $w.note.keys.m2.label1 -side left -pady 5 -padx 10\r
+pack $w.note.keys.m2.combo1 -side left -pady 5 -padx 10\r
+pack $w.note.keys.m2.label2 -side left -pady 5 -padx 10\r
+pack $w.note.keys.m2.cb1 -side top -fill x -padx 10\r
+pack $w.note.keys.m2.cb2 -side top -fill x -padx 10\r
+pack $w.note.keys.m2.cb3 -side top -fill x -padx 10\r
+pack $w.note.keys.m2.cb4 -side top -fill x -padx 10\r
+\r
+\r
+# ----------------------------------------------------------------------------------------\r
+# Sync pane ------------------------------------------------------------------------------\r
+ttk::frame $w.note.sync -style custom.TFrame \r
+$w.note add $w.note.sync -text "SimpliciTI\u2122 Sync" -underline 0 -padding 2 \r
+grid columnconfigure $w.note.sync {0 1} -weight 1 -uniform 1\r
+\r
+# Control buttons\r
+ttk::labelframe $w.note.sync.f0 -borderwidth 0\r
+ttk::button $w.note.sync.f0.btn_start_ap -text "Start Access Point" -command { start_simpliciti_ap_sync } -width 16\r
+ttk::button $w.note.sync.f0.btn_get_watch_settings -text "Read Watch" -command { sync_read_watch }  -width 16\r
+ttk::button $w.note.sync.f0.btn_get_time_and_date -text "Copy System Time" -command { sync_get_time_and_date }  -width 16\r
+ttk::button $w.note.sync.f0.btn_set_watch -text "Set Watch" -command { sync_write_watch }  -width 12\r
+grid $w.note.sync.f0 -row 0 -column 0 -pady 5 -padx 8 -sticky ew -columnspan 2\r
+pack $w.note.sync.f0.btn_start_ap -side left -fill x  -padx 8\r
+pack $w.note.sync.f0.btn_set_watch -side right -fill x  -padx 8\r
+pack $w.note.sync.f0.btn_get_time_and_date -side right -fill x  -padx 8\r
+pack $w.note.sync.f0.btn_get_watch_settings -side right -fill x  -padx 8\r
+\r
+# Time\r
+ttk::labelframe $w.note.sync.f1 -borderwidth 0\r
+ttk::label $w.note.sync.f1.l1 -text "Time" -width 18 -font "Helvetica 10 bold"\r
+ttk::combobox $w.note.sync.f1.sb1 -values $values_24 -textvariable sync_time_hours_24 -justify right -width 2 -postcommand {check_time }\r
+ttk::combobox $w.note.sync.f1.sb2 -values $values_60 -textvariable sync_time_minutes -justify right -width 2 -postcommand check_time\r
+ttk::combobox $w.note.sync.f1.sb3 -values $values_60 -textvariable sync_time_seconds -justify right -width 2 -postcommand check_time\r
+grid $w.note.sync.f1 -row 2 -column 0 -columnspan 1 -pady 0 -padx 10 -sticky ew\r
+pack $w.note.sync.f1.l1  -side left -fill x\r
+pack $w.note.sync.f1.sb1 -side left -fill x -padx 5\r
+pack $w.note.sync.f1.sb2 -side left -fill x -padx 5\r
+pack $w.note.sync.f1.sb3 -side left -fill x -padx 5\r
+\r
+# Time format AM/PM\r
+ttk::labelframe $w.note.sync.ampm -borderwidth 0\r
+ttk::radiobutton $w.note.sync.ampm.rb1 -text "AM" -variable sync_time_is_am -value 1 -style custom.TRadiobutton -state disabled -command { update_time_12 }\r
+ttk::radiobutton $w.note.sync.ampm.rb2 -text "PM" -variable sync_time_is_am -value 0 -style custom.TRadiobutton -state disabled -command { update_time_12 }\r
+grid $w.note.sync.ampm -row 2 -column 1 -columnspan 2 -pady 0 -padx 10 -sticky ew\r
+pack $w.note.sync.ampm.rb1 -side left -fill x -padx 5\r
+pack $w.note.sync.ampm.rb2 -side left -fill x -padx 5\r
+\r
+# Date\r
+ttk::labelframe $w.note.sync.f2 -borderwidth 0\r
+ttk::label $w.note.sync.f2.l1 -text "Date (dd.mm.yyyy)" -width 18 -font "Helvetica 10 bold"\r
+ttk::combobox $w.note.sync.f2.sb1 -values $values_30   -textvariable sync_date_day     -justify right -width 2 -postcommand {check_date }\r
+ttk::combobox $w.note.sync.f2.sb2 -values $values_12   -textvariable sync_date_month   -justify right -width 2 -postcommand {check_date }\r
+ttk::combobox $w.note.sync.f2.sb3 -values $values_years -textvariable sync_date_year    -justify right -width 4 -postcommand {check_date }\r
+grid $w.note.sync.f2 -row 3 -column 0 -columnspan 1 -pady 0 -padx 10 -sticky ew\r
+pack $w.note.sync.f2.l1  -side left -fill x\r
+pack $w.note.sync.f2.sb1 -side left -fill x -padx 5\r
+pack $w.note.sync.f2.sb2 -side left -fill x -padx 5\r
+pack $w.note.sync.f2.sb3 -side left -fill x -padx 5\r
+\r
+# Time / Date format\r
+ttk::labelframe $w.note.sync.f1r -borderwidth 0\r
+ttk::radiobutton $w.note.sync.f1r.rb1 -text "Metric units" -variable sync_use_metric_units -value 1 -style custom.TRadiobutton -command switch_to_metric_units\r
+ttk::radiobutton $w.note.sync.f1r.rb2 -text "Imperial units" -variable sync_use_metric_units -value 0 -style custom.TRadiobutton -command switch_to_imperial_units\r
+grid $w.note.sync.f1r -row 3 -column 1 -columnspan 2 -pady 0 -padx 10 -sticky ew\r
+pack $w.note.sync.f1r.rb1 -side left -fill x -padx 5\r
+pack $w.note.sync.f1r.rb2 -side left -fill x -padx 5\r
+\r
+# Temperature\r
+ttk::labelframe $w.note.sync.f4 -borderwidth 0\r
+ttk::label $w.note.sync.f4.l1 -text "Temperature (\u00B0C)" -width 18 -font "Helvetica 10 bold"\r
+ttk::combobox $w.note.sync.f4.sb1 -values $value_temperature_C -textvariable sync_temperature_24 -justify right -width 4 -postcommand {check_temperature}\r
+#spinbox $w.note.sync.f4.sb1 -textvariable sync_temperature_24 -justify right -width 3 -from -10 -to 60 \r
+grid $w.note.sync.f4 -row 5 -column 0 -columnspan 2 -padx 10 -sticky ew\r
+pack $w.note.sync.f4.l1  -side left -fill x\r
+pack $w.note.sync.f4.sb1 -side left -fill x -padx 5\r
+\r
+# Altitude\r
+ttk::labelframe $w.note.sync.f5 -borderwidth 0\r
+ttk::label $w.note.sync.f5.l1 -text "Altitude (m)" -width 18 -font "Helvetica 10 bold"\r
+ttk::combobox $w.note.sync.f5.sb1 -values $values_altitude_meters -textvariable sync_altitude_24 -justify right -width 4 -postcommand {check_altitude}\r
+grid $w.note.sync.f5 -row 6 -column 0 -columnspan 1 -pady 0 -padx 10 -sticky ew\r
+pack $w.note.sync.f5.l1  -side left -fill x\r
+pack $w.note.sync.f5.sb1 -side left -fill x -padx 5\r
+\r
+# Status\r
+labelframe $w.note.sync.status -borderwidth 1 -background "Yellow"\r
+ttk::label $w.note.sync.status.l1 -text "Status:" -font "Helvetica 10 bold" -background "Yellow"\r
+ttk::label $w.note.sync.status.l2 -text "Access Point is off." -font "Helvetica 10" -background "Yellow"\r
+grid $w.note.sync.status -row 10 -column 0 -pady 177 -padx 10 -sticky ew -columnspan 2\r
+pack $w.note.sync.status.l1 -side left -fill x \r
+pack $w.note.sync.status.l2 -side left -fill x \r
+\r
+\r
+# ----------------------------------------------------------------------------------------\r
+# BlueRobin pane -------------------------------------------------------------------------\r
+ttk::frame $w.note.br -style custom.TFrame \r
+$w.note add $w.note.br -text "BlueRobin\u2122 HR Sim" -underline 0 -padding 2\r
+grid columnconfigure $w.note.br {0 1} -weight 1 -uniform 1\r
+\r
+# Control buttons\r
+ttk::frame $w.note.br.frame0 -style custom.TFrame \r
+ttk::button $w.note.br.frame0.btnStartStop -text "Start transmitter" -command { start_bluerobin } -width 20\r
+grid $w.note.br.frame0 -row 0 -column 0 -pady 10 -padx 10 -sticky ew\r
+pack $w.note.br.frame0.btnStartStop -side left -fill x \r
+\r
+# Transmitter ID\r
+ttk::frame $w.note.br.frame0a -style custom.TFrame \r
+ttk::label $w.note.br.frame0a.lblTXID -text "TX ID:  " -font "Helvetica 10 bold" -style custom.TLabel\r
+ttk::entry $w.note.br.frame0a.e -textvariable txid -justify "right" -width 7 -state readonly -style custom.TLabel\r
+grid $w.note.br.frame0a -row 0 -column 1 -pady 10 -padx 10 -sticky ew\r
+pack $w.note.br.frame0a.lblTXID -side left -fill x \r
+pack $w.note.br.frame0a.e -side left -fill x \r
+\r
+# Heart rate sweep control\r
+ttk::checkbutton $w.note.br.btn_sweephr -text " Sweep Heart Rate (bpm)" -variable hr_sweep -onvalue "1" -offvalue "0" -style custom.TCheckbutton \r
+grid $w.note.br.btn_sweephr -row 1 -column 0 -pady 0 -padx 2m -sticky ew \r
+scale $w.note.br.scale_hr -length 300 -showvalue 0 -orient h -from 40 -to 220 -variable heartrate -tickinterval 20 -borderwidth 0 -background "#DEDBD6" -highlightbackground "#DEDBD6" \r
+grid $w.note.br.scale_hr -row 2 -column 0 -pady 10 -padx 2m -sticky ew \r
+\r
+# Heart rate value\r
+ttk::label $w.note.br.label_heartrate -textvariable heartrate -font "Helvetica 96 bold" -justify "right" -width 4  -anchor center -background "gray95"\r
+grid $w.note.br.label_heartrate -row 3 -column 0 -pady 30 -padx 10 -sticky ew \r
+\r
+# Speed sweep control\r
+ttk::frame $w.note.br.frame3 -style custom.TFrame \r
+ttk::checkbutton $w.note.br.frame3.btn -text " Sweep Speed" -variable speed_sweep -onvalue "1" -offvalue "0" -style custom.TCheckbutton \r
+ttk::radiobutton $w.note.br.frame3.btn1 -text "km/h" -variable speed_is_mph -value 0 -style custom.TCheckbutton -command { change_speed_unit }\r
+ttk::radiobutton $w.note.br.frame3.btn2 -text "mph" -variable speed_is_mph -value 1 -style custom.TCheckbutton -command { change_speed_unit }\r
+pack $w.note.br.frame3.btn -side left -fill x -pady 10 -padx 2m\r
+pack $w.note.br.frame3.btn2 -side right -fill x -padx 5\r
+pack $w.note.br.frame3.btn1 -side right -fill x -padx 5\r
+grid $w.note.br.frame3 -row 1 -column 1 -pady 10 -padx 2m -sticky ew \r
+scale $w.note.br.scale_speed -length 300 -showvalue 0 -orient h -from 0 -to $speed_limit_hi -variable speed -tickinterval 5 -resolution 0.1 -borderwidth 0 -background "#DEDBD6" -highlightbackground "#DEDBD6" \r
+grid $w.note.br.scale_speed -row 2 -column 1 -pady 0 -padx 2m -sticky ew \r
+\r
+# Speed value\r
+ttk::label $w.note.br.label_speed -textvariable speed -font "Helvetica 96 bold" -justify "right" -width 4  -anchor center -background "gray95"\r
+grid $w.note.br.label_speed -row 3 -column 1 -pady 10 -padx 10 -sticky ew \r
+\r
+# Status line\r
+labelframe $w.note.br.frame0b -borderwidth 1 -background "Yellow"\r
+ttk::label $w.note.br.frame0b.lblStatus -text "Status:" -font "Helvetica 10 bold" -background "Yellow"\r
+ttk::label $w.note.br.frame0b.lblStatusText -text "BlueRobin transmitter off." -font "Helvetica 10" -background "Yellow"\r
+grid $w.note.br.frame0b -row 4 -column 0 -pady 20 -padx 10 -sticky ew -columnspan 2\r
+pack $w.note.br.frame0b.lblStatus -side left -fill x \r
+pack $w.note.br.frame0b.lblStatusText -side left -fill x \r
+\r
+\r
+# ----------------------------------------------------------------------------------------\r
+# Wireless Update pane -------------------------------------------------------------------\r
+ttk::frame $w.note.wbsl -style custom.TFrame\r
+$w.note add $w.note.wbsl -text "Wireless Update" -underline 0 -padding 2 \r
+grid columnconfigure $w.note.wbsl {0 1} -weight 1 -uniform 1\r
+\r
+ttk::label $w.note.wbsl.label0 -font "Helvetica 10 bold" -width 80 -wraplength 550 -justify center -text "Only use this update function with watch firmware that allows to invoke the Wireless Update on the watch again.\n\nOlder eZ430-Chronos kits require a manual software update of the watch and access point. See Chronoswiki."\r
+grid $w.note.wbsl.label0 -row 0 -column 0 -sticky ew -columnspan 3 -pady 10 -padx 10\r
+\r
+ttk::label $w.note.wbsl.label1 -font "Helvetica 10" -text "Select the firmware file that you want to download to the watch:" \r
+ttk::entry $w.note.wbsl.entry0 -state readonly -textvariable select_input_file\r
+\r
+grid $w.note.wbsl.label1 -row 1 -column 0 -sticky ew -columnspan 3 -pady 15 -padx 10\r
+grid $w.note.wbsl.entry0 -row 2 -column 0 -sticky ew -columnspan 2 -padx 10\r
+\r
+ttk::button $w.note.wbsl.btnBrowse -text "Browse..." -command { open_file } -width 16\r
+grid $w.note.wbsl.btnBrowse -row 2 -column 2 -sticky ew -padx 10\r
+\r
+ttk::button $w.note.wbsl.btnDwnld -text "Update Chronos Watch" -command { start_wbsl_ap } -width 16 -default "active"\r
+grid $w.note.wbsl.btnDwnld -row 3 -column 0 -sticky ew -pady 15 -padx 8 -columnspan 3\r
+\r
+# Progress bar\r
+labelframe $w.note.wbsl.frame1p -borderwidth 0\r
+ttk::label $w.note.wbsl.frame1p.lblProgress -text "Progress " -font "Helvetica 10 bold"\r
+ttk::progressbar $w.note.wbsl.frame1p.progBar -orient horizontal -value 0 -variable wbsl_progress -mode determinate \r
+grid $w.note.wbsl.frame1p -row 4 -column 0 -sticky ew -pady 16 -padx 10 -columnspan 3\r
+pack $w.note.wbsl.frame1p.lblProgress -side left \r
+pack $w.note.wbsl.frame1p.progBar -side left -fill x -expand 1 \r
+\r
+#Dummy Labels to fill Space\r
+ttk::label $w.note.wbsl.importantNote -width 80 -wraplength 550 -justify center -text "Important: If the wireless update fails during the firmware download to flash memory, the watch display will be blank and the watch will be in sleep mode. To restart the update, press the down button." -font "Helvetica 10 bold"\r
+grid $w.note.wbsl.importantNote -row 5 -column 0 -sticky ew -columnspan 3 -pady 20 -padx 10\r
+\r
+# Frame for status display\r
+labelframe $w.note.wbsl.frame0b -borderwidth 1 -background "Yellow"\r
+ttk::label $w.note.wbsl.frame0b.lblStatus -text "Status:" -font "Helvetica 10 bold" -background "Yellow"\r
+ttk::label $w.note.wbsl.frame0b.lblStatusText -text "Access Point is off." -font "Helvetica 10" -background "Yellow"\r
+grid $w.note.wbsl.frame0b -row 6 -column 0 -pady 13 -padx 10 -sticky ew -columnspan 3\r
+pack $w.note.wbsl.frame0b.lblStatus -side left -fill x \r
+pack $w.note.wbsl.frame0b.lblStatusText -side left -fill x \r
+\r
+# ----------------------------------------------------------------------------------------\r
+# About pane -----------------------------------------------------------------------------\r
+ttk::frame $w.note.about -style custom.TFrame \r
+$w.note add $w.note.about -text "About" -underline 0 -padding 2\r
+grid columnconfigure $w.note.about {0 1} -weight 1 -uniform 1\r
+\r
+# SimpliciTI box\r
+ttk::labelframe $w.note.about.s -borderwidth 1 \r
+ttk::label $w.note.about.s.txt1 -font "Helvetica 12 bold" -justify "left" -width 4  -anchor center -style custom.TLabel -text "SimpliciTI\u2122"\r
+ttk::label $w.note.about.s.txt2 -font "Helvetica 10" -width 80 -wraplength 550 -justify left -anchor n -style custom.TLabel \\r
+-text "SimpliciTI\u2122 is a simple low-power RF network protocol aimed at small RF networks.\\r
+\n\nSuch networks typically contain battery operated devices which require long battery life, low data rate and low duty cycle and have a limited number of nodes talking directly to each other or through an access point or range extenders. Access point and range extenders are not required but provide extra functionality such as store and forward messages.\\r
+\n\nWith SimpliciTI\u2122 the MCU resource requirements are minimal which results in low system cost."\r
+ttk::label $w.note.about.s.txt3 -font "Helvetica 10 bold" -wraplength 550 -justify left -anchor n -style custom.TLabel -text "Learn more about SimpliciTI\u2122 at http://www.ti.com/simpliciti"\r
+grid $w.note.about.s -row 0 -column 0 -sticky new -pady 0 -columnspan 2\r
+pack $w.note.about.s.txt1 -side top -fill x -pady 5 -padx 2m\r
+pack $w.note.about.s.txt2 -side top -fill x -pady 0 -padx 2m\r
+pack $w.note.about.s.txt3 -side top -fill x -pady 5 -padx 2m\r
+\r
+# BlueRobin box\r
+ttk::labelframe $w.note.about.b -borderwidth 1 \r
+ttk::label $w.note.about.b.txt1 -font "Helvetica 12 bold italic" -foreground "Dark Blue" -justify "left" -width 4  -anchor center -text "BlueRobin\u2122" -style custom.TLabel\r
+ttk::label $w.note.about.b.txt2 -font "Helvetica 10" -width 80 -wraplength 550 -justify left -anchor n -style custom.TLabel \\r
+-text "The BlueRobin\u2122 protocol provides low data rate transmission for wireless body area sensor networks and team monitoring systems. Ultra-low power consumption, high reliability and low hardware costs are key elements of BlueRobin\u2122.\\r
+\n\nBlueRobin\u2122 is successfully used in personal and multi-user heart rate monitoring systems, sports watches, chest straps, foot pods, cycle computers and other fitness equipment."\r
+ttk::label $w.note.about.b.txt3 -font "Helvetica 10 bold" -wraplength 550 -justify left -anchor n -style custom.TLabel -text "Learn more about BlueRobin\u2122 at http://www.bm-innovations.com"\r
+grid $w.note.about.b -row 1 -column 0 -sticky new -pady 5 -columnspan 2\r
+pack $w.note.about.b.txt1 -side top -fill x -pady 5 -padx 2m\r
+pack $w.note.about.b.txt2 -side top -fill x -pady 0 -padx 2m\r
+pack $w.note.about.b.txt3 -side top -fill x -pady 5 -padx 2m\r
+\r
+\r
+# ----------------------------------------------------------------------------------------\r
+# Help pane ------------------------------------------------------------------------------\r
+ttk::frame $w.note.help -style custom.TFrame\r
+$w.note add $w.note.help -text "Help" -underline 0 -padding 2\r
+grid columnconfigure $w.note.help {0 1} -weight 1 -uniform 1\r
+\r
+# Help text\r
+ttk::labelframe $w.note.help.frame -borderwidth 1 \r
+ttk::label $w.note.help.frame.head -font "Helvetica 12 bold" -justify "left" -width 4  -anchor center -style custom.TLabel -text "Help"\r
+ttk::label $w.note.help.frame.txt1 -font "Helvetica 10" -width 80 -wraplength 550 -justify left -anchor n -style custom.TLabel \\r
+-text "If you cannot communicate with the RF Access Point, please check the following points in the Windows Device Manager:\n\\r
+\n1) Do you have another instance of the GUI open? If so, please close it, since it may block the COM port.\\r
+\n\n2) Does the RF Access Point appear under the friendly name \"TI CC1111 Low-Power RF to USB CDC Serial Port (COMxx)\". xx is the number of the COM port through which the RF Access Point can be accessed. If the RF Access Point is not listed, disconnect it from the USB port and reconnect it. If it still is not listed, or an error is shown, uninstall the RF Access Point (if possible) and reinstall the Windows driver manually.\\r
+\n\n3) Have you applied the following settings to the RF Access Point?\n\\r
+\n   - Bits per second: \t115200 \\r
+\n   - Data bits: \t\t8 \\r
+\n   - Parity: \t\tNone \\r
+\n   - Stop bits: \t\t1 \\r
+\n   - Flow control: \t\tNone \\r
+\n \\r
+\n \\r
+\n "\r
+\r
+grid $w.note.help.frame -row 0 -column 0 -sticky new -pady 0 -columnspan 2\r
+pack $w.note.help.frame.head -side top -fill x -pady 5 -padx 2m\r
+pack $w.note.help.frame.txt1 -side top -fill x -pady 0 -padx 2m\r
+\r
+# ----------------------------------------------------------------------------------------\r
+# Generic SimpliciTI functions -----------------------------------------------------------\r
+\r
+\r
+proc start_simpliciti_ap_acc { } {\r
+  global w\r
+  global simpliciti_on simpliciti_acc_on simpliciti_sync_on\r
+\r
+  # AP already on?\r
+  if { $simpliciti_on == 1 } { return } \r
+\r
+  set simpliciti_acc_on 1\r
+  set simpliciti_sync_on 0\r
\r
+  start_simpliciti_ap\r
+}\r
+\r
+\r
+proc start_simpliciti_ap_sync { } {\r
+  global w\r
+  global simpliciti_on simpliciti_sync_on simpliciti_acc_on\r
+\r
+  # AP already on?\r
+  if { $simpliciti_on == 1 } { return } \r
+\r
+  set simpliciti_sync_on 1\r
+  set simpliciti_acc_on 0\r
\r
+  start_simpliciti_ap\r
+\r
+  after 1000\r
+  catch { BM_GetStatus } status\r
+\r
+  # Check RF Access Point status byte  \r
+  if { $status == 3 } {\r
+    updateStatusSPL "Access point started. Now start watch in sync mode."\r
+  }\r
+\r
+}\r
+\r
+\r
+\r
+# Start RF Access Point\r
+proc start_simpliciti_ap { } {\r
+  global w\r
+  global simpliciti_on bluerobin_on com_available\r
+  global simpliciti_ap_started\r
+  global wbsl_on\r
+\r
+  # No com port?  \r
+  if { $com_available == 0 } { return }\r
+  \r
+  # Wireless Update on?  \r
+  if { $wbsl_on == 1 } { return }\r
+  \r
+  # In BlueRobin mode? -> Stop BlueRobin transmission\r
+  if { $bluerobin_on == 1 } { \r
+    stop_bluerobin\r
+    after 500\r
+  } \r
+\r
+  updateStatusSPL "Starting access point."\r
+  after 500\r
+\r
+  # Link with SimpliciTI transmitter\r
+  set result [ BM_SPL_Start ]\r
+  if { $result == 0 } {\r
+    updateStatusSPL "Failed to start access point."\r
+    return\r
+  }\r
+  after 500\r
+    \r
+  # Set on flag after some waiting time  \r
+  set simpliciti_on 1\r
+\r
+  # Ignore dummy data from RF Access Point until it sends real values \r
+  set simpliciti_ap_started 0\r
+  \r
+  # Reconfigure control buttons\r
+  $w.note.spl.frame0.btnStartStop configure -text "Stop Access Point" -command { stop_simpliciti_ap }\r
+  $w.note.sync.f0.btn_start_ap configure -text "Stop Access Point" -command { stop_simpliciti_ap }\r
+}\r
+\r
+\r
+# Stop RF Access Point\r
+proc stop_simpliciti_ap {} {\r
+  global w\r
+  global simpliciti_ap_started simpliciti_on simpliciti_acc_on simpliciti_sync_on bluerobin_on com_available\r
+  global accel_x accel_y accel_z accel_x_offset accel_y_offset accel_z_offset\r
+\r
+  # AP off?\r
+  if { $simpliciti_on == 0 } { return } \r
+\r
+  # Clear on flag \r
+  set simpliciti_on 0\r
+  set simpliciti_acc_on 0\r
+  set simpliciti_sync_on 0\r
+  \r
+  # Send sync exit command (this will exit sync mode on watch side)\r
+  BM_SYNC_SendCommand 0x07\r
+  after 750\r
+  \r
+  # Stop SimpliciTI\r
+  BM_SPL_Stop\r
+\r
+  # Link is now off\r
+  updateStatusSPL "Access point is off."\r
+\r
+  # Clear values\r
+  set accel_x  0\r
+  set accel_y  0\r
+  set accel_z  0  \r
+  set accel_x_offset 0\r
+  set accel_y_offset 0\r
+  set accel_z_offset 0  \r
+  set simpliciti_ap_started 0\r
+  update\r
+  \r
+  # Reconfig button\r
+  $w.note.spl.frame0.btnStartStop configure -text "Start Access Point" -command { start_simpliciti_ap_acc }\r
+  $w.note.sync.f0.btn_start_ap configure -text "Start Access Point" -command { start_simpliciti_ap_sync }\r
+}\r
+\r
+# ----------------------------------------------------------------------------------------\r
+# SimpliciTI acc / ppt -------------------------------------------------------------------\r
+\r
+# Zero-set x-y-z values\r
+proc calibrate_sensor {} {\r
+  global simpliciti_on\r
+  global accel_x accel_y accel_z accel_x_offset accel_y_offset accel_z_offset\r
+  \r
+  # return if SPL is not active  \r
+  if { $simpliciti_on == 0 } { return }\r
+  \r
+  # Wait until new frame has arrived\r
+  after 100\r
+  \r
+  # Clear offset\r
+  set accel_x_offset  0\r
+  set accel_y_offset  0\r
+  set accel_z_offset  0\r
+  set accel_x         0\r
+  set accel_y         0\r
+  set accel_z         0\r
+\r
+  # get new data\r
+  get_spl_data\r
+  \r
+  # set new offset\r
+  set accel_x_offset $accel_x\r
+  set accel_y_offset $accel_y\r
+  set accel_z_offset $accel_z\r
+}\r
+\r
+# Read received SimpliciTI data from RF Access Point point\r
+proc get_spl_data {} {\r
+  global w\r
+  global simpliciti_on simpliciti_acc_on simpliciti_ap_started\r
+  global accel_x accel_y accel_z accel_x_offset accel_y_offset accel_z_offset\r
+  global button_event_text button_event previous_button_event button_timeout\r
+    \r
+  # SimpliciTI off?  \r
+  if { !$simpliciti_on } { return }\r
+  if { !$simpliciti_acc_on } { return }\r
+\r
+  # Update status box  \r
+  catch { BM_GetStatus } status\r
+\r
+  # Check RF Access Point status byte  \r
+  if { $status == 2 } {\r
+  \r
+    # Trying to link\r
+    updateStatusSPL "Starting access point."\r
+    return\r
+  \r
+  } elseif { $status == 3 } {\r
+    \r
+    # Read 32-bit SimpliciTI data from dongle\r
+    # Data format is [Z-Y-X-KEY]\r
+    catch { BM_SPL_GetData } data\r
+    \r
+    # Just started? Ignore first data\r
+    if { $simpliciti_ap_started == 0} {\r
+\r
+      updateStatusSPL "Access point started. Now start watch in acc or ppt mode."\r
+      set simpliciti_ap_started 1\r
+      return\r
+\r
+    } else {\r
+\r
+      # if Byte0 is 0xFF, data has already been read from USB buffer, so do nothing\r
+      if { ($data & 0xFF) == 0xFF } { return } \r
+\r
+    }\r
+    \r
+    # Extract watch button event from SimpliciTi data bits 7:0\r
+    set button_event 0\r
+    \r
+    if { [expr ($data & 0xF0) ] != 0 } {\r
+      \r
+      set button_event  [expr ($data & 0xF0) ]\r
+      \r
+      if { $button_event == 0x10 } {\r
+        set button_event_text "Button (*)"\r
+      } elseif { $button_event == 0x20 } {\r
+        set button_event_text "Button (#)"\r
+      } elseif { $button_event == 0x30 } {\r
+        set button_event_text "Button (Up)"\r
+      }\r
+\r
+      # Watch can send either key events (2) or mouse clicks (1) - distinguish mode here\r
+      if { [expr ($data & 0x0F) ] == 0x01 } {\r
+        switch $button_event {\r
+          16    { catch { BM_SetMouseClick 1 } res \r
+                  updateStatusSPL "Left mouse click." }\r
+          32    { catch { BM_SetMouseClick 3 } res\r
+                  updateStatusSPL "Left mouse doubleclick." }\r
+          48    { catch { BM_SetMouseClick 2 } res \r
+                  updateStatusSPL "Right mouse click." }\r
+        }\r
+      } elseif { [expr ($data & 0x0F) ] == 0x02 } {\r
+        updateStatusSPL "$button_event_text was pressed."\r
+        switch $button_event {\r
+          16    { button_set M1 }\r
+          32    { button_set M2 }\r
+          48    { button_set S1 }\r
+        }\r
+      }\r
+      update\r
+      after 500\r
+      # Dummy read to clear USB buffer\r
+      catch { BM_SPL_GetData } data\r
+      after 20\r
+      catch { BM_SPL_GetData } data\r
+      return\r
+    }\r
+    \r
+    # Keep on drawing X-Y-Z values\r
+    \r
+    # Keep previous values for low pass filtering\r
+    set prev_x  $accel_x\r
+    set prev_y  $accel_y\r
+    set prev_z  $accel_z\r
+    \r
+    # Extract acceleration values from upper data bits\r
+    set accel_x [expr (($data >> 8)  & 0xFF)]\r
+    set accel_y [expr (($data >> 16) & 0xFF)]\r
+    set accel_z [expr (($data >> 24) & 0xFF)]\r
+    \r
+    # Convert raw data to signed integer\r
+    \r
+    # Get sign (1=minus, 0=plus)\r
+    set sign_x  [expr ($accel_x&0x80) >> 7]\r
+    set sign_y  [expr ($accel_y&0x80) >> 7]\r
+    set sign_z  [expr ($accel_z&0x80) >> 7]\r
+    \r
+    # Convert negative 2's complement number to signed decimal\r
+    if { $sign_x == 1 } { \r
+      set accel_x [ expr (((~$accel_x) & 0xFF ) + 1)*(-1) ]\r
+    }    \r
+    if { $sign_y == 1 } { \r
+      set accel_y [ expr (((~$accel_y) & 0xFF ) + 1)*(-1) ]\r
+    }    \r
+    if { $sign_z == 1 } { \r
+      set accel_z [ expr (((~$accel_z) & 0xFF ) + 1)*(-1) ]\r
+    }    \r
+    \r
+    # Low pass filter values from acceleration sensor to avoid jitter\r
+    set accel_x [expr ($accel_x*18*0.5) + $prev_x*0.5 - $accel_x_offset]\r
+    set accel_y [expr ($accel_y*18*0.5) + $prev_y*0.5 - $accel_y_offset]\r
+    set accel_z [expr ($accel_z*18*0.5) + $prev_z*0.5 - $accel_z_offset]\r
+  \r
+    # Display values in status line\r
+    updateStatusSPL "Receiving data from acceleration sensor  X=[format %4.0f $accel_x]  Y=[format %4.0f $accel_y]  Z=[format %4.0f $accel_z]"\r
+    \r
+    # Use values to move mouse cursor \r
+    move_cursor\r
+\r
+    # Update wave graphs\r
+    add_wave_coords\r
+  }\r
+}\r
+\r
+# Turn on/off mouse cursor control \r
+proc allow_mouse_control {} {\r
+  global w mouse_control\r
\r
+  if { $mouse_control == 0 } {\r
+    set mouse_control 1\r
+    $w.note.spl.frame0.btnMouseContrl configure -text "Mouse Off (M)"\r
+  } else {\r
+    set mouse_control 0\r
+    $w.note.spl.frame0.btnMouseContrl configure -text "Mouse On (M)"\r
+  }\r
+}\r
+\r
+# Move mouse cursor through TCL event function\r
+proc move_cursor {} {\r
+  global w\r
+  global simpliciti_on mouse_control\r
+  global x y accel_x accel_y accel_z accel_x_offset accel_y_offset accel_z_offset\r
+\r
+  # SimpliciTI off?  \r
+  if { $simpliciti_on == 0 } { return }\r
+  if { $mouse_control == 0 } { return }\r
+\r
+  # Calculate new mouse cursor position\r
+  set delta_x [format %.0f [expr $accel_y/40]]\r
+  set delta_y [format %.0f [expr $accel_x/40]]\r
+\r
+  # Get current mouse position\r
+  event generate $w <Enter>\r
+  update\r
+  set X [expr [winfo pointerx .] - [winfo rootx .]]\r
+  set Y [expr [winfo pointery .] - [winfo rooty .]]\r
+\r
+  # Set new mouse position\r
+  event generate $w <Motion> -warp 1 -x [expr $X + $delta_x]  -y [expr $Y + $delta_y]\r
+}\r
+\r
+# Grab all files in current directory and return list of files with right extension\r
+proc get_files { ext } {\r
+\r
+  set dir [pwd]\r
+  set files { }\r
+\r
+  foreach file0 [glob -nocomplain -directory $dir *$ext] {\r
+    set file1 [file tail [file rootname $file0]]$ext\r
+    lappend files "$file1"\r
+  }\r
+\r
+  return $files\r
+}\r
+set all_ini_files [get_files ".ini"]\r
+$w.note.keys.fSel.combo1 configure -values $all_ini_files\r
+\r
+# Read variables from file \r
+proc load_ini_file { } {\r
+  global w\r
+  global ini_file \r
+  global pd_m1 pd_m2 pd_s1\r
+  global cb_m1_windows cb_m1_alt cb_m1_ctrl cb_m1_shift\r
+  global cb_s1_windows cb_s1_alt cb_s1_ctrl cb_s1_shift\r
+  global cb_m2_windows cb_m2_alt cb_m2_ctrl cb_m2_shift\r
+  global sync_use_metric_units\r
+  \r
+  # Try to open file with key definitions\r
+  catch { set fhandle [open "$ini_file" r] } res\r
+  \r
+  # Exit if file is missing\r
+  if { [string first "couldn't open" $res] == 0 } { return }\r
+  \r
+  fconfigure $fhandle -buffering line\r
+\r
+  # Read file line by line and set global variables\r
+  while { ![eof $fhandle] } {\r
+    # Get next line\r
+    gets $fhandle line\r
+    # Split line\r
+    set data [ split $line "=" ]\r
+    # Verify that extracted strings consist of ASCII characters\r
+    if { [string is ascii [ lindex $data 0 ]] && [string is ascii [ lindex $data 1 ]] } {\r
+      # Set variable\r
+      set [ lindex $data 0 ] [ lindex $data 1 ]\r
+    }\r
+  }\r
+  \r
+  close $fhandle  \r
+}\r
+\r
+# Save variables to file \r
+proc save_ini_file { } {\r
+  global w\r
+  global ini_file all_ini_files\r
+  global pd_m1 pd_m2 pd_s1\r
+  global cb_m1_windows cb_m1_alt cb_m1_ctrl cb_m1_shift\r
+  global cb_s1_windows cb_s1_alt cb_s1_ctrl cb_s1_shift\r
+  global cb_m2_windows cb_m2_alt cb_m2_ctrl cb_m2_shift\r
+  global sync_use_metric_units\r
+  \r
+  # Open file save dialog first\r
+  file_save_dialog $w\r
+  \r
+  # Delete existing ini file  \r
+  catch { file delete "$ini_file" }\r
+\r
+  # No file selected?\r
+  if { $ini_file == "" } { return }\r
+  \r
+  # Break if directory is write only\r
+  catch { set fhandle [open "$ini_file" a] } res\r
+  if { [string first "permission denied" $res] == 0 } {\r
+    return\r
+  }\r
+  \r
+  fconfigure $fhandle -buffering line\r
+  \r
+  # Make a list of all key variables\r
+  set keylist { pd_m1 pd_m2 pd_s1 \\r
+                cb_m1_windows cb_m1_alt cb_m1_ctrl cb_m1_shift \\r
+                cb_s1_windows cb_s1_alt cb_s1_ctrl cb_s1_shift \\r
+                cb_m2_windows cb_m2_alt cb_m2_ctrl cb_m2_shift \\r
+                sync_use_metric_units }\r
+                \r
+  # Walk through list and save variables to file\r
+  foreach { el } $keylist {\r
+    set val [expr $$el]\r
+    puts $fhandle "$el=$val"\r
+  }  \r
+\r
+  close $fhandle  \r
+  \r
+  # Update ini file selection\r
+  set all_ini_files [get_files ".ini"]\r
+  $w.note.keys.fSel.combo1 configure -values $all_ini_files\r
+  set ini_file [lindex $all_ini_files 0]\r
+}\r
+\r
+# Generic file save dialog\r
+proc file_save_dialog { w } {\r
+  global ini_file\r
+  \r
+  # Define default file type\r
+  set types {\r
+       {"eZ430-Chronos configuration"          {.ini}  }\r
+       {"All files"            *}\r
+  }\r
+\r
+  # Use standard Windows file dialog \r
+  set selected_type "eZ430-Chronos configuration"\r
+  set ini_file [tk_getSaveFile -filetypes $types -parent $w -initialfile "eZ430-Chronos.ini" -defaultextension .ini]\r
+}\r
+# ----------------------------------------------------------------------------------------\r
+# SimpliciTI sync functions --------------------------------------------------------------\r
+\r
+# Read watch settings\r
+proc sync_read_watch {} {\r
+  global w simpliciti_on simpliciti_sync_on\r
+  global sync_time_is_am sync_time_hours_24 sync_time_hours_12 sync_time_minutes sync_time_seconds\r
+  global sync_date_year sync_date_month sync_date_day\r
+  global sync_alarm_hours sync_alarm_minutes\r
+  global sync_use_metric_units\r
+  global sync_temperature_24 sync_altitude_24 \r
+    \r
+  # SimpliciTI off?\r
+  if { !$simpliciti_on } { return }\r
+  if { !$simpliciti_sync_on } { return }\r
+   \r
+  # Dummy read to clean RF Access Point buffer\r
+  catch { BM_SYNC_ReadBuffer } bin\r
+  \r
+  # Send command to watch\r
+  BM_SYNC_SendCommand 0x02\r
+  updateStatusSYNC "Requesting watch data."\r
+\r
+  # Wait for buffer to be filled with data - or timeout\r
+  set repeat 10\r
+  while { $repeat > 0 } {\r
+    after 100\r
+    set status [ BM_SYNC_GetBufferStatus ]\r
+    if { $status == 1 } {\r
+      set repeat -1\r
+      catch { BM_SYNC_ReadBuffer } data\r
+\r
+      # Decode received data      \r
+      # Received hours is always 24H format\r
+      set sync_time_hours_24      [format "%d" [expr [lindex $data 1] & 0x7F]]\r
+      set sync_use_metric_units   [expr ([lindex $data 1] >> 7) & 0x01]\r
+      set sync_time_minutes       [format "%d" [lindex $data 2]]\r
+      set sync_time_seconds       [format "%d" [lindex $data 3]]\r
+      set sync_date_year          [format "%d" [expr ([lindex $data 4]<<8) + [lindex $data 5]]]\r
+      set sync_date_month         [format "%d" [lindex $data 6]]\r
+      set sync_date_day           [format "%d" [lindex $data 7]]\r
+      set sync_alarm_hours        [format "%d" [lindex $data 8]]\r
+      set sync_alarm_minutes      [format "%d" [lindex $data 9]]\r
+      set sync_temperature_24     [format "%2.0f" [expr [format "%2.1f" [expr ([lindex $data 10]<<8) + [lindex $data 11]]] / 10]]\r
+      set sync_altitude_24        [format "%d" [expr ([lindex $data 12]<<8) + [lindex $data 13]]]\r
+      \r
+      # Calculate new 24H / 12H time\r
+      update_time_24\r
+      update_time_12\r
+      \r
+      # Reconfigure display\r
+      if { $sync_use_metric_units == 1 } {\r
+        switch_to_metric_units\r
+      } else {\r
+        switch_to_imperial_units\r
+      }\r
+      \r
+      updateStatusSYNC "Received watch data."\r
+    } else {\r
+        set repeat [expr $repeat-1]\r
+    }\r
+  }\r
+\r
+  if { $repeat == 0 } {\r
+    updateStatusSYNC "Failed to read watch data."\r
+  }\r
+}\r
+\r
+\r
+# Write watch settings\r
+proc sync_write_watch {} {\r
+  global w simpliciti_on\r
+  global sync_use_metric_units sync_time_is_am sync_time_hours_24 sync_time_minutes sync_time_seconds\r
+  global sync_date_year sync_date_month sync_date_day\r
+  global sync_alarm_hours sync_alarm_minutes\r
+  global sync_temperature_24 sync_altitude_24\r
+  # AP not enabled?\r
+  if { !$simpliciti_on } { return }\r
+\r
+  # Assemble command string\r
+  lappend cmd 0x03\r
+  lappend cmd [format "0x%02X" [expr $sync_time_hours_24 | (($sync_use_metric_units<<7)&0x80)]]\r
+  lappend cmd [format "0x%02X" $sync_time_minutes] \r
+  lappend cmd [format "0x%02X" $sync_time_seconds] \r
+  lappend cmd [format "0x%02X" [expr $sync_date_year >> 8]] \r
+  lappend cmd [format "0x%02X" [expr $sync_date_year & 0xFF]] \r
+  lappend cmd [format "0x%02X" $sync_date_month] \r
+  lappend cmd [format "0x%02X" $sync_date_day] \r
+  lappend cmd [format "0x%02X" $sync_alarm_hours] \r
+  lappend cmd [format "0x%02X" $sync_alarm_minutes] \r
+  set t1 [format "%.0f" [expr $sync_temperature_24*10]]\r
+  lappend cmd [format "0x%02X" [expr $t1 >> 8]]\r
+  lappend cmd [format "0x%02X" [expr $t1 & 0xFF]] \r
+  lappend cmd [format "0x%02X" [expr $sync_altitude_24 >> 8]]\r
+  lappend cmd [format "0x%02X" [expr $sync_altitude_24 & 0xFF]] \r
+\r
+  # Transfer command to RF Access Point point\r
+  BM_SYNC_SendCommand $cmd\r
+\r
+  updateStatusSYNC "Sent data to watch."\r
+}\r
+\r
+\r
+# Read system time and date\r
+proc sync_get_time_and_date {} {\r
+  global w \r
+  global sync_use_metric_units sync_time_is_am sync_time_hours_24 sync_time_minutes sync_time_seconds\r
+  global sync_date_year sync_date_month sync_date_day\r
+\r
+  # Get date  \r
+  set sync_date_year    [expr [format "%04.0f" [expr [clock format [clock seconds] -format "%Y"]]]]\r
+  set sync_date_month   [expr [clock format [clock seconds] -format "%m"]]\r
+  if { [string first 0 $sync_date_month] == 0 } {\r
+    set sync_date_month [expr [string replace $sync_date_month 0 0]]\r
+  }\r
+  set sync_date_day    [expr [clock format [clock seconds] -format "%e"]]\r
+  \r
+  # Get hours in 24H time format\r
+  set sync_time_hours_24 [clock format [clock seconds] -format "%H"]\r
+  if { [string first 0 $sync_time_hours_24] == 0 } {\r
+    set sync_time_hours_24 [string replace $sync_time_hours_24 0 0]\r
+  }\r
+  \r
+  # Calculate hours in 12H time format\r
+  update_time_24\r
+  \r
+  # Get minutes and seconds\r
+  set sync_time_minutes  [clock format [clock seconds] -format "%M"]\r
+  if { [string first 0 $sync_time_minutes] == 0 } {\r
+    set sync_time_minutes [string replace $sync_time_minutes 0 0]\r
+  }\r
+  set sync_time_seconds  [clock format [clock seconds] -format "%S"]\r
+  if { [string first 0 $sync_time_seconds] == 0 } {\r
+    set sync_time_seconds [string replace $sync_time_seconds 0 0]\r
+  }\r
+  updateStatusSYNC "Copied system time and date to watch settings."\r
+}\r
+\r
+\r
+# Change all affected parameters to metric units / 24H time format\r
+proc switch_to_metric_units {} {\r
+  global w\r
+  global sync_date_month sync_date_day\r
+  global sync_temperature_24 sync_temperature_12\r
+  global sync_altitude_24    sync_altitude_12\r
+  global values_24\r
+  global values_12\r
+  global values_30\r
+  global value_temperature_C\r
+  global values_altitude_meters\r
+\r
+  # Update 24H time\r
+  update_time_12\r
+\r
+  # Reconfigure hours\r
+  $w.note.sync.f1.sb1 configure -textvariable sync_time_hours_24 -values $values_24 -postcommand { check_time }\r
+  $w.note.sync.ampm.rb1 configure -state disabled\r
+  $w.note.sync.ampm.rb2 configure -state disabled\r
+  \r
+  # Configure date fields\r
+  $w.note.sync.f2.l1 configure -text "Date (dd.mm.yyyy)"\r
+  $w.note.sync.f2.sb1 configure -textvariable sync_date_day   -values $values_30\r
+  $w.note.sync.f2.sb2 configure -textvariable sync_date_month -values $values_12\r
+  \r
+  # Change temperature\r
+  $w.note.sync.f4.l1 configure -text "Temperature (\u00B0C)" \r
+  $w.note.sync.f4.sb1 configure -textvariable sync_temperature_24 -values $value_temperature_C\r
+   \r
+  # Change altitude\r
+  $w.note.sync.f5.l1 configure -text "Altitude (m)"\r
+  $w.note.sync.f5.sb1 configure -textvariable sync_altitude_24 -values $values_altitude_meters\r
+}\r
+\r
+# Change all affected parameters to imperial units / 12H time format\r
+proc switch_to_imperial_units {} {\r
+  global w \r
+  global sync_date_year sync_date_month sync_date_day\r
+  global sync_temperature_12 sync_temperature_24\r
+  global sync_altitude_12    sync_altitude_24\r
+  global values_12 \r
+  global values_30\r
+  global value_temperature_F\r
+  global values_altitude_feet\r
+    \r
+  # Update 12H time\r
+  update_time_24\r
+    \r
+  # Reconfigure hours\r
+  $w.note.sync.f1.sb1 configure        -textvariable sync_time_hours_12 -values $values_12 -postcommand {check_time}\r
+  $w.note.sync.ampm.rb1 configure      -state normal\r
+  $w.note.sync.ampm.rb2 configure      -state normal\r
+  \r
+  # Change date\r
+  $w.note.sync.f2.l1 configure         -text "Date (mm.dd.yyyy)"     \r
+  $w.note.sync.f2.sb1 configure -textvariable sync_date_month  -values $values_12\r
+  $w.note.sync.f2.sb2 configure -textvariable sync_date_day    -values $values_30\r
+   \r
+  # Change temperature\r
+  $w.note.sync.f4.l1 configure         -text "Temperature (\u00B0F)" \r
+  $w.note.sync.f4.sb1 configure -textvariable sync_temperature_12 -values $value_temperature_F\r
+    \r
+  # Change altitude\r
+  $w.note.sync.f5.l1 configure         -text "Altitude (ft)"\r
+  $w.note.sync.f5.sb1 configure -textvariable sync_altitude_12 -values $values_altitude_feet\r
+}\r
+\r
+\r
+# Keep 24H and 12H time variable in sync\r
+proc update_time_24 {} {\r
+  global sync_use_metric_units sync_time_is_am sync_time_hours_24 sync_time_hours_12\r
+\r
+  # Checks if the variable is a number. If not, set it to 1\r
+  if {[string is digit -strict $sync_time_hours_24]==0} { set sync_time_hours_24 4}\r
+  \r
+  # Calculate 12H time  \r
+  if { $sync_time_hours_24 == 0 } {\r
+    set sync_time_hours_12 [expr $sync_time_hours_24 + 12]\r
+    set sync_time_is_am 1\r
+  } elseif { $sync_time_hours_24 <= 12 } {\r
+    set sync_time_hours_12 $sync_time_hours_24\r
+    set sync_time_is_am 1\r
+  } else {\r
+    set sync_time_hours_12 [expr $sync_time_hours_24 - 12]\r
+    set sync_time_is_am 0 \r
+  }\r
+}\r
+\r
+# Keep 24H and 12H time variable in sync\r
+proc update_time_12 {} {\r
+  global sync_use_metric_units sync_time_is_am sync_time_hours_24 sync_time_hours_12\r
+  \r
+  # Calculate 12H time \r
+  if { $sync_time_is_am == 1 } {\r
+    if { $sync_time_hours_12 == 12 } { \r
+      set sync_time_hours_24 0 \r
+    } else {\r
+      set sync_time_hours_24 $sync_time_hours_12\r
+    }\r
+  } else {\r
+    set sync_time_hours_24 [expr $sync_time_hours_12 + 12]\r
+  }\r
+}\r
+\r
+# Trace altitude and temperature and update internal units\r
+proc update_temperature args {\r
+  global sync_use_metric_units sync_temperature_24 sync_temperature_12\r
+  \r
+  # Convert to internal format\r
+  if {([string is digit -strict $sync_temperature_24 ]==1) && ([string is digit -strict $sync_temperature_12 ]==1)} {\r
+         if { $sync_use_metric_units == 1 } {\r
+               set sync_temperature_12 [format "%2.0f" [expr ($sync_temperature_24*9/5)+32]]\r
+         } else {\r
+               set sync_temperature_24 [format "%2.0f" [expr ($sync_temperature_12-32)/9*5]]\r
+         }\r
+  } \r
+  if {([string is digit -strict $sync_temperature_24 ]==0) && ($sync_use_metric_units == 0)} {\r
+        set sync_temperature_24 [format "%2.0f" [expr ($sync_temperature_12-32)/9*5]]\r
+  }\r
+}\r
+\r
+proc update_altitude args {\r
+  global sync_use_metric_units sync_altitude_24 sync_altitude_12\r
+       \r
+  # Convert to internal format\r
+  if {([string is digit -strict $sync_altitude_24 ]==1) && ([string is digit -strict $sync_altitude_12 ]==1)} {\r
+          if { $sync_use_metric_units == 1 } {\r
+               set sync_altitude_12   [format "%4.0f" [expr {round ($sync_altitude_24*3.28084)}]]\r
+         } else {\r
+               set sync_altitude_24   [format "%4.0f" [expr {round ( $sync_altitude_12/3.28084)}]]\r
+         }\r
+  }\r
+ if {([string is digit -strict $sync_altitude_24 ]==0) && ($sync_use_metric_units == 0)} {\r
+               set sync_altitude_24  [format "%4.0f" [expr {round ( $sync_altitude_12/3.28084)}]]\r
+  }\r
+}\r
+trace add variable sync_temperature_24 write update_temperature\r
+trace add variable sync_temperature_12 write update_temperature\r
+trace add variable sync_altitude_24 write update_altitude\r
+trace add variable sync_altitude_12 write update_altitude\r
+\r
+# ----------------------------------------------------------------------------------------\r
+# BlueRobin functions --------------------------------------------------------------------\r
+\r
+# Start BlueRobin transmission\r
+proc start_bluerobin { } {\r
+  global w bluerobin_on simpliciti_on\r
+  global sweep_hr txid heartrate \r
+  global com_available\r
+  global wbsl_on\r
+  # No com port?  \r
+  if { $com_available == 0} { return }\r
+\r
+  # Already sending BlueRobin\r
+  if { $bluerobin_on == 1 } { return } \r
+\r
+  # Wireless Update on?  \r
+  if { $wbsl_on == 1 } { return }\r
+  \r
+  # SimpliciTI on?\r
+  if { $simpliciti_on == 1 } { \r
+    stop_simpliciti_ap\r
+    after 500\r
+  } \r
+  \r
+  updateStatusBR "Initialising BlueRobin transmitter."\r
+  after 500\r
+\r
+  # Set transmitter ID\r
+  catch { BM_BR_SetID $txid } result\r
+  if { $result == 0 } {\r
+    updateStatusBR "Failed to set BlueRobin ID."\r
+    return\r
+  }\r
+  after 500\r
+\r
+  # Start BlueRobin channel \r
+  catch { BM_BR_Start } result\r
+  if { $result == 0 } {\r
+    updateStatusBR "Failed to start BlueRobin transmission."\r
+    return\r
+  }\r
+  # Update status box  \r
+  updateStatusBR "Starting BlueRobin heart rate transmission."\r
+  after 500\r
+  \r
+  # Set auto receive mode flag after some waiting time  \r
+  after 500\r
+  set bluerobin_on 1\r
+  \r
+  # Reconfigure control button \r
+  $w.note.br.frame0.btnStartStop configure -text "Stop Transmitter" -command { stop_bluerobin }\r
+}\r
+\r
+\r
+# Stop BlueRobin transmission\r
+proc stop_bluerobin { } {\r
+  global w bluerobin_on simpliciti_on\r
+\r
+  # Not on?\r
+  if { $simpliciti_on == 1 || $bluerobin_on == 0 } { return } \r
+\r
+  # Clear on flag  \r
+  set bluerobin_on 0\r
+\r
+  # Stop BlueRobin channel \r
+  catch { BM_BR_Stop } result\r
+  updateStatusBR "Stopping BlueRobin transmission."\r
+  after 1000\r
+  updateStatusBR "BlueRobin transmitter off."  \r
+  \r
+  # Reconfigure control button \r
+  $w.note.br.frame0.btnStartStop configure -text "Start Transmitter" -command { start_bluerobin }\r
+}\r
+\r
+\r
+# Set BlueRobin transmit data\r
+proc update_br_data {} {\r
+  global bluerobin_on heartrate speed distance speed_is_mph\r
+\r
+  # BlueRobin off?\r
+  if { $bluerobin_on == 0 } { return }\r
+  \r
+  # Send heart rate to RF access point \r
+  catch { BM_BR_SetHeartrate $heartrate } res\r
+  update\r
+\r
+  # Convert english units to metric units\r
+  if { $speed_is_mph == 1 } {\r
+    set speed1 [format "%0.2f" [expr $speed/0.6214 + 0.049]]  \r
+  } else {\r
+    set speed1 $speed\r
+  }\r
+\r
+  # Calculate new distance (1km/h = 1000m/3600sec)\r
+  # Use 0.1m resolution to enable speed < 3.6km/h\r
+  set distance [expr $distance + ($speed1*1.5*10*1000/3600)]\r
+  \r
+  # Transmit distance [m] and speed [0.1m] in decimal format\r
+  set distance1 [format "%.0f" [expr $distance/10 ]]\r
+  set speedx [format "%.0f" [expr $speed1*10]]\r
+  \r
+  # Send updated speed/distance to RF Access Point  \r
+  catch { BM_BR_SetSpeed $speedx $distance1 } res\r
+\r
+  # Update status line  \r
+  if { $speed_is_mph == 1 } {\r
+    updateStatusBR "Transmitting heart rate ($heartrate bpm), speed ([format "%0.1f" $speed] mph) and distance ([format "%0.2f" [expr [format %f $distance1]/1000 * 0.621371192]] mls)."\r
+  } else {\r
+    updateStatusBR "Transmitting heart rate ($heartrate bpm), speed ([format "%0.1f" $speed] km/h) and distance ($distance1 m)."\r
+  }\r
+}        \r
+\r
+\r
+# Automatically increase heart rate\r
+proc inc_heartrate {} {\r
+  global hr_sweep heartrate bluerobin_on\r
+  \r
+  # BlueRobin off?\r
+  if { $bluerobin_on == 0 } { return }\r
+  \r
+  # Sweep heart rate\r
+  if { $hr_sweep == 1 } {\r
+    set heartrate [expr $heartrate + 1]\r
+    if { $heartrate >= 220 } { set heartrate 40 }\r
+  }\r
+}\r
+\r
+\r
+# Automatically increase speed\r
+proc inc_speed {} {\r
+  global speed_sweep speed speed_limit_hi bluerobin_on\r
+  \r
+  # BlueRobin off?\r
+  if { $bluerobin_on == 0 } { return }\r
+  \r
+  # Sweep speed\r
+  if { $speed_sweep == 1 } {\r
+    set speed [expr $speed + 1]\r
+    if { $speed >= $speed_limit_hi } { set speed 0 }\r
+  }\r
+}\r
+\r
+\r
+# Change speed / distance format between km and miles\r
+proc change_speed_unit {} {\r
+  global w speed speed_limit_hi speed_is_mph speed_is_mph0\r
+  \r
+  # No change?\r
+  if { $speed_is_mph == $speed_is_mph0 } { return }\r
+  \r
+  if { $speed_is_mph == 1} {\r
+    # From metric to imperial units\r
+    set speed [format "%0.1f" [expr $speed*0.6214]]\r
+    set speed_limit_hi 15.5\r
+  } else {\r
+    # From imperial units to metric\r
+    set speed [format "%0.1f" [expr $speed/0.6214]]\r
+    set speed_limit_hi 25.0\r
+  } \r
+  $w.note.br.scale_speed configure -to $speed_limit_hi\r
+  \r
+  # Remember current speed unit\r
+  set speed_is_mph0 $speed_is_mph\r
+} \r
+\r
+# ----------------------------------------------------------------------------------------\r
+# WBSL Update functions ------------------------------------------------------------------\r
+\r
+# Prompt the user to select a file
+proc open_file {} {
+       global select_input_file
+       global w
+       set types {
+               {{CC430 Firmware} {.txt}                                        }
+       }
+       set select_input_file [tk_getOpenFile -title "Select File" -filetypes $types] 
+       
+}
+
+
+# Safely execute WBSL service functions (non-overlapping)
+proc call_wbsl_funcs {} {
+  global call_wbsl_timer call_wbsl_1 call_wbsl_2
+
+  if { $call_wbsl_timer == $call_wbsl_1 } { 
+    get_wbsl_packet_status 
+    set call_wbsl_1 [expr $call_wbsl_timer + 2]
+  } 
+  if { $call_wbsl_timer == $call_wbsl_2 } { 
+    get_wbsl_status
+    set call_wbsl_2 [expr $call_wbsl_timer + 3]
+  } 
+
+  incr call_wbsl_timer
+}
+
+
+# Start the Wireless update procedure, and put RF Access Point in RX mode
+proc start_wbsl_ap {} {
+  global w
+  global simpliciti_on bluerobin_on com_available
+  global wbsl_on select_input_file
+  global wbsl_ap_started
+  global fsize
+  global fp
+  global rData
+  global rData_index
+  global low_index
+  global list_count maxPayload 
+  global ram_updater_downloaded
+  global wirelessUpdateStarted
+
+  # init needed variables
+  set rData [list]
+  set rData_index 0
+  set low_index 0
+  
+  # No com port?  
+  if { $com_available == 0} { return }
+  
+  # Testing REMOVE
+  # set ram_updater_downloaded 1
+  
+  set ram_updater_file "ram_based_updater.txt"
+
+  if { $ram_updater_downloaded == 0 } {
+         # Check that the user has selected a file    
+         if { [string length $select_input_file] == 0 } {
+                       tk_dialog .dialog1 "No file selected" {Please select a watch firmware file (*.txt) to download to the watch.} info 0 OK
+                       return
+         }
+         
+         # Check that the file selected by the user has the extension .txt 
+         if { [string first ".txt" $select_input_file] == -1 } {
+                   tk_dialog .dialog1 "Invalid .txt File" {The file selected is not a .txt file.} info 0 OK
+                       return
+         }
+  }
+
+  # First off check that the file trying to be downloaded has the right format
+  catch { file size $select_input_file } fsize
+  
+  # Check if the file exist
+  if { [string first "no such file" $fsize] != -1 } {
+       tk_dialog .dialog1 "File doesnt exist" {The selected file doesnt exist, please verify the path.} info 0 OK
+       return
+  }
+  
+  # Open the file for reading
+  catch { open $select_input_file r } fp
+  fconfigure $fp -translation binary
+
+  # read the first character of the file, it should be an @ symbol
+  set test_at [read $fp 1]
+
+  if { $test_at != "@" } { 
+    tk_dialog .dialog1 "Invalid .txt File" {The .txt file is NOT formatted correctly.} info 0 OK
+    close $fp
+    return
+  }
+  
+  # read the complete file
+  set rawdata [read $fp $fsize]
+  close $fp
+  # Remove spaces, tabs, endlines from the data
+  regsub -all {[ \r\t\nq]*} $rawdata "" stripped_data
+  set lines 0
+  # Divide the file by the symbol @ so that in each list there is data to be written consecutively at the address indicated by the first 2 bytes
+  set datainlist [split $stripped_data "@"]
+  set list_count 0
+  set byteCounter 0
+  
+  # For each line, convert the ASCII format in which is saved to Raw HEX format
+  foreach lines $datainlist {
+       set lines [join $lines]
+       regsub -all {[ \r\t\nq]*} $lines "" line
+       if { [catch { binary format H* $line } line] } {
+             tk_dialog .dialog1 "Invalid .txt File" {The .txt file is NOT formatted correctly.} info 0 OK
+             return
+      } 
+      lappend rData $line
+      incr list_count
+   }
+  
+  # Check if the RAM_UPDATER is not yet on the watch so that we download this first
+  if { $ram_updater_downloaded == 0 } {
+         # init needed variables
+      set rData [list]
+      set rData_index 0
+      set low_index 0
+      
+         catch { file size $ram_updater_file} fsize
+         
+         # Check that the RAM Updater file is present on the GUI working directory
+         if { [string first "no such file" $fsize] != -1 } {
+               tk_dialog .dialog1 "No Updater File" {The RAM Updater File is not present on the working directory. Filename should be:ram_based_updater.txt} info 0 OK
+            return
+         }
+         
+         catch { open $ram_updater_file r } fp
+         fconfigure $fp -translation binary
+         
+         set test_at [read $fp 1]
+        
+         if { $test_at != "@" } { 
+               tk_dialog .dialog1 "Invalid .txt File" {The ram_based_updater.txt file is NOT formatted correctly.} info 0 OK
+               close $fp
+               return
+         }
+         
+         set rawdata [read $fp $fsize]
+         close $fp
+         # Remove spaces, tabs, endlines from the data
+         regsub -all {[ \r\t\nq]*} $rawdata "" stripped_data
+         
+         set datainlist [split $stripped_data "@"]
+         set list_count 0
+         set byteCounter 0
+         foreach lines $datainlist {
+                       set lines [join $lines]
+                       regsub -all {[ \r\t\nq]*} $lines "" line
+                       if { [catch { binary format H* $line } line] } {
+                         tk_dialog .dialog1 "Invalid .txt File" {The ram_based_updater.txt file is NOT formatted correctly.} info 0 OK
+                         return
+                   } 
+                   lappend rData $line
+                   incr list_count
+               }
+  }
+  # In AP mode?
+  if { $simpliciti_on == 1 } { 
+    stop_simpliciti_ap
+    after 500
+  } 
+  
+  # In BlueRobin mode?
+  if { $bluerobin_on == 1 } { 
+    stop_bluerobin
+    after 500
+  } 
+
+  updateStatusWBSL "Starting Wireless Update."
+  after 200
+
+  # Link with WBSL transmitter
+  BM_WBSL_Start
+  after 100
+  
+  set result [ BM_WBSL_GetMaxPayload ]
+  after 10
+  set result [ BM_WBSL_GetMaxPayload ]
+
+  if { $result < 2 } {
+    updateStatusWBSL "$result Failed to start Wireless Update."
+    return
+  }
+
+
+  set maxPayload $result
+  
+  # Calculate the number of packets needed to be sent
+  
+  #initialize the number of packets
+  set fsize 0
+  
+  # sum up all the bytes to be sent
+  foreach block $rData {
+       set byteCounter [string length $block]
+       set dByte [expr {double($byteCounter)}]
+       set dMax [expr {double($maxPayload)} ]
+       set temp [ceil [expr  $dByte / $dMax]]
+       set fsize [expr $fsize + $temp]
+  }
+    
+  # Set on WBSL flag   
+  set wbsl_on 1
+
+  # Cancel out first received data
+  set wbsl_ap_started 0
+  
+  # Reconfig buttons
+  $w.note.wbsl.btnDwnld configure -text "Cancel Update" -command { stop_wbsl_ap }
+  
+}
+
+# Stop the wireless update procedure
+proc stop_wbsl_ap {} {
+  global w
+  global simpliciti_on bluerobin_on com_available wbsl_on
+  global ram_updater_downloaded
+  global wirelessUpdateStarted
+
+  # AP off?
+  if { $wbsl_on == 0 } { return }
+  
+  # Clear on flags  
+  set wbsl_on 0
+  set ram_updater_downloaded 0
+
+  after 500
+  BM_WBSL_Stop
+
+  # Show that link is inactive
+  updateStatusWBSL "Wireless Update is off."
+
+  update
+  
+  # Initialize the variable that tell us when the update procedure has been initiated by the Watch
+  set wirelessUpdateStarted 0
+
+  # Reconfig button and re-enable it in case the update procedure was started and it was disabled during the procedure
+  $w.note.wbsl.btnDwnld configure -text "Update Chronos Watch" -command { start_wbsl_ap } -state enabled
+  
+}
+
+proc get_wbsl_packet_status {} {
+  global w
+  global wbsl_on 
+  global wbsl_ap_started
+  global fsize
+  global fp
+  global rData   
+  global rData_index
+  global low_index
+  global list_count maxPayload
+  global wbsl_opcode
+  global ram_updater_downloaded
+  global vcp_reply
+  
+  set status 0
+  
+  # return if WBSL is not active  
+  if { $wbsl_on == 0 } { return }
+  # Check packet status
+  set status [ BM_WBSL_GetPacketStatus ]
+  if { $status == 1 } {
+    # WBSL_DISABLED Not started by watch
+    return
+  } elseif { $status == 2 } {
+       # WBSL Is processing a packet
+        return 
+  } elseif { $status == 4 } {
+       # Send the size of the file
+       set packets [expr {int($fsize)} ]
+       # send opcode 0 which is a info packet, which contains the total packets to be sent
+       catch { BM_WBSL_SendData 0 $packets } status 
+    # The next packet will contain an address
+       set wbsl_opcode 1
+  } elseif { $status == 8 } {
+       # Send the next data packet
+               
+       if { $rData_index <  $list_count } {
+               # Choose the appropriate block of data
+               set data_block [lindex $rData $rData_index]
+               # Get the size of the block of data, to know if we have sent all of the data in this block and move to the next
+               set block_size [string length $data_block]
+               # Read MaxPayload Bytes from the list
+               set c_data [string range $data_block $low_index [expr $low_index + [expr $maxPayload - 1]]]
+               
+               # Send the read bytes to the dongle
+               set status [BM_WBSL_SendData $wbsl_opcode $c_data] 
+               
+               #update the low index
+               set low_index [expr $low_index + $maxPayload]
+               
+               # Next packet is a normal data packet
+               set wbsl_opcode 2
+               
+               if { $low_index >= $block_size } { 
+                       incr rData_index
+                       set     low_index 0
+                       # Next packet will include an address at the beginning of the packet
+                       set wbsl_opcode 1
+               }
+        }
+  } else {
+       # ERROR only the previous options should be returned
+    if { $ram_updater_downloaded == 0 } {
+               tk_dialog .dialog1 "Error in communication" {There was an error in the communication between the RF Access Point and the watch during the download to RAM. The watch should have reset itself. Please retry the update the same way as before.} info 0 OK
+    } else {
+      tk_dialog .dialog1 "Error in communication" {There was an error in the communication between the RF Access Point and the watch during the download to Flash. The watch is in a sleep mode now. Please press the "Update Chronos Watch" first and then press the down button on the watch to restart the update.} info 0 OK
+    }
+       after 200
+       stop_wbsl_ap 
+       return
+  }
+}
+
+# Get the global status of the AP, check if the state in which the GUI is, matches the state of the AP
+proc get_wbsl_status {} {
+  global w vcp
+  global wbsl_on
+  global wbsl_ap_started wbsl_progress
+  global ram_updater_downloaded
+  global wirelessUpdateStarted
+  global wbsl_timer_flag
+  global vcp_reply fh
+  
+  set status 0
+  
+  # return if WBSL is not active  
+  if { $wbsl_on == 0 } { return }
+
+  # Check if the flag has been set, which means the communication was lost while trying to link to download the update image
+ if { $wbsl_timer_flag == 1 } {
+            tk_dialog .dialog1 "Error in communication" {There was an error in the communication between the AP and the Watch while trying to start the download to Flash. The watch should have reset itself. Please retry the update the same way as before.} info 0 OK
+            wbsl_reset_timer        
+            after 300
+            stop_wbsl_ap
+            return
+    }
+
+  # Update status box  
+  set status [ BM_GetStatus1 ]
+
+  if { $status == 9 } {
+    # just starting AP
+    updateStatusWBSL "Starting access point."
+    return
+  # Check if there was an error during the communication between the AP and the watch
+  } elseif { $status == 11 || $status == 12 } {
+       
+       if { $ram_updater_downloaded == 0 } {
+               tk_dialog .dialog1 "Error in communication" {There was an error in the communication between the RF Access Point and the watch during the download to RAM. The watch should have reset itself. Please retry the update the same way as before.} info 0 OK
+    } else {
+        tk_dialog .dialog1 "Error in communication" {There was an error in the communication between the RF Access Point and the watch during the download to Flash. The watch is in sleep mode now. Please press the "Update Chronos Watch" first and then press the down button on the watch to restart the update.} info 0 OK
+    }
+       after 300
+       stop_wbsl_ap 
+       
+  } elseif { $status == 10 } {
+    
+    # Read WBSL data from dongle
+    set data [ BM_WBSL_GetStatus ]
+   # if { $data == "" }  { return }
+    
+    if { $wbsl_ap_started == 0} {
+       if { $ram_updater_downloaded == 0 } {
+      updateStatusWBSL "Access point started. Now start watch in rFbSL mode."
+after 2000
+     } else {
+       updateStatusWBSL "Starting to download update image to watch."
+       # We will now try to link with the watch to start downloading the Update Image, we need a timer in case the communication is lost
+       # while trying to link, since for the linking to start, the Dongle normally waits until the watch initiates the procedure.
+       wbsl_set_timer 1
+       update
+     }
+      set wbsl_ap_started 1
+      return
+    } else {
+   
+      # Check if data is valid
+      if { $data < 0 } {
+        return
+      } 
+     
+     set wbsl_progress $data
+     
+     if { $wbsl_progress != 0 } {
+          
+          if { $wirelessUpdateStarted == 0 } {
+               
+                 set wirelessUpdateStarted 1
+             # Reconfig buttons
+                   $w.note.wbsl.btnDwnld configure -state disabled
+            }
+          
+            if { $ram_updater_downloaded == 1 } {
+                # The download to FLASH has started, we don't need the timer to keep running
+                wbsl_reset_timer
+                update
+                 updateStatusWBSL "Downloading update image to watch. Progress: [format %d $wbsl_progress]%"   
+           
+                   if { $wbsl_progress >= 100 } { 
+                           updateStatusWBSL "Image has been successfully downloaded to the watch"      
+                           after 1500
+                           stop_wbsl_ap
+                          }
+                       
+            } else {
+                updateStatusWBSL "Downloading the RAM Based Updater. Progress: [format %d $wbsl_progress]%"    
+
+#puts $fh "\nDownloading the RAM Based Updater.\n"
+
+                 if { $wbsl_progress >= 100 } { 
+                           updateStatusWBSL "RAM Based Updater downloaded. Starting download of update image." 
+                           set ram_updater_downloaded 1
+                           BM_WBSL_Stop
+                           set wbsl_on 0
+                           start_wbsl_ap
+                          }
+            }
+     }
+      return
+      }
+   } 
+}
+
+# Stop and reset the timer variables
+proc wbsl_reset_timer { } {
+       global wbsl_timer_enabled
+       global wbsl_timer_counter
+       global wbsl_timer_flag
+       global wbsl_timer_timeout
+       
+       set  wbsl_timer_counter  0
+       set  wbsl_timer_flag     0
+       set  wbsl_timer_timeout  0
+       set  wbsl_timer_enabled  0
+ }
+
+# Set the timeout variable and start the timer
+proc wbsl_set_timer { timeout } {
+       global wbsl_timer_enabled
+       global wbsl_timer_counter
+       global wbsl_timer_flag
+       global wbsl_timer_timeout
+       
+       set  wbsl_timer_counter  0
+       set  wbsl_timer_flag     0
+       set  wbsl_timer_timeout  $timeout
+       set  wbsl_timer_enabled  1
+ }
+
+# Called every 2.5 seconds, acts as the timer, it only counts if it's enabled
+proc wbsl_simple_timer {} {
+       global wbsl_timer_enabled
+       global wbsl_timer_counter
+       global wbsl_timer_flag
+       global wbsl_timer_timeout
+       
+       if { $wbsl_timer_enabled == 0 } { 
+          return       
+       }
+       set wbsl_timer_counter [expr $wbsl_timer_counter+1]
+       if { $wbsl_timer_counter > $wbsl_timer_timeout } {
+               set wbsl_timer_flag 1
+          set wbsl_timer_enabled 0
+    }
+    
+}
+
+# ----------------------------------------------------------------------------------------\r
+# System functions -----------------------------------------------------------------------\r
+\r
+# Create Windows key events\r
+proc button_set { btn } {\r
+  global pd_m1 pd_m2 pd_s1\r
+  global cb_m1_windows cb_m1_alt cb_m1_ctrl cb_m1_shift\r
+  global cb_s1_windows cb_s1_alt cb_s1_ctrl cb_s1_shift\r
+  global cb_m2_windows cb_m2_alt cb_m2_ctrl cb_m2_shift\r
+  \r
+  # Button select\r
+  switch $btn {\r
+    "M1"  { set pd          $pd_m1\r
+            set cb_windows  $cb_m1_windows\r
+            set cb_alt      $cb_m1_alt\r
+            set cb_ctrl     $cb_m1_ctrl\r
+            set cb_shift    $cb_m1_shift }\r
+    "M2"  { set pd          $pd_m2\r
+            set cb_windows  $cb_m2_windows\r
+            set cb_alt      $cb_m2_alt\r
+            set cb_ctrl     $cb_m2_ctrl\r
+            set cb_shift    $cb_m2_shift }\r
+    "S1"  { set pd          $pd_s1\r
+            set cb_windows  $cb_s1_windows\r
+            set cb_alt      $cb_s1_alt\r
+            set cb_ctrl     $cb_s1_ctrl\r
+            set cb_shift    $cb_s1_shift }\r
+    default { return }\r
+  }\r
+  \r
+  # Convert key to key symbol\r
+  set keysymbol 0\r
+\r
+  if { [string length $pd] == 1 } {\r
+    set keysymbol $pd\r
+  } else {\r
+    # Convert special keys\r
+    switch $pd {\r
+      "Space"         { set keysymbol "space" }\r
+      "Arrow-Left"    { set keysymbol "Left" } \r
+      "Arrow-Right"   { set keysymbol "Right" }\r
+      "F5"            { set keysymbol "F5" }\r
+    }\r
+  }\r
+\r
+  # Simulate complex key event\r
+  BM_SetKey $keysymbol $cb_windows $cb_alt $cb_ctrl $cb_shift\r
+}\r
+\r
+\r
+# ----------------------------------------------------------------------------------------\r
+# Wave graph functions -------------------------------------------------------------------\r
+\r
+\r
+# Add new wave samples and delete the oldest ones\r
+proc add_wave_coords { } {\r
+  global w\r
+  global accel_x accel_y accel_z accel_x_offset accel_y_offset accel_z_offset\r
+  global wave_x wave_y wave_z\r
+\r
+  # cut away oldest sample\r
+  set nb_of_samples [ expr [ llength $wave_x ] / 2 ]\r
+  if { $nb_of_samples > 61 } {\r
+    set wave_x [lreplace $wave_x 0 1]\r
+    set wave_y [lreplace $wave_y 0 1]\r
+    set wave_z [lreplace $wave_z 0 1]\r
+  }\r
+\r
+  # shift all waves to left --> decrease all x coordinates by 10\r
+  set wave_temp { }\r
+  foreach {x y} $wave_x {\r
+    if { $y != "" } { \r
+      lappend wave_temp [expr $x-10] $y\r
+    }  \r
+  }\r
+  set wave_x $wave_temp\r
+\r
+  set wave_temp { }\r
+  foreach {x y} $wave_y {\r
+    if { $y != "" } { \r
+      lappend wave_temp [expr $x-10] $y\r
+    }  \r
+  }\r
+  set wave_y $wave_temp\r
+\r
+  set wave_temp { }\r
+  foreach {x y} $wave_z {\r
+    if { $y != "" } { \r
+      lappend wave_temp [expr $x-10] $y\r
+    }  \r
+  }\r
+  set wave_z $wave_temp\r
+  \r
+  # Map values to 100 pixel high window\r
+  set new_x [expr 50 - ($accel_x / 35) ]\r
+  set new_y [expr 50 - ($accel_y / 35) ]\r
+  set new_z [expr 50 - ($accel_z / 35) ]\r
+  if { $new_x > 99   } { set new_x 99 } \r
+  if { $new_y > 99   } { set new_y 99 } \r
+  if { $new_z > 99   } { set new_z 99 } \r
+  if { $new_x <  5   } { set new_x 5 } \r
+  if { $new_y <  5   } { set new_y 5 } \r
+  if { $new_z <  5   } { set new_z 5 } \r
+  \r
+  # Append new samples\r
+  lappend wave_x 600 $new_x\r
+  lappend wave_y 600 $new_y\r
+  lappend wave_z 600 $new_z\r
+}\r
+\r
+# Ensure that this this is an array\r
+array set animationCallbacks {}\r
+\r
+# Create a smoothed line and arrange for its coordinates to be the\r
+# contents of the variable waveCoords.\r
+$w.note.spl.frame2x.canvas create line $wave_x -tags wave -width 1 -fill black -smooth 1\r
+$w.note.spl.frame2y.canvas create line $wave_y -tags wave -width 1 -fill black -smooth 1\r
+$w.note.spl.frame2z.canvas create line $wave_z -tags wave -width 1 -fill black -smooth 1\r
+\r
+# \r
+proc waveCoordsTracer {w args} {\r
+    global wave_x\r
+    global wave_y\r
+    global wave_z\r
+\r
+    # Actual visual update will wait until we have finished\r
+    # processing; Tk does that for us automatically.\r
+    $w.note.spl.frame2x.canvas coords wave $wave_x\r
+    $w.note.spl.frame2y.canvas coords wave $wave_y\r
+    $w.note.spl.frame2z.canvas coords wave $wave_z\r
+}\r
+trace add variable wave_x write [list waveCoordsTracer $w]\r
+\r
+proc move {} {\r
+    # Theoretically 100 frames-per-second (==10ms between frames)\r
+    global animationCallbacks\r
+    set animationCallbacks(simpleWave) [after 10 move]\r
+}\r
+\r
+# Initialise our remaining animation variables\r
+set animateAfterCallback {}\r
+\r
+# Start the animation processing\r
+move\r
+\r
+\r
+\r
+# ----------------------------------------------------------------------------------------\r
+# Status output functions ----------------------------------------------------------------\r
+\r
+proc updateStatusBR { msg } {\r
+  global w\r
+  $w.note.br.frame0b.lblStatusText configure -text $msg\r
+  update\r
+}\r
+proc updateStatusSPL { msg } {\r
+  global w\r
+  $w.note.spl.frame0b.lblStatusText configure -text $msg\r
+  $w.note.sync.status.l2 configure -text $msg\r
+  update\r
+}\r
+proc updateStatusSYNC { msg } {\r
+  global w\r
+  $w.note.sync.status.l2 configure -text $msg\r
+  $w.note.spl.frame0b.lblStatusText configure -text $msg\r
+  update\r
+}\r
+proc updateStatusWBSL { msg } {\r
+  global w\r
+  $w.note.wbsl.frame0b.lblStatusText configure -text $msg\r
+  update\r
+}\r
+\r
+# ----------------------------------------------------------------------------------------\r
+# Start / stop application ---------------------------------------------------------------\r
+\r
+# Exit application\r
+proc exitpgm {} {\r
+  catch { stop_simpliciti_ap }\r
+  catch { stop_bluerobin }\r
+  catch { BM_CloseCOM }\r
+  exit 0\r
+}\r
+\r
+proc check_time args {\r
+       global sync_time_hours_12 sync_time_hours_24 sync_time_minutes sync_time_seconds\r
+       global sync_use_metric_units\r
+       global w\r
+       \r
+       if { $sync_time_hours_12 > 12   } { set sync_time_hours_12      1       }\r
+       if { $sync_time_hours_24 > 23   } { set sync_time_hours_24      4       }\r
+       if { $sync_time_minutes  > 59   } { set sync_time_minutes       30      }\r
+       if { $sync_time_seconds  > 59   } { set sync_time_seconds       0       }\r
+       \r
+       if {[string is digit -strict $sync_time_hours_12        ]==0} { set sync_time_hours_12  1}      \r
+       if {[string is digit -strict $sync_time_hours_24        ]==0} { set sync_time_hours_24  0}      \r
+       if {[string is digit -strict $sync_time_minutes         ]==0} { set sync_time_minutes   0}      \r
+       if {[string is digit -strict $sync_time_seconds         ]==0} { set sync_time_seconds   0}              \r
+       update_time_24\r
+}\r
+\r
+proc check_date args {\r
+       global values_31 values_30 values_29 values_28\r
+       global sync_date_day sync_date_month sync_date_year\r
+       global sync_use_metric_units\r
+       global w\r
+       set actual_day $sync_date_day\r
+       \r
+       # Check if we are using metric system, and switch the combobox\r
+       if { $sync_use_metric_units == 1 } {\r
+               set combobox $w.note.sync.f2.sb1\r
+       } else {\r
+               set combobox $w.note.sync.f2.sb2\r
+       }       \r
+       \r
+       switch $sync_date_month {\r
+               1       { $combobox configure -textvariable sync_date_day -values $values_31 -postcommand {check_date }}\r
+                       \r
+               3       {$combobox configure -textvariable sync_date_day -values $values_31 -postcommand {check_date }}\r
+                       \r
+               5       {$combobox configure -textvariable sync_date_day -values $values_31 -postcommand {check_date }}\r
+                       \r
+               7       { $combobox configure -textvariable sync_date_day -values $values_31 -postcommand {check_date }}\r
+                       \r
+               8       { $combobox configure -textvariable sync_date_day -values $values_31 -postcommand {check_date }}\r
+                       \r
+               10  {$combobox configure -textvariable sync_date_day -values $values_31 -postcommand {check_date }}\r
+                       \r
+               12      { $combobox configure -textvariable sync_date_day -values $values_31 -postcommand {check_date }}\r
+\r
+               4       { $combobox configure -textvariable sync_date_day -values $values_30 -postcommand {check_date }}\r
+               6       { $combobox configure -textvariable sync_date_day -values $values_30 -postcommand {check_date }}\r
+               9       { $combobox configure -textvariable sync_date_day -values $values_30 -postcommand {check_date }\r
+                       set sync_date_day $actual_day   \r
+                       }\r
+               11      { $combobox configure -textvariable sync_date_day -values $values_30 -postcommand {check_date }}\r
+               \r
+      ## A year that is divisible by 4 is a leap year. (Y % 4) == 0\r
+      ## Exception to rule 1: a year that is divisible by 100 is not a leap year. (Y % 100) != 0\r
+      ## Exception to rule 2: a year that is divisible by 400 is a leap year. (Y % 400) == 0 \r
+               2       {\r
+                       if {( [expr $sync_date_year%4] == 0) && ([ expr $sync_date_year%100 != 0] || [expr $sync_date_year%400 == 0 ])} { $combobox configure -textvariable sync_date_day -values $values_29 -postcommand {check_date } } \\r
+                               else { $combobox configure -textvariable sync_date_day -values $values_28 -postcommand {check_date } }          \r
+                       }\r
+       }\r
+       \r
+       # Set boundaries for variables  \r
+       if { $sync_date_month   >       12 ||   $sync_date_month        <       0       } { set sync_date_month 1}\r
+       if { $sync_date_day             <       0  ||   $sync_date_day          >       31      } { set sync_date_day   1}\r
+       if { $sync_date_year    <       0 } { set sync_date_year        2010 }\r
+       if {[string is digit -strict $sync_date_year]==0} { set sync_date_year  2010}\r
+}\r
+\r
+proc check_altitude {} {\r
+       global w\r
+       global sync_altitude_24 sync_altitude_12\r
+       global sync_use_metric_units\r
+       \r
+       if { $sync_use_metric_units == 1 } {\r
+         if {[string is digit -strict $sync_altitude_24]==0} { set sync_altitude_24 430}       \r
+       } else {\r
+         if {[string is digit -strict $sync_altitude_12]==0} { set sync_altitude_12 1411}\r
+       }\r
+}\r
+\r
+proc check_temperature {} {\r
+       global w\r
+       global sync_temperature_24 sync_temperature_12\r
+       global sync_use_metric_units\r
+       if { $sync_use_metric_units == 1 } {\r
+         if {[string is digit -strict $sync_temperature_24]==0} { set sync_temperature_24 22}  \r
+       } else {\r
+         if {[string is digit -strict $sync_temperature_12]==0} { set sync_temperature_12 71}  \r
+       }               \r
+}\r
+\r
+# Execute function once at startup
+load_ini_file
+
+# Reconfigure display
+if { $sync_use_metric_units == 1 } {
+  switch_to_metric_units
+} else {
+  switch_to_imperial_units
+}
+
+# Exit program
+if { $exit_prog == 1 } { exitpgm }\r
+\r
+# ----------------------------------------------------------------------------------------\r
+# Periodic functions  --------------------------------------------------------------------\r
+proc every {ms body} {eval $body; after $ms [info level 0]}
+every 1500 { update_br_data }
+every 3000 { inc_heartrate }
+every 2000 { inc_speed }
+every 25   { get_spl_data }
+every 10   { call_wbsl_funcs }
+every 2500 { wbsl_simple_timer }\r
diff --git a/chronos-ti/Control Center/Chronos Control Center/eZ430-Chronos-CC.ini b/chronos-ti/Control Center/Chronos Control Center/eZ430-Chronos-CC.ini
new file mode 100755 (executable)
index 0000000..3c1ae45
--- /dev/null
@@ -0,0 +1,16 @@
+pd_m1=Arrow-Left
+pd_m2=F5
+pd_s1=Arrow-Right
+cb_m1_windows=0
+cb_m1_alt=0
+cb_m1_ctrl=0
+cb_m1_shift=0
+cb_s1_windows=0
+cb_s1_alt=0
+cb_s1_ctrl=0
+cb_s1_shift=0
+cb_m2_windows=0
+cb_m2_alt=0
+cb_m2_ctrl=0
+cb_m2_shift=0
+sync_use_metric_units=1
diff --git a/chronos-ti/Control Center/Chronos Control Center/eZ430-Chronos_driver.tcl b/chronos-ti/Control Center/Chronos Control Center/eZ430-Chronos_driver.tcl
new file mode 100755 (executable)
index 0000000..45e5f74
--- /dev/null
@@ -0,0 +1,358 @@
+set vcp            0
+set vcp_reply     ""
+set vcp_len       0
+set vcp_pending           0
+set vcp_debug     0
+if { $vcp_debug == 1 } { 
+  set fh [open "log.txt" w] 
+} else {
+  set fh 0
+}
+\r
+# Send string through UART  \r
+proc SendCmd { command } {\r
+  global vcp vcp_reply vcp_len vcp_pending vcp_debug fh
+
+  set timeout 0
+  while { $vcp_pending == 1 } {
+    if { $vcp_debug == 1  } { puts $fh "Waiting for reply. Delaying command $command." }
+    after 5
+    update
+    incr timeout
+    if {$timeout > 100} { 
+      set vcp_pending 0 
+      if { $vcp_debug == 1  } { puts $fh "Terminating delay loop." }
+    }
+  }
+  update
+  if { $vcp_debug == 1  } { puts $fh "Sending $command" }
+  
+  # Send command 
+  set vcp_reply ""
+  set vcp_pending 1
+  set len [string length $command]\r
+  set vcp_len [expr $len / 2]
+  for {set i 0} {$i < $len} {incr i} {  \r
+    set hex 0x[string range $command $i [expr $i+1]]\r
+    set letter [format %c $hex]\r
+    puts -nonewline $vcp $letter\r
+    incr i\r
+  }
+  puts -nonewline $vcp "\n"\r
+  flush $vcp
+}\r
+
+# Get UART buffer content \r
+proc GetReply {} {
+  global vcp vcp_reply vcp_len vcp_pending vcp_debug fh\r
+
+  set cap [read $vcp]
+  binary scan $cap cu* valueList\r
+  foreach value $valueList {\r
+    append vcp_reply [format "0x%02X " $value]\r
+  }
+  if { $vcp_debug == 1  } { puts $fh "Received: $vcp_reply" }
+  flush $vcp
+  set vcp_pending 0
+}
+
+# Open COM port\r
+proc BM_OpenCOM { port baudrate timeout dts rts } {\r
+  global vcp\r
+  catch { open $port w+ } vcp\r
+  if { [string first "couldn't" $vcp] != -1 } {\r
+    set vcp 0\r
+  } else {
+    fconfigure $vcp -mode 115200,n,8,1 \r
+    fconfigure $vcp -blocking 0\r
+    fconfigure $vcp -buffering full -encoding binary -translation binary\r
+    fileevent $vcp readable [list GetReply]
+  }\r
+}
+
+\r
+# Close COM port\r
+proc BM_CloseCOM {} {\r
+  global vcp fh\r
+  close $vcp
+  flush $fh
+  close $fh\r
+}\r
+\r
+# Reset hardware\r
+proc BM_Reset {} {\r
+  SendCmd "FF0103"
+  after 15\r
+}\r
+\r
+# Set BlueRobin TX ID\r
+proc BM_BR_SetID { id } {\r
+  SendCmd "FF0307[format %02X [expr $id & 0xFF]][format %02X [expr ($id>>8) & 0xFF]][format %02X [expr ($id>>16) & 0xFF]][format %02X [expr ($id>>24) & 0xFF]]"
+  after 15\r
+}\r
+\r
+# Start BlueRobin TX\r
+proc BM_BR_Start {} {\r
+  SendCmd "FF0203"
+  after 15\r
+}\r
+\r
+# Stop BlueRobin TX\r
+proc BM_BR_Stop {} {\r
+  SendCmd "FF0603"
+  after 15\r
+}\r
+\r
+\r
+# Set BlueRobin heart rate value\r
+proc BM_BR_SetHeartrate { hr } {\r
+  SendCmd "FF0504[format %02X [expr $hr & 0xFF]]"
+  after 15\r
+}\r
+\r
+# Set BlueRobin speed and distance value\r
+proc BM_BR_SetSpeed { spd dist } {\r
+  SendCmd "FF0A06[format %02X [expr $spd & 0xFF]][format %02X [expr $dist & 0xFF]][format %02X [expr ($dist>>8) & 0xFF]]"
+  after 15\r
+}\r
+\r
+# Start SimpliciTI stack\r
+proc BM_SPL_Start {} {\r
+  SendCmd "FF0703"
+  after 15
+}\r
+\r
+# Stop SimpliciTI stack\r
+proc BM_SPL_Stop {} {\r
+  SendCmd "FF0903"
+  after 15
+}\r
+\r
+# Get 4 bytes payload from SimpliciTI stack\r
+proc BM_SPL_GetData {} {\r
+  global vcp_reply\r
+
+  SendCmd "FF080700000000"
+  after 15
+  update
+  
+  while { [llength $vcp_reply] <= 6 } { 
+    lappend vcp_reply 0x00
+  }
+
+  return [format "0x%02X" [expr ([lindex $vcp_reply 6]<<24) + ([lindex $vcp_reply 5]<<16) + ([lindex $vcp_reply 4]<<8) + [lindex $vcp_reply 3]]]\r
+}\r
+\r
+\r
+# Get HW status\r
+proc BM_GetStatus {} {\r
+  global vcp_reply vcp_pending vcp_debug fh\r
+  SendCmd "FF000400"
+  after 15
+  update\r
+  if { $vcp_debug == 1  } { puts $fh "BM_GetStatus = [lindex $vcp_reply 3]" }
+  return [lindex $vcp_reply 3]\r
+}
+\r
+\r
+# Simulate mouse clicks\r
+proc BM_SetMouseClick { btn } {\r
+  global w\r
+
+  set X [expr [winfo pointerx .]]
+  set Y [expr [winfo pointery .]]
+  set path [winfo containing $X $Y]
+\r
+  switch $btn {\r
+    1  { exec xdotool mousedown 1
+         after 10 
+         exec xdotool mouseup 1 }\r
+    \r
+    2  { exec xdotool mousedown 3
+         after 10 
+         exec xdotool mouseup 3 }\r
+    \r
+    3  { exec xdotool mousedown 1
+         after 10 
+         exec xdotool mouseup 1
+         after 10
+         exec xdotool mousedown 1
+         after 10 
+         exec xdotool mouseup 1 }\r
+  }\r
+}\r
+\r
+# Simulate complex key events\r
+proc BM_SetKey { keysymbol win alt ctrl shift } {\r
+  global w\r
+\r
+  # Press keys and release them immediately\r
+  if { $win == 1 }   { exec xdotool keydown "Super_L" }\r
+  if { $alt == 1 }   { exec xdotool keydown "Alt_L" }\r
+  if { $ctrl == 1 }  { exec xdotool keydown "Control_L" }\r
+  if { $shift == 1 } { exec xdotool keydown "Shift_L" }\r
+  if { $keysymbol > 0 } { exec xdotool keydown $keysymbol }\r
+  after 10\r
+  if { $keysymbol > 0 } { exec xdotool keyup $keysymbol }\r
+  if { $shift == 1 } { exec xdotool keyup "Shift_L" }\r
+  if { $ctrl == 1 }  { exec xdotool keyup "Control_L" }\r
+  if { $alt == 1 }   { exec xdotool keyup "Alt_L" }\r
+  if { $win == 1 }   { exec xdotool keyup "Super_L" }\r
+}\r
+\r
+\r
+# Start SimpliciTI sync mode\r
+proc BM_SYNC_Start {} {\r
+  SndCmd "FF3003"\r
+  after 15
+}\r
+\r
+# Send sync command\r
+proc BM_SYNC_SendCommand { ldata } {\r
+\r
+  # take data from list and append it to command\r
+  set str "FF3116"\r
+  set i 0\r
+  foreach value $ldata {\r
+     append str [format "%02X" $value]\r
+     incr i\r
+  }\r
+\r
+  # byte stuff with 0x00 until 19 bytes are set\r
+  for {set j $i} {$j < 19} {incr j} {  \r
+   append str "00"\r
+  }\r
+\r
+  SendCmd $str
+  after 15\r
+}\r
+\r
+# Get sync buffer\r
+proc BM_SYNC_ReadBuffer {} {\r
+  global vcp_reply
+
+  SendCmd "FF3303"
+  after 15
+  update
+  return [lrange $vcp_reply 3 22]\r
+}\r
+\r
+# Get sync buffer state (empty/full)\r
+proc BM_SYNC_GetBufferStatus {} {\r
+  global vcp_reply
+  SendCmd "FF320400"
+  after 15
+  update
+  return [lindex $vcp_reply 3]\r
+}\r
+
+
+# Get HW status\r
+proc BM_GetStatus1 {} {\r
+  global vcp_reply vcp_pending vcp_debug fh\r
+  SendCmd "FF000400"
+  while { $vcp_pending == 1 } { update }
+  set reply [lindex $vcp_reply 3]
+  if { $vcp_debug == 1  } { puts $fh "BM_GetStatus1 = $reply" }
+  return $reply\r
+}
+
+# BM_WBSL_Start\r
+proc BM_WBSL_Start { } {\r
+  SendCmd "FF4003"
+  after 15
+}\r
+\r
+# BM_WBSL_Stop\r
+proc BM_WBSL_Stop { } {\r
+  SendCmd "FF4603"
+  after 15\r
+}
+
+# BM_WBSL_GetMaxPayload\r
+proc BM_WBSL_GetMaxPayload { } {\r
+  global vcp_reply vcp_pending vcp_debug fh
+
+  SendCmd "FF490400"
+  while { $vcp_pending == 1 } { update }
+  if { $vcp_debug == 1  } { puts $fh "BM_WBSL_GetMaxPayload = [lindex $vcp_reply 3]" }\r
+  return [lindex $vcp_reply 3]\r
+}
+
+# BM_WBSL_GetPacketStatus\r
+proc BM_WBSL_GetPacketStatus { } {\r
+  global vcp_reply vcp_pending vcp_debug fh
+
+  SendCmd "FF480400"
+  while { $vcp_pending == 1 } { update }\r
+  if { $vcp_debug == 1  } { puts $fh "BM_WBSL_GetPacketStatus = [lindex $vcp_reply 3]" }
+  return [lindex $vcp_reply 3]\r
+}
+
+# BM_WBSL_GetStatus\r
+proc BM_WBSL_GetStatus { } {\r
+  global vcp_reply vcp_pending vcp_debug fh\r
+  
+  SendCmd "FF410400"\r
+  while { $vcp_pending == 1 } { update }\r
+  if { $vcp_debug == 1  } { puts $fh "BM_WBSL_GetStatus = [lindex $vcp_reply 3]" }
+  return [lindex $vcp_reply 3]\r
+}\r
+
+# BM_WBSL_SendData\r
+proc BM_WBSL_SendData { data_or_info data } {\r
+  global vcp_reply vcp_pending vcp_debug fh
+
+  if { $data_or_info == 0 } {
+
+    set byte0 "00"
+    set byte1 [format %02X [expr $data&0xFF]]
+    set byte2 [format %02X [expr $data>>8]]
+
+    set str "FF4706$byte0$byte1$byte2"\r
+    SendCmd $str
+    return 3
+
+  } else {
+
+    # Send several packets until data has been transmitted
+    if { $data_or_info == 1 } {  
+      set byte0 "01" 
+    } else {
+      set byte0 "02" 
+    }
+
+    # Convert ASCII data string to hex values
+    set len 0
+    set data_to_send ""
+    binary scan $data cu* valueList\r
+    foreach value $valueList {\r
+      append data_to_send [format "%02X" $value]
+      incr len\r
+    }
+
+    set len1  [expr $len + 2]
+    set byte1 [format %02X [expr $len&0xFF]]
+    set data_to_send "$byte0$byte1$data_to_send"
+    
+    if { $vcp_debug == 1  } { puts $fh "\nBM_WBSL_SendData $data_to_send\n" }
+
+    while { $len1 > 28 } {
+      # Send 28 bytes 
+      SendCmd "FF471F[string range $data_to_send 0 55]"
+      # Cut away data that has been sent
+      set data_to_send [string range $data_to_send 56 [string length $data_to_send]]
+      set len1 [expr $len1-28]
+      update
+    }
+
+    # Send last bytes 
+    set len1 [expr [string length $data_to_send]/2 + 3]
+    SendCmd "FF47[format %02X $len1]$data_to_send"
+    update
+    return $len1
+  } \r
+}
+
+
diff --git a/chronos-ti/Control Center/Chronos Control Center/iTunes Control.ini b/chronos-ti/Control Center/Chronos Control Center/iTunes Control.ini
new file mode 100755 (executable)
index 0000000..1bdfe83
--- /dev/null
@@ -0,0 +1,16 @@
+pd_m1=Arrow-Right\r
+pd_m2=Space\r
+pd_s1=Arrow-Left\r
+cb_m1_windows=0\r
+cb_m1_alt=1\r
+cb_m1_ctrl=1\r
+cb_m1_shift=1\r
+cb_s1_windows=0\r
+cb_s1_alt=1\r
+cb_s1_ctrl=1\r
+cb_s1_shift=1\r
+cb_m2_windows=0\r
+cb_m2_alt=0\r
+cb_m2_ctrl=0\r
+cb_m2_shift=0\r
+sync_use_metric_units=1\r
diff --git a/chronos-ti/Control Center/Chronos Control Center/ram_based_updater.txt b/chronos-ti/Control Center/Chronos Control Center/ram_based_updater.txt
new file mode 100755 (executable)
index 0000000..0e610cb
--- /dev/null
@@ -0,0 +1,180 @@
+@1D30\r
+31 40 FE 2B 3C 40 88 29 3D 40 1C 01 B0 13 78 27\r
+3C 40 52 29 3D 40 84 1E 3E 40 36 00 B0 13 18 28\r
+B0 13 48 26 B0 13 20 28 20 20 00 20 20 20 20 20\r
+20 00 30 30 00 F5 60 B6 F2 63 D3 D7 70 F7 F3 00\r
+00 00 00 00 86 00 77 C7 95 E6 97 17 F3 67 05 F0\r
+87 85 75 46 C6 37 F5 06 D3 87 C4 C4 02 67 E3 B6\r
+10 08 08 08 F7 F7 F7 F7 20 40 04 80 7F 7F 7F 7F\r
+7F 10 01 80 30 30 30 31 30 32 30 33 30 34 30 35\r
+30 36 30 37 30 38 30 39 31 30 31 31 31 32 31 33\r
+31 34 31 35 31 36 31 37 31 38 31 39 32 30 32 31\r
+32 32 32 33 32 34 32 35 32 36 32 37 32 38 32 39\r
+33 30 33 31 33 32 33 33 33 34 33 35 33 36 33 37\r
+33 38 33 39 34 30 34 31 34 32 34 33 34 34 34 35\r
+34 36 34 37 34 38 34 39 35 30 35 31 35 32 35 33\r
+35 34 35 35 35 36 35 37 35 38 35 39 36 30 36 31\r
+36 32 36 33 36 34 36 35 36 36 36 37 36 38 36 39\r
+37 30 37 31 37 32 37 33 37 34 37 35 37 36 37 37\r
+37 38 37 39 38 30 38 31 38 32 38 33 38 34 38 35\r
+38 36 38 37 38 38 38 39 39 30 39 31 39 32 39 33\r
+39 34 39 35 39 36 39 37 39 38 39 39 20 20 00 20\r
+20 44 4F 4E 45 00 20 20 46 41 49 4C 00 20 52 46\r
+42 53 4C 00 24 0A 24 0A 25 0A 26 0A 21 0A 22 0A\r
+23 0A 25 0A 20 0A 20 0A 24 0A 2B 0A 2B 0A 2A 0A\r
+29 0A 28 0A 27 0A 20 0A 24 0A 28 0A 07 00 AD 00\r
+BA 5E BA 11 05 00 AD 00 00 00 1B 15 7A 40 03 00\r
+4B 4A C2 93 A3 2A 76 20 B0 13 94 26 82 43 34 0F\r
+B0 13 18 27 B0 13 D4 27 6D 43 5C 43 B0 13 CE 26\r
+6D 43 6C 43 B0 13 CE 26 6D 43 B0 13 FC 27 5D 43\r
+B0 13 12 28 D2 43 88 29 D2 43 9D 2A B0 13 BE 24\r
+5C 93 3D 20 E2 43 9D 2A 4D 4A 5C 43 B0 13 CE 26\r
+4D 4A 6C 43 B0 13 CE 26 4D 4A 4C 4A B0 13 CE 26\r
+B0 13 CC 1F 92 92 94 2A 96 2A 03 28 C2 93 A3 2A\r
+26 20 B0 13 B2 20 5C 93 17 20 F2 90 64 00 A0 2A\r
+0A 2C 4F 43 6E 43 5C 42 A0 2A 0D 43 B0 13 76 24\r
+0D 4C 5C 43 07 3C B0 13 F2 27 B0 13 10 28 3D 40\r
+6F 1E 6C 43 B0 13 32 25 F2 90 20 00 9D 2A 07 24\r
+92 92 94 2A 96 2A D6 2B C2 93 A3 2A DA 27 6D 42\r
+5C 43 B0 13 CE 26 6D 42 6C 43 B0 13 CE 26 6D 42\r
+B0 13 FC 27 B0 13 10 28 C2 43 88 29 92 92 94 2A\r
+96 2A 0A 28 C2 93 A3 2A 07 24 B2 40 04 A5 20 01\r
+7B 53 87 23 1A 17 10 01 4B 93 FA 23 B0 13 F2 27\r
+3D 40 76 1E 6C 43 B0 13 32 25 F4 3F B0 13 A0 20\r
+B2 40 00 A5 44 01 B0 13 A0 20 B2 40 06 A5 40 01\r
+C2 43 E0 FF B0 13 A0 20 B2 40 10 A5 44 01 10 01\r
+3B 15 82 93 38 0F B2 C0 00 02 32 0F E2 93 9E 2A\r
+32 20 3E 40 02 01 0D 43 3C 40 90 29 B0 13 54 27\r
+7A 40 3B 00 B0 13 78 20 4C 93 25 24 7C 40 3F 00\r
+B0 13 F2 25 C2 4C 90 29 39 40 91 29 6C 53 C2 4C\r
+9C 2A 7B 90 41 00 05 28 B0 13 02 27 B0 13 8A 27\r
+12 3C E2 93 9C 2A 0B 28 B0 13 78 20 6B 93 F9 2B\r
+B0 13 6A 20 19 53 F2 53 9C 2A 7B 53 F7 3F B0 13\r
+6A 20 D2 43 9F 2A 38 17 10 01 7C 40 3F 00 B0 13\r
+F2 25 C9 4C 00 00 10 01 4C 4A B0 13 F2 25 4B 4C\r
+48 4B 4C 4A B0 13 F2 25 4B 4C 48 9C F9 23 10 01\r
+B0 13 A0 20 8C 4D 00 00 B0 13 A0 20 5C 43 10 01\r
+92 B3 44 01 FD 2F 10 01 B0 13 A0 20 CC 4D 00 00\r
+F3 3F 1B 15 4A 43 D2 53 A2 2A F2 90 05 00 A2 2A\r
+05 28 F2 40 20 00 9D 2A 4C 43 5F 3C B0 13 98 25\r
+3B 40 96 2A D2 93 9F 2A 07 24 C2 93 A3 2A 04 24\r
+2D 4B 3D 53 5C 43 4E 3C D2 93 9F 2A 4D 20 C2 43\r
+9F 2A 5F 42 90 29 5F 4F 92 29 7F F0 80 00 D2 92\r
+A1 2A 92 29 41 20 5E 42 93 29 C2 93 A3 2A 14 20\r
+4F 93 10 24 C2 43 A2 2A 5F 42 94 29 47 18 0F 5F\r
+0E 5F 82 4E 94 2A 3D 43 5C 43 B0 13 FC 24 D2 43\r
+A3 2A 2A 3C 3D 43 25 3C 4F 93 22 24 5F 42 94 29\r
+47 18 0E 5E 0F 5E 2F 9B CB 23 B0 13 9A 22 5C 93\r
+17 20 C2 43 A2 2A 2D 4B 5C 43 B0 13 FC 24 92 53\r
+96 2A 2C 4B 5C 06 0F 4C 5C 0A 0F 5C 0C 5C 0C 5F\r
+1E 42 94 2A B0 13 B6 26 C2 4C A0 2A 5A 43 04 3C\r
+2D 4B 4C 43 B0 13 FC 24 4C 4A 1A 17 10 01 1B 15\r
+0B 4C 4A 4D B0 13 02 27 4E 4A 0D 4B 7C 40 7F 00\r
+B0 13 68 25 6A 42 07 3C 3C 40 0F 00 B0 13 E8 26\r
+B0 13 E8 27 7A 53 7C 40 34 00 B0 13 14 22 A2 B3\r
+30 0F FD 2B 92 C3 32 0F 7C 40 35 00 B0 13 14 22\r
+3C 40 19 00 B0 13 E8 26 B0 13 E8 27 92 B3 32 0F\r
+0A 28 92 C3 32 0F 92 B3 30 0F FD 2B 7C 40 3B 00\r
+B0 13 14 22 0D 3C 7C 40 36 00 B0 13 14 22 7C B0\r
+70 00 F9 23 7C 40 3A 00 B0 13 14 22 4A 93 CC 23\r
+1A 17 10 01 3B 15 4B 4C 4C 43 7B 90 BD 00 06 24\r
+7B 90 31 00 38 28 7B 90 3D 00 35 2C 08 42 32 C2\r
+03 43 B2 C0 40 00 02 0F B0 13 06 28 7B 90 31 00\r
+25 28 7B 90 3D 00 22 2C B0 13 F2 25 4A 4C 7D 40\r
+29 00 4C 43 B0 13 72 26 C2 4B 11 0F A2 B2 30 0F\r
+10 28 7B 90 32 00 0D 24 7B 90 39 00 0A 24 7B 90\r
+38 00 07 24 A2 B2 30 0F FD 2F 3F 40 C1 0C 3F 53\r
+FE 2F 4D 4A 4C 43 B0 13 72 26 02 3C C2 4B 11 0F\r
+5C 42 21 0F 02 48 38 17 10 01 2A 15 5C 43 5A 42\r
+90 29 3A 50 FB FF 7D 40 06 00 D2 93 95 29 0B 20\r
+5E 42 96 29 47 18 0E 5E 5F 42 97 29 0E 5F 82 4E\r
+92 2A 2A 83 7D 42 B0 13 BA 27 0A 93 1A 24 1C 42\r
+92 2A 3C 90 00 80 09 28 08 4C 09 43 08 5A 09 63\r
+19 93 05 28 02 20 18 93 02 28 4C 43 0A 3C 4E 4D\r
+3E 50 90 29 4D 4A B0 13 76 23 5C 93 02 20 82 5A\r
+92 2A B2 40 00 A5 40 01 B2 40 10 A5 44 01 28 17\r
+10 01 0A 12 6C 92 2D 28 7C 90 14 00 2A 2C 7D 90\r
+30 00 07 28 7D 90 5B 00 09 2C 4D 4D 5A 4D 35 1D\r
+06 3C 7D 90 2D 00 02 20 6A 43 01 3C 4A 43 7C 90\r
+0B 00 11 28 4F 4A 43 19 4F 10 43 18 4A 5A 4A DF\r
+7C 90 0B 00 08 20 7D 90 31 00 03 24 7D 90 4C 00\r
+02 20 7A 40 80 00 4C 4C 4F 4E 5E 4C 90 1D B0 13\r
+C8 27 3A 41 10 01 5B 15 08 4C 09 4E 5C 43 0A 48\r
+0B 43 0E 48 0F 43 46 4D 0A 56 0B 63 02 3C 1E 53\r
+0F 63 0F 9B 03 28 18 20 0E 9A 16 2C 0C 4E 58 B3\r
+08 20 06 4A 07 4B 36 53 37 63 0E 96 06 20 0F 97\r
+04 20 7D 49 B0 13 A8 20 05 3C 3D 49 B0 13 90 20\r
+1E 53 0F 63 5C 93 E3 27 56 17 10 01 F2 D0 03 00\r
+4A 02 B2 F0 3E FF 6C 01 B2 D0 0C 00 6C 01 82 43\r
+66 01 B2 40 44 00 68 01 32 D0 40 00 82 43 60 01\r
+B2 40 50 00 62 01 B2 40 6E 11 64 01 32 C0 40 00\r
+3F 40 22 F4 03 43 0E 43 3F 53 3E 63 FD 2F B2 F0\r
+F0 FF 6E 01 A2 C3 02 01 A2 B3 02 01 F8 2F 80 00\r
+1E 26 7E E3 5F 93 05 20 6E FC 4E DD CC 4E 00 00\r
+10 01 4F 93 03 20 CC FE 00 00 10 01 6F 93 09 20\r
+CC FE 00 00 CC FE 20 00 CC DD 00 00 CC DD 20 00\r
+10 01 7F 90 03 00 08 20 4F 4E 6F FC 4F DD CC 4F\r
+00 00 CC FE 20 00 10 01 6F 92 04 20 CC FE 00 00\r
+CC FE 20 00 10 01 3B 15 0A 4C 0B 4D 48 4E 39 40\r
+98 2A 2E 43 3D 40 62 1D 0C 49 B0 13 66 27 48 93\r
+13 24 78 90 03 00 10 2C 0B 93 0E 20 3A 90 64 00\r
+0B 2C 4E 48 4D 48 3D E3 1D 53 0A 5A 0D 5A 3D 50\r
+A6 1D 0C 49 B0 13 66 27 0C 49 38 17 10 01 0A 12\r
+4A 43 7D 42 3C 40 7A 29 B0 13 8E 21 B0 13 98 25\r
+D2 93 9F 2A 10 20 C2 43 9F 2A D2 93 93 29 05 20\r
+5F 42 90 29 CF 93 92 29 02 38 4C 43 05 3C D2 42\r
+92 29 A1 2A 5A 43 4C 4A 3A 41 10 01 4E 4C 3C 40\r
+09 00 B0 13 E8 26 B0 13 E8 27 D2 42 A1 2A 83 29\r
+C2 4E 85 29 0F 4D 47 19 0F 10 7F F0 7F 00 C2 4F\r
+86 29 C2 4D 87 29 7D 40 06 00 3C 40 82 29 80 00\r
+8E 21 3B 15 0A 4D 6C 93 05 20 7B 40 0B 00 78 40\r
+06 00 03 3C 7B 40 06 00 68 43 49 43 09 3C 5E 43\r
+0F 4A 0F 59 6D 4F 4C 4B 4C 59 B0 13 12 23 59 53\r
+49 98 F5 2B 38 17 10 01 0A 12 0A 42 B0 13 40 27\r
+6F 4D 0C 5F 82 4C 10 0F 5F 43 07 3C B0 13 DE 27\r
+0C 4D 0C 5F E2 4C 10 0F 5F 53 4F 9E F7 2B C2 93\r
+20 0F 02 4A 3A 41 10 01 B0 13 8A 27 3C 40 00 40\r
+B0 13 E8 26 06 3C B2 B0 00 02 32 0F 02 28 B0 13\r
+F0 1F 92 B3 44 03 03 2C D2 93 9F 2A F4 23 B0 13\r
+9A 27 80 00 02 27 21 83 82 43 32 0F 7C 40 30 00\r
+B0 13 14 22 81 43 00 00 02 3C 91 53 00 00 B1 90\r
+64 00 00 00 FA 2B B0 13 AA 27 82 43 06 0F 21 53\r
+10 01 0F 42 32 C2 03 43 B0 13 06 28 7C 90 2F 00\r
+03 28 7C 90 3E 00 03 20 7C D0 80 00 02 3C 7C D0\r
+C0 00 C2 4C 13 0F 5C 42 20 0F 02 4F 10 01 B2 D0\r
+06 00 06 0A B2 40 1D 7B 00 0A B2 40 ED 00 04 0A\r
+F2 D0 E0 00 4A 02 F2 D0 E0 00 44 02 B2 43 0A 0A\r
+B2 40 FF 00 0C 0A 10 01 B2 40 80 5A 5C 01 32 C2\r
+03 43 B0 13 CC 23 B0 13 D4 27 3C 40 33 73 B0 13\r
+E8 26 B0 13 E8 27 B0 13 BA 1E B2 40 04 A5 20 01\r
+F4 3F 21 83 0E 42 B0 13 40 27 4D 4D 0C 5D 82 4C\r
+10 0F B0 13 DE 27 5F 42 20 0F 81 4F 00 00 02 4E\r
+21 53 10 01 C2 43 88 29 C2 43 A0 2A 82 43 96 2A\r
+82 43 94 2A C2 43 A2 2A C2 43 A3 2A 82 43 32 0F\r
+10 01 7C F3 7E F3 0F 4E 0D 4C 0E 43 1C 43 0D 5D\r
+0E 6E 0E 9F 01 28 0E 8F 0C 6C F9 2B 10 01 0A 12\r
+7C 90 14 00 07 2C 4C 4C 5A 4C 90 1D 4F 4D 4E 4A\r
+B0 13 C8 27 3A 41 10 01 3C 90 00 80 02 28 3C 40\r
+FF 7F 82 4C 54 03 92 C3 44 03 B2 D0 24 01 40 03\r
+10 01 D2 43 9E 2A B0 13 AA 27 7C 40 3A 00 B0 13\r
+14 22 82 43 32 0F 10 01 3D 40 58 1D 5C 43 B0 13\r
+32 25 3D 40 5B 1D 6C 43 80 00 32 25 0A 12 21 83\r
+0A 4C 81 4A 00 00 0D 41 5C 43 B0 13 24 28 F9 3F\r
+32 C2 03 43 B0 13 06 28 4C 4C 3C D0 40 00 47 18\r
+0C 5C 10 01 0F 4C 04 3C CF 4D 00 00 1F 53 3E 53\r
+0E 93 FA 23 10 01 0F 4C 04 3C FF 4D 00 00 1F 53\r
+3E 53 0E 93 FA 23 10 01 0F 4C 0F 5D 03 3C CC 43\r
+00 00 1C 53 0C 9F FB 23 10 01 82 43 32 0F E2 43\r
+9E 2A 7C 40 34 00 80 00 14 22 92 C3 44 03 B2 F0\r
+CF FF 40 03 82 43 50 03 10 01 7C 40 36 00 B0 13\r
+14 22 7C B0 70 00 F9 23 10 01 B2 40 00 A5 44 01\r
+B2 40 40 A5 40 01 10 01 4D 4A 0C 5C 1C 4C 52 29\r
+80 00 22 24 3D 40 7D 1E 6C 43 80 00 32 25 B2 B0\r
+20 00 02 0F FC 2B 10 01 92 B3 44 03 FD 2B 80 00\r
+9A 27 3D 40 6C 1E 5C 43 80 00 32 25 4C 4A B0 13\r
+CE 26 80 00 C6 25 B2 B0 10 00 02 0F FC 2B 10 01\r
+4D 43 4C 43 80 00 CE 26 80 00 66 27 80 00 2C 27\r
+80 00 1C 28 10 01 \r
+@FFFE\r
+30 1D \r
+q\r
diff --git a/chronos-ti/Control Center/Chronos Data Logger/eZ430-Chronos Datalogger 1_2.tcl b/chronos-ti/Control Center/Chronos Data Logger/eZ430-Chronos Datalogger 1_2.tcl
new file mode 100755 (executable)
index 0000000..bc308fb
--- /dev/null
@@ -0,0 +1,1915 @@
+#!/usr/bin/tclsh8.5
+\r
+# *************************************************************************************************\r
+#\r
+#      Copyright (C) 2010 Texas Instruments Incorporated - http://www.ti.com/ \r
+#       \r
+#       \r
+#        Redistribution and use in source and binary forms, with or without \r
+#        modification, are permitted provided that the following conditions \r
+#        are met:\r
+#      \r
+#          Redistributions of source code must retain the above copyright \r
+#          notice, this list of conditions and the following disclaimer.\r
+#       \r
+#          Redistributions in binary form must reproduce the above copyright\r
+#          notice, this list of conditions and the following disclaimer in the \r
+#          documentation and/or other materials provided with the   \r
+#          distribution.\r
+#       \r
+#          Neither the name of Texas Instruments Incorporated nor the names of\r
+#          its contributors may be used to endorse or promote products derived\r
+#          from this software without specific prior written permission.\r
+#      \r
+#        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \r
+#        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT \r
+#        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+#        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT \r
+#        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, \r
+#        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT \r
+#        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+#        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+#        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT \r
+#        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE \r
+#        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+#\r
+# *************************************************************************************************\r
+# ez430-Chronos Datalogger Application TCL/Tk script\r
+# *************************************************************************************************\r
+#\r
+# Rev 1.2\r
+# - Use of combobox\r
+# - Bug fix windows 7\r
+# - Removed obsolete variables\r
+# - checks for leap years\r
+#\r
+# Rev 1.1  \r
+# - extended 12H / 24H format switch function\r
+# - added "RF BSL" pane and related functions \r
+#\r
+# Rev 1.0\r
+# - initial version released to manufacturing\r
+# *************************************************************************************************\r
+\r
+\r
+# ----------------------------------------------------------------------------------------\r
+# Load TCL packages and C library --------------------------------------------------------\r
+set exit_prog 0\r
+# load libraries -----------------------------------------------------\r
+package require Tk\r
+\r
+# Set COM port where RF Access Point is mounted\r
+set com "/dev/ttyACM0"\r
+\r
+# Include BlueRobin BM-USBD1 driver\r
+# Adds global variable "vcp"\r
+source "eZ430-Chronos_driver.tcl"\r
+\r
+# Open COM port\r
+if { [BM_OpenCOM $com 115200 30 0 0] == 0 } {\r
+  tk_dialog .dialog1 "Error" "Could not detect USB dongle. Press OK to close application." info 0 OK\r
+\r
+  set com_available 0\r
+  exit 0\r
+} else  {\r
+  set com_available 1\r
+  # Reset hardware\r
+  BM_Reset\r
+  after 20\r
+  # Flush channel\r
+  for {set i 0} {$i < 10} {incr i} {  \r
+    BM_GetStatus\r
+    after 10\r
+  }\r
+}\r
+\r
+\r
+# ----------------------------------------------------------------------------------------\r
+# Global variables -----------------------------------------------------------------------\r
+\r
+# Script revision number\r
+set revision                1.2\r
+\r
+# Ini file for variables\r
+set ini_file                "ez430-Chronos-DL.ini"   \r
+
+# SimpliciTi variables\r
+set simpliciti_on           0\r
+set simpliciti_ap_started   0\r
+\r
+# Initial settings for Sync\r
+set sync_time_is_am         1\r
+set sync_time_hours_24      4\r
+set sync_time_hours_12      4\r
+set sync_time_minutes       30\r
+set sync_time_seconds       0\r
+set sync_date_year          2010\r
+set sync_date_month         9\r
+set sync_date_day           1\r
+set sync_altitude_24        500\r
+set sync_altitude_12        1640\r
+set sync_temperature_24     22\r
+set sync_temperature_12     72\r
+set sync_file               "ez430_data.log"\r
+set sync_data_log_mode      0\r
+set sync_data_log_interval  1\r
+set sync_data_log_bytes     0\r
+set sync_data_log_mode_hr   1
+set sync_data_log_mode_temp 0
+set sync_data_log_mode_alt  0\r
+set sync_data_log_mode_acc  0\r
+set packets_max             [expr 8192/16]\r
+set packets_expected        0\r
+set sync_use_metric_units   1\r
+\r
+for { set i 0 } { $i < $packets_max } {incr i } {\r
+  set packet($i) "m"\r
+}\r
+for { set i 0 } { $i < 8192 } {incr i } {\r
+  set hex_arr($i) 0\r
+}\r
+\r
+set i -10\r
+while {$i < 41} {\r
+       lappend value_temperature_C $i\r
+       incr i\r
+       }\r
+set i 14\r
+while {$i < 105} {\r
+       lappend value_temperature_F $i\r
+       incr i\r
+}\r
+set i 0\r
+while {$i < 60} {\r
+       lappend values_60 $i\r
+       incr i\r
+}\r
+set i 1\r
+while {$i < 32} {\r
+       lappend values_31 $i\r
+       incr i\r
+}\r
+set i 1\r
+while {$i < 31} {\r
+       lappend values_30 $i\r
+       incr i\r
+}\r
+\r
+set i 1\r
+while {$i < 30} {\r
+       lappend values_29 $i\r
+       incr i\r
+}\r
+\r
+set i 1\r
+while {$i < 29} {\r
+       lappend values_28 $i\r
+       incr i\r
+}\r
+\r
+set i 0\r
+while {$i < 24} {\r
+       lappend values_24 $i\r
+       incr i\r
+}\r
+set i 1\r
+while {$i < 13} {\r
+       lappend values_12 $i\r
+       incr i\r
+}\r
+set i 2010\r
+while {$i < 2016} { \r
+       lappend values_years $i\r
+       incr i\r
+}\r
+set i -100\r
+while {$i < 2001} { \r
+       lappend values_altitude_meters $i\r
+       incr i\r
+}\r
+set i -328\r
+while {$i < 6563} { \r
+       lappend values_altitude_feet $i\r
+       incr i\r
+}\r
+\r
+# WBSL global variables\r
+set select_input_file       ""\r
+set call_wbsl_timer         0
+set call_wbsl_1             2
+set call_wbsl_2             3
+set wbsl_progress           0\r
+set wbsl_on                 0\r
+set wbsl_ap_started         0\r
+set fsize                   0\r
+set fp                      0\r
+set rData                   [list]\r
+set rData_index             0\r
+set low_index               0\r
+set list_count              0\r
+set wbsl_opcode             0\r
+set maxPayload              0\r
+set ram_updater_downloaded  0\r
+set wirelessUpdateStarted   0\r
+set wbsl_timer_enabled      0\r
+set wbsl_timer_counter      0\r
+set wbsl_timer_flag         0\r
+set wbsl_timer_timeout      0\r
+\r
+# Function required by WBSL\r
+proc ceil x  {expr {ceil($x)} }\r
+\r
+# ----------------------------------------------------------------------------------------
+# Function prototypes --------------------------------------------------------------------
+proc get_wbsl_status {} {}
+proc wbsl_set_timer { timeout } {}
+proc wbsl_reset_timer {} {}
+\r
+# ----------------------------------------------------------------------------------------\r
+# Graphical user interface setup ---------------------------------------------------------\r
+\r
+# Some custom styles for graphical elements\r
+ttk::setTheme clam\r
+ttk::style configure custom.TCheckbutton -font "Helvetica 10"\r
+ttk::style configure custom.TLabelframe -font "Helvetica 12 bold"\r
+ttk::style configure custom.TRadiobutton -font "Helvetica 9"\r
+\r
+# Define basic window geometry\r
+wm title . "Texas Instruments eZ430-Chronos Datalogger $revision"\r
+wm geometry . 640x510\r
+wm resizable . 0 0\r
+wm iconname . "ttknote"\r
+ttk::frame .f\r
+pack .f -fill both -expand 1\r
+set w .f\r
+\r
+# Map keys to internal functions\r
+bind . <Key-q> { exitpgm }\r
+\r
+## Make the notebook and set up Ctrl+Tab traversal\r
+ttk::notebook $w.note\r
+pack $w.note -fill both -expand 1 -padx 2 -pady 3\r
+ttk::notebook::enableTraversal $w.note\r
+\r
+\r
+# ----------------------------------------------------------------------------------------\r
+# Sync pane ------------------------------------------------------------------------------\r
+ttk::frame $w.note.sync -style custom.TFrame \r
+$w.note add $w.note.sync -text "SimpliciTI\u2122 Datalogger" -underline 0 -padding 2 \r
+grid columnconfigure $w.note.sync {0 1} -weight 1 -uniform 1\r
+\r
+# Buttons\r
+ttk::labelframe $w.note.sync.f0 -borderwidth 0\r
+ttk::button $w.note.sync.f0.btn_start_ap -text "Start Access Point" -command { start_simpliciti_ap } -width 14\r
+ttk::button $w.note.sync.f0.btn_get_watch_settings -text "Read Watch" -command { sync_read_watch }  -width 11\r
+ttk::button $w.note.sync.f0.btn_get_time_and_date -text "Copy System Time" -command { sync_get_time_and_date }  -width 14\r
+ttk::button $w.note.sync.f0.btn_set_watch -text "Set Watch" -command { sync_write_watch }  -width 8\r
+ttk::button $w.note.sync.f0.btn_erase_mem -text "Erase Memory" -command { sync_erase }  -width 11\r
+grid $w.note.sync.f0 -row 0 -column 0 -pady 5 -padx 8 -sticky ew -columnspan 2\r
+pack $w.note.sync.f0.btn_start_ap -side left -fill x  -padx 8\r
+pack $w.note.sync.f0.btn_erase_mem -side right -fill x  -padx 8\r
+pack $w.note.sync.f0.btn_set_watch -side right -fill x  -padx 8\r
+pack $w.note.sync.f0.btn_get_time_and_date -side right -fill x  -padx 8\r
+pack $w.note.sync.f0.btn_get_watch_settings -side right -fill x  -padx 8\r
+\r
+# Download data\r
+ttk::labelframe $w.note.sync.fdl -borderwidth 0\r
+ttk::button $w.note.sync.fdl.btn1 -text "Download" -command { sync_download } -width 16\r
+ttk::label $w.note.sync.fdl.lbl -text "Save data to:" -anchor e -font "Helvetica 9"\r
+entry $w.note.sync.fdl.entry -textvariable sync_file -width 30\r
+ttk::button $w.note.sync.fdl.btn2 -text "Browse" -command "fileDialog $w $w.note.sync.fdl.entry save" -width 10\r
+grid $w.note.sync.fdl -row 1 -column 0 -pady 5 -padx 8 -sticky ew -columnspan 2\r
+pack $w.note.sync.fdl.btn1 -side left -fill x -padx 8\r
+pack $w.note.sync.fdl.lbl -side left -fill x -padx 8\r
+pack $w.note.sync.fdl.entry -side left -fill x -padx 8\r
+pack $w.note.sync.fdl.btn2 -side left -fill x -padx 8\r
+\r
+# Time\r
+ttk::labelframe $w.note.sync.f1 -borderwidth 0\r
+ttk::label $w.note.sync.f1.l1 -text "Time " -width 20 -font "Helvetica 10 bold"\r
+ttk::combobox $w.note.sync.f1.sb1 -values $values_24 -textvariable sync_time_hours_24 -justify right -width 2 -postcommand {check_time }\r
+ttk::combobox $w.note.sync.f1.sb2 -values $values_60 -textvariable sync_time_minutes -justify right -width 2 -postcommand check_time\r
+ttk::combobox $w.note.sync.f1.sb3 -values $values_60 -textvariable sync_time_seconds -justify right -width 2 -postcommand check_time\r
+grid $w.note.sync.f1 -row 2 -column 0 -columnspan 1 -pady 0 -padx 10 -sticky ew\r
+pack $w.note.sync.f1.l1  -side left -fill x\r
+pack $w.note.sync.f1.sb1 -side left -fill x -padx 5\r
+pack $w.note.sync.f1.sb2 -side left -fill x -padx 5\r
+pack $w.note.sync.f1.sb3 -side left -fill x -padx 5\r
+\r
+# Time format AM/PM\r
+ttk::labelframe $w.note.sync.ampm -borderwidth 0\r
+ttk::radiobutton $w.note.sync.ampm.rb1 -text "AM" -variable sync_time_is_am -value 1 -style custom.TRadiobutton -state disabled -command { update_time_12 }\r
+ttk::radiobutton $w.note.sync.ampm.rb2 -text "PM" -variable sync_time_is_am -value 0 -style custom.TRadiobutton -state disabled -command { update_time_12 }\r
+grid $w.note.sync.ampm -row 2 -column 1 -columnspan 2 -pady 0 -padx 10 -sticky ew\r
+pack $w.note.sync.ampm.rb1 -side left -fill x -padx 5\r
+pack $w.note.sync.ampm.rb2 -side left -fill x -padx 5\r
+\r
+# Date\r
+ttk::labelframe $w.note.sync.f2 -borderwidth 0\r
+ttk::label $w.note.sync.f2.l1 -text "Date (dd.mm.yyyy)" -width 20 -font "Helvetica 10 bold"\r
+ttk::combobox $w.note.sync.f2.sb1 -values $values_30   -textvariable sync_date_day   -justify right -width 2 -postcommand {check_date }\r
+ttk::combobox $w.note.sync.f2.sb2 -values $values_12   -textvariable sync_date_month -justify right -width 2 -postcommand {check_date }\r
+ttk::combobox $w.note.sync.f2.sb3 -values $values_years -textvariable sync_date_year  -justify right -width 4 -postcommand {check_date }\r
+grid $w.note.sync.f2 -row 3 -column 0 -columnspan 3 -pady 0 -padx 10 -sticky ew\r
+pack $w.note.sync.f2.l1  -side left -fill x\r
+pack $w.note.sync.f2.sb1 -side left -fill x -padx 5\r
+pack $w.note.sync.f2.sb2 -side left -fill x -padx 5\r
+pack $w.note.sync.f2.sb3 -side left -fill x -padx 5\r
+\r
+# Time / Date format\r
+ttk::labelframe $w.note.sync.f1r -borderwidth 0\r
+ttk::radiobutton $w.note.sync.f1r.rb1 -text "Metric units" -variable sync_use_metric_units -value 1 -style custom.TRadiobutton -command { switch_to_metric_units }\r
+ttk::radiobutton $w.note.sync.f1r.rb2 -text "Imperial units" -variable sync_use_metric_units -value 0 -style custom.TRadiobutton -command { switch_to_imperial_units }\r
+grid $w.note.sync.f1r -row 3 -column 1 -columnspan 2 -pady 0 -padx 10 -sticky ew\r
+pack $w.note.sync.f1r.rb1 -side left -fill x -padx 5\r
+pack $w.note.sync.f1r.rb2 -side left -fill x -padx 5\r
+\r
+# Temperature\r
+ttk::labelframe $w.note.sync.f4 -borderwidth 0\r
+ttk::label $w.note.sync.f4.l1 -text "Temperature (\u00B0C)" -width 18 -font "Helvetica 10 bold"\r
+ttk::combobox $w.note.sync.f4.sb1 -values $value_temperature_C -textvariable sync_temperature_24 -justify right -width 4 -postcommand {check_temperature}\r
+grid $w.note.sync.f4 -row 4 -column 0 -columnspan 1 -pady 0 -padx 10 -sticky ew\r
+pack $w.note.sync.f4.l1  -side left -fill x\r
+pack $w.note.sync.f4.sb1 -side left -fill x -padx 20\r
+\r
+# Altitude\r
+ttk::labelframe $w.note.sync.f5 -borderwidth 0\r
+ttk::label $w.note.sync.f5.l1 -text "Altitude (m)" -width 18 -font "Helvetica 10 bold"\r
+ttk::combobox $w.note.sync.f5.sb1 -values $values_altitude_meters -textvariable sync_altitude_24 -justify right -width 4  -postcommand {check_altitude}\r
+grid $w.note.sync.f5 -row 5 -column 0 -columnspan 1 -pady 0 -padx 10 -sticky ew\r
+pack $w.note.sync.f5.l1  -side left -fill x\r
+pack $w.note.sync.f5.sb1 -side left -fill x -padx 20\r
+\r
+# Data log mode\r
+ttk::labelframe $w.note.sync.f6 -borderwidth 0\r
+ttk::label $w.note.sync.f6.l1 -text "Data log mode" -width 20 -font "Helvetica 10 bold"\r
+ttk::checkbutton $w.note.sync.f6.cb1 -text "Heartrate" -variable sync_data_log_mode_hr\r
+ttk::checkbutton $w.note.sync.f6.cb2 -text "Temperature" -variable sync_data_log_mode_temp\r
+ttk::checkbutton $w.note.sync.f6.cb3 -text "Altitude" -variable sync_data_log_mode_alt\r
+grid $w.note.sync.f6 -row 7 -column 0 -columnspan 2 -pady 0 -padx 10 -sticky ew\r
+pack $w.note.sync.f6.l1  -side left -fill x\r
+pack $w.note.sync.f6.cb1 -side left -fill x -padx 5\r
+pack $w.note.sync.f6.cb2 -side left -fill x -padx 5\r
+pack $w.note.sync.f6.cb3 -side left -fill x -padx 5\r
+\r
+# Data log interval\r
+ttk::labelframe $w.note.sync.f7 -borderwidth 0\r
+ttk::label $w.note.sync.f7.l1 -text "Data log interval (s)" -width 20 -font "Helvetica 10 bold"\r
+ttk::combobox $w.note.sync.f7.sb1 -values $values_30 -textvariable sync_data_log_interval -justify right -width 2 -postcommand {check_data_log_interval}\r
+grid $w.note.sync.f7 -row 8 -column 0 -columnspan 1 -pady 0 -padx 10 -sticky ew\r
+pack $w.note.sync.f7.l1  -side left -fill x\r
+pack $w.note.sync.f7.sb1 -side left -fill x -padx 5\r
+\r
+# Data log bytes\r
+ttk::labelframe $w.note.sync.f8 -borderwidth 0\r
+ttk::label $w.note.sync.f8.l1 -text "Bytes logged" -width 20 -font "Helvetica 10 bold"\r
+entry $w.note.sync.f8.sb1 -textvariable sync_data_log_bytes -justify right -width 5 -state readonly\r
+grid $w.note.sync.f8 -row 9 -column 0 -columnspan 1 -pady 0 -padx 10 -sticky ew\r
+pack $w.note.sync.f8.l1  -side left -fill x\r
+pack $w.note.sync.f8.sb1 -side left -fill x -padx 5\r
+\r
+# Status\r
+labelframe $w.note.sync.status -borderwidth 1 -background "Yellow"\r
+ttk::label $w.note.sync.status.l1 -text "Status:" -font "Helvetica 10 bold" -background "Yellow"\r
+ttk::label $w.note.sync.status.l2 -text "Access Point is off." -font "Helvetica 10" -background "Yellow"\r
+grid $w.note.sync.status -row 10 -column 0 -pady 20 -padx 10 -sticky ew -columnspan 2\r
+pack $w.note.sync.status.l1 -side left -fill x \r
+pack $w.note.sync.status.l2 -side left -fill x \r
+\r
+\r
+\r
+# ----------------------------------------------------------------------------------------\r
+# Wireless Update pane -------------------------------------------------------------------\r
+ttk::frame $w.note.wbsl -style custom.TFrame\r
+$w.note add $w.note.wbsl -text "Wireless Update" -underline 0 -padding 2 \r
+grid columnconfigure $w.note.wbsl {0 1} -weight 1 -uniform 1\r
+\r
+ttk::label $w.note.wbsl.label0 -font "Helvetica 10 bold" -width 40 -wraplength 600 -justify center -text "Only use this update function with watch firmware that allows to invoke the Wireless Update on the watch again.\n\nOlder eZ430-Chronos kits require a manual software update of the watch and access point. See Chronoswiki."\r
+grid $w.note.wbsl.label0 -row 0 -column 0 -sticky ew -columnspan 3 -pady 10 -padx 10\r
+\r
+#ttk::labelframe $w.note.wbsl.lf -borderwidth 0 \r
+ttk::label $w.note.wbsl.label1 -font "Helvetica 10" -text "Select the firmware file that you want to download to the watch:" \r
+ttk::entry $w.note.wbsl.entry0 -state readonly -textvariable select_input_file\r
+\r
+grid $w.note.wbsl.label1 -row 1 -column 0 -sticky ew -columnspan 3 -pady 10 -padx 10\r
+grid $w.note.wbsl.entry0 -row 2 -column 0 -sticky ew -columnspan 2 -padx 10\r
+\r
+ttk::button $w.note.wbsl.btnBrowse -text "Browse..." -command { open_file } -width 16\r
+grid $w.note.wbsl.btnBrowse -row 2 -column 2 -sticky ew -padx 10\r
+\r
+ttk::button $w.note.wbsl.btnDwnld -text "Update Chronos Watch" -command { start_wbsl_ap } -width 16 -default "active"\r
+grid $w.note.wbsl.btnDwnld -row 3 -column 0 -sticky ew -pady 20 -padx 8 -columnspan 3\r
+\r
+# Progress bar\r
+labelframe $w.note.wbsl.frame1p -borderwidth 0\r
+ttk::label $w.note.wbsl.frame1p.lblProgress -text "Progress " -font "Helvetica 10 bold"\r
+ttk::progressbar $w.note.wbsl.frame1p.progBar -orient horizontal -value 0 -variable wbsl_progress -mode determinate \r
+grid $w.note.wbsl.frame1p -row 4 -column 0 -sticky ew -pady 15 -padx 10 -columnspan 3\r
+pack $w.note.wbsl.frame1p.lblProgress -side left \r
+pack $w.note.wbsl.frame1p.progBar -side left -fill x -expand 1 \r
+\r
+#Dummy Labels to fill Space\r
+ttk::label $w.note.wbsl.importantNote -width 80 -wraplength 640 -justify center -text "Important: If the wireless update fails during the firmware download to flash memory, the watch display will be blank and the watch will be in sleep mode. To restart the update, press the down button." -font "Helvetica 10 bold"\r
+grid $w.note.wbsl.importantNote -row 5 -column 0 -sticky ew -columnspan 3 -pady 5 -padx 10\r
+\r
+# Frame for status display\r
+labelframe $w.note.wbsl.frame0b -borderwidth 1 -background "Yellow"\r
+ttk::label $w.note.wbsl.frame0b.lblStatus -text "Status:" -font "Helvetica 10 bold" -background "Yellow"\r
+ttk::label $w.note.wbsl.frame0b.lblStatusText -text "Access Point is off." -font "Helvetica 10" -background "Yellow"\r
+grid $w.note.wbsl.frame0b -row 6 -column 0 -pady 48 -padx 10 -sticky ew -columnspan 3\r
+pack $w.note.wbsl.frame0b.lblStatus -side left -fill x \r
+pack $w.note.wbsl.frame0b.lblStatusText -side left -fill x \r
+\r
+\r
+# -----------------------------------------------------------------------------------\r
+# About pane\r
+ttk::frame $w.note.about -style custom.TFrame \r
+$w.note add $w.note.about -text "About" -underline 0 -padding 2\r
+grid rowconfigure $w.note.about 1 -weight 1 -uniform 1 \r
+grid columnconfigure $w.note.about {0 1} -weight 1 -uniform 1\r
+\r
+ttk::labelframe $w.note.about.s -borderwidth 1 \r
+ttk::label $w.note.about.s.txt1 -font "Helvetica 12 bold" -justify "left" -width 4  -anchor center -style custom.TLabel -text "SimpliciTI\u2122"\r
+ttk::label $w.note.about.s.txt2 -font "Helvetica 10" -width 80 -wraplength 6i -justify left -anchor n -style custom.TLabel \\r
+-text "SimpliciTI\u2122 is a simple low-power RF network protocol aimed at small RF networks.\\r
+\n\nSuch networks typically contain battery operated devices which require long battery life, low data rate and low duty cycle and have a limited number of nodes talking directly to each other or through an access point or range extenders. Access point and range extenders are not required but provide extra functionality such as store and forward messages.\\r
+\n\nWith SimpliciTI\u2122 the MCU resource requirements are minimal which results in low system cost."\r
+ttk::label $w.note.about.s.txt3 -font "Helvetica 10 bold" -wraplength 6i -justify left -anchor n -style custom.TLabel -text "Learn more about SimpliciTI\u2122 at http://www.ti.com/simpliciti"\r
+grid $w.note.about.s -row 0 -column 0 -sticky new -pady 0 -columnspan 2\r
+pack $w.note.about.s.txt1 -side top -fill x -pady 5 -padx 2m\r
+pack $w.note.about.s.txt2 -side top -fill x -pady 0 -padx 2m\r
+pack $w.note.about.s.txt3 -side top -fill x -pady 5 -padx 2m\r
+\r
+ttk::labelframe $w.note.about.b -borderwidth 1 \r
+ttk::label $w.note.about.b.txt1 -font "Helvetica 12 bold italic" -foreground "Dark Blue" -justify "left" -width 4  -anchor center -text "BlueRobin\u2122" -style custom.TLabel\r
+ttk::label $w.note.about.b.txt2 -font "Helvetica 10" -wraplength 6i -justify left -anchor n -style custom.TLabel \\r
+-text "The BlueRobin\u2122 protocol provides low data rate transmission for wireless body area sensor networks and team monitoring systems. Ultra-low power consumption, high reliability and low hardware costs are key elements of BlueRobin\u2122.\\r
+\n\nBlueRobin\u2122 is successfully used in personal and multi-user heartrate monitoring systems, sports watches, chest straps, foot pods, cycle computers and other sports and fitness equipment."\r
+ttk::label $w.note.about.b.txt3 -font "Helvetica 10 bold" -wraplength 6i -justify left -anchor n -style custom.TLabel -text "Learn more about BlueRobin\u2122 at http://www.bm-innovations.com"\r
+\r
+grid $w.note.about.b -row 1 -column 0 -sticky new -pady 10 -columnspan 2\r
+pack $w.note.about.b.txt1 -side top -fill x -pady 5 -padx 2m\r
+pack $w.note.about.b.txt2 -side top -fill x -pady 0 -padx 2m\r
+pack $w.note.about.b.txt3 -side top -fill x -pady 5 -padx 2m\r
+\r
+\r
+# -----------------------------------------------------------------------------------\r
+# Help pane\r
+ttk::frame $w.note.help -style custom.TFrame \r
+$w.note add $w.note.help -text "Help" -underline 0 -padding 2\r
+grid rowconfigure $w.note.help 1 -weight 1 -uniform 1 \r
+grid columnconfigure $w.note.help {0 1} -weight 1 -uniform 1
+
+ttk::labelframe $w.note.help.frame -borderwidth 1\r
+ttk::label $w.note.help.frame.head -font "Helvetica 12 bold" -justify "right" -width 4  -anchor center -style custom.TLabel -text "Help"\r
+ttk::label $w.note.help.frame.txt1 -font "Helvetica 10" -width 80 -wraplength 500 -justify left -anchor n -style custom.TLabel \\r
+-text "If you cannot communicate with the RF access point, please check the following points:\
+\n\n1) Do you have another instance of the GUI open?\n\nIf so, please close it, since it may block the COM port.\\r
+\n\n2) Is the RF Access Point mounted (will be done automatically by Linux)?\n\nIt must appear as '/dev/ttyACM0'. You might also want to run the 'lsusb' command. The RF Access Point should be listed as 'Bus xxx Device xxx: ID 0451:16a6 Texas Instruments, Inc.'. If not, disconnect the RF Access Point from the USB port and reconnect it."\r
+pack $w.note.help.frame.head -side top -fill x -pady 10 -padx 5m\r
+pack $w.note.help.frame.txt1 -side top -fill x -pady 10 -padx 5m\r
+grid $w.note.help.frame -row 0 -column 0 -sticky ew -pady 0 -columnspan 2\r
+\r
+\r
+# ----------------------------------------------------------------------------------------\r
+# Generic SimpliciTI functions -----------------------------------------------------------\r
+\r
+# Start RF access point
+proc start_simpliciti_ap { } {
+  global w
+  global simpliciti_on com_available
+  global simpliciti_ap_started
+
+  
+
+ # No com port?  
+  if { $com_available == 0} { return }
+  
+  # SimpliciTI on?
+  if { $simpliciti_on == 1 } { return } 
+  
+  updateStatusSYNC "Starting access point."
+  after 500
+
+  # Link with SimpliciTI transmitter
+  catch { BM_SPL_Start } result
+  if { $result == 0 } {
+    updateStatusSYNC "Failed to start access point."
+    return
+  }
+  after 500
+    
+  # Set on flag after some waiting time  
+  set simpliciti_on 1
+  # Cancel out first received data
+  set simpliciti_ap_started 0
+  
+  # Reconfig buttons
+  $w.note.sync.f0.btn_start_ap configure -text "Stop Access Point" -command { stop_simpliciti_ap }
+
+  updateStatusSYNC "Access point started. Now start watch in sync mode."
+}
+\r
+# Stop RF access point
+proc stop_simpliciti_ap {} {
+  global w
+  global simpliciti_on com_available
+  global simpliciti_ap_started
+
+  # AP off?
+  if { $simpliciti_on == 0 } { return } 
+
+  # Clear on flags  
+  set simpliciti_on 0
+  
+  # Send sync exit command
+  BM_SYNC_SendCommand 7
+
+  after 750
+  
+  # Now stop SimpliciTI
+  BM_SPL_Stop
+
+  # Show that link is inactive
+  updateStatusSYNC "Access point is off."
+
+  # Clear values
+  set simpliciti_ap_started 0
+  update
+  
+  # Reconfig button
+  $w.note.sync.f0.btn_start_ap configure -text "Start Access Point" -command { start_simpliciti_ap }
+}
+
+# ----------------------------------------------------------------------------------------
+# SimpliciTI sync functions --------------------------------------------------------------\r
+# Read watch settings
+proc sync_read_watch {} {
+  global w simpliciti_on
+  global sync_use_metric_units sync_time_is_am sync_time_hours_24 sync_time_hours_12 sync_time_minutes sync_time_seconds
+  global sync_date_year sync_date_month sync_date_day
+  global sync_data_log_bytes sync_data_log_mode sync_data_log_interval
+  global sync_data_log_mode_hr sync_data_log_mode_temp sync_data_log_mode_alt sync_data_log_mode_acc
+  global sync_temperature_24 sync_altitude_24
+
+
+  # AP not enabled?
+  if { !$simpliciti_on } { return }
+   
+  # Dummy read to clean buffer
+  catch { BM_SYNC_ReadBuffer } bin
+
+  # Request watch data  
+
+  BM_SYNC_SendCommand 2
+
+  updateStatusSYNC "Requesting watch data."
+
+  # Wait for buffer to be filled with RX packet - or timeout
+  set repeat 10
+  while { $repeat > 0 } {
+    after 100
+    set status [ BM_SYNC_GetBufferStatus ]
+    if { $status == 1 } {
+      updateStatusSYNC "Received watch status information."
+      set repeat 0
+
+      catch { BM_SYNC_ReadBuffer } data
+
+      # Decode received data      
+      # Received hours is always 24H format      
+      set sync_use_metric_units   [format "%d" [expr ([lindex $data 1]>>7) & 0x01 ]]
+      set sync_time_hours_24      [expr [lindex $data 1] & 0x7F]
+      set sync_time_minutes       [format "%d" [lindex $data 2]]
+      set sync_time_seconds       [format "%d" [lindex $data 3]]
+      set sync_date_year          [format "%d" [expr ([lindex $data 4]<<8) + [lindex $data 5]]]
+      set sync_date_month         [format "%d" [lindex $data 6]]
+      set sync_date_day           [format "%d" [lindex $data 7]]
+      set sync_alarm_hours        [format "%d" [lindex $data 8]]
+
+
+      set sync_alarm_minutes      [format "%d" [lindex $data 9]]
+      set sync_temperature_24     [format "%2.0f" [expr [format "%2.1f" [expr ([lindex $data 10]<<8) + [lindex $data 11]]] / 10]]
+      set sync_altitude_24        [format "%d" [expr ([lindex $data 12]<<8) + [lindex $data 13]]]
+
+      set sync_data_log_mode      [format "%d" [lindex $data 14]]
+      set sync_data_log_interval  [format "%d" [lindex $data 15]]
+      set sync_data_log_bytes     [format "%d" [expr ([lindex $data 16]<<8) + [lindex $data 17]]]
+
+      
+      # Decode data log mode bits
+      if { [expr $sync_data_log_mode & 0x01] } { set sync_data_log_mode_hr 1 }
+      if { [expr $sync_data_log_mode & 0x02] } { set sync_data_log_mode_temp 1 }
+      if { [expr $sync_data_log_mode & 0x04] } { set sync_data_log_mode_alt 1 }
+      
+
+      # Calculate new 24H / 12H time
+      update_time_24
+      update_time_12
+      
+      # Reconfigure display
+      if { $sync_use_metric_units == 1 } {
+        switch_to_metric_units
+      } else {
+        switch_to_imperial_units
+      }
+      
+      return
+      
+    } else {
+        set repeat [expr $repeat-1]
+    }
+  }
+  updateStatusSYNC "Error: Did not receive watch status information."
+}
+
+# Write watch settings
+proc sync_write_watch {} {
+  global w simpliciti_on
+  global sync_use_metric_units sync_time_is_am sync_time_hours_24 sync_time_minutes sync_time_seconds
+  global sync_date_year sync_date_month sync_date_day
+  global sync_data_log_mode sync_data_log_interval
+  global sync_data_log_mode_hr sync_data_log_mode_temp sync_data_log_mode_alt sync_data_log_mode_acc
+  global sync_temperature_24 sync_altitude_24
+
+  # AP not enabled?
+  if { !$simpliciti_on } { return }
+
+  # Assemble mode bits  
+  set sync_data_log_mode [expr ($sync_data_log_mode_hr&0x01) | (($sync_data_log_mode_temp<<1)&0x02) | (($sync_data_log_mode_alt<<2)&0x04)]
+  
+  # Assemble command string
+  lappend cmd 0x03
+
+  lappend cmd [format "0x%02X" [expr $sync_time_hours_24 | (($sync_use_metric_units<<7)&0x80)]]
+  lappend cmd [format "0x%02X" $sync_time_minutes] 
+  lappend cmd [format "0x%02X" $sync_time_seconds] 
+  lappend cmd [format "0x%02X" [expr $sync_date_year >> 8]] 
+  lappend cmd [format "0x%02X" [expr $sync_date_year & 0xFF]] 
+  lappend cmd [format "0x%02X" $sync_date_month] 
+  lappend cmd [format "0x%02X" $sync_date_day] 
+  lappend cmd "0x00 " 
+  lappend cmd "0x00 "
+  set t1 [format "%.0f" [expr $sync_temperature_24*10]]
+  lappend cmd [format "0x%02X" [expr $t1 >> 8]]
+  lappend cmd [format "0x%02X" [expr $t1 & 0xFF]] 
+  lappend cmd [format "0x%02X" [expr $sync_altitude_24 >> 8]]
+  lappend cmd [format "0x%02X" [expr $sync_altitude_24 & 0xFF]] 
+  lappend cmd [format "0x%02X" $sync_data_log_mode] 
+  lappend cmd [format "0x%02X" $sync_data_log_interval] 
+
+  # Transfer command to RF access point
+  BM_SYNC_SendCommand $cmd
+
+  updateStatusSYNC "Sent data to watch."
+}
+\r
+# Read system time and date\r
+proc sync_get_time_and_date {} {\r
+  global w \r
+  global sync_use_metric_units sync_time_is_am sync_time_hours_24 sync_time_minutes sync_time_seconds\r
+  global sync_date_year sync_date_month sync_date_day\r
+\r
+  # Get date  \r
+  set sync_date_year    [expr [format "%04.0f" [expr [clock format [clock seconds] -format "%Y"]]]]\r
+  set sync_date_month   [expr [clock format [clock seconds] -format "%m"]]\r
+  if { [string first 0 $sync_date_month] == 0 } {\r
+    set sync_date_month [expr [string replace $sync_date_month 0 0]]\r
+  }\r
+  set sync_date_day    [expr [clock format [clock seconds] -format "%e"]]\r
+  \r
+  # Get hours in 24H time format\r
+  set sync_time_hours_24 [clock format [clock seconds] -format "%H"]\r
+  if { [string first 0 $sync_time_hours_24] == 0 } {\r
+    set sync_time_hours_24 [string replace $sync_time_hours_24 0 0]\r
+  }\r
+  \r
+  # Calculate hours in 12H time format\r
+  update_time_24\r
+  \r
+  # Get minutes and seconds\r
+  set sync_time_minutes  [clock format [clock seconds] -format "%M"]\r
+  if { [string first 0 $sync_time_minutes] == 0 } {\r
+    set sync_time_minutes [string replace $sync_time_minutes 0 0]\r
+  }\r
+  set sync_time_seconds  [clock format [clock seconds] -format "%S"]\r
+  if { [string first 0 $sync_time_seconds] == 0 } {\r
+    set sync_time_seconds [string replace $sync_time_seconds 0 0]\r
+  }\r
+  updateStatusSYNC "Copied system time and date to watch settings."\r
+}\r
+\r
+# Download packets, first in a burst, then missed packets packet-by-packet\r
+proc sync_download {} {
+  global w simpliciti_on
+  global sync_data_log_bytes sync_file
+  global packets_max packet packets_expected
+  
+  # AP not enabled?
+  if { $simpliciti_on == 0 } { return }
+  
+  # No bytes to download?
+  sync_read_watch 
+  if { $sync_data_log_bytes == 0 } { return }
+
+  updateStatusSYNC "Requesting watch data."
+  
+  # Dummy read to clean buffer
+  catch { BM_SYNC_ReadBuffer } bin
+  after 10
+  
+  # Calculate how many packets (1 packet = 16 bytes data) are available for download
+  set packet_start      0
+  set packet_end        [expr $sync_data_log_bytes / 16]
+  set packets_expected  [expr $packet_end + 1]
+  set packets_per_burst 50
+  set packets_received  0
+  
+  # Prepare received packet buffer
+  for { set i 0 } { $i < $packets_max } {incr i } {
+    set packet($i) "m"
+  }
+
+  # Request packet bursts until all packets have been requested once
+  for { set i 0 } { $i < $packets_expected } {set i [expr $i + $packets_per_burst]} {
+    
+    # Request burst 
+    set start_hi [expr ($i >> 8) & 0xFF]
+    set start_lo [expr $i & 0xFF]
+    if { $packet_end > [expr $i + $packets_per_burst] } {
+      set end_hi [expr (($i + $packets_per_burst - 1) >> 8) & 0xFF]
+      set end_lo [expr ($i + $packets_per_burst - 1) & 0xFF]
+    } else {
+      # Last burst request
+      set end_hi [expr ($packet_end >> 8) & 0xFF]
+      set end_lo [expr $packet_end & 0xFF]
+    }
+
+    # Assemble command string
+    lappend cmd 0x04
+    lappend cmd [format "0x%02X" $start_hi] 
+    lappend cmd [format "0x%02X" $start_lo] 
+    lappend cmd [format "0x%02X" $end_hi] 
+    lappend cmd [format "0x%02X" $end_lo] 
+
+    # Transfer command to RF access point
+    BM_SYNC_SendCommand $cmd 
+   
+    # Wait for buffer to be filled - or timeout
+    set repeat 200
+    while { $repeat > 0 } {
+      set status [ BM_SYNC_GetBufferStatus ]
+      if { $status == 1 } {
+        catch { BM_SYNC_ReadBuffer } data
+        #binary scan $bin H* hex
+        # Store packet 
+        set idx [format "%d" [expr ([lindex $data 1]<<8) + [lindex $data 2]]]
+          #set idx [expr 0x[string range $hex 2 5]]
+          if { $packet($idx) == "m" } { 
+            #set packet($idx) $hex 
+            set packet($idx) $data 
+            incr packets_received
+            updateStatusSYNC "Received [format %4d [expr $packets_received*16]] bytes."
+          }
+        set repeat 10
+      } else {
+          set repeat [expr $repeat-1]
+          after 2
+      }
+    }
+  }
+
+  # Clear buffer
+  catch { BM_SYNC_ReadBuffer } bin
+  
+  # While packets are missing, download them separately (up to 180 missed packets)
+  set packets_missed_count 1
+  set repeats 0  
+  while { $packets_missed_count > 0 && $repeats < 20 } {
+  
+    incr repeats
+    
+    # Create list of missed packets
+    catch { unset packets_missed }
+    set packets_missed_count 0
+    for { set i 0 } { $i < $packets_expected } {incr i } {
+      if { $packet($i) == "m" } { 
+        lappend packets_missed $i
+        incr packets_missed_count
+      }
+    }
+    
+    # Packets missed?
+    if { $packets_missed_count > 0 } {
+      # Request 9 packets per command
+      set packets_single [lrange $packets_missed 0 8]
+      # Add dummy packets
+      while { [llength $packets_single] < 9 } {
+        lappend packets_single [lindex $packets_missed 0]
+      }
+      # Split packet indizes into high and low byte
+      for { set i 0 } { $i < 9 } {incr i } {
+        set ps_hi($i) [expr ([lindex $packets_single $i] >> 8) & 0xFF]        
+        set ps_lo($i) [expr  [lindex $packets_single $i] & 0xFF]        
+      }
+
+      # Request packets
+      updateStatusSYNC "Requesting missed packets $packets_single"
+      
+      # Assemble command string
+      unset cmd
+      lappend cmd "0x05"
+
+      for { set i 0 } { $i < 9 } {incr i } {
+        lappend cmd [format "0x%02X" $ps_hi($i)]
+        lappend cmd [format "0x%02X" $ps_lo($i)]
+
+
+      } 
+
+
+
+
+
+
+      # Transfer command to RF access point
+      BM_SYNC_SendCommand $cmd 
+      
+      # Wait for buffer to be filled - or timeout
+      set repeat 100
+      while { $repeat > 0 } {
+        set status [ BM_SYNC_GetBufferStatus ]
+        if { $status == 1 } {
+
+          catch { BM_SYNC_ReadBuffer } data
+
+
+          # Store packet 
+          set idx [format "%d" [expr ([lindex $data 1]<<8) + [lindex $data 2]]]
+
+          if { $packet($idx) == "m" } { 
+            set packet($idx) $data    
+            incr packets_received
+            updateStatusSYNC "Received [format %4d [expr $packets_received*16]] bytes."
+          }
+          set repeat 20
+        } else {
+            set repeat [expr $repeat-1]
+            after 2
+        }
+      }
+    }
+  }
+  
+  # Output received data  
+  if { $packets_received >= $packets_expected } { 
+    sync_decode_data 
+  } else {
+    updateStatusSYNC "Error: Did not receive all logged data."
+  }
+  
+  # Dummy read to clean buffer
+  catch { BM_SYNC_ReadBuffer } bin
+}\r
+\r
+# Decode datastream
+proc sync_decode_data {} {
+  global sync_file sync_data_log_mode 
+  global packets_max packet packets_expected
+  #global hex_arr
+  global sync_use_metric_units
+  
+  updateStatusSYNC "Writing data to file."
+  set wp [open $sync_file w]
+  
+  # Write raw data and create a hex array
+  set decode 1
+  set hex_arr_len 0
+  set data_stream ""
+  for { set i 0 } { $i < $packets_expected } {incr i } {
+
+    # Uncomment next line to output raw data at start of file
+    #puts $wp "$i $packet($i)"
+
+    if { $packet($i) != "m" } { 
+
+      # Split data line in separate bytes
+      set data [ split $packet($i) " " ]
+
+      # Append data bytes to raw data stream
+      for { set j 3 } { $j <= 18 } { incr j } {
+        lappend hex_arr [lindex $data $j]
+      }
+
+    } else {
+
+      # Data missing?
+      updateStatusSYNC "Error: Not all data has been received."
+      return 
+
+    }
+  }
+  # Append dummy byte to eof
+  lappend hex_arr 0x00
+  lappend hex_arr 0x00
+  lappend hex_arr 0x00
+  lappend hex_arr 0x00
+
+  # Decode data (format is lo-hi) and write to file
+  set session 0  
+  for { set i 0 } { $i < [expr [llength $hex_arr] - 2] } {incr i } {
+    
+    # Scan for markers
+    # Markers can appear only at 16-bit boundaries
+    if { [lindex $hex_arr $i]==0 && [expr $i%2]==1 } {
+      set next_word [expr ([lindex $hex_arr [expr $i+2]]<<8) | [lindex $hex_arr [expr $i+1]]]
+    } else {
+      set next_word [expr ([lindex $hex_arr [expr $i+1]]<<8) | [lindex $hex_arr $i]]
+    }
+
+    # Check for start marker
+    if { $session == 0 } {
+
+      if { $next_word == 0xFFFB } {
+        set session 1
+        # Decode header
+        incr i
+        incr i
+        set rec_mode      [format "0x%02X" [lindex $hex_arr $i]]
+        incr i
+        set rec_interval  [format %02d [lindex $hex_arr $i]]
+        incr i
+        set rec_day       [format %02d [lindex $hex_arr $i]]
+        incr i
+        set rec_month     [format %02d [lindex $hex_arr $i]]
+        incr i
+        set rec_year      [expr ([lindex $hex_arr [expr $i+1]]<<8) | [lindex $hex_arr $i]]
+        incr i
+        incr i
+        set rec_hour      [format %02d [lindex $hex_arr $i]]
+        incr i
+        set rec_minute    [format %02d [lindex $hex_arr $i]]
+        incr i
+        set rec_second    [format %02d [lindex $hex_arr $i]]
+        set start_time [clock scan "$rec_year-$rec_month-$rec_day $rec_hour:$rec_minute:$rec_second" -format {%Y-%m-%d %H:%M:%S}]
+
+      }
+    } elseif { $next_word == 0xFFFE } {
+
+      # End marker found
+      set session 0
+      
+    } else {
+
+      # Get the next data set bytes
+      set byte0     [lindex $hex_arr $i]
+      set byte1     [lindex $hex_arr [expr $i+1]]
+      set byte2     [lindex $hex_arr [expr $i+2]]  
+      set byte3     [lindex $hex_arr [expr $i+3]]
+      set rec_hr    0 
+      set rec_temp  0 
+      set rec_alt   0 
+
+      # Decode data
+      switch $rec_mode {
+        0x01 { # HR
+            set rec_hr      [format %d $byte0]
+          }
+        0x02 { # TEMP
+            set rec_temp    [format %2.1f [expr [format %2.1f [expr (($byte0<<8) | $byte1)]]/10]]
+            # Move to next data set        
+            set i [expr $i+2-1]
+          }
+        0x04 { # ALT
+            set rec_alt     [format %d [expr ($byte0<<8) | $byte1]]
+            # Move to next data set        
+            set i [expr $i+2-1]
+          }
+        0x07 { # HR + TEMP + ALT
+            set rec_hr      [format %d $byte0]
+            set rec_temp    [format %2.1f [expr [format %2.1f [expr (($byte1<<4) | (($byte2>>4)&0x0F))]]/10]]
+            set rec_alt     [format %d [expr (($byte2&0x0F)<<8) | $byte3]]
+            # Move to next data set        
+            set i [expr $i+4-1]
+          }
+        0x03 { # HR + TEMP
+            set rec_hr      [format %d $byte0]
+            set rec_temp    [format %2.1f [expr [format %2.1f [expr (($byte1<<8) | $byte2)]]/10]]
+            # Move to next data set        
+            set i [expr $i+3-1]
+          }
+        0x05 { # HR + ALT
+            set rec_hr      [format %d $byte0]
+            set rec_alt    [format %d [expr ($byte1<<8) | $byte2]]
+            # Move to next data set        
+            set i [expr $i+3-1]
+          }
+        0x06 { # TEMP + ALT
+            set rec_temp    [format %2.1f [expr [format %2.1f [expr (($byte0<<4) | (($byte1>>4)&0x0F))]]/10]]
+            set rec_alt     [format %d [expr (($byte1&0x0F)<<8) | $byte2]]
+            # Move to next data set        
+            set i [expr $i+3-1]
+          }
+        }
+        
+        # Convert metric temperature and altitude to Imperial units 
+        if { $sync_use_metric_units == 0 } {
+          set rec_temp [format %2.1f [expr ($rec_temp*9)/5+32]]
+          set rec_alt  [format %.0f [expr $rec_alt*3.28084]]
+        }
+
+        # Write data set to file
+        puts $wp "[clock format $start_time -format {%d.%m.%Y}],[clock format $start_time -format {%H:%M:%S}],$rec_hr,$rec_temp,$rec_alt"
+      
+        # Calculate time for next data sample
+        set start_time  [expr $start_time + $rec_interval]
+    }
+  }
+  close $wp
+  
+  after 500
+  updateStatusSYNC "Data download finished."
+}
+\r
+\r
+# Erase memory on watch
+proc sync_erase {} {
+  global w simpliciti_on 
+  global sync_data_log_bytes
+  
+  # AP not enabled?
+  if { !$simpliciti_on } { return }
+
+  # Transfer command to RF access point
+  BM_SYNC_SendCommand 6
+  updateStatusSYNC "Sent erase command to watch."
+  after 1000
+  
+  updateStatusSYNC "Updating watch status."
+  sync_read_watch 
+
+  # Check if erase was successful
+  if { $sync_data_log_bytes != 0 } {
+    updateStatusSYNC "Error: Memory erase or status update failed. Please try again."
+  }
+}
+\r
+\r
+# Change all affected parameters to metric units / 24H time format\r
+proc switch_to_metric_units {} {\r
+  global w\r
+  global sync_time_is_am sync_time_hours\r
+  global sync_date_year sync_date_month sync_date_day\r
+  global sync_temperature_24 sync_altitude_24\r
+  global values_24\r
+  global values_12\r
+  global values_30\r
+  global value_temperature_C\r
+  global values_altitude_meters\r
+\r
+  # Update 24H time\r
+  update_time_12\r
+\r
+  # Reconfigure hours\r
+  $w.note.sync.f1.sb1 configure -textvariable sync_time_hours_24 -values $values_24 -postcommand { check_time }\r
+  $w.note.sync.ampm.rb1 configure -state disabled\r
+  $w.note.sync.ampm.rb2 configure -state disabled\r
+   \r
+  # Configure date fields\r
+  $w.note.sync.f2.l1 configure -text "Date (dd.mm.yyyy)"\r
+  $w.note.sync.f2.sb1 configure -textvariable sync_date_day    -values $values_30\r
+  $w.note.sync.f2.sb2 configure -textvariable sync_date_month  -values $values_12\r
+  \r
+  # Change temperature\r
+  $w.note.sync.f4.l1 configure -text "Temperature (\u00B0C)" \r
+  $w.note.sync.f4.sb1 configure -textvariable sync_temperature_24 -values $value_temperature_C\r
+   \r
+  # Change altitude\r
+  $w.note.sync.f5.l1 configure -text "Altitude (m)"\r
+  $w.note.sync.f5.sb1 configure -textvariable sync_altitude_24 -values $values_altitude_meters\r
+}\r
+\r
+# Change all affected parameters to imperial units / 12H time format\r
+proc switch_to_imperial_units {} {\r
+  global w \r
+  global sync_time_is_am sync_time_hours\r
+  global sync_date_year sync_date_month sync_date_day\r
+  global sync_temperature_12 sync_temperature_24 sync_altitude_12\r
+  global values_12 \r
+  global values_30\r
+  global value_temperature_F\r
+  global values_altitude_feet\r
+  \r
+  # Update 12H time\r
+  update_time_24\r
+  \r
+  # Reconfigure hours\r
+  $w.note.sync.f1.sb1 configure        -textvariable sync_time_hours_12 -values $values_12 -postcommand {check_time}\r
+  $w.note.sync.ampm.rb1 configure      -state normal\r
+  $w.note.sync.ampm.rb2 configure      -state normal\r
+  \r
+  # Change date\r
+  $w.note.sync.f2.l1 configure         -text "Date (mm.dd.yyyy)"     \r
+  $w.note.sync.f2.sb1 configure -textvariable sync_date_month  -values $values_12\r
+  $w.note.sync.f2.sb2 configure -textvariable sync_date_day    -values $values_30\r
+   \r
+  # Change temperature\r
+  $w.note.sync.f4.l1 configure         -text "Temperature (\u00B0F)" \r
+  $w.note.sync.f4.sb1 configure -textvariable sync_temperature_12 -values $value_temperature_F\r
+    \r
+  # Change altitude\r
+  $w.note.sync.f5.l1 configure         -text "Altitude (ft)"\r
+  $w.note.sync.f5.sb1 configure -textvariable sync_altitude_12 -values $values_altitude_feet\r
+}\r
+\r
+\r
+# Keep 24H and 12H time variable in sync\r
+proc update_time_24 {} {\r
+  global sync_use_metric_units sync_time_is_am sync_time_hours_24 sync_time_hours_12\r
+\r
+  # Calculate 12H time  \r
+  if { $sync_time_hours_24 == 0 } {\r
+    set sync_time_hours_12 [expr $sync_time_hours_24 + 12]\r
+    set sync_time_is_am 1\r
+  } elseif { $sync_time_hours_24 <= 12 } {\r
+    set sync_time_hours_12 $sync_time_hours_24\r
+    set sync_time_is_am 1\r
+  } else {\r
+    set sync_time_hours_12 [expr $sync_time_hours_24 - 12]\r
+    set sync_time_is_am 0
+  }\r
+}\r
+\r
+# Keep 24H and 12H time variable in sync\r
+proc update_time_12 {} {\r
+  global sync_use_metric_units sync_time_is_am sync_time_hours_24 sync_time_hours_12\r
+\r
+  # Calculate 12H time \r
+  if { $sync_time_is_am == 1 } {\r
+    if { $sync_time_hours_12 == 12 } { \r
+      set sync_time_hours_24 0 \r
+    } else {\r
+      set sync_time_hours_24 $sync_time_hours_12\r
+    }\r
+  } else {\r
+    set sync_time_hours_24 [expr $sync_time_hours_12 + 12]\r
+  }\r
+}\r
+\r
+# Trace altitude and temperature and update internal units\r
+proc update_temperature args {\r
+  global sync_use_metric_units sync_temperature_24 sync_temperature_12\r
+  \r
+  # Convert to internal format\r
+  if {([string is digit -strict $sync_temperature_24 ]==1) && ([string is digit -strict $sync_temperature_12 ]==1)} {\r
+         if { $sync_use_metric_units == 1 } {\r
+               set sync_temperature_12 [format "%2.0f" [expr ($sync_temperature_24*9/5)+32]]\r
+         } else {\r
+               set sync_temperature_24 [format "%2.0f" [expr ($sync_temperature_12-32)/9*5]]\r
+         }\r
+  } \r
+  if {([string is digit -strict $sync_temperature_24 ]==0) && ($sync_use_metric_units == 0)} {\r
+        set sync_temperature_24 [format "%2.0f" [expr ($sync_temperature_12-32)/9*5]]\r
+  }\r
+}\r
+\r
+proc update_altitude args {\r
+  global sync_use_metric_units sync_altitude_24 sync_altitude_12\r
+       \r
+  # Convert to internal format\r
+  if {([string is digit -strict $sync_altitude_24 ]==1) && ([string is digit -strict $sync_altitude_12 ]==1)} {  \r
+         if { $sync_use_metric_units == 1 } {\r
+               set sync_altitude_12 [expr {round(($sync_altitude_24*3)+($sync_altitude_24*140/500))}]\r
+         } else {\r
+               set sync_altitude_24 [expr {round(($sync_altitude_12*1000/(3000+(140*1000/500))))}]\r
+         }\r
+  }\r
+  if {([string is digit -strict $sync_altitude_24 ]==0) && ($sync_use_metric_units == 0)} {\r
+        set sync_altitude_24 [expr {round(($sync_altitude_12*1000/(3000+(140*1000/500))))}]\r
+  }\r
+}\r
+trace add variable sync_temperature_24 write update_temperature\r
+trace add variable sync_temperature_12 write update_temperature\r
+trace add variable sync_altitude_24 write update_altitude\r
+trace add variable sync_altitude_12 write update_altitude\r
+        \r
+# ----------------------------------------------------------------------------------------\r
+# WBSL Update functions ------------------------------------------------------------------\r
+\r
+# Prompt the user to select a file\r
+proc open_file {} {\r
+       global select_input_file\r
+       global w\r
+       set types {\r
+               {{CC430 Firmware} {.txt}                                        }\r
+       }\r
+       set select_input_file [tk_getOpenFile -title "Select File" -filetypes $types] \r
+}\r
+\r
+# Safely execute WBSL service functions (non-overlapping)
+proc call_wbsl_funcs {} {
+  global call_wbsl_timer call_wbsl_1 call_wbsl_2
+
+  if { $call_wbsl_timer == $call_wbsl_1 } { 
+    get_wbsl_packet_status 
+    set call_wbsl_1 [expr $call_wbsl_timer + 2]
+  } 
+  if { $call_wbsl_timer == $call_wbsl_2 } { 
+    get_wbsl_status
+    set call_wbsl_2 [expr $call_wbsl_timer + 3]
+  } 
+
+  incr call_wbsl_timer
+}
+# Start the Wireless update procedure, and put RF Access Point in RX mode
+proc start_wbsl_ap {} {
+  global w
+  global simpliciti_on com_available
+  global wbsl_on select_input_file
+  global wbsl_ap_started
+  global fsize
+  global fp
+  global rData
+  global rData_index
+  global low_index
+  global list_count maxPayload 
+  global ram_updater_downloaded
+  global wirelessUpdateStarted
+
+  # init needed variables
+  set rData [list]
+  set rData_index 0
+  set low_index 0
+  
+  # No com port?  
+  if { $com_available == 0} { return }
+  
+  # Testing REMOVE
+  # set ram_updater_downloaded 1
+  
+  set ram_updater_file "ram_based_updater.txt"
+
+
+  if { $ram_updater_downloaded == 0 } {
+         # Check that the user has selected a file    
+         if { [string length $select_input_file] == 0 } {
+                       tk_dialog .dialog1 "No file selected" {Please select a watch firmware file (*.txt) to download to the watch.} info 0 OK
+                       return
+         }
+         
+         # Check that the file selected by the user has the extension .txt 
+         if { [string first ".txt" $select_input_file] == -1 } {
+                   tk_dialog .dialog1 "Invalid .txt File" {The file selected is not a .txt file.} info 0 OK
+                       return
+         }
+  }
+
+  # First off check that the file trying to be downloaded has the right format
+  catch { file size $select_input_file } fsize
+  
+  # Check if the file exist
+  if { [string first "no such file" $fsize] != -1 } {
+       tk_dialog .dialog1 "File doesnt exist" {The selected file doesnt exist, please verify the path.} info 0 OK
+       return
+  }
+  
+  # Open the file for reading
+  catch { open $select_input_file r } fp
+  fconfigure $fp -translation binary
+
+  # read the first character of the file, it should be an @ symbol
+  set test_at [read $fp 1]
+
+  if { $test_at != "@" } { 
+    tk_dialog .dialog1 "Invalid .txt File" {The .txt file is NOT formatted correctly.} info 0 OK
+    close $fp
+    return
+  }
+  
+  # read the complete file
+  set rawdata [read $fp $fsize]
+  close $fp
+  # Remove spaces, tabs, endlines from the data
+  regsub -all {[ \r\t\nq]*} $rawdata "" stripped_data
+  set lines 0
+  # Divide the file by the symbol @ so that in each list there is data to be written consecutively at the address indicated by the first 2 bytes
+  set datainlist [split $stripped_data "@"]
+  set list_count 0
+  set byteCounter 0
+  
+  # For each line, convert the ASCII format in which is saved to Raw HEX format
+  foreach lines $datainlist {
+       set lines [join $lines]
+       regsub -all {[ \r\t\nq]*} $lines "" line
+       if { [catch { binary format H* $line } line] } {
+             tk_dialog .dialog1 "Invalid .txt File" {The .txt file is NOT formatted correctly.} info 0 OK
+             return
+      } 
+      lappend rData $line
+      incr list_count
+   }
+  
+  # Check if the RAM_UPDATER is not yet on the watch so that we download this first
+  if { $ram_updater_downloaded == 0 } {
+         # init needed variables
+      set rData [list]
+      set rData_index 0
+      set low_index 0
+      
+         catch { file size $ram_updater_file} fsize
+         
+         # Check that the RAM Updater file is present on the GUI working directory
+         if { [string first "no such file" $fsize] != -1 } {
+               tk_dialog .dialog1 "No Updater File" {The RAM Updater File is not present on the working directory. Filename should be:ram_based_updater.txt} info 0 OK
+            return
+         }
+         
+         catch { open $ram_updater_file r } fp
+         fconfigure $fp -translation binary
+         
+         set test_at [read $fp 1]
+        
+         if { $test_at != "@" } { 
+               tk_dialog .dialog1 "Invalid .txt File" {The ram_based_updater.txt file is NOT formatted correctly.} info 0 OK
+               close $fp
+               return
+         }
+         
+         set rawdata [read $fp $fsize]
+         close $fp
+         # Remove spaces, tabs, endlines from the data
+         regsub -all {[ \r\t\nq]*} $rawdata "" stripped_data
+         
+         set datainlist [split $stripped_data "@"]
+         set list_count 0
+         set byteCounter 0
+         foreach lines $datainlist {
+                       set lines [join $lines]
+                       regsub -all {[ \r\t\nq]*} $lines "" line
+                       if { [catch { binary format H* $line } line] } {
+                         tk_dialog .dialog1 "Invalid .txt File" {The ram_based_updater.txt file is NOT formatted correctly.} info 0 OK
+                         return
+                   } 
+                   lappend rData $line
+                   incr list_count
+               }
+  }
+  # In AP mode?
+  if { $simpliciti_on == 1 } { 
+    stop_simpliciti_ap
+    after 500
+  } 
+  
+  updateStatusWBSL "Starting Wireless Update."
+  after 200
+
+  # Link with WBSL transmitter
+  BM_WBSL_Start
+  after 100
+
+
+
+
+  
+  set result [ BM_WBSL_GetMaxPayload ]
+  after 10
+  set result [ BM_WBSL_GetMaxPayload ]
+
+  if { $result < 2 } {
+    updateStatusWBSL "$result Failed to start Wireless Update."
+    return
+  }
+
+
+
+  set maxPayload $result
+  
+  # Calculate the number of packets needed to be sent
+  
+  #initialize the number of packets
+  set fsize 0
+  
+  # sum up all the bytes to be sent
+  foreach block $rData {
+       set byteCounter [string length $block]
+       set dByte [expr {double($byteCounter)}]
+       set dMax [expr {double($maxPayload)} ]
+       set temp [ceil [expr  $dByte / $dMax]]
+       set fsize [expr $fsize + $temp]
+  }
+    
+  # Set on WBSL flag   
+  set wbsl_on 1
+
+  # Cancel out first received data
+  set wbsl_ap_started 0
+  
+  # Reconfig buttons
+  $w.note.wbsl.btnDwnld configure -text "Cancel Update" -command { stop_wbsl_ap }
+  
+}
+
+# Stop the wireless update procedure
+proc stop_wbsl_ap {} {
+  global w
+  global simpliciti_on com_available wbsl_on
+  global ram_updater_downloaded
+  global wirelessUpdateStarted
+
+  # AP off?
+  if { $wbsl_on == 0 } { return }
+  
+  # Clear on flags  
+  set wbsl_on 0
+  set ram_updater_downloaded 0
+
+  after 500
+  BM_WBSL_Stop
+
+  # Show that link is inactive
+  updateStatusWBSL "Wireless Update is off."
+
+  update
+  
+  # Initialize the variable that tell us when the update procedure has been initiated by the Watch
+  set wirelessUpdateStarted 0
+
+  # Reconfig button and re-enable it in case the update procedure was started and it was disabled during the procedure
+  $w.note.wbsl.btnDwnld configure -text "Update Chronos Watch" -command { start_wbsl_ap } -state enabled
+  
+}
+
+proc get_wbsl_packet_status {} {
+  global w
+  global wbsl_on 
+  global wbsl_ap_started
+  global fsize
+  global fp
+  global rData   
+  global rData_index
+  global low_index
+  global list_count maxPayload
+  global wbsl_opcode
+  global ram_updater_downloaded
+  global vcp_reply
+  
+  set status 0
+  
+  # return if WBSL is not active  
+  if { $wbsl_on == 0 } { return }
+  # Check packet status
+  set status [ BM_WBSL_GetPacketStatus ]
+  if { $status == 1 } {
+    # WBSL_DISABLED Not started by watch
+    return
+  } elseif { $status == 2 } {
+       # WBSL Is processing a packet
+        return 
+  } elseif { $status == 4 } {
+       # Send the size of the file
+       set packets [expr {int($fsize)} ]
+       # send opcode 0 which is a info packet, which contains the total packets to be sent
+       catch { BM_WBSL_SendData 0 $packets } status 
+    # The next packet will contain an address
+       set wbsl_opcode 1
+  } elseif { $status == 8 } {
+       # Send the next data packet
+               
+       if { $rData_index <  $list_count } {
+               # Choose the appropriate block of data
+               set data_block [lindex $rData $rData_index]
+               # Get the size of the block of data, to know if we have sent all of the data in this block and move to the next
+               set block_size [string length $data_block]
+               # Read MaxPayload Bytes from the list
+               set c_data [string range $data_block $low_index [expr $low_index + [expr $maxPayload - 1]]]
+               
+               # Send the read bytes to the dongle
+               set status [BM_WBSL_SendData $wbsl_opcode $c_data] 
+               
+               #update the low index
+               set low_index [expr $low_index + $maxPayload]
+               
+               # Next packet is a normal data packet
+               set wbsl_opcode 2
+               
+               if { $low_index >= $block_size } { 
+                       incr rData_index
+                       set     low_index 0
+                       # Next packet will include an address at the beginning of the packet
+                       set wbsl_opcode 1
+               }
+        }
+  } else {
+       # ERROR only the previous options should be returned
+    if { $ram_updater_downloaded == 0 } {
+               tk_dialog .dialog1 "Error in communication" {There was an error in the communication between the RF Access Point and the watch during the download to RAM. The watch should have reset itself. Please retry the update the same way as before.} info 0 OK
+    } else {
+      tk_dialog .dialog1 "Error in communication" {There was an error in the communication between the RF Access Point and the watch during the download to Flash. The watch is in a sleep mode now. Please press the "Update Chronos Watch" first and then press the down button on the watch to restart the update.} info 0 OK
+    }
+       after 200
+       stop_wbsl_ap 
+       return
+  }
+}
+# Get the global status of the AP, check if the state in which the GUI is, matches the state of the AP
+proc get_wbsl_status {} {
+  global w vcp
+  global wbsl_on
+  global wbsl_ap_started wbsl_progress
+  global ram_updater_downloaded
+  global wirelessUpdateStarted
+  global wbsl_timer_flag
+  global vcp_reply fh
+  
+  set status 0
+  
+  # return if WBSL is not active  
+  if { $wbsl_on == 0 } { return }
+
+  # Check if the flag has been set, which means the communication was lost while trying to link to download the update image
+ if { $wbsl_timer_flag == 1 } {
+            tk_dialog .dialog1 "Error in communication" {There was an error in the communication between the AP and the Watch while trying to start the download to Flash. The watch should have reset itself. Please retry the update the same way as before.} info 0 OK
+            wbsl_reset_timer        
+            after 300
+            stop_wbsl_ap
+            return
+    }
+
+  # Update status box  
+  set status [ BM_GetStatus1 ]
+
+
+
+  if { $status == 9 } {
+    # just starting AP
+    updateStatusWBSL "Starting access point."
+    return
+  # Check if there was an error during the communication between the AP and the watch
+  } elseif { $status == 11 || $status == 12 } {
+       
+       if { $ram_updater_downloaded == 0 } {
+               tk_dialog .dialog1 "Error in communication" {There was an error in the communication between the RF Access Point and the watch during the download to RAM. The watch should have reset itself. Please retry the update the same way as before.} info 0 OK
+    } else {
+        tk_dialog .dialog1 "Error in communication" {There was an error in the communication between the RF Access Point and the watch during the download to Flash. The watch is in sleep mode now. Please press the "Update Chronos Watch" first and then press the down button on the watch to restart the update.} info 0 OK
+    }
+       after 300
+       stop_wbsl_ap 
+       
+  } elseif { $status == 10 } {
+    
+    # Read WBSL data from dongle
+    set data [ BM_WBSL_GetStatus ]
+   # if { $data == "" }  { return }
+    
+    if { $wbsl_ap_started == 0} {
+       if { $ram_updater_downloaded == 0 } {
+      updateStatusWBSL "Access point started. Now start watch in rFbSL mode."
+after 2000
+     } else {
+       updateStatusWBSL "Starting to download update image to watch."
+       # We will now try to link with the watch to start downloading the Update Image, we need a timer in case the communication is lost
+       # while trying to link, since for the linking to start, the Dongle normally waits until the watch initiates the procedure.
+       wbsl_set_timer 1
+       update
+     }
+      set wbsl_ap_started 1
+      return
+    } else {
+   
+      # Check if data is valid
+      if { $data < 0 } {
+        return
+      } 
+     
+     set wbsl_progress $data
+     
+     if { $wbsl_progress != 0 } {
+          
+          if { $wirelessUpdateStarted == 0 } {
+               
+                 set wirelessUpdateStarted 1
+             # Reconfig buttons
+                   $w.note.wbsl.btnDwnld configure -state disabled
+            }
+          
+            if { $ram_updater_downloaded == 1 } {
+                # The download to FLASH has started, we don't need the timer to keep running
+                wbsl_reset_timer
+                update
+                 updateStatusWBSL "Downloading update image to watch. Progress: [format %d $wbsl_progress]%"   
+           
+                   if { $wbsl_progress >= 100 } { 
+                           updateStatusWBSL "Image has been successfully downloaded to the watch"      
+                           after 1500
+                           stop_wbsl_ap
+                          }
+                       
+            } else {
+                updateStatusWBSL "Downloading the RAM Based Updater. Progress: [format %d $wbsl_progress]%"    
+
+#puts $fh "\nDownloading the RAM Based Updater.\n"
+
+                 if { $wbsl_progress >= 100 } { 
+                           updateStatusWBSL "RAM Based Updater downloaded. Starting download of update image." 
+                           set ram_updater_downloaded 1
+                           BM_WBSL_Stop
+                           set wbsl_on 0
+                           start_wbsl_ap
+                          }
+            }
+     }
+      return
+      }
+   } 
+}
+# Stop and reset the timer variables
+proc wbsl_reset_timer { } {
+       global wbsl_timer_enabled
+       global wbsl_timer_counter
+       global wbsl_timer_flag
+       global wbsl_timer_timeout
+       
+       set  wbsl_timer_counter  0
+       set  wbsl_timer_flag     0
+       set  wbsl_timer_timeout  0
+       set  wbsl_timer_enabled  0
+ }
+# Set the timeout variable and start the timer
+proc wbsl_set_timer { timeout } {
+       global wbsl_timer_enabled
+       global wbsl_timer_counter
+       global wbsl_timer_flag
+       global wbsl_timer_timeout
+       
+       set  wbsl_timer_counter  0
+       set  wbsl_timer_flag     0
+       set  wbsl_timer_timeout  $timeout
+       set  wbsl_timer_enabled  1
+ }
+# Called every 2.5 seconds, acts as the timer, it only counts if it's enabled
+proc wbsl_simple_timer {} {
+       global wbsl_timer_enabled
+       global wbsl_timer_counter
+       global wbsl_timer_flag
+       global wbsl_timer_timeout
+       
+       if { $wbsl_timer_enabled == 0 } { 
+          return       
+       }
+       set wbsl_timer_counter [expr $wbsl_timer_counter+1]
+       if { $wbsl_timer_counter > $wbsl_timer_timeout } {
+               set wbsl_timer_flag 1
+          set wbsl_timer_enabled 0
+    }
+    
+}
+
+\r
+\r
+# --------------------------------------------------------------------------\r
+# System procedures \r
+\r
+\r
+\r
+# Generic file browse dialog\r
+proc fileDialog {w ent operation} {\r
+       global selected_type\r
+  \r
+  # Define default file types\r
+  set types {\r
+       {"eZ430-Chronos datalogger files"               {.log}  }\r
+       {"All files"            *}\r
+  }\r
+\r
+  # Use standard Windows file dialog \r
+  if {$operation == "open"} {\r
+       if {![info exists selected_type]} {\r
+           set selected_type "eZ430-Chronos datalogger files"\r
+       }\r
+    set file [tk_getOpenFile -filetypes $types -parent $w -typevariable selected_type]\r
+  } else {\r
+        set file [tk_getSaveFile -filetypes $types -parent $w -initialfile Untitled -defaultextension .log]\r
+  }\r
+  \r
+  # Copy selected file to entry\r
+  if {[string compare $file ""]} {\r
+       $ent delete 0 end\r
+       $ent insert 0 $file\r
+       $ent xview end\r
+  }\r
+}\r
+\r
+\r
+# Read variables from file \r
+proc load_ini_file {} {\r
+  global w\r
+  global ini_file\r
+  global sync_use_metric_units\r
+  \r
+  # Try to open file with key definitions\r
+  catch { set fhandle [open "$ini_file" r] } res\r
+  \r
+  # Exit if file is missing\r
+  if { [string first "couldn't open" $res] == 0 } { return }\r
+  \r
+  fconfigure $fhandle -buffering line\r
+\r
+  # Read file line by line and set global variables\r
+  while { ![eof $fhandle] } {\r
+    # Get next line\r
+    gets $fhandle line\r
+    # Split line\r
+    set data [ split $line "=" ]\r
+    # Verify that extracted strings consist of ASCII characters\r
+    if { [string is ascii [ lindex $data 0 ]] && [string is ascii [ lindex $data 1 ]] } {\r
+      # Set variable\r
+      set [ lindex $data 0 ] [ lindex $data 1 ]\r
+    }\r
+  }\r
+  \r
+  close $fhandle  \r
+}\r
+\r
+\r
+# Save variables to file \r
+proc save_ini_file { } {\r
+  global w\r
+  global ini_file\r
+  global sync_use_metric_units\r
+  \r
+  # Delete existing key file  \r
+  catch { file delete "$ini_file" }\r
+  \r
+  # Break if directory is write only\r
+  catch { set fhandle [open "$ini_file" a] } res\r
+  if { [string first "permission denied" $res] == 0 } {\r
+    return\r
+  }\r
+  \r
+  fconfigure $fhandle -buffering line\r
+  \r
+  # Make a list of all variables to save\r
+  set varlist { sync_use_metric_units }\r
+                \r
+  # Walk through list and save variables to file\r
+  foreach { el } $varlist {\r
+    set val [expr $$el]\r
+    puts $fhandle "$el=$val"\r
+  }  \r
+\r
+  close $fhandle  \r
+}\r
+\r
+# ----------------------------------------------------------------------------------------\r
+# Status output functions ----------------------------------------------------------------\r
+\r
+# Status output\r
+proc updateStatusSYNC { msg } {\r
+  global w\r
+  $w.note.sync.status.l2 configure -text $msg\r
+  update\r
+}\r
+proc updateStatusWBSL { msg } {\r
+  global w\r
+  $w.note.wbsl.frame0b.lblStatusText configure -text $msg\r
+  update\r
+}\r
+\r
+\r
+# ----------------------------------------------------------------------------------------\r
+# Start / stop application ---------------------------------------------------------------\r
+\r
+# Exit program\r
+proc exitpgm {} {\r
+  catch { stop_simpliciti_ap }\r
+  catch { BM_CloseCOM }\r
+  save_ini_file\r
+  exit 0\r
+}\r
+\r
+\r
\r
+ proc check_time args {\r
+       global sync_time_hours_12 sync_time_hours_24 sync_time_minutes sync_time_seconds\r
+       global w\r
+       \r
+       if { $sync_time_hours_12 > 12   } { set sync_time_hours_12      1       }\r
+       if { $sync_time_hours_24 > 23   } { set sync_time_hours_24      4       }\r
+       if { $sync_time_minutes  > 59   } { set sync_time_minutes       30      }\r
+       if { $sync_time_seconds  > 59   } { set sync_time_seconds       0       }\r
+       \r
+       if {[string is digit -strict $sync_time_hours_12        ]==0} { set sync_time_hours_12  1}      \r
+       if {[string is digit -strict $sync_time_hours_24        ]==0} { set sync_time_hours_24  0}      \r
+       if {[string is digit -strict $sync_time_minutes         ]==0} { set sync_time_minutes   0}      \r
+       if {[string is digit -strict $sync_time_seconds         ]==0} { set sync_time_seconds   0}              \r
+       update_time_24\r
+}\r
+\r
+proc check_date args {\r
+       global values_31 values_30 values_29 values_28\r
+       global sync_date_day sync_date_month sync_date_year\r
+       global w\r
+       global sync_use_metric_units\r
+       set actual_day $sync_date_day\r
+       \r
+       # Check if we are using metric system, and switch the combobox\r
+       if { $sync_use_metric_units == 1 } {\r
+               set combobox $w.note.sync.f2.sb1\r
+       } else {\r
+               set combobox $w.note.sync.f2.sb2\r
+       }       \r
+       \r
+       switch $sync_date_month {\r
+               1       { $combobox configure -textvariable sync_date_day -values $values_31 -postcommand {check_date }}\r
+                       \r
+               3       {$combobox configure -textvariable sync_date_day -values $values_31 -postcommand {check_date }}\r
+                       \r
+               5       {$combobox configure -textvariable sync_date_day -values $values_31 -postcommand {check_date }}\r
+                       \r
+               7       { $combobox configure -textvariable sync_date_day -values $values_31 -postcommand {check_date }}\r
+                       \r
+               8       { $combobox configure -textvariable sync_date_day -values $values_31 -postcommand {check_date }}\r
+                       \r
+               10  {$combobox configure -textvariable sync_date_day -values $values_31 -postcommand {check_date }}\r
+                       \r
+               12      { $combobox configure -textvariable sync_date_day -values $values_31 -postcommand {check_date }}\r
+\r
+               4       { $combobox configure -textvariable sync_date_day -values $values_30 -postcommand {check_date }}\r
+               6       { $combobox configure -textvariable sync_date_day -values $values_30 -postcommand {check_date }}\r
+               9       { $combobox configure -textvariable sync_date_day -values $values_30 -postcommand {check_date }\r
+                       set sync_date_day $actual_day   \r
+                       }\r
+               11      { $combobox configure -textvariable sync_date_day -values $values_30 -postcommand {check_date }}\r
+               \r
+      ## A year that is divisible by 4 is a leap year. (Y % 4) == 0\r
+      ## Exception to rule 1: a year that is divisible by 100 is not a leap year. (Y % 100) != 0\r
+      ## Exception to rule 2: a year that is divisible by 400 is a leap year. (Y % 400) == 0 \r
+               2       {\r
+                       if {( [expr $sync_date_year%4] == 0) && ([ expr $sync_date_year%100 != 0] || [expr $sync_date_year%400 == 0 ])} { $combobox configure -textvariable sync_date_day -values $values_29 -postcommand {check_date } } \\r
+                               else { $combobox configure -textvariable sync_date_day -values $values_28 -postcommand {check_date } }          \r
+                       }\r
+       }\r
+\r
+       # Set boundaries for variables  \r
+       if { $sync_date_month   >       12 ||   $sync_date_month        <       0       } { set sync_date_month 1}\r
+       if { $sync_date_day             <       0  ||   $sync_date_day          >       31      } { set sync_date_day   1}\r
+       if { $sync_date_year    <       0 } { set sync_date_year        2010 }\r
+       if {[string is digit -strict $sync_date_year]==0} { set sync_date_year  2010}\r
+}\r
+\r
+proc check_altitude {} {\r
+       global w\r
+       global sync_altitude_24 sync_altitude_12\r
+       global sync_use_metric_units\r
+       \r
+       if { $sync_use_metric_units == 1 } {\r
+         if {[string is digit -strict $sync_altitude_24]==0} { set sync_altitude_24 430}       \r
+       } else {\r
+         if {[string is digit -strict $sync_altitude_12]==0} { set sync_altitude_12 1411}\r
+       }\r
+}\r
+\r
+proc check_temperature {} {\r
+       global w\r
+       global sync_temperature_24 sync_temperature_12\r
+       global sync_use_metric_units\r
+       if { $sync_use_metric_units == 1 } {\r
+         if {[string is digit -strict $sync_temperature_24]==0} { set sync_temperature_24 22}  \r
+       } else {\r
+         if {[string is digit -strict $sync_temperature_12]==0} { set sync_temperature_12 71}  \r
+       }               \r
+}\r
+\r
+proc check_data_log_interval {} {\r
+       global w\r
+       global sync_data_log_interval\r
+       \r
+       if {[string is digit -strict $sync_data_log_interval]==0} { set sync_data_log_interval 5}       \r
+}\r
+\r
+
+# Load variables from ini file\r
+load_ini_file\r
+\r
+# Reconfigure display\r
+if { $sync_use_metric_units == 1 } {\r
+  switch_to_metric_units\r
+} else {\r
+  switch_to_imperial_units\r
+}\r
+\r
+# Exit program\r
+if { $exit_prog == 1 } { exitpgm }\r
+\r
+\r
+# ----------------------------------------------------------------------------------------\r
+# Periodic functions  --------------------------------------------------------------------\r
+\r
+proc every {ms body} {eval $body; after $ms [info level 0]}
+every 10   { call_wbsl_funcs }
+every 2500 { wbsl_simple_timer }\r
diff --git a/chronos-ti/Control Center/Chronos Data Logger/eZ430-Chronos_driver.tcl b/chronos-ti/Control Center/Chronos Data Logger/eZ430-Chronos_driver.tcl
new file mode 100755 (executable)
index 0000000..45e5f74
--- /dev/null
@@ -0,0 +1,358 @@
+set vcp            0
+set vcp_reply     ""
+set vcp_len       0
+set vcp_pending           0
+set vcp_debug     0
+if { $vcp_debug == 1 } { 
+  set fh [open "log.txt" w] 
+} else {
+  set fh 0
+}
+\r
+# Send string through UART  \r
+proc SendCmd { command } {\r
+  global vcp vcp_reply vcp_len vcp_pending vcp_debug fh
+
+  set timeout 0
+  while { $vcp_pending == 1 } {
+    if { $vcp_debug == 1  } { puts $fh "Waiting for reply. Delaying command $command." }
+    after 5
+    update
+    incr timeout
+    if {$timeout > 100} { 
+      set vcp_pending 0 
+      if { $vcp_debug == 1  } { puts $fh "Terminating delay loop." }
+    }
+  }
+  update
+  if { $vcp_debug == 1  } { puts $fh "Sending $command" }
+  
+  # Send command 
+  set vcp_reply ""
+  set vcp_pending 1
+  set len [string length $command]\r
+  set vcp_len [expr $len / 2]
+  for {set i 0} {$i < $len} {incr i} {  \r
+    set hex 0x[string range $command $i [expr $i+1]]\r
+    set letter [format %c $hex]\r
+    puts -nonewline $vcp $letter\r
+    incr i\r
+  }
+  puts -nonewline $vcp "\n"\r
+  flush $vcp
+}\r
+
+# Get UART buffer content \r
+proc GetReply {} {
+  global vcp vcp_reply vcp_len vcp_pending vcp_debug fh\r
+
+  set cap [read $vcp]
+  binary scan $cap cu* valueList\r
+  foreach value $valueList {\r
+    append vcp_reply [format "0x%02X " $value]\r
+  }
+  if { $vcp_debug == 1  } { puts $fh "Received: $vcp_reply" }
+  flush $vcp
+  set vcp_pending 0
+}
+
+# Open COM port\r
+proc BM_OpenCOM { port baudrate timeout dts rts } {\r
+  global vcp\r
+  catch { open $port w+ } vcp\r
+  if { [string first "couldn't" $vcp] != -1 } {\r
+    set vcp 0\r
+  } else {
+    fconfigure $vcp -mode 115200,n,8,1 \r
+    fconfigure $vcp -blocking 0\r
+    fconfigure $vcp -buffering full -encoding binary -translation binary\r
+    fileevent $vcp readable [list GetReply]
+  }\r
+}
+
+\r
+# Close COM port\r
+proc BM_CloseCOM {} {\r
+  global vcp fh\r
+  close $vcp
+  flush $fh
+  close $fh\r
+}\r
+\r
+# Reset hardware\r
+proc BM_Reset {} {\r
+  SendCmd "FF0103"
+  after 15\r
+}\r
+\r
+# Set BlueRobin TX ID\r
+proc BM_BR_SetID { id } {\r
+  SendCmd "FF0307[format %02X [expr $id & 0xFF]][format %02X [expr ($id>>8) & 0xFF]][format %02X [expr ($id>>16) & 0xFF]][format %02X [expr ($id>>24) & 0xFF]]"
+  after 15\r
+}\r
+\r
+# Start BlueRobin TX\r
+proc BM_BR_Start {} {\r
+  SendCmd "FF0203"
+  after 15\r
+}\r
+\r
+# Stop BlueRobin TX\r
+proc BM_BR_Stop {} {\r
+  SendCmd "FF0603"
+  after 15\r
+}\r
+\r
+\r
+# Set BlueRobin heart rate value\r
+proc BM_BR_SetHeartrate { hr } {\r
+  SendCmd "FF0504[format %02X [expr $hr & 0xFF]]"
+  after 15\r
+}\r
+\r
+# Set BlueRobin speed and distance value\r
+proc BM_BR_SetSpeed { spd dist } {\r
+  SendCmd "FF0A06[format %02X [expr $spd & 0xFF]][format %02X [expr $dist & 0xFF]][format %02X [expr ($dist>>8) & 0xFF]]"
+  after 15\r
+}\r
+\r
+# Start SimpliciTI stack\r
+proc BM_SPL_Start {} {\r
+  SendCmd "FF0703"
+  after 15
+}\r
+\r
+# Stop SimpliciTI stack\r
+proc BM_SPL_Stop {} {\r
+  SendCmd "FF0903"
+  after 15
+}\r
+\r
+# Get 4 bytes payload from SimpliciTI stack\r
+proc BM_SPL_GetData {} {\r
+  global vcp_reply\r
+
+  SendCmd "FF080700000000"
+  after 15
+  update
+  
+  while { [llength $vcp_reply] <= 6 } { 
+    lappend vcp_reply 0x00
+  }
+
+  return [format "0x%02X" [expr ([lindex $vcp_reply 6]<<24) + ([lindex $vcp_reply 5]<<16) + ([lindex $vcp_reply 4]<<8) + [lindex $vcp_reply 3]]]\r
+}\r
+\r
+\r
+# Get HW status\r
+proc BM_GetStatus {} {\r
+  global vcp_reply vcp_pending vcp_debug fh\r
+  SendCmd "FF000400"
+  after 15
+  update\r
+  if { $vcp_debug == 1  } { puts $fh "BM_GetStatus = [lindex $vcp_reply 3]" }
+  return [lindex $vcp_reply 3]\r
+}
+\r
+\r
+# Simulate mouse clicks\r
+proc BM_SetMouseClick { btn } {\r
+  global w\r
+
+  set X [expr [winfo pointerx .]]
+  set Y [expr [winfo pointery .]]
+  set path [winfo containing $X $Y]
+\r
+  switch $btn {\r
+    1  { exec xdotool mousedown 1
+         after 10 
+         exec xdotool mouseup 1 }\r
+    \r
+    2  { exec xdotool mousedown 3
+         after 10 
+         exec xdotool mouseup 3 }\r
+    \r
+    3  { exec xdotool mousedown 1
+         after 10 
+         exec xdotool mouseup 1
+         after 10
+         exec xdotool mousedown 1
+         after 10 
+         exec xdotool mouseup 1 }\r
+  }\r
+}\r
+\r
+# Simulate complex key events\r
+proc BM_SetKey { keysymbol win alt ctrl shift } {\r
+  global w\r
+\r
+  # Press keys and release them immediately\r
+  if { $win == 1 }   { exec xdotool keydown "Super_L" }\r
+  if { $alt == 1 }   { exec xdotool keydown "Alt_L" }\r
+  if { $ctrl == 1 }  { exec xdotool keydown "Control_L" }\r
+  if { $shift == 1 } { exec xdotool keydown "Shift_L" }\r
+  if { $keysymbol > 0 } { exec xdotool keydown $keysymbol }\r
+  after 10\r
+  if { $keysymbol > 0 } { exec xdotool keyup $keysymbol }\r
+  if { $shift == 1 } { exec xdotool keyup "Shift_L" }\r
+  if { $ctrl == 1 }  { exec xdotool keyup "Control_L" }\r
+  if { $alt == 1 }   { exec xdotool keyup "Alt_L" }\r
+  if { $win == 1 }   { exec xdotool keyup "Super_L" }\r
+}\r
+\r
+\r
+# Start SimpliciTI sync mode\r
+proc BM_SYNC_Start {} {\r
+  SndCmd "FF3003"\r
+  after 15
+}\r
+\r
+# Send sync command\r
+proc BM_SYNC_SendCommand { ldata } {\r
+\r
+  # take data from list and append it to command\r
+  set str "FF3116"\r
+  set i 0\r
+  foreach value $ldata {\r
+     append str [format "%02X" $value]\r
+     incr i\r
+  }\r
+\r
+  # byte stuff with 0x00 until 19 bytes are set\r
+  for {set j $i} {$j < 19} {incr j} {  \r
+   append str "00"\r
+  }\r
+\r
+  SendCmd $str
+  after 15\r
+}\r
+\r
+# Get sync buffer\r
+proc BM_SYNC_ReadBuffer {} {\r
+  global vcp_reply
+
+  SendCmd "FF3303"
+  after 15
+  update
+  return [lrange $vcp_reply 3 22]\r
+}\r
+\r
+# Get sync buffer state (empty/full)\r
+proc BM_SYNC_GetBufferStatus {} {\r
+  global vcp_reply
+  SendCmd "FF320400"
+  after 15
+  update
+  return [lindex $vcp_reply 3]\r
+}\r
+
+
+# Get HW status\r
+proc BM_GetStatus1 {} {\r
+  global vcp_reply vcp_pending vcp_debug fh\r
+  SendCmd "FF000400"
+  while { $vcp_pending == 1 } { update }
+  set reply [lindex $vcp_reply 3]
+  if { $vcp_debug == 1  } { puts $fh "BM_GetStatus1 = $reply" }
+  return $reply\r
+}
+
+# BM_WBSL_Start\r
+proc BM_WBSL_Start { } {\r
+  SendCmd "FF4003"
+  after 15
+}\r
+\r
+# BM_WBSL_Stop\r
+proc BM_WBSL_Stop { } {\r
+  SendCmd "FF4603"
+  after 15\r
+}
+
+# BM_WBSL_GetMaxPayload\r
+proc BM_WBSL_GetMaxPayload { } {\r
+  global vcp_reply vcp_pending vcp_debug fh
+
+  SendCmd "FF490400"
+  while { $vcp_pending == 1 } { update }
+  if { $vcp_debug == 1  } { puts $fh "BM_WBSL_GetMaxPayload = [lindex $vcp_reply 3]" }\r
+  return [lindex $vcp_reply 3]\r
+}
+
+# BM_WBSL_GetPacketStatus\r
+proc BM_WBSL_GetPacketStatus { } {\r
+  global vcp_reply vcp_pending vcp_debug fh
+
+  SendCmd "FF480400"
+  while { $vcp_pending == 1 } { update }\r
+  if { $vcp_debug == 1  } { puts $fh "BM_WBSL_GetPacketStatus = [lindex $vcp_reply 3]" }
+  return [lindex $vcp_reply 3]\r
+}
+
+# BM_WBSL_GetStatus\r
+proc BM_WBSL_GetStatus { } {\r
+  global vcp_reply vcp_pending vcp_debug fh\r
+  
+  SendCmd "FF410400"\r
+  while { $vcp_pending == 1 } { update }\r
+  if { $vcp_debug == 1  } { puts $fh "BM_WBSL_GetStatus = [lindex $vcp_reply 3]" }
+  return [lindex $vcp_reply 3]\r
+}\r
+
+# BM_WBSL_SendData\r
+proc BM_WBSL_SendData { data_or_info data } {\r
+  global vcp_reply vcp_pending vcp_debug fh
+
+  if { $data_or_info == 0 } {
+
+    set byte0 "00"
+    set byte1 [format %02X [expr $data&0xFF]]
+    set byte2 [format %02X [expr $data>>8]]
+
+    set str "FF4706$byte0$byte1$byte2"\r
+    SendCmd $str
+    return 3
+
+  } else {
+
+    # Send several packets until data has been transmitted
+    if { $data_or_info == 1 } {  
+      set byte0 "01" 
+    } else {
+      set byte0 "02" 
+    }
+
+    # Convert ASCII data string to hex values
+    set len 0
+    set data_to_send ""
+    binary scan $data cu* valueList\r
+    foreach value $valueList {\r
+      append data_to_send [format "%02X" $value]
+      incr len\r
+    }
+
+    set len1  [expr $len + 2]
+    set byte1 [format %02X [expr $len&0xFF]]
+    set data_to_send "$byte0$byte1$data_to_send"
+    
+    if { $vcp_debug == 1  } { puts $fh "\nBM_WBSL_SendData $data_to_send\n" }
+
+    while { $len1 > 28 } {
+      # Send 28 bytes 
+      SendCmd "FF471F[string range $data_to_send 0 55]"
+      # Cut away data that has been sent
+      set data_to_send [string range $data_to_send 56 [string length $data_to_send]]
+      set len1 [expr $len1-28]
+      update
+    }
+
+    # Send last bytes 
+    set len1 [expr [string length $data_to_send]/2 + 3]
+    SendCmd "FF47[format %02X $len1]$data_to_send"
+    update
+    return $len1
+  } \r
+}
+
+
diff --git a/chronos-ti/Control Center/Chronos Data Logger/ez430-Chronos-DL.ini b/chronos-ti/Control Center/Chronos Data Logger/ez430-Chronos-DL.ini
new file mode 100755 (executable)
index 0000000..498517c
--- /dev/null
@@ -0,0 +1 @@
+sync_use_metric_units=1\r
diff --git a/chronos-ti/Control Center/Chronos Data Logger/ram_based_updater.txt b/chronos-ti/Control Center/Chronos Data Logger/ram_based_updater.txt
new file mode 100755 (executable)
index 0000000..0e610cb
--- /dev/null
@@ -0,0 +1,180 @@
+@1D30\r
+31 40 FE 2B 3C 40 88 29 3D 40 1C 01 B0 13 78 27\r
+3C 40 52 29 3D 40 84 1E 3E 40 36 00 B0 13 18 28\r
+B0 13 48 26 B0 13 20 28 20 20 00 20 20 20 20 20\r
+20 00 30 30 00 F5 60 B6 F2 63 D3 D7 70 F7 F3 00\r
+00 00 00 00 86 00 77 C7 95 E6 97 17 F3 67 05 F0\r
+87 85 75 46 C6 37 F5 06 D3 87 C4 C4 02 67 E3 B6\r
+10 08 08 08 F7 F7 F7 F7 20 40 04 80 7F 7F 7F 7F\r
+7F 10 01 80 30 30 30 31 30 32 30 33 30 34 30 35\r
+30 36 30 37 30 38 30 39 31 30 31 31 31 32 31 33\r
+31 34 31 35 31 36 31 37 31 38 31 39 32 30 32 31\r
+32 32 32 33 32 34 32 35 32 36 32 37 32 38 32 39\r
+33 30 33 31 33 32 33 33 33 34 33 35 33 36 33 37\r
+33 38 33 39 34 30 34 31 34 32 34 33 34 34 34 35\r
+34 36 34 37 34 38 34 39 35 30 35 31 35 32 35 33\r
+35 34 35 35 35 36 35 37 35 38 35 39 36 30 36 31\r
+36 32 36 33 36 34 36 35 36 36 36 37 36 38 36 39\r
+37 30 37 31 37 32 37 33 37 34 37 35 37 36 37 37\r
+37 38 37 39 38 30 38 31 38 32 38 33 38 34 38 35\r
+38 36 38 37 38 38 38 39 39 30 39 31 39 32 39 33\r
+39 34 39 35 39 36 39 37 39 38 39 39 20 20 00 20\r
+20 44 4F 4E 45 00 20 20 46 41 49 4C 00 20 52 46\r
+42 53 4C 00 24 0A 24 0A 25 0A 26 0A 21 0A 22 0A\r
+23 0A 25 0A 20 0A 20 0A 24 0A 2B 0A 2B 0A 2A 0A\r
+29 0A 28 0A 27 0A 20 0A 24 0A 28 0A 07 00 AD 00\r
+BA 5E BA 11 05 00 AD 00 00 00 1B 15 7A 40 03 00\r
+4B 4A C2 93 A3 2A 76 20 B0 13 94 26 82 43 34 0F\r
+B0 13 18 27 B0 13 D4 27 6D 43 5C 43 B0 13 CE 26\r
+6D 43 6C 43 B0 13 CE 26 6D 43 B0 13 FC 27 5D 43\r
+B0 13 12 28 D2 43 88 29 D2 43 9D 2A B0 13 BE 24\r
+5C 93 3D 20 E2 43 9D 2A 4D 4A 5C 43 B0 13 CE 26\r
+4D 4A 6C 43 B0 13 CE 26 4D 4A 4C 4A B0 13 CE 26\r
+B0 13 CC 1F 92 92 94 2A 96 2A 03 28 C2 93 A3 2A\r
+26 20 B0 13 B2 20 5C 93 17 20 F2 90 64 00 A0 2A\r
+0A 2C 4F 43 6E 43 5C 42 A0 2A 0D 43 B0 13 76 24\r
+0D 4C 5C 43 07 3C B0 13 F2 27 B0 13 10 28 3D 40\r
+6F 1E 6C 43 B0 13 32 25 F2 90 20 00 9D 2A 07 24\r
+92 92 94 2A 96 2A D6 2B C2 93 A3 2A DA 27 6D 42\r
+5C 43 B0 13 CE 26 6D 42 6C 43 B0 13 CE 26 6D 42\r
+B0 13 FC 27 B0 13 10 28 C2 43 88 29 92 92 94 2A\r
+96 2A 0A 28 C2 93 A3 2A 07 24 B2 40 04 A5 20 01\r
+7B 53 87 23 1A 17 10 01 4B 93 FA 23 B0 13 F2 27\r
+3D 40 76 1E 6C 43 B0 13 32 25 F4 3F B0 13 A0 20\r
+B2 40 00 A5 44 01 B0 13 A0 20 B2 40 06 A5 40 01\r
+C2 43 E0 FF B0 13 A0 20 B2 40 10 A5 44 01 10 01\r
+3B 15 82 93 38 0F B2 C0 00 02 32 0F E2 93 9E 2A\r
+32 20 3E 40 02 01 0D 43 3C 40 90 29 B0 13 54 27\r
+7A 40 3B 00 B0 13 78 20 4C 93 25 24 7C 40 3F 00\r
+B0 13 F2 25 C2 4C 90 29 39 40 91 29 6C 53 C2 4C\r
+9C 2A 7B 90 41 00 05 28 B0 13 02 27 B0 13 8A 27\r
+12 3C E2 93 9C 2A 0B 28 B0 13 78 20 6B 93 F9 2B\r
+B0 13 6A 20 19 53 F2 53 9C 2A 7B 53 F7 3F B0 13\r
+6A 20 D2 43 9F 2A 38 17 10 01 7C 40 3F 00 B0 13\r
+F2 25 C9 4C 00 00 10 01 4C 4A B0 13 F2 25 4B 4C\r
+48 4B 4C 4A B0 13 F2 25 4B 4C 48 9C F9 23 10 01\r
+B0 13 A0 20 8C 4D 00 00 B0 13 A0 20 5C 43 10 01\r
+92 B3 44 01 FD 2F 10 01 B0 13 A0 20 CC 4D 00 00\r
+F3 3F 1B 15 4A 43 D2 53 A2 2A F2 90 05 00 A2 2A\r
+05 28 F2 40 20 00 9D 2A 4C 43 5F 3C B0 13 98 25\r
+3B 40 96 2A D2 93 9F 2A 07 24 C2 93 A3 2A 04 24\r
+2D 4B 3D 53 5C 43 4E 3C D2 93 9F 2A 4D 20 C2 43\r
+9F 2A 5F 42 90 29 5F 4F 92 29 7F F0 80 00 D2 92\r
+A1 2A 92 29 41 20 5E 42 93 29 C2 93 A3 2A 14 20\r
+4F 93 10 24 C2 43 A2 2A 5F 42 94 29 47 18 0F 5F\r
+0E 5F 82 4E 94 2A 3D 43 5C 43 B0 13 FC 24 D2 43\r
+A3 2A 2A 3C 3D 43 25 3C 4F 93 22 24 5F 42 94 29\r
+47 18 0E 5E 0F 5E 2F 9B CB 23 B0 13 9A 22 5C 93\r
+17 20 C2 43 A2 2A 2D 4B 5C 43 B0 13 FC 24 92 53\r
+96 2A 2C 4B 5C 06 0F 4C 5C 0A 0F 5C 0C 5C 0C 5F\r
+1E 42 94 2A B0 13 B6 26 C2 4C A0 2A 5A 43 04 3C\r
+2D 4B 4C 43 B0 13 FC 24 4C 4A 1A 17 10 01 1B 15\r
+0B 4C 4A 4D B0 13 02 27 4E 4A 0D 4B 7C 40 7F 00\r
+B0 13 68 25 6A 42 07 3C 3C 40 0F 00 B0 13 E8 26\r
+B0 13 E8 27 7A 53 7C 40 34 00 B0 13 14 22 A2 B3\r
+30 0F FD 2B 92 C3 32 0F 7C 40 35 00 B0 13 14 22\r
+3C 40 19 00 B0 13 E8 26 B0 13 E8 27 92 B3 32 0F\r
+0A 28 92 C3 32 0F 92 B3 30 0F FD 2B 7C 40 3B 00\r
+B0 13 14 22 0D 3C 7C 40 36 00 B0 13 14 22 7C B0\r
+70 00 F9 23 7C 40 3A 00 B0 13 14 22 4A 93 CC 23\r
+1A 17 10 01 3B 15 4B 4C 4C 43 7B 90 BD 00 06 24\r
+7B 90 31 00 38 28 7B 90 3D 00 35 2C 08 42 32 C2\r
+03 43 B2 C0 40 00 02 0F B0 13 06 28 7B 90 31 00\r
+25 28 7B 90 3D 00 22 2C B0 13 F2 25 4A 4C 7D 40\r
+29 00 4C 43 B0 13 72 26 C2 4B 11 0F A2 B2 30 0F\r
+10 28 7B 90 32 00 0D 24 7B 90 39 00 0A 24 7B 90\r
+38 00 07 24 A2 B2 30 0F FD 2F 3F 40 C1 0C 3F 53\r
+FE 2F 4D 4A 4C 43 B0 13 72 26 02 3C C2 4B 11 0F\r
+5C 42 21 0F 02 48 38 17 10 01 2A 15 5C 43 5A 42\r
+90 29 3A 50 FB FF 7D 40 06 00 D2 93 95 29 0B 20\r
+5E 42 96 29 47 18 0E 5E 5F 42 97 29 0E 5F 82 4E\r
+92 2A 2A 83 7D 42 B0 13 BA 27 0A 93 1A 24 1C 42\r
+92 2A 3C 90 00 80 09 28 08 4C 09 43 08 5A 09 63\r
+19 93 05 28 02 20 18 93 02 28 4C 43 0A 3C 4E 4D\r
+3E 50 90 29 4D 4A B0 13 76 23 5C 93 02 20 82 5A\r
+92 2A B2 40 00 A5 40 01 B2 40 10 A5 44 01 28 17\r
+10 01 0A 12 6C 92 2D 28 7C 90 14 00 2A 2C 7D 90\r
+30 00 07 28 7D 90 5B 00 09 2C 4D 4D 5A 4D 35 1D\r
+06 3C 7D 90 2D 00 02 20 6A 43 01 3C 4A 43 7C 90\r
+0B 00 11 28 4F 4A 43 19 4F 10 43 18 4A 5A 4A DF\r
+7C 90 0B 00 08 20 7D 90 31 00 03 24 7D 90 4C 00\r
+02 20 7A 40 80 00 4C 4C 4F 4E 5E 4C 90 1D B0 13\r
+C8 27 3A 41 10 01 5B 15 08 4C 09 4E 5C 43 0A 48\r
+0B 43 0E 48 0F 43 46 4D 0A 56 0B 63 02 3C 1E 53\r
+0F 63 0F 9B 03 28 18 20 0E 9A 16 2C 0C 4E 58 B3\r
+08 20 06 4A 07 4B 36 53 37 63 0E 96 06 20 0F 97\r
+04 20 7D 49 B0 13 A8 20 05 3C 3D 49 B0 13 90 20\r
+1E 53 0F 63 5C 93 E3 27 56 17 10 01 F2 D0 03 00\r
+4A 02 B2 F0 3E FF 6C 01 B2 D0 0C 00 6C 01 82 43\r
+66 01 B2 40 44 00 68 01 32 D0 40 00 82 43 60 01\r
+B2 40 50 00 62 01 B2 40 6E 11 64 01 32 C0 40 00\r
+3F 40 22 F4 03 43 0E 43 3F 53 3E 63 FD 2F B2 F0\r
+F0 FF 6E 01 A2 C3 02 01 A2 B3 02 01 F8 2F 80 00\r
+1E 26 7E E3 5F 93 05 20 6E FC 4E DD CC 4E 00 00\r
+10 01 4F 93 03 20 CC FE 00 00 10 01 6F 93 09 20\r
+CC FE 00 00 CC FE 20 00 CC DD 00 00 CC DD 20 00\r
+10 01 7F 90 03 00 08 20 4F 4E 6F FC 4F DD CC 4F\r
+00 00 CC FE 20 00 10 01 6F 92 04 20 CC FE 00 00\r
+CC FE 20 00 10 01 3B 15 0A 4C 0B 4D 48 4E 39 40\r
+98 2A 2E 43 3D 40 62 1D 0C 49 B0 13 66 27 48 93\r
+13 24 78 90 03 00 10 2C 0B 93 0E 20 3A 90 64 00\r
+0B 2C 4E 48 4D 48 3D E3 1D 53 0A 5A 0D 5A 3D 50\r
+A6 1D 0C 49 B0 13 66 27 0C 49 38 17 10 01 0A 12\r
+4A 43 7D 42 3C 40 7A 29 B0 13 8E 21 B0 13 98 25\r
+D2 93 9F 2A 10 20 C2 43 9F 2A D2 93 93 29 05 20\r
+5F 42 90 29 CF 93 92 29 02 38 4C 43 05 3C D2 42\r
+92 29 A1 2A 5A 43 4C 4A 3A 41 10 01 4E 4C 3C 40\r
+09 00 B0 13 E8 26 B0 13 E8 27 D2 42 A1 2A 83 29\r
+C2 4E 85 29 0F 4D 47 19 0F 10 7F F0 7F 00 C2 4F\r
+86 29 C2 4D 87 29 7D 40 06 00 3C 40 82 29 80 00\r
+8E 21 3B 15 0A 4D 6C 93 05 20 7B 40 0B 00 78 40\r
+06 00 03 3C 7B 40 06 00 68 43 49 43 09 3C 5E 43\r
+0F 4A 0F 59 6D 4F 4C 4B 4C 59 B0 13 12 23 59 53\r
+49 98 F5 2B 38 17 10 01 0A 12 0A 42 B0 13 40 27\r
+6F 4D 0C 5F 82 4C 10 0F 5F 43 07 3C B0 13 DE 27\r
+0C 4D 0C 5F E2 4C 10 0F 5F 53 4F 9E F7 2B C2 93\r
+20 0F 02 4A 3A 41 10 01 B0 13 8A 27 3C 40 00 40\r
+B0 13 E8 26 06 3C B2 B0 00 02 32 0F 02 28 B0 13\r
+F0 1F 92 B3 44 03 03 2C D2 93 9F 2A F4 23 B0 13\r
+9A 27 80 00 02 27 21 83 82 43 32 0F 7C 40 30 00\r
+B0 13 14 22 81 43 00 00 02 3C 91 53 00 00 B1 90\r
+64 00 00 00 FA 2B B0 13 AA 27 82 43 06 0F 21 53\r
+10 01 0F 42 32 C2 03 43 B0 13 06 28 7C 90 2F 00\r
+03 28 7C 90 3E 00 03 20 7C D0 80 00 02 3C 7C D0\r
+C0 00 C2 4C 13 0F 5C 42 20 0F 02 4F 10 01 B2 D0\r
+06 00 06 0A B2 40 1D 7B 00 0A B2 40 ED 00 04 0A\r
+F2 D0 E0 00 4A 02 F2 D0 E0 00 44 02 B2 43 0A 0A\r
+B2 40 FF 00 0C 0A 10 01 B2 40 80 5A 5C 01 32 C2\r
+03 43 B0 13 CC 23 B0 13 D4 27 3C 40 33 73 B0 13\r
+E8 26 B0 13 E8 27 B0 13 BA 1E B2 40 04 A5 20 01\r
+F4 3F 21 83 0E 42 B0 13 40 27 4D 4D 0C 5D 82 4C\r
+10 0F B0 13 DE 27 5F 42 20 0F 81 4F 00 00 02 4E\r
+21 53 10 01 C2 43 88 29 C2 43 A0 2A 82 43 96 2A\r
+82 43 94 2A C2 43 A2 2A C2 43 A3 2A 82 43 32 0F\r
+10 01 7C F3 7E F3 0F 4E 0D 4C 0E 43 1C 43 0D 5D\r
+0E 6E 0E 9F 01 28 0E 8F 0C 6C F9 2B 10 01 0A 12\r
+7C 90 14 00 07 2C 4C 4C 5A 4C 90 1D 4F 4D 4E 4A\r
+B0 13 C8 27 3A 41 10 01 3C 90 00 80 02 28 3C 40\r
+FF 7F 82 4C 54 03 92 C3 44 03 B2 D0 24 01 40 03\r
+10 01 D2 43 9E 2A B0 13 AA 27 7C 40 3A 00 B0 13\r
+14 22 82 43 32 0F 10 01 3D 40 58 1D 5C 43 B0 13\r
+32 25 3D 40 5B 1D 6C 43 80 00 32 25 0A 12 21 83\r
+0A 4C 81 4A 00 00 0D 41 5C 43 B0 13 24 28 F9 3F\r
+32 C2 03 43 B0 13 06 28 4C 4C 3C D0 40 00 47 18\r
+0C 5C 10 01 0F 4C 04 3C CF 4D 00 00 1F 53 3E 53\r
+0E 93 FA 23 10 01 0F 4C 04 3C FF 4D 00 00 1F 53\r
+3E 53 0E 93 FA 23 10 01 0F 4C 0F 5D 03 3C CC 43\r
+00 00 1C 53 0C 9F FB 23 10 01 82 43 32 0F E2 43\r
+9E 2A 7C 40 34 00 80 00 14 22 92 C3 44 03 B2 F0\r
+CF FF 40 03 82 43 50 03 10 01 7C 40 36 00 B0 13\r
+14 22 7C B0 70 00 F9 23 10 01 B2 40 00 A5 44 01\r
+B2 40 40 A5 40 01 10 01 4D 4A 0C 5C 1C 4C 52 29\r
+80 00 22 24 3D 40 7D 1E 6C 43 80 00 32 25 B2 B0\r
+20 00 02 0F FC 2B 10 01 92 B3 44 03 FD 2B 80 00\r
+9A 27 3D 40 6C 1E 5C 43 80 00 32 25 4C 4A B0 13\r
+CE 26 80 00 C6 25 B2 B0 10 00 02 0F FC 2B 10 01\r
+4D 43 4C 43 80 00 CE 26 80 00 66 27 80 00 2C 27\r
+80 00 1C 28 10 01 \r
+@FFFE\r
+30 1D \r
+q\r
diff --git a/chronos-ti/Control Center/readme.txt b/chronos-ti/Control Center/readme.txt
new file mode 100755 (executable)
index 0000000..5835bfb
--- /dev/null
@@ -0,0 +1,37 @@
+1. General notes\r
+\r
+The eZ430-Chronos graphical user interface and serial port driver has been developed and \r
+tested under Ubuntu 8.10.\r
+\r
+The eZ430-Chronos graphical user interface is based on TCL/Tk. \r
+\r
+If your Linux distribution does not already include TCL/Tk, you can \r
+install it with easily the apt-get command:\r
+      \r
+      sudo apt-get install tcl8.5\r
+      sudo apt-get install tk8.5\r
+      \r
+In order to generate keyboard events and mouse clicks through the watch buttons, \r
+the tool xdotool is called from the script. Please install it with the apt-get command:\r
+\r
+      sudo apt-get install xdotool\r
+            \r
+\r
+2. Operating instructions\r
+\r
+  - Plug in the RF Access Point into a USB port\r
+\r
+  - Check the /dev directory. A new entry should appear after some seconds ("/dev/ttyACM0")\r
+\r
+  - If you see that the RF Access Point gets assigned to a different device \r
+    (e.g. ttyACM1), either remove the serial device that occupy this slot (e.g. a modem), \r
+    or change the script file variable "com".\r
+    \r
+  - Make sure that the script file is executable\r
+  \r
+      > chmod u+x ./eZ430-Chronos_CC_1_2.tcl \r
+\r
+  - Now start the script by simply executing it from a terminal window, e.g.\r
+  \r
+      > ./eZ430-Chronos_CC_1_2.tcl\r
+      
\ No newline at end of file
diff --git a/chronos-ti/Documentation/Schematics, Layout & BOM/eZ430-Chronos Access Point/eZ430-Chronos Access Point, BOM, 433 V1.0b.pdf b/chronos-ti/Documentation/Schematics, Layout & BOM/eZ430-Chronos Access Point/eZ430-Chronos Access Point, BOM, 433 V1.0b.pdf
new file mode 100755 (executable)
index 0000000..2e62f43
Binary files /dev/null and b/chronos-ti/Documentation/Schematics, Layout & BOM/eZ430-Chronos Access Point/eZ430-Chronos Access Point, BOM, 433 V1.0b.pdf differ
diff --git a/chronos-ti/Documentation/Schematics, Layout & BOM/eZ430-Chronos Access Point/eZ430-Chronos Access Point, BOM, 868 V1.3d.pdf b/chronos-ti/Documentation/Schematics, Layout & BOM/eZ430-Chronos Access Point/eZ430-Chronos Access Point, BOM, 868 V1.3d.pdf
new file mode 100755 (executable)
index 0000000..3cff5b4
Binary files /dev/null and b/chronos-ti/Documentation/Schematics, Layout & BOM/eZ430-Chronos Access Point/eZ430-Chronos Access Point, BOM, 868 V1.3d.pdf differ
diff --git a/chronos-ti/Documentation/Schematics, Layout & BOM/eZ430-Chronos Access Point/eZ430-Chronos Access Point, BOM, 915 V1.3d.pdf b/chronos-ti/Documentation/Schematics, Layout & BOM/eZ430-Chronos Access Point/eZ430-Chronos Access Point, BOM, 915 V1.3d.pdf
new file mode 100755 (executable)
index 0000000..0d581d0
Binary files /dev/null and b/chronos-ti/Documentation/Schematics, Layout & BOM/eZ430-Chronos Access Point/eZ430-Chronos Access Point, BOM, 915 V1.3d.pdf differ
diff --git a/chronos-ti/Documentation/Schematics, Layout & BOM/eZ430-Chronos Access Point/eZ430-Chronos Access Point, Gerbers, 433 V1.0.zip b/chronos-ti/Documentation/Schematics, Layout & BOM/eZ430-Chronos Access Point/eZ430-Chronos Access Point, Gerbers, 433 V1.0.zip
new file mode 100755 (executable)
index 0000000..34a9884
Binary files /dev/null and b/chronos-ti/Documentation/Schematics, Layout & BOM/eZ430-Chronos Access Point/eZ430-Chronos Access Point, Gerbers, 433 V1.0.zip differ
diff --git a/chronos-ti/Documentation/Schematics, Layout & BOM/eZ430-Chronos Access Point/eZ430-Chronos Access Point, Gerbers, 868, 915 V1.3d.zip b/chronos-ti/Documentation/Schematics, Layout & BOM/eZ430-Chronos Access Point/eZ430-Chronos Access Point, Gerbers, 868, 915 V1.3d.zip
new file mode 100755 (executable)
index 0000000..099d726
Binary files /dev/null and b/chronos-ti/Documentation/Schematics, Layout & BOM/eZ430-Chronos Access Point/eZ430-Chronos Access Point, Gerbers, 868, 915 V1.3d.zip differ
diff --git a/chronos-ti/Documentation/Schematics, Layout & BOM/eZ430-Chronos Access Point/eZ430-Chronos Access Point, Schematics, 433 V1.0.pdf b/chronos-ti/Documentation/Schematics, Layout & BOM/eZ430-Chronos Access Point/eZ430-Chronos Access Point, Schematics, 433 V1.0.pdf
new file mode 100755 (executable)
index 0000000..67a2f9a
Binary files /dev/null and b/chronos-ti/Documentation/Schematics, Layout & BOM/eZ430-Chronos Access Point/eZ430-Chronos Access Point, Schematics, 433 V1.0.pdf differ
diff --git a/chronos-ti/Documentation/Schematics, Layout & BOM/eZ430-Chronos Access Point/eZ430-Chronos Access Point, Schematics, 868, 915 V1.3.pdf b/chronos-ti/Documentation/Schematics, Layout & BOM/eZ430-Chronos Access Point/eZ430-Chronos Access Point, Schematics, 868, 915 V1.3.pdf
new file mode 100755 (executable)
index 0000000..f8dcfc6
Binary files /dev/null and b/chronos-ti/Documentation/Schematics, Layout & BOM/eZ430-Chronos Access Point/eZ430-Chronos Access Point, Schematics, 868, 915 V1.3.pdf differ
diff --git a/chronos-ti/Documentation/Schematics, Layout & BOM/eZ430-Chronos Debug Interface/eZ430-Chronos Debug IF BOM V2.0.pdf b/chronos-ti/Documentation/Schematics, Layout & BOM/eZ430-Chronos Debug Interface/eZ430-Chronos Debug IF BOM V2.0.pdf
new file mode 100755 (executable)
index 0000000..6cb6862
Binary files /dev/null and b/chronos-ti/Documentation/Schematics, Layout & BOM/eZ430-Chronos Debug Interface/eZ430-Chronos Debug IF BOM V2.0.pdf differ
diff --git a/chronos-ti/Documentation/Schematics, Layout & BOM/eZ430-Chronos Debug Interface/eZ430-Chronos, Debug IF, Gerbers, V2.0.zip b/chronos-ti/Documentation/Schematics, Layout & BOM/eZ430-Chronos Debug Interface/eZ430-Chronos, Debug IF, Gerbers, V2.0.zip
new file mode 100755 (executable)
index 0000000..33e3e09
Binary files /dev/null and b/chronos-ti/Documentation/Schematics, Layout & BOM/eZ430-Chronos Debug Interface/eZ430-Chronos, Debug IF, Gerbers, V2.0.zip differ
diff --git a/chronos-ti/Documentation/Schematics, Layout & BOM/eZ430-Chronos Debug Interface/eZ430-Chronos, Debug IF, Schematic, V2.0.pdf b/chronos-ti/Documentation/Schematics, Layout & BOM/eZ430-Chronos Debug Interface/eZ430-Chronos, Debug IF, Schematic, V2.0.pdf
new file mode 100755 (executable)
index 0000000..2c9bd65
Binary files /dev/null and b/chronos-ti/Documentation/Schematics, Layout & BOM/eZ430-Chronos Debug Interface/eZ430-Chronos, Debug IF, Schematic, V2.0.pdf differ
diff --git a/chronos-ti/Documentation/Schematics, Layout & BOM/eZ430-Chronos Watch/eZ430-Chronos Watch, BOM 433 V1.1.pdf b/chronos-ti/Documentation/Schematics, Layout & BOM/eZ430-Chronos Watch/eZ430-Chronos Watch, BOM 433 V1.1.pdf
new file mode 100755 (executable)
index 0000000..b9f6b51
Binary files /dev/null and b/chronos-ti/Documentation/Schematics, Layout & BOM/eZ430-Chronos Watch/eZ430-Chronos Watch, BOM 433 V1.1.pdf differ
diff --git a/chronos-ti/Documentation/Schematics, Layout & BOM/eZ430-Chronos Watch/eZ430-Chronos Watch, BOM, 868, 915 V1.5f.pdf b/chronos-ti/Documentation/Schematics, Layout & BOM/eZ430-Chronos Watch/eZ430-Chronos Watch, BOM, 868, 915 V1.5f.pdf
new file mode 100755 (executable)
index 0000000..2ac4833
Binary files /dev/null and b/chronos-ti/Documentation/Schematics, Layout & BOM/eZ430-Chronos Watch/eZ430-Chronos Watch, BOM, 868, 915 V1.5f.pdf differ
diff --git a/chronos-ti/Documentation/Schematics, Layout & BOM/eZ430-Chronos Watch/eZ430-Chronos Watch, Gerbers, 433 V1.1.zip b/chronos-ti/Documentation/Schematics, Layout & BOM/eZ430-Chronos Watch/eZ430-Chronos Watch, Gerbers, 433 V1.1.zip
new file mode 100755 (executable)
index 0000000..a28c9c0
Binary files /dev/null and b/chronos-ti/Documentation/Schematics, Layout & BOM/eZ430-Chronos Watch/eZ430-Chronos Watch, Gerbers, 433 V1.1.zip differ
diff --git a/chronos-ti/Documentation/Schematics, Layout & BOM/eZ430-Chronos Watch/eZ430-Chronos Watch, Gerbers, 868, 915 V1.5.zip b/chronos-ti/Documentation/Schematics, Layout & BOM/eZ430-Chronos Watch/eZ430-Chronos Watch, Gerbers, 868, 915 V1.5.zip
new file mode 100755 (executable)
index 0000000..c14e2b6
Binary files /dev/null and b/chronos-ti/Documentation/Schematics, Layout & BOM/eZ430-Chronos Watch/eZ430-Chronos Watch, Gerbers, 868, 915 V1.5.zip differ
diff --git a/chronos-ti/Documentation/Schematics, Layout & BOM/eZ430-Chronos Watch/eZ430-Chronos Watch, Schematics, 433 V1.1.pdf b/chronos-ti/Documentation/Schematics, Layout & BOM/eZ430-Chronos Watch/eZ430-Chronos Watch, Schematics, 433 V1.1.pdf
new file mode 100755 (executable)
index 0000000..7ead91c
Binary files /dev/null and b/chronos-ti/Documentation/Schematics, Layout & BOM/eZ430-Chronos Watch/eZ430-Chronos Watch, Schematics, 433 V1.1.pdf differ
diff --git a/chronos-ti/Documentation/Schematics, Layout & BOM/eZ430-Chronos Watch/eZ430-Chronos Watch, Schematics, 868, 915 V1.5.pdf b/chronos-ti/Documentation/Schematics, Layout & BOM/eZ430-Chronos Watch/eZ430-Chronos Watch, Schematics, 868, 915 V1.5.pdf
new file mode 100755 (executable)
index 0000000..fbe9df9
Binary files /dev/null and b/chronos-ti/Documentation/Schematics, Layout & BOM/eZ430-Chronos Watch/eZ430-Chronos Watch, Schematics, 868, 915 V1.5.pdf differ
diff --git a/chronos-ti/Documentation/slau292c.pdf b/chronos-ti/Documentation/slau292c.pdf
new file mode 100755 (executable)
index 0000000..6dd8ed7
Binary files /dev/null and b/chronos-ti/Documentation/slau292c.pdf differ
diff --git a/chronos-ti/Recovery/Chronos Watch/Applications/Recovery_ez430_chronos_433MHz.txt b/chronos-ti/Recovery/Chronos Watch/Applications/Recovery_ez430_chronos_433MHz.txt
new file mode 100755 (executable)
index 0000000..6fb7a9a
--- /dev/null
@@ -0,0 +1,1937 @@
+@8000\r
+5A 14 31 80 1A 00 CA 0E B0 13 44 E0 0E 43 3F 40 \r
+C8 42 B0 13 C6 BE 81 4C 12 00 81 4D 14 00 CC 0A \r
+B0 13 9A E6 0E 43 3F 40 20 41 B0 13 C6 BE 81 4C \r
+16 00 81 4D 18 00 36 40 11 00 37 40 32 1D 0A 43 \r
+28 47 19 47 02 00 CC 08 CD 09 1E 41 12 00 1F 41 \r
+14 00 B0 13 A4 D4 0C 93 0A 38 81 48 08 00 81 49 \r
+0A 00 27 52 1A 53 16 83 EB 23 4A 4A 03 3C 4A 4A \r
+0A 93 7E 24 3A 90 0F 00 3D 38 3A 90 0F 00 23 24 \r
+B0 13 86 82 1E 42 72 1D 1F 42 74 1D B0 13 E0 9E \r
+C9 0C CA 0D 1C 42 72 1D 1D 42 74 1D 1E 42 6E 1D \r
+1F 42 70 1D B0 13 3A 82 1C 42 70 F6 1C 82 6E F6 \r
+B0 13 4C 82 1C 42 70 F6 B0 13 60 82 81 4C 00 00 \r
+81 4D 02 00 73 3C B0 13 24 82 C9 0C CA 0D 1C 42 \r
+6E 1D 1D 42 70 1D 1E 41 08 00 1F 41 0A 00 B0 13 \r
+3A 82 1C 42 6E F6 1C 82 6C F6 B0 13 4C 82 1C 42 \r
+6C F6 E2 3F C9 0A 59 02 16 49 4E F6 5A 06 17 4A \r
+32 1D 18 4A 34 1D B0 13 24 82 C5 0C CA 0D B0 13 \r
+86 82 CE 07 CF 08 B0 13 E0 9E 3E 40 34 80 3F 40 \r
+37 3A B0 13 10 82 CC 05 CD 0A B0 13 3A B7 C5 0C \r
+CA 0D CC 07 CD 08 1E 41 08 00 1F 41 0A 00 B0 13 \r
+90 82 CC 05 CD 0A B0 13 C6 BE C8 0C CA 0D 1C 49 \r
+50 F6 0C 86 B0 13 74 DE CE 0C CF 0D CC 08 CD 0A \r
+B0 13 3A B7 C9 0C CA 0D CC 06 B0 13 60 82 A6 3F \r
+B0 13 86 82 1E 42 32 1D 1F 42 34 1D B0 13 E0 9E \r
+C9 0C CA 0D 1C 42 36 1D 1D 42 38 1D 1E 42 32 1D \r
+1F 42 34 1D B0 13 3A 82 1C 42 52 F6 1C 82 50 F6 \r
+B0 13 56 82 81 4C 00 00 81 4D 02 00 2C 41 1D 41 \r
+02 00 B0 13 6A 82 3E 40 F4 FD 3F 40 D4 3B B0 13 \r
+10 82 1C 41 16 00 1D 41 18 00 B0 13 C6 BE 81 4C \r
+04 00 81 4D 06 00 1C 41 04 00 1D 41 06 00 B0 13 \r
+6A 82 2E 41 1F 41 02 00 B0 13 3A B7 81 4C 0C 00 \r
+81 4D 0E 00 1C 41 0C 00 1D 41 0E 00 B0 13 72 D7 \r
+81 4C 10 00 1C 41 10 00 31 50 1A 00 55 16 10 01 \r
+B0 13 3A B7 CE 0C CF 0D 0C 43 3D 40 80 3F B0 13 \r
+90 82 10 01 1C 41 16 00 1D 41 18 00 1E 41 0C 00 \r
+1F 41 0E 00 B0 13 E0 9E 10 01 B0 13 90 82 CC 09 \r
+CD 0A B0 13 C6 BE C9 0C CA 0D 10 01 B0 13 56 82 \r
+C9 0C CA 0D 10 01 B0 13 78 82 B0 13 3A B7 10 01 \r
+B0 13 78 82 B0 13 E6 9E 10 01 3E 40 E7 6F 3F 40 \r
+63 3B B0 13 3A B7 10 01 B0 13 74 DE CE 0C CF 0D \r
+CC 09 CD 0A 10 01 1C 41 16 00 1D 41 18 00 10 01 \r
+B0 13 E0 9E CE 0C CF 0D 10 01 4A 14 31 82 B0 13 \r
+C2 EE C8 0C CF 08 3F 50 FF 7F 81 4F 06 00 91 41 \r
+06 00 04 00 82 43 46 1E 4A 43 49 43 4C 49 B0 13 \r
+0C 85 1F 4C 18 00 1F 83 1D 24 1F 83 14 24 D2 B3 \r
+D6 1E 47 24 1E 42 4E 1E 1F 42 50 1E 3E F3 3F F0 \r
+FF 00 1F 9C 02 00 3D 20 2E 9C 3B 20 D2 C3 D6 1E \r
+82 43 46 1E 36 3C 5A 53 B0 13 DA D2 4C 93 31 24 \r
+C7 09 2F 3C B0 13 58 EA C6 0C CC 09 B0 13 C8 D8 \r
+4C 93 0C 20 CC 09 CD 06 CE 08 B0 13 4C A2 1F 42 \r
+44 1E AF 93 18 00 09 20 5A 53 07 3C 82 43 46 1E \r
+E2 B2 D6 1E 02 20 B0 13 12 DF 1F 42 44 1E 9F 93 \r
+18 00 0F 20 CF 01 3F 50 03 00 81 4F 00 00 CC 06 \r
+CD 01 3D 50 06 00 CE 01 2E 52 CF 01 2F 53 B0 13 \r
+E4 D1 59 53 AB 27 4A 93 50 24 92 93 46 1E 18 38 \r
+4C 47 B0 13 0C 85 CC 07 B0 13 84 B6 4C 93 10 24 \r
+5A 83 CF 01 3F 50 03 00 81 4F 00 00 7C 42 CD 01 \r
+3D 50 06 00 CE 01 2E 52 CF 01 2F 53 B0 13 E4 D1 \r
+4A 93 33 24 1F 42 42 1E 0F 88 1F 93 2C 34 E2 B2 \r
+D6 1E 0D 20 E2 D2 D6 1E C2 93 4B 1E 04 20 B2 50 \r
+E0 7F 42 1E 20 3C B2 50 C0 53 42 1E 1C 3C E2 C2 \r
+D6 1E C2 93 4B 1E 03 24 3F 40 40 6C 02 3C 3F 40 \r
+20 00 82 5F 42 1E 49 43 4C 49 B0 13 0C 85 AC 93 \r
+18 00 07 20 CC 09 B0 13 CE E2 4C 93 02 20 5A 83 \r
+04 24 59 53 F1 27 4A 93 0E 20 F2 F0 F9 00 D6 1E \r
+91 91 06 00 04 00 02 24 0E 43 08 3C B0 13 C8 EF \r
+A2 43 9A 1E 70 3C E2 D3 D6 1E 1E 43 1F 41 06 00 \r
+0F 88 0F 93 54 38 0E 93 3C 24 E2 B2 D6 1E 16 20 \r
+1F 41 06 00 1F 82 42 1E 3F 80 42 00 0F 93 31 38 \r
+F2 40 07 00 98 1E C2 43 99 1E F2 D0 18 00 D6 1E \r
+92 42 42 1E 94 1E A2 43 9A 1E 4B 3C 1F 41 06 00 \r
+0F 88 3F 80 42 00 1F 93 1C 38 F2 40 07 00 98 1E \r
+C2 43 99 1E F2 D0 18 00 D6 1E 1F 41 06 00 1F 82 \r
+42 1E 3F 80 42 00 0F 93 05 34 1F 41 06 00 3F 80 \r
+42 00 02 3C 1F 42 42 1E 82 4F 94 1E 92 43 9A 1E \r
+28 3C D2 41 02 00 98 1E D2 41 03 00 99 1E 5F 42 \r
+D6 1E 7F C2 7F D0 10 00 C2 4F D6 1E 92 41 06 00 \r
+94 1E 92 41 04 00 96 1E 82 43 9A 1E 12 3C D2 91 \r
+02 00 98 1E 09 24 D2 41 02 00 98 1E D2 41 03 00 \r
+99 1E F2 D0 10 00 D6 1E 92 41 04 00 94 1E 92 43 \r
+9A 1E D2 C3 D6 1E 31 52 46 16 10 01 3D 40 1C 00 \r
+B0 13 38 EC 1C 52 D4 F6 82 4C 44 1E 10 01 4F 14 \r
+B2 F0 EF FF 42 03 92 C3 42 03 B2 80 00 80 52 03 \r
+B2 D0 10 00 42 03 B0 13 76 CE B2 D0 10 00 8C 1C \r
+B0 13 3A EF 4C 93 EE 20 B0 13 2E EF 4C 93 EA 20 \r
+E2 93 2E 1E 04 28 A2 D3 0A 1E B0 13 5C E9 E2 93 \r
+E0 1E 11 20 5E 42 E1 1E CF 0E 5F 83 C2 4F E1 1E \r
+4E 93 06 20 F2 40 0A 00 E1 1E B0 13 4C F0 03 3C \r
+B2 D0 10 00 0A 1E B0 13 46 EF 4C 93 02 24 92 D3 \r
+0A 1E B0 13 4E ED 4C 93 0D 24 92 83 24 1E 04 20 \r
+B0 13 3C EA B0 13 62 87 F2 B0 40 00 01 02 02 24 \r
+A2 D2 0A 1E B0 13 3C ED 4C 93 12 24 92 83 60 1E \r
+09 20 B0 13 E0 DF B0 13 62 87 7C 40 1F 00 4D 43 \r
+B0 13 02 E9 F2 B0 20 00 01 02 02 24 B2 D2 0A 1E \r
+B0 13 22 EF 4C 93 02 24 B0 13 32 BE B2 B0 20 00 \r
+08 1E 10 24 5E 42 9E 1E CF 0E 5F 83 C2 4F 9E 1E \r
+4E 93 08 20 92 D3 0C 1E B2 D0 20 00 0C 1E F2 40 \r
+0F 00 9E 1E 82 93 0C 1E 0F 24 92 B3 0C 1E 08 20 \r
+A2 B2 0C 1E 09 24 A2 C2 0C 1E 92 D3 8C 1C 04 3C \r
+92 C3 0C 1E A2 D3 0C 1E A2 B3 08 1E 0E 24 1F 42 \r
+26 1E 1E 42 28 1E 1F 82 2A 1E 1E 72 2C 1E 03 20 \r
+3F 90 1F 00 02 28 92 D3 08 1E D2 93 7B 1E 0E 20 \r
+E2 92 7A 1E 03 2C D2 53 7A 1E 08 3C F2 C2 03 02 \r
+F2 C2 05 02 C2 43 7A 1E C2 43 7B 1E E2 B3 01 02 \r
+03 24 D2 B3 01 02 2F 20 C2 43 C2 1E E2 B2 01 02 \r
+11 24 D2 53 78 1E F2 90 03 00 78 1E 0D 28 B2 D0 \r
+20 00 76 1E B2 F0 7F FF 76 1E C2 43 78 1E E2 C2 \r
+19 02 02 3C C2 43 78 1E E2 B3 01 02 11 24 D2 53 \r
+79 1E F2 90 03 00 79 1E 47 28 B2 D0 40 00 76 1E \r
+B2 F0 FF FE 76 1E C2 43 79 1E E2 C3 19 02 3C 3C \r
+C2 43 79 1E 39 3C D2 53 C2 1E 5F 42 C2 1E 5F 83 \r
+7F 90 03 00 31 28 1F 42 08 1E 2F C2 2E 42 1E C2 \r
+08 1E 0E DF 82 4E 08 1E 92 D3 0C 1E A2 B2 08 1E \r
+04 20 B2 D0 10 00 0C 1E 02 3C B2 D2 0C 1E C2 43 \r
+C2 1E 1A 3C 82 93 EC 1C 04 20 F2 D0 20 00 F0 1C \r
+02 3C 92 83 EC 1C B2 90 03 00 EA 1C 0D 20 C2 93 \r
+EE 1C 08 20 7C 40 5A 00 3D 40 28 F5 5E 43 B0 13 \r
+70 AF 02 3C D2 83 EE 1C B1 C0 D0 00 14 00 4B 16 \r
+00 13 7C 40 46 00 3D 40 8C F5 5E 43 B0 13 70 AF \r
+6C 43 4D 43 B0 13 02 E9 7C 40 03 00 4D 43 B0 13 \r
+02 E9 10 01 4A 14 B0 13 E6 EE 82 43 08 0A 7C 40 \r
+46 00 3D 40 5C F5 5E 43 B0 13 70 AF 7C 40 5B 00 \r
+3D 40 62 F5 5E 43 B0 13 70 AF 7C 40 1E 00 B0 13 \r
+AE 89 7C 40 13 00 B0 13 AE 89 7C 40 14 00 B0 13 \r
+AE 89 7C 40 15 00 B0 13 AE 89 7C 40 16 00 B0 13 \r
+AE 89 7C 40 17 00 B0 13 AE 89 7C 40 18 00 B0 13 \r
+AE 89 7C 40 19 00 B0 13 AE 89 6C 43 B0 13 AE 89 \r
+7C 40 03 00 B0 13 AE 89 4C 43 B0 13 AE 89 B2 40 \r
+80 5A 5C 01 32 D0 D8 00 03 43 B0 13 8C EC B0 13 \r
+44 F0 B0 13 A4 89 E2 B2 01 02 04 24 F2 B0 10 00 \r
+01 02 09 20 B0 13 A4 89 82 43 76 1E F2 C2 03 02 \r
+F2 C2 05 02 AE 3C 49 43 5A 43 4A 93 71 24 B0 13 \r
+8C EC 4A 43 4F 49 0F 93 5E 24 1F 83 49 24 1F 83 \r
+36 24 1F 83 10 24 1F 83 5F 20 A2 D2 76 1E B0 13 \r
+5E A5 B0 13 A4 89 B0 13 32 BE 5D 43 B0 13 72 CB \r
+B0 13 EE D4 51 3C B0 13 8A C3 28 42 06 43 07 43 \r
+3C 40 00 20 B0 13 A0 CC B0 13 4C E3 5C 42 59 1E \r
+CD 06 B0 13 96 89 7C 40 47 00 5E 43 B0 13 70 AF \r
+5C 42 5B 1E CD 07 B0 13 96 89 7C 40 5D 00 5E 43 \r
+B0 13 70 AF 18 83 E4 23 B0 13 E0 DF 2D 3C 5D 43 \r
+B0 13 10 AB 28 42 3C 40 00 20 B0 13 A0 CC 4C 43 \r
+B0 13 9C BD 6D 43 B0 13 10 AB 18 83 F4 23 1C 3C \r
+5D 43 B0 13 38 A9 28 43 F2 B0 40 00 01 02 FC 27 \r
+4C 43 B0 13 96 BA 6D 43 B0 13 38 A9 18 83 F4 23 \r
+B0 13 3C EA 09 3C B0 13 3E EB E2 B2 01 02 04 24 \r
+F2 B0 10 00 01 02 F9 23 3C 40 99 19 B0 13 A0 CC \r
+E2 B2 01 02 2D 20 E2 B3 01 02 27 20 F2 B0 10 00 \r
+01 02 1F 20 D2 B3 01 02 19 20 F2 B2 01 02 22 24 \r
+F2 B2 01 02 FD 23 92 C3 00 0A 82 43 08 0A 3C 40 \r
+00 40 B0 13 A0 CC B0 13 E6 EE B2 40 80 5A 5C 01 \r
+32 D0 F8 00 03 43 92 43 5C 01 0C 3C 69 42 5A 43 \r
+09 3C 79 40 03 00 5A 43 05 3C 69 43 5A 43 02 3C \r
+59 43 5A 43 B2 40 2B 5A 5C 01 32 D0 D8 00 03 43 \r
+54 3F 46 16 10 01 7E 40 03 00 4F 43 B0 13 FC B4 \r
+CD 0C 10 01 3C 40 CC 0C B0 13 A0 CC 10 01 5D 43 \r
+B0 13 02 E9 10 01 6A 14 31 80 10 00 C8 0F C5 0E \r
+81 4D 02 00 C7 0C 3F 01 3A 00 71 0F 08 00 5F 41 \r
+38 00 81 4F 04 00 16 41 36 00 91 41 32 00 0C 00 \r
+91 41 34 00 0E 00 19 41 30 00 82 43 76 1E B0 13 \r
+86 F0 B0 13 6A E8 5F 42 34 1E 81 4F 06 00 E2 43 \r
+34 1E 82 43 7C 1E B0 13 E0 EB 7C 40 60 00 B0 13 \r
+B4 EE 1A 43 54 43 B6 3C 0E 43 A2 B2 76 1E 01 24 \r
+1E 43 3F 40 10 00 0F F6 0E 93 23 24 3A B0 00 80 \r
+0E 7E 3E E3 87 5A 00 00 87 6E 02 00 1E 41 0E 00 \r
+1E 97 02 00 05 38 12 20 1E 41 0C 00 2E 97 0E 2C \r
+16 B3 03 24 CD 08 CE 09 04 3C 1D 41 0C 00 1E 41 \r
+0E 00 87 4D 00 00 87 4E 02 00 1A 43 A2 C2 76 1E \r
+54 43 B2 B2 76 1E 20 24 3A B0 00 80 0E 7E 3E E3 \r
+87 8A 00 00 87 7E 02 00 87 99 02 00 04 38 11 20 \r
+87 98 00 00 0E 2C 16 B3 05 24 1D 41 0C 00 1E 41 \r
+0E 00 02 3C CD 08 CE 09 87 4D 00 00 87 4E 02 00 \r
+1A 43 B2 C2 76 1E 54 43 0F 93 35 24 3E 40 1E 00 \r
+1E 52 7C 1E 18 24 3E 80 0A 00 18 24 3E 80 0A 00 \r
+18 24 3E 80 0A 00 26 24 3E 80 0A 00 12 24 3E 80 \r
+0A 00 0C 24 3E 80 0A 00 06 24 1A 93 1C 24 4F 43 \r
+5F 93 09 24 18 3C 3A 40 E8 03 05 3C 3A 40 64 00 \r
+02 3C 3A 40 0A 00 2C 47 1D 47 02 00 3A B0 00 80 \r
+0F 7F 3F E3 CE 0A B0 13 CC D9 87 8E 00 00 87 7F \r
+02 00 01 3C 1A 43 44 93 2B 24 26 B2 1C 24 87 93 \r
+02 00 11 34 6C 43 4D 43 B0 13 02 E9 7C 40 03 00 \r
+5D 43 B0 13 02 E9 2D 47 1E 47 02 00 3D E3 3E E3 \r
+1D 53 0E 63 0B 3C 6C 43 5D 43 B0 13 C4 8B 2D 47 \r
+1E 47 02 00 03 3C 2D 47 1E 47 02 00 C1 45 00 00 \r
+1C 41 04 00 1F 41 02 00 3B 01 08 00 4B 13 44 43 \r
+B0 13 16 EF 92 B3 08 1E 09 20 92 B3 76 1E 06 20 \r
+A2 B3 76 1E 41 27 36 B0 20 00 3E 27 6C 43 4D 43 \r
+B0 13 C4 8B 7C 40 E0 00 B0 13 B4 EE B0 13 86 F0 \r
+B0 13 D2 EF 1F 41 06 00 C2 4F 34 1E 31 50 10 00 \r
+64 16 10 01 B0 13 02 E9 7C 40 03 00 4D 43 B0 13 \r
+02 E9 10 01 0A 14 31 80 1E 00 B0 13 78 E9 B2 B0 \r
+40 00 08 1E 05 20 91 43 0E 00 81 43 10 00 04 3C \r
+81 43 0E 00 81 43 10 00 1A 41 0E 00 5F 42 30 1E \r
+81 4F 12 00 81 43 14 00 5F 42 31 1E 81 4F 16 00 \r
+81 43 18 00 5F 42 32 1E 81 4F 1A 00 81 43 1C 00 \r
+4E 43 9F 3C 4F 4E 0F 93 07 24 1F 83 55 24 1F 83 \r
+40 24 1F 83 2C 24 95 3C B0 13 F2 EE B0 13 D4 8D \r
+0F 43 81 43 00 00 91 43 02 00 81 43 04 00 B1 40 \r
+29 00 06 00 F1 40 49 00 08 00 00 18 F1 40 F6 EB \r
+0A 00 CC 01 3C 50 0E 00 5D 43 4E 43 B0 13 B6 89 \r
+81 93 10 00 07 20 81 93 0E 00 04 20 B2 D0 40 00 \r
+08 1E 03 3C B2 F0 BF FF 08 1E 5E 43 6A 3C B0 13 \r
+B0 8D F1 40 5E 00 08 00 00 18 F1 40 02 E7 0A 00 \r
+CC 01 3C 50 1A 00 6D 43 4E 43 B0 13 B6 89 4E 43 \r
+58 3C B0 13 B0 8D F1 40 48 00 08 00 00 18 F1 40 \r
+02 E7 0A 00 CC 01 3C 50 16 00 6D 43 4E 43 B0 13 \r
+B6 89 7E 40 03 00 45 3C 1C 41 12 00 1D 41 14 00 \r
+B0 13 C8 8D 7C 40 4A 00 5E 43 B0 13 70 AF 7C 40 \r
+1E 00 5D 43 B0 13 02 E9 1C 41 16 00 1D 41 18 00 \r
+B0 13 C8 8D 7C 40 48 00 5E 43 B0 13 70 AF 1C 41 \r
+1A 00 1D 41 1C 00 B0 13 C8 8D 7C 40 5E 00 5E 43 \r
+B0 13 70 AF 7C 40 29 00 5D 43 B0 13 02 E9 0F 43 \r
+81 43 00 00 B1 40 17 00 02 00 81 43 04 00 B1 40 \r
+23 00 06 00 F1 40 4A 00 08 00 00 18 F1 40 E6 D6 \r
+0A 00 CC 01 3C 50 12 00 6D 43 4E 43 B0 13 B6 89 \r
+6E 43 92 B3 08 1E 13 20 92 B3 76 1E 5B 27 B0 13 \r
+E6 EE D2 41 12 00 30 1E D2 41 16 00 31 1E D2 41 \r
+1A 00 32 1E B0 13 44 F0 B0 13 D4 8D 0B 3C 0A 93 \r
+04 20 B2 D0 40 00 08 1E 03 3C B2 F0 BF FF 08 1E \r
+B0 13 D4 8D 82 43 76 1E 31 50 1E 00 0A 16 10 01 \r
+0F 43 81 43 04 00 B1 40 3B 00 06 00 81 43 08 00 \r
+B1 40 23 00 0A 00 10 01 6E 43 4F 43 B0 13 FC B4 \r
+CD 0C 10 01 4C 43 4D 43 B0 13 02 E9 10 01 7F 14 \r
+59 42 1B 02 B2 B0 20 00 76 1E EA 20 B2 B0 40 00 \r
+76 1E E6 20 82 43 76 1E 5A 42 1D 02 4A F9 48 43 \r
+B0 13 3A EF 4C 93 6D 20 7A B0 1F 00 0F 24 32 C2 \r
+03 43 C2 43 1B 02 32 D2 3C 40 A3 00 B0 13 A0 CC \r
+92 42 26 1E 2A 1E 92 42 28 1E 2C 1E 6A B2 44 20 \r
+6A B3 2D 20 7A B0 10 00 22 20 5A B3 0E 20 7A B2 \r
+77 24 F2 B2 01 02 74 24 D2 43 7B 1E C2 43 7A 1E \r
+F2 D2 03 02 F2 D2 05 02 6B 3C D2 B3 01 02 68 24 \r
+B2 D2 76 1E 58 43 B0 13 F0 EC 4C 93 61 24 A2 B2 \r
+08 1E 5E 20 B0 13 DA EA B2 C2 76 1E 59 3C F2 B0 \r
+10 00 01 02 55 24 A2 D2 76 1E 58 43 51 3C E2 B3 \r
+01 02 0B 20 E2 B3 19 02 4B 24 A2 D3 76 1E B2 F0 \r
+FF FE 76 1E E2 C3 19 02 43 3C A2 D3 76 1E B2 F0 \r
+FF FE 76 1E 58 43 3C 3C E2 B2 01 02 0B 20 E2 B2 \r
+19 02 36 24 92 D3 76 1E B2 F0 7F FF 76 1E E2 C2 \r
+19 02 2E 3C 92 D3 76 1E B2 F0 7F FF 76 1E 58 43 \r
+27 3C D2 53 7E 1E 5F 42 7E 1E 5F 83 7F 90 07 00 \r
+05 28 F2 F0 0F 00 F2 1C C2 43 7E 1E 6A B2 13 20 \r
+6A B3 0D 20 7A B0 10 00 06 20 5A B3 11 24 F2 D0 \r
+20 00 F0 1C 0D 3C F2 D0 30 00 F2 1C 07 3C F2 D0 \r
+20 00 F2 1C 03 3C F2 D0 10 00 F2 1C F2 D2 F0 1C \r
+A2 B3 76 1E 03 24 B2 B2 76 1E 18 20 48 93 18 24 \r
+E2 93 E0 1E 0A 24 B2 B0 10 00 08 1E 0A 20 5C 43 \r
+3D 40 33 13 B0 13 12 D6 04 3C B0 13 4C F0 82 43 \r
+76 1E 3C 40 00 20 B0 13 A0 CC 02 3C 82 43 76 1E \r
+7A B0 20 00 02 24 B2 D2 0A 1E 7A B0 40 00 02 24 \r
+A2 D2 0A 1E 92 B3 76 1E 03 20 A2 B3 76 1E 18 24 \r
+3C 40 66 06 B0 13 A0 CC E2 B2 01 02 07 24 E2 D2 \r
+19 02 92 C3 76 1E B2 D0 80 00 76 1E E2 B3 01 02 \r
+07 24 E2 D3 19 02 A2 C3 76 1E B2 D0 00 01 76 1E \r
+32 C2 03 43 C2 43 1D 02 C2 49 1B 02 32 D2 B1 C0 \r
+F0 00 20 00 78 16 00 13 0A 14 31 80 1A 00 B0 13 \r
+78 E9 5F 42 CB 1E 4C 4F 0D 43 4E 4F 81 4E 0E 00 \r
+81 43 10 00 5E 42 CC 1E 81 4E 12 00 81 43 14 00 \r
+91 42 CE 1E 16 00 81 43 18 00 B2 B0 40 00 08 1E \r
+0D 20 4C 4F B0 13 BE 91 7C 40 48 00 B0 13 8E 91 \r
+7C 40 4A 00 5E 43 B0 13 70 AF 0B 3C B0 13 BE 91 \r
+7C 40 4A 00 B0 13 8E 91 7C 40 48 00 5E 43 B0 13 \r
+70 AF 7C 40 1F 00 5D 43 B0 13 02 E9 4A 43 70 3C \r
+4F 4A 0F 93 3E 24 1F 83 1F 24 1F 83 55 20 B2 B0 \r
+40 00 08 1E 0C 20 B0 13 A2 91 B0 13 5A 91 CC 01 \r
+3C 50 0E 00 6D 43 4E 43 B0 13 B6 89 0B 3C B0 13 \r
+A2 91 B0 13 74 91 CC 01 3C 50 0E 00 6D 43 4E 43 \r
+B0 13 B6 89 4A 43 38 3C B2 B0 40 00 08 1E 0C 20 \r
+B0 13 B0 91 B0 13 74 91 CC 01 3C 50 12 00 6D 43 \r
+4E 43 B0 13 B6 89 0B 3C B0 13 B0 91 B0 13 5A 91 \r
+CC 01 3C 50 12 00 6D 43 4E 43 B0 13 B6 89 6A 43 \r
+1B 3C 3F 40 D8 07 81 43 00 00 B1 40 34 08 02 00 \r
+81 43 04 00 B1 40 22 00 06 00 F1 40 5C 00 08 00 \r
+00 18 F1 40 02 E7 0A 00 CC 01 3C 50 16 00 6D 42 \r
+4E 43 B0 13 B6 89 5A 43 5C 41 12 00 1D 41 16 00 \r
+B0 13 86 C2 4F 4C 0E 43 1E 91 10 00 04 38 08 20 \r
+1F 91 0E 00 05 2C 4F 4C 81 4F 0E 00 81 43 10 00 \r
+92 B3 08 1E 0C 20 92 B3 76 1E 8A 27 D2 41 0E 00 \r
+CB 1E D2 41 12 00 CC 1E 92 41 16 00 CE 1E 82 43 \r
+76 1E 31 50 1A 00 0A 16 10 01 81 43 08 00 B1 40 \r
+23 00 0A 00 F1 40 48 00 0C 00 00 18 F1 40 02 E7 \r
+0E 00 10 01 81 43 08 00 B1 40 23 00 0A 00 F1 40 \r
+4A 00 0C 00 00 18 F1 40 02 E7 0E 00 10 01 5E 43 \r
+B0 13 70 AF 1C 41 16 00 1D 41 18 00 B0 13 BE 91 \r
+10 01 1F 43 81 43 04 00 4C 4C 81 4C 06 00 10 01 \r
+1F 43 81 43 04 00 B1 40 0C 00 06 00 10 01 6E 43 \r
+4F 43 B0 13 FC B4 CD 0C 10 01 31 80 1A 00 B0 13 \r
+78 E9 5F 42 F6 1D 81 4F 0E 00 81 43 10 00 1C 42 \r
+FC 1D 1D 42 FE 1D 3E 40 E8 03 0F 43 B0 13 8E D0 \r
+81 4C 16 00 81 4D 18 00 B2 B0 40 00 08 1E 12 20 \r
+1C 42 F8 1D 0D 43 3E 40 B9 01 0F 43 B0 13 46 E7 \r
+3E 40 C8 00 0F 43 B0 13 CC D9 81 4C 12 00 81 4D \r
+14 00 05 3C 91 42 F8 1D 12 00 81 43 14 00 4E 43 \r
+82 3C 4F 4E 0F 93 55 24 1F 83 39 24 1F 83 7B 20 \r
+B2 B0 40 00 08 1E 19 20 7C 40 5E 00 3D 40 4E F5 \r
+5E 43 B0 13 70 AF 3F 40 46 00 81 43 00 00 B1 40 \r
+90 01 02 00 B0 13 A0 93 CC 01 3C 50 12 00 7D 40 \r
+03 00 6E 43 B0 13 B6 89 18 3C 7C 40 5E 00 3D 40 \r
+52 F5 5E 43 B0 13 70 AF 3F 40 1E 00 81 43 00 00 \r
+B1 40 96 00 02 00 B0 13 A0 93 CC 01 3C 50 12 00 \r
+7D 40 03 00 6E 43 B0 13 B6 89 4E 43 44 3C 0F 43 \r
+81 43 00 00 91 43 02 00 81 43 04 00 B1 40 29 00 \r
+06 00 F1 40 5C 00 08 00 00 18 F1 40 0C EC 0A 00 \r
+CC 01 3C 50 0E 00 5D 43 4E 43 B0 13 B6 89 6E 43 \r
+2A 3C 7C 40 10 00 5D 43 B0 13 02 E9 0F 43 81 43 \r
+00 00 B1 40 3F 0D 02 00 B1 40 03 00 04 00 B1 40 \r
+32 00 06 00 F1 40 5A 00 08 00 00 18 F1 40 02 E7 \r
+0A 00 CC 01 3C 50 16 00 7D 40 06 00 7E 40 05 00 \r
+B0 13 B6 89 7C 40 10 00 4D 43 B0 13 02 E9 6C 43 \r
+B0 13 D2 CE 5E 43 92 B3 08 1E 2D 20 92 B3 76 1E \r
+78 27 1C 41 16 00 1D 41 18 00 3E 40 E8 03 0F 43 \r
+B0 13 46 E7 82 4C FC 1D 82 4D FE 1D D2 41 0E 00 \r
+F6 1D B2 B0 40 00 08 1E 11 20 1C 41 12 00 1D 41 \r
+14 00 3E 40 C8 00 0F 43 B0 13 46 E7 3E 40 B9 01 \r
+0F 43 B0 13 CC D9 82 4C F8 1D 03 3C 92 41 12 00 \r
+F8 1D A2 D2 8C 1C 82 43 76 1E 31 50 1A 00 10 01 \r
+81 43 08 00 B1 40 22 00 0A 00 F1 40 62 00 0C 00 \r
+00 18 F1 40 02 E7 0E 00 10 01 6A 14 31 80 20 00 \r
+C8 0F C9 0D CA 0E 81 43 0C 00 81 43 0E 00 B0 13 \r
+74 DE 81 4C 14 00 81 4D 16 00 CC 09 CD 0A B0 13 \r
+44 E0 0E 43 3F 40 C8 42 B0 13 C6 BE 81 4C 18 00 \r
+81 4D 1A 00 CC 08 B0 13 9A E6 0E 43 3F 40 20 41 \r
+B0 13 C6 BE 81 4C 1C 00 81 4D 1E 00 1C 41 14 00 \r
+1D 41 16 00 3E 40 F4 FD 3F 40 D4 3B B0 13 3A B7 \r
+1E 41 1C 00 1F 41 1E 00 B0 13 E6 9E 81 4C 10 00 \r
+81 4D 12 00 1C 41 10 00 1D 41 12 00 3E 40 E7 6F \r
+3F 40 63 3B B0 13 3A B7 CE 0C CF 0D 1C 41 14 00 \r
+1D 41 16 00 B0 13 C6 BE 81 4C 08 00 81 4D 0A 00 \r
+36 40 10 00 37 40 50 F6 0A 43 2C 47 B0 13 60 95 \r
+CE 08 CF 09 B0 13 A4 D4 0C 93 08 38 81 48 0C 00 \r
+81 49 0E 00 27 53 1A 53 16 83 EF 23 4A 4A 5A 02 \r
+1C 4A 70 F6 B0 13 9A E6 C6 0C C7 0D 1C 4A 50 F6 \r
+B0 13 60 95 B0 13 84 95 C4 0C C5 0D 1C 41 08 00 \r
+1D 41 0A 00 CE 08 CF 09 B0 13 E0 9E 3E 40 82 A8 \r
+3F 40 7B 38 B0 13 3A B7 CE 0C CF 0D 0C 43 3D 40 \r
+80 3F B0 13 72 95 C4 0C C5 0D 1C 4A 72 F6 B0 13 \r
+9A E6 CE 06 CF 07 B0 13 72 95 C5 0C CA 0D CC 08 \r
+CD 09 B0 13 84 95 CE 0C CF 0D CC 05 CD 0A B0 13 \r
+C6 BE CE 06 CF 07 B0 13 E6 9E 81 4C 04 00 81 4D \r
+06 00 1C 41 18 00 1D 41 1A 00 1E 41 04 00 1F 41 \r
+06 00 B0 13 C6 BE 81 4C 00 00 81 4D 02 00 38 40 \r
+11 00 3A 40 32 1D 39 40 72 F6 3C 49 B0 13 9A E6 \r
+2E 41 1F 41 02 00 B0 13 3A B7 2A 52 8A 4C FC FF \r
+8A 4D FE FF 18 83 F1 23 31 50 20 00 64 16 10 01 \r
+B0 13 74 DE C8 0C C9 0D 1C 41 0C 00 1D 41 0E 00 \r
+10 01 B0 13 E0 9E CE 0C CF 0D CC 04 CD 05 B0 13 \r
+3A B7 10 01 1E 41 10 00 1F 41 12 00 B0 13 E0 9E \r
+10 01 3C 40 79 1D 0D 43 3E 40 21 00 B0 13 72 ED \r
+7C 40 30 00 B0 13 D8 C6 7C 40 30 00 B0 13 2C D7 \r
+4C 93 AF 20 7C 40 31 00 B0 13 2C D7 7C 90 06 00 \r
+A5 20 7C 40 36 00 B0 13 D8 C6 B0 13 18 97 FD 23 \r
+B2 40 01 02 34 0F 0F 42 32 C2 03 43 B2 B0 10 00 \r
+02 0F FC 27 B2 40 51 7E 10 0F B2 B0 10 00 02 0F \r
+FC 27 F2 40 3D 00 11 0F B2 B0 10 00 02 0F FC 27 \r
+F2 40 FE 00 11 0F B2 B0 20 00 02 0F FC 27 C2 43 \r
+10 0F B2 B0 80 00 02 0F FC 27 F2 90 51 00 20 0F \r
+72 20 B2 B0 10 00 02 0F FC 27 F2 40 3D 00 11 0F \r
+02 4F 3B 40 92 F5 4E 43 6C 4B 4F 4E 5F 02 5D 4F \r
+93 F5 B0 13 46 DF 2B 53 5E 53 7E 90 20 00 F4 2B \r
+3D 40 92 F5 4E 43 6C 4D B0 13 2C D7 4F 4E 5F 02 \r
+CF 9C 93 F5 4D 20 2D 53 5E 53 7E 90 20 00 F3 2B \r
+7C 40 36 00 B0 13 D8 C6 B0 13 18 97 FD 23 7C 40 \r
+0C 00 5D 42 16 1E B0 13 46 DF B0 13 A8 E8 6C 43 \r
+B0 13 72 EA 7C 40 34 00 B0 13 D8 C6 A2 B3 30 0F \r
+FD 27 3E 40 10 00 7C 40 34 00 B0 13 2C D7 5C F3 \r
+5F 42 9A 1D 4F 5F 4C DF C2 4C 9A 1D 1E 83 F3 23 \r
+F2 D0 80 00 9A 1D B0 13 F4 E1 7C 40 32 00 B0 13 \r
+D8 C6 D2 43 78 1D B2 40 36 00 9E 1D B2 40 E2 04 \r
+A0 1D 3C 40 79 1D 0D 43 3E 40 1F 00 B0 13 72 ED \r
+3C 40 98 1D 0D 43 2E 43 B0 13 72 ED 32 D2 10 01 \r
+32 C2 03 43 FF 3F 32 C2 03 43 FF 3F 32 C2 03 43 \r
+FF 3F 32 C2 03 43 FF 3F 7C 40 3D 00 B0 13 D8 C6 \r
+7C B0 F0 FF 10 01 1A 14 CA 0C 6D 93 3C 24 5D 93 \r
+0E 24 6D 92 60 20 B0 13 6A 98 6D 42 B0 13 02 E9 \r
+C2 43 2F 1E 4C 43 4D 43 B0 13 02 E9 54 3C C2 93 \r
+2F 1E 1A 20 B2 B0 40 00 08 1E 09 20 B0 13 FA 97 \r
+5A 93 07 20 5C 42 30 1E B0 13 CC E9 02 3C B0 13 \r
+12 98 B0 13 44 98 C9 0C 5C 42 31 1E B0 13 20 98 \r
+B0 13 6A 98 6D 43 E0 3F B0 13 5C 98 C9 0C 5C 42 \r
+32 1E B0 13 20 98 7D 40 1F 00 7E 40 29 00 B0 13 \r
+76 EF 5D 43 D1 3F 5F 42 2E 1E 4F 93 24 24 C2 93 \r
+2F 1E 1A 20 4F 4F 2F 83 0F 24 1F 83 1C 20 B2 B0 \r
+40 00 08 1E 07 20 B0 13 FA 97 5C 42 30 1E B0 13 \r
+CC E9 02 3C B0 13 12 98 B0 13 44 98 CA 0C 5C 42 \r
+31 1E B0 13 36 98 07 3C B0 13 5C 98 CA 0C 5C 42 \r
+32 1E B0 13 36 98 19 16 10 01 5C 42 30 1E B0 13 \r
+26 EB CF 0C CC 0A B0 13 4C 98 4C 4F B0 13 28 98 \r
+10 01 B0 13 4C 98 5C 42 30 1E B0 13 28 98 10 01 \r
+B0 13 28 98 CC 0A 10 01 B0 13 78 98 CC 09 5E 43 \r
+B0 13 70 AF 10 01 B0 13 78 98 CC 0A 5E 43 B0 13 \r
+70 AF 10 01 CC 0A B0 13 5C 98 10 01 7D 40 4A 00 \r
+7E 40 60 00 B0 13 76 EF C9 0C 10 01 7D 40 48 00 \r
+7E 40 5E 00 B0 13 76 EF 10 01 7D 40 1E 00 7E 40 \r
+28 00 B0 13 76 EF 10 01 0D 43 6E 43 4F 43 B0 13 \r
+FC B4 CD 0C 10 01 1A 14 31 80 16 00 B0 13 C2 DB \r
+CA 0C 0A 93 03 20 3C 40 03 00 97 3C 5C 43 CD 0A \r
+B0 13 44 B0 4C 93 04 20 CC 0A B0 13 92 F0 F3 3F \r
+B0 13 98 F0 CD 0C C9 01 39 52 CC 09 2E 42 B0 13 \r
+60 ED 81 49 00 00 CF 01 3F 50 0C 00 81 4F 02 00 \r
+F1 40 09 00 04 00 E1 43 05 00 CD 01 3D 50 0E 00 \r
+3C 40 6C 1E B0 13 20 EA D1 4A 09 00 12 00 D1 42 \r
+75 1E 0D 00 B0 13 BE F0 C1 4C 13 00 D1 43 0C 00 \r
+B0 13 C2 F0 C1 4C 14 00 2C 43 3D 40 03 00 CE 01 \r
+B0 13 F0 B7 0C 93 59 20 B0 13 80 F0 C9 0C E1 43 \r
+05 00 CF 01 3F 50 0C 00 81 4F 02 00 CF 0A 3F 50 \r
+03 00 81 4F 00 00 79 90 03 00 06 24 59 93 02 20 \r
+B0 13 E0 E6 B0 13 0A E8 B0 13 DE DE 79 90 03 00 \r
+07 24 59 93 03 24 B0 13 EA E7 02 3C B0 13 0A E6 \r
+2C 43 2D 43 CE 01 B0 13 F0 B7 0C 93 05 24 CC 0A \r
+B0 13 92 F0 1C 43 29 3C 3F 40 7F 00 5F F1 0C 00 \r
+5F 93 09 24 7F 90 03 00 06 24 CC 0A B0 13 92 F0 \r
+3C 40 05 00 1A 3C EA 43 00 00 DA 41 0E 00 0A 00 \r
+D2 4A 0B 00 77 1D F1 90 40 00 0F 00 02 20 5F 43 \r
+02 3C 7F 40 03 00 CA 4F 01 00 D2 53 75 1E C2 93 \r
+75 1E 02 20 D2 43 75 1E 0C 43 31 50 16 00 19 16 \r
+10 01 3A 14 31 82 C9 0C F9 90 14 00 00 00 05 28 \r
+B0 13 C2 F0 C9 9C 14 00 74 20 3C 40 0E 00 0C 59 \r
+CD 01 B0 13 52 EF 91 92 6E 1E 02 00 6A 20 91 92 \r
+6C 1E 00 00 66 20 58 49 12 00 3A 40 05 00 0A 59 \r
+3C 40 05 00 0C 59 CD 08 B0 13 78 DC 0C 93 48 20 \r
+C2 93 70 1E 56 24 B0 13 C2 DB C7 0C 07 93 51 24 \r
+3C 40 03 00 0C 57 CD 0A 2E 42 B0 13 60 ED 6C 43 \r
+CD 07 B0 13 44 B0 4C 93 03 24 D2 93 74 1E 04 20 \r
+CC 07 B0 13 92 F0 3D 3C 5F 42 74 1E CE 0F 5E 53 \r
+C2 4E 74 1E 4F 4F DF 47 0B 00 72 1E C7 48 0A 00 \r
+E7 43 00 00 F9 90 40 00 13 00 02 20 5F 43 02 3C \r
+7F 40 03 00 C7 4F 01 00 D1 47 09 00 06 00 B0 13 \r
+BE F0 C1 4C 07 00 B0 13 02 9B B0 13 F0 9A CD 01 \r
+B0 13 10 9B D5 27 B0 13 D8 9A 0C 93 12 24 D0 3F \r
+B0 13 02 9B D1 4C 09 00 06 00 B0 13 BE F0 C1 4C \r
+07 00 B0 13 F0 9A CD 01 B0 13 10 9B 02 24 B0 13 \r
+D8 9A 31 52 37 16 10 01 3C 40 03 00 0C 59 CD 0A \r
+2E 42 B0 13 60 ED CC 09 4D 43 B0 13 68 E1 10 01 \r
+3E 40 07 00 5E F9 0A 00 3F 40 03 00 4F 8E 6C 43 \r
+10 01 F1 40 81 00 08 00 D1 49 0D 00 09 00 10 01 \r
+2D 52 6E 42 B0 13 6C C0 C9 0C 09 93 10 01 C2 43 \r
+17 1D 5F 42 F2 1C 2F 83 99 24 1F 83 3F 24 1F 83 \r
+23 24 1F 83 06 24 2F 83 96 20 F2 D0 20 00 F0 1C \r
+10 01 E2 43 F2 1C 3C 40 1E 1D 4D 43 4E 4D 5E 02 \r
+5F 4E F3 1C 47 18 0F 5F 5E 4E F4 1C 0E 5F 2C 53 \r
+8C 4E FE FF 5D 53 7D 90 09 00 F0 2B E2 43 18 1D \r
+F2 40 09 00 17 1D 10 01 E2 43 F2 1C 5E 42 F3 1C \r
+47 18 0E 5E 5F 42 F4 1C 0E 5F 82 4E 1A 1D 5F 42 \r
+F5 1C 47 18 0F 5F 5D 42 F6 1C 0F 5D 82 4F 1C 1D \r
+D2 43 18 1D 4F 8E C2 4F 17 1D 10 01 3E 40 BF FF \r
+1E F2 08 1E 5F 42 F3 1C 5F 03 3F F0 C0 FF 0E DF \r
+82 4E 08 1E 3F 40 7F 00 5F F2 F3 1C C2 4F 30 1E \r
+D2 42 F4 1C 31 1E D2 42 F5 1C 32 1E 5F 42 F6 1C \r
+47 18 0F 5F 5E 42 F7 1C 0E 5F 82 4E CE 1E D2 42 \r
+F8 1C CC 1E D2 42 F9 1C CB 1E D2 42 FA 1C E2 1E \r
+D2 42 FB 1C E3 1E 5F 42 FC 1C 47 18 0F 5F 5E 42 \r
+FD 1C 0E 5F CF 0E 1F 52 D4 1E 1F 82 D2 1E 82 4F \r
+D4 1E 82 4E D2 1E 5F 42 FE 1C 47 18 0F 5F 5C 42 \r
+FF 1C 0C 5F 82 4C 20 1E 1D 42 1A 1E 1E 42 1C 1E \r
+1F 42 1E 1E B0 13 BA 93 7C 40 5A 00 3D 40 0A F5 \r
+5E 43 B0 13 70 AF D2 43 EE 1C 10 01 F2 40 03 00 \r
+F2 1C D2 43 17 1D 10 01 0A 14 31 82 92 B3 8C 1C \r
+0F 20 A2 B2 8C 1C 0C 20 3F 40 0C 00 1F 52 E6 1E \r
+6F 13 4C 93 0C 24 5C 43 6D 43 80 13 0E 1E 07 3C \r
+5C 43 B0 13 D2 CE 5C 43 5D 43 80 13 0E 1E A2 B3 \r
+0C 1E 1B 20 92 B3 8C 1C 12 20 B2 B2 8C 1C 0F 20 \r
+3F 40 0C 00 1F 52 E4 1E 6F 13 4C 93 5B 24 82 93 \r
+0C 1E 58 20 6C 43 6D 43 80 13 12 1E 53 3C 6C 43 \r
+B0 13 D2 CE 6C 43 5D 43 F7 3F 6A 43 B2 B2 0C 1E \r
+28 20 B2 B0 10 00 0C 1E 20 20 B2 B0 20 00 0C 1E \r
+14 20 B2 B0 40 00 0C 1E 0C 20 B2 B0 80 00 0C 1E \r
+1F 24 CC 01 3D 40 68 F5 2E 42 B0 13 60 ED 5A 43 \r
+17 3C CC 01 3D 40 6E F5 F7 3F CC 01 3D 40 74 F5 \r
+3E 40 06 00 B0 13 60 ED 0B 3C CC 01 3D 40 7C F5 \r
+F7 3F CC 01 3D 40 84 F5 3E 40 06 00 B0 13 60 ED \r
+CC 0A B0 13 D2 CE CC 0A 6D 42 80 13 12 1E 6A 93 \r
+07 24 7C 40 46 00 CD 01 5E 43 B0 13 70 AF 06 3C \r
+7C 40 5A 00 CD 01 5E 43 B0 13 70 AF 82 43 0C 1E \r
+A2 D2 0C 1E 92 B3 8C 1C 10 24 B0 13 22 EF 6C 93 \r
+0C 20 7C 40 17 00 B0 13 A4 9D 7C 40 18 00 B0 13 \r
+A4 9D 7C 40 19 00 B0 13 A4 9D 82 43 8C 1C 31 52 \r
+0A 16 10 01 7D 40 03 00 B0 13 02 E9 10 01 2A 14 \r
+C2 93 93 1E 8C 24 5D 93 78 24 6D 93 15 24 6D 92 \r
+8D 20 B0 13 E0 DF C2 43 58 1E 7C 40 1F 00 4D 43 \r
+B0 13 02 E9 6C 43 4D 43 B0 13 02 E9 7C 40 03 00 \r
+4D 43 B0 13 02 E9 7A 3C 5F 42 5E 1E 0F 93 13 24 \r
+1F 83 0A 24 5A 42 5B 1E 7C 40 1A 00 7D 40 5A 00 \r
+5E 43 B0 13 66 C6 10 3C 5A 42 5A 1E 7C 40 1A 00 \r
+7D 40 59 00 F5 3F 5A 42 59 1E 7C 40 1A 00 7D 40 \r
+58 00 5E 43 B0 13 66 C6 CC 0A B0 13 C0 D3 3D 40 \r
+0A 00 B0 13 22 EC B0 13 9A E6 3E 40 CD CC 3F 40 \r
+4C 3E B0 13 3A B7 C8 0C C9 0D 1C 42 5C 1E B0 13 \r
+9A E6 3E 40 CD CC 3F 40 4C 3F B0 13 3A B7 CE 0C \r
+CF 0D CC 08 CD 09 B0 13 E6 9E B0 13 72 D7 82 4C \r
+5C 1E 0D 43 7E 40 03 00 4F 43 B0 13 FC B4 CD 0C \r
+7C 40 47 00 5E 43 B0 13 70 AF CC 0A B0 13 6E EE \r
+4C 93 08 20 6C 43 4D 43 B0 13 02 E9 7C 40 03 00 \r
+5D 43 9F 3F 6C 43 5D 43 97 3F B0 13 3C ED 4C 93 \r
+0B 20 82 43 5C 1E B0 13 8A C3 B2 40 10 0E 60 1E \r
+D2 43 58 1E D2 43 5E 1E 7C 40 1F 00 E9 3F 7C 40 \r
+47 00 3D 40 06 F5 5E 43 B0 13 70 AF 28 16 10 01 \r
+3B 40 80 00 01 3C 0B 43 0A 14 09 14 08 14 07 14 \r
+21 83 3F B0 80 7F 7B 24 3D B0 80 7F 05 20 0C 4E \r
+0D 4F 8B 10 0D EB 73 3C 5D 02 08 4D 4D 10 38 F0 \r
+00 FF 0D D8 5F 02 08 4F 4F 10 38 F0 00 FF 0F D8 \r
+09 4C 0A 4D 3D F0 80 00 C1 4D 00 00 0B EA 0B EF \r
+3B C0 7F FF 3A D0 80 00 3F D0 80 00 0A 9F 02 20 \r
+09 9E 0A 24 0B 2C 0D 4F 0F 4A 0A 4D 0C 4E 0E 49 \r
+09 4C 81 EB 00 00 02 3C 0B 93 4F 20 0C 43 08 4A \r
+88 10 47 48 8F 10 48 8F 8F 10 0E 24 38 90 19 00 \r
+34 2C 12 C3 4F 10 5E 00 5C 00 3C B0 00 10 02 24 \r
+3C D0 00 20 18 83 F5 23 0B 93 0C 24 08 8C 09 7E \r
+4A 7F 0C 48 4A 93 12 30 5C 02 09 69 4A 6A 17 83 \r
+2C 24 F8 3F 09 5E 4A 6F 09 28 4A 10 59 00 5C 00 \r
+3C B0 00 10 02 24 3C D0 00 20 17 53 3C B0 00 80 \r
+07 24 09 63 4A 63 07 63 3C B0 00 60 01 20 19 C3 \r
+17 93 13 38 37 90 FF 00 13 34 7A C0 80 00 87 10 \r
+D1 51 00 00 00 00 57 00 0A D7 0C 49 0D 4A 21 53 \r
+07 16 08 16 09 16 0A 16 10 01 0D 43 0C 43 F7 3F \r
+3D 40 FF FE D1 61 00 00 00 00 5D 00 3C 43 EF 3F \r
+6D 93 1E 24 5D 93 8A 20 C2 93 40 1E 08 20 3D 40 \r
+3A 1E 7C 40 5A 00 5E 43 B0 13 70 AF 07 3C 3D 40 \r
+38 1E 7C 40 5A 00 5E 43 B0 13 70 AF 7C 40 27 00 \r
+5D 43 B0 13 02 E9 7C 40 28 00 5D 43 80 00 02 E9 \r
+B2 B0 20 00 8C 1C 6A 24 C2 93 40 1E 38 20 5F 42 \r
+35 1E 4F 93 63 24 4F 4F 1F 83 1E 24 1F 83 16 24 \r
+1F 83 0E 24 1F 83 06 24 3F 80 03 00 1B 24 1F 83 \r
+1F 24 10 01 5D 42 3A 1E 7C 40 21 00 B0 13 2E A1 \r
+5D 42 3B 1E 7C 40 22 00 B0 13 2E A1 5D 42 3C 1E \r
+7C 40 23 00 B0 13 2E A1 5D 42 3D 1E 7C 40 24 00 \r
+B0 13 2E A1 5D 42 3E 1E 7C 40 25 00 B0 13 2E A1 \r
+5D 42 3F 1E 7C 40 26 00 5E 43 80 00 66 C6 5F 42 \r
+35 1E 1F 83 28 24 1F 83 20 24 1F 83 18 24 1F 83 \r
+10 24 1F 83 08 24 1F 83 21 20 5D 42 38 1E 7C 40 \r
+21 00 B0 13 2E A1 5D 42 39 1E 7C 40 22 00 B0 13 \r
+2E A1 5D 42 3A 1E 7C 40 23 00 B0 13 2E A1 5D 42 \r
+3B 1E 7C 40 24 00 B0 13 2E A1 5D 42 3C 1E 7C 40 \r
+25 00 B0 13 2E A1 5D 42 3D 1E CC 3F 10 01 5E 43 \r
+B0 13 66 C6 10 01 A2 D3 08 1E 82 93 76 1E 03 24 \r
+A2 B2 08 1E 68 20 B2 B0 20 00 76 1E 5B 20 B2 B0 \r
+40 00 76 1E 4B 20 82 93 76 1E 69 24 92 B3 76 1E \r
+32 20 A2 B3 76 1E 1A 20 A2 B2 76 1E 0D 20 B2 B2 \r
+76 1E 5D 24 1F 42 E4 1E 0F 0F 6C 43 4F 13 B2 D2 \r
+8C 1C B2 C2 76 1E 53 3C 1F 42 E6 1E 0F 0F 5C 43 \r
+4F 13 A2 D2 8C 1C A2 C2 76 1E 49 3C C2 43 89 1E \r
+6C 43 6D 42 80 13 12 1E 1F 42 E4 1E 1F 4F 10 00 \r
+82 4F E4 1E 00 18 D2 4F 08 00 12 1E B2 D2 8C 1C \r
+A2 C3 76 1E 34 3C 5C 43 6D 42 80 13 0E 1E 1F 42 \r
+E6 1E 1F 4F 10 00 82 4F E6 1E 00 18 D2 4F 08 00 \r
+0E 1E A2 D2 8C 1C 92 C3 76 1E 21 3C B2 F0 BF FF \r
+76 1E 1F 42 E4 1E 3F 0F 04 00 6C 43 4F 13 92 D3 \r
+8C 1C 15 3C B2 F0 DF FF 76 1E 1F 42 E6 1E 3F 0F \r
+04 00 5C 43 F3 3F E2 B3 01 02 03 24 D2 B3 01 02 \r
+04 20 92 D3 0C 1E B2 D2 0C 1E 82 43 76 1E 82 93 \r
+08 1E 09 24 92 B3 08 1E 06 24 92 C3 08 1E B0 13 \r
+F2 EE 92 D3 8C 1C A2 C3 08 1E 10 01 1A 14 C9 0C \r
+1A 42 44 1E 4D 4D 1D 5A 0C 00 0D 8E 3D 80 13 00 \r
+0D 93 78 34 3E 40 1A 00 1E 52 44 1E 6F 4E 3F F0 \r
+03 00 1F 83 4F 24 1F 83 2C 20 CA 43 12 00 2F 42 \r
+6F BE 1A 20 1C 42 44 1E D2 9C 11 00 48 1E 09 2C \r
+C2 93 4A 1E 03 20 B0 13 DE CF 09 3C 8C 43 18 00 \r
+06 3C B0 13 1A CE 1F 42 44 1E DF 53 11 00 CC 09 \r
+5D 43 B0 13 4C D9 4E 3C EE C2 00 00 1F 42 44 1E \r
+8F 43 00 00 8F 43 02 00 1C 42 44 1E B0 13 DE CF \r
+41 3C 3C 40 80 00 5C 8A 13 00 CF 0A 2D 4F 1E 4F \r
+02 00 3F 40 00 02 B0 13 82 D5 1C 5A 0C 00 3C 50 \r
+00 02 8A 4C 0C 00 1F 42 44 1E CF 43 0F 00 3F 40 \r
+1A 00 1F 52 44 1E 3E 40 FC 00 6E FF 5E D3 CF 4E \r
+00 00 20 3C 3C 40 40 00 5C 8A 13 00 2D 4A 1E 4A \r
+02 00 3F 40 80 1C B0 13 82 D5 1F 42 44 1E 1C 5F \r
+0A 00 3C 50 00 06 8F 4C 0C 00 1F 42 44 1E DF 43 \r
+0F 00 3F 40 1A 00 1F 52 44 1E 6E 4F 5E C3 6E D3 \r
+CF 4E 00 00 19 16 10 01 31 80 16 00 B0 13 78 E9 \r
+5C 42 E2 1E 4F 4C 81 4F 0E 00 81 43 10 00 5F 42 \r
+E3 1E 81 4F 12 00 81 43 14 00 4C 4C 0D 43 6E 43 \r
+4F 43 B0 13 FC B4 CD 0C 7C 40 4A 00 5E 43 B0 13 \r
+70 AF 7C 40 1E 00 5D 43 B0 13 02 E9 1C 41 12 00 \r
+1D 41 14 00 6E 43 4F 43 B0 13 FC B4 CD 0C 7C 40 \r
+48 00 5E 43 B0 13 70 AF 4E 43 3A 3C 4F 4E 0F 93 \r
+1D 24 1F 83 35 20 0F 43 81 43 00 00 B1 40 3B 00 \r
+02 00 81 43 04 00 B1 40 23 00 06 00 F1 40 48 00 \r
+08 00 00 18 F1 40 02 E7 0A 00 CC 01 3C 50 12 00 \r
+6D 43 4E 43 B0 13 B6 89 4E 43 1A 3C 0F 43 81 43 \r
+00 00 B1 40 17 00 02 00 81 43 04 00 B1 40 23 00 \r
+06 00 F1 40 4A 00 08 00 00 18 F1 40 E6 D6 0A 00 \r
+CC 01 3C 50 0E 00 6D 43 4E 43 B0 13 B6 89 5E 43 \r
+92 B3 08 1E 0B 20 92 B3 76 1E C0 27 D2 41 0E 00 \r
+E2 1E D2 41 12 00 E3 1E A2 D2 8C 1C 82 43 76 1E \r
+B2 D0 00 02 8C 1C 31 50 16 00 10 01 0A 14 31 80 \r
+16 00 B0 13 78 E9 B2 B0 40 00 08 1E 0D 20 B0 13 \r
+0E EB 3C B0 00 80 0F 7F 3F E3 81 4C 0E 00 81 4F \r
+10 00 1A 42 D2 1E 44 3C 1F 42 D2 1E 3F B0 00 80 \r
+0E 7E 3E E3 81 4F 0E 00 81 4E 10 00 CA 0F 38 3C \r
+B2 B0 40 00 08 1E 08 20 7C 40 1D 00 7D 40 46 00 \r
+5E 43 B0 13 66 C6 07 3C 7C 40 1D 00 7D 40 43 00 \r
+5E 43 B0 13 66 C6 7C 40 1F 00 5D 43 B0 13 02 E9 \r
+7C 40 0F 00 5D 43 B0 13 02 E9 3F 40 19 FC B1 43 \r
+00 00 B1 40 E7 03 02 00 81 43 04 00 B1 40 06 00 \r
+06 00 F1 40 49 00 08 00 00 18 F1 40 02 E7 0A 00 \r
+CC 01 3C 50 0E 00 7D 40 03 00 5E 43 B0 13 B6 89 \r
+92 B3 08 1E 1E 20 92 B3 76 1E C2 27 B2 B0 40 00 \r
+08 1E 07 20 1C 41 0E 00 B0 13 2A ED 81 4C 12 00 \r
+03 3C 91 41 0E 00 12 00 1F 41 12 00 0F 8A 81 4F \r
+14 00 92 51 14 00 D4 1E 92 41 12 00 D2 1E A2 D2 \r
+8C 1C 82 43 76 1E 31 50 16 00 0A 16 10 01 B2 B0 \r
+20 00 08 1E 77 20 B0 13 3A EF 4C 93 73 20 A2 B2 \r
+76 1E 70 24 1F 42 EE 1D 0F 93 68 20 B0 13 BA ED \r
+B0 13 F0 DC 7C 40 0A 00 B0 13 62 F0 7C 42 B0 13 \r
+68 F0 82 43 F2 1D 82 43 F4 1D 7C 40 05 00 B0 13 \r
+34 F0 7C 40 0C 00 5D 42 16 1E B0 13 28 DD 92 43 \r
+EE 1D 7C 40 17 00 6D 43 B0 13 02 E9 7C 40 18 00 \r
+6D 43 B0 13 02 E9 7C 40 19 00 6D 43 B0 13 02 E9 \r
+4C 43 B0 13 C2 E5 0C 93 0F 20 4C 43 1D 42 F2 1D \r
+1E 42 F4 1D B0 13 8C DA 4C 43 B0 13 86 CF 4C 43 \r
+B0 13 C2 E5 2C 93 25 24 4C 43 B0 13 C2 E5 1C 93 \r
+27 20 A2 43 EE 1D 82 93 F4 1D 0A 20 82 93 F2 1D \r
+07 20 4C 43 B0 13 A4 E2 82 4C F2 1D 82 4D F4 1D \r
+7C 40 17 00 B0 13 56 A6 7C 40 18 00 B0 13 56 A6 \r
+7C 40 19 00 B0 13 56 A6 7C 40 13 00 6D 43 80 00 \r
+02 E9 3C 40 99 19 B0 13 A0 CC D1 3F 2F 93 02 20 \r
+80 00 EE D4 10 01 7D 40 03 00 B0 13 02 E9 10 01 \r
+1A 14 31 80 18 00 B0 13 80 F0 C9 0C B0 13 98 F0 \r
+81 4C 10 00 CF 01 2F 52 81 4F 12 00 F1 42 14 00 \r
+7A 40 03 00 C1 4A 15 00 CD 01 3D 50 06 00 3C 40 \r
+8A 1E B0 13 20 EA D1 43 04 00 D1 42 92 1E 05 00 \r
+D1 43 0A 00 B0 13 C2 F0 C1 4C 0B 00 2C 43 3D 40 \r
+03 00 CE 01 3E 50 10 00 B0 13 F0 B7 C1 4A 15 00 \r
+CF 01 2F 52 81 4F 12 00 CF 01 3F 50 0C 00 81 4F \r
+10 00 79 90 03 00 06 24 59 93 02 20 B0 13 E0 E6 \r
+B0 13 0A E8 B0 13 DE DE 3A 40 06 00 79 90 03 00 \r
+07 24 59 93 03 24 B0 13 EA E7 02 3C B0 13 0A E6 \r
+2C 43 2D 43 CE 01 3E 50 10 00 B0 13 F0 B7 0C 93 \r
+1D 20 3F 40 7F 00 5F F1 04 00 5F 93 03 24 7F 90 \r
+06 00 14 20 CC 01 CD 01 3D 50 06 00 2E 42 B0 13 \r
+60 ED 2C 41 1D 41 02 00 B0 13 A8 ED CC 01 3C 50 \r
+0C 00 B0 13 5E EF D2 53 92 1E 0A 43 CC 0A 31 50 \r
+18 00 19 16 10 01 0A 14 21 83 C1 43 00 00 F2 90 \r
+03 00 78 1D 6B 20 7C 40 3B 00 B0 13 2C D7 CE 0C \r
+7C 40 3B 00 B0 13 2C D7 4E 9C F9 23 4E 93 61 24 \r
+CC 01 5D 43 B0 13 A8 E0 6F 41 3F 50 03 00 4E 4E \r
+0E 9F 38 20 F1 90 1F 00 00 00 34 2C F1 90 0B 00 \r
+00 00 30 28 3C 40 79 1D 0D 43 3E 40 1F 00 B0 13 \r
+72 ED E2 41 79 1D 3C 40 7A 1D 6D 41 B0 13 A8 E0 \r
+3C 40 98 1D 6D 43 B0 13 A8 E0 F2 B0 80 FF 99 1D \r
+14 24 92 53 AC 1D 82 63 AE 1D B0 13 08 DB 4C 93 \r
+30 20 5C 42 98 1D B0 13 98 E1 C2 4C 98 1D F2 F0 \r
+7F 00 99 1D B0 13 CA E7 24 3C 92 53 A8 1D 82 63 \r
+AA 1D 1F 3C 92 53 B0 1D 82 63 B2 1D 0A 42 32 C2 \r
+03 43 7C 40 36 00 B0 13 D8 C6 7C 40 3D 00 B0 13 \r
+D8 C6 7C B0 F0 FF F9 23 7C 40 3A 00 B0 13 D8 C6 \r
+7C 40 34 00 B0 13 D8 C6 02 4A 03 3C 32 C2 03 43 \r
+FF 3F 21 53 0A 16 10 01 C2 93 40 1E 20 20 D2 53 \r
+3F 1E D2 53 41 1E 5F 42 41 1E 5F 83 7F 90 12 00 \r
+04 28 F2 42 35 1E C2 43 41 1E F2 90 3A 00 3F 1E \r
+0A 20 F2 40 30 00 3F 1E D2 53 3E 1E D2 43 37 1E \r
+F2 40 07 00 35 1E F2 90 3A 00 3E 1E 51 20 D2 43 \r
+35 1E D2 43 36 1E 3F 40 30 00 C2 4F 3E 1E D2 53 \r
+3D 1E F2 90 3A 00 3D 1E 43 20 D2 53 35 1E C2 4F \r
+3D 1E D2 53 3C 1E F2 90 36 00 3C 1E 39 20 D2 53 \r
+35 1E C2 4F 3C 1E D2 53 3B 1E F2 90 3A 00 3B 1E \r
+2F 20 D2 53 35 1E C2 4F 3B 1E D2 53 3A 1E 5E 42 \r
+3A 1E 7E 90 32 00 1F 24 7E 90 36 00 21 20 D2 53 \r
+35 1E C2 4F 3A 1E D2 53 39 1E F2 90 3A 00 39 1E \r
+17 20 D2 53 35 1E C2 4F 39 1E D2 53 38 1E F2 90 \r
+32 00 38 1E 0D 20 B0 13 4A E8 D2 43 34 1E 5D 43 \r
+B0 13 10 A0 05 3C D2 43 40 1E 5D 43 B0 13 10 A0 \r
+B2 D0 20 00 8C 1C 10 01 4D 4D 1D 93 19 24 2D 93 \r
+2A 24 2D 92 54 20 82 43 18 1E B0 13 3C EA 7C 40 \r
+0B 00 4D 43 B0 13 02 E9 7C 40 09 00 4D 43 B0 13 \r
+02 E9 6C 43 4D 43 B0 13 1A AA 4D 43 80 00 02 E9 \r
+92 43 18 1E B0 13 4C DA B2 B0 40 00 08 1E 06 20 \r
+7C 40 09 00 5D 43 B0 13 02 E9 05 3C 7C 40 0B 00 \r
+5D 43 B0 13 02 E9 82 93 24 1E 29 24 B2 B0 40 00 \r
+08 1E 19 20 1C 42 20 1E B0 13 B0 E9 3C 90 10 27 \r
+0D 34 0C 93 0D 34 3C E3 1C 53 B0 13 02 AA 4D 43 \r
+B0 13 1A AA 5D 43 B0 13 02 E9 0B 3C 3C 40 0F 27 \r
+B0 13 F0 A9 06 3C 1C 42 20 1E 0C 93 EC 3B B0 13 \r
+F0 A9 7C 40 46 00 CD 0B 5E 43 80 00 70 AF 10 01 \r
+B0 13 02 AA 5D 43 B0 13 1A AA 4D 43 B0 13 02 E9 \r
+10 01 3C B0 00 80 0D 7D 3D E3 6E 42 7F 40 03 00 \r
+B0 13 FC B4 CB 0C 6C 43 10 01 B0 13 02 E9 7C 40 \r
+03 00 10 01 3A 14 31 80 12 00 B0 13 78 E9 B2 B0 \r
+40 00 08 1E 12 20 7C 40 09 00 5D 43 B0 13 02 E9 \r
+1C 42 20 1E B0 13 B0 E9 B0 13 FE AA 37 40 0C FE \r
+38 43 39 40 0F 27 0A 43 30 3C 7C 40 0B 00 5D 43 \r
+B0 13 02 E9 1E 42 20 1E 3E B0 00 80 0F 7F 3F E3 \r
+81 4E 0E 00 81 4F 10 00 37 40 9C FF 38 43 39 40 \r
+A0 0F 0A 43 1A 3C CF 07 CE 08 81 4E 00 00 81 49 \r
+02 00 81 4A 04 00 B1 40 16 00 06 00 F1 40 46 00 \r
+08 00 00 18 F1 40 02 E7 0A 00 CC 01 3C 50 0E 00 \r
+6D 42 7E 40 03 00 B0 13 B6 89 92 B3 08 1E 19 20 \r
+92 B3 76 1E E0 27 B2 B0 40 00 08 1E 06 20 1C 41 \r
+0E 00 B0 13 94 E9 B0 13 FE AA 1C 41 0E 00 1D 42 \r
+1A 1E 1E 42 1C 1E 1F 42 1E 1E B0 13 BA 93 A2 D2 \r
+8C 1C 82 43 76 1E 31 50 12 00 37 16 10 01 3C B0 \r
+00 80 0F 7F 3F E3 81 4C 12 00 81 4F 14 00 10 01 \r
+4D 4D 1D 93 14 24 2D 93 34 24 2D 92 63 20 82 43 \r
+D0 1E 6C 43 4D 43 B0 13 E6 AB 7C 40 0F 00 4D 43 \r
+B0 13 02 E9 7C 40 1F 00 4D 43 80 00 02 E9 92 43 \r
+D0 1E 7C 40 1F 00 5D 43 B0 13 02 E9 7C 40 0F 00 \r
+5D 43 B0 13 02 E9 B2 B0 40 00 08 1E 08 20 7C 40 \r
+1D 00 7D 40 46 00 5E 43 B0 13 66 C6 07 3C 7C 40 \r
+1D 00 7D 40 43 00 5E 43 B0 13 66 C6 4C 43 B0 13 \r
+9C BD B2 B0 40 00 08 1E 04 20 B0 13 0E EB CB 0C \r
+02 3C 1B 42 D2 1E 0B 93 05 38 6C 43 5D 43 B0 13 \r
+E6 AB 0B 3C 3B E3 1B 53 6C 43 4D 43 B0 13 02 E9 \r
+7C 40 03 00 5D 43 B0 13 02 E9 3B 90 E8 03 02 38 \r
+3B 40 E7 03 CC 0B 3C B0 00 80 0D 7D 3D E3 7E 40 \r
+03 00 5F 43 B0 13 FC B4 CD 0C 7C 40 49 00 5E 43 \r
+80 00 70 AF 10 01 B0 13 02 E9 7C 40 03 00 4D 43 \r
+B0 13 02 E9 10 01 5F 42 F2 1C 2F 83 03 24 1F 83 \r
+2C 24 10 01 D2 93 18 1D 16 24 E2 93 18 1D 5D 20 \r
+CF 0C 5F 02 1E 4F 1E 1D CF 0E 8F 10 C2 4F F3 1C \r
+C2 4E F4 1C 4C 4C 3E 40 F5 1C 7F 40 03 00 B0 13 \r
+CC AC FD 2B 10 01 1F 42 1A 1D 0F 5C CE 0F 8E 10 \r
+C2 4E F3 1C C2 4F F4 1C 4C 4C 3E 40 F5 1C 7F 40 \r
+03 00 B0 13 CC AC FD 2B 10 01 1F 42 08 1E 7F F0 \r
+C0 00 4F 5F 3E 40 7F 00 5E F2 30 1E 4E DF C2 4E \r
+F3 1C D2 42 31 1E F4 1C D2 42 32 1E F5 1C 1E 42 \r
+CE 1E CF 0E 8F 10 C2 4F F6 1C C2 4E F7 1C D2 42 \r
+CC 1E F8 1C D2 42 CB 1E F9 1C D2 42 E2 1E FA 1C \r
+D2 42 E3 1E FB 1C 1E 42 D2 1E CF 0E 8F 10 8F 11 \r
+C2 4F FC 1C C2 4E FD 1C 1E 42 20 1E CF 0E 8F 10 \r
+8F 11 C2 4F FE 1C C2 4E FF 1C 10 01 1E 53 CE 4C \r
+FF FF 5F 53 7F 90 13 00 10 01 0A 14 CA 0D 6A 92 \r
+1F 24 B2 B0 40 00 08 1E 10 20 5C 42 00 1E B0 13 \r
+9A E6 3E 40 12 14 3F 40 1F 3F B0 13 3A B7 B0 13 \r
+72 D7 4C 4C B0 13 96 AD 04 3C 5C 42 00 1E B0 13 \r
+96 AD 7C 40 47 00 5E 43 B0 13 70 AF 5A 93 1D 24 \r
+6A 92 37 20 7C 40 20 00 4D 43 B0 13 02 E9 7C 40 \r
+0A 00 4D 43 B0 13 A6 AD 4D 43 B0 13 A6 AD 4D 43 \r
+B0 13 02 E9 7C 40 0C 00 4D 43 B0 13 02 E9 7C 40 \r
+0E 00 4D 43 B0 13 02 E9 1C 3C 7C 40 20 00 B0 13 \r
+B0 AD B2 B0 40 00 08 1E 09 20 7C 40 0B 00 B0 13 \r
+B0 AD 7C 40 0C 00 B0 13 B0 AD 07 3C 7C 40 0A 00 \r
+5D 43 B0 13 A6 AD B0 13 B0 AD 7C 40 0E 00 B0 13 \r
+B0 AD 0A 16 10 01 0D 43 7E 40 03 00 5F 43 B0 13 \r
+FC B4 CD 0C 10 01 B0 13 02 E9 7C 40 0B 00 10 01 \r
+5D 43 B0 13 02 E9 10 01 0A 14 CA 0D 6A 92 3A 24 \r
+B2 B0 40 00 08 1E 18 20 1C 42 02 1E 1D 42 04 1E \r
+B0 13 44 E0 3E 40 83 86 3F 40 7E 3D B0 13 3A B7 \r
+B0 13 58 D4 3D 90 1E 00 04 28 11 20 3C 90 80 84 \r
+0E 2C B0 13 84 AE 17 3C 1C 42 02 1E 1D 42 04 1E \r
+3D 90 1E 00 09 28 03 20 3C 90 80 84 05 28 3C 40 \r
+3F 0D 3D 40 03 00 ED 3F 3E 40 0A 00 0F 43 B0 13 \r
+8E D0 B0 13 84 AE 7C 40 5A 00 5E 43 B0 13 70 AF \r
+5A 93 12 24 6A 92 24 20 7C 40 11 00 4D 43 B0 13 \r
+02 E9 7C 40 12 00 4D 43 B0 13 02 E9 7C 40 29 00 \r
+4D 43 B0 13 02 E9 14 3C B2 B0 40 00 08 1E 06 20 \r
+7C 40 12 00 5D 43 B0 13 02 E9 05 3C 7C 40 11 00 \r
+5D 43 B0 13 02 E9 7C 40 29 00 5D 43 B0 13 02 E9 \r
+0A 16 10 01 7E 40 06 00 7F 40 03 00 B0 13 FC B4 \r
+CD 0C 10 01 6A 14 31 80 06 00 C6 0C 09 43 3A 40 \r
+00 1C 7F 40 03 00 81 4F 00 00 2F 46 1F 93 06 24 \r
+0F 93 0B 20 58 46 02 00 C7 09 10 3C 5C 46 02 00 \r
+B0 13 F2 E3 C7 0C 07 93 02 20 0C 43 4D 3C 58 47 \r
+09 00 3F 40 03 00 0F 57 81 4F 02 00 24 43 0F 42 \r
+32 C2 03 43 1E 43 6E 9A 39 20 EA 42 00 00 02 4F \r
+3F 40 0B 00 0F 5A 6F 4F 3F F0 3F 00 4E 48 0F 9E \r
+2A 20 25 46 15 93 0E 20 78 90 3F 00 06 20 3F 40 \r
+03 00 0F 57 81 4F 04 00 05 3C 3F 40 07 00 0F 5A \r
+81 4F 04 00 1C 41 04 00 1D 41 02 00 2E 42 B0 13 \r
+2E E6 4C 4C 05 93 02 24 0C 93 0D 20 5F 4A 01 00 \r
+2E 41 4F 9E 08 2C 09 93 02 24 D9 43 00 00 81 4F \r
+00 00 C9 0A 04 3C DA 43 00 00 01 3C 02 4F 3A 50 \r
+23 00 14 83 BC 23 CC 09 31 50 06 00 64 16 10 01 \r
+4A 14 C9 0E 4C 4C 3C 80 46 00 53 24 1C 83 4C 24 \r
+1C 83 46 24 1C 83 41 24 1C 83 3B 24 3C 80 10 00 \r
+3C 90 09 00 55 2C 5C 06 00 18 50 4C 9E AF FC AF \r
+00 00 F6 AF 00 00 F2 AF 00 00 E8 AF 00 00 E0 AF \r
+00 00 DC AF 00 00 D4 AF 00 00 CC AF 00 00 C2 AF \r
+00 00 7A 40 03 00 78 40 22 00 2E 3C 6A 43 78 40 \r
+21 00 2A 3C 6A 43 78 40 23 00 26 3C 6A 42 F7 3F \r
+6A 43 78 40 25 00 20 3C 7A 40 03 00 78 40 24 00 \r
+1B 3C 6A 42 F0 3F 7A 40 05 00 E5 3F 7A 40 06 00 \r
+E6 3F 6A 43 78 40 1A 00 0F 3C 7A 40 03 00 FA 3F \r
+6A 43 78 40 1C 00 08 3C 7A 40 03 00 78 40 1B 00 \r
+03 3C 6A 42 78 40 1A 00 C7 0D 4A 4A 06 43 CC 08 \r
+4C 56 7D 47 CE 09 B0 13 66 C6 16 53 1A 83 F7 23 \r
+46 16 10 01 4A 14 21 83 C8 0D C7 0C 39 40 B9 1D \r
+CC 01 0D 43 1E 43 B0 13 72 ED 46 43 09 98 25 24 \r
+2F 43 6F 99 22 20 5A 49 09 00 7A 90 3E 00 1D 2C \r
+57 93 13 24 3C 40 03 00 0C 59 3D 40 03 00 0D 58 \r
+2E 42 B0 13 2E E6 0C 93 10 20 4F 4A CA 01 3A 50 \r
+E0 FF 0A 5F DA 43 00 00 08 3C C2 9A B6 1D 05 2C \r
+4A 4A CF 01 0F 8A DF 43 3D 00 39 50 0C 00 56 53 \r
+D5 27 CE 01 0F 43 4C 43 CE 93 00 00 04 24 1E 53 \r
+5C 53 FA 27 09 3C 67 93 04 20 7C 50 20 00 4F 4C \r
+03 3C 3F 40 3D 00 4F 8C 67 93 0B 24 5E 42 B7 1D \r
+0F 9E 12 38 5E 42 B6 1D 0F 9E 0F 20 D2 83 B6 1D \r
+0C 3C 5E 42 B6 1D 0E 9F 07 38 5E 42 B7 1D 0E 9F \r
+04 34 C2 4F B7 1D 01 3C 0F 43 C8 4F 09 00 CC 0F \r
+21 53 46 16 10 01 0A 14 CA 0C 5C 43 B0 13 D2 CE \r
+5C 43 6D 42 80 13 0E 1E 5C 43 5D 43 B0 13 26 97 \r
+1A 93 02 20 5F 43 01 3C 6F 43 C2 4F F2 1C C2 43 \r
+F3 1C C2 43 F4 1C C2 43 F5 1C 7C 40 17 00 6D 43 \r
+B0 13 02 E9 7C 40 18 00 6D 43 B0 13 02 E9 7C 40 \r
+19 00 6D 43 B0 13 02 E9 3C 40 00 20 B0 13 A0 CC \r
+B0 13 BA ED 82 4A EA 1C B2 40 10 0E EC 1C B0 13 \r
+A2 B8 4C 93 06 24 1A 93 02 20 B0 13 8A C3 B0 13 \r
+0C DA 82 43 EA 1C B0 13 E0 DF B0 13 0E EE 3C 40 \r
+00 20 B0 13 A0 CC C2 43 1D 02 82 43 76 1E 7C 40 \r
+17 00 6D 42 B0 13 02 E9 7C 40 18 00 6D 42 B0 13 \r
+02 E9 7C 40 19 00 6D 42 B0 13 02 E9 5C 43 B0 13 \r
+D2 CE 5C 43 6D 42 B0 13 26 97 92 D3 8C 1C 0A 16 \r
+10 01 0A 14 CA 0C 5D 93 05 24 6D 92 34 20 C2 43 \r
+CA 1E 31 3C C2 93 CA 1E 1A 20 5C 42 CB 1E B0 13 \r
+7A B2 03 20 B0 13 5A B2 02 3C B0 13 6A B2 5C 42 \r
+CC 1E B0 13 7A B2 03 20 B0 13 6A B2 02 3C B0 13 \r
+5A B2 B0 13 8E B2 5D 43 B0 13 02 E9 14 3C 1C 42 \r
+CE 1E 0D 43 6E 42 4F 43 B0 13 FC B4 CF 0C CC 0A \r
+7D 40 46 00 7E 40 5C 00 B0 13 9E B2 B0 13 8E B2 \r
+4D 43 B0 13 02 E9 0A 16 10 01 CC 0A 7D 40 48 00 \r
+7E 40 5E 00 B0 13 9E B2 10 01 CC 0A 7D 40 4A 00 \r
+7E 40 60 00 B0 13 9E B2 10 01 0D 43 6E 43 4F 43 \r
+B0 13 FC B4 CF 0C B2 B0 40 00 08 1E 10 01 CC 0A \r
+7D 40 1F 00 7E 40 29 00 B0 13 76 EF 10 01 B0 13 \r
+76 EF CD 0F 5E 43 B0 13 70 AF 10 01 1A 14 CA 0D \r
+C9 0C D2 93 78 1D 58 24 B0 13 F4 E1 1D 43 6D 59 \r
+CC 09 B0 13 7A DF 49 43 4A 93 37 24 5A 93 32 20 \r
+6A 42 16 3C 7C 40 36 00 B0 13 D8 C6 7C 40 3D 00 \r
+B0 13 D8 C6 7C B0 F0 FF F9 23 7C 40 3A 00 B0 13 \r
+D8 C6 4A 93 02 20 59 43 2B 3C B0 13 A6 EA 5A 83 \r
+7C 40 34 00 B0 13 D8 C6 A2 B3 30 0F FD 27 92 C3 \r
+32 0F 7C 40 35 00 B0 13 D8 C6 3C 40 19 00 B0 13 \r
+8C EA 92 B3 32 0F D6 27 92 C3 32 0F 92 B3 30 0F \r
+FD 27 0E 3C 32 C2 03 43 FF 3F 7C 40 35 00 B0 13 \r
+D8 C6 B2 B0 00 02 32 0F FC 27 B2 F0 FF FD 32 0F \r
+7C 40 3B 00 B0 13 D8 C6 F2 90 03 00 78 1D 02 20 \r
+B0 13 B4 EB CC 09 03 3C 32 C2 03 43 FF 3F 19 16 \r
+10 01 B2 40 23 5A 5C 01 B0 13 92 E4 F2 40 A5 00 \r
+21 01 F2 D0 80 00 20 01 C2 43 21 01 F2 D0 03 00 \r
+4A 02 92 C3 6C 01 B2 D0 0C 00 6C 01 82 43 66 01 \r
+B2 40 44 00 68 01 32 D0 40 00 82 43 60 01 B2 40 \r
+50 00 62 01 B2 40 6E 11 64 01 32 C0 40 00 1E 14 \r
+3D 40 41 D1 0E 43 1D 83 0E 73 FD 23 0D 93 FB 23 \r
+1D 16 00 3C B2 F0 F0 FF 6E 01 A2 C3 02 01 A2 B3 \r
+02 01 F8 23 32 C2 03 43 B2 40 52 2D C0 01 A2 43 \r
+C2 01 F2 40 0E 00 D7 01 F2 F0 7F 00 03 02 F2 D0 \r
+80 00 05 02 F2 40 11 00 CD 01 F2 40 12 00 CE 01 \r
+F2 40 13 00 CF 01 82 43 C0 01 32 D2 B0 13 12 E0 \r
+B0 13 3E EE B0 13 C6 E1 B0 13 A0 E3 B0 13 04 E5 \r
+B0 13 64 EC 80 00 04 C5 1A 14 CA 0C 5D 93 14 24 \r
+6D 92 47 20 4C 43 4D 43 B0 13 02 E9 C2 93 E0 1E \r
+06 20 7C 40 16 00 6D 42 B0 13 02 E9 3A 3C 7C 40 \r
+16 00 7D 40 03 00 F8 3F B2 B0 40 00 08 1E 10 20 \r
+5C 42 E2 1E B0 13 26 EB CF 0C CC 0A B0 13 EC B4 \r
+4C 4F B0 13 D6 B4 5C 42 E2 1E B0 13 CC E9 06 3C \r
+B0 13 EC B4 5C 42 E2 1E B0 13 D6 B4 CC 0A 7D 40 \r
+48 00 7E 40 5E 00 B0 13 76 EF C9 0C 5C 42 E3 1E \r
+B0 13 D6 B4 CC 0A 7D 40 1E 00 7E 40 28 00 B0 13 \r
+76 EF 5D 43 B0 13 02 E9 7C 40 16 00 6D 43 B0 13 \r
+02 E9 19 16 10 01 0D 43 6E 43 4F 43 B0 13 FC B4 \r
+CD 0C CC 09 5E 43 B0 13 70 AF 10 01 7D 40 4A 00 \r
+7E 40 60 00 B0 13 76 EF C9 0C 10 01 4A 14 C7 0F \r
+C6 0E C9 0C CA 0D C8 06 3C 40 E2 1C 3D 40 12 F5 \r
+3E 40 07 00 B0 13 60 ED 48 93 4E 24 78 92 4C 2C \r
+0A 93 1E 20 39 90 B5 00 1B 2C 78 90 03 00 0D 2C \r
+CD 09 59 02 0D 59 4F 48 0D 8F 3D 50 DB F0 4E 48 \r
+3C 40 E2 1C B0 13 60 ED 22 3C 4C 46 3C 50 DF 1C \r
+CD 09 59 02 0D 59 3D 50 D8 F0 3E 40 03 00 F2 3F \r
+CC 09 CD 0A 3E 40 0A 00 0F 43 B0 13 8E D0 7E 50 \r
+30 00 4F 46 CF 4E E1 1C CC 09 CD 0A 3E 40 0A 00 \r
+0F 43 B0 13 8E D0 C9 0C CA 0D 56 83 E9 23 3F 40 \r
+E2 1C 4D 43 08 3C 47 93 04 24 FF 40 20 00 00 00 \r
+57 83 1F 53 5D 53 3E 40 30 00 6E 9F 05 20 4E 48 \r
+1E 83 4C 4D 0C 9E EF 3B 3C 40 E2 1C 46 16 10 01 \r
+31 80 0E 00 CE 01 3D 40 00 18 4F 43 1E 53 FE 4D \r
+FF FF 5F 53 7F 90 0D 00 F9 2B F1 93 00 00 39 24 \r
+5F 41 01 00 C2 4F 16 1E 3F 90 15 00 05 38 3F 90 \r
+EC 00 02 34 C2 43 16 1E 5F 41 02 00 47 18 0F 5F \r
+5E 41 03 00 0E 5F 82 4E D4 1E 5F 41 04 00 47 18 \r
+0F 5F 5E 41 05 00 0E 5F 82 4E A2 1E D2 41 06 00 \r
+12 1D D2 41 07 00 13 1D D2 41 08 00 14 1D D2 41 \r
+09 00 15 1D F1 93 0C 00 08 24 5F 41 0A 00 47 18 \r
+0F 5F 5E 41 0B 00 0E 5F 01 3C 0E 43 82 4E 22 1E \r
+16 3C E2 42 16 1E B2 40 06 FF D4 1E B2 40 F6 FF \r
+A2 1E F2 40 79 00 12 1D F2 40 56 00 13 1D F2 40 \r
+34 00 14 1D F2 40 12 00 15 1D 82 43 22 1E 31 50 \r
+0E 00 10 01 0A 14 CA 0C 1F 42 44 1E 8F 93 02 00 \r
+10 20 8F 93 00 00 0D 20 C2 93 49 1E 0A 24 5E 42 \r
+49 1E 3E 50 64 00 5D 42 DA 1E 0D 9E 02 34 4C 43 \r
+42 3C BF 40 00 70 08 00 5C 42 51 1E 1D 42 4E 1E \r
+1E 42 50 1E 3D F3 3E F0 FF 00 3F 40 00 08 B0 13 \r
+82 D5 1C 52 D8 1E 1F 42 44 1E 8F 4C 0A 00 1F 42 \r
+44 1E 9F 42 D8 1E 0C 00 1F 42 44 1E CF 43 14 00 \r
+1F 42 44 1E CF 43 15 00 1F 42 44 1E 8F 93 02 00 \r
+05 20 8F 93 00 00 02 20 EF D2 1A 00 1D 42 44 1E \r
+1E 42 4E 1E 1F 42 50 1E 3E F3 3F F0 FF 00 8D 4E \r
+00 00 8D 4F 02 00 1F 42 44 1E 9F 43 18 00 CC 0A \r
+B0 13 F6 C0 5C 43 0A 16 10 01 3A 14 07 4F 07 ED \r
+0A 4F 5A 02 8A 10 4A 4A 0A 93 49 24 7F D0 80 00 \r
+0B 4D 5B 02 8B 10 4B 4B 0B 93 3F 24 7D D0 80 00 \r
+0B 5A 3B 80 7F 00 08 43 09 43 0E 93 09 24 1A 43 \r
+5E 00 02 28 08 5C 09 6D 59 00 58 00 5A 02 F8 2B \r
+0E 43 1A 43 5F 00 02 28 08 5C 09 6D 59 00 58 00 \r
+5E 00 3E B0 00 10 02 24 3E D0 00 20 4A 5A F2 23 \r
+49 93 02 34 1B 53 03 3C 0E 6E 08 68 49 69 3E B0 \r
+00 80 07 24 08 63 49 63 0B 63 3E B0 00 60 01 20 \r
+18 C3 1B 93 0C 38 3B 90 FF 00 0C 34 49 59 8B 10 \r
+09 DB 57 02 59 00 0D 49 0C 48 37 16 10 01 0C 43 \r
+0D 43 FB 3F 3D 40 FF FE 3C 43 57 02 5D 00 F5 3F \r
+CF 0D CD 0E CE 0C C2 93 D1 1D 06 20 B0 13 DC EC \r
+4C 93 02 20 2C 43 10 01 2E 83 2C 24 1E 83 43 24 \r
+2E 83 20 24 1E 83 3B 24 3E 80 03 00 34 24 1E 83 \r
+30 20 0E 43 8D 93 00 00 09 20 0F 93 2A 20 1C 4D \r
+02 00 1D 4D 04 00 B0 13 A8 ED 31 3C 1C 43 2C 9D \r
+20 20 0F 93 1E 20 1C 4D 02 00 1D 4D 04 00 B0 13 \r
+96 ED 25 3C 3F B0 FE FF 14 20 CC 0F B0 13 04 EA \r
+CE 0C 1D 3C 3F 90 03 00 07 24 2F 93 0A 20 CC 0D \r
+B0 13 38 E1 CE 0C 13 3C CC 0D B0 13 36 D2 CE 0C \r
+0E 3C 2E 43 0C 3C B0 13 B6 F0 CE 0C 08 3C B0 13 \r
+BA F0 CE 0C 04 3C CC 0F B0 13 2C CF CE 0C CC 0E \r
+10 01 0A 14 31 80 06 00 B0 13 EE ED 2E 42 CF 01 \r
+1F 53 3D 40 12 1D 1F 53 FF 4D FF FF 1E 83 FB 23 \r
+3C 40 05 00 0D 43 CE 01 1E 53 B0 13 F0 B7 D2 43 \r
+F0 1C 4A 43 B0 13 20 E2 0C 93 08 24 B0 13 38 B9 \r
+1A 2C F2 B0 20 00 F0 1C F5 27 1F 3C E1 43 00 00 \r
+3C 40 03 00 3D 40 0A 00 CE 01 B0 13 F0 B7 4A 43 \r
+B0 13 AA F0 0C 93 04 20 E2 43 F0 1C 5C 43 10 3C \r
+B0 13 38 B9 06 28 C2 43 D1 1D E2 42 F0 1C 4C 43 \r
+07 3C F2 B0 20 00 F0 1C EB 27 C2 43 D1 1D 4C 43 \r
+31 50 06 00 0A 16 10 01 3C 40 E8 03 B0 13 FE ED \r
+B2 40 2B 5A 5C 01 CF 0A 1A 43 4A 5F 7F 90 0B 00 \r
+10 01 92 93 EA 1C 1C 24 C2 93 31 1D 0B 20 F2 B0 \r
+F0 FF F2 1C 04 20 32 D0 D8 00 03 43 34 3C F2 40 \r
+05 00 31 1D D2 83 31 1D 04 20 F2 F0 0F 00 F2 1C \r
+2A 3C 3C 40 D7 03 B0 13 A0 CC F2 D2 F0 1C 23 3C \r
+3C 40 A3 00 B0 13 A0 CC B2 B2 0A 1E 1C 24 F2 B0 \r
+20 00 01 02 18 24 B2 C2 0A 1E B0 13 4C E3 D2 53 \r
+31 1D 5F 42 31 1D 5F 83 6F 93 0D 28 C2 43 31 1D \r
+D2 42 59 1E F3 1C D2 42 5A 1E F4 1C D2 42 5B 1E \r
+F5 1C F2 D2 F0 1C B2 B0 10 00 8C 1C 0A 24 5C 43 \r
+6D 43 B0 13 26 97 B2 F0 EF FF 8C 1C B2 40 2B 5A \r
+5C 01 10 01 1A 14 21 82 39 40 CB 00 3C 40 00 40 \r
+B0 13 A0 CC 3C 40 03 00 3D 40 05 00 0E 43 B0 13 \r
+F0 B7 D1 43 02 00 C1 49 03 00 CC 01 2C 53 6D 43 \r
+B0 13 40 CA 3C 40 03 00 3D 42 0E 43 B0 13 F0 B7 \r
+3C 40 0A 00 B0 13 FE ED CC 01 B0 13 CA D5 0C 93 \r
+18 20 C1 93 00 00 F8 27 B0 13 1E 9B 4A 43 5A 92 \r
+17 1D F2 2F 3C 40 0A 00 B0 13 FE ED 4C 4A B0 13 \r
+F6 AB 3C 40 F2 1C 7D 40 13 00 B0 13 40 CA 5A 53 \r
+EE 3F 3C 40 03 00 2D 42 0E 43 B0 13 F0 B7 B2 40 \r
+2B 5A 5C 01 F2 B0 20 00 F0 1C B8 27 C2 43 D1 1D \r
+21 52 19 16 10 01 1A 14 21 82 CA 0C F2 B0 40 00 \r
+01 02 3C 24 B0 13 0C D4 82 4C 1E 1E B0 13 D8 CB \r
+81 4C 00 00 81 4D 02 00 4A 93 03 20 B0 13 22 BB \r
+27 3C 2C 41 1D 41 02 00 B0 13 44 E0 3E 40 CD CC \r
+3F 40 4C 3E B0 13 3A B7 C9 0C CA 0D 1C 42 1A 1E \r
+1D 42 1C 1E B0 13 44 E0 3E 40 CD CC 3F 40 4C 3F \r
+B0 13 3A B7 CE 0C CF 0D CC 09 CD 0A B0 13 E6 9E \r
+B0 13 58 D4 81 4C 00 00 81 4D 02 00 B0 13 22 BB \r
+1E 42 1E 1E B0 13 00 80 82 4C 20 1E 21 52 19 16 \r
+10 01 1C 41 04 00 1D 41 06 00 82 4C 1A 1E 82 4D \r
+1C 1E 10 01 5C 43 B0 13 D2 CE 5C 43 6D 42 80 13 \r
+0E 1E B0 13 E0 DF B0 13 4C DA B0 13 3C EA 4C 43 \r
+B0 13 9C BD 7C 40 17 00 6D 43 B0 13 02 E9 7C 40 \r
+18 00 6D 43 B0 13 02 E9 7C 40 19 00 6D 43 B0 13 \r
+02 E9 3C 40 00 20 B0 13 A0 CC B0 13 BA ED B2 40 \r
+03 00 EA 1C B2 40 10 0E EC 1C B0 13 A2 B8 4C 93 \r
+02 24 B0 13 F4 B9 82 43 EA 1C B0 13 0E EE 3C 40 \r
+00 20 B0 13 A0 CC C2 43 1D 02 82 43 76 1E 7C 40 \r
+17 00 6D 42 B0 13 02 E9 7C 40 18 00 6D 42 B0 13 \r
+02 E9 7C 40 19 00 6D 42 B0 13 02 E9 92 D3 8C 1C \r
+10 01 5A 14 C6 0F C7 0E C5 0D C9 0C 18 41 1C 00 \r
+C7 43 00 00 B0 13 94 AE CA 0C 0A 93 02 20 2C 42 \r
+3C 3C 1F 43 2F 99 02 24 09 43 09 3C 5C 49 02 00 \r
+B0 13 F2 E3 C9 0C 09 93 02 20 2C 43 2E 3C 5E 4A \r
+02 00 7E 80 0B 00 C7 4E 00 00 3D 40 0E 00 0D 5A \r
+4E 4E CC 05 B0 13 60 ED 09 93 06 24 D9 4A 21 00 \r
+07 00 D9 4A 22 00 08 00 06 93 07 24 3D 40 07 00 \r
+0D 5A CC 06 2E 42 B0 13 60 ED 08 93 06 24 3F 40 \r
+07 00 5F FA 0C 00 C8 4F 00 00 5D 4A 01 00 5C 43 \r
+B0 13 4C E2 CA 43 00 00 0C 43 55 16 10 01 4F 43 \r
+4C 93 2D 24 5C 93 20 24 6C 93 13 24 7C 90 03 00 \r
+2A 20 A2 D2 22 03 A2 C2 24 03 B2 C2 22 03 B0 13 \r
+CE F0 B0 13 FC BC 1F 42 20 03 6F F2 B2 C2 22 03 \r
+1A 3C A2 D2 24 03 B0 13 EA BC B0 13 FC BC A2 D2 \r
+22 03 B0 13 CE F0 0F 3C A2 D2 24 03 B2 C2 22 03 \r
+A2 D2 22 03 B0 13 CE F0 B0 13 E0 BC 04 3C A2 D2 \r
+24 03 B0 13 E0 BC 4C 43 4F 93 01 20 5C 43 10 01 \r
+B0 13 FC BC B0 13 EA BC 10 01 A2 C2 22 03 B0 13 \r
+CE F0 B2 C2 22 03 B0 13 CE F0 10 01 B2 D2 22 03 \r
+B0 13 CE F0 10 01 1A 14 CB 0C 7B 90 BD 00 07 24 \r
+4C 43 7B 90 31 00 40 28 7B 90 3D 00 3D 2C 0A 42 \r
+32 C2 03 43 B2 F0 BF FF 02 0F B2 B0 10 00 02 0F \r
+FC 27 7B 90 3D 00 26 2C 4C 43 B0 13 CA EB C9 0C \r
+4C 43 7D 40 29 00 B0 13 28 DD C2 4B 11 0F A2 B2 \r
+30 0F 13 24 7B 90 32 00 10 24 7B 90 39 00 0D 24 \r
+7B 90 38 00 0A 24 A2 B2 30 0F FD 23 0D 14 3D 40 \r
+BF 0C 1D 83 FE 23 0D 16 03 43 4C 43 CD 09 B0 13 \r
+28 DD 03 3C F2 40 BD 00 11 0F 5C 42 21 0F B2 B0 \r
+40 00 02 0F FC 27 02 4A 19 16 10 01 0A 14 21 82 \r
+CA 0C 0C 43 3D 40 00 08 3E 40 0A 00 B0 13 70 C9 \r
+0D 43 3E 40 07 0D 0F 43 B0 13 46 E7 3C 80 B9 65 \r
+3D 70 5E 00 3E 40 00 08 0F 43 B0 13 CC D9 81 4C \r
+00 00 81 4D 02 00 1E 42 D4 1E 3E B0 00 80 0F 7F \r
+3F E3 81 5E 00 00 81 6F 02 00 5A 93 1A 20 1E 42 \r
+D2 1E 3E B0 00 80 0F 7F 3F E3 1F 91 02 00 0D 38 \r
+02 20 2E 91 0A 28 81 9F 02 00 04 38 0C 20 81 9E \r
+00 00 09 2C 92 83 D2 1E 06 3C 1E 53 82 4E D2 1E \r
+02 3C A2 41 D2 1E B2 D0 40 00 8C 1C 21 52 0A 16 \r
+10 01 4C 43 B0 13 C2 E5 0C 93 42 24 1C 83 42 20 \r
+B0 13 5C F0 4C 4C C2 4C FA 1D B0 13 AA E7 C2 4C \r
+00 1E B0 13 8A E7 0D 43 82 4C 02 1E 82 4D 04 1E \r
+5C 42 FA 1D 7C 90 41 00 28 28 1D 42 F8 1D 0D 93 \r
+24 24 4C 4C 3C 80 3C 00 B0 13 38 EC CF 0C 44 19 \r
+0F 10 D2 93 F6 1D 03 20 46 19 0C 10 0F 8C CD 0F \r
+0E 43 1D 52 FC 1D 1E 62 FE 1D 3E 90 EB 0B 04 28 \r
+08 20 3D 90 01 C2 05 2C 82 5F FC 1D 82 63 FE 1D \r
+04 3C 82 43 FC 1D 82 43 FE 1D 92 43 F0 1D 10 01 \r
+80 00 EE D4 10 01 3A 14 07 4F 07 ED 0A 4F 5A 02 \r
+8A 10 4A 4A 0A 93 38 24 7F D0 80 00 0B 4D 5B 02 \r
+8B 10 4B 4B 0B 93 2B 24 7D D0 80 00 0B 8A 3B 50 \r
+7F 00 3A 40 18 00 08 43 09 43 0C 8E 0D 7F 03 2C \r
+0C 5E 0D 6F 12 C3 08 68 09 69 5C 02 0D 6D 1A 83 \r
+F4 23 49 93 03 30 1A 53 1B 83 EF 3F 0C 7E 0D 7F \r
+08 63 49 63 0B 63 1B 93 0C 38 3B 90 FF 00 0C 34 \r
+49 59 8B 10 09 DB 57 02 59 00 0D 49 0C 48 37 16 \r
+10 01 0C 43 0D 43 FB 3F 3C 40 FF FE 3D 43 57 02 \r
+5D 00 F5 3F 2A 14 21 83 C9 0C 3F 40 0B 00 0F 59 \r
+68 4F 3A 40 3F 00 4A F8 3C 40 07 00 0C 59 1D 42 \r
+64 1E 2E 42 B0 13 2E E6 0C 93 2D 24 78 B0 40 00 \r
+2A 20 4A 93 10 24 7A 90 07 00 0D 2C 4A 4A 5A 06 \r
+00 18 5F 4A 90 F6 2C 43 0C 59 4F 13 1C 93 1B 20 \r
+D9 43 00 00 1A 3C 7A 90 3F 00 03 24 7A 90 20 00 \r
+12 28 2C 43 0C 59 CD 01 B0 13 E0 BF 4C 93 0B 24 \r
+D9 43 00 00 00 18 C2 93 68 1E 07 24 6C 41 80 13 \r
+68 1E 4C 93 02 24 C9 43 00 00 21 53 28 16 10 01 \r
+4A 14 C7 0D C8 0C 39 40 B9 1D 3A 40 3F 00 5A F8 \r
+09 00 26 43 2F 43 6F 99 32 20 5A 99 09 00 2F 20 \r
+7A 90 3F 00 0B 24 3C 40 03 00 0C 59 3D 40 05 00 \r
+0D 58 2E 42 B0 13 2E E6 0C 93 21 20 D7 49 0B 00 \r
+00 00 57 43 7A 90 3F 00 16 24 3F 40 0A 00 0F 58 \r
+6F 4F 7F B0 80 FF 0A 20 7F B2 0D 24 D9 98 0B 00 \r
+02 00 02 20 C9 43 02 00 47 43 05 3C 5D 49 0A 00 \r
+CC 08 B0 13 88 C4 B0 13 CE EE CC 07 05 3C 39 50 \r
+0C 00 16 83 C7 23 4C 43 46 16 10 01 4A 14 C9 0F \r
+C7 0E C6 0D CA 0C 6C 43 B0 13 7C C5 C8 0C 08 93 \r
+02 20 0C 43 36 3C CF 07 7F 50 0B 00 C8 4F 02 00 \r
+3E 40 0B 00 0E 58 3F 40 80 00 6F FE 4F DA CE 4F \r
+00 00 D8 42 62 1E 0D 00 D2 53 62 1E FD 27 F8 F0 \r
+BF 00 0C 00 5F 48 0C 00 7F F0 F8 00 4F D9 C8 4F \r
+0C 00 F8 F0 7F 00 0C 00 F8 C2 0C 00 FE F0 7F 00 \r
+00 00 3C 40 0E 00 0C 58 4E 47 CD 06 B0 13 60 ED \r
+3C 40 07 00 0C 58 1D 42 64 1E 2E 42 B0 13 60 ED \r
+CC 08 46 16 10 01 1F 42 44 1E CF 43 11 00 1F 42 \r
+44 1E DF 42 51 1E 13 00 1F 42 44 1E 5E 42 D8 1E \r
+5E 8F 0C 00 CF 4E 16 00 1F 42 44 1E 5E 4F 16 00 \r
+8E 11 8F 5E 0A 00 1F 42 44 1E DF 5F 16 00 15 00 \r
+1F 42 44 1E DF 42 DA 1E 12 00 1F 42 44 1E FF 92 \r
+12 00 02 2C FF 42 12 00 1F 42 44 1E 9F 42 52 1E \r
+04 00 9F 42 54 1E 06 00 1F 42 44 1E DF 42 56 1E \r
+0E 00 1F 42 44 1E EF B2 1A 00 03 20 4D 43 B0 13 \r
+4C D9 B0 13 1A CE D2 C3 D6 1E 10 01 1E 42 44 1E \r
+5F 4E 15 00 8F 11 3F 90 40 00 10 34 3F 90 C1 FF \r
+19 34 FE 50 40 00 15 00 1F 42 44 1E 9F 83 08 00 \r
+1F 42 44 1E 5F 4F 15 00 8F 11 0C 3C FE 80 40 00 \r
+15 00 1F 42 44 1E 9F 53 08 00 1F 42 44 1E 5F 4F \r
+15 00 8F 11 1E 42 44 1E CE 5F 14 00 1E 42 44 1E \r
+5F 4E 14 00 8F 11 3F 90 40 00 0B 34 3F 90 C1 FF \r
+0F 34 FE 50 40 00 14 00 1F 42 44 1E 9F 83 0A 00 \r
+10 01 FE 80 40 00 14 00 1F 42 44 1E 9F 53 0A 00 \r
+10 01 4F 14 1F 42 6E 03 2F 83 36 24 2F 83 27 24 \r
+2F 83 03 24 2F 83 1A 24 31 3C B2 F0 EF FF 48 03 \r
+92 C3 48 03 82 93 50 03 02 20 0F 43 05 3C 1F 42 \r
+50 03 1F 92 50 03 FB 23 1F 52 C0 1E 82 4F 58 03 \r
+B2 D0 10 00 48 03 80 13 BC 1E 18 3C B2 F0 EF FF \r
+4A 03 92 C3 4A 03 B2 D0 80 00 08 1E 0F 3C B2 F0 \r
+EF FF 46 03 92 C3 46 03 B0 13 B4 DC B2 D0 10 00 \r
+46 03 B0 13 48 A8 02 3C B0 13 00 DC B1 C0 D0 00 \r
+14 00 4B 16 00 13 0A 14 CA 0D 4C 4C 3C 90 07 00 \r
+0E 34 3C 90 06 00 2F 24 1C 83 30 24 1C 83 14 24 \r
+1C 83 2C 24 1C 83 27 24 1C 83 28 24 2A 3C 3C 80 \r
+07 00 2C 93 23 28 2C 83 1E 24 1C 83 1F 24 1C 83 \r
+1A 24 1C 83 1B 24 1D 3C 3A B0 03 00 0E 20 CC 0A \r
+3D 40 64 00 B0 13 22 EC 0E 93 0A 20 CC 0A 3D 40 \r
+90 01 B0 13 22 EC 0E 93 03 24 7C 40 1C 00 0A 3C \r
+7C 40 1D 00 07 3C 7C 40 1E 00 04 3C 7C 40 1F 00 \r
+01 3C 4C 43 0A 16 10 01 3C 40 B5 1D 0D 43 3E 40 \r
+1C 00 B0 13 72 ED E2 43 B5 1D F2 40 3D 00 B6 1D \r
+F2 40 20 00 B7 1D D2 43 B8 1D B0 13 76 E5 B0 13 \r
+2A E8 B0 13 E8 E9 B0 13 E6 EF B0 13 1A E4 B0 13 \r
+DC EF B0 13 08 E1 3F 40 B9 1D CF 43 00 00 3F 50 \r
+0C 00 CF 43 00 00 C2 93 C5 1D 15 20 E2 43 C5 1D \r
+F2 40 03 00 C6 1D 7F 40 3F 00 C2 4F CE 1D C2 4F \r
+CF 1D F2 43 D0 1D B0 13 98 F0 CD 0C 3C 40 C8 1D \r
+2E 42 B0 13 60 ED 0C 43 10 01 F2 D0 A9 00 C1 05 \r
+F2 D0 80 00 C0 05 F2 40 1E 00 C6 05 C2 43 C7 05 \r
+D2 C3 C0 05 F2 F0 DF 00 19 02 F2 F0 DF 00 05 02 \r
+F2 F0 DF 00 04 02 F2 D0 20 00 06 02 F2 D0 E0 00 \r
+0A 02 A2 D3 22 03 92 D3 22 03 3C 40 47 01 B0 13 \r
+A0 CC F2 F0 DF 00 1D 02 F2 D0 20 00 1B 02 6C 42 \r
+6D 43 B0 13 0C CB 6C 42 7D 40 0A 00 B0 13 0C CB \r
+6C 42 6D 42 B0 13 0C CB 3C 40 A3 00 B0 13 A0 CC \r
+6C 43 7D 40 82 00 80 00 0C CB 7C 40 36 00 B0 13 \r
+06 BD F2 B0 10 00 D6 1E 27 24 7C 40 0A 00 5D 42 \r
+98 1E B0 13 28 DD F2 90 7F 00 99 1E 07 38 7C 40 \r
+0C 00 7D 40 0C 00 B0 13 28 DD 06 3C 7C 40 0C 00 \r
+5D 42 99 1E B0 13 28 DD F2 B2 D6 1E 07 20 7C 40 \r
+12 00 7D 40 11 00 B0 13 28 DD 06 3C 7C 40 12 00 \r
+7D 40 15 00 B0 13 28 DD 7C 40 34 00 B0 13 06 BD \r
+B2 F0 FE FD 32 0F B2 F0 FE FD 32 0F B2 D0 01 02 \r
+36 0F A2 43 C4 1E 10 01 1A 14 31 80 22 00 C9 0D \r
+5A 4C 0B 00 3F 40 CF 00 5F F1 0A 00 5F D2 66 1E \r
+7F F0 BF 00 C1 4F 0A 00 3D 40 05 00 0D 5C CC 01 \r
+1C 53 2E 42 B0 13 60 ED CC 01 3C 50 05 00 1D 42 \r
+64 1E 2E 42 B0 13 60 ED 3D 40 C0 00 5D F1 09 00 \r
+4D D9 F1 40 0B 00 00 00 C1 4A 0B 00 3F 40 70 00 \r
+5F F1 0A 00 7F D0 0B 00 C1 4F 0A 00 7D F0 3F 00 \r
+C1 4D 09 00 CC 01 4D 43 B0 13 AC B2 31 50 22 00 \r
+19 16 10 01 21 82 F2 F0 BF 00 05 02 F2 F0 BF 00 \r
+19 02 B2 D0 0C 00 22 03 B2 D0 0C 00 24 03 C2 43 \r
+76 1D 3C 40 CC 0C B0 13 A0 CC 7C 40 06 00 5D 43 \r
+B0 13 36 D0 C1 4C 00 00 3C 40 CC 0C B0 13 A0 CC \r
+7C 40 07 00 4D 43 B0 13 4A C7 C1 4C 01 00 D1 B3 \r
+01 00 12 20 C1 93 01 00 0F 24 7C 40 7F 00 4D 43 \r
+B0 13 4A C7 C1 4C 02 00 D1 93 02 00 03 24 C2 43 \r
+76 1D 02 3C D2 43 76 1D 21 52 10 01 2A 14 5C 93 \r
+03 20 3F 40 00 1C 02 3C 3F 40 46 1C 2D 43 08 43 \r
+CB 08 4E 43 79 40 03 00 CF 93 00 00 06 20 6C 93 \r
+02 20 CC 0F 24 3C CB 0F 0C 3C 5C 93 0A 20 5E 53 \r
+2A 42 6A 9F 06 24 5A 4F 01 00 4A 99 02 2C C8 0F \r
+C9 0A 3F 50 23 00 1D 83 E7 23 0B 93 0C 20 08 93 \r
+02 20 0C 43 0C 3C CB 08 5D 4B 01 00 B0 13 4C E2 \r
+EB 43 01 00 03 3C 5E 53 CB 4E 01 00 CC 0B 28 16 \r
+10 01 3C 40 10 00 3D 40 00 0A 3E 40 0B 00 B0 13 \r
+70 C9 5C 06 3D 40 29 00 B0 13 22 EC 1F 42 A2 1E \r
+0F 5C 3F 90 69 01 03 2C 1C 42 A0 1E 03 3C 1C 42 \r
+A0 1E CF 0C 5C 06 0C 5F 5C 02 3D 40 0A 00 B0 13 \r
+22 EC 82 4C A0 1E 3C 90 F0 00 08 28 B2 F0 DF FF \r
+08 1E 7C 42 4D 43 B0 13 02 E9 07 3C B2 D0 20 00 \r
+08 1E 7C 42 5D 43 B0 13 02 E9 B2 D2 8C 1C B2 D0 \r
+80 00 8C 1C 10 01 1A 14 CF 0E CA 0C 7A 90 1A 00 \r
+31 28 7A 90 2A 00 2E 2C 4E 4A 5E 02 1C 4E 8E 1C \r
+4E 4A 5E 4E FE F5 7D 90 30 00 05 2C 7D 90 2D 00 \r
+05 20 6B 43 08 3C 7D 90 5B 00 02 28 4B 43 03 3C \r
+4B 4D 5B 4B A2 F5 7A 90 21 00 11 28 C9 0B 43 18 \r
+49 59 43 19 4B 10 4B D9 7A 90 21 00 08 20 7D 90 \r
+31 00 03 24 7D 90 4C 00 02 20 7B 40 80 00 CD 0B \r
+B0 13 BC CD 19 16 10 01 0A 14 CE 0C 0B 42 32 C2 \r
+03 43 B2 F0 BF FF 02 0F B2 B0 10 00 02 0F FC 27 \r
+7E 90 31 00 23 28 7E 90 3D 00 20 2C 4C 43 B0 13 \r
+2C D7 CA 0C 4C 43 7D 40 29 00 B0 13 46 DF C2 4E \r
+11 0F A2 B2 30 0F 0D 24 7E 90 32 00 0A 24 7E 90 \r
+38 00 07 24 A2 B2 30 0F FD 23 3C 40 F8 02 B0 13 \r
+8C EA 4C 43 CD 0A B0 13 46 DF 02 3C C2 4E 11 0F \r
+5C 42 21 0F 02 4B 0A 16 10 01 0A 14 CB 0D CA 0C \r
+4C 43 B0 13 6E BC 7C 40 22 00 B0 13 AC C7 0C 24 \r
+CC 0A B0 13 AC C7 08 24 5C 43 B0 13 6E BC 7C 40 \r
+23 00 B0 13 AC C7 02 20 0C 43 16 3C 5B 93 05 24 \r
+4C 43 B0 13 88 D2 4D 4C 0B 3C 5C 43 B0 13 88 D2 \r
+4C 4C 4D 4C 8D 10 4C 43 B0 13 88 D2 4C 4C 0D DC \r
+6C 43 B0 13 6E BC CC 0D 0A 16 10 01 B0 13 0A D9 \r
+7C 40 03 00 B0 13 6E BC 4C 93 10 01 7C 40 36 00 \r
+B0 13 06 BD 4C 43 3D 40 28 F6 7E 40 27 00 B0 13 \r
+FC D7 7C 40 2C 00 7D 40 88 00 B0 13 28 DD 7C 40 \r
+2D 00 7D 40 31 00 B0 13 28 DD 7C 40 2E 00 7D 40 \r
+09 00 B0 13 28 DD 7C 40 36 00 B0 13 06 BD 7C 40 \r
+33 00 B0 13 06 BD 7C 40 3D 00 B0 13 06 BD 7C B0 \r
+70 00 F9 23 7C 40 36 00 B0 13 06 BD 82 43 C4 1E \r
+B2 D0 01 02 34 0F 82 43 32 0F 10 01 B2 40 0A F3 \r
+E6 1E B2 40 88 F3 E4 1E 00 18 D2 42 12 F3 0E 1E \r
+00 18 D2 42 90 F3 12 1E 82 43 76 1E 82 43 08 1E \r
+82 43 0A 1E 82 43 8C 1C 82 43 0C 1E 92 D3 8C 1C \r
+B2 D0 40 00 08 1E B0 13 C0 B5 B0 13 76 E6 B0 13 \r
+04 ED B0 13 6E EB B0 13 FA EF B0 13 4A E8 B0 13 \r
+8C D9 B0 13 A6 EE B0 13 D0 DD B0 13 04 F0 B0 13 \r
+0E F0 B0 13 CC ED 80 00 F2 C5 4C 4C C2 93 93 1E \r
+02 20 4C 43 10 01 41 18 4C 5C 4C 4C F2 F0 DF 00 \r
+06 02 A2 C3 22 03 5F 42 CC 05 C2 4C CE 05 3F 40 \r
+E8 03 D2 B3 DD 05 03 20 1F 83 FB 23 18 3C 0F 93 \r
+16 24 5F 42 CC 05 C2 43 CE 05 3F 40 E8 03 D2 B3 \r
+DD 05 03 20 1F 83 FB 23 0A 3C 0F 93 08 24 5C 42 \r
+CC 05 A2 D3 22 03 F2 D0 20 00 06 02 10 01 C2 43 \r
+93 1E 4C 43 10 01 0A 14 CA 0D CB 0C 7B 93 02 24 \r
+CF 0B 02 3C 4B 43 4F 43 4E 4B 4F 4F 0F 8E 1F 53 \r
+4C 4B 3D 40 1C 00 B0 13 38 EC 1C 52 D4 F6 4A 93 \r
+09 24 8C 43 00 00 8C 43 02 00 CC 43 1A 00 FC 40 \r
+7F 00 10 00 8C 43 18 00 FC F0 FC 00 1A 00 8C 43 \r
+04 00 8C 43 06 00 CC 43 0E 00 CC 43 12 00 CC 43 \r
+0F 00 CC 43 11 00 5B 53 1F 83 DA 23 0A 16 10 01 \r
+1A 14 C9 0D 3A 40 81 00 0A 5C 82 DA B0 01 CF 09 \r
+3F 50 10 00 82 4F 00 07 B2 40 00 02 02 07 7E 50 \r
+10 00 C2 4E 10 07 92 43 0C 07 2C 43 B0 13 A0 CC \r
+A2 D3 00 07 C2 43 EA 1E 92 D3 00 07 3C 40 05 00 \r
+B0 13 A0 CC C2 93 EA 1E FD 27 39 D0 03 00 82 C9 \r
+00 07 B2 F0 EF FF 00 07 82 CA B0 01 82 43 0C 07 \r
+1C 42 E8 1E 19 16 10 01 1A 14 21 82 CA 0C 3C 40 \r
+05 00 0C 5A 5D 4A 0E 00 B0 13 3C DC 0C 93 02 20 \r
+3F 42 03 3C B0 13 92 F0 0F 43 F1 40 82 00 00 00 \r
+D1 4A 0D 00 01 00 C1 4F 02 00 6C 43 CD 01 7E 40 \r
+03 00 7F 40 03 00 B0 13 6C C0 C9 0C 09 93 0D 24 \r
+3C 40 03 00 0C 59 3D 40 05 00 0D 5A 2E 42 B0 13 \r
+60 ED CC 09 4D 43 B0 13 68 E1 21 52 19 16 10 01 \r
+2A 14 C8 0D C9 0C 5C 42 77 1D B0 13 F2 E3 CA 0C \r
+B0 13 80 F0 0A 93 24 24 CC 0A 5D 43 B0 13 50 E5 \r
+0C 93 1F 20 09 93 1D 24 5C 4A 0A 00 5F 4A 01 00 \r
+CD 09 CE 08 B0 13 6C C0 C9 0C 09 93 0E 24 3C 40 \r
+03 00 0C 59 3D 40 03 00 0D 5A 2E 42 B0 13 60 ED \r
+CC 09 5D 43 B0 13 68 E1 04 3C 3C 40 03 00 01 3C \r
+2C 43 28 16 10 01 0E 42 32 C2 03 43 4C 93 2C 24 \r
+4F 4C 3F 50 00 7E B2 B0 10 00 02 0F FC 27 82 4F \r
+10 0F B2 B0 10 00 02 0F FC 27 F2 40 3D 00 11 0F \r
+B2 B0 10 00 02 0F FC 27 F2 40 FE 00 11 0F B2 B0 \r
+20 00 02 0F FC 27 C2 43 10 0F B2 B0 80 00 02 0F \r
+FC 27 5D 42 20 0F B2 B0 10 00 02 0F FC 27 F2 40 \r
+3D 00 11 0F 4D 9C D7 23 02 4E 10 01 4C 4C C2 93 \r
+93 1E 2E 24 41 18 4C 5C 6C D3 F2 F0 DF 00 06 02 \r
+A2 C3 22 03 5F 42 CC 05 C2 4C CE 05 3F 40 E8 03 \r
+D2 B3 DD 05 03 20 1F 83 FB 23 18 3C 0F 93 16 24 \r
+5F 42 CC 05 C2 4D CE 05 3F 40 E8 03 D2 B3 DD 05 \r
+03 20 1F 83 FB 23 0A 3C 0F 93 08 24 5F 42 CC 05 \r
+A2 D3 22 03 F2 D0 20 00 06 02 10 01 C2 43 93 1E \r
+10 01 0A 14 CA 0D 6A 92 1A 24 B0 13 22 EF 4C 93 \r
+08 20 7C 40 47 00 3D 40 40 F5 5E 43 B0 13 70 AF \r
+0E 3C 5C 42 FA 1D 0D 43 7E 40 03 00 6F 43 B0 13 \r
+FC B4 CD 0C 7C 40 47 00 5E 43 B0 13 70 AF B0 13 \r
+22 EF 4C 93 0F 20 5A 93 08 24 6A 92 0B 20 7C 40 \r
+13 00 4D 43 B0 13 02 E9 05 3C 7C 40 13 00 5D 43 \r
+B0 13 02 E9 0A 16 10 01 21 82 81 43 00 00 81 43 \r
+02 00 7C 40 7F 00 4D 43 B0 13 4A C7 81 4C 00 00 \r
+81 43 02 00 2C 41 1F 41 02 00 47 18 0C 5C 0D 43 \r
+3C F0 00 07 0D F3 B0 13 62 DB 81 4C 00 00 81 4D \r
+02 00 7C 40 80 00 5D 43 B0 13 4A C7 81 DC 00 00 \r
+12 C3 11 10 02 00 11 10 00 00 12 C3 11 10 02 00 \r
+11 10 00 00 2C 41 1D 41 02 00 21 52 10 01 1F 42 \r
+38 0F 1E 42 0E 0F 0E 93 14 20 0F 93 28 24 3F 90 \r
+14 00 0C 20 B2 B0 00 02 36 0F 03 20 32 C2 03 43 \r
+FF 3F B2 F0 FF FD 32 0F 80 00 56 A7 32 C2 03 43 \r
+FF 3F 2E 93 11 20 1F 42 0C 0F 2F 93 0A 24 2F 92 \r
+08 24 3F 90 06 00 05 24 3F 92 03 24 32 C2 03 43 \r
+FF 3F 32 C2 03 43 FF 3F 32 C2 03 43 FF 3F 10 01 \r
+B2 B0 30 00 40 03 2B 24 B2 F0 EF FF 4A 03 B2 F0 \r
+7F FF 08 1E 82 93 50 03 02 20 0F 43 05 3C 1F 42 \r
+50 03 1F 92 50 03 FB 23 0F 5C 82 4F 5A 03 92 C3 \r
+4A 03 B2 D0 10 00 4A 03 B0 13 54 F0 B2 40 2B 5A \r
+5C 01 B0 13 F0 EC 4C 93 03 24 6D 43 B0 13 10 A0 \r
+32 C2 03 43 B2 B0 80 00 08 1E EE 27 32 D2 10 01 \r
+B2 F0 FE FD 36 0F B2 F0 FE FD 32 0F B2 F0 FE FD \r
+32 0F 92 43 C4 1E 7C 40 32 00 B0 13 CA EB C2 4C \r
+C6 1E 7C 43 3D 40 4E 1E 7E 40 0A 00 B0 13 B8 D7 \r
+7C 43 B0 13 CA EB C2 4C DA 1E 7C B0 80 FF 04 20 \r
+F2 80 80 00 DA 1E 03 3C F2 F0 7F 00 DA 1E 1F 42 \r
+C8 1E 3F 80 10 00 82 4F D8 1E 80 00 CA DA 5D 93 \r
+10 24 6D 93 08 24 6D 92 19 20 82 43 9C 1E 7C 42 \r
+4D 43 80 00 02 E9 B0 13 9E CD B2 F0 7F FF 8C 1C \r
+10 01 7C 42 5D 43 B0 13 02 E9 92 43 9C 1E B0 13 \r
+9E CD 7C 40 29 00 5D 43 80 00 02 E9 10 01 1C 42 \r
+A0 1E 0D 43 7E 40 03 00 4F 43 B0 13 FC B4 CD 0C \r
+7C 40 5D 00 5E 43 B0 13 70 AF 10 01 5F 93 20 24 \r
+4F 93 1B 24 6F 93 12 24 7F 90 03 00 05 24 6F 92 \r
+1C 20 B0 13 0C CE 10 01 4E 4E 3E E3 CF 0E 6F FC \r
+4D DF CC 4D 00 00 CC FE 20 00 10 01 B0 13 0C CE \r
+CC DD 00 00 CC DD 20 00 10 01 CC CE 00 00 10 01 \r
+6F 4C 4F CE 4D DF CC 4D 00 00 10 01 4E 4E 3E E3 \r
+CC FE 00 00 CC FE 20 00 10 01 0A 14 1F 42 44 1E \r
+DF 53 13 00 B0 13 7C C1 1F 42 44 1E 1E 4F 08 00 \r
+1E 5F 0A 00 8F 4E 0C 00 1F 42 44 1E 9F 4F 0C 00 \r
+0A 00 1A 42 44 1E CF 0A 5C 4F 13 00 2D 4F 1E 4F \r
+02 00 3F 40 00 08 B0 13 82 D5 8A 8C 0C 00 1F 42 \r
+44 1E FF 40 07 00 0F 00 1F 42 44 1E FF F0 FC 00 \r
+1A 00 0A 16 10 01 92 53 26 1E 82 63 28 1E 1F 43 \r
+5F 52 32 1E 3F 90 3C 00 1F 20 C2 43 32 1E 1F 43 \r
+5F 52 31 1E 3F 90 3C 00 12 20 C2 43 31 1E 1F 43 \r
+5F 52 30 1E F2 40 03 00 2E 1E 3F 90 18 00 03 24 \r
+C2 4F 30 1E 10 01 C2 43 30 1E 80 00 28 D3 C2 4F \r
+31 1E E2 43 2E 1E 10 01 C2 4F 32 1E D2 43 2E 1E \r
+10 01 0A 14 CA 0C 7D 40 46 00 7E 40 5A 00 B0 13 \r
+76 EF 0D 43 4E 43 B0 13 70 AF 5A 93 0D 24 7C 40 \r
+29 00 B0 13 24 CF 7C 40 27 00 B0 13 24 CF 7C 40 \r
+28 00 B0 13 24 CF 0C 3C 7C 40 1F 00 B0 13 24 CF \r
+7C 40 20 00 B0 13 24 CF 7C 40 1E 00 B0 13 24 CF \r
+0A 16 10 01 4D 43 B0 13 02 E9 10 01 0A 14 0A 43 \r
+2C 92 22 24 3C 90 05 00 1C 24 3C 92 17 24 3C 90 \r
+0A 00 12 20 2F 4D 0F 93 0A 24 1F 83 06 24 1F 83 \r
+02 24 2C 43 16 3C 6C 43 03 3C 5C 43 01 3C 4C 43 \r
+B0 13 72 EA 0C 43 0D 3C 2A 43 0A 3C B0 13 0A E8 \r
+07 3C B0 13 E0 E6 04 3C B0 13 EA E7 B0 13 0A E6 \r
+CC 0A 0A 16 10 01 1A 14 C9 0C 79 93 02 24 CA 09 \r
+02 3C 49 43 4A 43 4F 49 4A 4A 0A 8F 1A 53 CC 09 \r
+B0 13 C2 E5 0C 93 09 20 4C 49 3D 40 1C 00 B0 13 \r
+38 EC 1C 52 D4 F6 B0 13 DE CF 59 53 1A 83 EF 23 \r
+E2 B3 D6 1E 0A 24 B0 13 BE EF 4C 93 06 20 D2 C3 \r
+D6 1E B0 13 DE ED B0 13 74 F0 19 16 10 01 AC 43 \r
+18 00 FC F0 FC 00 1A 00 CC 43 12 00 5F 42 4A 1E \r
+C2 93 4B 1E 03 20 CC 4F 13 00 08 3C 5E 42 4A 1E \r
+12 C3 4E 10 4E 11 4F 8E CC 4F 13 00 E2 B3 D6 1E \r
+11 20 F2 D0 06 00 D6 1E B0 13 C2 EE 82 4C 42 1E \r
+C2 93 4B 1E 04 20 B2 50 E0 7F 42 1E 10 01 B2 50 \r
+C0 53 42 1E 10 01 0A 14 21 83 CA 0D CB 0C 4C 43 \r
+B0 13 6E BC 7C 40 22 00 B0 13 72 D0 0E 24 CC 0B \r
+B0 13 72 D0 0A 24 CC 0A B0 13 80 D0 C1 4C 00 00 \r
+6C 43 B0 13 6E BC 5C 43 01 3C 4C 43 21 53 0A 16 \r
+10 01 B0 13 80 D0 C1 4C 04 00 C1 93 04 00 10 01 \r
+B0 13 0A D9 7C 40 03 00 B0 13 6E BC 10 01 0A 14 \r
+09 14 09 43 0A 43 1B 43 0F 93 04 24 09 4D 0D 4C \r
+0C 43 0D 3C 5C 02 0D 6D 09 69 09 8E 04 28 1C D3 \r
+5B 02 F8 2B 03 3C 09 5E 5B 02 F4 2B 1B 43 5C 02 \r
+0D 6D 09 69 0A 6A 09 8E 0A 7F 04 28 1C D3 5B 02 \r
+F6 2B 04 3C 09 5E 0A 6F 5B 02 F1 2B 0E 49 0F 4A \r
+09 16 0A 16 10 01 0A 14 7C 40 23 00 B0 13 CA EB \r
+CA 0C 7A D0 20 00 CD 0A 7C 40 23 00 B0 13 28 DD \r
+7C 40 C6 00 B0 13 A6 CA 7C 40 33 00 B0 13 06 BD \r
+7C 40 3D 00 B0 13 06 BD 7C B0 70 00 F9 23 3D 40 \r
+DF 00 4D FA 7C 40 23 00 B0 13 28 DD 7C 40 36 00 \r
+B0 13 06 BD 82 43 C4 1E 0A 16 10 01 0A 14 CA 0D \r
+6A 92 17 24 1C 42 FC 1D 1D 42 FE 1D 3E 40 E8 03 \r
+0F 43 B0 13 8E D0 7E 40 06 00 7F 40 05 00 B0 13 \r
+FC B4 CD 0C 7C 40 5A 00 5E 43 B0 13 70 AF 5A 93 \r
+08 24 6A 92 0B 20 7C 40 10 00 4D 43 B0 13 02 E9 \r
+05 3C 7C 40 10 00 5D 43 B0 13 02 E9 0A 16 10 01 \r
+B2 B0 20 00 08 1E 25 20 B0 13 22 EF 4C 93 21 20 \r
+B0 13 3A EF 4C 93 1D 20 D2 53 89 1E E2 93 89 1E \r
+18 20 4C 43 4D 43 B0 13 02 E9 5C 43 B0 13 D2 CE \r
+7C 40 5A 00 3D 40 20 F5 5E 43 B0 13 70 AF 7C 40 \r
+46 00 3D 40 56 F5 5E 43 B0 13 70 AF 3F 40 00 10 \r
+C0 0F 10 01 2A 14 1A 41 10 00 49 4C 1B 42 44 1E \r
+1B 4B 0C 00 0B 89 3B 80 32 00 28 4D C9 0B 09 88 \r
+09 93 02 38 28 9E 15 20 8D 4B 00 00 1D 42 44 1E \r
+4C 4C 1C 5D 0C 00 3C 50 10 00 8E 4C 00 00 1E 42 \r
+44 1E DF 4E 0F 00 00 00 1F 42 44 1E DA 4F 10 00 \r
+00 00 28 16 10 01 1A 14 CA 0C 5C 4A 05 00 CF 0C \r
+3F 80 03 00 06 24 2F 83 2F 93 03 28 7F 40 03 00 \r
+01 3C 5F 43 4C 4C 1D 4A 02 00 5E 4A 04 00 B0 13 \r
+6C C0 C9 0C 09 93 0C 24 3C 40 03 00 0C 59 2D 4A \r
+2E 42 B0 13 60 ED CC 09 5D 43 B0 13 68 E1 02 3C \r
+3C 40 03 00 19 16 10 01 A2 D2 22 03 A2 C2 24 03 \r
+3E 42 4F 43 B2 C2 22 03 B0 13 CC D2 4F 5F A2 B2 \r
+20 03 01 24 5F D3 1E 83 F5 23 A2 D2 24 03 B2 C2 \r
+22 03 5C 93 03 24 A2 D2 22 03 02 3C A2 C2 22 03 \r
+B0 13 CC D2 B2 C2 22 03 CC 0F 10 01 B0 13 CE F0 \r
+B2 D2 22 03 B0 13 CE F0 10 01 D2 B3 D6 1E 1E 24 \r
+A2 93 46 1E 1B 24 1F 42 44 1E 2E 4F 1F 4F 02 00 \r
+0F 93 09 20 0E 93 07 20 82 93 46 1E 0F 20 92 43 \r
+46 1E 5C 43 10 01 1C 42 4E 1E 1D 42 50 1E 3C F3 \r
+3D F0 FF 00 0D 9F 02 20 0C 9E 02 24 4C 43 10 01 \r
+A2 43 46 1E 5C 43 10 01 2A 14 19 43 59 52 CB 1E \r
+18 42 CE 1E 5A 42 CC 1E 4C 4A CD 08 B0 13 86 C2 \r
+4C 4C 0C 99 11 34 5A 53 3A 90 0D 00 05 34 C2 4A \r
+CC 1E D2 43 CB 1E 0A 3C D2 43 CB 1E D2 43 CC 1E \r
+18 53 82 48 CE 1E 02 3C C2 49 CB 1E 92 D3 8C 1C \r
+28 16 10 01 F2 B0 10 00 01 02 10 20 D2 B3 01 02 \r
+06 24 C2 93 7F 1E 19 20 B2 D2 76 1E 0C 3C 82 43 \r
+7C 1E F2 40 0A 00 7F 1E 80 00 9E F0 C2 93 7F 1E \r
+0C 20 A2 D2 76 1E 92 53 7C 1E 92 42 26 1E 2A 1E \r
+92 42 28 1E 2C 1E 80 00 A4 F0 D2 83 7F 1E 10 01 \r
+2A 14 4A 4C 4C 4A B0 13 6E EE 4C 93 02 20 7A E3 \r
+5A 53 3A B0 00 80 0B 7B 3B E3 38 40 AC F6 09 43 \r
+0F 43 1C 43 0D 43 CE 0F B0 13 1E EE 0C FA 0D FB \r
+CE 0F B0 13 2E EE 3D 48 B0 13 38 EC 09 5C 1F 53 \r
+3F 90 07 00 EE 3B CC 09 28 16 10 01 21 83 81 43 \r
+00 00 7C 40 81 00 5D 43 B0 13 4A C7 81 4C 00 00 \r
+B1 B0 00 20 00 00 02 20 4E 43 08 3C B1 D0 00 C0 \r
+00 00 B1 E3 00 00 91 53 00 00 5E 43 2C 41 5C 03 \r
+CF 0C 4E 93 04 24 3C 40 AC 0A 0C 8F 03 3C 3C 40 \r
+AC 0A 0C 5F 21 53 10 01 0B 4D 0E 4B 0D 93 1F 30 \r
+3B F0 80 7F 1C 24 5B 02 8B 10 7E D0 80 00 3B 80 \r
+7F 00 15 30 3B 90 20 00 0F 34 3B 80 17 00 05 30 \r
+1B 83 08 30 5C 02 0E 6E FB 3F 5E 01 5C 00 1B 53 \r
+01 24 FB 3F 0D 4E 10 01 3C 43 3D 43 10 01 0C 43 \r
+0D 43 10 01 0B 4D 0B EF 0A 30 0D 93 12 30 0D 9F \r
+02 24 19 34 16 3C 0C 9E 18 24 13 28 14 3C 3D B0 \r
+80 7F 04 20 3F B0 80 7F 01 20 0F 24 0D 9F 0B 34 \r
+08 3C 0F 9D 02 24 07 34 04 3C 0E 9C EC 27 01 28 \r
+02 3C 3C 43 10 01 1C 43 10 01 0C 43 10 01 82 43 \r
+EE 1D 4C 43 B0 13 6E F0 B0 13 0E EE C2 43 FA 1D \r
+C2 43 00 1E 82 43 02 1E 82 43 04 1E 92 D3 8C 1C \r
+7C 40 13 00 6D 42 B0 13 02 E9 7C 40 17 00 6D 42 \r
+B0 13 02 E9 7C 40 18 00 6D 42 B0 13 02 E9 7C 40 \r
+19 00 6D 42 80 00 02 E9 E2 93 AA 1E 13 24 B0 13 \r
+78 EC C2 93 AA 1E 1C 24 82 43 90 03 B2 D0 10 00 \r
+80 03 F2 D0 80 00 0B 02 E2 43 AA 1E 92 42 A8 1E \r
+C0 1E 10 01 B2 F0 CF FF 80 03 F2 F0 7F 00 03 02 \r
+F2 F0 7F 00 0B 02 D2 43 AA 1E 92 42 A6 1E C0 1E \r
+10 01 1A 14 CB 0E CA 0D CE 0C CC 0A CD 0B B0 13 \r
+A0 DB 4D 4C CC 0A 49 4E 5C E9 06 F4 47 18 0C 5C \r
+4E ED 5E 4E 06 F4 0E 5C 4A 4A 47 18 0A 5A CC 0B \r
+4C DD 0C 5A 0C EE 0F 9C 06 2C 3E 40 FF 7F 0C FE \r
+5E 03 0F 9C FC 2B 19 16 10 01 1A 14 31 80 06 00 \r
+C9 0C 5A 42 77 1D CC 0A B0 13 F2 E3 0C 93 02 20 \r
+2C 43 13 3C 4D 43 B0 13 50 E5 0C 93 0E 20 91 43 \r
+02 00 C1 4A 04 00 81 43 00 00 CC 01 2C 53 3D 40 \r
+F2 1C CE 09 0F 43 B0 13 D2 BB 31 50 06 00 19 16 \r
+10 01 C2 93 A4 1E 20 20 C2 4C A4 1E B2 40 8F 02 \r
+A6 1E 82 4D A8 1E B2 40 14 01 80 03 B2 40 05 00 \r
+92 03 B2 40 80 00 82 03 F2 D0 80 00 0B 02 00 18 \r
+F2 40 38 D5 BC 1E 3C 40 8F 02 B0 13 F8 E2 92 42 \r
+A8 1E C0 1E E2 43 AA 1E 10 01 F2 40 A5 00 21 01 \r
+4E 4C 4F 4E 8F 10 0E 5F 3E 50 00 44 82 4E 24 01 \r
+4F 4C 3F 50 00 44 82 4F 26 01 92 B3 2C 01 FD 27 \r
+C2 4C 20 01 B2 F0 F9 FF 2C 01 A2 B3 2C 01 03 24 \r
+A2 B2 2C 01 FD 27 82 4E 26 01 C2 43 21 01 10 01 \r
+1A 14 3F 40 E8 F6 9F 00 FF FF 12 24 3D 40 E8 F6 \r
+0C 3C 4F 13 2A 52 12 3C 3C 4D CA 0D CE 09 B0 13 \r
+60 ED 0A 59 CD 0A 1D 53 1D C3 39 4D 09 93 F4 23 \r
+3F 40 FF FF 3F 93 05 24 3A 40 FF FF 0F 0A DF 03 \r
+E8 23 19 16 10 01 1A 14 21 83 CB 0F CA 0D C9 0C \r
+5E 41 0E 00 B2 B0 40 00 08 1E 10 20 4C 4A B0 13 \r
+26 EB C1 4E 00 00 4C 4C CD 0C 0E 43 CC 09 CF 0B \r
+B0 13 02 E7 4C 4A B0 13 CC E9 05 3C C1 4E 00 00 \r
+0E 43 B0 13 02 E7 21 53 19 16 10 01 7C 90 3C 00 \r
+06 28 7C 90 3E 00 03 24 32 C2 03 43 FF 3F 0F 42 \r
+32 C2 03 43 B2 B0 10 00 02 0F FC 27 7C 90 2F 00 \r
+08 28 7C 90 3E 00 05 24 7C D0 C0 00 C2 4C 13 0F \r
+04 3C 7C D0 80 00 C2 4C 13 0F 5C 42 22 0F 02 4F \r
+10 01 0B 4D 0E 4B 3B F0 80 7F 1C 24 5B 02 8B 10 \r
+7E D0 80 00 3B 80 7F 00 15 30 3B 90 10 00 10 34 \r
+5E 01 5C 00 1E 93 01 24 FB 3F 1B 83 03 30 5C 02 \r
+0E 6E FB 3F 0D 93 02 34 3E E3 1E 53 0C 4E 10 01 \r
+3C 43 10 01 0C 43 10 01 0A 14 CB 0D 0A 42 32 C2 \r
+03 43 B2 B0 10 00 02 0F FC 27 7C D0 C0 00 C2 4C \r
+13 0F 4F 4E 1F 83 0A 24 B2 B0 80 00 02 0F FC 27 \r
+1D 53 DD 42 22 0F FF FF 1F 83 F6 23 4D 4E 0D 5B \r
+DD 42 20 0F FF FF 02 4A 0A 16 10 01 0B 42 32 C2 \r
+03 43 B2 B0 10 00 02 0F FC 27 4C 4C 47 18 0C 5C \r
+3C D0 00 40 6F 4D 0F 5C 82 4F 10 0F 6E 93 0C 28 \r
+1D 53 4E 4E 1E 83 E2 4D 10 0F B2 B0 20 00 02 0F \r
+FC 27 1D 53 1E 83 F7 23 5F 42 20 0F 02 4B 10 01 \r
+92 B3 0A 1E 03 24 5C 43 B0 13 9C BD A2 B2 0A 1E \r
+03 24 5C 43 B0 13 96 BA B2 B2 0A 1E 02 24 B0 13 \r
+FE EE A2 B3 0A 1E 02 24 B0 13 F2 C5 B2 B0 10 00 \r
+0A 1E 05 24 6C 43 3D 40 99 19 B0 13 12 D6 82 43 \r
+0A 1E 10 01 1A 14 C9 0C 3D 40 0C 00 0D 59 6E 49 \r
+7E 80 0B 00 5C 43 7F 40 03 00 B0 13 6C C0 CA 0C \r
+0A 93 10 24 3C 40 03 00 0C 5A 3D 40 05 00 0D 59 \r
+2E 42 B0 13 60 ED FA D0 80 00 0E 00 CC 0A 4D 43 \r
+B0 13 68 E1 19 16 10 01 D2 B3 D6 1E 0E 24 1D 42 \r
+4E 1E 1E 42 50 1E 3D F3 3E F0 FF 00 1F 42 44 1E \r
+1E 9F 02 00 02 20 2D 9F 02 24 4C 43 10 01 DF 92 \r
+51 1E 13 00 04 24 D2 C3 D6 1E 4C 43 10 01 EF C2 \r
+1A 00 B0 13 F6 C0 5C 43 10 01 A2 D2 24 03 7F 40 \r
+80 00 3E 42 B2 C2 22 03 CD 0C 4D FF 4D 9F 03 24 \r
+A2 C2 22 03 02 3C A2 D2 22 03 12 C3 4F 10 B0 13 \r
+CE F0 B2 D2 22 03 B0 13 CE F0 1E 83 EB 23 B2 C2 \r
+22 03 A2 D2 22 03 A2 C2 24 03 10 01 4C 93 1D 20 \r
+4C 43 B0 13 C2 E5 0C 93 04 24 1C 83 09 24 1C 83 \r
+14 20 C2 43 DC 1E C2 43 DD 1E 82 43 DE 1E 10 01 \r
+1F 42 D4 F6 D2 4F 0E 00 DC 1E 1E 4F 04 00 1F 4F \r
+06 00 C2 4F DD 1E 82 4E DE 1E 10 01 82 43 18 1E \r
+82 43 24 1E 82 43 20 1E C2 93 76 1D 16 24 B0 13 \r
+2A E5 B0 13 4C DA B0 13 3C EA 1C 42 22 1E 0C 93 \r
+0C 24 1C 52 20 1E 82 4C 20 1E 1D 42 1A 1E 1E 42 \r
+1C 1E 1F 42 1E 1E 80 00 BA 93 10 01 0A 14 0A 43 \r
+0F 93 05 34 3E E3 3F E3 1E 53 0F 63 1A D3 0D 93 \r
+05 34 3C E3 3D E3 1C 53 0D 63 3A E3 B0 13 8E D0 \r
+1A B3 04 24 3C E3 3D E3 1C 53 0D 63 2A B3 04 24 \r
+3E E3 3F E3 1E 53 0F 63 0A 16 10 01 B0 13 52 B9 \r
+F2 B2 F0 1C 14 24 3C 40 03 00 3D 40 05 00 0E 43 \r
+B0 13 F0 B7 3C 40 F2 1C 6D 42 B0 13 40 CA 3C 40 \r
+03 00 2D 42 0E 43 B0 13 F0 B7 F2 C2 F0 1C F2 B0 \r
+20 00 F0 1C E3 27 C2 43 D1 1D 10 01 C2 93 76 1D \r
+15 24 82 93 24 1E 19 20 F2 F0 BF 00 1D 02 F2 D0 \r
+40 00 1B 02 B0 13 6A EF B2 40 10 0E 24 1E F2 B0 \r
+40 00 01 02 FC 27 4C 43 80 00 96 BA 7C 40 47 00 \r
+3D 40 06 F5 5E 43 80 00 70 AF 10 01 0A 14 CA 0D \r
+CB 0E 4C 4C 3D 40 1C 00 B0 13 38 EC 1F 42 D4 F6 \r
+0F 5C 8F 93 18 00 0F 20 8F 4A 00 00 8F 4B 02 00 \r
+0B 93 06 20 0A 93 04 20 1C 52 D4 F6 EC C2 1A 00 \r
+FF 40 7F 00 10 00 0A 16 10 01 0A 14 5A 42 57 1E \r
+3C 40 4E 1E B0 13 AA DE 4C 4C 0C EA 47 18 0C 5C \r
+8C 10 4C 4C CA 0C C2 4A 57 1E 3A 90 21 00 05 20 \r
+D2 D3 D6 1E B0 13 74 F0 05 3C F2 F0 EF 00 D6 1E \r
+B0 13 0A C4 0A 16 10 01 1A 14 C2 93 A2 1D 16 24 \r
+3C 40 7A 1D 29 42 3A 40 D8 F6 3B 40 A4 1D 4E 43 \r
+4F 43 7D 4C 7D 9B 01 20 5E 53 7D 9A 01 20 5F 53 \r
+19 83 F7 23 6F 92 02 24 6E 92 02 20 4C 43 01 3C \r
+5C 43 19 16 10 01 5C 02 0D 6D 5C 02 0D 6D 5C 02 \r
+0D 6D 5C 02 0D 6D 5C 02 0D 6D 5C 02 0D 6D 5C 02 \r
+0D 6D 5C 02 0D 6D 5C 02 0D 6D 5C 02 0D 6D 5C 02 \r
+0D 6D 5C 02 0D 6D 5C 02 0D 6D 5C 02 0D 6D 5C 02 \r
+0D 6D 10 01 5D 03 5C 00 5D 03 5C 00 5D 03 5C 00 \r
+5D 03 5C 00 5D 03 5C 00 5D 03 5C 00 5D 03 5C 00 \r
+5D 03 5C 00 5D 03 5C 00 5D 03 5C 00 5D 03 5C 00 \r
+5D 03 5C 00 5D 03 5C 00 5D 03 5C 00 5D 03 5C 00 \r
+10 01 0A 14 3F 40 B9 1D 2E 43 0C 43 2D 43 6D 9F \r
+05 20 3F 50 0C 00 1C 53 1E 83 F8 23 6C 93 02 20 \r
+0C 43 0C 3C 4C 4C 3D 40 0C 00 B0 13 38 EC 3A 40 \r
+B9 1D 0A 5C CC 0A B0 13 98 DD CC 0A 0A 16 10 01 \r
+92 C3 44 03 82 93 9A 1E 0E 24 B0 13 9A 82 92 93 \r
+9A 1E 03 24 B0 13 AE DF 02 3C B0 13 0A C4 1C 42 \r
+94 1E 80 00 E4 E8 F2 C2 D6 1E B0 13 0A C4 1C 42 \r
+96 1E B0 13 E4 E8 92 43 9A 1E 10 01 3A 14 C8 0D \r
+C7 0C 3A 40 B9 1D 29 43 2F 43 6F 9A 0E 20 3D 40 \r
+03 00 0D 5A CC 07 2E 42 B0 13 2E E6 0C 93 05 20 \r
+58 9A 0A 00 02 20 CC 0A 05 3C 3A 50 0C 00 19 83 \r
+EB 23 0C 43 37 16 10 01 3A 14 C8 0D C7 0C 3A 40 \r
+B9 1D 49 43 2F 43 6F 9A 0E 20 3C 40 03 00 0C 5A \r
+CD 07 2E 42 B0 13 2E E6 0C 93 05 20 CA 98 0A 00 \r
+02 20 CC 0A 05 3C 3A 50 0C 00 59 53 EB 27 0C 43 \r
+37 16 10 01 C2 93 40 1E 14 20 3F 40 47 01 1F 52 \r
+56 03 C2 93 36 1E 08 20 C2 93 37 1E 0E 24 3F 80 \r
+03 00 C2 43 37 1E 09 3C 3F 80 05 00 C2 43 36 1E \r
+F8 3F 3F 40 00 80 1F 52 56 03 82 4F 56 03 10 01 \r
+82 43 4C 1E B0 13 7A F0 F2 40 21 00 48 1E F2 40 \r
+06 00 4A 1E C2 43 49 1E D2 43 4B 1E 7C 43 5D 43 \r
+B0 13 06 C9 B0 13 BC C7 B0 13 E6 D0 7C 40 0C 00 \r
+5D 42 16 1E 80 00 28 DD 21 83 0F 42 32 C2 03 43 \r
+B2 B0 10 00 02 0F FC 27 4C 4C 47 18 0C 5C 3C D0 \r
+00 40 4D 4D 0C 5D 82 4C 10 0F B2 B0 20 00 02 0F \r
+FC 27 5E 42 20 0F 81 4E 00 00 02 4F 21 53 10 01 \r
+5F 14 1A 42 38 0F 4A 4A B0 13 3A EF 4C 93 10 20 \r
+7A 90 14 00 04 24 4A 93 0D 20 03 43 0B 3C 1F 42 \r
+EE 1D 1F 93 02 24 2F 93 05 20 B0 13 18 ED 02 3C \r
+B0 13 3E CC 5A 16 00 13 21 83 CC 43 0A 00 EC 43 \r
+00 00 DC 42 B8 1D 0B 00 D2 53 B8 1D 02 3C D2 53 \r
+B8 1D C2 93 B8 1D FB 27 F2 93 B8 1D F8 27 5C 42 \r
+B8 1D CD 01 B0 13 CA E3 4C 93 F1 23 21 53 10 01 \r
+82 43 EE 1D 82 43 F2 1D 82 43 F4 1D 82 43 F0 1D \r
+C2 43 FA 1D C2 43 00 1E 82 43 02 1E 82 43 04 1E \r
+82 43 FC 1D 82 43 FE 1D C2 43 F6 1D B2 40 4B 00 \r
+F8 1D C2 43 06 1E 10 01 B0 13 72 B3 B0 13 2C C8 \r
+B0 13 84 87 B0 13 16 EF 82 93 76 1E 03 20 82 93 \r
+08 1E 02 24 B0 13 36 A1 82 93 0A 1E 02 24 B0 13 \r
+40 D8 82 93 8C 1C EE 27 B0 13 68 9C EB 3F 0A 14 \r
+CA 0C 5D 42 EE 1E B0 13 D8 E0 4C 93 0E 24 B0 13 \r
+84 ED CD 0C 1C 43 0C 5A 2E 42 B0 13 2E E6 0C 93 \r
+02 20 0C 43 05 3C 2C 43 03 3C B0 13 CE EE 1C 43 \r
+0A 16 10 01 0E 4C 0D 4C 0D 93 16 24 03 34 3D E3 \r
+1D 53 0F 30 3B 40 8F 00 1B 83 5D 02 FD 2B 4C 4D \r
+8C 10 8D 10 4D 4D 8B 10 0D DB 5E 02 5D 00 5C 00 \r
+10 01 3D 40 00 C7 0C 43 10 01 0A 14 3A 40 09 00 \r
+0F 43 6D 4C 3B 42 4E 4D 0E EF 3E 90 80 00 04 38 \r
+4F 5F 7F E0 97 00 02 3C 4F 5F 4F 4F 4D 5D 1B 83 \r
+F2 23 1C 53 1A 83 ED 23 CC 0F 0A 16 10 01 1D 42 \r
+9E 1D 0F 42 32 C2 03 43 D2 43 9C 1D 02 4F 0D 93 \r
+07 24 B0 13 C6 E8 C2 93 9B 1D 02 20 1D 83 F9 23 \r
+0F 42 32 C2 03 43 C2 43 9B 1D C2 43 9C 1D 02 4F \r
+10 01 B0 13 2C F0 1F 42 44 1E FF 90 7F 00 10 00 \r
+0A 24 2C 93 05 34 3C 93 0D 34 DF 83 10 00 10 01 \r
+DF 53 10 00 10 01 CF 4C 10 00 1F 42 44 1E FF 50 \r
+0C 00 10 00 10 01 7C 90 2F 00 06 28 7C 90 3E 00 \r
+03 24 32 C2 03 43 FF 3F 0F 42 32 C2 03 43 B2 B0 \r
+10 00 02 0F FC 27 C2 4C 11 0F B2 B0 20 00 02 0F \r
+FC 27 C2 4D 10 0F 02 4F 10 01 4D 93 03 20 32 C2 \r
+03 43 FF 3F 0F 42 32 C2 03 43 B2 B0 10 00 02 0F \r
+FC 27 F2 40 7F 00 11 0F 4D 4D B2 B0 20 00 02 0F \r
+FC 27 F2 4C 10 0F 1D 83 F8 23 02 4F 10 01 B2 F0 \r
+FE FD 36 0F B2 F0 FE FD 32 0F 7C 40 36 00 B0 13 \r
+06 BD 7C 40 3A 00 B0 13 06 BD 7C 40 36 00 B0 13 \r
+06 BD 7C 40 32 00 B0 13 06 BD 82 43 C4 1E 10 01 \r
+F2 F0 DF 00 1B 02 92 C3 22 03 F2 F0 DF 00 03 02 \r
+F2 F0 1F 00 02 02 F2 F0 1F 00 0A 02 A2 C3 22 03 \r
+F2 D0 20 00 05 02 F2 D0 E0 00 04 02 A2 D3 24 03 \r
+10 01 21 83 7C 40 30 00 B0 13 06 BD 81 43 00 00 \r
+02 3C 91 53 00 00 B1 90 64 00 00 00 FA 2B 7C 40 \r
+36 00 B0 13 06 BD 7C B0 70 00 F9 23 82 43 06 0F \r
+21 53 10 01 0C 93 02 20 0D 93 14 24 3B 40 9F 00 \r
+1B 83 5C 02 0D 6D FC 2B 12 C3 5D 00 5C 00 3E 40 \r
+06 00 5D 01 5C 00 1E 83 FC 37 8B 10 0D DB 12 C3 \r
+5D 00 5C 00 10 01 A2 B2 76 1E 15 24 5F 42 E0 1E \r
+4F 93 0A 24 5F 93 0F 20 C2 43 E0 1E 92 D3 0C 1E \r
+B2 D0 80 00 0C 1E 10 01 D2 43 E0 1E 92 D3 0C 1E \r
+B2 D0 40 00 0C 1E 10 01 4D 93 03 20 32 C2 03 43 \r
+FF 3F 0F 42 32 C2 03 43 4D 4D B2 B0 10 00 02 0F \r
+FC 27 F2 40 BF 00 13 0F 1C 53 DC 42 22 0F FF FF \r
+1D 83 F3 23 02 4F 10 01 CF 0C FF B0 80 FF 0C 00 \r
+02 20 6C 43 10 01 CF 9D 0D 00 0C 20 B0 13 84 ED \r
+CD 0C 1C 43 0C 5F 2E 42 B0 13 2E E6 0C 93 02 20 \r
+4C 43 10 01 5C 43 10 01 82 93 6E 1E 09 20 82 93 \r
+6C 1E 06 20 B2 40 04 03 6C 1E B2 40 02 01 6E 1E \r
+B0 13 9E EB C2 4C 75 1E 4C 93 FA 27 3C 40 72 1E \r
+0D 43 1E 43 80 00 72 ED 31 80 06 00 81 43 02 00 \r
+D1 4C 05 00 04 00 CF 0C 3F 50 06 00 81 4F 00 00 \r
+1D 4C 02 00 2E 42 0E 5C 2F 4C CC 01 2C 53 B0 13 \r
+D2 BB 31 50 06 00 10 01 0A 14 CA 0C 3F 40 CF 00 \r
+5F FA 0C 00 5F D2 66 1E CA 4F 0C 00 2C 43 0C 5A \r
+B0 13 AC B2 4C 93 02 20 0C 43 02 3C 3C 40 09 00 \r
+CA 43 00 00 0A 16 10 01 7C 90 80 00 09 28 4C 4C \r
+3C 80 00 01 2D 43 B0 13 78 E2 3C 80 4A 00 04 3C \r
+4C 4C 5C 03 3C 80 4A 00 3C 90 80 FF 02 34 3C 40 \r
+80 FF 8C 11 10 01 92 C3 22 03 F2 F0 DF 00 03 02 \r
+F2 F0 1F 00 02 02 A2 C3 22 03 F2 D0 20 00 05 02 \r
+F2 D0 E0 00 04 02 A2 D3 24 03 92 D3 24 03 D2 43 \r
+93 1E 10 01 B2 F0 FF FD 36 0F 7C 40 36 00 B0 13 \r
+D8 C6 7C 40 3D 00 B0 13 D8 C6 7C B0 F0 FF F9 23 \r
+7C 40 3A 00 B0 13 D8 C6 B2 F0 FF FD 32 0F 10 01 \r
+C2 93 D1 1D 0E 20 B0 13 92 95 B0 13 08 C3 0C 93 \r
+0C 20 B0 13 E0 E6 B0 13 84 ED B0 13 E6 E5 B0 13 \r
+8A E8 D2 43 D1 1D 80 00 60 A6 10 01 5C 93 13 20 \r
+0C 42 32 C2 03 43 2E 43 3F 40 00 1C CF 93 00 00 \r
+05 24 5D 9F 01 00 02 2C DF 83 01 00 3F 50 23 00 \r
+1E 83 F4 23 02 4C 10 01 0B 43 0D 93 03 34 3D E3 \r
+1D 53 1B D3 0C 93 03 34 3C E3 1C 53 3B E3 B0 13 \r
+22 EC 1B B3 02 24 3C E3 1C 53 2B B3 02 24 3E E3 \r
+1E 53 10 01 4C 4C 3D 40 1C 00 B0 13 38 EC CF 0C \r
+1F 52 D4 F6 EF B2 1A 00 03 24 0F 43 0D 43 05 3C \r
+1C 52 D4 F6 2F 4C 1D 4C 02 00 CC 0F 10 01 C2 93 \r
+4A 1E 09 24 1F 42 44 1E DF 83 13 00 1F 42 44 1E \r
+CF 93 13 00 02 24 5C 43 10 01 8F 43 18 00 5D 43 \r
+B0 13 4C D9 4C 43 10 01 82 4C C0 1E 82 93 50 03 \r
+02 20 0F 43 05 3C 1F 42 50 03 1F 92 50 03 FB 23 \r
+0F 5C 82 4F 58 03 92 C3 48 03 B2 D0 10 00 48 03 \r
+10 01 31 40 FC 2B 00 18 F2 40 D2 F0 AC 1E 00 18 \r
+F2 40 D2 F0 B0 1E B0 13 AE F0 0C 93 02 24 B0 13 \r
+A0 D6 0C 43 B0 13 08 DE B0 13 B2 F0 92 B3 22 03 \r
+11 24 7C 40 06 00 B0 13 9A C8 C2 4C 59 1E 7C 40 \r
+07 00 B0 13 9A C8 C2 4C 5A 1E 7C 42 B0 13 9A C8 \r
+C2 4C 5B 1E 10 01 5D 93 12 20 C2 93 89 1E 0A 24 \r
+E2 93 89 1E 0C 2C 7C 40 5A 00 3D 40 1A F5 5E 43 \r
+80 00 70 AF 7C 40 5A 00 3D 40 20 F5 F8 3F 10 01 \r
+B2 D0 06 00 06 0A B2 40 1D 7B 00 0A B2 40 ED 00 \r
+04 0A F2 D0 E0 00 4A 02 F2 D0 E0 00 44 02 B2 43 \r
+0A 0A B2 40 FF 00 0C 0A 10 01 3F 40 B9 1D 0E 43 \r
+2B 43 6B 9F 07 20 CF 9C 0B 00 04 20 CD 4E 00 00 \r
+5C 43 10 01 3F 50 0C 00 1E 53 2E 93 F1 3B 4C 43 \r
+10 01 21 83 CD 01 B0 13 CA E3 4C 93 0B 24 6C 41 \r
+3D 40 0C 00 B0 13 38 EC EC 93 B9 1D 03 20 3C 50 \r
+B9 1D 01 3C 0C 43 21 53 10 01 82 93 8C 1E 09 20 \r
+82 93 8A 1E 06 20 B2 40 08 07 8A 1E B2 40 06 05 \r
+8C 1E 00 18 C2 43 8E 1E B0 13 9E EB C2 4C 92 1E \r
+10 01 B2 B0 20 00 08 1E 0F 20 B0 13 22 EF 4C 93 \r
+0B 20 F2 C2 03 02 F2 C2 05 02 F2 C2 1B 02 2C 43 \r
+B0 13 16 B1 F2 D2 1B 02 10 01 B2 B0 20 00 08 1E \r
+0F 20 B0 13 22 EF 4C 93 0B 20 F2 C2 03 02 F2 C2 \r
+05 02 F2 C2 1B 02 1C 43 B0 13 16 B1 F2 D2 1B 02 \r
+10 01 3C 40 03 00 5C F2 20 01 7C 90 03 00 03 2C \r
+5C 53 B0 13 5A D6 6C 92 03 28 5C 83 B0 13 B8 E4 \r
+7C 90 03 00 EE 23 10 01 F2 40 A5 00 21 01 4E 4C \r
+4F 4E 8F 10 0E 5F 3E 50 00 44 82 4E 26 01 92 B3 \r
+2C 01 FD 27 C2 4C 20 01 C2 43 21 01 10 01 3F 40 \r
+13 00 6F 9C 09 24 5F 4C 0C 00 1F 83 07 24 1F 83 \r
+07 20 B0 13 D8 C9 04 3C DC 43 0C 00 B0 13 D2 99 \r
+0C 43 10 01 F2 F0 E0 00 05 02 F2 F0 E0 00 03 02 \r
+F2 D0 1F 00 07 02 F2 F0 E0 00 19 02 F2 F0 E0 00 \r
+1D 02 F2 D0 1F 00 1B 02 10 01 1A 14 39 40 11 00 \r
+3F 40 32 1D 3A 40 72 F6 3C 4A B0 13 9A E6 2F 52 \r
+8F 4C FC FF 8F 4D FE FF 19 83 F6 23 19 16 10 01 \r
+4D 93 03 24 5F 4C 0A 00 02 3C 5F 4C 09 00 4F 93 \r
+06 24 CC 93 00 00 03 24 7F 90 20 00 02 2C 2C 43 \r
+10 01 0C 43 10 01 3C 40 80 1E 0D 43 2E 42 B0 13 \r
+72 ED C2 93 88 1E 09 20 3C 40 84 1E 3D 40 BA F6 \r
+2E 42 B0 13 60 ED D2 43 88 1E 10 01 B2 B0 20 00 \r
+08 1E 0E 20 B0 13 22 EF 4C 93 0A 20 F2 C2 03 02 \r
+F2 C2 05 02 F2 C2 1B 02 B0 13 34 BB F2 D2 1B 02 \r
+10 01 4C 4C 3D 40 1C 00 B0 13 38 EC CF 0C 1F 52 \r
+D4 F6 EF B2 1A 00 02 24 2C 43 10 01 1C 52 D4 F6 \r
+1C 4C 18 00 10 01 CE 0C 6D 4E 5D 92 D8 F6 0C 24 \r
+7C 40 09 00 B0 13 46 DF 2D 42 3F 40 A4 1D 1F 53 \r
+FF 4E FF FF 1D 83 FB 23 10 01 0A 14 0A 42 32 C2 \r
+03 43 D2 93 78 1D 08 24 B0 13 EA E7 7C 40 32 00 \r
+B0 13 D8 C6 D2 43 78 1D 02 4A 0A 16 10 01 0E 93 \r
+02 20 0C 43 10 01 1D 83 1C 83 1D 53 6B 4D 1C 53 \r
+6F 4C 4F 9B 02 20 1E 83 F8 23 4B 4B 4C 4F 0C 8B \r
+10 01 0A 14 CA 0C 5D 42 17 1E B0 13 D8 E0 4C 93 \r
+04 20 B0 13 CE EE 1C 43 04 3C CC 0A B0 13 0A EF \r
+0C 43 0A 16 10 01 82 43 26 1E 82 43 28 1E E2 42 \r
+30 1E F2 40 1E 00 31 1E C2 43 32 1E C2 43 2F 1E \r
+82 43 2A 1E 82 43 2C 1E 10 01 0D 4C 0D 93 0E 24 \r
+3B 40 8F 00 1B 83 5D 02 FD 2B 4C 4D 8C 10 8D 10 \r
+4D 4D 8B 10 0D DB 12 C3 5D 00 5C 00 10 01 82 43 \r
+90 03 B2 40 C0 00 92 03 B2 D0 10 00 80 03 92 B3 \r
+82 03 FD 27 B2 F0 EF FF 80 03 92 C3 82 03 10 01 \r
+D2 93 78 1D 0D 20 7C 40 36 00 B0 13 D8 C6 7C 40 \r
+3D 00 B0 13 D8 C6 7C B0 F0 FF F9 23 E2 43 78 1D \r
+10 01 0A 14 CB 0E CA 0C CE 0F CC 0D CD 0B 5F 41 \r
+08 00 B0 13 FC B4 CD 0C CC 0A 6E 43 B0 13 70 AF \r
+0A 16 10 01 0A 14 CA 0C 5D 42 75 1E B0 13 D8 E0 \r
+4C 93 04 20 B0 13 CE EE 1C 43 03 3C CC 0A B0 13 \r
+DE E4 0A 16 10 01 02 12 32 C2 03 43 82 4C D0 04 \r
+82 4D D2 04 82 4E E0 04 82 4F E2 04 1C 42 E4 04 \r
+1D 42 E6 04 32 41 10 01 D2 43 34 1E 92 42 50 03 \r
+56 03 B0 13 B4 DC 92 C3 46 03 B2 D0 10 00 46 03 \r
+7C 40 14 00 5D 43 80 00 02 E9 1F 42 D4 F6 BF 90 \r
+FF 00 02 00 05 28 06 20 BF 90 00 FF 00 00 02 2C \r
+0C 43 10 01 1C 42 DE 1E 10 01 1F 42 D4 F6 BF 90 \r
+FF 00 02 00 05 28 06 20 BF 90 00 FF 00 00 02 2C \r
+4C 43 10 01 5C 42 DD 1E 10 01 0A 14 5C 43 B0 13 \r
+7C C5 CA 0C 0A 93 07 24 2C 43 0C 5A B0 13 DA EE \r
+CC 0A B0 13 54 BF 0A 16 10 01 D2 93 78 1D 09 24 \r
+F2 90 03 00 78 1D 08 20 B0 13 F4 E1 E2 43 78 1D \r
+10 01 32 C2 03 43 FF 3F 10 01 D2 93 78 1D 09 24 \r
+F2 90 03 00 78 1D 08 24 F2 40 03 00 78 1D 80 00 \r
+B4 EB 32 C2 03 43 FF 3F 10 01 C2 43 66 1E 00 18 \r
+C2 43 68 1E B0 13 84 ED 82 4C 64 1E B0 13 9E EB \r
+C2 4C 62 1E 4C 93 FA 27 10 01 3C 40 38 1E 3D 40 \r
+44 F5 3E 42 B0 13 60 ED C2 43 37 1E C2 43 36 1E \r
+C2 43 34 1E C2 43 40 1E 10 01 B2 F0 CF FF 80 03 \r
+F2 F0 7F 00 03 02 F2 F0 7F 00 0B 02 B2 F0 EF FF \r
+82 03 B0 13 3C F0 80 00 FA EF D2 92 D8 F6 A4 1D \r
+08 24 D2 43 A2 1D 7C 40 07 00 7D 40 07 00 80 00 \r
+46 DF 32 C2 03 43 FF 3F B0 13 F4 E1 7C 40 0A 00 \r
+5D 42 DC F6 B0 13 46 DF F2 90 03 00 78 1D 02 20 \r
+80 00 B4 EB 10 01 3F 40 3E 00 0E 42 32 C2 03 43 \r
+B0 13 BE E6 02 4E C2 93 9B 1D 03 20 1F 83 3F 93 \r
+F4 23 10 01 CF 0C 82 4F 54 03 92 C3 44 03 B0 13 \r
+C2 EE 2F 83 0F 8C 3F 90 00 80 02 28 92 D3 44 03 \r
+10 01 CF 0D 7C 90 2A 00 0A 2C 4E 4C 5D 4E FE F5 \r
+4C 4C 5C 02 1C 4C 8E 1C CE 0D 80 00 BC CD 10 01 \r
+0C 9D 02 2C 80 00 60 ED 0C 5E 0D 5E 0E 93 06 24 \r
+1D 83 1C 83 EC 4D 00 00 1E 83 FA 23 10 01 CD 0C \r
+C2 93 88 1E 02 24 4C 43 10 01 3C 40 84 1E 2E 42 \r
+B0 13 60 ED D2 43 88 1E 5C 43 10 01 D2 93 E0 1E \r
+0A 20 D2 92 E3 1E 31 1E 06 20 D2 92 E2 1E 30 1E \r
+02 20 E2 43 E0 1E 10 01 5C 43 B0 13 D2 CE 6C 43 \r
+B0 13 D2 CE 5C 43 6D 42 80 13 0E 1E 6C 43 6D 42 \r
+20 00 12 1E 3C B0 00 80 0D 7D 3D E3 3E 40 3D 00 \r
+0F 43 B0 13 46 E7 3E 40 C8 00 0F 43 80 00 CC D9 \r
+3C B0 00 80 0D 7D 3D E3 3E 40 52 00 0F 43 B0 13 \r
+46 E7 3E 40 19 00 0F 43 80 00 CC D9 B0 13 8A EE \r
+4C 93 08 20 4C 43 4D 43 B0 13 02 E9 5C 43 5D 43 \r
+80 00 02 E9 4C 43 FB 3F 3C 40 00 1C 0D 43 3E 40 \r
+46 00 B0 13 72 ED 3C 40 46 1C 0D 43 3E 40 46 00 \r
+80 00 72 ED 0A 14 CF 0C CC 0D 2A 43 0F 93 05 20 \r
+B0 13 3E E9 4C 93 01 24 0A 43 CC 0A 0A 16 10 01 \r
+21 82 CF 0C CC 0D A1 4F 00 00 91 4F 02 00 02 00 \r
+CD 01 2E 42 B0 13 20 E9 21 52 10 01 C2 93 76 1D \r
+0A 24 B0 13 F0 EF F2 F0 BF 00 1B 02 F2 F0 BF 00 \r
+1D 02 82 43 24 1E 10 01 1F 42 44 1E 5C 4F 11 00 \r
+6C 93 02 2C 3C 42 10 01 5C 53 4C 5C 4C 5C 4C 4C \r
+10 01 7C 90 03 00 07 2C 4C 4C 5D 4C E0 F6 7C 40 \r
+3E 00 80 00 46 DF 32 C2 03 43 FF 3F 0C 93 0A 24 \r
+5C 0F 1C 53 0F 42 32 C2 03 43 B0 13 BE E6 02 4F \r
+1C 83 F8 23 10 01 B0 13 9E EB 7C F0 0F 00 5C 53 \r
+4E 4C 1C 42 A0 1D B0 13 8C EA 1E 83 FA 23 10 01 \r
+B2 90 06 00 0E 07 08 20 92 42 20 07 E8 1E D2 43 \r
+EA 1E B1 C0 D0 00 00 00 00 13 B2 F0 EF FF 46 03 \r
+C2 43 34 1E 7C 40 14 00 4D 43 B0 13 02 E9 5D 43 \r
+80 00 10 A0 6D 42 B0 13 7C EE 4F 43 C2 93 06 1E \r
+01 20 5F 43 C2 4F 06 1E 5D 43 80 00 7C EE 1C 42 \r
+D2 1E CF 0C 5F 0A 0C 5F 3D 40 05 00 B0 13 78 E2 \r
+3C 50 40 01 10 01 4C 93 06 24 7C 90 0D 00 06 28 \r
+7C 80 0C 00 10 01 3F 40 0C 00 4C 5F 10 01 3D 40 \r
+FF 00 3E 40 0C 00 3F 40 20 0A 1F 53 CF 4D FF FF \r
+1E 83 FB 23 10 01 5D 42 92 1E B0 13 D8 E0 4C 93 \r
+02 24 0C 43 10 01 B0 13 CE EE 1C 43 10 01 F2 40 \r
+06 00 E2 1E F2 40 1E 00 E3 1E F2 40 0A 00 E1 1E \r
+C2 43 E0 1E 10 01 D2 53 5E 1E F2 90 03 00 5E 1E \r
+02 28 C2 43 5E 1E 82 43 5C 1E 80 00 4C E3 5C 42 \r
+9A 1D 3D 40 6D 00 B0 13 38 EC 7C 50 43 00 C2 4C \r
+9A 1D 10 01 B2 F0 FF FD 32 0F 7C 40 34 00 B0 13 \r
+D8 C6 B2 D0 00 02 36 0F 10 01 0F 42 32 C2 03 43 \r
+7C D0 C0 00 C2 4C 13 0F 5C 42 22 0F 02 4F 10 01 \r
+B2 D0 10 00 08 1E 00 18 F2 40 74 D3 BC 1E 3C 40 \r
+99 19 80 00 F8 E2 0E 93 08 20 2D 93 06 2C 5D 06 \r
+3D 50 C4 F6 6E 43 80 00 70 AF 10 01 0E 93 08 20 \r
+2D 93 06 2C 5D 06 3D 50 CC F6 6E 43 80 00 70 AF \r
+10 01 0E 43 0F 4C 1C 43 5F 02 0E 6E 0E 9D 01 28 \r
+0E 8D 0C 6C F9 2B 10 01 02 12 32 C2 03 43 82 4C \r
+C0 04 82 4D C8 04 1C 42 CA 04 32 41 10 01 B2 B2 \r
+76 1E 07 24 C2 93 34 1E 02 20 80 00 68 E7 80 00 \r
+DA EA 10 01 B2 40 FF 7F 52 03 B2 D0 10 00 42 03 \r
+B2 D0 24 01 40 03 10 01 5F 42 A4 1E 5F 83 D2 83 \r
+A4 1E 0F 93 02 20 80 00 6A E8 10 01 3E 40 0C 00 \r
+3F 40 20 0A 1F 53 CF 43 FF FF 1E 83 FB 23 10 01 \r
+5D 93 07 20 7C 40 5A 00 3D 40 30 F5 5E 43 80 00 \r
+70 AF 10 01 5D 93 07 20 7C 40 5A 00 3D 40 38 F5 \r
+5E 43 80 00 70 AF 10 01 5D 93 07 20 7C 40 5A 00 \r
+3D 40 28 F5 5E 43 80 00 70 AF 10 01 3C 80 05 00 \r
+05 24 3C 80 05 00 02 24 4C 43 10 01 5C 43 10 01 \r
+4C 43 D2 93 34 1E 05 20 B2 90 F8 F2 E4 1E 01 20 \r
+5C 43 10 01 B2 40 D9 07 CE 1E F2 42 CC 1E D2 43 \r
+CB 1E C2 43 CA 1E 10 01 1F 42 50 03 82 4F C8 1E \r
+1F 92 50 03 F9 23 80 00 00 CD CF 0C 5F 06 0C 5F \r
+3C 80 40 06 3D 40 09 00 80 00 78 E2 4C 43 D2 93 \r
+58 1E 04 20 82 93 60 1E 01 24 5C 43 10 01 4C 43 \r
+92 93 18 1E 04 20 82 93 24 1E 01 24 5C 43 10 01 \r
+CF 0C 0E 93 05 24 1F 53 FF 4D FF FF 1E 83 FB 23 \r
+10 01 0E 93 06 24 4D 4D 1C 53 CC 4D FF FF 1E 83 \r
+FB 23 10 01 C2 93 88 1E 03 24 3C 40 84 1E 10 01 \r
+3C 40 BA F6 10 01 0D 93 02 20 0C 93 04 24 82 4C \r
+8A 1E 82 4D 8C 1E 10 01 0D 93 02 20 0C 93 04 24 \r
+82 4C 6C 1E 82 4D 6E 1E 10 01 B0 13 12 E0 B2 F0 \r
+EF FF 32 0F B2 D0 10 00 36 0F 10 01 82 43 9C 1E \r
+F2 40 0F 00 9E 1E B2 40 2C 01 A0 1E 10 01 A2 43 \r
+9A 1E 92 C3 44 03 B2 D0 10 00 44 03 10 01 A2 D2 \r
+80 03 82 43 80 03 B2 D0 00 02 80 03 10 01 CE 0C \r
+3C 40 E8 03 B0 13 8C EA 1E 83 FA 23 10 01 82 43 \r
+32 0F 82 43 36 0F B0 13 12 E0 80 00 3E EE 3E F0 \r
+1F 00 04 24 5C 02 0D 6D 1E 83 FC 23 10 01 3E F0 \r
+1F 00 04 24 5D 03 5C 00 1E 83 FC 23 10 01 7C 40 \r
+36 00 B0 13 06 BD 7C 40 39 00 80 00 06 BD 4F 43 \r
+C2 93 CA 1E 01 20 5F 43 C2 4F CA 1E 10 01 4F 43 \r
+C2 93 2F 1E 01 20 5F 43 C2 4F 2F 1E 10 01 4F 43 \r
+7C B0 80 FF 01 20 5F 43 CC 0F 10 01 C2 93 06 1E \r
+02 20 80 00 3C D1 80 00 B8 AD 4F 43 7C 90 0C 00 \r
+01 2C 5F 43 CC 0F 10 01 B0 13 DA EA B0 13 4A E8 \r
+5D 43 80 00 10 A0 D2 43 5E 1E 82 43 60 1E C2 43 \r
+58 1E 10 01 B2 F0 1F FF 04 0A 4C 4C 82 DC 04 0A \r
+10 01 1C 42 50 03 1C 92 50 03 FB 23 10 01 C2 93 \r
+9C 1D 02 24 D2 43 9B 1D 10 01 3D 40 79 1D 3E 40 \r
+21 00 80 00 60 ED B2 F0 DF FF 40 03 82 43 50 03 \r
+10 01 5C 43 B0 13 D2 CE 6C 43 80 00 D2 CE B0 13 \r
+4C E3 B2 D0 00 04 8C 1C 10 01 DC 93 0C 00 02 20 \r
+80 00 84 D8 10 01 B0 13 54 F0 B2 40 2B 5A 5C 01 \r
+10 01 4C 43 A2 93 EE 1D 01 20 5C 43 10 01 4C 43 \r
+92 93 EE 1D 01 20 5C 43 10 01 4C 43 82 93 EA 1C \r
+01 24 5C 43 10 01 4C 43 92 93 D0 1E 01 20 5C 43 \r
+10 01 CF 0C CC 0D CD 0F 2E 42 80 00 20 E9 CD 0C \r
+3C 40 80 1E 2E 42 80 00 60 ED 7C 40 03 00 7D 40 \r
+0B 00 80 00 36 D0 5C 93 02 20 CC 0D 10 01 CC 0E \r
+10 01 1C 42 8C 1C 49 19 0C 10 5C F3 10 01 1C 42 \r
+8C 1C 48 19 0C 10 5C F3 10 01 1C 42 8C 1C 46 19 \r
+0C 10 5C F3 10 01 1C 42 8C 1C 44 19 0C 10 5C F3 \r
+10 01 1C 42 8C 1C 45 19 0C 10 5C F3 10 01 1C 42 \r
+44 03 7C F0 10 00 10 01 B2 F0 EF FF 44 03 80 00 \r
+AE DF B2 F0 EF FF 08 1E 80 00 3C F0 B0 13 9E EB \r
+C2 4C EE 1E 10 01 B0 13 9E EB C2 4C 17 1E 10 01 \r
+7C 40 03 00 4D 43 80 00 36 D0 C2 43 A4 1E C2 43 \r
+AA 1E 10 01 82 43 EA 1C E2 42 16 1D 10 01 82 43 \r
+D0 1E 4C 43 80 00 9C BD 1C 42 8C 1C 8C 10 5C F3 \r
+10 01 1C 42 8C 1C 5C 0F 5C F3 10 01 5C 42 C6 1E \r
+8C 11 10 01 4C 5C C2 4C 49 1E 10 01 B2 F0 EF FF \r
+48 03 10 01 B2 D0 20 00 40 03 10 01 D2 43 E0 1E \r
+80 00 6A E8 32 D0 D8 00 03 43 10 01 5C 42 DC 1E \r
+10 01 C2 4C 48 1E 10 01 C2 4C 4A 1E 10 01 4D 43 \r
+80 00 06 C9 92 D3 44 03 10 01 92 C3 44 03 10 01 \r
+5C 42 78 1D 10 01 A2 D2 06 0A 10 01 82 43 76 1E \r
+10 01 CC 43 00 00 10 01 3C 40 D8 F6 10 01 92 D3 \r
+04 0A 10 01 92 C3 04 0A 10 01 80 00 86 98 1C 43 \r
+10 01 03 43 FF 3F 2C 43 10 01 2C 43 10 01 4C 43 \r
+10 01 6C 43 10 01 0C 43 10 01 0C 43 10 01 03 43 \r
+10 01 10 01 10 01 10 01 30 30 30 30 30 31 30 30 \r
+32 30 30 33 30 30 34 30 30 35 30 30 36 30 30 37 \r
+30 30 38 30 30 39 30 31 30 30 31 31 30 31 32 30 \r
+31 33 30 31 34 30 31 35 30 31 36 30 31 37 30 31 \r
+38 30 31 39 30 32 30 30 32 31 30 32 32 30 32 33 \r
+30 32 34 30 32 35 30 32 36 30 32 37 30 32 38 30 \r
+32 39 30 33 30 30 33 31 30 33 32 30 33 33 30 33 \r
+34 30 33 35 30 33 36 30 33 37 30 33 38 30 33 39 \r
+30 34 30 30 34 31 30 34 32 30 34 33 30 34 34 30 \r
+34 35 30 34 36 30 34 37 30 34 38 30 34 39 30 35 \r
+30 30 35 31 30 35 32 30 35 33 30 35 34 30 35 35 \r
+30 35 36 30 35 37 30 35 38 30 35 39 30 36 30 30 \r
+36 31 30 36 32 30 36 33 30 36 34 30 36 35 30 36 \r
+36 30 36 37 30 36 38 30 36 39 30 37 30 30 37 31 \r
+30 37 32 30 37 33 30 37 34 30 37 35 30 37 36 30 \r
+37 37 30 37 38 30 37 39 30 38 30 30 38 31 30 38 \r
+32 30 38 33 30 38 34 30 38 35 30 38 36 30 38 37 \r
+30 38 38 30 38 39 30 39 30 30 39 31 30 39 32 30 \r
+39 33 30 39 34 30 39 35 30 39 36 30 39 37 30 39 \r
+38 30 39 39 31 30 30 31 30 31 31 30 32 31 30 33 \r
+31 30 34 31 30 35 31 30 36 31 30 37 31 30 38 31 \r
+30 39 31 31 30 31 31 31 31 31 32 31 31 33 31 31 \r
+34 31 31 35 31 31 36 31 31 37 31 31 38 31 31 39 \r
+31 32 30 31 32 31 31 32 32 31 32 33 31 32 34 31 \r
+32 35 31 32 36 31 32 37 31 32 38 31 32 39 31 33 \r
+30 31 33 31 31 33 32 31 33 33 31 33 34 31 33 35 \r
+31 33 36 31 33 37 31 33 38 31 33 39 31 34 30 31 \r
+34 31 31 34 32 31 34 33 31 34 34 31 34 35 31 34 \r
+36 31 34 37 31 34 38 31 34 39 31 35 30 31 35 31 \r
+31 35 32 31 35 33 31 35 34 31 35 35 31 35 36 31 \r
+35 37 31 35 38 31 35 39 31 36 30 31 36 31 31 36 \r
+32 31 36 33 31 36 34 31 36 35 31 36 36 31 36 37 \r
+31 36 38 31 36 39 31 37 30 31 37 31 31 37 32 31 \r
+37 33 31 37 34 31 37 35 31 37 36 31 37 37 31 37 \r
+38 31 37 39 31 38 30 00 4E EC 00 00 98 EE 00 00 \r
+10 A0 00 00 A6 EF 00 00 9A F3 5E EE 00 00 D4 8B \r
+00 00 26 97 00 00 22 F0 00 00 1C F3 76 E0 00 00 \r
+58 A3 00 00 38 B4 00 00 8E EF 00 00 2E F3 D4 F0 \r
+00 00 5C A4 00 00 10 AB 00 00 B2 EF 00 00 40 F3 \r
+D6 F0 00 00 24 AA 00 00 38 A9 00 00 22 F0 00 00 \r
+52 F3 5E A5 00 00 8C F0 00 00 72 CB 00 00 22 F0 \r
+00 00 64 F3 D4 F0 00 00 D4 F0 00 00 DA AC 00 00 \r
+22 F0 00 00 76 F3 86 EB 00 00 D4 F0 00 00 AE 9D \r
+00 00 82 EF 00 00 0A F3 4E EE 00 00 D8 8F 00 00 \r
+E2 B1 00 00 18 F0 00 00 F8 F2 D4 F0 00 00 D4 F0 \r
+00 00 5E CD 00 00 9A EF 00 00 AC F3 6A E4 00 00 \r
+D4 F0 00 00 B4 EC 00 00 22 F0 00 00 BE F3 42 E4 \r
+00 00 D4 F0 00 00 A0 EC 00 00 22 F0 00 00 D0 F3 \r
+9C E5 00 00 D4 F0 00 00 C8 EC 00 00 22 F0 00 00 \r
+E2 F3 F4 EA 00 00 CA 91 00 00 7C EE 00 00 22 F0 \r
+00 00 F4 F3 90 D1 00 00 D4 F0 00 00 76 E3 00 00 \r
+22 F0 00 00 88 F3 01 80 40 20 10 08 84 42 21 90 \r
+48 A4 52 29 14 0A 85 C2 61 B0 58 AC D6 6B 35 9A \r
+CD 66 33 99 4C A6 53 A9 54 2A 95 CA E5 F2 79 3C \r
+9E CF 67 B3 D9 6C B6 5B 2D 16 0B 05 82 41 A0 50 \r
+28 94 4A A5 D2 69 34 1A 8D 46 23 91 C8 E4 72 39 \r
+1C 8E C7 E3 F1 F8 FC FE FF 7F 3F 1F 0F 07 83 C1 \r
+E0 70 38 9C CE E7 F3 F9 7C BE DF 6F 37 9B 4D 26 \r
+13 89 44 22 11 88 C4 62 31 98 CC E6 73 B9 5C AE \r
+D7 EB 75 BA DD 6E B7 DB 6D 36 1B 0D 06 03 81 C0 \r
+60 30 18 8C C6 63 B1 D8 EC F6 7B 3D 1E 8F 47 A3 \r
+D1 E8 F4 7A BD 5E AF 57 AB 55 AA D5 EA F5 FA FD \r
+7E BF 5F 2F 17 8B 45 A2 51 A8 D4 6A B5 DA ED 76 \r
+3B 1D 0E 87 C3 E1 F0 78 BC DE EF 77 BB 5D 2E 97 \r
+CB 65 B2 59 2C 96 4B 25 92 49 24 12 09 04 02 01 \r
+80 40 20 10 08 84 42 21 90 48 A4 52 29 14 0A 85 \r
+C2 61 B0 58 AC D6 6B 35 9A CD 66 33 99 4C A6 53 \r
+A9 54 2A 95 CA E5 45 52 52 00 20 20 44 4F 4E 45 \r
+00 00 30 30 30 30 30 30 30 00 20 43 4F 4E 46 00 \r
+20 52 46 42 53 4C 00 00 20 20 53 59 4E 43 00 00 \r
+20 20 20 50 50 54 00 00 20 20 20 41 43 43 00 00 \r
+2D 2D 2D 00 30 30 30 30 30 30 30 30 00 00 4C 42 \r
+00 00 4B 47 00 00 20 52 41 4D 00 00 30 34 33 30 \r
+00 00 43 43 34 33 30 00 20 4F 46 46 00 00 20 20 \r
+4F 4E 00 00 4C 4F 42 41 54 54 00 00 20 20 4F 50 \r
+45 4E 00 00 20 20 4C 4F 3F 54 00 00 2D 2D 2D 2D \r
+00 00 02 1B 01 1E 17 3C 18 10 06 1E 08 05 03 47 \r
+0B 08 0C 00 0D 10 0E B0 0F 71 10 7B 11 83 12 13 \r
+13 22 14 F8 15 42 19 1D 1A 1C 1B C7 1C 00 1D B2 \r
+21 B6 22 10 23 EA 24 2A 25 00 26 1F 2C 81 2D 35 \r
+2E 09 F5 60 B6 F2 63 D3 D7 70 F7 F3 00 00 00 00 \r
+00 86 00 77 C7 95 E6 97 17 F3 67 05 F0 87 85 75 \r
+46 C6 37 F5 06 D3 87 C4 C4 02 67 E3 B6 00 03 01 \r
+04 08 10 80 80 80 80 20 40 02 01 80 04 02 10 20 \r
+40 08 08 80 08 08 08 08 F7 F7 F7 F7 20 40 04 80 \r
+7F 7F 7F 7F 7F 10 01 80 2F 1E 1B 07 37 B2 0A 04 \r
+00 00 00 0C 00 10 AA 56 4D 3B 15 11 F8 57 07 0C \r
+10 1D 1C C7 10 B0 FF FF F9 B6 10 EA 2A 00 1F 00 \r
+67 FF 00 00 6F 00 1C 02 DD 03 B1 05 9D 07 A2 09 \r
+C4 0B 07 0E 6E 10 01 13 C6 15 C8 18 11 1C B5 1F \r
+CC 23 07 04 F5 03 E8 03 B6 03 84 03 52 03 20 03 \r
+EE 02 BC 02 8A 02 58 02 26 02 F4 01 C2 01 90 01 \r
+5E 01 2C 01 52 E6 00 00 24 E7 00 00 56 EB 00 00 \r
+CA F0 00 00 C6 F0 00 00 3E DE 00 00 12 00 24 00 \r
+47 00 8F 00 1E 01 3B 02 76 04 79 56 34 12 02 01 \r
+01 01 00 00 32 34 48 00 31 32 48 00 4D 41 4C 45 \r
+46 45 4D 41 D2 1D D2 1D FF FF FF FF 00 32 50 6E \r
+0F 27 8D 00 02 00 00 \r
+@f6e8\r
+01 00 C2 1E 00 00 01 00 7E 1E 00 00 01 00 7F 1E \r
+0A 00 54 00 8E 1C 20 0A 20 0A 20 0A 20 0A 24 0A \r
+2A 0A 29 0A 27 0A 26 0A 24 0A 24 0A 26 0A 26 0A \r
+24 0A 26 0A 24 0A 26 0A 26 0A 26 0A 21 0A 22 0A \r
+20 0A 23 0A 24 0A 25 0A 26 0A 21 0A 22 0A 23 0A \r
+25 0A 20 0A 20 0A 24 0A 2B 0A 2B 0A 2A 0A 29 0A \r
+28 0A 27 0A 20 0A 24 0A 28 0A 02 00 E4 1E 00 00 \r
+01 00 41 1E 00 00 01 00 31 1D 00 00 02 00 E6 1E \r
+00 00 01 00 D1 1D 00 00 01 00 78 1D 00 00 01 00 \r
+9A 1D 00 00 01 00 9B 1D 00 00 01 00 9C 1D 00 00 \r
+02 00 9E 1D 00 00 02 00 A0 1D 00 00 01 00 A2 1D \r
+00 00 01 00 A4 1D FF 00 04 00 A8 1D 00 00 00 00 \r
+04 00 AC 1D 00 00 00 00 04 00 B0 1D 00 00 00 00 \r
+01 00 88 1E 00 00 01 00 62 1E 00 00 02 00 64 1E \r
+00 00 01 00 66 1E 00 00 04 00 68 1E 00 00 00 00 \r
+01 00 B4 1D 01 00 01 00 17 1E 00 00 02 00 EC 1E \r
+00 00 01 00 EE 1E 00 00 04 00 6C 1E 00 00 00 00 \r
+01 00 70 1E 00 00 01 00 74 1E 00 00 01 00 75 1E \r
+00 00 04 00 8A 1E 00 00 00 00 04 00 8E 1E 00 00 \r
+00 00 01 00 92 1E 00 00 01 00 48 1E 00 00 01 00 \r
+49 1E 00 00 01 00 4A 1E 00 00 01 00 4B 1E 00 00 \r
+02 00 94 1E 00 00 02 00 96 1E 00 00 01 00 98 1E \r
+00 00 01 00 99 1E 00 00 01 00 C6 1E 00 00 02 00 \r
+C8 1E 00 00 02 00 D8 1E 00 00 01 00 DA 1E 00 00 \r
+00 00 \r
+@ffe0\r
+DE 8D \r
+@ffea\r
+60 DD 02 C2 1E 85 C0 EA \r
+@fffe\r
+22 E3 \r
+q\r
diff --git a/chronos-ti/Recovery/Chronos Watch/Applications/Recovery_ez430_chronos_868MHz.txt b/chronos-ti/Recovery/Chronos Watch/Applications/Recovery_ez430_chronos_868MHz.txt
new file mode 100755 (executable)
index 0000000..ece2264
--- /dev/null
@@ -0,0 +1,1937 @@
+@8000\r
+5A 14 31 80 1A 00 CA 0E B0 13 44 E0 0E 43 3F 40 \r
+C8 42 B0 13 C6 BE 81 4C 12 00 81 4D 14 00 CC 0A \r
+B0 13 9A E6 0E 43 3F 40 20 41 B0 13 C6 BE 81 4C \r
+16 00 81 4D 18 00 36 40 11 00 37 40 32 1D 0A 43 \r
+28 47 19 47 02 00 CC 08 CD 09 1E 41 12 00 1F 41 \r
+14 00 B0 13 A4 D4 0C 93 0A 38 81 48 08 00 81 49 \r
+0A 00 27 52 1A 53 16 83 EB 23 4A 4A 03 3C 4A 4A \r
+0A 93 7E 24 3A 90 0F 00 3D 38 3A 90 0F 00 23 24 \r
+B0 13 86 82 1E 42 72 1D 1F 42 74 1D B0 13 E0 9E \r
+C9 0C CA 0D 1C 42 72 1D 1D 42 74 1D 1E 42 6E 1D \r
+1F 42 70 1D B0 13 3A 82 1C 42 70 F6 1C 82 6E F6 \r
+B0 13 4C 82 1C 42 70 F6 B0 13 60 82 81 4C 00 00 \r
+81 4D 02 00 73 3C B0 13 24 82 C9 0C CA 0D 1C 42 \r
+6E 1D 1D 42 70 1D 1E 41 08 00 1F 41 0A 00 B0 13 \r
+3A 82 1C 42 6E F6 1C 82 6C F6 B0 13 4C 82 1C 42 \r
+6C F6 E2 3F C9 0A 59 02 16 49 4E F6 5A 06 17 4A \r
+32 1D 18 4A 34 1D B0 13 24 82 C5 0C CA 0D B0 13 \r
+86 82 CE 07 CF 08 B0 13 E0 9E 3E 40 34 80 3F 40 \r
+37 3A B0 13 10 82 CC 05 CD 0A B0 13 3A B7 C5 0C \r
+CA 0D CC 07 CD 08 1E 41 08 00 1F 41 0A 00 B0 13 \r
+90 82 CC 05 CD 0A B0 13 C6 BE C8 0C CA 0D 1C 49 \r
+50 F6 0C 86 B0 13 74 DE CE 0C CF 0D CC 08 CD 0A \r
+B0 13 3A B7 C9 0C CA 0D CC 06 B0 13 60 82 A6 3F \r
+B0 13 86 82 1E 42 32 1D 1F 42 34 1D B0 13 E0 9E \r
+C9 0C CA 0D 1C 42 36 1D 1D 42 38 1D 1E 42 32 1D \r
+1F 42 34 1D B0 13 3A 82 1C 42 52 F6 1C 82 50 F6 \r
+B0 13 56 82 81 4C 00 00 81 4D 02 00 2C 41 1D 41 \r
+02 00 B0 13 6A 82 3E 40 F4 FD 3F 40 D4 3B B0 13 \r
+10 82 1C 41 16 00 1D 41 18 00 B0 13 C6 BE 81 4C \r
+04 00 81 4D 06 00 1C 41 04 00 1D 41 06 00 B0 13 \r
+6A 82 2E 41 1F 41 02 00 B0 13 3A B7 81 4C 0C 00 \r
+81 4D 0E 00 1C 41 0C 00 1D 41 0E 00 B0 13 72 D7 \r
+81 4C 10 00 1C 41 10 00 31 50 1A 00 55 16 10 01 \r
+B0 13 3A B7 CE 0C CF 0D 0C 43 3D 40 80 3F B0 13 \r
+90 82 10 01 1C 41 16 00 1D 41 18 00 1E 41 0C 00 \r
+1F 41 0E 00 B0 13 E0 9E 10 01 B0 13 90 82 CC 09 \r
+CD 0A B0 13 C6 BE C9 0C CA 0D 10 01 B0 13 56 82 \r
+C9 0C CA 0D 10 01 B0 13 78 82 B0 13 3A B7 10 01 \r
+B0 13 78 82 B0 13 E6 9E 10 01 3E 40 E7 6F 3F 40 \r
+63 3B B0 13 3A B7 10 01 B0 13 74 DE CE 0C CF 0D \r
+CC 09 CD 0A 10 01 1C 41 16 00 1D 41 18 00 10 01 \r
+B0 13 E0 9E CE 0C CF 0D 10 01 4A 14 31 82 B0 13 \r
+C2 EE C8 0C CF 08 3F 50 FF 7F 81 4F 06 00 91 41 \r
+06 00 04 00 82 43 46 1E 4A 43 49 43 4C 49 B0 13 \r
+0C 85 1F 4C 18 00 1F 83 1D 24 1F 83 14 24 D2 B3 \r
+D6 1E 47 24 1E 42 4E 1E 1F 42 50 1E 3E F3 3F F0 \r
+FF 00 1F 9C 02 00 3D 20 2E 9C 3B 20 D2 C3 D6 1E \r
+82 43 46 1E 36 3C 5A 53 B0 13 DA D2 4C 93 31 24 \r
+C7 09 2F 3C B0 13 58 EA C6 0C CC 09 B0 13 C8 D8 \r
+4C 93 0C 20 CC 09 CD 06 CE 08 B0 13 4C A2 1F 42 \r
+44 1E AF 93 18 00 09 20 5A 53 07 3C 82 43 46 1E \r
+E2 B2 D6 1E 02 20 B0 13 12 DF 1F 42 44 1E 9F 93 \r
+18 00 0F 20 CF 01 3F 50 03 00 81 4F 00 00 CC 06 \r
+CD 01 3D 50 06 00 CE 01 2E 52 CF 01 2F 53 B0 13 \r
+E4 D1 59 53 AB 27 4A 93 50 24 92 93 46 1E 18 38 \r
+4C 47 B0 13 0C 85 CC 07 B0 13 84 B6 4C 93 10 24 \r
+5A 83 CF 01 3F 50 03 00 81 4F 00 00 7C 42 CD 01 \r
+3D 50 06 00 CE 01 2E 52 CF 01 2F 53 B0 13 E4 D1 \r
+4A 93 33 24 1F 42 42 1E 0F 88 1F 93 2C 34 E2 B2 \r
+D6 1E 0D 20 E2 D2 D6 1E C2 93 4B 1E 04 20 B2 50 \r
+E0 7F 42 1E 20 3C B2 50 C0 53 42 1E 1C 3C E2 C2 \r
+D6 1E C2 93 4B 1E 03 24 3F 40 40 6C 02 3C 3F 40 \r
+20 00 82 5F 42 1E 49 43 4C 49 B0 13 0C 85 AC 93 \r
+18 00 07 20 CC 09 B0 13 CE E2 4C 93 02 20 5A 83 \r
+04 24 59 53 F1 27 4A 93 0E 20 F2 F0 F9 00 D6 1E \r
+91 91 06 00 04 00 02 24 0E 43 08 3C B0 13 C8 EF \r
+A2 43 9A 1E 70 3C E2 D3 D6 1E 1E 43 1F 41 06 00 \r
+0F 88 0F 93 54 38 0E 93 3C 24 E2 B2 D6 1E 16 20 \r
+1F 41 06 00 1F 82 42 1E 3F 80 42 00 0F 93 31 38 \r
+F2 40 07 00 98 1E C2 43 99 1E F2 D0 18 00 D6 1E \r
+92 42 42 1E 94 1E A2 43 9A 1E 4B 3C 1F 41 06 00 \r
+0F 88 3F 80 42 00 1F 93 1C 38 F2 40 07 00 98 1E \r
+C2 43 99 1E F2 D0 18 00 D6 1E 1F 41 06 00 1F 82 \r
+42 1E 3F 80 42 00 0F 93 05 34 1F 41 06 00 3F 80 \r
+42 00 02 3C 1F 42 42 1E 82 4F 94 1E 92 43 9A 1E \r
+28 3C D2 41 02 00 98 1E D2 41 03 00 99 1E 5F 42 \r
+D6 1E 7F C2 7F D0 10 00 C2 4F D6 1E 92 41 06 00 \r
+94 1E 92 41 04 00 96 1E 82 43 9A 1E 12 3C D2 91 \r
+02 00 98 1E 09 24 D2 41 02 00 98 1E D2 41 03 00 \r
+99 1E F2 D0 10 00 D6 1E 92 41 04 00 94 1E 92 43 \r
+9A 1E D2 C3 D6 1E 31 52 46 16 10 01 3D 40 1C 00 \r
+B0 13 38 EC 1C 52 D4 F6 82 4C 44 1E 10 01 4F 14 \r
+B2 F0 EF FF 42 03 92 C3 42 03 B2 80 00 80 52 03 \r
+B2 D0 10 00 42 03 B0 13 76 CE B2 D0 10 00 8C 1C \r
+B0 13 3A EF 4C 93 EE 20 B0 13 2E EF 4C 93 EA 20 \r
+E2 93 2E 1E 04 28 A2 D3 0A 1E B0 13 5C E9 E2 93 \r
+E0 1E 11 20 5E 42 E1 1E CF 0E 5F 83 C2 4F E1 1E \r
+4E 93 06 20 F2 40 0A 00 E1 1E B0 13 4C F0 03 3C \r
+B2 D0 10 00 0A 1E B0 13 46 EF 4C 93 02 24 92 D3 \r
+0A 1E B0 13 4E ED 4C 93 0D 24 92 83 24 1E 04 20 \r
+B0 13 3C EA B0 13 62 87 F2 B0 40 00 01 02 02 24 \r
+A2 D2 0A 1E B0 13 3C ED 4C 93 12 24 92 83 60 1E \r
+09 20 B0 13 E0 DF B0 13 62 87 7C 40 1F 00 4D 43 \r
+B0 13 02 E9 F2 B0 20 00 01 02 02 24 B2 D2 0A 1E \r
+B0 13 22 EF 4C 93 02 24 B0 13 32 BE B2 B0 20 00 \r
+08 1E 10 24 5E 42 9E 1E CF 0E 5F 83 C2 4F 9E 1E \r
+4E 93 08 20 92 D3 0C 1E B2 D0 20 00 0C 1E F2 40 \r
+0F 00 9E 1E 82 93 0C 1E 0F 24 92 B3 0C 1E 08 20 \r
+A2 B2 0C 1E 09 24 A2 C2 0C 1E 92 D3 8C 1C 04 3C \r
+92 C3 0C 1E A2 D3 0C 1E A2 B3 08 1E 0E 24 1F 42 \r
+26 1E 1E 42 28 1E 1F 82 2A 1E 1E 72 2C 1E 03 20 \r
+3F 90 1F 00 02 28 92 D3 08 1E D2 93 7B 1E 0E 20 \r
+E2 92 7A 1E 03 2C D2 53 7A 1E 08 3C F2 C2 03 02 \r
+F2 C2 05 02 C2 43 7A 1E C2 43 7B 1E E2 B3 01 02 \r
+03 24 D2 B3 01 02 2F 20 C2 43 C2 1E E2 B2 01 02 \r
+11 24 D2 53 78 1E F2 90 03 00 78 1E 0D 28 B2 D0 \r
+20 00 76 1E B2 F0 7F FF 76 1E C2 43 78 1E E2 C2 \r
+19 02 02 3C C2 43 78 1E E2 B3 01 02 11 24 D2 53 \r
+79 1E F2 90 03 00 79 1E 47 28 B2 D0 40 00 76 1E \r
+B2 F0 FF FE 76 1E C2 43 79 1E E2 C3 19 02 3C 3C \r
+C2 43 79 1E 39 3C D2 53 C2 1E 5F 42 C2 1E 5F 83 \r
+7F 90 03 00 31 28 1F 42 08 1E 2F C2 2E 42 1E C2 \r
+08 1E 0E DF 82 4E 08 1E 92 D3 0C 1E A2 B2 08 1E \r
+04 20 B2 D0 10 00 0C 1E 02 3C B2 D2 0C 1E C2 43 \r
+C2 1E 1A 3C 82 93 EC 1C 04 20 F2 D0 20 00 F0 1C \r
+02 3C 92 83 EC 1C B2 90 03 00 EA 1C 0D 20 C2 93 \r
+EE 1C 08 20 7C 40 5A 00 3D 40 28 F5 5E 43 B0 13 \r
+70 AF 02 3C D2 83 EE 1C B1 C0 D0 00 14 00 4B 16 \r
+00 13 7C 40 46 00 3D 40 8C F5 5E 43 B0 13 70 AF \r
+6C 43 4D 43 B0 13 02 E9 7C 40 03 00 4D 43 B0 13 \r
+02 E9 10 01 4A 14 B0 13 E6 EE 82 43 08 0A 7C 40 \r
+46 00 3D 40 5C F5 5E 43 B0 13 70 AF 7C 40 5B 00 \r
+3D 40 62 F5 5E 43 B0 13 70 AF 7C 40 1E 00 B0 13 \r
+AE 89 7C 40 13 00 B0 13 AE 89 7C 40 14 00 B0 13 \r
+AE 89 7C 40 15 00 B0 13 AE 89 7C 40 16 00 B0 13 \r
+AE 89 7C 40 17 00 B0 13 AE 89 7C 40 18 00 B0 13 \r
+AE 89 7C 40 19 00 B0 13 AE 89 6C 43 B0 13 AE 89 \r
+7C 40 03 00 B0 13 AE 89 4C 43 B0 13 AE 89 B2 40 \r
+80 5A 5C 01 32 D0 D8 00 03 43 B0 13 8C EC B0 13 \r
+44 F0 B0 13 A4 89 E2 B2 01 02 04 24 F2 B0 10 00 \r
+01 02 09 20 B0 13 A4 89 82 43 76 1E F2 C2 03 02 \r
+F2 C2 05 02 AE 3C 49 43 5A 43 4A 93 71 24 B0 13 \r
+8C EC 4A 43 4F 49 0F 93 5E 24 1F 83 49 24 1F 83 \r
+36 24 1F 83 10 24 1F 83 5F 20 A2 D2 76 1E B0 13 \r
+5E A5 B0 13 A4 89 B0 13 32 BE 5D 43 B0 13 72 CB \r
+B0 13 EE D4 51 3C B0 13 8A C3 28 42 06 43 07 43 \r
+3C 40 00 20 B0 13 A0 CC B0 13 4C E3 5C 42 59 1E \r
+CD 06 B0 13 96 89 7C 40 47 00 5E 43 B0 13 70 AF \r
+5C 42 5B 1E CD 07 B0 13 96 89 7C 40 5D 00 5E 43 \r
+B0 13 70 AF 18 83 E4 23 B0 13 E0 DF 2D 3C 5D 43 \r
+B0 13 10 AB 28 42 3C 40 00 20 B0 13 A0 CC 4C 43 \r
+B0 13 9C BD 6D 43 B0 13 10 AB 18 83 F4 23 1C 3C \r
+5D 43 B0 13 38 A9 28 43 F2 B0 40 00 01 02 FC 27 \r
+4C 43 B0 13 96 BA 6D 43 B0 13 38 A9 18 83 F4 23 \r
+B0 13 3C EA 09 3C B0 13 3E EB E2 B2 01 02 04 24 \r
+F2 B0 10 00 01 02 F9 23 3C 40 99 19 B0 13 A0 CC \r
+E2 B2 01 02 2D 20 E2 B3 01 02 27 20 F2 B0 10 00 \r
+01 02 1F 20 D2 B3 01 02 19 20 F2 B2 01 02 22 24 \r
+F2 B2 01 02 FD 23 92 C3 00 0A 82 43 08 0A 3C 40 \r
+00 40 B0 13 A0 CC B0 13 E6 EE B2 40 80 5A 5C 01 \r
+32 D0 F8 00 03 43 92 43 5C 01 0C 3C 69 42 5A 43 \r
+09 3C 79 40 03 00 5A 43 05 3C 69 43 5A 43 02 3C \r
+59 43 5A 43 B2 40 2B 5A 5C 01 32 D0 D8 00 03 43 \r
+54 3F 46 16 10 01 7E 40 03 00 4F 43 B0 13 FC B4 \r
+CD 0C 10 01 3C 40 CC 0C B0 13 A0 CC 10 01 5D 43 \r
+B0 13 02 E9 10 01 6A 14 31 80 10 00 C8 0F C5 0E \r
+81 4D 02 00 C7 0C 3F 01 3A 00 71 0F 08 00 5F 41 \r
+38 00 81 4F 04 00 16 41 36 00 91 41 32 00 0C 00 \r
+91 41 34 00 0E 00 19 41 30 00 82 43 76 1E B0 13 \r
+86 F0 B0 13 6A E8 5F 42 34 1E 81 4F 06 00 E2 43 \r
+34 1E 82 43 7C 1E B0 13 E0 EB 7C 40 60 00 B0 13 \r
+B4 EE 1A 43 54 43 B6 3C 0E 43 A2 B2 76 1E 01 24 \r
+1E 43 3F 40 10 00 0F F6 0E 93 23 24 3A B0 00 80 \r
+0E 7E 3E E3 87 5A 00 00 87 6E 02 00 1E 41 0E 00 \r
+1E 97 02 00 05 38 12 20 1E 41 0C 00 2E 97 0E 2C \r
+16 B3 03 24 CD 08 CE 09 04 3C 1D 41 0C 00 1E 41 \r
+0E 00 87 4D 00 00 87 4E 02 00 1A 43 A2 C2 76 1E \r
+54 43 B2 B2 76 1E 20 24 3A B0 00 80 0E 7E 3E E3 \r
+87 8A 00 00 87 7E 02 00 87 99 02 00 04 38 11 20 \r
+87 98 00 00 0E 2C 16 B3 05 24 1D 41 0C 00 1E 41 \r
+0E 00 02 3C CD 08 CE 09 87 4D 00 00 87 4E 02 00 \r
+1A 43 B2 C2 76 1E 54 43 0F 93 35 24 3E 40 1E 00 \r
+1E 52 7C 1E 18 24 3E 80 0A 00 18 24 3E 80 0A 00 \r
+18 24 3E 80 0A 00 26 24 3E 80 0A 00 12 24 3E 80 \r
+0A 00 0C 24 3E 80 0A 00 06 24 1A 93 1C 24 4F 43 \r
+5F 93 09 24 18 3C 3A 40 E8 03 05 3C 3A 40 64 00 \r
+02 3C 3A 40 0A 00 2C 47 1D 47 02 00 3A B0 00 80 \r
+0F 7F 3F E3 CE 0A B0 13 CC D9 87 8E 00 00 87 7F \r
+02 00 01 3C 1A 43 44 93 2B 24 26 B2 1C 24 87 93 \r
+02 00 11 34 6C 43 4D 43 B0 13 02 E9 7C 40 03 00 \r
+5D 43 B0 13 02 E9 2D 47 1E 47 02 00 3D E3 3E E3 \r
+1D 53 0E 63 0B 3C 6C 43 5D 43 B0 13 C4 8B 2D 47 \r
+1E 47 02 00 03 3C 2D 47 1E 47 02 00 C1 45 00 00 \r
+1C 41 04 00 1F 41 02 00 3B 01 08 00 4B 13 44 43 \r
+B0 13 16 EF 92 B3 08 1E 09 20 92 B3 76 1E 06 20 \r
+A2 B3 76 1E 41 27 36 B0 20 00 3E 27 6C 43 4D 43 \r
+B0 13 C4 8B 7C 40 E0 00 B0 13 B4 EE B0 13 86 F0 \r
+B0 13 D2 EF 1F 41 06 00 C2 4F 34 1E 31 50 10 00 \r
+64 16 10 01 B0 13 02 E9 7C 40 03 00 4D 43 B0 13 \r
+02 E9 10 01 0A 14 31 80 1E 00 B0 13 78 E9 B2 B0 \r
+40 00 08 1E 05 20 91 43 0E 00 81 43 10 00 04 3C \r
+81 43 0E 00 81 43 10 00 1A 41 0E 00 5F 42 30 1E \r
+81 4F 12 00 81 43 14 00 5F 42 31 1E 81 4F 16 00 \r
+81 43 18 00 5F 42 32 1E 81 4F 1A 00 81 43 1C 00 \r
+4E 43 9F 3C 4F 4E 0F 93 07 24 1F 83 55 24 1F 83 \r
+40 24 1F 83 2C 24 95 3C B0 13 F2 EE B0 13 D4 8D \r
+0F 43 81 43 00 00 91 43 02 00 81 43 04 00 B1 40 \r
+29 00 06 00 F1 40 49 00 08 00 00 18 F1 40 F6 EB \r
+0A 00 CC 01 3C 50 0E 00 5D 43 4E 43 B0 13 B6 89 \r
+81 93 10 00 07 20 81 93 0E 00 04 20 B2 D0 40 00 \r
+08 1E 03 3C B2 F0 BF FF 08 1E 5E 43 6A 3C B0 13 \r
+B0 8D F1 40 5E 00 08 00 00 18 F1 40 02 E7 0A 00 \r
+CC 01 3C 50 1A 00 6D 43 4E 43 B0 13 B6 89 4E 43 \r
+58 3C B0 13 B0 8D F1 40 48 00 08 00 00 18 F1 40 \r
+02 E7 0A 00 CC 01 3C 50 16 00 6D 43 4E 43 B0 13 \r
+B6 89 7E 40 03 00 45 3C 1C 41 12 00 1D 41 14 00 \r
+B0 13 C8 8D 7C 40 4A 00 5E 43 B0 13 70 AF 7C 40 \r
+1E 00 5D 43 B0 13 02 E9 1C 41 16 00 1D 41 18 00 \r
+B0 13 C8 8D 7C 40 48 00 5E 43 B0 13 70 AF 1C 41 \r
+1A 00 1D 41 1C 00 B0 13 C8 8D 7C 40 5E 00 5E 43 \r
+B0 13 70 AF 7C 40 29 00 5D 43 B0 13 02 E9 0F 43 \r
+81 43 00 00 B1 40 17 00 02 00 81 43 04 00 B1 40 \r
+23 00 06 00 F1 40 4A 00 08 00 00 18 F1 40 E6 D6 \r
+0A 00 CC 01 3C 50 12 00 6D 43 4E 43 B0 13 B6 89 \r
+6E 43 92 B3 08 1E 13 20 92 B3 76 1E 5B 27 B0 13 \r
+E6 EE D2 41 12 00 30 1E D2 41 16 00 31 1E D2 41 \r
+1A 00 32 1E B0 13 44 F0 B0 13 D4 8D 0B 3C 0A 93 \r
+04 20 B2 D0 40 00 08 1E 03 3C B2 F0 BF FF 08 1E \r
+B0 13 D4 8D 82 43 76 1E 31 50 1E 00 0A 16 10 01 \r
+0F 43 81 43 04 00 B1 40 3B 00 06 00 81 43 08 00 \r
+B1 40 23 00 0A 00 10 01 6E 43 4F 43 B0 13 FC B4 \r
+CD 0C 10 01 4C 43 4D 43 B0 13 02 E9 10 01 7F 14 \r
+59 42 1B 02 B2 B0 20 00 76 1E EA 20 B2 B0 40 00 \r
+76 1E E6 20 82 43 76 1E 5A 42 1D 02 4A F9 48 43 \r
+B0 13 3A EF 4C 93 6D 20 7A B0 1F 00 0F 24 32 C2 \r
+03 43 C2 43 1B 02 32 D2 3C 40 A3 00 B0 13 A0 CC \r
+92 42 26 1E 2A 1E 92 42 28 1E 2C 1E 6A B2 44 20 \r
+6A B3 2D 20 7A B0 10 00 22 20 5A B3 0E 20 7A B2 \r
+77 24 F2 B2 01 02 74 24 D2 43 7B 1E C2 43 7A 1E \r
+F2 D2 03 02 F2 D2 05 02 6B 3C D2 B3 01 02 68 24 \r
+B2 D2 76 1E 58 43 B0 13 F0 EC 4C 93 61 24 A2 B2 \r
+08 1E 5E 20 B0 13 DA EA B2 C2 76 1E 59 3C F2 B0 \r
+10 00 01 02 55 24 A2 D2 76 1E 58 43 51 3C E2 B3 \r
+01 02 0B 20 E2 B3 19 02 4B 24 A2 D3 76 1E B2 F0 \r
+FF FE 76 1E E2 C3 19 02 43 3C A2 D3 76 1E B2 F0 \r
+FF FE 76 1E 58 43 3C 3C E2 B2 01 02 0B 20 E2 B2 \r
+19 02 36 24 92 D3 76 1E B2 F0 7F FF 76 1E E2 C2 \r
+19 02 2E 3C 92 D3 76 1E B2 F0 7F FF 76 1E 58 43 \r
+27 3C D2 53 7E 1E 5F 42 7E 1E 5F 83 7F 90 07 00 \r
+05 28 F2 F0 0F 00 F2 1C C2 43 7E 1E 6A B2 13 20 \r
+6A B3 0D 20 7A B0 10 00 06 20 5A B3 11 24 F2 D0 \r
+20 00 F0 1C 0D 3C F2 D0 30 00 F2 1C 07 3C F2 D0 \r
+20 00 F2 1C 03 3C F2 D0 10 00 F2 1C F2 D2 F0 1C \r
+A2 B3 76 1E 03 24 B2 B2 76 1E 18 20 48 93 18 24 \r
+E2 93 E0 1E 0A 24 B2 B0 10 00 08 1E 0A 20 5C 43 \r
+3D 40 33 13 B0 13 12 D6 04 3C B0 13 4C F0 82 43 \r
+76 1E 3C 40 00 20 B0 13 A0 CC 02 3C 82 43 76 1E \r
+7A B0 20 00 02 24 B2 D2 0A 1E 7A B0 40 00 02 24 \r
+A2 D2 0A 1E 92 B3 76 1E 03 20 A2 B3 76 1E 18 24 \r
+3C 40 66 06 B0 13 A0 CC E2 B2 01 02 07 24 E2 D2 \r
+19 02 92 C3 76 1E B2 D0 80 00 76 1E E2 B3 01 02 \r
+07 24 E2 D3 19 02 A2 C3 76 1E B2 D0 00 01 76 1E \r
+32 C2 03 43 C2 43 1D 02 C2 49 1B 02 32 D2 B1 C0 \r
+F0 00 20 00 78 16 00 13 0A 14 31 80 1A 00 B0 13 \r
+78 E9 5F 42 CB 1E 4C 4F 0D 43 4E 4F 81 4E 0E 00 \r
+81 43 10 00 5E 42 CC 1E 81 4E 12 00 81 43 14 00 \r
+91 42 CE 1E 16 00 81 43 18 00 B2 B0 40 00 08 1E \r
+0D 20 4C 4F B0 13 BE 91 7C 40 48 00 B0 13 8E 91 \r
+7C 40 4A 00 5E 43 B0 13 70 AF 0B 3C B0 13 BE 91 \r
+7C 40 4A 00 B0 13 8E 91 7C 40 48 00 5E 43 B0 13 \r
+70 AF 7C 40 1F 00 5D 43 B0 13 02 E9 4A 43 70 3C \r
+4F 4A 0F 93 3E 24 1F 83 1F 24 1F 83 55 20 B2 B0 \r
+40 00 08 1E 0C 20 B0 13 A2 91 B0 13 5A 91 CC 01 \r
+3C 50 0E 00 6D 43 4E 43 B0 13 B6 89 0B 3C B0 13 \r
+A2 91 B0 13 74 91 CC 01 3C 50 0E 00 6D 43 4E 43 \r
+B0 13 B6 89 4A 43 38 3C B2 B0 40 00 08 1E 0C 20 \r
+B0 13 B0 91 B0 13 74 91 CC 01 3C 50 12 00 6D 43 \r
+4E 43 B0 13 B6 89 0B 3C B0 13 B0 91 B0 13 5A 91 \r
+CC 01 3C 50 12 00 6D 43 4E 43 B0 13 B6 89 6A 43 \r
+1B 3C 3F 40 D8 07 81 43 00 00 B1 40 34 08 02 00 \r
+81 43 04 00 B1 40 22 00 06 00 F1 40 5C 00 08 00 \r
+00 18 F1 40 02 E7 0A 00 CC 01 3C 50 16 00 6D 42 \r
+4E 43 B0 13 B6 89 5A 43 5C 41 12 00 1D 41 16 00 \r
+B0 13 86 C2 4F 4C 0E 43 1E 91 10 00 04 38 08 20 \r
+1F 91 0E 00 05 2C 4F 4C 81 4F 0E 00 81 43 10 00 \r
+92 B3 08 1E 0C 20 92 B3 76 1E 8A 27 D2 41 0E 00 \r
+CB 1E D2 41 12 00 CC 1E 92 41 16 00 CE 1E 82 43 \r
+76 1E 31 50 1A 00 0A 16 10 01 81 43 08 00 B1 40 \r
+23 00 0A 00 F1 40 48 00 0C 00 00 18 F1 40 02 E7 \r
+0E 00 10 01 81 43 08 00 B1 40 23 00 0A 00 F1 40 \r
+4A 00 0C 00 00 18 F1 40 02 E7 0E 00 10 01 5E 43 \r
+B0 13 70 AF 1C 41 16 00 1D 41 18 00 B0 13 BE 91 \r
+10 01 1F 43 81 43 04 00 4C 4C 81 4C 06 00 10 01 \r
+1F 43 81 43 04 00 B1 40 0C 00 06 00 10 01 6E 43 \r
+4F 43 B0 13 FC B4 CD 0C 10 01 31 80 1A 00 B0 13 \r
+78 E9 5F 42 F6 1D 81 4F 0E 00 81 43 10 00 1C 42 \r
+FC 1D 1D 42 FE 1D 3E 40 E8 03 0F 43 B0 13 8E D0 \r
+81 4C 16 00 81 4D 18 00 B2 B0 40 00 08 1E 12 20 \r
+1C 42 F8 1D 0D 43 3E 40 B9 01 0F 43 B0 13 46 E7 \r
+3E 40 C8 00 0F 43 B0 13 CC D9 81 4C 12 00 81 4D \r
+14 00 05 3C 91 42 F8 1D 12 00 81 43 14 00 4E 43 \r
+82 3C 4F 4E 0F 93 55 24 1F 83 39 24 1F 83 7B 20 \r
+B2 B0 40 00 08 1E 19 20 7C 40 5E 00 3D 40 4E F5 \r
+5E 43 B0 13 70 AF 3F 40 46 00 81 43 00 00 B1 40 \r
+90 01 02 00 B0 13 A0 93 CC 01 3C 50 12 00 7D 40 \r
+03 00 6E 43 B0 13 B6 89 18 3C 7C 40 5E 00 3D 40 \r
+52 F5 5E 43 B0 13 70 AF 3F 40 1E 00 81 43 00 00 \r
+B1 40 96 00 02 00 B0 13 A0 93 CC 01 3C 50 12 00 \r
+7D 40 03 00 6E 43 B0 13 B6 89 4E 43 44 3C 0F 43 \r
+81 43 00 00 91 43 02 00 81 43 04 00 B1 40 29 00 \r
+06 00 F1 40 5C 00 08 00 00 18 F1 40 0C EC 0A 00 \r
+CC 01 3C 50 0E 00 5D 43 4E 43 B0 13 B6 89 6E 43 \r
+2A 3C 7C 40 10 00 5D 43 B0 13 02 E9 0F 43 81 43 \r
+00 00 B1 40 3F 0D 02 00 B1 40 03 00 04 00 B1 40 \r
+32 00 06 00 F1 40 5A 00 08 00 00 18 F1 40 02 E7 \r
+0A 00 CC 01 3C 50 16 00 7D 40 06 00 7E 40 05 00 \r
+B0 13 B6 89 7C 40 10 00 4D 43 B0 13 02 E9 6C 43 \r
+B0 13 D2 CE 5E 43 92 B3 08 1E 2D 20 92 B3 76 1E \r
+78 27 1C 41 16 00 1D 41 18 00 3E 40 E8 03 0F 43 \r
+B0 13 46 E7 82 4C FC 1D 82 4D FE 1D D2 41 0E 00 \r
+F6 1D B2 B0 40 00 08 1E 11 20 1C 41 12 00 1D 41 \r
+14 00 3E 40 C8 00 0F 43 B0 13 46 E7 3E 40 B9 01 \r
+0F 43 B0 13 CC D9 82 4C F8 1D 03 3C 92 41 12 00 \r
+F8 1D A2 D2 8C 1C 82 43 76 1E 31 50 1A 00 10 01 \r
+81 43 08 00 B1 40 22 00 0A 00 F1 40 62 00 0C 00 \r
+00 18 F1 40 02 E7 0E 00 10 01 6A 14 31 80 20 00 \r
+C8 0F C9 0D CA 0E 81 43 0C 00 81 43 0E 00 B0 13 \r
+74 DE 81 4C 14 00 81 4D 16 00 CC 09 CD 0A B0 13 \r
+44 E0 0E 43 3F 40 C8 42 B0 13 C6 BE 81 4C 18 00 \r
+81 4D 1A 00 CC 08 B0 13 9A E6 0E 43 3F 40 20 41 \r
+B0 13 C6 BE 81 4C 1C 00 81 4D 1E 00 1C 41 14 00 \r
+1D 41 16 00 3E 40 F4 FD 3F 40 D4 3B B0 13 3A B7 \r
+1E 41 1C 00 1F 41 1E 00 B0 13 E6 9E 81 4C 10 00 \r
+81 4D 12 00 1C 41 10 00 1D 41 12 00 3E 40 E7 6F \r
+3F 40 63 3B B0 13 3A B7 CE 0C CF 0D 1C 41 14 00 \r
+1D 41 16 00 B0 13 C6 BE 81 4C 08 00 81 4D 0A 00 \r
+36 40 10 00 37 40 50 F6 0A 43 2C 47 B0 13 60 95 \r
+CE 08 CF 09 B0 13 A4 D4 0C 93 08 38 81 48 0C 00 \r
+81 49 0E 00 27 53 1A 53 16 83 EF 23 4A 4A 5A 02 \r
+1C 4A 70 F6 B0 13 9A E6 C6 0C C7 0D 1C 4A 50 F6 \r
+B0 13 60 95 B0 13 84 95 C4 0C C5 0D 1C 41 08 00 \r
+1D 41 0A 00 CE 08 CF 09 B0 13 E0 9E 3E 40 82 A8 \r
+3F 40 7B 38 B0 13 3A B7 CE 0C CF 0D 0C 43 3D 40 \r
+80 3F B0 13 72 95 C4 0C C5 0D 1C 4A 72 F6 B0 13 \r
+9A E6 CE 06 CF 07 B0 13 72 95 C5 0C CA 0D CC 08 \r
+CD 09 B0 13 84 95 CE 0C CF 0D CC 05 CD 0A B0 13 \r
+C6 BE CE 06 CF 07 B0 13 E6 9E 81 4C 04 00 81 4D \r
+06 00 1C 41 18 00 1D 41 1A 00 1E 41 04 00 1F 41 \r
+06 00 B0 13 C6 BE 81 4C 00 00 81 4D 02 00 38 40 \r
+11 00 3A 40 32 1D 39 40 72 F6 3C 49 B0 13 9A E6 \r
+2E 41 1F 41 02 00 B0 13 3A B7 2A 52 8A 4C FC FF \r
+8A 4D FE FF 18 83 F1 23 31 50 20 00 64 16 10 01 \r
+B0 13 74 DE C8 0C C9 0D 1C 41 0C 00 1D 41 0E 00 \r
+10 01 B0 13 E0 9E CE 0C CF 0D CC 04 CD 05 B0 13 \r
+3A B7 10 01 1E 41 10 00 1F 41 12 00 B0 13 E0 9E \r
+10 01 3C 40 79 1D 0D 43 3E 40 21 00 B0 13 72 ED \r
+7C 40 30 00 B0 13 D8 C6 7C 40 30 00 B0 13 2C D7 \r
+4C 93 AF 20 7C 40 31 00 B0 13 2C D7 7C 90 06 00 \r
+A5 20 7C 40 36 00 B0 13 D8 C6 B0 13 18 97 FD 23 \r
+B2 40 01 02 34 0F 0F 42 32 C2 03 43 B2 B0 10 00 \r
+02 0F FC 27 B2 40 51 7E 10 0F B2 B0 10 00 02 0F \r
+FC 27 F2 40 3D 00 11 0F B2 B0 10 00 02 0F FC 27 \r
+F2 40 FE 00 11 0F B2 B0 20 00 02 0F FC 27 C2 43 \r
+10 0F B2 B0 80 00 02 0F FC 27 F2 90 51 00 20 0F \r
+72 20 B2 B0 10 00 02 0F FC 27 F2 40 3D 00 11 0F \r
+02 4F 3B 40 92 F5 4E 43 6C 4B 4F 4E 5F 02 5D 4F \r
+93 F5 B0 13 46 DF 2B 53 5E 53 7E 90 20 00 F4 2B \r
+3D 40 92 F5 4E 43 6C 4D B0 13 2C D7 4F 4E 5F 02 \r
+CF 9C 93 F5 4D 20 2D 53 5E 53 7E 90 20 00 F3 2B \r
+7C 40 36 00 B0 13 D8 C6 B0 13 18 97 FD 23 7C 40 \r
+0C 00 5D 42 16 1E B0 13 46 DF B0 13 A8 E8 6C 43 \r
+B0 13 72 EA 7C 40 34 00 B0 13 D8 C6 A2 B3 30 0F \r
+FD 27 3E 40 10 00 7C 40 34 00 B0 13 2C D7 5C F3 \r
+5F 42 9A 1D 4F 5F 4C DF C2 4C 9A 1D 1E 83 F3 23 \r
+F2 D0 80 00 9A 1D B0 13 F4 E1 7C 40 32 00 B0 13 \r
+D8 C6 D2 43 78 1D B2 40 36 00 9E 1D B2 40 E2 04 \r
+A0 1D 3C 40 79 1D 0D 43 3E 40 1F 00 B0 13 72 ED \r
+3C 40 98 1D 0D 43 2E 43 B0 13 72 ED 32 D2 10 01 \r
+32 C2 03 43 FF 3F 32 C2 03 43 FF 3F 32 C2 03 43 \r
+FF 3F 32 C2 03 43 FF 3F 7C 40 3D 00 B0 13 D8 C6 \r
+7C B0 F0 FF 10 01 1A 14 CA 0C 6D 93 3C 24 5D 93 \r
+0E 24 6D 92 60 20 B0 13 6A 98 6D 42 B0 13 02 E9 \r
+C2 43 2F 1E 4C 43 4D 43 B0 13 02 E9 54 3C C2 93 \r
+2F 1E 1A 20 B2 B0 40 00 08 1E 09 20 B0 13 FA 97 \r
+5A 93 07 20 5C 42 30 1E B0 13 CC E9 02 3C B0 13 \r
+12 98 B0 13 44 98 C9 0C 5C 42 31 1E B0 13 20 98 \r
+B0 13 6A 98 6D 43 E0 3F B0 13 5C 98 C9 0C 5C 42 \r
+32 1E B0 13 20 98 7D 40 1F 00 7E 40 29 00 B0 13 \r
+76 EF 5D 43 D1 3F 5F 42 2E 1E 4F 93 24 24 C2 93 \r
+2F 1E 1A 20 4F 4F 2F 83 0F 24 1F 83 1C 20 B2 B0 \r
+40 00 08 1E 07 20 B0 13 FA 97 5C 42 30 1E B0 13 \r
+CC E9 02 3C B0 13 12 98 B0 13 44 98 CA 0C 5C 42 \r
+31 1E B0 13 36 98 07 3C B0 13 5C 98 CA 0C 5C 42 \r
+32 1E B0 13 36 98 19 16 10 01 5C 42 30 1E B0 13 \r
+26 EB CF 0C CC 0A B0 13 4C 98 4C 4F B0 13 28 98 \r
+10 01 B0 13 4C 98 5C 42 30 1E B0 13 28 98 10 01 \r
+B0 13 28 98 CC 0A 10 01 B0 13 78 98 CC 09 5E 43 \r
+B0 13 70 AF 10 01 B0 13 78 98 CC 0A 5E 43 B0 13 \r
+70 AF 10 01 CC 0A B0 13 5C 98 10 01 7D 40 4A 00 \r
+7E 40 60 00 B0 13 76 EF C9 0C 10 01 7D 40 48 00 \r
+7E 40 5E 00 B0 13 76 EF 10 01 7D 40 1E 00 7E 40 \r
+28 00 B0 13 76 EF 10 01 0D 43 6E 43 4F 43 B0 13 \r
+FC B4 CD 0C 10 01 1A 14 31 80 16 00 B0 13 C2 DB \r
+CA 0C 0A 93 03 20 3C 40 03 00 97 3C 5C 43 CD 0A \r
+B0 13 44 B0 4C 93 04 20 CC 0A B0 13 92 F0 F3 3F \r
+B0 13 98 F0 CD 0C C9 01 39 52 CC 09 2E 42 B0 13 \r
+60 ED 81 49 00 00 CF 01 3F 50 0C 00 81 4F 02 00 \r
+F1 40 09 00 04 00 E1 43 05 00 CD 01 3D 50 0E 00 \r
+3C 40 6C 1E B0 13 20 EA D1 4A 09 00 12 00 D1 42 \r
+75 1E 0D 00 B0 13 BE F0 C1 4C 13 00 D1 43 0C 00 \r
+B0 13 C2 F0 C1 4C 14 00 2C 43 3D 40 03 00 CE 01 \r
+B0 13 F0 B7 0C 93 59 20 B0 13 80 F0 C9 0C E1 43 \r
+05 00 CF 01 3F 50 0C 00 81 4F 02 00 CF 0A 3F 50 \r
+03 00 81 4F 00 00 79 90 03 00 06 24 59 93 02 20 \r
+B0 13 E0 E6 B0 13 0A E8 B0 13 DE DE 79 90 03 00 \r
+07 24 59 93 03 24 B0 13 EA E7 02 3C B0 13 0A E6 \r
+2C 43 2D 43 CE 01 B0 13 F0 B7 0C 93 05 24 CC 0A \r
+B0 13 92 F0 1C 43 29 3C 3F 40 7F 00 5F F1 0C 00 \r
+5F 93 09 24 7F 90 03 00 06 24 CC 0A B0 13 92 F0 \r
+3C 40 05 00 1A 3C EA 43 00 00 DA 41 0E 00 0A 00 \r
+D2 4A 0B 00 77 1D F1 90 40 00 0F 00 02 20 5F 43 \r
+02 3C 7F 40 03 00 CA 4F 01 00 D2 53 75 1E C2 93 \r
+75 1E 02 20 D2 43 75 1E 0C 43 31 50 16 00 19 16 \r
+10 01 3A 14 31 82 C9 0C F9 90 14 00 00 00 05 28 \r
+B0 13 C2 F0 C9 9C 14 00 74 20 3C 40 0E 00 0C 59 \r
+CD 01 B0 13 52 EF 91 92 6E 1E 02 00 6A 20 91 92 \r
+6C 1E 00 00 66 20 58 49 12 00 3A 40 05 00 0A 59 \r
+3C 40 05 00 0C 59 CD 08 B0 13 78 DC 0C 93 48 20 \r
+C2 93 70 1E 56 24 B0 13 C2 DB C7 0C 07 93 51 24 \r
+3C 40 03 00 0C 57 CD 0A 2E 42 B0 13 60 ED 6C 43 \r
+CD 07 B0 13 44 B0 4C 93 03 24 D2 93 74 1E 04 20 \r
+CC 07 B0 13 92 F0 3D 3C 5F 42 74 1E CE 0F 5E 53 \r
+C2 4E 74 1E 4F 4F DF 47 0B 00 72 1E C7 48 0A 00 \r
+E7 43 00 00 F9 90 40 00 13 00 02 20 5F 43 02 3C \r
+7F 40 03 00 C7 4F 01 00 D1 47 09 00 06 00 B0 13 \r
+BE F0 C1 4C 07 00 B0 13 02 9B B0 13 F0 9A CD 01 \r
+B0 13 10 9B D5 27 B0 13 D8 9A 0C 93 12 24 D0 3F \r
+B0 13 02 9B D1 4C 09 00 06 00 B0 13 BE F0 C1 4C \r
+07 00 B0 13 F0 9A CD 01 B0 13 10 9B 02 24 B0 13 \r
+D8 9A 31 52 37 16 10 01 3C 40 03 00 0C 59 CD 0A \r
+2E 42 B0 13 60 ED CC 09 4D 43 B0 13 68 E1 10 01 \r
+3E 40 07 00 5E F9 0A 00 3F 40 03 00 4F 8E 6C 43 \r
+10 01 F1 40 81 00 08 00 D1 49 0D 00 09 00 10 01 \r
+2D 52 6E 42 B0 13 6C C0 C9 0C 09 93 10 01 C2 43 \r
+17 1D 5F 42 F2 1C 2F 83 99 24 1F 83 3F 24 1F 83 \r
+23 24 1F 83 06 24 2F 83 96 20 F2 D0 20 00 F0 1C \r
+10 01 E2 43 F2 1C 3C 40 1E 1D 4D 43 4E 4D 5E 02 \r
+5F 4E F3 1C 47 18 0F 5F 5E 4E F4 1C 0E 5F 2C 53 \r
+8C 4E FE FF 5D 53 7D 90 09 00 F0 2B E2 43 18 1D \r
+F2 40 09 00 17 1D 10 01 E2 43 F2 1C 5E 42 F3 1C \r
+47 18 0E 5E 5F 42 F4 1C 0E 5F 82 4E 1A 1D 5F 42 \r
+F5 1C 47 18 0F 5F 5D 42 F6 1C 0F 5D 82 4F 1C 1D \r
+D2 43 18 1D 4F 8E C2 4F 17 1D 10 01 3E 40 BF FF \r
+1E F2 08 1E 5F 42 F3 1C 5F 03 3F F0 C0 FF 0E DF \r
+82 4E 08 1E 3F 40 7F 00 5F F2 F3 1C C2 4F 30 1E \r
+D2 42 F4 1C 31 1E D2 42 F5 1C 32 1E 5F 42 F6 1C \r
+47 18 0F 5F 5E 42 F7 1C 0E 5F 82 4E CE 1E D2 42 \r
+F8 1C CC 1E D2 42 F9 1C CB 1E D2 42 FA 1C E2 1E \r
+D2 42 FB 1C E3 1E 5F 42 FC 1C 47 18 0F 5F 5E 42 \r
+FD 1C 0E 5F CF 0E 1F 52 D4 1E 1F 82 D2 1E 82 4F \r
+D4 1E 82 4E D2 1E 5F 42 FE 1C 47 18 0F 5F 5C 42 \r
+FF 1C 0C 5F 82 4C 20 1E 1D 42 1A 1E 1E 42 1C 1E \r
+1F 42 1E 1E B0 13 BA 93 7C 40 5A 00 3D 40 0A F5 \r
+5E 43 B0 13 70 AF D2 43 EE 1C 10 01 F2 40 03 00 \r
+F2 1C D2 43 17 1D 10 01 0A 14 31 82 92 B3 8C 1C \r
+0F 20 A2 B2 8C 1C 0C 20 3F 40 0C 00 1F 52 E6 1E \r
+6F 13 4C 93 0C 24 5C 43 6D 43 80 13 0E 1E 07 3C \r
+5C 43 B0 13 D2 CE 5C 43 5D 43 80 13 0E 1E A2 B3 \r
+0C 1E 1B 20 92 B3 8C 1C 12 20 B2 B2 8C 1C 0F 20 \r
+3F 40 0C 00 1F 52 E4 1E 6F 13 4C 93 5B 24 82 93 \r
+0C 1E 58 20 6C 43 6D 43 80 13 12 1E 53 3C 6C 43 \r
+B0 13 D2 CE 6C 43 5D 43 F7 3F 6A 43 B2 B2 0C 1E \r
+28 20 B2 B0 10 00 0C 1E 20 20 B2 B0 20 00 0C 1E \r
+14 20 B2 B0 40 00 0C 1E 0C 20 B2 B0 80 00 0C 1E \r
+1F 24 CC 01 3D 40 68 F5 2E 42 B0 13 60 ED 5A 43 \r
+17 3C CC 01 3D 40 6E F5 F7 3F CC 01 3D 40 74 F5 \r
+3E 40 06 00 B0 13 60 ED 0B 3C CC 01 3D 40 7C F5 \r
+F7 3F CC 01 3D 40 84 F5 3E 40 06 00 B0 13 60 ED \r
+CC 0A B0 13 D2 CE CC 0A 6D 42 80 13 12 1E 6A 93 \r
+07 24 7C 40 46 00 CD 01 5E 43 B0 13 70 AF 06 3C \r
+7C 40 5A 00 CD 01 5E 43 B0 13 70 AF 82 43 0C 1E \r
+A2 D2 0C 1E 92 B3 8C 1C 10 24 B0 13 22 EF 6C 93 \r
+0C 20 7C 40 17 00 B0 13 A4 9D 7C 40 18 00 B0 13 \r
+A4 9D 7C 40 19 00 B0 13 A4 9D 82 43 8C 1C 31 52 \r
+0A 16 10 01 7D 40 03 00 B0 13 02 E9 10 01 2A 14 \r
+C2 93 93 1E 8C 24 5D 93 78 24 6D 93 15 24 6D 92 \r
+8D 20 B0 13 E0 DF C2 43 58 1E 7C 40 1F 00 4D 43 \r
+B0 13 02 E9 6C 43 4D 43 B0 13 02 E9 7C 40 03 00 \r
+4D 43 B0 13 02 E9 7A 3C 5F 42 5E 1E 0F 93 13 24 \r
+1F 83 0A 24 5A 42 5B 1E 7C 40 1A 00 7D 40 5A 00 \r
+5E 43 B0 13 66 C6 10 3C 5A 42 5A 1E 7C 40 1A 00 \r
+7D 40 59 00 F5 3F 5A 42 59 1E 7C 40 1A 00 7D 40 \r
+58 00 5E 43 B0 13 66 C6 CC 0A B0 13 C0 D3 3D 40 \r
+0A 00 B0 13 22 EC B0 13 9A E6 3E 40 CD CC 3F 40 \r
+4C 3E B0 13 3A B7 C8 0C C9 0D 1C 42 5C 1E B0 13 \r
+9A E6 3E 40 CD CC 3F 40 4C 3F B0 13 3A B7 CE 0C \r
+CF 0D CC 08 CD 09 B0 13 E6 9E B0 13 72 D7 82 4C \r
+5C 1E 0D 43 7E 40 03 00 4F 43 B0 13 FC B4 CD 0C \r
+7C 40 47 00 5E 43 B0 13 70 AF CC 0A B0 13 6E EE \r
+4C 93 08 20 6C 43 4D 43 B0 13 02 E9 7C 40 03 00 \r
+5D 43 9F 3F 6C 43 5D 43 97 3F B0 13 3C ED 4C 93 \r
+0B 20 82 43 5C 1E B0 13 8A C3 B2 40 10 0E 60 1E \r
+D2 43 58 1E D2 43 5E 1E 7C 40 1F 00 E9 3F 7C 40 \r
+47 00 3D 40 06 F5 5E 43 B0 13 70 AF 28 16 10 01 \r
+3B 40 80 00 01 3C 0B 43 0A 14 09 14 08 14 07 14 \r
+21 83 3F B0 80 7F 7B 24 3D B0 80 7F 05 20 0C 4E \r
+0D 4F 8B 10 0D EB 73 3C 5D 02 08 4D 4D 10 38 F0 \r
+00 FF 0D D8 5F 02 08 4F 4F 10 38 F0 00 FF 0F D8 \r
+09 4C 0A 4D 3D F0 80 00 C1 4D 00 00 0B EA 0B EF \r
+3B C0 7F FF 3A D0 80 00 3F D0 80 00 0A 9F 02 20 \r
+09 9E 0A 24 0B 2C 0D 4F 0F 4A 0A 4D 0C 4E 0E 49 \r
+09 4C 81 EB 00 00 02 3C 0B 93 4F 20 0C 43 08 4A \r
+88 10 47 48 8F 10 48 8F 8F 10 0E 24 38 90 19 00 \r
+34 2C 12 C3 4F 10 5E 00 5C 00 3C B0 00 10 02 24 \r
+3C D0 00 20 18 83 F5 23 0B 93 0C 24 08 8C 09 7E \r
+4A 7F 0C 48 4A 93 12 30 5C 02 09 69 4A 6A 17 83 \r
+2C 24 F8 3F 09 5E 4A 6F 09 28 4A 10 59 00 5C 00 \r
+3C B0 00 10 02 24 3C D0 00 20 17 53 3C B0 00 80 \r
+07 24 09 63 4A 63 07 63 3C B0 00 60 01 20 19 C3 \r
+17 93 13 38 37 90 FF 00 13 34 7A C0 80 00 87 10 \r
+D1 51 00 00 00 00 57 00 0A D7 0C 49 0D 4A 21 53 \r
+07 16 08 16 09 16 0A 16 10 01 0D 43 0C 43 F7 3F \r
+3D 40 FF FE D1 61 00 00 00 00 5D 00 3C 43 EF 3F \r
+6D 93 1E 24 5D 93 8A 20 C2 93 40 1E 08 20 3D 40 \r
+3A 1E 7C 40 5A 00 5E 43 B0 13 70 AF 07 3C 3D 40 \r
+38 1E 7C 40 5A 00 5E 43 B0 13 70 AF 7C 40 27 00 \r
+5D 43 B0 13 02 E9 7C 40 28 00 5D 43 80 00 02 E9 \r
+B2 B0 20 00 8C 1C 6A 24 C2 93 40 1E 38 20 5F 42 \r
+35 1E 4F 93 63 24 4F 4F 1F 83 1E 24 1F 83 16 24 \r
+1F 83 0E 24 1F 83 06 24 3F 80 03 00 1B 24 1F 83 \r
+1F 24 10 01 5D 42 3A 1E 7C 40 21 00 B0 13 2E A1 \r
+5D 42 3B 1E 7C 40 22 00 B0 13 2E A1 5D 42 3C 1E \r
+7C 40 23 00 B0 13 2E A1 5D 42 3D 1E 7C 40 24 00 \r
+B0 13 2E A1 5D 42 3E 1E 7C 40 25 00 B0 13 2E A1 \r
+5D 42 3F 1E 7C 40 26 00 5E 43 80 00 66 C6 5F 42 \r
+35 1E 1F 83 28 24 1F 83 20 24 1F 83 18 24 1F 83 \r
+10 24 1F 83 08 24 1F 83 21 20 5D 42 38 1E 7C 40 \r
+21 00 B0 13 2E A1 5D 42 39 1E 7C 40 22 00 B0 13 \r
+2E A1 5D 42 3A 1E 7C 40 23 00 B0 13 2E A1 5D 42 \r
+3B 1E 7C 40 24 00 B0 13 2E A1 5D 42 3C 1E 7C 40 \r
+25 00 B0 13 2E A1 5D 42 3D 1E CC 3F 10 01 5E 43 \r
+B0 13 66 C6 10 01 A2 D3 08 1E 82 93 76 1E 03 24 \r
+A2 B2 08 1E 68 20 B2 B0 20 00 76 1E 5B 20 B2 B0 \r
+40 00 76 1E 4B 20 82 93 76 1E 69 24 92 B3 76 1E \r
+32 20 A2 B3 76 1E 1A 20 A2 B2 76 1E 0D 20 B2 B2 \r
+76 1E 5D 24 1F 42 E4 1E 0F 0F 6C 43 4F 13 B2 D2 \r
+8C 1C B2 C2 76 1E 53 3C 1F 42 E6 1E 0F 0F 5C 43 \r
+4F 13 A2 D2 8C 1C A2 C2 76 1E 49 3C C2 43 89 1E \r
+6C 43 6D 42 80 13 12 1E 1F 42 E4 1E 1F 4F 10 00 \r
+82 4F E4 1E 00 18 D2 4F 08 00 12 1E B2 D2 8C 1C \r
+A2 C3 76 1E 34 3C 5C 43 6D 42 80 13 0E 1E 1F 42 \r
+E6 1E 1F 4F 10 00 82 4F E6 1E 00 18 D2 4F 08 00 \r
+0E 1E A2 D2 8C 1C 92 C3 76 1E 21 3C B2 F0 BF FF \r
+76 1E 1F 42 E4 1E 3F 0F 04 00 6C 43 4F 13 92 D3 \r
+8C 1C 15 3C B2 F0 DF FF 76 1E 1F 42 E6 1E 3F 0F \r
+04 00 5C 43 F3 3F E2 B3 01 02 03 24 D2 B3 01 02 \r
+04 20 92 D3 0C 1E B2 D2 0C 1E 82 43 76 1E 82 93 \r
+08 1E 09 24 92 B3 08 1E 06 24 92 C3 08 1E B0 13 \r
+F2 EE 92 D3 8C 1C A2 C3 08 1E 10 01 1A 14 C9 0C \r
+1A 42 44 1E 4D 4D 1D 5A 0C 00 0D 8E 3D 80 13 00 \r
+0D 93 78 34 3E 40 1A 00 1E 52 44 1E 6F 4E 3F F0 \r
+03 00 1F 83 4F 24 1F 83 2C 20 CA 43 12 00 2F 42 \r
+6F BE 1A 20 1C 42 44 1E D2 9C 11 00 48 1E 09 2C \r
+C2 93 4A 1E 03 20 B0 13 DE CF 09 3C 8C 43 18 00 \r
+06 3C B0 13 1A CE 1F 42 44 1E DF 53 11 00 CC 09 \r
+5D 43 B0 13 4C D9 4E 3C EE C2 00 00 1F 42 44 1E \r
+8F 43 00 00 8F 43 02 00 1C 42 44 1E B0 13 DE CF \r
+41 3C 3C 40 80 00 5C 8A 13 00 CF 0A 2D 4F 1E 4F \r
+02 00 3F 40 00 02 B0 13 82 D5 1C 5A 0C 00 3C 50 \r
+00 02 8A 4C 0C 00 1F 42 44 1E CF 43 0F 00 3F 40 \r
+1A 00 1F 52 44 1E 3E 40 FC 00 6E FF 5E D3 CF 4E \r
+00 00 20 3C 3C 40 40 00 5C 8A 13 00 2D 4A 1E 4A \r
+02 00 3F 40 80 1C B0 13 82 D5 1F 42 44 1E 1C 5F \r
+0A 00 3C 50 00 06 8F 4C 0C 00 1F 42 44 1E DF 43 \r
+0F 00 3F 40 1A 00 1F 52 44 1E 6E 4F 5E C3 6E D3 \r
+CF 4E 00 00 19 16 10 01 31 80 16 00 B0 13 78 E9 \r
+5C 42 E2 1E 4F 4C 81 4F 0E 00 81 43 10 00 5F 42 \r
+E3 1E 81 4F 12 00 81 43 14 00 4C 4C 0D 43 6E 43 \r
+4F 43 B0 13 FC B4 CD 0C 7C 40 4A 00 5E 43 B0 13 \r
+70 AF 7C 40 1E 00 5D 43 B0 13 02 E9 1C 41 12 00 \r
+1D 41 14 00 6E 43 4F 43 B0 13 FC B4 CD 0C 7C 40 \r
+48 00 5E 43 B0 13 70 AF 4E 43 3A 3C 4F 4E 0F 93 \r
+1D 24 1F 83 35 20 0F 43 81 43 00 00 B1 40 3B 00 \r
+02 00 81 43 04 00 B1 40 23 00 06 00 F1 40 48 00 \r
+08 00 00 18 F1 40 02 E7 0A 00 CC 01 3C 50 12 00 \r
+6D 43 4E 43 B0 13 B6 89 4E 43 1A 3C 0F 43 81 43 \r
+00 00 B1 40 17 00 02 00 81 43 04 00 B1 40 23 00 \r
+06 00 F1 40 4A 00 08 00 00 18 F1 40 E6 D6 0A 00 \r
+CC 01 3C 50 0E 00 6D 43 4E 43 B0 13 B6 89 5E 43 \r
+92 B3 08 1E 0B 20 92 B3 76 1E C0 27 D2 41 0E 00 \r
+E2 1E D2 41 12 00 E3 1E A2 D2 8C 1C 82 43 76 1E \r
+B2 D0 00 02 8C 1C 31 50 16 00 10 01 0A 14 31 80 \r
+16 00 B0 13 78 E9 B2 B0 40 00 08 1E 0D 20 B0 13 \r
+0E EB 3C B0 00 80 0F 7F 3F E3 81 4C 0E 00 81 4F \r
+10 00 1A 42 D2 1E 44 3C 1F 42 D2 1E 3F B0 00 80 \r
+0E 7E 3E E3 81 4F 0E 00 81 4E 10 00 CA 0F 38 3C \r
+B2 B0 40 00 08 1E 08 20 7C 40 1D 00 7D 40 46 00 \r
+5E 43 B0 13 66 C6 07 3C 7C 40 1D 00 7D 40 43 00 \r
+5E 43 B0 13 66 C6 7C 40 1F 00 5D 43 B0 13 02 E9 \r
+7C 40 0F 00 5D 43 B0 13 02 E9 3F 40 19 FC B1 43 \r
+00 00 B1 40 E7 03 02 00 81 43 04 00 B1 40 06 00 \r
+06 00 F1 40 49 00 08 00 00 18 F1 40 02 E7 0A 00 \r
+CC 01 3C 50 0E 00 7D 40 03 00 5E 43 B0 13 B6 89 \r
+92 B3 08 1E 1E 20 92 B3 76 1E C2 27 B2 B0 40 00 \r
+08 1E 07 20 1C 41 0E 00 B0 13 2A ED 81 4C 12 00 \r
+03 3C 91 41 0E 00 12 00 1F 41 12 00 0F 8A 81 4F \r
+14 00 92 51 14 00 D4 1E 92 41 12 00 D2 1E A2 D2 \r
+8C 1C 82 43 76 1E 31 50 16 00 0A 16 10 01 B2 B0 \r
+20 00 08 1E 77 20 B0 13 3A EF 4C 93 73 20 A2 B2 \r
+76 1E 70 24 1F 42 EE 1D 0F 93 68 20 B0 13 BA ED \r
+B0 13 F0 DC 7C 40 0A 00 B0 13 62 F0 7C 42 B0 13 \r
+68 F0 82 43 F2 1D 82 43 F4 1D 7C 40 05 00 B0 13 \r
+34 F0 7C 40 0C 00 5D 42 16 1E B0 13 28 DD 92 43 \r
+EE 1D 7C 40 17 00 6D 43 B0 13 02 E9 7C 40 18 00 \r
+6D 43 B0 13 02 E9 7C 40 19 00 6D 43 B0 13 02 E9 \r
+4C 43 B0 13 C2 E5 0C 93 0F 20 4C 43 1D 42 F2 1D \r
+1E 42 F4 1D B0 13 8C DA 4C 43 B0 13 86 CF 4C 43 \r
+B0 13 C2 E5 2C 93 25 24 4C 43 B0 13 C2 E5 1C 93 \r
+27 20 A2 43 EE 1D 82 93 F4 1D 0A 20 82 93 F2 1D \r
+07 20 4C 43 B0 13 A4 E2 82 4C F2 1D 82 4D F4 1D \r
+7C 40 17 00 B0 13 56 A6 7C 40 18 00 B0 13 56 A6 \r
+7C 40 19 00 B0 13 56 A6 7C 40 13 00 6D 43 80 00 \r
+02 E9 3C 40 99 19 B0 13 A0 CC D1 3F 2F 93 02 20 \r
+80 00 EE D4 10 01 7D 40 03 00 B0 13 02 E9 10 01 \r
+1A 14 31 80 18 00 B0 13 80 F0 C9 0C B0 13 98 F0 \r
+81 4C 10 00 CF 01 2F 52 81 4F 12 00 F1 42 14 00 \r
+7A 40 03 00 C1 4A 15 00 CD 01 3D 50 06 00 3C 40 \r
+8A 1E B0 13 20 EA D1 43 04 00 D1 42 92 1E 05 00 \r
+D1 43 0A 00 B0 13 C2 F0 C1 4C 0B 00 2C 43 3D 40 \r
+03 00 CE 01 3E 50 10 00 B0 13 F0 B7 C1 4A 15 00 \r
+CF 01 2F 52 81 4F 12 00 CF 01 3F 50 0C 00 81 4F \r
+10 00 79 90 03 00 06 24 59 93 02 20 B0 13 E0 E6 \r
+B0 13 0A E8 B0 13 DE DE 3A 40 06 00 79 90 03 00 \r
+07 24 59 93 03 24 B0 13 EA E7 02 3C B0 13 0A E6 \r
+2C 43 2D 43 CE 01 3E 50 10 00 B0 13 F0 B7 0C 93 \r
+1D 20 3F 40 7F 00 5F F1 04 00 5F 93 03 24 7F 90 \r
+06 00 14 20 CC 01 CD 01 3D 50 06 00 2E 42 B0 13 \r
+60 ED 2C 41 1D 41 02 00 B0 13 A8 ED CC 01 3C 50 \r
+0C 00 B0 13 5E EF D2 53 92 1E 0A 43 CC 0A 31 50 \r
+18 00 19 16 10 01 0A 14 21 83 C1 43 00 00 F2 90 \r
+03 00 78 1D 6B 20 7C 40 3B 00 B0 13 2C D7 CE 0C \r
+7C 40 3B 00 B0 13 2C D7 4E 9C F9 23 4E 93 61 24 \r
+CC 01 5D 43 B0 13 A8 E0 6F 41 3F 50 03 00 4E 4E \r
+0E 9F 38 20 F1 90 1F 00 00 00 34 2C F1 90 0B 00 \r
+00 00 30 28 3C 40 79 1D 0D 43 3E 40 1F 00 B0 13 \r
+72 ED E2 41 79 1D 3C 40 7A 1D 6D 41 B0 13 A8 E0 \r
+3C 40 98 1D 6D 43 B0 13 A8 E0 F2 B0 80 FF 99 1D \r
+14 24 92 53 AC 1D 82 63 AE 1D B0 13 08 DB 4C 93 \r
+30 20 5C 42 98 1D B0 13 98 E1 C2 4C 98 1D F2 F0 \r
+7F 00 99 1D B0 13 CA E7 24 3C 92 53 A8 1D 82 63 \r
+AA 1D 1F 3C 92 53 B0 1D 82 63 B2 1D 0A 42 32 C2 \r
+03 43 7C 40 36 00 B0 13 D8 C6 7C 40 3D 00 B0 13 \r
+D8 C6 7C B0 F0 FF F9 23 7C 40 3A 00 B0 13 D8 C6 \r
+7C 40 34 00 B0 13 D8 C6 02 4A 03 3C 32 C2 03 43 \r
+FF 3F 21 53 0A 16 10 01 C2 93 40 1E 20 20 D2 53 \r
+3F 1E D2 53 41 1E 5F 42 41 1E 5F 83 7F 90 12 00 \r
+04 28 F2 42 35 1E C2 43 41 1E F2 90 3A 00 3F 1E \r
+0A 20 F2 40 30 00 3F 1E D2 53 3E 1E D2 43 37 1E \r
+F2 40 07 00 35 1E F2 90 3A 00 3E 1E 51 20 D2 43 \r
+35 1E D2 43 36 1E 3F 40 30 00 C2 4F 3E 1E D2 53 \r
+3D 1E F2 90 3A 00 3D 1E 43 20 D2 53 35 1E C2 4F \r
+3D 1E D2 53 3C 1E F2 90 36 00 3C 1E 39 20 D2 53 \r
+35 1E C2 4F 3C 1E D2 53 3B 1E F2 90 3A 00 3B 1E \r
+2F 20 D2 53 35 1E C2 4F 3B 1E D2 53 3A 1E 5E 42 \r
+3A 1E 7E 90 32 00 1F 24 7E 90 36 00 21 20 D2 53 \r
+35 1E C2 4F 3A 1E D2 53 39 1E F2 90 3A 00 39 1E \r
+17 20 D2 53 35 1E C2 4F 39 1E D2 53 38 1E F2 90 \r
+32 00 38 1E 0D 20 B0 13 4A E8 D2 43 34 1E 5D 43 \r
+B0 13 10 A0 05 3C D2 43 40 1E 5D 43 B0 13 10 A0 \r
+B2 D0 20 00 8C 1C 10 01 4D 4D 1D 93 19 24 2D 93 \r
+2A 24 2D 92 54 20 82 43 18 1E B0 13 3C EA 7C 40 \r
+0B 00 4D 43 B0 13 02 E9 7C 40 09 00 4D 43 B0 13 \r
+02 E9 6C 43 4D 43 B0 13 1A AA 4D 43 80 00 02 E9 \r
+92 43 18 1E B0 13 4C DA B2 B0 40 00 08 1E 06 20 \r
+7C 40 09 00 5D 43 B0 13 02 E9 05 3C 7C 40 0B 00 \r
+5D 43 B0 13 02 E9 82 93 24 1E 29 24 B2 B0 40 00 \r
+08 1E 19 20 1C 42 20 1E B0 13 B0 E9 3C 90 10 27 \r
+0D 34 0C 93 0D 34 3C E3 1C 53 B0 13 02 AA 4D 43 \r
+B0 13 1A AA 5D 43 B0 13 02 E9 0B 3C 3C 40 0F 27 \r
+B0 13 F0 A9 06 3C 1C 42 20 1E 0C 93 EC 3B B0 13 \r
+F0 A9 7C 40 46 00 CD 0B 5E 43 80 00 70 AF 10 01 \r
+B0 13 02 AA 5D 43 B0 13 1A AA 4D 43 B0 13 02 E9 \r
+10 01 3C B0 00 80 0D 7D 3D E3 6E 42 7F 40 03 00 \r
+B0 13 FC B4 CB 0C 6C 43 10 01 B0 13 02 E9 7C 40 \r
+03 00 10 01 3A 14 31 80 12 00 B0 13 78 E9 B2 B0 \r
+40 00 08 1E 12 20 7C 40 09 00 5D 43 B0 13 02 E9 \r
+1C 42 20 1E B0 13 B0 E9 B0 13 FE AA 37 40 0C FE \r
+38 43 39 40 0F 27 0A 43 30 3C 7C 40 0B 00 5D 43 \r
+B0 13 02 E9 1E 42 20 1E 3E B0 00 80 0F 7F 3F E3 \r
+81 4E 0E 00 81 4F 10 00 37 40 9C FF 38 43 39 40 \r
+A0 0F 0A 43 1A 3C CF 07 CE 08 81 4E 00 00 81 49 \r
+02 00 81 4A 04 00 B1 40 16 00 06 00 F1 40 46 00 \r
+08 00 00 18 F1 40 02 E7 0A 00 CC 01 3C 50 0E 00 \r
+6D 42 7E 40 03 00 B0 13 B6 89 92 B3 08 1E 19 20 \r
+92 B3 76 1E E0 27 B2 B0 40 00 08 1E 06 20 1C 41 \r
+0E 00 B0 13 94 E9 B0 13 FE AA 1C 41 0E 00 1D 42 \r
+1A 1E 1E 42 1C 1E 1F 42 1E 1E B0 13 BA 93 A2 D2 \r
+8C 1C 82 43 76 1E 31 50 12 00 37 16 10 01 3C B0 \r
+00 80 0F 7F 3F E3 81 4C 12 00 81 4F 14 00 10 01 \r
+4D 4D 1D 93 14 24 2D 93 34 24 2D 92 63 20 82 43 \r
+D0 1E 6C 43 4D 43 B0 13 E6 AB 7C 40 0F 00 4D 43 \r
+B0 13 02 E9 7C 40 1F 00 4D 43 80 00 02 E9 92 43 \r
+D0 1E 7C 40 1F 00 5D 43 B0 13 02 E9 7C 40 0F 00 \r
+5D 43 B0 13 02 E9 B2 B0 40 00 08 1E 08 20 7C 40 \r
+1D 00 7D 40 46 00 5E 43 B0 13 66 C6 07 3C 7C 40 \r
+1D 00 7D 40 43 00 5E 43 B0 13 66 C6 4C 43 B0 13 \r
+9C BD B2 B0 40 00 08 1E 04 20 B0 13 0E EB CB 0C \r
+02 3C 1B 42 D2 1E 0B 93 05 38 6C 43 5D 43 B0 13 \r
+E6 AB 0B 3C 3B E3 1B 53 6C 43 4D 43 B0 13 02 E9 \r
+7C 40 03 00 5D 43 B0 13 02 E9 3B 90 E8 03 02 38 \r
+3B 40 E7 03 CC 0B 3C B0 00 80 0D 7D 3D E3 7E 40 \r
+03 00 5F 43 B0 13 FC B4 CD 0C 7C 40 49 00 5E 43 \r
+80 00 70 AF 10 01 B0 13 02 E9 7C 40 03 00 4D 43 \r
+B0 13 02 E9 10 01 5F 42 F2 1C 2F 83 03 24 1F 83 \r
+2C 24 10 01 D2 93 18 1D 16 24 E2 93 18 1D 5D 20 \r
+CF 0C 5F 02 1E 4F 1E 1D CF 0E 8F 10 C2 4F F3 1C \r
+C2 4E F4 1C 4C 4C 3E 40 F5 1C 7F 40 03 00 B0 13 \r
+CC AC FD 2B 10 01 1F 42 1A 1D 0F 5C CE 0F 8E 10 \r
+C2 4E F3 1C C2 4F F4 1C 4C 4C 3E 40 F5 1C 7F 40 \r
+03 00 B0 13 CC AC FD 2B 10 01 1F 42 08 1E 7F F0 \r
+C0 00 4F 5F 3E 40 7F 00 5E F2 30 1E 4E DF C2 4E \r
+F3 1C D2 42 31 1E F4 1C D2 42 32 1E F5 1C 1E 42 \r
+CE 1E CF 0E 8F 10 C2 4F F6 1C C2 4E F7 1C D2 42 \r
+CC 1E F8 1C D2 42 CB 1E F9 1C D2 42 E2 1E FA 1C \r
+D2 42 E3 1E FB 1C 1E 42 D2 1E CF 0E 8F 10 8F 11 \r
+C2 4F FC 1C C2 4E FD 1C 1E 42 20 1E CF 0E 8F 10 \r
+8F 11 C2 4F FE 1C C2 4E FF 1C 10 01 1E 53 CE 4C \r
+FF FF 5F 53 7F 90 13 00 10 01 0A 14 CA 0D 6A 92 \r
+1F 24 B2 B0 40 00 08 1E 10 20 5C 42 00 1E B0 13 \r
+9A E6 3E 40 12 14 3F 40 1F 3F B0 13 3A B7 B0 13 \r
+72 D7 4C 4C B0 13 96 AD 04 3C 5C 42 00 1E B0 13 \r
+96 AD 7C 40 47 00 5E 43 B0 13 70 AF 5A 93 1D 24 \r
+6A 92 37 20 7C 40 20 00 4D 43 B0 13 02 E9 7C 40 \r
+0A 00 4D 43 B0 13 A6 AD 4D 43 B0 13 A6 AD 4D 43 \r
+B0 13 02 E9 7C 40 0C 00 4D 43 B0 13 02 E9 7C 40 \r
+0E 00 4D 43 B0 13 02 E9 1C 3C 7C 40 20 00 B0 13 \r
+B0 AD B2 B0 40 00 08 1E 09 20 7C 40 0B 00 B0 13 \r
+B0 AD 7C 40 0C 00 B0 13 B0 AD 07 3C 7C 40 0A 00 \r
+5D 43 B0 13 A6 AD B0 13 B0 AD 7C 40 0E 00 B0 13 \r
+B0 AD 0A 16 10 01 0D 43 7E 40 03 00 5F 43 B0 13 \r
+FC B4 CD 0C 10 01 B0 13 02 E9 7C 40 0B 00 10 01 \r
+5D 43 B0 13 02 E9 10 01 0A 14 CA 0D 6A 92 3A 24 \r
+B2 B0 40 00 08 1E 18 20 1C 42 02 1E 1D 42 04 1E \r
+B0 13 44 E0 3E 40 83 86 3F 40 7E 3D B0 13 3A B7 \r
+B0 13 58 D4 3D 90 1E 00 04 28 11 20 3C 90 80 84 \r
+0E 2C B0 13 84 AE 17 3C 1C 42 02 1E 1D 42 04 1E \r
+3D 90 1E 00 09 28 03 20 3C 90 80 84 05 28 3C 40 \r
+3F 0D 3D 40 03 00 ED 3F 3E 40 0A 00 0F 43 B0 13 \r
+8E D0 B0 13 84 AE 7C 40 5A 00 5E 43 B0 13 70 AF \r
+5A 93 12 24 6A 92 24 20 7C 40 11 00 4D 43 B0 13 \r
+02 E9 7C 40 12 00 4D 43 B0 13 02 E9 7C 40 29 00 \r
+4D 43 B0 13 02 E9 14 3C B2 B0 40 00 08 1E 06 20 \r
+7C 40 12 00 5D 43 B0 13 02 E9 05 3C 7C 40 11 00 \r
+5D 43 B0 13 02 E9 7C 40 29 00 5D 43 B0 13 02 E9 \r
+0A 16 10 01 7E 40 06 00 7F 40 03 00 B0 13 FC B4 \r
+CD 0C 10 01 6A 14 31 80 06 00 C6 0C 09 43 3A 40 \r
+00 1C 7F 40 03 00 81 4F 00 00 2F 46 1F 93 06 24 \r
+0F 93 0B 20 58 46 02 00 C7 09 10 3C 5C 46 02 00 \r
+B0 13 F2 E3 C7 0C 07 93 02 20 0C 43 4D 3C 58 47 \r
+09 00 3F 40 03 00 0F 57 81 4F 02 00 24 43 0F 42 \r
+32 C2 03 43 1E 43 6E 9A 39 20 EA 42 00 00 02 4F \r
+3F 40 0B 00 0F 5A 6F 4F 3F F0 3F 00 4E 48 0F 9E \r
+2A 20 25 46 15 93 0E 20 78 90 3F 00 06 20 3F 40 \r
+03 00 0F 57 81 4F 04 00 05 3C 3F 40 07 00 0F 5A \r
+81 4F 04 00 1C 41 04 00 1D 41 02 00 2E 42 B0 13 \r
+2E E6 4C 4C 05 93 02 24 0C 93 0D 20 5F 4A 01 00 \r
+2E 41 4F 9E 08 2C 09 93 02 24 D9 43 00 00 81 4F \r
+00 00 C9 0A 04 3C DA 43 00 00 01 3C 02 4F 3A 50 \r
+23 00 14 83 BC 23 CC 09 31 50 06 00 64 16 10 01 \r
+4A 14 C9 0E 4C 4C 3C 80 46 00 53 24 1C 83 4C 24 \r
+1C 83 46 24 1C 83 41 24 1C 83 3B 24 3C 80 10 00 \r
+3C 90 09 00 55 2C 5C 06 00 18 50 4C 9E AF FC AF \r
+00 00 F6 AF 00 00 F2 AF 00 00 E8 AF 00 00 E0 AF \r
+00 00 DC AF 00 00 D4 AF 00 00 CC AF 00 00 C2 AF \r
+00 00 7A 40 03 00 78 40 22 00 2E 3C 6A 43 78 40 \r
+21 00 2A 3C 6A 43 78 40 23 00 26 3C 6A 42 F7 3F \r
+6A 43 78 40 25 00 20 3C 7A 40 03 00 78 40 24 00 \r
+1B 3C 6A 42 F0 3F 7A 40 05 00 E5 3F 7A 40 06 00 \r
+E6 3F 6A 43 78 40 1A 00 0F 3C 7A 40 03 00 FA 3F \r
+6A 43 78 40 1C 00 08 3C 7A 40 03 00 78 40 1B 00 \r
+03 3C 6A 42 78 40 1A 00 C7 0D 4A 4A 06 43 CC 08 \r
+4C 56 7D 47 CE 09 B0 13 66 C6 16 53 1A 83 F7 23 \r
+46 16 10 01 4A 14 21 83 C8 0D C7 0C 39 40 B9 1D \r
+CC 01 0D 43 1E 43 B0 13 72 ED 46 43 09 98 25 24 \r
+2F 43 6F 99 22 20 5A 49 09 00 7A 90 3E 00 1D 2C \r
+57 93 13 24 3C 40 03 00 0C 59 3D 40 03 00 0D 58 \r
+2E 42 B0 13 2E E6 0C 93 10 20 4F 4A CA 01 3A 50 \r
+E0 FF 0A 5F DA 43 00 00 08 3C C2 9A B6 1D 05 2C \r
+4A 4A CF 01 0F 8A DF 43 3D 00 39 50 0C 00 56 53 \r
+D5 27 CE 01 0F 43 4C 43 CE 93 00 00 04 24 1E 53 \r
+5C 53 FA 27 09 3C 67 93 04 20 7C 50 20 00 4F 4C \r
+03 3C 3F 40 3D 00 4F 8C 67 93 0B 24 5E 42 B7 1D \r
+0F 9E 12 38 5E 42 B6 1D 0F 9E 0F 20 D2 83 B6 1D \r
+0C 3C 5E 42 B6 1D 0E 9F 07 38 5E 42 B7 1D 0E 9F \r
+04 34 C2 4F B7 1D 01 3C 0F 43 C8 4F 09 00 CC 0F \r
+21 53 46 16 10 01 0A 14 CA 0C 5C 43 B0 13 D2 CE \r
+5C 43 6D 42 80 13 0E 1E 5C 43 5D 43 B0 13 26 97 \r
+1A 93 02 20 5F 43 01 3C 6F 43 C2 4F F2 1C C2 43 \r
+F3 1C C2 43 F4 1C C2 43 F5 1C 7C 40 17 00 6D 43 \r
+B0 13 02 E9 7C 40 18 00 6D 43 B0 13 02 E9 7C 40 \r
+19 00 6D 43 B0 13 02 E9 3C 40 00 20 B0 13 A0 CC \r
+B0 13 BA ED 82 4A EA 1C B2 40 10 0E EC 1C B0 13 \r
+A2 B8 4C 93 06 24 1A 93 02 20 B0 13 8A C3 B0 13 \r
+0C DA 82 43 EA 1C B0 13 E0 DF B0 13 0E EE 3C 40 \r
+00 20 B0 13 A0 CC C2 43 1D 02 82 43 76 1E 7C 40 \r
+17 00 6D 42 B0 13 02 E9 7C 40 18 00 6D 42 B0 13 \r
+02 E9 7C 40 19 00 6D 42 B0 13 02 E9 5C 43 B0 13 \r
+D2 CE 5C 43 6D 42 B0 13 26 97 92 D3 8C 1C 0A 16 \r
+10 01 0A 14 CA 0C 5D 93 05 24 6D 92 34 20 C2 43 \r
+CA 1E 31 3C C2 93 CA 1E 1A 20 5C 42 CB 1E B0 13 \r
+7A B2 03 20 B0 13 5A B2 02 3C B0 13 6A B2 5C 42 \r
+CC 1E B0 13 7A B2 03 20 B0 13 6A B2 02 3C B0 13 \r
+5A B2 B0 13 8E B2 5D 43 B0 13 02 E9 14 3C 1C 42 \r
+CE 1E 0D 43 6E 42 4F 43 B0 13 FC B4 CF 0C CC 0A \r
+7D 40 46 00 7E 40 5C 00 B0 13 9E B2 B0 13 8E B2 \r
+4D 43 B0 13 02 E9 0A 16 10 01 CC 0A 7D 40 48 00 \r
+7E 40 5E 00 B0 13 9E B2 10 01 CC 0A 7D 40 4A 00 \r
+7E 40 60 00 B0 13 9E B2 10 01 0D 43 6E 43 4F 43 \r
+B0 13 FC B4 CF 0C B2 B0 40 00 08 1E 10 01 CC 0A \r
+7D 40 1F 00 7E 40 29 00 B0 13 76 EF 10 01 B0 13 \r
+76 EF CD 0F 5E 43 B0 13 70 AF 10 01 1A 14 CA 0D \r
+C9 0C D2 93 78 1D 58 24 B0 13 F4 E1 1D 43 6D 59 \r
+CC 09 B0 13 7A DF 49 43 4A 93 37 24 5A 93 32 20 \r
+6A 42 16 3C 7C 40 36 00 B0 13 D8 C6 7C 40 3D 00 \r
+B0 13 D8 C6 7C B0 F0 FF F9 23 7C 40 3A 00 B0 13 \r
+D8 C6 4A 93 02 20 59 43 2B 3C B0 13 A6 EA 5A 83 \r
+7C 40 34 00 B0 13 D8 C6 A2 B3 30 0F FD 27 92 C3 \r
+32 0F 7C 40 35 00 B0 13 D8 C6 3C 40 19 00 B0 13 \r
+8C EA 92 B3 32 0F D6 27 92 C3 32 0F 92 B3 30 0F \r
+FD 27 0E 3C 32 C2 03 43 FF 3F 7C 40 35 00 B0 13 \r
+D8 C6 B2 B0 00 02 32 0F FC 27 B2 F0 FF FD 32 0F \r
+7C 40 3B 00 B0 13 D8 C6 F2 90 03 00 78 1D 02 20 \r
+B0 13 B4 EB CC 09 03 3C 32 C2 03 43 FF 3F 19 16 \r
+10 01 B2 40 23 5A 5C 01 B0 13 92 E4 F2 40 A5 00 \r
+21 01 F2 D0 80 00 20 01 C2 43 21 01 F2 D0 03 00 \r
+4A 02 92 C3 6C 01 B2 D0 0C 00 6C 01 82 43 66 01 \r
+B2 40 44 00 68 01 32 D0 40 00 82 43 60 01 B2 40 \r
+50 00 62 01 B2 40 6E 11 64 01 32 C0 40 00 1E 14 \r
+3D 40 41 D1 0E 43 1D 83 0E 73 FD 23 0D 93 FB 23 \r
+1D 16 00 3C B2 F0 F0 FF 6E 01 A2 C3 02 01 A2 B3 \r
+02 01 F8 23 32 C2 03 43 B2 40 52 2D C0 01 A2 43 \r
+C2 01 F2 40 0E 00 D7 01 F2 F0 7F 00 03 02 F2 D0 \r
+80 00 05 02 F2 40 11 00 CD 01 F2 40 12 00 CE 01 \r
+F2 40 13 00 CF 01 82 43 C0 01 32 D2 B0 13 12 E0 \r
+B0 13 3E EE B0 13 C6 E1 B0 13 A0 E3 B0 13 04 E5 \r
+B0 13 64 EC 80 00 04 C5 1A 14 CA 0C 5D 93 14 24 \r
+6D 92 47 20 4C 43 4D 43 B0 13 02 E9 C2 93 E0 1E \r
+06 20 7C 40 16 00 6D 42 B0 13 02 E9 3A 3C 7C 40 \r
+16 00 7D 40 03 00 F8 3F B2 B0 40 00 08 1E 10 20 \r
+5C 42 E2 1E B0 13 26 EB CF 0C CC 0A B0 13 EC B4 \r
+4C 4F B0 13 D6 B4 5C 42 E2 1E B0 13 CC E9 06 3C \r
+B0 13 EC B4 5C 42 E2 1E B0 13 D6 B4 CC 0A 7D 40 \r
+48 00 7E 40 5E 00 B0 13 76 EF C9 0C 5C 42 E3 1E \r
+B0 13 D6 B4 CC 0A 7D 40 1E 00 7E 40 28 00 B0 13 \r
+76 EF 5D 43 B0 13 02 E9 7C 40 16 00 6D 43 B0 13 \r
+02 E9 19 16 10 01 0D 43 6E 43 4F 43 B0 13 FC B4 \r
+CD 0C CC 09 5E 43 B0 13 70 AF 10 01 7D 40 4A 00 \r
+7E 40 60 00 B0 13 76 EF C9 0C 10 01 4A 14 C7 0F \r
+C6 0E C9 0C CA 0D C8 06 3C 40 E2 1C 3D 40 12 F5 \r
+3E 40 07 00 B0 13 60 ED 48 93 4E 24 78 92 4C 2C \r
+0A 93 1E 20 39 90 B5 00 1B 2C 78 90 03 00 0D 2C \r
+CD 09 59 02 0D 59 4F 48 0D 8F 3D 50 DB F0 4E 48 \r
+3C 40 E2 1C B0 13 60 ED 22 3C 4C 46 3C 50 DF 1C \r
+CD 09 59 02 0D 59 3D 50 D8 F0 3E 40 03 00 F2 3F \r
+CC 09 CD 0A 3E 40 0A 00 0F 43 B0 13 8E D0 7E 50 \r
+30 00 4F 46 CF 4E E1 1C CC 09 CD 0A 3E 40 0A 00 \r
+0F 43 B0 13 8E D0 C9 0C CA 0D 56 83 E9 23 3F 40 \r
+E2 1C 4D 43 08 3C 47 93 04 24 FF 40 20 00 00 00 \r
+57 83 1F 53 5D 53 3E 40 30 00 6E 9F 05 20 4E 48 \r
+1E 83 4C 4D 0C 9E EF 3B 3C 40 E2 1C 46 16 10 01 \r
+31 80 0E 00 CE 01 3D 40 00 18 4F 43 1E 53 FE 4D \r
+FF FF 5F 53 7F 90 0D 00 F9 2B F1 93 00 00 39 24 \r
+5F 41 01 00 C2 4F 16 1E 3F 90 15 00 05 38 3F 90 \r
+EC 00 02 34 C2 43 16 1E 5F 41 02 00 47 18 0F 5F \r
+5E 41 03 00 0E 5F 82 4E D4 1E 5F 41 04 00 47 18 \r
+0F 5F 5E 41 05 00 0E 5F 82 4E A2 1E D2 41 06 00 \r
+12 1D D2 41 07 00 13 1D D2 41 08 00 14 1D D2 41 \r
+09 00 15 1D F1 93 0C 00 08 24 5F 41 0A 00 47 18 \r
+0F 5F 5E 41 0B 00 0E 5F 01 3C 0E 43 82 4E 22 1E \r
+16 3C E2 42 16 1E B2 40 06 FF D4 1E B2 40 F6 FF \r
+A2 1E F2 40 79 00 12 1D F2 40 56 00 13 1D F2 40 \r
+34 00 14 1D F2 40 12 00 15 1D 82 43 22 1E 31 50 \r
+0E 00 10 01 0A 14 CA 0C 1F 42 44 1E 8F 93 02 00 \r
+10 20 8F 93 00 00 0D 20 C2 93 49 1E 0A 24 5E 42 \r
+49 1E 3E 50 64 00 5D 42 DA 1E 0D 9E 02 34 4C 43 \r
+42 3C BF 40 00 70 08 00 5C 42 51 1E 1D 42 4E 1E \r
+1E 42 50 1E 3D F3 3E F0 FF 00 3F 40 00 08 B0 13 \r
+82 D5 1C 52 D8 1E 1F 42 44 1E 8F 4C 0A 00 1F 42 \r
+44 1E 9F 42 D8 1E 0C 00 1F 42 44 1E CF 43 14 00 \r
+1F 42 44 1E CF 43 15 00 1F 42 44 1E 8F 93 02 00 \r
+05 20 8F 93 00 00 02 20 EF D2 1A 00 1D 42 44 1E \r
+1E 42 4E 1E 1F 42 50 1E 3E F3 3F F0 FF 00 8D 4E \r
+00 00 8D 4F 02 00 1F 42 44 1E 9F 43 18 00 CC 0A \r
+B0 13 F6 C0 5C 43 0A 16 10 01 3A 14 07 4F 07 ED \r
+0A 4F 5A 02 8A 10 4A 4A 0A 93 49 24 7F D0 80 00 \r
+0B 4D 5B 02 8B 10 4B 4B 0B 93 3F 24 7D D0 80 00 \r
+0B 5A 3B 80 7F 00 08 43 09 43 0E 93 09 24 1A 43 \r
+5E 00 02 28 08 5C 09 6D 59 00 58 00 5A 02 F8 2B \r
+0E 43 1A 43 5F 00 02 28 08 5C 09 6D 59 00 58 00 \r
+5E 00 3E B0 00 10 02 24 3E D0 00 20 4A 5A F2 23 \r
+49 93 02 34 1B 53 03 3C 0E 6E 08 68 49 69 3E B0 \r
+00 80 07 24 08 63 49 63 0B 63 3E B0 00 60 01 20 \r
+18 C3 1B 93 0C 38 3B 90 FF 00 0C 34 49 59 8B 10 \r
+09 DB 57 02 59 00 0D 49 0C 48 37 16 10 01 0C 43 \r
+0D 43 FB 3F 3D 40 FF FE 3C 43 57 02 5D 00 F5 3F \r
+CF 0D CD 0E CE 0C C2 93 D1 1D 06 20 B0 13 DC EC \r
+4C 93 02 20 2C 43 10 01 2E 83 2C 24 1E 83 43 24 \r
+2E 83 20 24 1E 83 3B 24 3E 80 03 00 34 24 1E 83 \r
+30 20 0E 43 8D 93 00 00 09 20 0F 93 2A 20 1C 4D \r
+02 00 1D 4D 04 00 B0 13 A8 ED 31 3C 1C 43 2C 9D \r
+20 20 0F 93 1E 20 1C 4D 02 00 1D 4D 04 00 B0 13 \r
+96 ED 25 3C 3F B0 FE FF 14 20 CC 0F B0 13 04 EA \r
+CE 0C 1D 3C 3F 90 03 00 07 24 2F 93 0A 20 CC 0D \r
+B0 13 38 E1 CE 0C 13 3C CC 0D B0 13 36 D2 CE 0C \r
+0E 3C 2E 43 0C 3C B0 13 B6 F0 CE 0C 08 3C B0 13 \r
+BA F0 CE 0C 04 3C CC 0F B0 13 2C CF CE 0C CC 0E \r
+10 01 0A 14 31 80 06 00 B0 13 EE ED 2E 42 CF 01 \r
+1F 53 3D 40 12 1D 1F 53 FF 4D FF FF 1E 83 FB 23 \r
+3C 40 05 00 0D 43 CE 01 1E 53 B0 13 F0 B7 D2 43 \r
+F0 1C 4A 43 B0 13 20 E2 0C 93 08 24 B0 13 38 B9 \r
+1A 2C F2 B0 20 00 F0 1C F5 27 1F 3C E1 43 00 00 \r
+3C 40 03 00 3D 40 0A 00 CE 01 B0 13 F0 B7 4A 43 \r
+B0 13 AA F0 0C 93 04 20 E2 43 F0 1C 5C 43 10 3C \r
+B0 13 38 B9 06 28 C2 43 D1 1D E2 42 F0 1C 4C 43 \r
+07 3C F2 B0 20 00 F0 1C EB 27 C2 43 D1 1D 4C 43 \r
+31 50 06 00 0A 16 10 01 3C 40 E8 03 B0 13 FE ED \r
+B2 40 2B 5A 5C 01 CF 0A 1A 43 4A 5F 7F 90 0B 00 \r
+10 01 92 93 EA 1C 1C 24 C2 93 31 1D 0B 20 F2 B0 \r
+F0 FF F2 1C 04 20 32 D0 D8 00 03 43 34 3C F2 40 \r
+05 00 31 1D D2 83 31 1D 04 20 F2 F0 0F 00 F2 1C \r
+2A 3C 3C 40 D7 03 B0 13 A0 CC F2 D2 F0 1C 23 3C \r
+3C 40 A3 00 B0 13 A0 CC B2 B2 0A 1E 1C 24 F2 B0 \r
+20 00 01 02 18 24 B2 C2 0A 1E B0 13 4C E3 D2 53 \r
+31 1D 5F 42 31 1D 5F 83 6F 93 0D 28 C2 43 31 1D \r
+D2 42 59 1E F3 1C D2 42 5A 1E F4 1C D2 42 5B 1E \r
+F5 1C F2 D2 F0 1C B2 B0 10 00 8C 1C 0A 24 5C 43 \r
+6D 43 B0 13 26 97 B2 F0 EF FF 8C 1C B2 40 2B 5A \r
+5C 01 10 01 1A 14 21 82 39 40 CB 00 3C 40 00 40 \r
+B0 13 A0 CC 3C 40 03 00 3D 40 05 00 0E 43 B0 13 \r
+F0 B7 D1 43 02 00 C1 49 03 00 CC 01 2C 53 6D 43 \r
+B0 13 40 CA 3C 40 03 00 3D 42 0E 43 B0 13 F0 B7 \r
+3C 40 0A 00 B0 13 FE ED CC 01 B0 13 CA D5 0C 93 \r
+18 20 C1 93 00 00 F8 27 B0 13 1E 9B 4A 43 5A 92 \r
+17 1D F2 2F 3C 40 0A 00 B0 13 FE ED 4C 4A B0 13 \r
+F6 AB 3C 40 F2 1C 7D 40 13 00 B0 13 40 CA 5A 53 \r
+EE 3F 3C 40 03 00 2D 42 0E 43 B0 13 F0 B7 B2 40 \r
+2B 5A 5C 01 F2 B0 20 00 F0 1C B8 27 C2 43 D1 1D \r
+21 52 19 16 10 01 1A 14 21 82 CA 0C F2 B0 40 00 \r
+01 02 3C 24 B0 13 0C D4 82 4C 1E 1E B0 13 D8 CB \r
+81 4C 00 00 81 4D 02 00 4A 93 03 20 B0 13 22 BB \r
+27 3C 2C 41 1D 41 02 00 B0 13 44 E0 3E 40 CD CC \r
+3F 40 4C 3E B0 13 3A B7 C9 0C CA 0D 1C 42 1A 1E \r
+1D 42 1C 1E B0 13 44 E0 3E 40 CD CC 3F 40 4C 3F \r
+B0 13 3A B7 CE 0C CF 0D CC 09 CD 0A B0 13 E6 9E \r
+B0 13 58 D4 81 4C 00 00 81 4D 02 00 B0 13 22 BB \r
+1E 42 1E 1E B0 13 00 80 82 4C 20 1E 21 52 19 16 \r
+10 01 1C 41 04 00 1D 41 06 00 82 4C 1A 1E 82 4D \r
+1C 1E 10 01 5C 43 B0 13 D2 CE 5C 43 6D 42 80 13 \r
+0E 1E B0 13 E0 DF B0 13 4C DA B0 13 3C EA 4C 43 \r
+B0 13 9C BD 7C 40 17 00 6D 43 B0 13 02 E9 7C 40 \r
+18 00 6D 43 B0 13 02 E9 7C 40 19 00 6D 43 B0 13 \r
+02 E9 3C 40 00 20 B0 13 A0 CC B0 13 BA ED B2 40 \r
+03 00 EA 1C B2 40 10 0E EC 1C B0 13 A2 B8 4C 93 \r
+02 24 B0 13 F4 B9 82 43 EA 1C B0 13 0E EE 3C 40 \r
+00 20 B0 13 A0 CC C2 43 1D 02 82 43 76 1E 7C 40 \r
+17 00 6D 42 B0 13 02 E9 7C 40 18 00 6D 42 B0 13 \r
+02 E9 7C 40 19 00 6D 42 B0 13 02 E9 92 D3 8C 1C \r
+10 01 5A 14 C6 0F C7 0E C5 0D C9 0C 18 41 1C 00 \r
+C7 43 00 00 B0 13 94 AE CA 0C 0A 93 02 20 2C 42 \r
+3C 3C 1F 43 2F 99 02 24 09 43 09 3C 5C 49 02 00 \r
+B0 13 F2 E3 C9 0C 09 93 02 20 2C 43 2E 3C 5E 4A \r
+02 00 7E 80 0B 00 C7 4E 00 00 3D 40 0E 00 0D 5A \r
+4E 4E CC 05 B0 13 60 ED 09 93 06 24 D9 4A 21 00 \r
+07 00 D9 4A 22 00 08 00 06 93 07 24 3D 40 07 00 \r
+0D 5A CC 06 2E 42 B0 13 60 ED 08 93 06 24 3F 40 \r
+07 00 5F FA 0C 00 C8 4F 00 00 5D 4A 01 00 5C 43 \r
+B0 13 4C E2 CA 43 00 00 0C 43 55 16 10 01 4F 43 \r
+4C 93 2D 24 5C 93 20 24 6C 93 13 24 7C 90 03 00 \r
+2A 20 A2 D2 22 03 A2 C2 24 03 B2 C2 22 03 B0 13 \r
+CE F0 B0 13 FC BC 1F 42 20 03 6F F2 B2 C2 22 03 \r
+1A 3C A2 D2 24 03 B0 13 EA BC B0 13 FC BC A2 D2 \r
+22 03 B0 13 CE F0 0F 3C A2 D2 24 03 B2 C2 22 03 \r
+A2 D2 22 03 B0 13 CE F0 B0 13 E0 BC 04 3C A2 D2 \r
+24 03 B0 13 E0 BC 4C 43 4F 93 01 20 5C 43 10 01 \r
+B0 13 FC BC B0 13 EA BC 10 01 A2 C2 22 03 B0 13 \r
+CE F0 B2 C2 22 03 B0 13 CE F0 10 01 B2 D2 22 03 \r
+B0 13 CE F0 10 01 1A 14 CB 0C 7B 90 BD 00 07 24 \r
+4C 43 7B 90 31 00 40 28 7B 90 3D 00 3D 2C 0A 42 \r
+32 C2 03 43 B2 F0 BF FF 02 0F B2 B0 10 00 02 0F \r
+FC 27 7B 90 3D 00 26 2C 4C 43 B0 13 CA EB C9 0C \r
+4C 43 7D 40 29 00 B0 13 28 DD C2 4B 11 0F A2 B2 \r
+30 0F 13 24 7B 90 32 00 10 24 7B 90 39 00 0D 24 \r
+7B 90 38 00 0A 24 A2 B2 30 0F FD 23 0D 14 3D 40 \r
+BF 0C 1D 83 FE 23 0D 16 03 43 4C 43 CD 09 B0 13 \r
+28 DD 03 3C F2 40 BD 00 11 0F 5C 42 21 0F B2 B0 \r
+40 00 02 0F FC 27 02 4A 19 16 10 01 0A 14 21 82 \r
+CA 0C 0C 43 3D 40 00 08 3E 40 0A 00 B0 13 70 C9 \r
+0D 43 3E 40 07 0D 0F 43 B0 13 46 E7 3C 80 B9 65 \r
+3D 70 5E 00 3E 40 00 08 0F 43 B0 13 CC D9 81 4C \r
+00 00 81 4D 02 00 1E 42 D4 1E 3E B0 00 80 0F 7F \r
+3F E3 81 5E 00 00 81 6F 02 00 5A 93 1A 20 1E 42 \r
+D2 1E 3E B0 00 80 0F 7F 3F E3 1F 91 02 00 0D 38 \r
+02 20 2E 91 0A 28 81 9F 02 00 04 38 0C 20 81 9E \r
+00 00 09 2C 92 83 D2 1E 06 3C 1E 53 82 4E D2 1E \r
+02 3C A2 41 D2 1E B2 D0 40 00 8C 1C 21 52 0A 16 \r
+10 01 4C 43 B0 13 C2 E5 0C 93 42 24 1C 83 42 20 \r
+B0 13 5C F0 4C 4C C2 4C FA 1D B0 13 AA E7 C2 4C \r
+00 1E B0 13 8A E7 0D 43 82 4C 02 1E 82 4D 04 1E \r
+5C 42 FA 1D 7C 90 41 00 28 28 1D 42 F8 1D 0D 93 \r
+24 24 4C 4C 3C 80 3C 00 B0 13 38 EC CF 0C 44 19 \r
+0F 10 D2 93 F6 1D 03 20 46 19 0C 10 0F 8C CD 0F \r
+0E 43 1D 52 FC 1D 1E 62 FE 1D 3E 90 EB 0B 04 28 \r
+08 20 3D 90 01 C2 05 2C 82 5F FC 1D 82 63 FE 1D \r
+04 3C 82 43 FC 1D 82 43 FE 1D 92 43 F0 1D 10 01 \r
+80 00 EE D4 10 01 3A 14 07 4F 07 ED 0A 4F 5A 02 \r
+8A 10 4A 4A 0A 93 38 24 7F D0 80 00 0B 4D 5B 02 \r
+8B 10 4B 4B 0B 93 2B 24 7D D0 80 00 0B 8A 3B 50 \r
+7F 00 3A 40 18 00 08 43 09 43 0C 8E 0D 7F 03 2C \r
+0C 5E 0D 6F 12 C3 08 68 09 69 5C 02 0D 6D 1A 83 \r
+F4 23 49 93 03 30 1A 53 1B 83 EF 3F 0C 7E 0D 7F \r
+08 63 49 63 0B 63 1B 93 0C 38 3B 90 FF 00 0C 34 \r
+49 59 8B 10 09 DB 57 02 59 00 0D 49 0C 48 37 16 \r
+10 01 0C 43 0D 43 FB 3F 3C 40 FF FE 3D 43 57 02 \r
+5D 00 F5 3F 2A 14 21 83 C9 0C 3F 40 0B 00 0F 59 \r
+68 4F 3A 40 3F 00 4A F8 3C 40 07 00 0C 59 1D 42 \r
+64 1E 2E 42 B0 13 2E E6 0C 93 2D 24 78 B0 40 00 \r
+2A 20 4A 93 10 24 7A 90 07 00 0D 2C 4A 4A 5A 06 \r
+00 18 5F 4A 90 F6 2C 43 0C 59 4F 13 1C 93 1B 20 \r
+D9 43 00 00 1A 3C 7A 90 3F 00 03 24 7A 90 20 00 \r
+12 28 2C 43 0C 59 CD 01 B0 13 E0 BF 4C 93 0B 24 \r
+D9 43 00 00 00 18 C2 93 68 1E 07 24 6C 41 80 13 \r
+68 1E 4C 93 02 24 C9 43 00 00 21 53 28 16 10 01 \r
+4A 14 C7 0D C8 0C 39 40 B9 1D 3A 40 3F 00 5A F8 \r
+09 00 26 43 2F 43 6F 99 32 20 5A 99 09 00 2F 20 \r
+7A 90 3F 00 0B 24 3C 40 03 00 0C 59 3D 40 05 00 \r
+0D 58 2E 42 B0 13 2E E6 0C 93 21 20 D7 49 0B 00 \r
+00 00 57 43 7A 90 3F 00 16 24 3F 40 0A 00 0F 58 \r
+6F 4F 7F B0 80 FF 0A 20 7F B2 0D 24 D9 98 0B 00 \r
+02 00 02 20 C9 43 02 00 47 43 05 3C 5D 49 0A 00 \r
+CC 08 B0 13 88 C4 B0 13 CE EE CC 07 05 3C 39 50 \r
+0C 00 16 83 C7 23 4C 43 46 16 10 01 4A 14 C9 0F \r
+C7 0E C6 0D CA 0C 6C 43 B0 13 7C C5 C8 0C 08 93 \r
+02 20 0C 43 36 3C CF 07 7F 50 0B 00 C8 4F 02 00 \r
+3E 40 0B 00 0E 58 3F 40 80 00 6F FE 4F DA CE 4F \r
+00 00 D8 42 62 1E 0D 00 D2 53 62 1E FD 27 F8 F0 \r
+BF 00 0C 00 5F 48 0C 00 7F F0 F8 00 4F D9 C8 4F \r
+0C 00 F8 F0 7F 00 0C 00 F8 C2 0C 00 FE F0 7F 00 \r
+00 00 3C 40 0E 00 0C 58 4E 47 CD 06 B0 13 60 ED \r
+3C 40 07 00 0C 58 1D 42 64 1E 2E 42 B0 13 60 ED \r
+CC 08 46 16 10 01 1F 42 44 1E CF 43 11 00 1F 42 \r
+44 1E DF 42 51 1E 13 00 1F 42 44 1E 5E 42 D8 1E \r
+5E 8F 0C 00 CF 4E 16 00 1F 42 44 1E 5E 4F 16 00 \r
+8E 11 8F 5E 0A 00 1F 42 44 1E DF 5F 16 00 15 00 \r
+1F 42 44 1E DF 42 DA 1E 12 00 1F 42 44 1E FF 92 \r
+12 00 02 2C FF 42 12 00 1F 42 44 1E 9F 42 52 1E \r
+04 00 9F 42 54 1E 06 00 1F 42 44 1E DF 42 56 1E \r
+0E 00 1F 42 44 1E EF B2 1A 00 03 20 4D 43 B0 13 \r
+4C D9 B0 13 1A CE D2 C3 D6 1E 10 01 1E 42 44 1E \r
+5F 4E 15 00 8F 11 3F 90 40 00 10 34 3F 90 C1 FF \r
+19 34 FE 50 40 00 15 00 1F 42 44 1E 9F 83 08 00 \r
+1F 42 44 1E 5F 4F 15 00 8F 11 0C 3C FE 80 40 00 \r
+15 00 1F 42 44 1E 9F 53 08 00 1F 42 44 1E 5F 4F \r
+15 00 8F 11 1E 42 44 1E CE 5F 14 00 1E 42 44 1E \r
+5F 4E 14 00 8F 11 3F 90 40 00 0B 34 3F 90 C1 FF \r
+0F 34 FE 50 40 00 14 00 1F 42 44 1E 9F 83 0A 00 \r
+10 01 FE 80 40 00 14 00 1F 42 44 1E 9F 53 0A 00 \r
+10 01 4F 14 1F 42 6E 03 2F 83 36 24 2F 83 27 24 \r
+2F 83 03 24 2F 83 1A 24 31 3C B2 F0 EF FF 48 03 \r
+92 C3 48 03 82 93 50 03 02 20 0F 43 05 3C 1F 42 \r
+50 03 1F 92 50 03 FB 23 1F 52 C0 1E 82 4F 58 03 \r
+B2 D0 10 00 48 03 80 13 BC 1E 18 3C B2 F0 EF FF \r
+4A 03 92 C3 4A 03 B2 D0 80 00 08 1E 0F 3C B2 F0 \r
+EF FF 46 03 92 C3 46 03 B0 13 B4 DC B2 D0 10 00 \r
+46 03 B0 13 48 A8 02 3C B0 13 00 DC B1 C0 D0 00 \r
+14 00 4B 16 00 13 0A 14 CA 0D 4C 4C 3C 90 07 00 \r
+0E 34 3C 90 06 00 2F 24 1C 83 30 24 1C 83 14 24 \r
+1C 83 2C 24 1C 83 27 24 1C 83 28 24 2A 3C 3C 80 \r
+07 00 2C 93 23 28 2C 83 1E 24 1C 83 1F 24 1C 83 \r
+1A 24 1C 83 1B 24 1D 3C 3A B0 03 00 0E 20 CC 0A \r
+3D 40 64 00 B0 13 22 EC 0E 93 0A 20 CC 0A 3D 40 \r
+90 01 B0 13 22 EC 0E 93 03 24 7C 40 1C 00 0A 3C \r
+7C 40 1D 00 07 3C 7C 40 1E 00 04 3C 7C 40 1F 00 \r
+01 3C 4C 43 0A 16 10 01 3C 40 B5 1D 0D 43 3E 40 \r
+1C 00 B0 13 72 ED E2 43 B5 1D F2 40 3D 00 B6 1D \r
+F2 40 20 00 B7 1D D2 43 B8 1D B0 13 76 E5 B0 13 \r
+2A E8 B0 13 E8 E9 B0 13 E6 EF B0 13 1A E4 B0 13 \r
+DC EF B0 13 08 E1 3F 40 B9 1D CF 43 00 00 3F 50 \r
+0C 00 CF 43 00 00 C2 93 C5 1D 15 20 E2 43 C5 1D \r
+F2 40 03 00 C6 1D 7F 40 3F 00 C2 4F CE 1D C2 4F \r
+CF 1D F2 43 D0 1D B0 13 98 F0 CD 0C 3C 40 C8 1D \r
+2E 42 B0 13 60 ED 0C 43 10 01 F2 D0 A9 00 C1 05 \r
+F2 D0 80 00 C0 05 F2 40 1E 00 C6 05 C2 43 C7 05 \r
+D2 C3 C0 05 F2 F0 DF 00 19 02 F2 F0 DF 00 05 02 \r
+F2 F0 DF 00 04 02 F2 D0 20 00 06 02 F2 D0 E0 00 \r
+0A 02 A2 D3 22 03 92 D3 22 03 3C 40 47 01 B0 13 \r
+A0 CC F2 F0 DF 00 1D 02 F2 D0 20 00 1B 02 6C 42 \r
+6D 43 B0 13 0C CB 6C 42 7D 40 0A 00 B0 13 0C CB \r
+6C 42 6D 42 B0 13 0C CB 3C 40 A3 00 B0 13 A0 CC \r
+6C 43 7D 40 82 00 80 00 0C CB 7C 40 36 00 B0 13 \r
+06 BD F2 B0 10 00 D6 1E 27 24 7C 40 0A 00 5D 42 \r
+98 1E B0 13 28 DD F2 90 7F 00 99 1E 07 38 7C 40 \r
+0C 00 7D 40 0C 00 B0 13 28 DD 06 3C 7C 40 0C 00 \r
+5D 42 99 1E B0 13 28 DD F2 B2 D6 1E 07 20 7C 40 \r
+12 00 7D 40 11 00 B0 13 28 DD 06 3C 7C 40 12 00 \r
+7D 40 15 00 B0 13 28 DD 7C 40 34 00 B0 13 06 BD \r
+B2 F0 FE FD 32 0F B2 F0 FE FD 32 0F B2 D0 01 02 \r
+36 0F A2 43 C4 1E 10 01 1A 14 31 80 22 00 C9 0D \r
+5A 4C 0B 00 3F 40 CF 00 5F F1 0A 00 5F D2 66 1E \r
+7F F0 BF 00 C1 4F 0A 00 3D 40 05 00 0D 5C CC 01 \r
+1C 53 2E 42 B0 13 60 ED CC 01 3C 50 05 00 1D 42 \r
+64 1E 2E 42 B0 13 60 ED 3D 40 C0 00 5D F1 09 00 \r
+4D D9 F1 40 0B 00 00 00 C1 4A 0B 00 3F 40 70 00 \r
+5F F1 0A 00 7F D0 0B 00 C1 4F 0A 00 7D F0 3F 00 \r
+C1 4D 09 00 CC 01 4D 43 B0 13 AC B2 31 50 22 00 \r
+19 16 10 01 21 82 F2 F0 BF 00 05 02 F2 F0 BF 00 \r
+19 02 B2 D0 0C 00 22 03 B2 D0 0C 00 24 03 C2 43 \r
+76 1D 3C 40 CC 0C B0 13 A0 CC 7C 40 06 00 5D 43 \r
+B0 13 36 D0 C1 4C 00 00 3C 40 CC 0C B0 13 A0 CC \r
+7C 40 07 00 4D 43 B0 13 4A C7 C1 4C 01 00 D1 B3 \r
+01 00 12 20 C1 93 01 00 0F 24 7C 40 7F 00 4D 43 \r
+B0 13 4A C7 C1 4C 02 00 D1 93 02 00 03 24 C2 43 \r
+76 1D 02 3C D2 43 76 1D 21 52 10 01 2A 14 5C 93 \r
+03 20 3F 40 00 1C 02 3C 3F 40 46 1C 2D 43 08 43 \r
+CB 08 4E 43 79 40 03 00 CF 93 00 00 06 20 6C 93 \r
+02 20 CC 0F 24 3C CB 0F 0C 3C 5C 93 0A 20 5E 53 \r
+2A 42 6A 9F 06 24 5A 4F 01 00 4A 99 02 2C C8 0F \r
+C9 0A 3F 50 23 00 1D 83 E7 23 0B 93 0C 20 08 93 \r
+02 20 0C 43 0C 3C CB 08 5D 4B 01 00 B0 13 4C E2 \r
+EB 43 01 00 03 3C 5E 53 CB 4E 01 00 CC 0B 28 16 \r
+10 01 3C 40 10 00 3D 40 00 0A 3E 40 0B 00 B0 13 \r
+70 C9 5C 06 3D 40 29 00 B0 13 22 EC 1F 42 A2 1E \r
+0F 5C 3F 90 69 01 03 2C 1C 42 A0 1E 03 3C 1C 42 \r
+A0 1E CF 0C 5C 06 0C 5F 5C 02 3D 40 0A 00 B0 13 \r
+22 EC 82 4C A0 1E 3C 90 F0 00 08 28 B2 F0 DF FF \r
+08 1E 7C 42 4D 43 B0 13 02 E9 07 3C B2 D0 20 00 \r
+08 1E 7C 42 5D 43 B0 13 02 E9 B2 D2 8C 1C B2 D0 \r
+80 00 8C 1C 10 01 1A 14 CF 0E CA 0C 7A 90 1A 00 \r
+31 28 7A 90 2A 00 2E 2C 4E 4A 5E 02 1C 4E 8E 1C \r
+4E 4A 5E 4E FE F5 7D 90 30 00 05 2C 7D 90 2D 00 \r
+05 20 6B 43 08 3C 7D 90 5B 00 02 28 4B 43 03 3C \r
+4B 4D 5B 4B A2 F5 7A 90 21 00 11 28 C9 0B 43 18 \r
+49 59 43 19 4B 10 4B D9 7A 90 21 00 08 20 7D 90 \r
+31 00 03 24 7D 90 4C 00 02 20 7B 40 80 00 CD 0B \r
+B0 13 BC CD 19 16 10 01 0A 14 CE 0C 0B 42 32 C2 \r
+03 43 B2 F0 BF FF 02 0F B2 B0 10 00 02 0F FC 27 \r
+7E 90 31 00 23 28 7E 90 3D 00 20 2C 4C 43 B0 13 \r
+2C D7 CA 0C 4C 43 7D 40 29 00 B0 13 46 DF C2 4E \r
+11 0F A2 B2 30 0F 0D 24 7E 90 32 00 0A 24 7E 90 \r
+38 00 07 24 A2 B2 30 0F FD 23 3C 40 F8 02 B0 13 \r
+8C EA 4C 43 CD 0A B0 13 46 DF 02 3C C2 4E 11 0F \r
+5C 42 21 0F 02 4B 0A 16 10 01 0A 14 CB 0D CA 0C \r
+4C 43 B0 13 6E BC 7C 40 22 00 B0 13 AC C7 0C 24 \r
+CC 0A B0 13 AC C7 08 24 5C 43 B0 13 6E BC 7C 40 \r
+23 00 B0 13 AC C7 02 20 0C 43 16 3C 5B 93 05 24 \r
+4C 43 B0 13 88 D2 4D 4C 0B 3C 5C 43 B0 13 88 D2 \r
+4C 4C 4D 4C 8D 10 4C 43 B0 13 88 D2 4C 4C 0D DC \r
+6C 43 B0 13 6E BC CC 0D 0A 16 10 01 B0 13 0A D9 \r
+7C 40 03 00 B0 13 6E BC 4C 93 10 01 7C 40 36 00 \r
+B0 13 06 BD 4C 43 3D 40 28 F6 7E 40 27 00 B0 13 \r
+FC D7 7C 40 2C 00 7D 40 88 00 B0 13 28 DD 7C 40 \r
+2D 00 7D 40 31 00 B0 13 28 DD 7C 40 2E 00 7D 40 \r
+09 00 B0 13 28 DD 7C 40 36 00 B0 13 06 BD 7C 40 \r
+33 00 B0 13 06 BD 7C 40 3D 00 B0 13 06 BD 7C B0 \r
+70 00 F9 23 7C 40 36 00 B0 13 06 BD 82 43 C4 1E \r
+B2 D0 01 02 34 0F 82 43 32 0F 10 01 B2 40 0A F3 \r
+E6 1E B2 40 88 F3 E4 1E 00 18 D2 42 12 F3 0E 1E \r
+00 18 D2 42 90 F3 12 1E 82 43 76 1E 82 43 08 1E \r
+82 43 0A 1E 82 43 8C 1C 82 43 0C 1E 92 D3 8C 1C \r
+B2 D0 40 00 08 1E B0 13 C0 B5 B0 13 76 E6 B0 13 \r
+04 ED B0 13 6E EB B0 13 FA EF B0 13 4A E8 B0 13 \r
+8C D9 B0 13 A6 EE B0 13 D0 DD B0 13 04 F0 B0 13 \r
+0E F0 B0 13 CC ED 80 00 F2 C5 4C 4C C2 93 93 1E \r
+02 20 4C 43 10 01 41 18 4C 5C 4C 4C F2 F0 DF 00 \r
+06 02 A2 C3 22 03 5F 42 CC 05 C2 4C CE 05 3F 40 \r
+E8 03 D2 B3 DD 05 03 20 1F 83 FB 23 18 3C 0F 93 \r
+16 24 5F 42 CC 05 C2 43 CE 05 3F 40 E8 03 D2 B3 \r
+DD 05 03 20 1F 83 FB 23 0A 3C 0F 93 08 24 5C 42 \r
+CC 05 A2 D3 22 03 F2 D0 20 00 06 02 10 01 C2 43 \r
+93 1E 4C 43 10 01 0A 14 CA 0D CB 0C 7B 93 02 24 \r
+CF 0B 02 3C 4B 43 4F 43 4E 4B 4F 4F 0F 8E 1F 53 \r
+4C 4B 3D 40 1C 00 B0 13 38 EC 1C 52 D4 F6 4A 93 \r
+09 24 8C 43 00 00 8C 43 02 00 CC 43 1A 00 FC 40 \r
+7F 00 10 00 8C 43 18 00 FC F0 FC 00 1A 00 8C 43 \r
+04 00 8C 43 06 00 CC 43 0E 00 CC 43 12 00 CC 43 \r
+0F 00 CC 43 11 00 5B 53 1F 83 DA 23 0A 16 10 01 \r
+1A 14 C9 0D 3A 40 81 00 0A 5C 82 DA B0 01 CF 09 \r
+3F 50 10 00 82 4F 00 07 B2 40 00 02 02 07 7E 50 \r
+10 00 C2 4E 10 07 92 43 0C 07 2C 43 B0 13 A0 CC \r
+A2 D3 00 07 C2 43 EA 1E 92 D3 00 07 3C 40 05 00 \r
+B0 13 A0 CC C2 93 EA 1E FD 27 39 D0 03 00 82 C9 \r
+00 07 B2 F0 EF FF 00 07 82 CA B0 01 82 43 0C 07 \r
+1C 42 E8 1E 19 16 10 01 1A 14 21 82 CA 0C 3C 40 \r
+05 00 0C 5A 5D 4A 0E 00 B0 13 3C DC 0C 93 02 20 \r
+3F 42 03 3C B0 13 92 F0 0F 43 F1 40 82 00 00 00 \r
+D1 4A 0D 00 01 00 C1 4F 02 00 6C 43 CD 01 7E 40 \r
+03 00 7F 40 03 00 B0 13 6C C0 C9 0C 09 93 0D 24 \r
+3C 40 03 00 0C 59 3D 40 05 00 0D 5A 2E 42 B0 13 \r
+60 ED CC 09 4D 43 B0 13 68 E1 21 52 19 16 10 01 \r
+2A 14 C8 0D C9 0C 5C 42 77 1D B0 13 F2 E3 CA 0C \r
+B0 13 80 F0 0A 93 24 24 CC 0A 5D 43 B0 13 50 E5 \r
+0C 93 1F 20 09 93 1D 24 5C 4A 0A 00 5F 4A 01 00 \r
+CD 09 CE 08 B0 13 6C C0 C9 0C 09 93 0E 24 3C 40 \r
+03 00 0C 59 3D 40 03 00 0D 5A 2E 42 B0 13 60 ED \r
+CC 09 5D 43 B0 13 68 E1 04 3C 3C 40 03 00 01 3C \r
+2C 43 28 16 10 01 0E 42 32 C2 03 43 4C 93 2C 24 \r
+4F 4C 3F 50 00 7E B2 B0 10 00 02 0F FC 27 82 4F \r
+10 0F B2 B0 10 00 02 0F FC 27 F2 40 3D 00 11 0F \r
+B2 B0 10 00 02 0F FC 27 F2 40 FE 00 11 0F B2 B0 \r
+20 00 02 0F FC 27 C2 43 10 0F B2 B0 80 00 02 0F \r
+FC 27 5D 42 20 0F B2 B0 10 00 02 0F FC 27 F2 40 \r
+3D 00 11 0F 4D 9C D7 23 02 4E 10 01 4C 4C C2 93 \r
+93 1E 2E 24 41 18 4C 5C 6C D3 F2 F0 DF 00 06 02 \r
+A2 C3 22 03 5F 42 CC 05 C2 4C CE 05 3F 40 E8 03 \r
+D2 B3 DD 05 03 20 1F 83 FB 23 18 3C 0F 93 16 24 \r
+5F 42 CC 05 C2 4D CE 05 3F 40 E8 03 D2 B3 DD 05 \r
+03 20 1F 83 FB 23 0A 3C 0F 93 08 24 5F 42 CC 05 \r
+A2 D3 22 03 F2 D0 20 00 06 02 10 01 C2 43 93 1E \r
+10 01 0A 14 CA 0D 6A 92 1A 24 B0 13 22 EF 4C 93 \r
+08 20 7C 40 47 00 3D 40 40 F5 5E 43 B0 13 70 AF \r
+0E 3C 5C 42 FA 1D 0D 43 7E 40 03 00 6F 43 B0 13 \r
+FC B4 CD 0C 7C 40 47 00 5E 43 B0 13 70 AF B0 13 \r
+22 EF 4C 93 0F 20 5A 93 08 24 6A 92 0B 20 7C 40 \r
+13 00 4D 43 B0 13 02 E9 05 3C 7C 40 13 00 5D 43 \r
+B0 13 02 E9 0A 16 10 01 21 82 81 43 00 00 81 43 \r
+02 00 7C 40 7F 00 4D 43 B0 13 4A C7 81 4C 00 00 \r
+81 43 02 00 2C 41 1F 41 02 00 47 18 0C 5C 0D 43 \r
+3C F0 00 07 0D F3 B0 13 62 DB 81 4C 00 00 81 4D \r
+02 00 7C 40 80 00 5D 43 B0 13 4A C7 81 DC 00 00 \r
+12 C3 11 10 02 00 11 10 00 00 12 C3 11 10 02 00 \r
+11 10 00 00 2C 41 1D 41 02 00 21 52 10 01 1F 42 \r
+38 0F 1E 42 0E 0F 0E 93 14 20 0F 93 28 24 3F 90 \r
+14 00 0C 20 B2 B0 00 02 36 0F 03 20 32 C2 03 43 \r
+FF 3F B2 F0 FF FD 32 0F 80 00 56 A7 32 C2 03 43 \r
+FF 3F 2E 93 11 20 1F 42 0C 0F 2F 93 0A 24 2F 92 \r
+08 24 3F 90 06 00 05 24 3F 92 03 24 32 C2 03 43 \r
+FF 3F 32 C2 03 43 FF 3F 32 C2 03 43 FF 3F 10 01 \r
+B2 B0 30 00 40 03 2B 24 B2 F0 EF FF 4A 03 B2 F0 \r
+7F FF 08 1E 82 93 50 03 02 20 0F 43 05 3C 1F 42 \r
+50 03 1F 92 50 03 FB 23 0F 5C 82 4F 5A 03 92 C3 \r
+4A 03 B2 D0 10 00 4A 03 B0 13 54 F0 B2 40 2B 5A \r
+5C 01 B0 13 F0 EC 4C 93 03 24 6D 43 B0 13 10 A0 \r
+32 C2 03 43 B2 B0 80 00 08 1E EE 27 32 D2 10 01 \r
+B2 F0 FE FD 36 0F B2 F0 FE FD 32 0F B2 F0 FE FD \r
+32 0F 92 43 C4 1E 7C 40 32 00 B0 13 CA EB C2 4C \r
+C6 1E 7C 43 3D 40 4E 1E 7E 40 0A 00 B0 13 B8 D7 \r
+7C 43 B0 13 CA EB C2 4C DA 1E 7C B0 80 FF 04 20 \r
+F2 80 80 00 DA 1E 03 3C F2 F0 7F 00 DA 1E 1F 42 \r
+C8 1E 3F 80 10 00 82 4F D8 1E 80 00 CA DA 5D 93 \r
+10 24 6D 93 08 24 6D 92 19 20 82 43 9C 1E 7C 42 \r
+4D 43 80 00 02 E9 B0 13 9E CD B2 F0 7F FF 8C 1C \r
+10 01 7C 42 5D 43 B0 13 02 E9 92 43 9C 1E B0 13 \r
+9E CD 7C 40 29 00 5D 43 80 00 02 E9 10 01 1C 42 \r
+A0 1E 0D 43 7E 40 03 00 4F 43 B0 13 FC B4 CD 0C \r
+7C 40 5D 00 5E 43 B0 13 70 AF 10 01 5F 93 20 24 \r
+4F 93 1B 24 6F 93 12 24 7F 90 03 00 05 24 6F 92 \r
+1C 20 B0 13 0C CE 10 01 4E 4E 3E E3 CF 0E 6F FC \r
+4D DF CC 4D 00 00 CC FE 20 00 10 01 B0 13 0C CE \r
+CC DD 00 00 CC DD 20 00 10 01 CC CE 00 00 10 01 \r
+6F 4C 4F CE 4D DF CC 4D 00 00 10 01 4E 4E 3E E3 \r
+CC FE 00 00 CC FE 20 00 10 01 0A 14 1F 42 44 1E \r
+DF 53 13 00 B0 13 7C C1 1F 42 44 1E 1E 4F 08 00 \r
+1E 5F 0A 00 8F 4E 0C 00 1F 42 44 1E 9F 4F 0C 00 \r
+0A 00 1A 42 44 1E CF 0A 5C 4F 13 00 2D 4F 1E 4F \r
+02 00 3F 40 00 08 B0 13 82 D5 8A 8C 0C 00 1F 42 \r
+44 1E FF 40 07 00 0F 00 1F 42 44 1E FF F0 FC 00 \r
+1A 00 0A 16 10 01 92 53 26 1E 82 63 28 1E 1F 43 \r
+5F 52 32 1E 3F 90 3C 00 1F 20 C2 43 32 1E 1F 43 \r
+5F 52 31 1E 3F 90 3C 00 12 20 C2 43 31 1E 1F 43 \r
+5F 52 30 1E F2 40 03 00 2E 1E 3F 90 18 00 03 24 \r
+C2 4F 30 1E 10 01 C2 43 30 1E 80 00 28 D3 C2 4F \r
+31 1E E2 43 2E 1E 10 01 C2 4F 32 1E D2 43 2E 1E \r
+10 01 0A 14 CA 0C 7D 40 46 00 7E 40 5A 00 B0 13 \r
+76 EF 0D 43 4E 43 B0 13 70 AF 5A 93 0D 24 7C 40 \r
+29 00 B0 13 24 CF 7C 40 27 00 B0 13 24 CF 7C 40 \r
+28 00 B0 13 24 CF 0C 3C 7C 40 1F 00 B0 13 24 CF \r
+7C 40 20 00 B0 13 24 CF 7C 40 1E 00 B0 13 24 CF \r
+0A 16 10 01 4D 43 B0 13 02 E9 10 01 0A 14 0A 43 \r
+2C 92 22 24 3C 90 05 00 1C 24 3C 92 17 24 3C 90 \r
+0A 00 12 20 2F 4D 0F 93 0A 24 1F 83 06 24 1F 83 \r
+02 24 2C 43 16 3C 6C 43 03 3C 5C 43 01 3C 4C 43 \r
+B0 13 72 EA 0C 43 0D 3C 2A 43 0A 3C B0 13 0A E8 \r
+07 3C B0 13 E0 E6 04 3C B0 13 EA E7 B0 13 0A E6 \r
+CC 0A 0A 16 10 01 1A 14 C9 0C 79 93 02 24 CA 09 \r
+02 3C 49 43 4A 43 4F 49 4A 4A 0A 8F 1A 53 CC 09 \r
+B0 13 C2 E5 0C 93 09 20 4C 49 3D 40 1C 00 B0 13 \r
+38 EC 1C 52 D4 F6 B0 13 DE CF 59 53 1A 83 EF 23 \r
+E2 B3 D6 1E 0A 24 B0 13 BE EF 4C 93 06 20 D2 C3 \r
+D6 1E B0 13 DE ED B0 13 74 F0 19 16 10 01 AC 43 \r
+18 00 FC F0 FC 00 1A 00 CC 43 12 00 5F 42 4A 1E \r
+C2 93 4B 1E 03 20 CC 4F 13 00 08 3C 5E 42 4A 1E \r
+12 C3 4E 10 4E 11 4F 8E CC 4F 13 00 E2 B3 D6 1E \r
+11 20 F2 D0 06 00 D6 1E B0 13 C2 EE 82 4C 42 1E \r
+C2 93 4B 1E 04 20 B2 50 E0 7F 42 1E 10 01 B2 50 \r
+C0 53 42 1E 10 01 0A 14 21 83 CA 0D CB 0C 4C 43 \r
+B0 13 6E BC 7C 40 22 00 B0 13 72 D0 0E 24 CC 0B \r
+B0 13 72 D0 0A 24 CC 0A B0 13 80 D0 C1 4C 00 00 \r
+6C 43 B0 13 6E BC 5C 43 01 3C 4C 43 21 53 0A 16 \r
+10 01 B0 13 80 D0 C1 4C 04 00 C1 93 04 00 10 01 \r
+B0 13 0A D9 7C 40 03 00 B0 13 6E BC 10 01 0A 14 \r
+09 14 09 43 0A 43 1B 43 0F 93 04 24 09 4D 0D 4C \r
+0C 43 0D 3C 5C 02 0D 6D 09 69 09 8E 04 28 1C D3 \r
+5B 02 F8 2B 03 3C 09 5E 5B 02 F4 2B 1B 43 5C 02 \r
+0D 6D 09 69 0A 6A 09 8E 0A 7F 04 28 1C D3 5B 02 \r
+F6 2B 04 3C 09 5E 0A 6F 5B 02 F1 2B 0E 49 0F 4A \r
+09 16 0A 16 10 01 0A 14 7C 40 23 00 B0 13 CA EB \r
+CA 0C 7A D0 20 00 CD 0A 7C 40 23 00 B0 13 28 DD \r
+7C 40 C6 00 B0 13 A6 CA 7C 40 33 00 B0 13 06 BD \r
+7C 40 3D 00 B0 13 06 BD 7C B0 70 00 F9 23 3D 40 \r
+DF 00 4D FA 7C 40 23 00 B0 13 28 DD 7C 40 36 00 \r
+B0 13 06 BD 82 43 C4 1E 0A 16 10 01 0A 14 CA 0D \r
+6A 92 17 24 1C 42 FC 1D 1D 42 FE 1D 3E 40 E8 03 \r
+0F 43 B0 13 8E D0 7E 40 06 00 7F 40 05 00 B0 13 \r
+FC B4 CD 0C 7C 40 5A 00 5E 43 B0 13 70 AF 5A 93 \r
+08 24 6A 92 0B 20 7C 40 10 00 4D 43 B0 13 02 E9 \r
+05 3C 7C 40 10 00 5D 43 B0 13 02 E9 0A 16 10 01 \r
+B2 B0 20 00 08 1E 25 20 B0 13 22 EF 4C 93 21 20 \r
+B0 13 3A EF 4C 93 1D 20 D2 53 89 1E E2 93 89 1E \r
+18 20 4C 43 4D 43 B0 13 02 E9 5C 43 B0 13 D2 CE \r
+7C 40 5A 00 3D 40 20 F5 5E 43 B0 13 70 AF 7C 40 \r
+46 00 3D 40 56 F5 5E 43 B0 13 70 AF 3F 40 00 10 \r
+C0 0F 10 01 2A 14 1A 41 10 00 49 4C 1B 42 44 1E \r
+1B 4B 0C 00 0B 89 3B 80 32 00 28 4D C9 0B 09 88 \r
+09 93 02 38 28 9E 15 20 8D 4B 00 00 1D 42 44 1E \r
+4C 4C 1C 5D 0C 00 3C 50 10 00 8E 4C 00 00 1E 42 \r
+44 1E DF 4E 0F 00 00 00 1F 42 44 1E DA 4F 10 00 \r
+00 00 28 16 10 01 1A 14 CA 0C 5C 4A 05 00 CF 0C \r
+3F 80 03 00 06 24 2F 83 2F 93 03 28 7F 40 03 00 \r
+01 3C 5F 43 4C 4C 1D 4A 02 00 5E 4A 04 00 B0 13 \r
+6C C0 C9 0C 09 93 0C 24 3C 40 03 00 0C 59 2D 4A \r
+2E 42 B0 13 60 ED CC 09 5D 43 B0 13 68 E1 02 3C \r
+3C 40 03 00 19 16 10 01 A2 D2 22 03 A2 C2 24 03 \r
+3E 42 4F 43 B2 C2 22 03 B0 13 CC D2 4F 5F A2 B2 \r
+20 03 01 24 5F D3 1E 83 F5 23 A2 D2 24 03 B2 C2 \r
+22 03 5C 93 03 24 A2 D2 22 03 02 3C A2 C2 22 03 \r
+B0 13 CC D2 B2 C2 22 03 CC 0F 10 01 B0 13 CE F0 \r
+B2 D2 22 03 B0 13 CE F0 10 01 D2 B3 D6 1E 1E 24 \r
+A2 93 46 1E 1B 24 1F 42 44 1E 2E 4F 1F 4F 02 00 \r
+0F 93 09 20 0E 93 07 20 82 93 46 1E 0F 20 92 43 \r
+46 1E 5C 43 10 01 1C 42 4E 1E 1D 42 50 1E 3C F3 \r
+3D F0 FF 00 0D 9F 02 20 0C 9E 02 24 4C 43 10 01 \r
+A2 43 46 1E 5C 43 10 01 2A 14 19 43 59 52 CB 1E \r
+18 42 CE 1E 5A 42 CC 1E 4C 4A CD 08 B0 13 86 C2 \r
+4C 4C 0C 99 11 34 5A 53 3A 90 0D 00 05 34 C2 4A \r
+CC 1E D2 43 CB 1E 0A 3C D2 43 CB 1E D2 43 CC 1E \r
+18 53 82 48 CE 1E 02 3C C2 49 CB 1E 92 D3 8C 1C \r
+28 16 10 01 F2 B0 10 00 01 02 10 20 D2 B3 01 02 \r
+06 24 C2 93 7F 1E 19 20 B2 D2 76 1E 0C 3C 82 43 \r
+7C 1E F2 40 0A 00 7F 1E 80 00 9E F0 C2 93 7F 1E \r
+0C 20 A2 D2 76 1E 92 53 7C 1E 92 42 26 1E 2A 1E \r
+92 42 28 1E 2C 1E 80 00 A4 F0 D2 83 7F 1E 10 01 \r
+2A 14 4A 4C 4C 4A B0 13 6E EE 4C 93 02 20 7A E3 \r
+5A 53 3A B0 00 80 0B 7B 3B E3 38 40 AC F6 09 43 \r
+0F 43 1C 43 0D 43 CE 0F B0 13 1E EE 0C FA 0D FB \r
+CE 0F B0 13 2E EE 3D 48 B0 13 38 EC 09 5C 1F 53 \r
+3F 90 07 00 EE 3B CC 09 28 16 10 01 21 83 81 43 \r
+00 00 7C 40 81 00 5D 43 B0 13 4A C7 81 4C 00 00 \r
+B1 B0 00 20 00 00 02 20 4E 43 08 3C B1 D0 00 C0 \r
+00 00 B1 E3 00 00 91 53 00 00 5E 43 2C 41 5C 03 \r
+CF 0C 4E 93 04 24 3C 40 AC 0A 0C 8F 03 3C 3C 40 \r
+AC 0A 0C 5F 21 53 10 01 0B 4D 0E 4B 0D 93 1F 30 \r
+3B F0 80 7F 1C 24 5B 02 8B 10 7E D0 80 00 3B 80 \r
+7F 00 15 30 3B 90 20 00 0F 34 3B 80 17 00 05 30 \r
+1B 83 08 30 5C 02 0E 6E FB 3F 5E 01 5C 00 1B 53 \r
+01 24 FB 3F 0D 4E 10 01 3C 43 3D 43 10 01 0C 43 \r
+0D 43 10 01 0B 4D 0B EF 0A 30 0D 93 12 30 0D 9F \r
+02 24 19 34 16 3C 0C 9E 18 24 13 28 14 3C 3D B0 \r
+80 7F 04 20 3F B0 80 7F 01 20 0F 24 0D 9F 0B 34 \r
+08 3C 0F 9D 02 24 07 34 04 3C 0E 9C EC 27 01 28 \r
+02 3C 3C 43 10 01 1C 43 10 01 0C 43 10 01 82 43 \r
+EE 1D 4C 43 B0 13 6E F0 B0 13 0E EE C2 43 FA 1D \r
+C2 43 00 1E 82 43 02 1E 82 43 04 1E 92 D3 8C 1C \r
+7C 40 13 00 6D 42 B0 13 02 E9 7C 40 17 00 6D 42 \r
+B0 13 02 E9 7C 40 18 00 6D 42 B0 13 02 E9 7C 40 \r
+19 00 6D 42 80 00 02 E9 E2 93 AA 1E 13 24 B0 13 \r
+78 EC C2 93 AA 1E 1C 24 82 43 90 03 B2 D0 10 00 \r
+80 03 F2 D0 80 00 0B 02 E2 43 AA 1E 92 42 A8 1E \r
+C0 1E 10 01 B2 F0 CF FF 80 03 F2 F0 7F 00 03 02 \r
+F2 F0 7F 00 0B 02 D2 43 AA 1E 92 42 A6 1E C0 1E \r
+10 01 1A 14 CB 0E CA 0D CE 0C CC 0A CD 0B B0 13 \r
+A0 DB 4D 4C CC 0A 49 4E 5C E9 06 F4 47 18 0C 5C \r
+4E ED 5E 4E 06 F4 0E 5C 4A 4A 47 18 0A 5A CC 0B \r
+4C DD 0C 5A 0C EE 0F 9C 06 2C 3E 40 FF 7F 0C FE \r
+5E 03 0F 9C FC 2B 19 16 10 01 1A 14 31 80 06 00 \r
+C9 0C 5A 42 77 1D CC 0A B0 13 F2 E3 0C 93 02 20 \r
+2C 43 13 3C 4D 43 B0 13 50 E5 0C 93 0E 20 91 43 \r
+02 00 C1 4A 04 00 81 43 00 00 CC 01 2C 53 3D 40 \r
+F2 1C CE 09 0F 43 B0 13 D2 BB 31 50 06 00 19 16 \r
+10 01 C2 93 A4 1E 20 20 C2 4C A4 1E B2 40 8F 02 \r
+A6 1E 82 4D A8 1E B2 40 14 01 80 03 B2 40 05 00 \r
+92 03 B2 40 80 00 82 03 F2 D0 80 00 0B 02 00 18 \r
+F2 40 38 D5 BC 1E 3C 40 8F 02 B0 13 F8 E2 92 42 \r
+A8 1E C0 1E E2 43 AA 1E 10 01 F2 40 A5 00 21 01 \r
+4E 4C 4F 4E 8F 10 0E 5F 3E 50 00 44 82 4E 24 01 \r
+4F 4C 3F 50 00 44 82 4F 26 01 92 B3 2C 01 FD 27 \r
+C2 4C 20 01 B2 F0 F9 FF 2C 01 A2 B3 2C 01 03 24 \r
+A2 B2 2C 01 FD 27 82 4E 26 01 C2 43 21 01 10 01 \r
+1A 14 3F 40 E8 F6 9F 00 FF FF 12 24 3D 40 E8 F6 \r
+0C 3C 4F 13 2A 52 12 3C 3C 4D CA 0D CE 09 B0 13 \r
+60 ED 0A 59 CD 0A 1D 53 1D C3 39 4D 09 93 F4 23 \r
+3F 40 FF FF 3F 93 05 24 3A 40 FF FF 0F 0A DF 03 \r
+E8 23 19 16 10 01 1A 14 21 83 CB 0F CA 0D C9 0C \r
+5E 41 0E 00 B2 B0 40 00 08 1E 10 20 4C 4A B0 13 \r
+26 EB C1 4E 00 00 4C 4C CD 0C 0E 43 CC 09 CF 0B \r
+B0 13 02 E7 4C 4A B0 13 CC E9 05 3C C1 4E 00 00 \r
+0E 43 B0 13 02 E7 21 53 19 16 10 01 7C 90 3C 00 \r
+06 28 7C 90 3E 00 03 24 32 C2 03 43 FF 3F 0F 42 \r
+32 C2 03 43 B2 B0 10 00 02 0F FC 27 7C 90 2F 00 \r
+08 28 7C 90 3E 00 05 24 7C D0 C0 00 C2 4C 13 0F \r
+04 3C 7C D0 80 00 C2 4C 13 0F 5C 42 22 0F 02 4F \r
+10 01 0B 4D 0E 4B 3B F0 80 7F 1C 24 5B 02 8B 10 \r
+7E D0 80 00 3B 80 7F 00 15 30 3B 90 10 00 10 34 \r
+5E 01 5C 00 1E 93 01 24 FB 3F 1B 83 03 30 5C 02 \r
+0E 6E FB 3F 0D 93 02 34 3E E3 1E 53 0C 4E 10 01 \r
+3C 43 10 01 0C 43 10 01 0A 14 CB 0D 0A 42 32 C2 \r
+03 43 B2 B0 10 00 02 0F FC 27 7C D0 C0 00 C2 4C \r
+13 0F 4F 4E 1F 83 0A 24 B2 B0 80 00 02 0F FC 27 \r
+1D 53 DD 42 22 0F FF FF 1F 83 F6 23 4D 4E 0D 5B \r
+DD 42 20 0F FF FF 02 4A 0A 16 10 01 0B 42 32 C2 \r
+03 43 B2 B0 10 00 02 0F FC 27 4C 4C 47 18 0C 5C \r
+3C D0 00 40 6F 4D 0F 5C 82 4F 10 0F 6E 93 0C 28 \r
+1D 53 4E 4E 1E 83 E2 4D 10 0F B2 B0 20 00 02 0F \r
+FC 27 1D 53 1E 83 F7 23 5F 42 20 0F 02 4B 10 01 \r
+92 B3 0A 1E 03 24 5C 43 B0 13 9C BD A2 B2 0A 1E \r
+03 24 5C 43 B0 13 96 BA B2 B2 0A 1E 02 24 B0 13 \r
+FE EE A2 B3 0A 1E 02 24 B0 13 F2 C5 B2 B0 10 00 \r
+0A 1E 05 24 6C 43 3D 40 99 19 B0 13 12 D6 82 43 \r
+0A 1E 10 01 1A 14 C9 0C 3D 40 0C 00 0D 59 6E 49 \r
+7E 80 0B 00 5C 43 7F 40 03 00 B0 13 6C C0 CA 0C \r
+0A 93 10 24 3C 40 03 00 0C 5A 3D 40 05 00 0D 59 \r
+2E 42 B0 13 60 ED FA D0 80 00 0E 00 CC 0A 4D 43 \r
+B0 13 68 E1 19 16 10 01 D2 B3 D6 1E 0E 24 1D 42 \r
+4E 1E 1E 42 50 1E 3D F3 3E F0 FF 00 1F 42 44 1E \r
+1E 9F 02 00 02 20 2D 9F 02 24 4C 43 10 01 DF 92 \r
+51 1E 13 00 04 24 D2 C3 D6 1E 4C 43 10 01 EF C2 \r
+1A 00 B0 13 F6 C0 5C 43 10 01 A2 D2 24 03 7F 40 \r
+80 00 3E 42 B2 C2 22 03 CD 0C 4D FF 4D 9F 03 24 \r
+A2 C2 22 03 02 3C A2 D2 22 03 12 C3 4F 10 B0 13 \r
+CE F0 B2 D2 22 03 B0 13 CE F0 1E 83 EB 23 B2 C2 \r
+22 03 A2 D2 22 03 A2 C2 24 03 10 01 4C 93 1D 20 \r
+4C 43 B0 13 C2 E5 0C 93 04 24 1C 83 09 24 1C 83 \r
+14 20 C2 43 DC 1E C2 43 DD 1E 82 43 DE 1E 10 01 \r
+1F 42 D4 F6 D2 4F 0E 00 DC 1E 1E 4F 04 00 1F 4F \r
+06 00 C2 4F DD 1E 82 4E DE 1E 10 01 82 43 18 1E \r
+82 43 24 1E 82 43 20 1E C2 93 76 1D 16 24 B0 13 \r
+2A E5 B0 13 4C DA B0 13 3C EA 1C 42 22 1E 0C 93 \r
+0C 24 1C 52 20 1E 82 4C 20 1E 1D 42 1A 1E 1E 42 \r
+1C 1E 1F 42 1E 1E 80 00 BA 93 10 01 0A 14 0A 43 \r
+0F 93 05 34 3E E3 3F E3 1E 53 0F 63 1A D3 0D 93 \r
+05 34 3C E3 3D E3 1C 53 0D 63 3A E3 B0 13 8E D0 \r
+1A B3 04 24 3C E3 3D E3 1C 53 0D 63 2A B3 04 24 \r
+3E E3 3F E3 1E 53 0F 63 0A 16 10 01 B0 13 52 B9 \r
+F2 B2 F0 1C 14 24 3C 40 03 00 3D 40 05 00 0E 43 \r
+B0 13 F0 B7 3C 40 F2 1C 6D 42 B0 13 40 CA 3C 40 \r
+03 00 2D 42 0E 43 B0 13 F0 B7 F2 C2 F0 1C F2 B0 \r
+20 00 F0 1C E3 27 C2 43 D1 1D 10 01 C2 93 76 1D \r
+15 24 82 93 24 1E 19 20 F2 F0 BF 00 1D 02 F2 D0 \r
+40 00 1B 02 B0 13 6A EF B2 40 10 0E 24 1E F2 B0 \r
+40 00 01 02 FC 27 4C 43 80 00 96 BA 7C 40 47 00 \r
+3D 40 06 F5 5E 43 80 00 70 AF 10 01 0A 14 CA 0D \r
+CB 0E 4C 4C 3D 40 1C 00 B0 13 38 EC 1F 42 D4 F6 \r
+0F 5C 8F 93 18 00 0F 20 8F 4A 00 00 8F 4B 02 00 \r
+0B 93 06 20 0A 93 04 20 1C 52 D4 F6 EC C2 1A 00 \r
+FF 40 7F 00 10 00 0A 16 10 01 0A 14 5A 42 57 1E \r
+3C 40 4E 1E B0 13 AA DE 4C 4C 0C EA 47 18 0C 5C \r
+8C 10 4C 4C CA 0C C2 4A 57 1E 3A 90 21 00 05 20 \r
+D2 D3 D6 1E B0 13 74 F0 05 3C F2 F0 EF 00 D6 1E \r
+B0 13 0A C4 0A 16 10 01 1A 14 C2 93 A2 1D 16 24 \r
+3C 40 7A 1D 29 42 3A 40 D8 F6 3B 40 A4 1D 4E 43 \r
+4F 43 7D 4C 7D 9B 01 20 5E 53 7D 9A 01 20 5F 53 \r
+19 83 F7 23 6F 92 02 24 6E 92 02 20 4C 43 01 3C \r
+5C 43 19 16 10 01 5C 02 0D 6D 5C 02 0D 6D 5C 02 \r
+0D 6D 5C 02 0D 6D 5C 02 0D 6D 5C 02 0D 6D 5C 02 \r
+0D 6D 5C 02 0D 6D 5C 02 0D 6D 5C 02 0D 6D 5C 02 \r
+0D 6D 5C 02 0D 6D 5C 02 0D 6D 5C 02 0D 6D 5C 02 \r
+0D 6D 10 01 5D 03 5C 00 5D 03 5C 00 5D 03 5C 00 \r
+5D 03 5C 00 5D 03 5C 00 5D 03 5C 00 5D 03 5C 00 \r
+5D 03 5C 00 5D 03 5C 00 5D 03 5C 00 5D 03 5C 00 \r
+5D 03 5C 00 5D 03 5C 00 5D 03 5C 00 5D 03 5C 00 \r
+10 01 0A 14 3F 40 B9 1D 2E 43 0C 43 2D 43 6D 9F \r
+05 20 3F 50 0C 00 1C 53 1E 83 F8 23 6C 93 02 20 \r
+0C 43 0C 3C 4C 4C 3D 40 0C 00 B0 13 38 EC 3A 40 \r
+B9 1D 0A 5C CC 0A B0 13 98 DD CC 0A 0A 16 10 01 \r
+92 C3 44 03 82 93 9A 1E 0E 24 B0 13 9A 82 92 93 \r
+9A 1E 03 24 B0 13 AE DF 02 3C B0 13 0A C4 1C 42 \r
+94 1E 80 00 E4 E8 F2 C2 D6 1E B0 13 0A C4 1C 42 \r
+96 1E B0 13 E4 E8 92 43 9A 1E 10 01 3A 14 C8 0D \r
+C7 0C 3A 40 B9 1D 29 43 2F 43 6F 9A 0E 20 3D 40 \r
+03 00 0D 5A CC 07 2E 42 B0 13 2E E6 0C 93 05 20 \r
+58 9A 0A 00 02 20 CC 0A 05 3C 3A 50 0C 00 19 83 \r
+EB 23 0C 43 37 16 10 01 3A 14 C8 0D C7 0C 3A 40 \r
+B9 1D 49 43 2F 43 6F 9A 0E 20 3C 40 03 00 0C 5A \r
+CD 07 2E 42 B0 13 2E E6 0C 93 05 20 CA 98 0A 00 \r
+02 20 CC 0A 05 3C 3A 50 0C 00 59 53 EB 27 0C 43 \r
+37 16 10 01 C2 93 40 1E 14 20 3F 40 47 01 1F 52 \r
+56 03 C2 93 36 1E 08 20 C2 93 37 1E 0E 24 3F 80 \r
+03 00 C2 43 37 1E 09 3C 3F 80 05 00 C2 43 36 1E \r
+F8 3F 3F 40 00 80 1F 52 56 03 82 4F 56 03 10 01 \r
+82 43 4C 1E B0 13 7A F0 F2 40 21 00 48 1E F2 40 \r
+06 00 4A 1E C2 43 49 1E D2 43 4B 1E 7C 43 5D 43 \r
+B0 13 06 C9 B0 13 BC C7 B0 13 E6 D0 7C 40 0C 00 \r
+5D 42 16 1E 80 00 28 DD 21 83 0F 42 32 C2 03 43 \r
+B2 B0 10 00 02 0F FC 27 4C 4C 47 18 0C 5C 3C D0 \r
+00 40 4D 4D 0C 5D 82 4C 10 0F B2 B0 20 00 02 0F \r
+FC 27 5E 42 20 0F 81 4E 00 00 02 4F 21 53 10 01 \r
+5F 14 1A 42 38 0F 4A 4A B0 13 3A EF 4C 93 10 20 \r
+7A 90 14 00 04 24 4A 93 0D 20 03 43 0B 3C 1F 42 \r
+EE 1D 1F 93 02 24 2F 93 05 20 B0 13 18 ED 02 3C \r
+B0 13 3E CC 5A 16 00 13 21 83 CC 43 0A 00 EC 43 \r
+00 00 DC 42 B8 1D 0B 00 D2 53 B8 1D 02 3C D2 53 \r
+B8 1D C2 93 B8 1D FB 27 F2 93 B8 1D F8 27 5C 42 \r
+B8 1D CD 01 B0 13 CA E3 4C 93 F1 23 21 53 10 01 \r
+82 43 EE 1D 82 43 F2 1D 82 43 F4 1D 82 43 F0 1D \r
+C2 43 FA 1D C2 43 00 1E 82 43 02 1E 82 43 04 1E \r
+82 43 FC 1D 82 43 FE 1D C2 43 F6 1D B2 40 4B 00 \r
+F8 1D C2 43 06 1E 10 01 B0 13 72 B3 B0 13 2C C8 \r
+B0 13 84 87 B0 13 16 EF 82 93 76 1E 03 20 82 93 \r
+08 1E 02 24 B0 13 36 A1 82 93 0A 1E 02 24 B0 13 \r
+40 D8 82 93 8C 1C EE 27 B0 13 68 9C EB 3F 0A 14 \r
+CA 0C 5D 42 EE 1E B0 13 D8 E0 4C 93 0E 24 B0 13 \r
+84 ED CD 0C 1C 43 0C 5A 2E 42 B0 13 2E E6 0C 93 \r
+02 20 0C 43 05 3C 2C 43 03 3C B0 13 CE EE 1C 43 \r
+0A 16 10 01 0E 4C 0D 4C 0D 93 16 24 03 34 3D E3 \r
+1D 53 0F 30 3B 40 8F 00 1B 83 5D 02 FD 2B 4C 4D \r
+8C 10 8D 10 4D 4D 8B 10 0D DB 5E 02 5D 00 5C 00 \r
+10 01 3D 40 00 C7 0C 43 10 01 0A 14 3A 40 09 00 \r
+0F 43 6D 4C 3B 42 4E 4D 0E EF 3E 90 80 00 04 38 \r
+4F 5F 7F E0 97 00 02 3C 4F 5F 4F 4F 4D 5D 1B 83 \r
+F2 23 1C 53 1A 83 ED 23 CC 0F 0A 16 10 01 1D 42 \r
+9E 1D 0F 42 32 C2 03 43 D2 43 9C 1D 02 4F 0D 93 \r
+07 24 B0 13 C6 E8 C2 93 9B 1D 02 20 1D 83 F9 23 \r
+0F 42 32 C2 03 43 C2 43 9B 1D C2 43 9C 1D 02 4F \r
+10 01 B0 13 2C F0 1F 42 44 1E FF 90 7F 00 10 00 \r
+0A 24 2C 93 05 34 3C 93 0D 34 DF 83 10 00 10 01 \r
+DF 53 10 00 10 01 CF 4C 10 00 1F 42 44 1E FF 50 \r
+0C 00 10 00 10 01 7C 90 2F 00 06 28 7C 90 3E 00 \r
+03 24 32 C2 03 43 FF 3F 0F 42 32 C2 03 43 B2 B0 \r
+10 00 02 0F FC 27 C2 4C 11 0F B2 B0 20 00 02 0F \r
+FC 27 C2 4D 10 0F 02 4F 10 01 4D 93 03 20 32 C2 \r
+03 43 FF 3F 0F 42 32 C2 03 43 B2 B0 10 00 02 0F \r
+FC 27 F2 40 7F 00 11 0F 4D 4D B2 B0 20 00 02 0F \r
+FC 27 F2 4C 10 0F 1D 83 F8 23 02 4F 10 01 B2 F0 \r
+FE FD 36 0F B2 F0 FE FD 32 0F 7C 40 36 00 B0 13 \r
+06 BD 7C 40 3A 00 B0 13 06 BD 7C 40 36 00 B0 13 \r
+06 BD 7C 40 32 00 B0 13 06 BD 82 43 C4 1E 10 01 \r
+F2 F0 DF 00 1B 02 92 C3 22 03 F2 F0 DF 00 03 02 \r
+F2 F0 1F 00 02 02 F2 F0 1F 00 0A 02 A2 C3 22 03 \r
+F2 D0 20 00 05 02 F2 D0 E0 00 04 02 A2 D3 24 03 \r
+10 01 21 83 7C 40 30 00 B0 13 06 BD 81 43 00 00 \r
+02 3C 91 53 00 00 B1 90 64 00 00 00 FA 2B 7C 40 \r
+36 00 B0 13 06 BD 7C B0 70 00 F9 23 82 43 06 0F \r
+21 53 10 01 0C 93 02 20 0D 93 14 24 3B 40 9F 00 \r
+1B 83 5C 02 0D 6D FC 2B 12 C3 5D 00 5C 00 3E 40 \r
+06 00 5D 01 5C 00 1E 83 FC 37 8B 10 0D DB 12 C3 \r
+5D 00 5C 00 10 01 A2 B2 76 1E 15 24 5F 42 E0 1E \r
+4F 93 0A 24 5F 93 0F 20 C2 43 E0 1E 92 D3 0C 1E \r
+B2 D0 80 00 0C 1E 10 01 D2 43 E0 1E 92 D3 0C 1E \r
+B2 D0 40 00 0C 1E 10 01 4D 93 03 20 32 C2 03 43 \r
+FF 3F 0F 42 32 C2 03 43 4D 4D B2 B0 10 00 02 0F \r
+FC 27 F2 40 BF 00 13 0F 1C 53 DC 42 22 0F FF FF \r
+1D 83 F3 23 02 4F 10 01 CF 0C FF B0 80 FF 0C 00 \r
+02 20 6C 43 10 01 CF 9D 0D 00 0C 20 B0 13 84 ED \r
+CD 0C 1C 43 0C 5F 2E 42 B0 13 2E E6 0C 93 02 20 \r
+4C 43 10 01 5C 43 10 01 82 93 6E 1E 09 20 82 93 \r
+6C 1E 06 20 B2 40 04 03 6C 1E B2 40 02 01 6E 1E \r
+B0 13 9E EB C2 4C 75 1E 4C 93 FA 27 3C 40 72 1E \r
+0D 43 1E 43 80 00 72 ED 31 80 06 00 81 43 02 00 \r
+D1 4C 05 00 04 00 CF 0C 3F 50 06 00 81 4F 00 00 \r
+1D 4C 02 00 2E 42 0E 5C 2F 4C CC 01 2C 53 B0 13 \r
+D2 BB 31 50 06 00 10 01 0A 14 CA 0C 3F 40 CF 00 \r
+5F FA 0C 00 5F D2 66 1E CA 4F 0C 00 2C 43 0C 5A \r
+B0 13 AC B2 4C 93 02 20 0C 43 02 3C 3C 40 09 00 \r
+CA 43 00 00 0A 16 10 01 7C 90 80 00 09 28 4C 4C \r
+3C 80 00 01 2D 43 B0 13 78 E2 3C 80 4A 00 04 3C \r
+4C 4C 5C 03 3C 80 4A 00 3C 90 80 FF 02 34 3C 40 \r
+80 FF 8C 11 10 01 92 C3 22 03 F2 F0 DF 00 03 02 \r
+F2 F0 1F 00 02 02 A2 C3 22 03 F2 D0 20 00 05 02 \r
+F2 D0 E0 00 04 02 A2 D3 24 03 92 D3 24 03 D2 43 \r
+93 1E 10 01 B2 F0 FF FD 36 0F 7C 40 36 00 B0 13 \r
+D8 C6 7C 40 3D 00 B0 13 D8 C6 7C B0 F0 FF F9 23 \r
+7C 40 3A 00 B0 13 D8 C6 B2 F0 FF FD 32 0F 10 01 \r
+C2 93 D1 1D 0E 20 B0 13 92 95 B0 13 08 C3 0C 93 \r
+0C 20 B0 13 E0 E6 B0 13 84 ED B0 13 E6 E5 B0 13 \r
+8A E8 D2 43 D1 1D 80 00 60 A6 10 01 5C 93 13 20 \r
+0C 42 32 C2 03 43 2E 43 3F 40 00 1C CF 93 00 00 \r
+05 24 5D 9F 01 00 02 2C DF 83 01 00 3F 50 23 00 \r
+1E 83 F4 23 02 4C 10 01 0B 43 0D 93 03 34 3D E3 \r
+1D 53 1B D3 0C 93 03 34 3C E3 1C 53 3B E3 B0 13 \r
+22 EC 1B B3 02 24 3C E3 1C 53 2B B3 02 24 3E E3 \r
+1E 53 10 01 4C 4C 3D 40 1C 00 B0 13 38 EC CF 0C \r
+1F 52 D4 F6 EF B2 1A 00 03 24 0F 43 0D 43 05 3C \r
+1C 52 D4 F6 2F 4C 1D 4C 02 00 CC 0F 10 01 C2 93 \r
+4A 1E 09 24 1F 42 44 1E DF 83 13 00 1F 42 44 1E \r
+CF 93 13 00 02 24 5C 43 10 01 8F 43 18 00 5D 43 \r
+B0 13 4C D9 4C 43 10 01 82 4C C0 1E 82 93 50 03 \r
+02 20 0F 43 05 3C 1F 42 50 03 1F 92 50 03 FB 23 \r
+0F 5C 82 4F 58 03 92 C3 48 03 B2 D0 10 00 48 03 \r
+10 01 31 40 FC 2B 00 18 F2 40 D2 F0 AC 1E 00 18 \r
+F2 40 D2 F0 B0 1E B0 13 AE F0 0C 93 02 24 B0 13 \r
+A0 D6 0C 43 B0 13 08 DE B0 13 B2 F0 92 B3 22 03 \r
+11 24 7C 40 06 00 B0 13 9A C8 C2 4C 59 1E 7C 40 \r
+07 00 B0 13 9A C8 C2 4C 5A 1E 7C 42 B0 13 9A C8 \r
+C2 4C 5B 1E 10 01 5D 93 12 20 C2 93 89 1E 0A 24 \r
+E2 93 89 1E 0C 2C 7C 40 5A 00 3D 40 1A F5 5E 43 \r
+80 00 70 AF 7C 40 5A 00 3D 40 20 F5 F8 3F 10 01 \r
+B2 D0 06 00 06 0A B2 40 1D 7B 00 0A B2 40 ED 00 \r
+04 0A F2 D0 E0 00 4A 02 F2 D0 E0 00 44 02 B2 43 \r
+0A 0A B2 40 FF 00 0C 0A 10 01 3F 40 B9 1D 0E 43 \r
+2B 43 6B 9F 07 20 CF 9C 0B 00 04 20 CD 4E 00 00 \r
+5C 43 10 01 3F 50 0C 00 1E 53 2E 93 F1 3B 4C 43 \r
+10 01 21 83 CD 01 B0 13 CA E3 4C 93 0B 24 6C 41 \r
+3D 40 0C 00 B0 13 38 EC EC 93 B9 1D 03 20 3C 50 \r
+B9 1D 01 3C 0C 43 21 53 10 01 82 93 8C 1E 09 20 \r
+82 93 8A 1E 06 20 B2 40 08 07 8A 1E B2 40 06 05 \r
+8C 1E 00 18 C2 43 8E 1E B0 13 9E EB C2 4C 92 1E \r
+10 01 B2 B0 20 00 08 1E 0F 20 B0 13 22 EF 4C 93 \r
+0B 20 F2 C2 03 02 F2 C2 05 02 F2 C2 1B 02 2C 43 \r
+B0 13 16 B1 F2 D2 1B 02 10 01 B2 B0 20 00 08 1E \r
+0F 20 B0 13 22 EF 4C 93 0B 20 F2 C2 03 02 F2 C2 \r
+05 02 F2 C2 1B 02 1C 43 B0 13 16 B1 F2 D2 1B 02 \r
+10 01 3C 40 03 00 5C F2 20 01 7C 90 03 00 03 2C \r
+5C 53 B0 13 5A D6 6C 92 03 28 5C 83 B0 13 B8 E4 \r
+7C 90 03 00 EE 23 10 01 F2 40 A5 00 21 01 4E 4C \r
+4F 4E 8F 10 0E 5F 3E 50 00 44 82 4E 26 01 92 B3 \r
+2C 01 FD 27 C2 4C 20 01 C2 43 21 01 10 01 3F 40 \r
+13 00 6F 9C 09 24 5F 4C 0C 00 1F 83 07 24 1F 83 \r
+07 20 B0 13 D8 C9 04 3C DC 43 0C 00 B0 13 D2 99 \r
+0C 43 10 01 F2 F0 E0 00 05 02 F2 F0 E0 00 03 02 \r
+F2 D0 1F 00 07 02 F2 F0 E0 00 19 02 F2 F0 E0 00 \r
+1D 02 F2 D0 1F 00 1B 02 10 01 1A 14 39 40 11 00 \r
+3F 40 32 1D 3A 40 72 F6 3C 4A B0 13 9A E6 2F 52 \r
+8F 4C FC FF 8F 4D FE FF 19 83 F6 23 19 16 10 01 \r
+4D 93 03 24 5F 4C 0A 00 02 3C 5F 4C 09 00 4F 93 \r
+06 24 CC 93 00 00 03 24 7F 90 20 00 02 2C 2C 43 \r
+10 01 0C 43 10 01 3C 40 80 1E 0D 43 2E 42 B0 13 \r
+72 ED C2 93 88 1E 09 20 3C 40 84 1E 3D 40 BA F6 \r
+2E 42 B0 13 60 ED D2 43 88 1E 10 01 B2 B0 20 00 \r
+08 1E 0E 20 B0 13 22 EF 4C 93 0A 20 F2 C2 03 02 \r
+F2 C2 05 02 F2 C2 1B 02 B0 13 34 BB F2 D2 1B 02 \r
+10 01 4C 4C 3D 40 1C 00 B0 13 38 EC CF 0C 1F 52 \r
+D4 F6 EF B2 1A 00 02 24 2C 43 10 01 1C 52 D4 F6 \r
+1C 4C 18 00 10 01 CE 0C 6D 4E 5D 92 D8 F6 0C 24 \r
+7C 40 09 00 B0 13 46 DF 2D 42 3F 40 A4 1D 1F 53 \r
+FF 4E FF FF 1D 83 FB 23 10 01 0A 14 0A 42 32 C2 \r
+03 43 D2 93 78 1D 08 24 B0 13 EA E7 7C 40 32 00 \r
+B0 13 D8 C6 D2 43 78 1D 02 4A 0A 16 10 01 0E 93 \r
+02 20 0C 43 10 01 1D 83 1C 83 1D 53 6B 4D 1C 53 \r
+6F 4C 4F 9B 02 20 1E 83 F8 23 4B 4B 4C 4F 0C 8B \r
+10 01 0A 14 CA 0C 5D 42 17 1E B0 13 D8 E0 4C 93 \r
+04 20 B0 13 CE EE 1C 43 04 3C CC 0A B0 13 0A EF \r
+0C 43 0A 16 10 01 82 43 26 1E 82 43 28 1E E2 42 \r
+30 1E F2 40 1E 00 31 1E C2 43 32 1E C2 43 2F 1E \r
+82 43 2A 1E 82 43 2C 1E 10 01 0D 4C 0D 93 0E 24 \r
+3B 40 8F 00 1B 83 5D 02 FD 2B 4C 4D 8C 10 8D 10 \r
+4D 4D 8B 10 0D DB 12 C3 5D 00 5C 00 10 01 82 43 \r
+90 03 B2 40 C0 00 92 03 B2 D0 10 00 80 03 92 B3 \r
+82 03 FD 27 B2 F0 EF FF 80 03 92 C3 82 03 10 01 \r
+D2 93 78 1D 0D 20 7C 40 36 00 B0 13 D8 C6 7C 40 \r
+3D 00 B0 13 D8 C6 7C B0 F0 FF F9 23 E2 43 78 1D \r
+10 01 0A 14 CB 0E CA 0C CE 0F CC 0D CD 0B 5F 41 \r
+08 00 B0 13 FC B4 CD 0C CC 0A 6E 43 B0 13 70 AF \r
+0A 16 10 01 0A 14 CA 0C 5D 42 75 1E B0 13 D8 E0 \r
+4C 93 04 20 B0 13 CE EE 1C 43 03 3C CC 0A B0 13 \r
+DE E4 0A 16 10 01 02 12 32 C2 03 43 82 4C D0 04 \r
+82 4D D2 04 82 4E E0 04 82 4F E2 04 1C 42 E4 04 \r
+1D 42 E6 04 32 41 10 01 D2 43 34 1E 92 42 50 03 \r
+56 03 B0 13 B4 DC 92 C3 46 03 B2 D0 10 00 46 03 \r
+7C 40 14 00 5D 43 80 00 02 E9 1F 42 D4 F6 BF 90 \r
+FF 00 02 00 05 28 06 20 BF 90 00 FF 00 00 02 2C \r
+0C 43 10 01 1C 42 DE 1E 10 01 1F 42 D4 F6 BF 90 \r
+FF 00 02 00 05 28 06 20 BF 90 00 FF 00 00 02 2C \r
+4C 43 10 01 5C 42 DD 1E 10 01 0A 14 5C 43 B0 13 \r
+7C C5 CA 0C 0A 93 07 24 2C 43 0C 5A B0 13 DA EE \r
+CC 0A B0 13 54 BF 0A 16 10 01 D2 93 78 1D 09 24 \r
+F2 90 03 00 78 1D 08 20 B0 13 F4 E1 E2 43 78 1D \r
+10 01 32 C2 03 43 FF 3F 10 01 D2 93 78 1D 09 24 \r
+F2 90 03 00 78 1D 08 24 F2 40 03 00 78 1D 80 00 \r
+B4 EB 32 C2 03 43 FF 3F 10 01 C2 43 66 1E 00 18 \r
+C2 43 68 1E B0 13 84 ED 82 4C 64 1E B0 13 9E EB \r
+C2 4C 62 1E 4C 93 FA 27 10 01 3C 40 38 1E 3D 40 \r
+44 F5 3E 42 B0 13 60 ED C2 43 37 1E C2 43 36 1E \r
+C2 43 34 1E C2 43 40 1E 10 01 B2 F0 CF FF 80 03 \r
+F2 F0 7F 00 03 02 F2 F0 7F 00 0B 02 B2 F0 EF FF \r
+82 03 B0 13 3C F0 80 00 FA EF D2 92 D8 F6 A4 1D \r
+08 24 D2 43 A2 1D 7C 40 07 00 7D 40 07 00 80 00 \r
+46 DF 32 C2 03 43 FF 3F B0 13 F4 E1 7C 40 0A 00 \r
+5D 42 DC F6 B0 13 46 DF F2 90 03 00 78 1D 02 20 \r
+80 00 B4 EB 10 01 3F 40 3E 00 0E 42 32 C2 03 43 \r
+B0 13 BE E6 02 4E C2 93 9B 1D 03 20 1F 83 3F 93 \r
+F4 23 10 01 CF 0C 82 4F 54 03 92 C3 44 03 B0 13 \r
+C2 EE 2F 83 0F 8C 3F 90 00 80 02 28 92 D3 44 03 \r
+10 01 CF 0D 7C 90 2A 00 0A 2C 4E 4C 5D 4E FE F5 \r
+4C 4C 5C 02 1C 4C 8E 1C CE 0D 80 00 BC CD 10 01 \r
+0C 9D 02 2C 80 00 60 ED 0C 5E 0D 5E 0E 93 06 24 \r
+1D 83 1C 83 EC 4D 00 00 1E 83 FA 23 10 01 CD 0C \r
+C2 93 88 1E 02 24 4C 43 10 01 3C 40 84 1E 2E 42 \r
+B0 13 60 ED D2 43 88 1E 5C 43 10 01 D2 93 E0 1E \r
+0A 20 D2 92 E3 1E 31 1E 06 20 D2 92 E2 1E 30 1E \r
+02 20 E2 43 E0 1E 10 01 5C 43 B0 13 D2 CE 6C 43 \r
+B0 13 D2 CE 5C 43 6D 42 80 13 0E 1E 6C 43 6D 42 \r
+20 00 12 1E 3C B0 00 80 0D 7D 3D E3 3E 40 3D 00 \r
+0F 43 B0 13 46 E7 3E 40 C8 00 0F 43 80 00 CC D9 \r
+3C B0 00 80 0D 7D 3D E3 3E 40 52 00 0F 43 B0 13 \r
+46 E7 3E 40 19 00 0F 43 80 00 CC D9 B0 13 8A EE \r
+4C 93 08 20 4C 43 4D 43 B0 13 02 E9 5C 43 5D 43 \r
+80 00 02 E9 4C 43 FB 3F 3C 40 00 1C 0D 43 3E 40 \r
+46 00 B0 13 72 ED 3C 40 46 1C 0D 43 3E 40 46 00 \r
+80 00 72 ED 0A 14 CF 0C CC 0D 2A 43 0F 93 05 20 \r
+B0 13 3E E9 4C 93 01 24 0A 43 CC 0A 0A 16 10 01 \r
+21 82 CF 0C CC 0D A1 4F 00 00 91 4F 02 00 02 00 \r
+CD 01 2E 42 B0 13 20 E9 21 52 10 01 C2 93 76 1D \r
+0A 24 B0 13 F0 EF F2 F0 BF 00 1B 02 F2 F0 BF 00 \r
+1D 02 82 43 24 1E 10 01 1F 42 44 1E 5C 4F 11 00 \r
+6C 93 02 2C 3C 42 10 01 5C 53 4C 5C 4C 5C 4C 4C \r
+10 01 7C 90 03 00 07 2C 4C 4C 5D 4C E0 F6 7C 40 \r
+3E 00 80 00 46 DF 32 C2 03 43 FF 3F 0C 93 0A 24 \r
+5C 0F 1C 53 0F 42 32 C2 03 43 B0 13 BE E6 02 4F \r
+1C 83 F8 23 10 01 B0 13 9E EB 7C F0 0F 00 5C 53 \r
+4E 4C 1C 42 A0 1D B0 13 8C EA 1E 83 FA 23 10 01 \r
+B2 90 06 00 0E 07 08 20 92 42 20 07 E8 1E D2 43 \r
+EA 1E B1 C0 D0 00 00 00 00 13 B2 F0 EF FF 46 03 \r
+C2 43 34 1E 7C 40 14 00 4D 43 B0 13 02 E9 5D 43 \r
+80 00 10 A0 6D 42 B0 13 7C EE 4F 43 C2 93 06 1E \r
+01 20 5F 43 C2 4F 06 1E 5D 43 80 00 7C EE 1C 42 \r
+D2 1E CF 0C 5F 0A 0C 5F 3D 40 05 00 B0 13 78 E2 \r
+3C 50 40 01 10 01 4C 93 06 24 7C 90 0D 00 06 28 \r
+7C 80 0C 00 10 01 3F 40 0C 00 4C 5F 10 01 3D 40 \r
+FF 00 3E 40 0C 00 3F 40 20 0A 1F 53 CF 4D FF FF \r
+1E 83 FB 23 10 01 5D 42 92 1E B0 13 D8 E0 4C 93 \r
+02 24 0C 43 10 01 B0 13 CE EE 1C 43 10 01 F2 40 \r
+06 00 E2 1E F2 40 1E 00 E3 1E F2 40 0A 00 E1 1E \r
+C2 43 E0 1E 10 01 D2 53 5E 1E F2 90 03 00 5E 1E \r
+02 28 C2 43 5E 1E 82 43 5C 1E 80 00 4C E3 5C 42 \r
+9A 1D 3D 40 6D 00 B0 13 38 EC 7C 50 43 00 C2 4C \r
+9A 1D 10 01 B2 F0 FF FD 32 0F 7C 40 34 00 B0 13 \r
+D8 C6 B2 D0 00 02 36 0F 10 01 0F 42 32 C2 03 43 \r
+7C D0 C0 00 C2 4C 13 0F 5C 42 22 0F 02 4F 10 01 \r
+B2 D0 10 00 08 1E 00 18 F2 40 74 D3 BC 1E 3C 40 \r
+99 19 80 00 F8 E2 0E 93 08 20 2D 93 06 2C 5D 06 \r
+3D 50 C4 F6 6E 43 80 00 70 AF 10 01 0E 93 08 20 \r
+2D 93 06 2C 5D 06 3D 50 CC F6 6E 43 80 00 70 AF \r
+10 01 0E 43 0F 4C 1C 43 5F 02 0E 6E 0E 9D 01 28 \r
+0E 8D 0C 6C F9 2B 10 01 02 12 32 C2 03 43 82 4C \r
+C0 04 82 4D C8 04 1C 42 CA 04 32 41 10 01 B2 B2 \r
+76 1E 07 24 C2 93 34 1E 02 20 80 00 68 E7 80 00 \r
+DA EA 10 01 B2 40 FF 7F 52 03 B2 D0 10 00 42 03 \r
+B2 D0 24 01 40 03 10 01 5F 42 A4 1E 5F 83 D2 83 \r
+A4 1E 0F 93 02 20 80 00 6A E8 10 01 3E 40 0C 00 \r
+3F 40 20 0A 1F 53 CF 43 FF FF 1E 83 FB 23 10 01 \r
+5D 93 07 20 7C 40 5A 00 3D 40 30 F5 5E 43 80 00 \r
+70 AF 10 01 5D 93 07 20 7C 40 5A 00 3D 40 38 F5 \r
+5E 43 80 00 70 AF 10 01 5D 93 07 20 7C 40 5A 00 \r
+3D 40 28 F5 5E 43 80 00 70 AF 10 01 3C 80 05 00 \r
+05 24 3C 80 05 00 02 24 4C 43 10 01 5C 43 10 01 \r
+4C 43 D2 93 34 1E 05 20 B2 90 F8 F2 E4 1E 01 20 \r
+5C 43 10 01 B2 40 D9 07 CE 1E F2 42 CC 1E D2 43 \r
+CB 1E C2 43 CA 1E 10 01 1F 42 50 03 82 4F C8 1E \r
+1F 92 50 03 F9 23 80 00 00 CD CF 0C 5F 06 0C 5F \r
+3C 80 40 06 3D 40 09 00 80 00 78 E2 4C 43 D2 93 \r
+58 1E 04 20 82 93 60 1E 01 24 5C 43 10 01 4C 43 \r
+92 93 18 1E 04 20 82 93 24 1E 01 24 5C 43 10 01 \r
+CF 0C 0E 93 05 24 1F 53 FF 4D FF FF 1E 83 FB 23 \r
+10 01 0E 93 06 24 4D 4D 1C 53 CC 4D FF FF 1E 83 \r
+FB 23 10 01 C2 93 88 1E 03 24 3C 40 84 1E 10 01 \r
+3C 40 BA F6 10 01 0D 93 02 20 0C 93 04 24 82 4C \r
+8A 1E 82 4D 8C 1E 10 01 0D 93 02 20 0C 93 04 24 \r
+82 4C 6C 1E 82 4D 6E 1E 10 01 B0 13 12 E0 B2 F0 \r
+EF FF 32 0F B2 D0 10 00 36 0F 10 01 82 43 9C 1E \r
+F2 40 0F 00 9E 1E B2 40 2C 01 A0 1E 10 01 A2 43 \r
+9A 1E 92 C3 44 03 B2 D0 10 00 44 03 10 01 A2 D2 \r
+80 03 82 43 80 03 B2 D0 00 02 80 03 10 01 CE 0C \r
+3C 40 E8 03 B0 13 8C EA 1E 83 FA 23 10 01 82 43 \r
+32 0F 82 43 36 0F B0 13 12 E0 80 00 3E EE 3E F0 \r
+1F 00 04 24 5C 02 0D 6D 1E 83 FC 23 10 01 3E F0 \r
+1F 00 04 24 5D 03 5C 00 1E 83 FC 23 10 01 7C 40 \r
+36 00 B0 13 06 BD 7C 40 39 00 80 00 06 BD 4F 43 \r
+C2 93 CA 1E 01 20 5F 43 C2 4F CA 1E 10 01 4F 43 \r
+C2 93 2F 1E 01 20 5F 43 C2 4F 2F 1E 10 01 4F 43 \r
+7C B0 80 FF 01 20 5F 43 CC 0F 10 01 C2 93 06 1E \r
+02 20 80 00 3C D1 80 00 B8 AD 4F 43 7C 90 0C 00 \r
+01 2C 5F 43 CC 0F 10 01 B0 13 DA EA B0 13 4A E8 \r
+5D 43 80 00 10 A0 D2 43 5E 1E 82 43 60 1E C2 43 \r
+58 1E 10 01 B2 F0 1F FF 04 0A 4C 4C 82 DC 04 0A \r
+10 01 1C 42 50 03 1C 92 50 03 FB 23 10 01 C2 93 \r
+9C 1D 02 24 D2 43 9B 1D 10 01 3D 40 79 1D 3E 40 \r
+21 00 80 00 60 ED B2 F0 DF FF 40 03 82 43 50 03 \r
+10 01 5C 43 B0 13 D2 CE 6C 43 80 00 D2 CE B0 13 \r
+4C E3 B2 D0 00 04 8C 1C 10 01 DC 93 0C 00 02 20 \r
+80 00 84 D8 10 01 B0 13 54 F0 B2 40 2B 5A 5C 01 \r
+10 01 4C 43 A2 93 EE 1D 01 20 5C 43 10 01 4C 43 \r
+92 93 EE 1D 01 20 5C 43 10 01 4C 43 82 93 EA 1C \r
+01 24 5C 43 10 01 4C 43 92 93 D0 1E 01 20 5C 43 \r
+10 01 CF 0C CC 0D CD 0F 2E 42 80 00 20 E9 CD 0C \r
+3C 40 80 1E 2E 42 80 00 60 ED 7C 40 03 00 7D 40 \r
+0B 00 80 00 36 D0 5C 93 02 20 CC 0D 10 01 CC 0E \r
+10 01 1C 42 8C 1C 49 19 0C 10 5C F3 10 01 1C 42 \r
+8C 1C 48 19 0C 10 5C F3 10 01 1C 42 8C 1C 46 19 \r
+0C 10 5C F3 10 01 1C 42 8C 1C 44 19 0C 10 5C F3 \r
+10 01 1C 42 8C 1C 45 19 0C 10 5C F3 10 01 1C 42 \r
+44 03 7C F0 10 00 10 01 B2 F0 EF FF 44 03 80 00 \r
+AE DF B2 F0 EF FF 08 1E 80 00 3C F0 B0 13 9E EB \r
+C2 4C EE 1E 10 01 B0 13 9E EB C2 4C 17 1E 10 01 \r
+7C 40 03 00 4D 43 80 00 36 D0 C2 43 A4 1E C2 43 \r
+AA 1E 10 01 82 43 EA 1C E2 42 16 1D 10 01 82 43 \r
+D0 1E 4C 43 80 00 9C BD 1C 42 8C 1C 8C 10 5C F3 \r
+10 01 1C 42 8C 1C 5C 0F 5C F3 10 01 5C 42 C6 1E \r
+8C 11 10 01 4C 5C C2 4C 49 1E 10 01 B2 F0 EF FF \r
+48 03 10 01 B2 D0 20 00 40 03 10 01 D2 43 E0 1E \r
+80 00 6A E8 32 D0 D8 00 03 43 10 01 5C 42 DC 1E \r
+10 01 C2 4C 48 1E 10 01 C2 4C 4A 1E 10 01 4D 43 \r
+80 00 06 C9 92 D3 44 03 10 01 92 C3 44 03 10 01 \r
+5C 42 78 1D 10 01 A2 D2 06 0A 10 01 82 43 76 1E \r
+10 01 CC 43 00 00 10 01 3C 40 D8 F6 10 01 92 D3 \r
+04 0A 10 01 92 C3 04 0A 10 01 80 00 86 98 1C 43 \r
+10 01 03 43 FF 3F 2C 43 10 01 2C 43 10 01 4C 43 \r
+10 01 6C 43 10 01 0C 43 10 01 0C 43 10 01 03 43 \r
+10 01 10 01 10 01 10 01 30 30 30 30 30 31 30 30 \r
+32 30 30 33 30 30 34 30 30 35 30 30 36 30 30 37 \r
+30 30 38 30 30 39 30 31 30 30 31 31 30 31 32 30 \r
+31 33 30 31 34 30 31 35 30 31 36 30 31 37 30 31 \r
+38 30 31 39 30 32 30 30 32 31 30 32 32 30 32 33 \r
+30 32 34 30 32 35 30 32 36 30 32 37 30 32 38 30 \r
+32 39 30 33 30 30 33 31 30 33 32 30 33 33 30 33 \r
+34 30 33 35 30 33 36 30 33 37 30 33 38 30 33 39 \r
+30 34 30 30 34 31 30 34 32 30 34 33 30 34 34 30 \r
+34 35 30 34 36 30 34 37 30 34 38 30 34 39 30 35 \r
+30 30 35 31 30 35 32 30 35 33 30 35 34 30 35 35 \r
+30 35 36 30 35 37 30 35 38 30 35 39 30 36 30 30 \r
+36 31 30 36 32 30 36 33 30 36 34 30 36 35 30 36 \r
+36 30 36 37 30 36 38 30 36 39 30 37 30 30 37 31 \r
+30 37 32 30 37 33 30 37 34 30 37 35 30 37 36 30 \r
+37 37 30 37 38 30 37 39 30 38 30 30 38 31 30 38 \r
+32 30 38 33 30 38 34 30 38 35 30 38 36 30 38 37 \r
+30 38 38 30 38 39 30 39 30 30 39 31 30 39 32 30 \r
+39 33 30 39 34 30 39 35 30 39 36 30 39 37 30 39 \r
+38 30 39 39 31 30 30 31 30 31 31 30 32 31 30 33 \r
+31 30 34 31 30 35 31 30 36 31 30 37 31 30 38 31 \r
+30 39 31 31 30 31 31 31 31 31 32 31 31 33 31 31 \r
+34 31 31 35 31 31 36 31 31 37 31 31 38 31 31 39 \r
+31 32 30 31 32 31 31 32 32 31 32 33 31 32 34 31 \r
+32 35 31 32 36 31 32 37 31 32 38 31 32 39 31 33 \r
+30 31 33 31 31 33 32 31 33 33 31 33 34 31 33 35 \r
+31 33 36 31 33 37 31 33 38 31 33 39 31 34 30 31 \r
+34 31 31 34 32 31 34 33 31 34 34 31 34 35 31 34 \r
+36 31 34 37 31 34 38 31 34 39 31 35 30 31 35 31 \r
+31 35 32 31 35 33 31 35 34 31 35 35 31 35 36 31 \r
+35 37 31 35 38 31 35 39 31 36 30 31 36 31 31 36 \r
+32 31 36 33 31 36 34 31 36 35 31 36 36 31 36 37 \r
+31 36 38 31 36 39 31 37 30 31 37 31 31 37 32 31 \r
+37 33 31 37 34 31 37 35 31 37 36 31 37 37 31 37 \r
+38 31 37 39 31 38 30 00 4E EC 00 00 98 EE 00 00 \r
+10 A0 00 00 A6 EF 00 00 9A F3 5E EE 00 00 D4 8B \r
+00 00 26 97 00 00 22 F0 00 00 1C F3 76 E0 00 00 \r
+58 A3 00 00 38 B4 00 00 8E EF 00 00 2E F3 D4 F0 \r
+00 00 5C A4 00 00 10 AB 00 00 B2 EF 00 00 40 F3 \r
+D6 F0 00 00 24 AA 00 00 38 A9 00 00 22 F0 00 00 \r
+52 F3 5E A5 00 00 8C F0 00 00 72 CB 00 00 22 F0 \r
+00 00 64 F3 D4 F0 00 00 D4 F0 00 00 DA AC 00 00 \r
+22 F0 00 00 76 F3 86 EB 00 00 D4 F0 00 00 AE 9D \r
+00 00 82 EF 00 00 0A F3 4E EE 00 00 D8 8F 00 00 \r
+E2 B1 00 00 18 F0 00 00 F8 F2 D4 F0 00 00 D4 F0 \r
+00 00 5E CD 00 00 9A EF 00 00 AC F3 6A E4 00 00 \r
+D4 F0 00 00 B4 EC 00 00 22 F0 00 00 BE F3 42 E4 \r
+00 00 D4 F0 00 00 A0 EC 00 00 22 F0 00 00 D0 F3 \r
+9C E5 00 00 D4 F0 00 00 C8 EC 00 00 22 F0 00 00 \r
+E2 F3 F4 EA 00 00 CA 91 00 00 7C EE 00 00 22 F0 \r
+00 00 F4 F3 90 D1 00 00 D4 F0 00 00 76 E3 00 00 \r
+22 F0 00 00 88 F3 01 80 40 20 10 08 84 42 21 90 \r
+48 A4 52 29 14 0A 85 C2 61 B0 58 AC D6 6B 35 9A \r
+CD 66 33 99 4C A6 53 A9 54 2A 95 CA E5 F2 79 3C \r
+9E CF 67 B3 D9 6C B6 5B 2D 16 0B 05 82 41 A0 50 \r
+28 94 4A A5 D2 69 34 1A 8D 46 23 91 C8 E4 72 39 \r
+1C 8E C7 E3 F1 F8 FC FE FF 7F 3F 1F 0F 07 83 C1 \r
+E0 70 38 9C CE E7 F3 F9 7C BE DF 6F 37 9B 4D 26 \r
+13 89 44 22 11 88 C4 62 31 98 CC E6 73 B9 5C AE \r
+D7 EB 75 BA DD 6E B7 DB 6D 36 1B 0D 06 03 81 C0 \r
+60 30 18 8C C6 63 B1 D8 EC F6 7B 3D 1E 8F 47 A3 \r
+D1 E8 F4 7A BD 5E AF 57 AB 55 AA D5 EA F5 FA FD \r
+7E BF 5F 2F 17 8B 45 A2 51 A8 D4 6A B5 DA ED 76 \r
+3B 1D 0E 87 C3 E1 F0 78 BC DE EF 77 BB 5D 2E 97 \r
+CB 65 B2 59 2C 96 4B 25 92 49 24 12 09 04 02 01 \r
+80 40 20 10 08 84 42 21 90 48 A4 52 29 14 0A 85 \r
+C2 61 B0 58 AC D6 6B 35 9A CD 66 33 99 4C A6 53 \r
+A9 54 2A 95 CA E5 45 52 52 00 20 20 44 4F 4E 45 \r
+00 00 30 30 30 30 30 30 30 00 20 43 4F 4E 46 00 \r
+20 52 46 42 53 4C 00 00 20 20 53 59 4E 43 00 00 \r
+20 20 20 50 50 54 00 00 20 20 20 41 43 43 00 00 \r
+2D 2D 2D 00 30 30 30 30 30 30 30 30 00 00 4C 42 \r
+00 00 4B 47 00 00 20 52 41 4D 00 00 30 34 33 30 \r
+00 00 43 43 34 33 30 00 20 4F 46 46 00 00 20 20 \r
+4F 4E 00 00 4C 4F 42 41 54 54 00 00 20 20 4F 50 \r
+45 4E 00 00 20 20 4C 4F 3F 54 00 00 2D 2D 2D 2D \r
+00 00 02 1B 01 1E 17 3C 18 10 06 1E 08 05 03 47 \r
+0B 08 0C 00 0D 21 0E 71 0F 7A 10 7B 11 83 12 13 \r
+13 22 14 F8 15 42 19 1D 1A 1C 1B C7 1C 00 1D B2 \r
+21 B6 22 10 23 EA 24 2A 25 00 26 1F 2C 81 2D 35 \r
+2E 09 F5 60 B6 F2 63 D3 D7 70 F7 F3 00 00 00 00 \r
+00 86 00 77 C7 95 E6 97 17 F3 67 05 F0 87 85 75 \r
+46 C6 37 F5 06 D3 87 C4 C4 02 67 E3 B6 00 03 01 \r
+04 08 10 80 80 80 80 20 40 02 01 80 04 02 10 20 \r
+40 08 08 80 08 08 08 08 F7 F7 F7 F7 20 40 04 80 \r
+7F 7F 7F 7F 7F 10 01 80 2F 1E 1B 07 37 B2 0A 04 \r
+00 00 00 0C 00 21 64 EC 4D 3B 15 11 F8 57 07 0C \r
+10 1D 1C C7 10 B0 FF FF F9 B6 10 EA 2A 00 1F 00 \r
+67 FF 00 00 6F 00 1C 02 DD 03 B1 05 9D 07 A2 09 \r
+C4 0B 07 0E 6E 10 01 13 C6 15 C8 18 11 1C B5 1F \r
+CC 23 07 04 F5 03 E8 03 B6 03 84 03 52 03 20 03 \r
+EE 02 BC 02 8A 02 58 02 26 02 F4 01 C2 01 90 01 \r
+5E 01 2C 01 52 E6 00 00 24 E7 00 00 56 EB 00 00 \r
+CA F0 00 00 C6 F0 00 00 3E DE 00 00 12 00 24 00 \r
+47 00 8F 00 1E 01 3B 02 76 04 79 56 34 12 02 01 \r
+01 01 00 00 32 34 48 00 31 32 48 00 4D 41 4C 45 \r
+46 45 4D 41 D2 1D D2 1D FF FF FF FF 00 32 50 6E \r
+0F 27 8C 00 02 00 00 \r
+@f6e8\r
+01 00 C2 1E 00 00 01 00 7E 1E 00 00 01 00 7F 1E \r
+0A 00 54 00 8E 1C 20 0A 20 0A 20 0A 20 0A 24 0A \r
+2A 0A 29 0A 27 0A 26 0A 24 0A 24 0A 26 0A 26 0A \r
+24 0A 26 0A 24 0A 26 0A 26 0A 26 0A 21 0A 22 0A \r
+20 0A 23 0A 24 0A 25 0A 26 0A 21 0A 22 0A 23 0A \r
+25 0A 20 0A 20 0A 24 0A 2B 0A 2B 0A 2A 0A 29 0A \r
+28 0A 27 0A 20 0A 24 0A 28 0A 02 00 E4 1E 00 00 \r
+01 00 41 1E 00 00 01 00 31 1D 00 00 02 00 E6 1E \r
+00 00 01 00 D1 1D 00 00 01 00 78 1D 00 00 01 00 \r
+9A 1D 00 00 01 00 9B 1D 00 00 01 00 9C 1D 00 00 \r
+02 00 9E 1D 00 00 02 00 A0 1D 00 00 01 00 A2 1D \r
+00 00 01 00 A4 1D FF 00 04 00 A8 1D 00 00 00 00 \r
+04 00 AC 1D 00 00 00 00 04 00 B0 1D 00 00 00 00 \r
+01 00 88 1E 00 00 01 00 62 1E 00 00 02 00 64 1E \r
+00 00 01 00 66 1E 00 00 04 00 68 1E 00 00 00 00 \r
+01 00 B4 1D 01 00 01 00 17 1E 00 00 02 00 EC 1E \r
+00 00 01 00 EE 1E 00 00 04 00 6C 1E 00 00 00 00 \r
+01 00 70 1E 00 00 01 00 74 1E 00 00 01 00 75 1E \r
+00 00 04 00 8A 1E 00 00 00 00 04 00 8E 1E 00 00 \r
+00 00 01 00 92 1E 00 00 01 00 48 1E 00 00 01 00 \r
+49 1E 00 00 01 00 4A 1E 00 00 01 00 4B 1E 00 00 \r
+02 00 94 1E 00 00 02 00 96 1E 00 00 01 00 98 1E \r
+00 00 01 00 99 1E 00 00 01 00 C6 1E 00 00 02 00 \r
+C8 1E 00 00 02 00 D8 1E 00 00 01 00 DA 1E 00 00 \r
+00 00 \r
+@ffe0\r
+DE 8D \r
+@ffea\r
+60 DD 02 C2 1E 85 C0 EA \r
+@fffe\r
+22 E3 \r
+q\r
diff --git a/chronos-ti/Recovery/Chronos Watch/Applications/Recovery_ez430_chronos_915MHz.txt b/chronos-ti/Recovery/Chronos Watch/Applications/Recovery_ez430_chronos_915MHz.txt
new file mode 100755 (executable)
index 0000000..e839739
--- /dev/null
@@ -0,0 +1,1936 @@
+@8000\r
+5A 14 31 80 1A 00 CA 0E B0 13 1C E0 0E 43 3F 40 \r
+C8 42 B0 13 D0 BE 81 4C 12 00 81 4D 14 00 CC 0A \r
+B0 13 72 E6 0E 43 3F 40 20 41 B0 13 D0 BE 81 4C \r
+16 00 81 4D 18 00 36 40 11 00 37 40 32 1D 0A 43 \r
+28 47 19 47 02 00 CC 08 CD 09 1E 41 12 00 1F 41 \r
+14 00 B0 13 84 D4 0C 93 0A 38 81 48 08 00 81 49 \r
+0A 00 27 52 1A 53 16 83 EB 23 4A 4A 03 3C 4A 4A \r
+0A 93 7E 24 3A 90 0F 00 3D 38 3A 90 0F 00 23 24 \r
+B0 13 86 82 1E 42 72 1D 1F 42 74 1D B0 13 D8 9E \r
+C9 0C CA 0D 1C 42 72 1D 1D 42 74 1D 1E 42 6E 1D \r
+1F 42 70 1D B0 13 3A 82 1C 42 5A F6 1C 82 58 F6 \r
+B0 13 4C 82 1C 42 5A F6 B0 13 60 82 81 4C 00 00 \r
+81 4D 02 00 73 3C B0 13 24 82 C9 0C CA 0D 1C 42 \r
+6E 1D 1D 42 70 1D 1E 41 08 00 1F 41 0A 00 B0 13 \r
+3A 82 1C 42 58 F6 1C 82 56 F6 B0 13 4C 82 1C 42 \r
+56 F6 E2 3F C9 0A 59 02 16 49 38 F6 5A 06 17 4A \r
+32 1D 18 4A 34 1D B0 13 24 82 C5 0C CA 0D B0 13 \r
+86 82 CE 07 CF 08 B0 13 D8 9E 3E 40 34 80 3F 40 \r
+37 3A B0 13 10 82 CC 05 CD 0A B0 13 44 B7 C5 0C \r
+CA 0D CC 07 CD 08 1E 41 08 00 1F 41 0A 00 B0 13 \r
+90 82 CC 05 CD 0A B0 13 D0 BE C8 0C CA 0D 1C 49 \r
+3A F6 0C 86 B0 13 4C DE CE 0C CF 0D CC 08 CD 0A \r
+B0 13 44 B7 C9 0C CA 0D CC 06 B0 13 60 82 A6 3F \r
+B0 13 86 82 1E 42 32 1D 1F 42 34 1D B0 13 D8 9E \r
+C9 0C CA 0D 1C 42 36 1D 1D 42 38 1D 1E 42 32 1D \r
+1F 42 34 1D B0 13 3A 82 1C 42 3C F6 1C 82 3A F6 \r
+B0 13 56 82 81 4C 00 00 81 4D 02 00 2C 41 1D 41 \r
+02 00 B0 13 6A 82 3E 40 F4 FD 3F 40 D4 3B B0 13 \r
+10 82 1C 41 16 00 1D 41 18 00 B0 13 D0 BE 81 4C \r
+04 00 81 4D 06 00 1C 41 04 00 1D 41 06 00 B0 13 \r
+6A 82 2E 41 1F 41 02 00 B0 13 44 B7 81 4C 0C 00 \r
+81 4D 0E 00 1C 41 0C 00 1D 41 0E 00 B0 13 50 D7 \r
+81 4C 10 00 1C 41 10 00 31 50 1A 00 55 16 10 01 \r
+B0 13 44 B7 CE 0C CF 0D 0C 43 3D 40 80 3F B0 13 \r
+90 82 10 01 1C 41 16 00 1D 41 18 00 1E 41 0C 00 \r
+1F 41 0E 00 B0 13 D8 9E 10 01 B0 13 90 82 CC 09 \r
+CD 0A B0 13 D0 BE C9 0C CA 0D 10 01 B0 13 56 82 \r
+C9 0C CA 0D 10 01 B0 13 78 82 B0 13 44 B7 10 01 \r
+B0 13 78 82 B0 13 DE 9E 10 01 3E 40 E7 6F 3F 40 \r
+63 3B B0 13 44 B7 10 01 B0 13 4C DE CE 0C CF 0D \r
+CC 09 CD 0A 10 01 1C 41 16 00 1D 41 18 00 10 01 \r
+B0 13 D8 9E CE 0C CF 0D 10 01 4A 14 31 82 B0 13 \r
+AC EE C8 0C CF 08 3F 50 FF 7F 81 4F 06 00 91 41 \r
+06 00 04 00 82 43 46 1E 4A 43 49 43 4C 49 B0 13 \r
+04 85 1F 4C 18 00 1F 83 1D 24 1F 83 14 24 D2 B3 \r
+D6 1E 47 24 1E 42 4E 1E 1F 42 50 1E 3E F3 3F F0 \r
+FF 00 1F 9C 02 00 3D 20 2E 9C 3B 20 D2 C3 D6 1E \r
+82 43 46 1E 36 3C 5A 53 B0 13 BC D2 4C 93 31 24 \r
+C7 09 2F 3C B0 13 30 EA C6 0C CC 09 B0 13 E0 DA \r
+4C 93 0C 20 CC 09 CD 06 CE 08 B0 13 2E A1 1F 42 \r
+44 1E AF 93 18 00 09 20 5A 53 07 3C 82 43 46 1E \r
+E2 B2 D6 1E 02 20 B0 13 EA DE 1F 42 44 1E 9F 93 \r
+18 00 0F 20 CF 01 3F 50 03 00 81 4F 00 00 CC 06 \r
+CD 01 3D 50 06 00 CE 01 2E 52 CF 01 2F 53 B0 13 \r
+C6 D1 59 53 AB 27 4A 93 50 24 92 93 46 1E 18 38 \r
+4C 47 B0 13 04 85 CC 07 B0 13 8E B6 4C 93 10 24 \r
+5A 83 CF 01 3F 50 03 00 81 4F 00 00 7C 42 CD 01 \r
+3D 50 06 00 CE 01 2E 52 CF 01 2F 53 B0 13 C6 D1 \r
+4A 93 33 24 1F 42 42 1E 0F 88 1F 93 2C 34 E2 B2 \r
+D6 1E 0D 20 E2 D2 D6 1E C2 93 4B 1E 04 20 B2 50 \r
+E0 7F 42 1E 20 3C B2 50 C0 53 42 1E 1C 3C E2 C2 \r
+D6 1E C2 93 4B 1E 03 24 3F 40 40 6C 02 3C 3F 40 \r
+20 00 82 5F 42 1E 49 43 4C 49 B0 13 04 85 AC 93 \r
+18 00 07 20 CC 09 B0 13 A6 E2 4C 93 02 20 5A 83 \r
+04 24 59 53 F1 27 4A 93 0E 20 F2 F0 F9 00 D6 1E \r
+91 91 06 00 04 00 02 24 0E 43 08 3C B0 13 B2 EF \r
+A2 43 9A 1E 6C 3C E2 D3 D6 1E 1E 43 1F 41 06 00 \r
+0F 88 0F 93 50 38 0E 93 38 24 E2 B2 D6 1E 15 20 \r
+1F 41 06 00 1F 82 42 1E 3F 80 42 00 0F 93 2D 38 \r
+C2 43 98 1E C2 43 99 1E F2 D0 18 00 D6 1E 92 42 \r
+42 1E 94 1E A2 43 9A 1E 48 3C 1F 41 06 00 0F 88 \r
+3F 80 42 00 1F 93 19 38 C2 43 98 1E C2 43 99 1E \r
+F2 D0 18 00 D6 1E 1F 41 06 00 1F 82 42 1E 3F 80 \r
+42 00 0F 93 05 34 1F 41 06 00 3F 80 42 00 02 3C \r
+1F 42 42 1E 82 4F 94 1E 26 3C D2 41 02 00 98 1E \r
+D2 41 03 00 99 1E 5F 42 D6 1E 7F C2 7F D0 10 00 \r
+C2 4F D6 1E 92 41 06 00 94 1E 92 41 04 00 96 1E \r
+82 43 9A 1E 12 3C D2 91 02 00 98 1E 09 24 D2 41 \r
+02 00 98 1E D2 41 03 00 99 1E F2 D0 10 00 D6 1E \r
+92 41 04 00 94 1E 92 43 9A 1E D2 C3 D6 1E 31 52 \r
+46 16 10 01 3D 40 1C 00 B0 13 10 EC 1C 52 BE F6 \r
+82 4C 44 1E 10 01 4F 14 B2 F0 EF FF 42 03 92 C3 \r
+42 03 B2 80 00 80 52 03 B2 D0 10 00 42 03 B0 13 \r
+04 CE B2 D0 10 00 8C 1C B0 13 24 EF 4C 93 EE 20 \r
+B0 13 18 EF 4C 93 EA 20 E2 93 2E 1E 04 28 A2 D3 \r
+0A 1E B0 13 34 E9 E2 93 E0 1E 11 20 5E 42 E1 1E \r
+CF 0E 5F 83 C2 4F E1 1E 4E 93 06 20 F2 40 0A 00 \r
+E1 1E B0 13 36 F0 03 3C B2 D0 10 00 0A 1E B0 13 \r
+30 EF 4C 93 02 24 92 D3 0A 1E B0 13 38 ED 4C 93 \r
+0D 24 92 83 24 1E 04 20 B0 13 14 EA B0 13 5A 87 \r
+F2 B0 40 00 01 02 02 24 A2 D2 0A 1E B0 13 26 ED \r
+4C 93 12 24 92 83 60 1E 09 20 B0 13 B8 DF B0 13 \r
+5A 87 7C 40 1F 00 4D 43 B0 13 DA E8 F2 B0 20 00 \r
+01 02 02 24 B2 D2 0A 1E B0 13 0C EF 4C 93 02 24 \r
+B0 13 3C BE B2 B0 20 00 08 1E 10 24 5E 42 9E 1E \r
+CF 0E 5F 83 C2 4F 9E 1E 4E 93 08 20 92 D3 0C 1E \r
+B2 D0 20 00 0C 1E F2 40 0F 00 9E 1E 82 93 0C 1E \r
+0F 24 92 B3 0C 1E 08 20 A2 B2 0C 1E 09 24 A2 C2 \r
+0C 1E 92 D3 8C 1C 04 3C 92 C3 0C 1E A2 D3 0C 1E \r
+A2 B3 08 1E 0E 24 1F 42 26 1E 1E 42 28 1E 1F 82 \r
+2A 1E 1E 72 2C 1E 03 20 3F 90 1F 00 02 28 92 D3 \r
+08 1E D2 93 7B 1E 0E 20 E2 92 7A 1E 03 2C D2 53 \r
+7A 1E 08 3C F2 C2 03 02 F2 C2 05 02 C2 43 7A 1E \r
+C2 43 7B 1E E2 B3 01 02 03 24 D2 B3 01 02 2F 20 \r
+C2 43 C2 1E E2 B2 01 02 11 24 D2 53 78 1E F2 90 \r
+03 00 78 1E 0D 28 B2 D0 20 00 76 1E B2 F0 7F FF \r
+76 1E C2 43 78 1E E2 C2 19 02 02 3C C2 43 78 1E \r
+E2 B3 01 02 11 24 D2 53 79 1E F2 90 03 00 79 1E \r
+47 28 B2 D0 40 00 76 1E B2 F0 FF FE 76 1E C2 43 \r
+79 1E E2 C3 19 02 3C 3C C2 43 79 1E 39 3C D2 53 \r
+C2 1E 5F 42 C2 1E 5F 83 7F 90 03 00 31 28 1F 42 \r
+08 1E 2F C2 2E 42 1E C2 08 1E 0E DF 82 4E 08 1E \r
+92 D3 0C 1E A2 B2 08 1E 04 20 B2 D0 10 00 0C 1E \r
+02 3C B2 D2 0C 1E C2 43 C2 1E 1A 3C 82 93 EC 1C \r
+04 20 F2 D0 20 00 F0 1C 02 3C 92 83 EC 1C B2 90 \r
+03 00 EA 1C 0D 20 C2 93 EE 1C 08 20 7C 40 5A 00 \r
+3D 40 12 F5 5E 43 B0 13 7A AF 02 3C D2 83 EE 1C \r
+B1 C0 D0 00 14 00 4B 16 00 13 7C 40 46 00 3D 40 \r
+76 F5 5E 43 B0 13 7A AF 6C 43 4D 43 B0 13 DA E8 \r
+7C 40 03 00 4D 43 B0 13 DA E8 10 01 4A 14 B0 13 \r
+D0 EE 82 43 08 0A 7C 40 46 00 3D 40 46 F5 5E 43 \r
+B0 13 7A AF 7C 40 5B 00 3D 40 4C F5 5E 43 B0 13 \r
+7A AF 7C 40 1E 00 B0 13 A6 89 7C 40 13 00 B0 13 \r
+A6 89 7C 40 14 00 B0 13 A6 89 7C 40 15 00 B0 13 \r
+A6 89 7C 40 16 00 B0 13 A6 89 7C 40 17 00 B0 13 \r
+A6 89 7C 40 18 00 B0 13 A6 89 7C 40 19 00 B0 13 \r
+A6 89 6C 43 B0 13 A6 89 7C 40 03 00 B0 13 A6 89 \r
+4C 43 B0 13 A6 89 B2 40 80 5A 5C 01 32 D0 D8 00 \r
+03 43 B0 13 64 EC B0 13 2E F0 B0 13 9C 89 E2 B2 \r
+01 02 04 24 F2 B0 10 00 01 02 09 20 B0 13 9C 89 \r
+82 43 76 1E F2 C2 03 02 F2 C2 05 02 AE 3C 49 43 \r
+5A 43 4A 93 71 24 B0 13 64 EC 4A 43 4F 49 0F 93 \r
+5E 24 1F 83 49 24 1F 83 36 24 1F 83 10 24 1F 83 \r
+5F 20 A2 D2 76 1E B0 13 68 A5 B0 13 9C 89 B0 13 \r
+3C BE 5D 43 B0 13 5C CB B0 13 CE D4 51 3C B0 13 \r
+0E C3 28 42 06 43 07 43 3C 40 00 20 B0 13 8A CC \r
+B0 13 24 E3 5C 42 59 1E CD 06 B0 13 8E 89 7C 40 \r
+47 00 5E 43 B0 13 7A AF 5C 42 5B 1E CD 07 B0 13 \r
+8E 89 7C 40 5D 00 5E 43 B0 13 7A AF 18 83 E4 23 \r
+B0 13 B8 DF 2D 3C 5D 43 B0 13 1A AB 28 42 3C 40 \r
+00 20 B0 13 8A CC 4C 43 B0 13 A6 BD 6D 43 B0 13 \r
+1A AB 18 83 F4 23 1C 3C 5D 43 B0 13 42 A9 28 43 \r
+F2 B0 40 00 01 02 FC 27 4C 43 B0 13 A0 BA 6D 43 \r
+B0 13 42 A9 18 83 F4 23 B0 13 14 EA 09 3C B0 13 \r
+16 EB E2 B2 01 02 04 24 F2 B0 10 00 01 02 F9 23 \r
+3C 40 99 19 B0 13 8A CC E2 B2 01 02 2D 20 E2 B3 \r
+01 02 27 20 F2 B0 10 00 01 02 1F 20 D2 B3 01 02 \r
+19 20 F2 B2 01 02 22 24 F2 B2 01 02 FD 23 92 C3 \r
+00 0A 82 43 08 0A 3C 40 00 40 B0 13 8A CC B0 13 \r
+D0 EE B2 40 80 5A 5C 01 32 D0 F8 00 03 43 92 43 \r
+5C 01 0C 3C 69 42 5A 43 09 3C 79 40 03 00 5A 43 \r
+05 3C 69 43 5A 43 02 3C 59 43 5A 43 B2 40 2B 5A \r
+5C 01 32 D0 D8 00 03 43 54 3F 46 16 10 01 7E 40 \r
+03 00 4F 43 B0 13 06 B5 CD 0C 10 01 3C 40 CC 0C \r
+B0 13 8A CC 10 01 5D 43 B0 13 DA E8 10 01 6A 14 \r
+31 80 10 00 C8 0F C5 0E 81 4D 02 00 C7 0C 3F 01 \r
+3A 00 71 0F 08 00 5F 41 38 00 81 4F 04 00 16 41 \r
+36 00 91 41 32 00 0C 00 91 41 34 00 0E 00 19 41 \r
+30 00 82 43 76 1E B0 13 70 F0 B0 13 42 E8 5F 42 \r
+34 1E 81 4F 06 00 E2 43 34 1E 82 43 7C 1E B0 13 \r
+B8 EB 7C 40 60 00 B0 13 9E EE 1A 43 54 43 B6 3C \r
+0E 43 A2 B2 76 1E 01 24 1E 43 3F 40 10 00 0F F6 \r
+0E 93 23 24 3A B0 00 80 0E 7E 3E E3 87 5A 00 00 \r
+87 6E 02 00 1E 41 0E 00 1E 97 02 00 05 38 12 20 \r
+1E 41 0C 00 2E 97 0E 2C 16 B3 03 24 CD 08 CE 09 \r
+04 3C 1D 41 0C 00 1E 41 0E 00 87 4D 00 00 87 4E \r
+02 00 1A 43 A2 C2 76 1E 54 43 B2 B2 76 1E 20 24 \r
+3A B0 00 80 0E 7E 3E E3 87 8A 00 00 87 7E 02 00 \r
+87 99 02 00 04 38 11 20 87 98 00 00 0E 2C 16 B3 \r
+05 24 1D 41 0C 00 1E 41 0E 00 02 3C CD 08 CE 09 \r
+87 4D 00 00 87 4E 02 00 1A 43 B2 C2 76 1E 54 43 \r
+0F 93 35 24 3E 40 1E 00 1E 52 7C 1E 18 24 3E 80 \r
+0A 00 18 24 3E 80 0A 00 18 24 3E 80 0A 00 26 24 \r
+3E 80 0A 00 12 24 3E 80 0A 00 0C 24 3E 80 0A 00 \r
+06 24 1A 93 1C 24 4F 43 5F 93 09 24 18 3C 3A 40 \r
+E8 03 05 3C 3A 40 64 00 02 3C 3A 40 0A 00 2C 47 \r
+1D 47 02 00 3A B0 00 80 0F 7F 3F E3 CE 0A B0 13 \r
+28 D9 87 8E 00 00 87 7F 02 00 01 3C 1A 43 44 93 \r
+2B 24 26 B2 1C 24 87 93 02 00 11 34 6C 43 4D 43 \r
+B0 13 DA E8 7C 40 03 00 5D 43 B0 13 DA E8 2D 47 \r
+1E 47 02 00 3D E3 3E E3 1D 53 0E 63 0B 3C 6C 43 \r
+5D 43 B0 13 BC 8B 2D 47 1E 47 02 00 03 3C 2D 47 \r
+1E 47 02 00 C1 45 00 00 1C 41 04 00 1F 41 02 00 \r
+3B 01 08 00 4B 13 44 43 B0 13 00 EF 92 B3 08 1E \r
+09 20 92 B3 76 1E 06 20 A2 B3 76 1E 41 27 36 B0 \r
+20 00 3E 27 6C 43 4D 43 B0 13 BC 8B 7C 40 E0 00 \r
+B0 13 9E EE B0 13 70 F0 B0 13 BC EF 1F 41 06 00 \r
+C2 4F 34 1E 31 50 10 00 64 16 10 01 B0 13 DA E8 \r
+7C 40 03 00 4D 43 B0 13 DA E8 10 01 0A 14 31 80 \r
+1E 00 B0 13 50 E9 B2 B0 40 00 08 1E 05 20 91 43 \r
+0E 00 81 43 10 00 04 3C 81 43 0E 00 81 43 10 00 \r
+1A 41 0E 00 5F 42 30 1E 81 4F 12 00 81 43 14 00 \r
+5F 42 31 1E 81 4F 16 00 81 43 18 00 5F 42 32 1E \r
+81 4F 1A 00 81 43 1C 00 4E 43 9F 3C 4F 4E 0F 93 \r
+07 24 1F 83 55 24 1F 83 40 24 1F 83 2C 24 95 3C \r
+B0 13 DC EE B0 13 CC 8D 0F 43 81 43 00 00 91 43 \r
+02 00 81 43 04 00 B1 40 29 00 06 00 F1 40 49 00 \r
+08 00 00 18 F1 40 CE EB 0A 00 CC 01 3C 50 0E 00 \r
+5D 43 4E 43 B0 13 AE 89 81 93 10 00 07 20 81 93 \r
+0E 00 04 20 B2 D0 40 00 08 1E 03 3C B2 F0 BF FF \r
+08 1E 5E 43 6A 3C B0 13 A8 8D F1 40 5E 00 08 00 \r
+00 18 F1 40 DA E6 0A 00 CC 01 3C 50 1A 00 6D 43 \r
+4E 43 B0 13 AE 89 4E 43 58 3C B0 13 A8 8D F1 40 \r
+48 00 08 00 00 18 F1 40 DA E6 0A 00 CC 01 3C 50 \r
+16 00 6D 43 4E 43 B0 13 AE 89 7E 40 03 00 45 3C \r
+1C 41 12 00 1D 41 14 00 B0 13 C0 8D 7C 40 4A 00 \r
+5E 43 B0 13 7A AF 7C 40 1E 00 5D 43 B0 13 DA E8 \r
+1C 41 16 00 1D 41 18 00 B0 13 C0 8D 7C 40 48 00 \r
+5E 43 B0 13 7A AF 1C 41 1A 00 1D 41 1C 00 B0 13 \r
+C0 8D 7C 40 5E 00 5E 43 B0 13 7A AF 7C 40 29 00 \r
+5D 43 B0 13 DA E8 0F 43 81 43 00 00 B1 40 17 00 \r
+02 00 81 43 04 00 B1 40 23 00 06 00 F1 40 4A 00 \r
+08 00 00 18 F1 40 C4 D6 0A 00 CC 01 3C 50 12 00 \r
+6D 43 4E 43 B0 13 AE 89 6E 43 92 B3 08 1E 13 20 \r
+92 B3 76 1E 5B 27 B0 13 D0 EE D2 41 12 00 30 1E \r
+D2 41 16 00 31 1E D2 41 1A 00 32 1E B0 13 2E F0 \r
+B0 13 CC 8D 0B 3C 0A 93 04 20 B2 D0 40 00 08 1E \r
+03 3C B2 F0 BF FF 08 1E B0 13 CC 8D 82 43 76 1E \r
+31 50 1E 00 0A 16 10 01 0F 43 81 43 04 00 B1 40 \r
+3B 00 06 00 81 43 08 00 B1 40 23 00 0A 00 10 01 \r
+6E 43 4F 43 B0 13 06 B5 CD 0C 10 01 4C 43 4D 43 \r
+B0 13 DA E8 10 01 7F 14 59 42 1B 02 B2 B0 20 00 \r
+76 1E EA 20 B2 B0 40 00 76 1E E6 20 82 43 76 1E \r
+5A 42 1D 02 4A F9 48 43 B0 13 24 EF 4C 93 6D 20 \r
+7A B0 1F 00 0F 24 32 C2 03 43 C2 43 1B 02 32 D2 \r
+3C 40 A3 00 B0 13 8A CC 92 42 26 1E 2A 1E 92 42 \r
+28 1E 2C 1E 6A B2 44 20 6A B3 2D 20 7A B0 10 00 \r
+22 20 5A B3 0E 20 7A B2 77 24 F2 B2 01 02 74 24 \r
+D2 43 7B 1E C2 43 7A 1E F2 D2 03 02 F2 D2 05 02 \r
+6B 3C D2 B3 01 02 68 24 B2 D2 76 1E 58 43 B0 13 \r
+C8 EC 4C 93 61 24 A2 B2 08 1E 5E 20 B0 13 B2 EA \r
+B2 C2 76 1E 59 3C F2 B0 10 00 01 02 55 24 A2 D2 \r
+76 1E 58 43 51 3C E2 B3 01 02 0B 20 E2 B3 19 02 \r
+4B 24 A2 D3 76 1E B2 F0 FF FE 76 1E E2 C3 19 02 \r
+43 3C A2 D3 76 1E B2 F0 FF FE 76 1E 58 43 3C 3C \r
+E2 B2 01 02 0B 20 E2 B2 19 02 36 24 92 D3 76 1E \r
+B2 F0 7F FF 76 1E E2 C2 19 02 2E 3C 92 D3 76 1E \r
+B2 F0 7F FF 76 1E 58 43 27 3C D2 53 7E 1E 5F 42 \r
+7E 1E 5F 83 7F 90 07 00 05 28 F2 F0 0F 00 F2 1C \r
+C2 43 7E 1E 6A B2 13 20 6A B3 0D 20 7A B0 10 00 \r
+06 20 5A B3 11 24 F2 D0 20 00 F0 1C 0D 3C F2 D0 \r
+30 00 F2 1C 07 3C F2 D0 20 00 F2 1C 03 3C F2 D0 \r
+10 00 F2 1C F2 D2 F0 1C A2 B3 76 1E 03 24 B2 B2 \r
+76 1E 18 20 48 93 18 24 E2 93 E0 1E 0A 24 B2 B0 \r
+10 00 08 1E 0A 20 5C 43 3D 40 33 13 B0 13 AA D5 \r
+04 3C B0 13 36 F0 82 43 76 1E 3C 40 00 20 B0 13 \r
+8A CC 02 3C 82 43 76 1E 7A B0 20 00 02 24 B2 D2 \r
+0A 1E 7A B0 40 00 02 24 A2 D2 0A 1E 92 B3 76 1E \r
+03 20 A2 B3 76 1E 18 24 3C 40 66 06 B0 13 8A CC \r
+E2 B2 01 02 07 24 E2 D2 19 02 92 C3 76 1E B2 D0 \r
+80 00 76 1E E2 B3 01 02 07 24 E2 D3 19 02 A2 C3 \r
+76 1E B2 D0 00 01 76 1E 32 C2 03 43 C2 43 1D 02 \r
+C2 49 1B 02 32 D2 B1 C0 F0 00 20 00 78 16 00 13 \r
+0A 14 31 80 1A 00 B0 13 50 E9 5F 42 CB 1E 4C 4F \r
+0D 43 4E 4F 81 4E 0E 00 81 43 10 00 5E 42 CC 1E \r
+81 4E 12 00 81 43 14 00 91 42 CE 1E 16 00 81 43 \r
+18 00 B2 B0 40 00 08 1E 0D 20 4C 4F B0 13 B6 91 \r
+7C 40 48 00 B0 13 86 91 7C 40 4A 00 5E 43 B0 13 \r
+7A AF 0B 3C B0 13 B6 91 7C 40 4A 00 B0 13 86 91 \r
+7C 40 48 00 5E 43 B0 13 7A AF 7C 40 1F 00 5D 43 \r
+B0 13 DA E8 4A 43 70 3C 4F 4A 0F 93 3E 24 1F 83 \r
+1F 24 1F 83 55 20 B2 B0 40 00 08 1E 0C 20 B0 13 \r
+9A 91 B0 13 52 91 CC 01 3C 50 0E 00 6D 43 4E 43 \r
+B0 13 AE 89 0B 3C B0 13 9A 91 B0 13 6C 91 CC 01 \r
+3C 50 0E 00 6D 43 4E 43 B0 13 AE 89 4A 43 38 3C \r
+B2 B0 40 00 08 1E 0C 20 B0 13 A8 91 B0 13 6C 91 \r
+CC 01 3C 50 12 00 6D 43 4E 43 B0 13 AE 89 0B 3C \r
+B0 13 A8 91 B0 13 52 91 CC 01 3C 50 12 00 6D 43 \r
+4E 43 B0 13 AE 89 6A 43 1B 3C 3F 40 D8 07 81 43 \r
+00 00 B1 40 34 08 02 00 81 43 04 00 B1 40 22 00 \r
+06 00 F1 40 5C 00 08 00 00 18 F1 40 DA E6 0A 00 \r
+CC 01 3C 50 16 00 6D 42 4E 43 B0 13 AE 89 5A 43 \r
+5C 41 12 00 1D 41 16 00 B0 13 0A C2 4F 4C 0E 43 \r
+1E 91 10 00 04 38 08 20 1F 91 0E 00 05 2C 4F 4C \r
+81 4F 0E 00 81 43 10 00 92 B3 08 1E 0C 20 92 B3 \r
+76 1E 8A 27 D2 41 0E 00 CB 1E D2 41 12 00 CC 1E \r
+92 41 16 00 CE 1E 82 43 76 1E 31 50 1A 00 0A 16 \r
+10 01 81 43 08 00 B1 40 23 00 0A 00 F1 40 48 00 \r
+0C 00 00 18 F1 40 DA E6 0E 00 10 01 81 43 08 00 \r
+B1 40 23 00 0A 00 F1 40 4A 00 0C 00 00 18 F1 40 \r
+DA E6 0E 00 10 01 5E 43 B0 13 7A AF 1C 41 16 00 \r
+1D 41 18 00 B0 13 B6 91 10 01 1F 43 81 43 04 00 \r
+4C 4C 81 4C 06 00 10 01 1F 43 81 43 04 00 B1 40 \r
+0C 00 06 00 10 01 6E 43 4F 43 B0 13 06 B5 CD 0C \r
+10 01 31 80 1A 00 B0 13 50 E9 5F 42 F6 1D 81 4F \r
+0E 00 81 43 10 00 1C 42 FC 1D 1D 42 FE 1D 3E 40 \r
+E8 03 0F 43 B0 13 1E D0 81 4C 16 00 81 4D 18 00 \r
+B2 B0 40 00 08 1E 12 20 1C 42 F8 1D 0D 43 3E 40 \r
+B9 01 0F 43 B0 13 1E E7 3E 40 C8 00 0F 43 B0 13 \r
+28 D9 81 4C 12 00 81 4D 14 00 05 3C 91 42 F8 1D \r
+12 00 81 43 14 00 4E 43 82 3C 4F 4E 0F 93 55 24 \r
+1F 83 39 24 1F 83 7B 20 B2 B0 40 00 08 1E 19 20 \r
+7C 40 5E 00 3D 40 38 F5 5E 43 B0 13 7A AF 3F 40 \r
+46 00 81 43 00 00 B1 40 90 01 02 00 B0 13 98 93 \r
+CC 01 3C 50 12 00 7D 40 03 00 6E 43 B0 13 AE 89 \r
+18 3C 7C 40 5E 00 3D 40 3C F5 5E 43 B0 13 7A AF \r
+3F 40 1E 00 81 43 00 00 B1 40 96 00 02 00 B0 13 \r
+98 93 CC 01 3C 50 12 00 7D 40 03 00 6E 43 B0 13 \r
+AE 89 4E 43 44 3C 0F 43 81 43 00 00 91 43 02 00 \r
+81 43 04 00 B1 40 29 00 06 00 F1 40 5C 00 08 00 \r
+00 18 F1 40 E4 EB 0A 00 CC 01 3C 50 0E 00 5D 43 \r
+4E 43 B0 13 AE 89 6E 43 2A 3C 7C 40 10 00 5D 43 \r
+B0 13 DA E8 0F 43 81 43 00 00 B1 40 3F 0D 02 00 \r
+B1 40 03 00 04 00 B1 40 32 00 06 00 F1 40 5A 00 \r
+08 00 00 18 F1 40 DA E6 0A 00 CC 01 3C 50 16 00 \r
+7D 40 06 00 7E 40 05 00 B0 13 AE 89 7C 40 10 00 \r
+4D 43 B0 13 DA E8 6C 43 B0 13 BA CE 5E 43 92 B3 \r
+08 1E 2D 20 92 B3 76 1E 78 27 1C 41 16 00 1D 41 \r
+18 00 3E 40 E8 03 0F 43 B0 13 1E E7 82 4C FC 1D \r
+82 4D FE 1D D2 41 0E 00 F6 1D B2 B0 40 00 08 1E \r
+11 20 1C 41 12 00 1D 41 14 00 3E 40 C8 00 0F 43 \r
+B0 13 1E E7 3E 40 B9 01 0F 43 B0 13 28 D9 82 4C \r
+F8 1D 03 3C 92 41 12 00 F8 1D A2 D2 8C 1C 82 43 \r
+76 1E 31 50 1A 00 10 01 81 43 08 00 B1 40 22 00 \r
+0A 00 F1 40 62 00 0C 00 00 18 F1 40 DA E6 0E 00 \r
+10 01 6A 14 31 80 20 00 C8 0F C9 0D CA 0E 81 43 \r
+0C 00 81 43 0E 00 B0 13 4C DE 81 4C 14 00 81 4D \r
+16 00 CC 09 CD 0A B0 13 1C E0 0E 43 3F 40 C8 42 \r
+B0 13 D0 BE 81 4C 18 00 81 4D 1A 00 CC 08 B0 13 \r
+72 E6 0E 43 3F 40 20 41 B0 13 D0 BE 81 4C 1C 00 \r
+81 4D 1E 00 1C 41 14 00 1D 41 16 00 3E 40 F4 FD \r
+3F 40 D4 3B B0 13 44 B7 1E 41 1C 00 1F 41 1E 00 \r
+B0 13 DE 9E 81 4C 10 00 81 4D 12 00 1C 41 10 00 \r
+1D 41 12 00 3E 40 E7 6F 3F 40 63 3B B0 13 44 B7 \r
+CE 0C CF 0D 1C 41 14 00 1D 41 16 00 B0 13 D0 BE \r
+81 4C 08 00 81 4D 0A 00 36 40 10 00 37 40 3A F6 \r
+0A 43 2C 47 B0 13 58 95 CE 08 CF 09 B0 13 84 D4 \r
+0C 93 08 38 81 48 0C 00 81 49 0E 00 27 53 1A 53 \r
+16 83 EF 23 4A 4A 5A 02 1C 4A 5A F6 B0 13 72 E6 \r
+C6 0C C7 0D 1C 4A 3A F6 B0 13 58 95 B0 13 7C 95 \r
+C4 0C C5 0D 1C 41 08 00 1D 41 0A 00 CE 08 CF 09 \r
+B0 13 D8 9E 3E 40 82 A8 3F 40 7B 38 B0 13 44 B7 \r
+CE 0C CF 0D 0C 43 3D 40 80 3F B0 13 6A 95 C4 0C \r
+C5 0D 1C 4A 5C F6 B0 13 72 E6 CE 06 CF 07 B0 13 \r
+6A 95 C5 0C CA 0D CC 08 CD 09 B0 13 7C 95 CE 0C \r
+CF 0D CC 05 CD 0A B0 13 D0 BE CE 06 CF 07 B0 13 \r
+DE 9E 81 4C 04 00 81 4D 06 00 1C 41 18 00 1D 41 \r
+1A 00 1E 41 04 00 1F 41 06 00 B0 13 D0 BE 81 4C \r
+00 00 81 4D 02 00 38 40 11 00 3A 40 32 1D 39 40 \r
+5C F6 3C 49 B0 13 72 E6 2E 41 1F 41 02 00 B0 13 \r
+44 B7 2A 52 8A 4C FC FF 8A 4D FE FF 18 83 F1 23 \r
+31 50 20 00 64 16 10 01 B0 13 4C DE C8 0C C9 0D \r
+1C 41 0C 00 1D 41 0E 00 10 01 B0 13 D8 9E CE 0C \r
+CF 0D CC 04 CD 05 B0 13 44 B7 10 01 1E 41 10 00 \r
+1F 41 12 00 B0 13 D8 9E 10 01 3C 40 79 1D 0D 43 \r
+3E 40 21 00 B0 13 5C ED 7C 40 30 00 B0 13 5A C6 \r
+7C 40 30 00 B0 13 0A D7 4C 93 AF 20 7C 40 31 00 \r
+B0 13 0A D7 7C 90 06 00 A5 20 7C 40 36 00 B0 13 \r
+5A C6 B0 13 10 97 FD 23 B2 40 01 02 34 0F 0F 42 \r
+32 C2 03 43 B2 B0 10 00 02 0F FC 27 B2 40 51 7E \r
+10 0F B2 B0 10 00 02 0F FC 27 F2 40 3D 00 11 0F \r
+B2 B0 10 00 02 0F FC 27 F2 40 FE 00 11 0F B2 B0 \r
+20 00 02 0F FC 27 C2 43 10 0F B2 B0 80 00 02 0F \r
+FC 27 F2 90 51 00 20 0F 72 20 B2 B0 10 00 02 0F \r
+FC 27 F2 40 3D 00 11 0F 02 4F 3B 40 7C F5 4E 43 \r
+6C 4B 4F 4E 5F 02 5D 4F 7D F5 B0 13 1E DF 2B 53 \r
+5E 53 7E 90 20 00 F4 2B 3D 40 7C F5 4E 43 6C 4D \r
+B0 13 0A D7 4F 4E 5F 02 CF 9C 7D F5 4D 20 2D 53 \r
+5E 53 7E 90 20 00 F3 2B 7C 40 36 00 B0 13 5A C6 \r
+B0 13 10 97 FD 23 7C 40 0C 00 5D 42 16 1E B0 13 \r
+1E DF B0 13 80 E8 6C 43 B0 13 4A EA 7C 40 34 00 \r
+B0 13 5A C6 A2 B3 30 0F FD 27 3E 40 10 00 7C 40 \r
+34 00 B0 13 0A D7 5C F3 5F 42 9A 1D 4F 5F 4C DF \r
+C2 4C 9A 1D 1E 83 F3 23 F2 D0 80 00 9A 1D B0 13 \r
+CC E1 7C 40 32 00 B0 13 5A C6 D2 43 78 1D B2 40 \r
+36 00 9E 1D B2 40 E2 04 A0 1D 3C 40 79 1D 0D 43 \r
+3E 40 1F 00 B0 13 5C ED 3C 40 98 1D 0D 43 2E 43 \r
+B0 13 5C ED 32 D2 10 01 32 C2 03 43 FF 3F 32 C2 \r
+03 43 FF 3F 32 C2 03 43 FF 3F 32 C2 03 43 FF 3F \r
+7C 40 3D 00 B0 13 5A C6 7C B0 F0 FF 10 01 1A 14 \r
+CA 0C 6D 93 3C 24 5D 93 0E 24 6D 92 60 20 B0 13 \r
+62 98 6D 42 B0 13 DA E8 C2 43 2F 1E 4C 43 4D 43 \r
+B0 13 DA E8 54 3C C2 93 2F 1E 1A 20 B2 B0 40 00 \r
+08 1E 09 20 B0 13 F2 97 5A 93 07 20 5C 42 30 1E \r
+B0 13 A4 E9 02 3C B0 13 0A 98 B0 13 3C 98 C9 0C \r
+5C 42 31 1E B0 13 18 98 B0 13 62 98 6D 43 E0 3F \r
+B0 13 54 98 C9 0C 5C 42 32 1E B0 13 18 98 7D 40 \r
+1F 00 7E 40 29 00 B0 13 60 EF 5D 43 D1 3F 5F 42 \r
+2E 1E 4F 93 24 24 C2 93 2F 1E 1A 20 4F 4F 2F 83 \r
+0F 24 1F 83 1C 20 B2 B0 40 00 08 1E 07 20 B0 13 \r
+F2 97 5C 42 30 1E B0 13 A4 E9 02 3C B0 13 0A 98 \r
+B0 13 3C 98 CA 0C 5C 42 31 1E B0 13 2E 98 07 3C \r
+B0 13 54 98 CA 0C 5C 42 32 1E B0 13 2E 98 19 16 \r
+10 01 5C 42 30 1E B0 13 FE EA CF 0C CC 0A B0 13 \r
+44 98 4C 4F B0 13 20 98 10 01 B0 13 44 98 5C 42 \r
+30 1E B0 13 20 98 10 01 B0 13 20 98 CC 0A 10 01 \r
+B0 13 70 98 CC 09 5E 43 B0 13 7A AF 10 01 B0 13 \r
+70 98 CC 0A 5E 43 B0 13 7A AF 10 01 CC 0A B0 13 \r
+54 98 10 01 7D 40 4A 00 7E 40 60 00 B0 13 60 EF \r
+C9 0C 10 01 7D 40 48 00 7E 40 5E 00 B0 13 60 EF \r
+10 01 7D 40 1E 00 7E 40 28 00 B0 13 60 EF 10 01 \r
+0D 43 6E 43 4F 43 B0 13 06 B5 CD 0C 10 01 1A 14 \r
+31 80 16 00 B0 13 9A DB CA 0C 0A 93 03 20 3C 40 \r
+03 00 97 3C 5C 43 CD 0A B0 13 4E B0 4C 93 04 20 \r
+CC 0A B0 13 7C F0 F3 3F B0 13 82 F0 CD 0C C9 01 \r
+39 52 CC 09 2E 42 B0 13 4A ED 81 49 00 00 CF 01 \r
+3F 50 0C 00 81 4F 02 00 F1 40 09 00 04 00 E1 43 \r
+05 00 CD 01 3D 50 0E 00 3C 40 6C 1E B0 13 F8 E9 \r
+D1 4A 09 00 12 00 D1 42 75 1E 0D 00 B0 13 A8 F0 \r
+C1 4C 13 00 D1 43 0C 00 B0 13 AC F0 C1 4C 14 00 \r
+2C 43 3D 40 03 00 CE 01 B0 13 FA B7 0C 93 59 20 \r
+B0 13 6A F0 C9 0C E1 43 05 00 CF 01 3F 50 0C 00 \r
+81 4F 02 00 CF 0A 3F 50 03 00 81 4F 00 00 79 90 \r
+03 00 06 24 59 93 02 20 B0 13 B8 E6 B0 13 E2 E7 \r
+B0 13 B6 DE 79 90 03 00 07 24 59 93 03 24 B0 13 \r
+C2 E7 02 3C B0 13 E2 E5 2C 43 2D 43 CE 01 B0 13 \r
+FA B7 0C 93 05 24 CC 0A B0 13 7C F0 1C 43 29 3C \r
+3F 40 7F 00 5F F1 0C 00 5F 93 09 24 7F 90 03 00 \r
+06 24 CC 0A B0 13 7C F0 3C 40 05 00 1A 3C EA 43 \r
+00 00 DA 41 0E 00 0A 00 D2 4A 0B 00 77 1D F1 90 \r
+40 00 0F 00 02 20 5F 43 02 3C 7F 40 03 00 CA 4F \r
+01 00 D2 53 75 1E C2 93 75 1E 02 20 D2 43 75 1E \r
+0C 43 31 50 16 00 19 16 10 01 3A 14 31 82 C9 0C \r
+F9 90 14 00 00 00 05 28 B0 13 AC F0 C9 9C 14 00 \r
+74 20 3C 40 0E 00 0C 59 CD 01 B0 13 3C EF 91 92 \r
+6E 1E 02 00 6A 20 91 92 6C 1E 00 00 66 20 58 49 \r
+12 00 3A 40 05 00 0A 59 3C 40 05 00 0C 59 CD 08 \r
+B0 13 50 DC 0C 93 48 20 C2 93 70 1E 56 24 B0 13 \r
+9A DB C7 0C 07 93 51 24 3C 40 03 00 0C 57 CD 0A \r
+2E 42 B0 13 4A ED 6C 43 CD 07 B0 13 4E B0 4C 93 \r
+03 24 D2 93 74 1E 04 20 CC 07 B0 13 7C F0 3D 3C \r
+5F 42 74 1E CE 0F 5E 53 C2 4E 74 1E 4F 4F DF 47 \r
+0B 00 72 1E C7 48 0A 00 E7 43 00 00 F9 90 40 00 \r
+13 00 02 20 5F 43 02 3C 7F 40 03 00 C7 4F 01 00 \r
+D1 47 09 00 06 00 B0 13 A8 F0 C1 4C 07 00 B0 13 \r
+FA 9A B0 13 E8 9A CD 01 B0 13 08 9B D5 27 B0 13 \r
+D0 9A 0C 93 12 24 D0 3F B0 13 FA 9A D1 4C 09 00 \r
+06 00 B0 13 A8 F0 C1 4C 07 00 B0 13 E8 9A CD 01 \r
+B0 13 08 9B 02 24 B0 13 D0 9A 31 52 37 16 10 01 \r
+3C 40 03 00 0C 59 CD 0A 2E 42 B0 13 4A ED CC 09 \r
+4D 43 B0 13 40 E1 10 01 3E 40 07 00 5E F9 0A 00 \r
+3F 40 03 00 4F 8E 6C 43 10 01 F1 40 81 00 08 00 \r
+D1 49 0D 00 09 00 10 01 2D 52 6E 42 B0 13 76 C0 \r
+C9 0C 09 93 10 01 C2 43 17 1D 5F 42 F2 1C 2F 83 \r
+99 24 1F 83 3F 24 1F 83 23 24 1F 83 06 24 2F 83 \r
+96 20 F2 D0 20 00 F0 1C 10 01 E2 43 F2 1C 3C 40 \r
+1E 1D 4D 43 4E 4D 5E 02 5F 4E F3 1C 47 18 0F 5F \r
+5E 4E F4 1C 0E 5F 2C 53 8C 4E FE FF 5D 53 7D 90 \r
+09 00 F0 2B E2 43 18 1D F2 40 09 00 17 1D 10 01 \r
+E2 43 F2 1C 5E 42 F3 1C 47 18 0E 5E 5F 42 F4 1C \r
+0E 5F 82 4E 1A 1D 5F 42 F5 1C 47 18 0F 5F 5D 42 \r
+F6 1C 0F 5D 82 4F 1C 1D D2 43 18 1D 4F 8E C2 4F \r
+17 1D 10 01 3E 40 BF FF 1E F2 08 1E 5F 42 F3 1C \r
+5F 03 3F F0 C0 FF 0E DF 82 4E 08 1E 3F 40 7F 00 \r
+5F F2 F3 1C C2 4F 30 1E D2 42 F4 1C 31 1E D2 42 \r
+F5 1C 32 1E 5F 42 F6 1C 47 18 0F 5F 5E 42 F7 1C \r
+0E 5F 82 4E CE 1E D2 42 F8 1C CC 1E D2 42 F9 1C \r
+CB 1E D2 42 FA 1C E2 1E D2 42 FB 1C E3 1E 5F 42 \r
+FC 1C 47 18 0F 5F 5E 42 FD 1C 0E 5F CF 0E 1F 52 \r
+D4 1E 1F 82 D2 1E 82 4F D4 1E 82 4E D2 1E 5F 42 \r
+FE 1C 47 18 0F 5F 5C 42 FF 1C 0C 5F 82 4C 20 1E \r
+1D 42 1A 1E 1E 42 1C 1E 1F 42 1E 1E B0 13 B2 93 \r
+7C 40 5A 00 3D 40 F4 F4 5E 43 B0 13 7A AF D2 43 \r
+EE 1C 10 01 F2 40 03 00 F2 1C D2 43 17 1D 10 01 \r
+0A 14 31 82 92 B3 8C 1C 0F 20 A2 B2 8C 1C 0C 20 \r
+3F 40 0C 00 1F 52 E6 1E 6F 13 4C 93 0C 24 5C 43 \r
+6D 43 80 13 0E 1E 07 3C 5C 43 B0 13 BA CE 5C 43 \r
+5D 43 80 13 0E 1E A2 B3 0C 1E 1B 20 92 B3 8C 1C \r
+12 20 B2 B2 8C 1C 0F 20 3F 40 0C 00 1F 52 E4 1E \r
+6F 13 4C 93 5B 24 82 93 0C 1E 58 20 6C 43 6D 43 \r
+80 13 12 1E 53 3C 6C 43 B0 13 BA CE 6C 43 5D 43 \r
+F7 3F 6A 43 B2 B2 0C 1E 28 20 B2 B0 10 00 0C 1E \r
+20 20 B2 B0 20 00 0C 1E 14 20 B2 B0 40 00 0C 1E \r
+0C 20 B2 B0 80 00 0C 1E 1F 24 CC 01 3D 40 52 F5 \r
+2E 42 B0 13 4A ED 5A 43 17 3C CC 01 3D 40 58 F5 \r
+F7 3F CC 01 3D 40 5E F5 3E 40 06 00 B0 13 4A ED \r
+0B 3C CC 01 3D 40 66 F5 F7 3F CC 01 3D 40 6E F5 \r
+3E 40 06 00 B0 13 4A ED CC 0A B0 13 BA CE CC 0A \r
+6D 42 80 13 12 1E 6A 93 07 24 7C 40 46 00 CD 01 \r
+5E 43 B0 13 7A AF 06 3C 7C 40 5A 00 CD 01 5E 43 \r
+B0 13 7A AF 82 43 0C 1E A2 D2 0C 1E 92 B3 8C 1C \r
+10 24 B0 13 0C EF 6C 93 0C 20 7C 40 17 00 B0 13 \r
+9C 9D 7C 40 18 00 B0 13 9C 9D 7C 40 19 00 B0 13 \r
+9C 9D 82 43 8C 1C 31 52 0A 16 10 01 7D 40 03 00 \r
+B0 13 DA E8 10 01 2A 14 C2 93 93 1E 8C 24 5D 93 \r
+78 24 6D 93 15 24 6D 92 8D 20 B0 13 B8 DF C2 43 \r
+58 1E 7C 40 1F 00 4D 43 B0 13 DA E8 6C 43 4D 43 \r
+B0 13 DA E8 7C 40 03 00 4D 43 B0 13 DA E8 7A 3C \r
+5F 42 5E 1E 0F 93 13 24 1F 83 0A 24 5A 42 5B 1E \r
+7C 40 1A 00 7D 40 5A 00 5E 43 B0 13 E8 C5 10 3C \r
+5A 42 5A 1E 7C 40 1A 00 7D 40 59 00 F5 3F 5A 42 \r
+59 1E 7C 40 1A 00 7D 40 58 00 5E 43 B0 13 E8 C5 \r
+CC 0A B0 13 A0 D3 3D 40 0A 00 B0 13 FA EB B0 13 \r
+72 E6 3E 40 CD CC 3F 40 4C 3E B0 13 44 B7 C8 0C \r
+C9 0D 1C 42 5C 1E B0 13 72 E6 3E 40 CD CC 3F 40 \r
+4C 3F B0 13 44 B7 CE 0C CF 0D CC 08 CD 09 B0 13 \r
+DE 9E B0 13 50 D7 82 4C 5C 1E 0D 43 7E 40 03 00 \r
+4F 43 B0 13 06 B5 CD 0C 7C 40 47 00 5E 43 B0 13 \r
+7A AF CC 0A B0 13 58 EE 4C 93 08 20 6C 43 4D 43 \r
+B0 13 DA E8 7C 40 03 00 5D 43 9F 3F 6C 43 5D 43 \r
+97 3F B0 13 26 ED 4C 93 0B 20 82 43 5C 1E B0 13 \r
+0E C3 B2 40 10 0E 60 1E D2 43 58 1E D2 43 5E 1E \r
+7C 40 1F 00 E9 3F 7C 40 47 00 3D 40 F0 F4 5E 43 \r
+B0 13 7A AF 28 16 10 01 3B 40 80 00 01 3C 0B 43 \r
+0A 14 09 14 08 14 07 14 21 83 3F B0 80 7F 7B 24 \r
+3D B0 80 7F 05 20 0C 4E 0D 4F 8B 10 0D EB 73 3C \r
+5D 02 08 4D 4D 10 38 F0 00 FF 0D D8 5F 02 08 4F \r
+4F 10 38 F0 00 FF 0F D8 09 4C 0A 4D 3D F0 80 00 \r
+C1 4D 00 00 0B EA 0B EF 3B C0 7F FF 3A D0 80 00 \r
+3F D0 80 00 0A 9F 02 20 09 9E 0A 24 0B 2C 0D 4F \r
+0F 4A 0A 4D 0C 4E 0E 49 09 4C 81 EB 00 00 02 3C \r
+0B 93 4F 20 0C 43 08 4A 88 10 47 48 8F 10 48 8F \r
+8F 10 0E 24 38 90 19 00 34 2C 12 C3 4F 10 5E 00 \r
+5C 00 3C B0 00 10 02 24 3C D0 00 20 18 83 F5 23 \r
+0B 93 0C 24 08 8C 09 7E 4A 7F 0C 48 4A 93 12 30 \r
+5C 02 09 69 4A 6A 17 83 2C 24 F8 3F 09 5E 4A 6F \r
+09 28 4A 10 59 00 5C 00 3C B0 00 10 02 24 3C D0 \r
+00 20 17 53 3C B0 00 80 07 24 09 63 4A 63 07 63 \r
+3C B0 00 60 01 20 19 C3 17 93 13 38 37 90 FF 00 \r
+13 34 7A C0 80 00 87 10 D1 51 00 00 00 00 57 00 \r
+0A D7 0C 49 0D 4A 21 53 07 16 08 16 09 16 0A 16 \r
+10 01 0D 43 0C 43 F7 3F 3D 40 FF FE D1 61 00 00 \r
+00 00 5D 00 3C 43 EF 3F 6D 93 1E 24 5D 93 8A 20 \r
+C2 93 40 1E 08 20 3D 40 3A 1E 7C 40 5A 00 5E 43 \r
+B0 13 7A AF 07 3C 3D 40 38 1E 7C 40 5A 00 5E 43 \r
+B0 13 7A AF 7C 40 27 00 5D 43 B0 13 DA E8 7C 40 \r
+28 00 5D 43 80 00 DA E8 B2 B0 20 00 8C 1C 6A 24 \r
+C2 93 40 1E 38 20 5F 42 35 1E 4F 93 63 24 4F 4F \r
+1F 83 1E 24 1F 83 16 24 1F 83 0E 24 1F 83 06 24 \r
+3F 80 03 00 1B 24 1F 83 1F 24 10 01 5D 42 3A 1E \r
+7C 40 21 00 B0 13 26 A1 5D 42 3B 1E 7C 40 22 00 \r
+B0 13 26 A1 5D 42 3C 1E 7C 40 23 00 B0 13 26 A1 \r
+5D 42 3D 1E 7C 40 24 00 B0 13 26 A1 5D 42 3E 1E \r
+7C 40 25 00 B0 13 26 A1 5D 42 3F 1E 7C 40 26 00 \r
+5E 43 80 00 E8 C5 5F 42 35 1E 1F 83 28 24 1F 83 \r
+20 24 1F 83 18 24 1F 83 10 24 1F 83 08 24 1F 83 \r
+21 20 5D 42 38 1E 7C 40 21 00 B0 13 26 A1 5D 42 \r
+39 1E 7C 40 22 00 B0 13 26 A1 5D 42 3A 1E 7C 40 \r
+23 00 B0 13 26 A1 5D 42 3B 1E 7C 40 24 00 B0 13 \r
+26 A1 5D 42 3C 1E 7C 40 25 00 B0 13 26 A1 5D 42 \r
+3D 1E CC 3F 10 01 5E 43 B0 13 E8 C5 10 01 1A 14 \r
+C9 0C 1A 42 44 1E 4D 4D 1D 5A 0C 00 0D 8E 3D 80 \r
+13 00 0D 93 81 34 3E 40 1A 00 1E 52 44 1E 6F 4E \r
+3F F0 03 00 1F 83 4E 24 1F 83 2C 20 CA 43 12 00 \r
+2F 42 6F BE 1A 20 1C 42 44 1E D2 9C 11 00 48 1E \r
+09 2C C2 93 4A 1E 03 20 B0 13 74 D1 09 3C 8C 43 \r
+18 00 06 3C B0 13 60 CE 1F 42 44 1E DF 53 11 00 \r
+CC 09 5D 43 B0 13 64 DA 57 3C EE C2 00 00 1F 42 \r
+44 1E 8F 43 00 00 8F 43 02 00 1C 42 44 1E B0 13 \r
+74 D1 4A 3C 3C 40 80 00 5C 8A 13 00 CF 0A 2D 4F \r
+1E 4F 02 00 3F 40 00 02 B0 13 F2 D5 1C 5A 0C 00 \r
+3C 50 00 02 8A 4C 0C 00 1F 42 44 1E FF 40 22 00 \r
+0F 00 3E 40 1A 00 1E 52 44 1E 3F 40 FC 00 6F FE \r
+5F D3 28 3C 3C 40 40 00 5C 8A 13 00 2D 4A 1E 4A \r
+02 00 3F 40 80 1C B0 13 F2 D5 1F 42 44 1E 1C 5F \r
+0A 00 3C 50 00 06 8F 4C 0C 00 1F 42 44 1E DF 43 \r
+0F 00 1A 42 44 1E CF 0A 5C 4F 13 00 2D 4F B0 13 \r
+F0 EC CA 5C 0F 00 3E 40 1A 00 1E 52 44 1E 6F 4E \r
+5F C3 6F D3 CE 4F 00 00 19 16 10 01 A2 D3 08 1E \r
+82 93 76 1E 03 24 A2 B2 08 1E 68 20 B2 B0 20 00 \r
+76 1E 5B 20 B2 B0 40 00 76 1E 4B 20 82 93 76 1E \r
+69 24 92 B3 76 1E 32 20 A2 B3 76 1E 1A 20 A2 B2 \r
+76 1E 0D 20 B2 B2 76 1E 5D 24 1F 42 E4 1E 0F 0F \r
+6C 43 4F 13 B2 D2 8C 1C B2 C2 76 1E 53 3C 1F 42 \r
+E6 1E 0F 0F 5C 43 4F 13 A2 D2 8C 1C A2 C2 76 1E \r
+49 3C C2 43 89 1E 6C 43 6D 42 80 13 12 1E 1F 42 \r
+E4 1E 1F 4F 10 00 82 4F E4 1E 00 18 D2 4F 08 00 \r
+12 1E B2 D2 8C 1C A2 C3 76 1E 34 3C 5C 43 6D 42 \r
+80 13 0E 1E 1F 42 E6 1E 1F 4F 10 00 82 4F E6 1E \r
+00 18 D2 4F 08 00 0E 1E A2 D2 8C 1C 92 C3 76 1E \r
+21 3C B2 F0 BF FF 76 1E 1F 42 E4 1E 3F 0F 04 00 \r
+6C 43 4F 13 92 D3 8C 1C 15 3C B2 F0 DF FF 76 1E \r
+1F 42 E6 1E 3F 0F 04 00 5C 43 F3 3F E2 B3 01 02 \r
+03 24 D2 B3 01 02 04 20 92 D3 0C 1E B2 D2 0C 1E \r
+82 43 76 1E 82 93 08 1E 09 24 92 B3 08 1E 06 24 \r
+92 C3 08 1E B0 13 DC EE 92 D3 8C 1C A2 C3 08 1E \r
+10 01 31 80 16 00 B0 13 50 E9 5C 42 E2 1E 4F 4C \r
+81 4F 0E 00 81 43 10 00 5F 42 E3 1E 81 4F 12 00 \r
+81 43 14 00 4C 4C 0D 43 6E 43 4F 43 B0 13 06 B5 \r
+CD 0C 7C 40 4A 00 5E 43 B0 13 7A AF 7C 40 1E 00 \r
+5D 43 B0 13 DA E8 1C 41 12 00 1D 41 14 00 6E 43 \r
+4F 43 B0 13 06 B5 CD 0C 7C 40 48 00 5E 43 B0 13 \r
+7A AF 4E 43 3A 3C 4F 4E 0F 93 1D 24 1F 83 35 20 \r
+0F 43 81 43 00 00 B1 40 3B 00 02 00 81 43 04 00 \r
+B1 40 23 00 06 00 F1 40 48 00 08 00 00 18 F1 40 \r
+DA E6 0A 00 CC 01 3C 50 12 00 6D 43 4E 43 B0 13 \r
+AE 89 4E 43 1A 3C 0F 43 81 43 00 00 B1 40 17 00 \r
+02 00 81 43 04 00 B1 40 23 00 06 00 F1 40 4A 00 \r
+08 00 00 18 F1 40 C4 D6 0A 00 CC 01 3C 50 0E 00 \r
+6D 43 4E 43 B0 13 AE 89 5E 43 92 B3 08 1E 0B 20 \r
+92 B3 76 1E C0 27 D2 41 0E 00 E2 1E D2 41 12 00 \r
+E3 1E A2 D2 8C 1C 82 43 76 1E B2 D0 00 02 8C 1C \r
+31 50 16 00 10 01 0A 14 31 80 16 00 B0 13 50 E9 \r
+B2 B0 40 00 08 1E 0D 20 B0 13 E6 EA 3C B0 00 80 \r
+0F 7F 3F E3 81 4C 0E 00 81 4F 10 00 1A 42 D2 1E \r
+44 3C 1F 42 D2 1E 3F B0 00 80 0E 7E 3E E3 81 4F \r
+0E 00 81 4E 10 00 CA 0F 38 3C B2 B0 40 00 08 1E \r
+08 20 7C 40 1D 00 7D 40 46 00 5E 43 B0 13 E8 C5 \r
+07 3C 7C 40 1D 00 7D 40 43 00 5E 43 B0 13 E8 C5 \r
+7C 40 1F 00 5D 43 B0 13 DA E8 7C 40 0F 00 5D 43 \r
+B0 13 DA E8 3F 40 19 FC B1 43 00 00 B1 40 E7 03 \r
+02 00 81 43 04 00 B1 40 06 00 06 00 F1 40 49 00 \r
+08 00 00 18 F1 40 DA E6 0A 00 CC 01 3C 50 0E 00 \r
+7D 40 03 00 5E 43 B0 13 AE 89 92 B3 08 1E 1E 20 \r
+92 B3 76 1E C2 27 B2 B0 40 00 08 1E 07 20 1C 41 \r
+0E 00 B0 13 14 ED 81 4C 12 00 03 3C 91 41 0E 00 \r
+12 00 1F 41 12 00 0F 8A 81 4F 14 00 92 51 14 00 \r
+D4 1E 92 41 12 00 D2 1E A2 D2 8C 1C 82 43 76 1E \r
+31 50 16 00 0A 16 10 01 B2 B0 20 00 08 1E 77 20 \r
+B0 13 24 EF 4C 93 73 20 A2 B2 76 1E 70 24 1F 42 \r
+EE 1D 0F 93 68 20 B0 13 A4 ED B0 13 C8 DC 7C 40 \r
+0A 00 B0 13 4C F0 7C 42 B0 13 52 F0 82 43 F2 1D \r
+82 43 F4 1D 7C 40 05 00 B0 13 1E F0 7C 40 0C 00 \r
+5D 42 16 1E B0 13 00 DD 92 43 EE 1D 7C 40 17 00 \r
+6D 43 B0 13 DA E8 7C 40 18 00 6D 43 B0 13 DA E8 \r
+7C 40 19 00 6D 43 B0 13 DA E8 4C 43 B0 13 9A E5 \r
+0C 93 0F 20 4C 43 1D 42 F2 1D 1E 42 F4 1D B0 13 \r
+E8 D9 4C 43 B0 13 6E CF 4C 43 B0 13 9A E5 2C 93 \r
+25 24 4C 43 B0 13 9A E5 1C 93 27 20 A2 43 EE 1D \r
+82 93 F4 1D 0A 20 82 93 F2 1D 07 20 4C 43 B0 13 \r
+7C E2 82 4C F2 1D 82 4D F4 1D 7C 40 17 00 B0 13 \r
+60 A6 7C 40 18 00 B0 13 60 A6 7C 40 19 00 B0 13 \r
+60 A6 7C 40 13 00 6D 43 80 00 DA E8 3C 40 99 19 \r
+B0 13 8A CC D1 3F 2F 93 02 20 80 00 CE D4 10 01 \r
+7D 40 03 00 B0 13 DA E8 10 01 1A 14 31 80 18 00 \r
+B0 13 6A F0 C9 0C B0 13 82 F0 81 4C 10 00 CF 01 \r
+2F 52 81 4F 12 00 F1 42 14 00 7A 40 03 00 C1 4A \r
+15 00 CD 01 3D 50 06 00 3C 40 8A 1E B0 13 F8 E9 \r
+D1 43 04 00 D1 42 92 1E 05 00 D1 43 0A 00 B0 13 \r
+AC F0 C1 4C 0B 00 2C 43 3D 40 03 00 CE 01 3E 50 \r
+10 00 B0 13 FA B7 C1 4A 15 00 CF 01 2F 52 81 4F \r
+12 00 CF 01 3F 50 0C 00 81 4F 10 00 79 90 03 00 \r
+06 24 59 93 02 20 B0 13 B8 E6 B0 13 E2 E7 B0 13 \r
+B6 DE 3A 40 06 00 79 90 03 00 07 24 59 93 03 24 \r
+B0 13 C2 E7 02 3C B0 13 E2 E5 2C 43 2D 43 CE 01 \r
+3E 50 10 00 B0 13 FA B7 0C 93 1D 20 3F 40 7F 00 \r
+5F F1 04 00 5F 93 03 24 7F 90 06 00 14 20 CC 01 \r
+CD 01 3D 50 06 00 2E 42 B0 13 4A ED 2C 41 1D 41 \r
+02 00 B0 13 92 ED CC 01 3C 50 0C 00 B0 13 48 EF \r
+D2 53 92 1E 0A 43 CC 0A 31 50 18 00 19 16 10 01 \r
+0A 14 21 83 C1 43 00 00 F2 90 03 00 78 1D 6B 20 \r
+7C 40 3B 00 B0 13 0A D7 CE 0C 7C 40 3B 00 B0 13 \r
+0A D7 4E 9C F9 23 4E 93 61 24 CC 01 5D 43 B0 13 \r
+80 E0 6F 41 3F 50 03 00 4E 4E 0E 9F 38 20 F1 90 \r
+1F 00 00 00 34 2C F1 90 0B 00 00 00 30 28 3C 40 \r
+79 1D 0D 43 3E 40 1F 00 B0 13 5C ED E2 41 79 1D \r
+3C 40 7A 1D 6D 41 B0 13 80 E0 3C 40 98 1D 6D 43 \r
+B0 13 80 E0 F2 B0 80 FF 99 1D 14 24 92 53 AC 1D \r
+82 63 AE 1D B0 13 A2 DA 4C 93 30 20 5C 42 98 1D \r
+B0 13 70 E1 C2 4C 98 1D F2 F0 7F 00 99 1D B0 13 \r
+A2 E7 24 3C 92 53 A8 1D 82 63 AA 1D 1F 3C 92 53 \r
+B0 1D 82 63 B2 1D 0A 42 32 C2 03 43 7C 40 36 00 \r
+B0 13 5A C6 7C 40 3D 00 B0 13 5A C6 7C B0 F0 FF \r
+F9 23 7C 40 3A 00 B0 13 5A C6 7C 40 34 00 B0 13 \r
+5A C6 02 4A 03 3C 32 C2 03 43 FF 3F 21 53 0A 16 \r
+10 01 C2 93 40 1E 20 20 D2 53 3F 1E D2 53 41 1E \r
+5F 42 41 1E 5F 83 7F 90 12 00 04 28 F2 42 35 1E \r
+C2 43 41 1E F2 90 3A 00 3F 1E 0A 20 F2 40 30 00 \r
+3F 1E D2 53 3E 1E D2 43 37 1E F2 40 07 00 35 1E \r
+F2 90 3A 00 3E 1E 51 20 D2 43 35 1E D2 43 36 1E \r
+3F 40 30 00 C2 4F 3E 1E D2 53 3D 1E F2 90 3A 00 \r
+3D 1E 43 20 D2 53 35 1E C2 4F 3D 1E D2 53 3C 1E \r
+F2 90 36 00 3C 1E 39 20 D2 53 35 1E C2 4F 3C 1E \r
+D2 53 3B 1E F2 90 3A 00 3B 1E 2F 20 D2 53 35 1E \r
+C2 4F 3B 1E D2 53 3A 1E 5E 42 3A 1E 7E 90 32 00 \r
+1F 24 7E 90 36 00 21 20 D2 53 35 1E C2 4F 3A 1E \r
+D2 53 39 1E F2 90 3A 00 39 1E 17 20 D2 53 35 1E \r
+C2 4F 39 1E D2 53 38 1E F2 90 32 00 38 1E 0D 20 \r
+B0 13 22 E8 D2 43 34 1E 5D 43 B0 13 08 A0 05 3C \r
+D2 43 40 1E 5D 43 B0 13 08 A0 B2 D0 20 00 8C 1C \r
+10 01 4D 4D 1D 93 19 24 2D 93 2A 24 2D 92 54 20 \r
+82 43 18 1E B0 13 14 EA 7C 40 0B 00 4D 43 B0 13 \r
+DA E8 7C 40 09 00 4D 43 B0 13 DA E8 6C 43 4D 43 \r
+B0 13 24 AA 4D 43 80 00 DA E8 92 43 18 1E B0 13 \r
+A8 D9 B2 B0 40 00 08 1E 06 20 7C 40 09 00 5D 43 \r
+B0 13 DA E8 05 3C 7C 40 0B 00 5D 43 B0 13 DA E8 \r
+82 93 24 1E 29 24 B2 B0 40 00 08 1E 19 20 1C 42 \r
+20 1E B0 13 88 E9 3C 90 10 27 0D 34 0C 93 0D 34 \r
+3C E3 1C 53 B0 13 0C AA 4D 43 B0 13 24 AA 5D 43 \r
+B0 13 DA E8 0B 3C 3C 40 0F 27 B0 13 FA A9 06 3C \r
+1C 42 20 1E 0C 93 EC 3B B0 13 FA A9 7C 40 46 00 \r
+CD 0B 5E 43 80 00 7A AF 10 01 B0 13 0C AA 5D 43 \r
+B0 13 24 AA 4D 43 B0 13 DA E8 10 01 3C B0 00 80 \r
+0D 7D 3D E3 6E 42 7F 40 03 00 B0 13 06 B5 CB 0C \r
+6C 43 10 01 B0 13 DA E8 7C 40 03 00 10 01 3A 14 \r
+31 80 12 00 B0 13 50 E9 B2 B0 40 00 08 1E 12 20 \r
+7C 40 09 00 5D 43 B0 13 DA E8 1C 42 20 1E B0 13 \r
+88 E9 B0 13 08 AB 37 40 0C FE 38 43 39 40 0F 27 \r
+0A 43 30 3C 7C 40 0B 00 5D 43 B0 13 DA E8 1E 42 \r
+20 1E 3E B0 00 80 0F 7F 3F E3 81 4E 0E 00 81 4F \r
+10 00 37 40 9C FF 38 43 39 40 A0 0F 0A 43 1A 3C \r
+CF 07 CE 08 81 4E 00 00 81 49 02 00 81 4A 04 00 \r
+B1 40 16 00 06 00 F1 40 46 00 08 00 00 18 F1 40 \r
+DA E6 0A 00 CC 01 3C 50 0E 00 6D 42 7E 40 03 00 \r
+B0 13 AE 89 92 B3 08 1E 19 20 92 B3 76 1E E0 27 \r
+B2 B0 40 00 08 1E 06 20 1C 41 0E 00 B0 13 6C E9 \r
+B0 13 08 AB 1C 41 0E 00 1D 42 1A 1E 1E 42 1C 1E \r
+1F 42 1E 1E B0 13 B2 93 A2 D2 8C 1C 82 43 76 1E \r
+31 50 12 00 37 16 10 01 3C B0 00 80 0F 7F 3F E3 \r
+81 4C 12 00 81 4F 14 00 10 01 4D 4D 1D 93 14 24 \r
+2D 93 34 24 2D 92 63 20 82 43 D0 1E 6C 43 4D 43 \r
+B0 13 F0 AB 7C 40 0F 00 4D 43 B0 13 DA E8 7C 40 \r
+1F 00 4D 43 80 00 DA E8 92 43 D0 1E 7C 40 1F 00 \r
+5D 43 B0 13 DA E8 7C 40 0F 00 5D 43 B0 13 DA E8 \r
+B2 B0 40 00 08 1E 08 20 7C 40 1D 00 7D 40 46 00 \r
+5E 43 B0 13 E8 C5 07 3C 7C 40 1D 00 7D 40 43 00 \r
+5E 43 B0 13 E8 C5 4C 43 B0 13 A6 BD B2 B0 40 00 \r
+08 1E 04 20 B0 13 E6 EA CB 0C 02 3C 1B 42 D2 1E \r
+0B 93 05 38 6C 43 5D 43 B0 13 F0 AB 0B 3C 3B E3 \r
+1B 53 6C 43 4D 43 B0 13 DA E8 7C 40 03 00 5D 43 \r
+B0 13 DA E8 3B 90 E8 03 02 38 3B 40 E7 03 CC 0B \r
+3C B0 00 80 0D 7D 3D E3 7E 40 03 00 5F 43 B0 13 \r
+06 B5 CD 0C 7C 40 49 00 5E 43 80 00 7A AF 10 01 \r
+B0 13 DA E8 7C 40 03 00 4D 43 B0 13 DA E8 10 01 \r
+5F 42 F2 1C 2F 83 03 24 1F 83 2C 24 10 01 D2 93 \r
+18 1D 16 24 E2 93 18 1D 5D 20 CF 0C 5F 02 1E 4F \r
+1E 1D CF 0E 8F 10 C2 4F F3 1C C2 4E F4 1C 4C 4C \r
+3E 40 F5 1C 7F 40 03 00 B0 13 D6 AC FD 2B 10 01 \r
+1F 42 1A 1D 0F 5C CE 0F 8E 10 C2 4E F3 1C C2 4F \r
+F4 1C 4C 4C 3E 40 F5 1C 7F 40 03 00 B0 13 D6 AC \r
+FD 2B 10 01 1F 42 08 1E 7F F0 C0 00 4F 5F 3E 40 \r
+7F 00 5E F2 30 1E 4E DF C2 4E F3 1C D2 42 31 1E \r
+F4 1C D2 42 32 1E F5 1C 1E 42 CE 1E CF 0E 8F 10 \r
+C2 4F F6 1C C2 4E F7 1C D2 42 CC 1E F8 1C D2 42 \r
+CB 1E F9 1C D2 42 E2 1E FA 1C D2 42 E3 1E FB 1C \r
+1E 42 D2 1E CF 0E 8F 10 8F 11 C2 4F FC 1C C2 4E \r
+FD 1C 1E 42 20 1E CF 0E 8F 10 8F 11 C2 4F FE 1C \r
+C2 4E FF 1C 10 01 1E 53 CE 4C FF FF 5F 53 7F 90 \r
+13 00 10 01 0A 14 CA 0D 6A 92 1F 24 B2 B0 40 00 \r
+08 1E 10 20 5C 42 00 1E B0 13 72 E6 3E 40 12 14 \r
+3F 40 1F 3F B0 13 44 B7 B0 13 50 D7 4C 4C B0 13 \r
+A0 AD 04 3C 5C 42 00 1E B0 13 A0 AD 7C 40 47 00 \r
+5E 43 B0 13 7A AF 5A 93 1D 24 6A 92 37 20 7C 40 \r
+20 00 4D 43 B0 13 DA E8 7C 40 0A 00 4D 43 B0 13 \r
+B0 AD 4D 43 B0 13 B0 AD 4D 43 B0 13 DA E8 7C 40 \r
+0C 00 4D 43 B0 13 DA E8 7C 40 0E 00 4D 43 B0 13 \r
+DA E8 1C 3C 7C 40 20 00 B0 13 BA AD B2 B0 40 00 \r
+08 1E 09 20 7C 40 0B 00 B0 13 BA AD 7C 40 0C 00 \r
+B0 13 BA AD 07 3C 7C 40 0A 00 5D 43 B0 13 B0 AD \r
+B0 13 BA AD 7C 40 0E 00 B0 13 BA AD 0A 16 10 01 \r
+0D 43 7E 40 03 00 5F 43 B0 13 06 B5 CD 0C 10 01 \r
+B0 13 DA E8 7C 40 0B 00 10 01 5D 43 B0 13 DA E8 \r
+10 01 0A 14 CA 0D 6A 92 3A 24 B2 B0 40 00 08 1E \r
+18 20 1C 42 02 1E 1D 42 04 1E B0 13 1C E0 3E 40 \r
+83 86 3F 40 7E 3D B0 13 44 B7 B0 13 38 D4 3D 90 \r
+1E 00 04 28 11 20 3C 90 80 84 0E 2C B0 13 8E AE \r
+17 3C 1C 42 02 1E 1D 42 04 1E 3D 90 1E 00 09 28 \r
+03 20 3C 90 80 84 05 28 3C 40 3F 0D 3D 40 03 00 \r
+ED 3F 3E 40 0A 00 0F 43 B0 13 1E D0 B0 13 8E AE \r
+7C 40 5A 00 5E 43 B0 13 7A AF 5A 93 12 24 6A 92 \r
+24 20 7C 40 11 00 4D 43 B0 13 DA E8 7C 40 12 00 \r
+4D 43 B0 13 DA E8 7C 40 29 00 4D 43 B0 13 DA E8 \r
+14 3C B2 B0 40 00 08 1E 06 20 7C 40 12 00 5D 43 \r
+B0 13 DA E8 05 3C 7C 40 11 00 5D 43 B0 13 DA E8 \r
+7C 40 29 00 5D 43 B0 13 DA E8 0A 16 10 01 7E 40 \r
+06 00 7F 40 03 00 B0 13 06 B5 CD 0C 10 01 6A 14 \r
+31 80 06 00 C6 0C 09 43 3A 40 00 1C 7F 40 03 00 \r
+81 4F 00 00 2F 46 1F 93 06 24 0F 93 0B 20 58 46 \r
+02 00 C7 09 10 3C 5C 46 02 00 B0 13 CA E3 C7 0C \r
+07 93 02 20 0C 43 4D 3C 58 47 09 00 3F 40 03 00 \r
+0F 57 81 4F 02 00 24 43 0F 42 32 C2 03 43 1E 43 \r
+6E 9A 39 20 EA 42 00 00 02 4F 3F 40 0B 00 0F 5A \r
+6F 4F 3F F0 3F 00 4E 48 0F 9E 2A 20 25 46 15 93 \r
+0E 20 78 90 3F 00 06 20 3F 40 03 00 0F 57 81 4F \r
+04 00 05 3C 3F 40 07 00 0F 5A 81 4F 04 00 1C 41 \r
+04 00 1D 41 02 00 2E 42 B0 13 06 E6 4C 4C 05 93 \r
+02 24 0C 93 0D 20 5F 4A 01 00 2E 41 4F 9E 08 2C \r
+09 93 02 24 D9 43 00 00 81 4F 00 00 C9 0A 04 3C \r
+DA 43 00 00 01 3C 02 4F 3A 50 23 00 14 83 BC 23 \r
+CC 09 31 50 06 00 64 16 10 01 4A 14 C9 0E 4C 4C \r
+3C 80 46 00 53 24 1C 83 4C 24 1C 83 46 24 1C 83 \r
+41 24 1C 83 3B 24 3C 80 10 00 3C 90 09 00 55 2C \r
+5C 06 00 18 50 4C A8 AF 06 B0 00 00 00 B0 00 00 \r
+FC AF 00 00 F2 AF 00 00 EA AF 00 00 E6 AF 00 00 \r
+DE AF 00 00 D6 AF 00 00 CC AF 00 00 7A 40 03 00 \r
+78 40 22 00 2E 3C 6A 43 78 40 21 00 2A 3C 6A 43 \r
+78 40 23 00 26 3C 6A 42 F7 3F 6A 43 78 40 25 00 \r
+20 3C 7A 40 03 00 78 40 24 00 1B 3C 6A 42 F0 3F \r
+7A 40 05 00 E5 3F 7A 40 06 00 E6 3F 6A 43 78 40 \r
+1A 00 0F 3C 7A 40 03 00 FA 3F 6A 43 78 40 1C 00 \r
+08 3C 7A 40 03 00 78 40 1B 00 03 3C 6A 42 78 40 \r
+1A 00 C7 0D 4A 4A 06 43 CC 08 4C 56 7D 47 CE 09 \r
+B0 13 E8 C5 16 53 1A 83 F7 23 46 16 10 01 4A 14 \r
+21 83 C8 0D C7 0C 39 40 B9 1D CC 01 0D 43 1E 43 \r
+B0 13 5C ED 46 43 09 98 25 24 2F 43 6F 99 22 20 \r
+5A 49 09 00 7A 90 3E 00 1D 2C 57 93 13 24 3C 40 \r
+03 00 0C 59 3D 40 03 00 0D 58 2E 42 B0 13 06 E6 \r
+0C 93 10 20 4F 4A CA 01 3A 50 E0 FF 0A 5F DA 43 \r
+00 00 08 3C C2 9A B6 1D 05 2C 4A 4A CF 01 0F 8A \r
+DF 43 3D 00 39 50 0C 00 56 53 D5 27 CE 01 0F 43 \r
+4C 43 CE 93 00 00 04 24 1E 53 5C 53 FA 27 09 3C \r
+67 93 04 20 7C 50 20 00 4F 4C 03 3C 3F 40 3D 00 \r
+4F 8C 67 93 0B 24 5E 42 B7 1D 0F 9E 12 38 5E 42 \r
+B6 1D 0F 9E 0F 20 D2 83 B6 1D 0C 3C 5E 42 B6 1D \r
+0E 9F 07 38 5E 42 B7 1D 0E 9F 04 34 C2 4F B7 1D \r
+01 3C 0F 43 C8 4F 09 00 CC 0F 21 53 46 16 10 01 \r
+0A 14 CA 0C 5C 43 B0 13 BA CE 5C 43 6D 42 80 13 \r
+0E 1E 5C 43 5D 43 B0 13 1E 97 1A 93 02 20 5F 43 \r
+01 3C 6F 43 C2 4F F2 1C C2 43 F3 1C C2 43 F4 1C \r
+C2 43 F5 1C 7C 40 17 00 6D 43 B0 13 DA E8 7C 40 \r
+18 00 6D 43 B0 13 DA E8 7C 40 19 00 6D 43 B0 13 \r
+DA E8 3C 40 00 20 B0 13 8A CC B0 13 A4 ED 82 4A \r
+EA 1C B2 40 10 0E EC 1C B0 13 AC B8 4C 93 06 24 \r
+1A 93 02 20 B0 13 0E C3 B0 13 68 D9 82 43 EA 1C \r
+B0 13 B8 DF B0 13 F8 ED 3C 40 00 20 B0 13 8A CC \r
+C2 43 1D 02 82 43 76 1E 7C 40 17 00 6D 42 B0 13 \r
+DA E8 7C 40 18 00 6D 42 B0 13 DA E8 7C 40 19 00 \r
+6D 42 B0 13 DA E8 5C 43 B0 13 BA CE 5C 43 6D 42 \r
+B0 13 1E 97 92 D3 8C 1C 0A 16 10 01 0A 14 CA 0C \r
+5D 93 05 24 6D 92 34 20 C2 43 CA 1E 31 3C C2 93 \r
+CA 1E 1A 20 5C 42 CB 1E B0 13 84 B2 03 20 B0 13 \r
+64 B2 02 3C B0 13 74 B2 5C 42 CC 1E B0 13 84 B2 \r
+03 20 B0 13 74 B2 02 3C B0 13 64 B2 B0 13 98 B2 \r
+5D 43 B0 13 DA E8 14 3C 1C 42 CE 1E 0D 43 6E 42 \r
+4F 43 B0 13 06 B5 CF 0C CC 0A 7D 40 46 00 7E 40 \r
+5C 00 B0 13 A8 B2 B0 13 98 B2 4D 43 B0 13 DA E8 \r
+0A 16 10 01 CC 0A 7D 40 48 00 7E 40 5E 00 B0 13 \r
+A8 B2 10 01 CC 0A 7D 40 4A 00 7E 40 60 00 B0 13 \r
+A8 B2 10 01 0D 43 6E 43 4F 43 B0 13 06 B5 CF 0C \r
+B2 B0 40 00 08 1E 10 01 CC 0A 7D 40 1F 00 7E 40 \r
+29 00 B0 13 60 EF 10 01 B0 13 60 EF CD 0F 5E 43 \r
+B0 13 7A AF 10 01 1A 14 CA 0D C9 0C D2 93 78 1D \r
+58 24 B0 13 CC E1 1D 43 6D 59 CC 09 B0 13 52 DF \r
+49 43 4A 93 37 24 5A 93 32 20 6A 42 16 3C 7C 40 \r
+36 00 B0 13 5A C6 7C 40 3D 00 B0 13 5A C6 7C B0 \r
+F0 FF F9 23 7C 40 3A 00 B0 13 5A C6 4A 93 02 20 \r
+59 43 2B 3C B0 13 7E EA 5A 83 7C 40 34 00 B0 13 \r
+5A C6 A2 B3 30 0F FD 27 92 C3 32 0F 7C 40 35 00 \r
+B0 13 5A C6 3C 40 19 00 B0 13 64 EA 92 B3 32 0F \r
+D6 27 92 C3 32 0F 92 B3 30 0F FD 27 0E 3C 32 C2 \r
+03 43 FF 3F 7C 40 35 00 B0 13 5A C6 B2 B0 00 02 \r
+32 0F FC 27 B2 F0 FF FD 32 0F 7C 40 3B 00 B0 13 \r
+5A C6 F2 90 03 00 78 1D 02 20 B0 13 8C EB CC 09 \r
+03 3C 32 C2 03 43 FF 3F 19 16 10 01 B2 40 23 5A \r
+5C 01 B0 13 6A E4 F2 40 A5 00 21 01 F2 D0 80 00 \r
+20 01 C2 43 21 01 F2 D0 03 00 4A 02 92 C3 6C 01 \r
+B2 D0 0C 00 6C 01 82 43 66 01 B2 40 44 00 68 01 \r
+32 D0 40 00 82 43 60 01 B2 40 50 00 62 01 B2 40 \r
+6E 11 64 01 32 C0 40 00 1E 14 3D 40 41 D1 0E 43 \r
+1D 83 0E 73 FD 23 0D 93 FB 23 1D 16 00 3C B2 F0 \r
+F0 FF 6E 01 A2 C3 02 01 A2 B3 02 01 F8 23 32 C2 \r
+03 43 B2 40 52 2D C0 01 A2 43 C2 01 F2 40 0E 00 \r
+D7 01 F2 F0 7F 00 03 02 F2 D0 80 00 05 02 F2 40 \r
+11 00 CD 01 F2 40 12 00 CE 01 F2 40 13 00 CF 01 \r
+82 43 C0 01 32 D2 B0 13 EA DF B0 13 28 EE B0 13 \r
+9E E1 B0 13 78 E3 B0 13 DC E4 B0 13 3C EC 80 00 \r
+86 C4 1A 14 CA 0C 5D 93 14 24 6D 92 47 20 4C 43 \r
+4D 43 B0 13 DA E8 C2 93 E0 1E 06 20 7C 40 16 00 \r
+6D 42 B0 13 DA E8 3A 3C 7C 40 16 00 7D 40 03 00 \r
+F8 3F B2 B0 40 00 08 1E 10 20 5C 42 E2 1E B0 13 \r
+FE EA CF 0C CC 0A B0 13 F6 B4 4C 4F B0 13 E0 B4 \r
+5C 42 E2 1E B0 13 A4 E9 06 3C B0 13 F6 B4 5C 42 \r
+E2 1E B0 13 E0 B4 CC 0A 7D 40 48 00 7E 40 5E 00 \r
+B0 13 60 EF C9 0C 5C 42 E3 1E B0 13 E0 B4 CC 0A \r
+7D 40 1E 00 7E 40 28 00 B0 13 60 EF 5D 43 B0 13 \r
+DA E8 7C 40 16 00 6D 43 B0 13 DA E8 19 16 10 01 \r
+0D 43 6E 43 4F 43 B0 13 06 B5 CD 0C CC 09 5E 43 \r
+B0 13 7A AF 10 01 7D 40 4A 00 7E 40 60 00 B0 13 \r
+60 EF C9 0C 10 01 4A 14 C7 0F C6 0E C9 0C CA 0D \r
+C8 06 3C 40 E2 1C 3D 40 FC F4 3E 40 07 00 B0 13 \r
+4A ED 48 93 4E 24 78 92 4C 2C 0A 93 1E 20 39 90 \r
+B5 00 1B 2C 78 90 03 00 0D 2C CD 09 59 02 0D 59 \r
+4F 48 0D 8F 3D 50 C5 F0 4E 48 3C 40 E2 1C B0 13 \r
+4A ED 22 3C 4C 46 3C 50 DF 1C CD 09 59 02 0D 59 \r
+3D 50 C2 F0 3E 40 03 00 F2 3F CC 09 CD 0A 3E 40 \r
+0A 00 0F 43 B0 13 1E D0 7E 50 30 00 4F 46 CF 4E \r
+E1 1C CC 09 CD 0A 3E 40 0A 00 0F 43 B0 13 1E D0 \r
+C9 0C CA 0D 56 83 E9 23 3F 40 E2 1C 4D 43 08 3C \r
+47 93 04 24 FF 40 20 00 00 00 57 83 1F 53 5D 53 \r
+3E 40 30 00 6E 9F 05 20 4E 48 1E 83 4C 4D 0C 9E \r
+EF 3B 3C 40 E2 1C 46 16 10 01 31 80 0E 00 CE 01 \r
+3D 40 00 18 4F 43 1E 53 FE 4D FF FF 5F 53 7F 90 \r
+0D 00 F9 2B F1 93 00 00 39 24 5F 41 01 00 C2 4F \r
+16 1E 3F 90 15 00 05 38 3F 90 EC 00 02 34 C2 43 \r
+16 1E 5F 41 02 00 47 18 0F 5F 5E 41 03 00 0E 5F \r
+82 4E D4 1E 5F 41 04 00 47 18 0F 5F 5E 41 05 00 \r
+0E 5F 82 4E A2 1E D2 41 06 00 12 1D D2 41 07 00 \r
+13 1D D2 41 08 00 14 1D D2 41 09 00 15 1D F1 93 \r
+0C 00 08 24 5F 41 0A 00 47 18 0F 5F 5E 41 0B 00 \r
+0E 5F 01 3C 0E 43 82 4E 22 1E 16 3C E2 42 16 1E \r
+B2 40 06 FF D4 1E B2 40 F6 FF A2 1E F2 40 79 00 \r
+12 1D F2 40 56 00 13 1D F2 40 34 00 14 1D F2 40 \r
+12 00 15 1D 82 43 22 1E 31 50 0E 00 10 01 0A 14 \r
+CA 0C 1F 42 44 1E 8F 93 02 00 10 20 8F 93 00 00 \r
+0D 20 C2 93 49 1E 0A 24 5E 42 49 1E 3E 50 64 00 \r
+5D 42 DA 1E 0D 9E 02 34 4C 43 42 3C BF 40 00 70 \r
+08 00 5C 42 51 1E 1D 42 4E 1E 1E 42 50 1E 3D F3 \r
+3E F0 FF 00 3F 40 00 08 B0 13 F2 D5 1C 52 D8 1E \r
+1F 42 44 1E 8F 4C 0A 00 1F 42 44 1E 9F 42 D8 1E \r
+0C 00 1F 42 44 1E CF 43 14 00 1F 42 44 1E CF 43 \r
+15 00 1F 42 44 1E 8F 93 02 00 05 20 8F 93 00 00 \r
+02 20 EF D2 1A 00 1D 42 44 1E 1E 42 4E 1E 1F 42 \r
+50 1E 3E F3 3F F0 FF 00 8D 4E 00 00 8D 4F 02 00 \r
+1F 42 44 1E 9F 43 18 00 CC 0A B0 13 00 C1 5C 43 \r
+0A 16 10 01 3A 14 07 4F 07 ED 0A 4F 5A 02 8A 10 \r
+4A 4A 0A 93 49 24 7F D0 80 00 0B 4D 5B 02 8B 10 \r
+4B 4B 0B 93 3F 24 7D D0 80 00 0B 5A 3B 80 7F 00 \r
+08 43 09 43 0E 93 09 24 1A 43 5E 00 02 28 08 5C \r
+09 6D 59 00 58 00 5A 02 F8 2B 0E 43 1A 43 5F 00 \r
+02 28 08 5C 09 6D 59 00 58 00 5E 00 3E B0 00 10 \r
+02 24 3E D0 00 20 4A 5A F2 23 49 93 02 34 1B 53 \r
+03 3C 0E 6E 08 68 49 69 3E B0 00 80 07 24 08 63 \r
+49 63 0B 63 3E B0 00 60 01 20 18 C3 1B 93 0C 38 \r
+3B 90 FF 00 0C 34 49 59 8B 10 09 DB 57 02 59 00 \r
+0D 49 0C 48 37 16 10 01 0C 43 0D 43 FB 3F 3D 40 \r
+FF FE 3C 43 57 02 5D 00 F5 3F CF 0D CD 0E CE 0C \r
+C2 93 D1 1D 06 20 B0 13 B4 EC 4C 93 02 20 2C 43 \r
+10 01 2E 83 2C 24 1E 83 43 24 2E 83 20 24 1E 83 \r
+3B 24 3E 80 03 00 34 24 1E 83 30 20 0E 43 8D 93 \r
+00 00 09 20 0F 93 2A 20 1C 4D 02 00 1D 4D 04 00 \r
+B0 13 92 ED 31 3C 1C 43 2C 9D 20 20 0F 93 1E 20 \r
+1C 4D 02 00 1D 4D 04 00 B0 13 80 ED 25 3C 3F B0 \r
+FE FF 14 20 CC 0F B0 13 DC E9 CE 0C 1D 3C 3F 90 \r
+03 00 07 24 2F 93 0A 20 CC 0D B0 13 10 E1 CE 0C \r
+13 3C CC 0D B0 13 18 D2 CE 0C 0E 3C 2E 43 0C 3C \r
+B0 13 A0 F0 CE 0C 08 3C B0 13 A4 F0 CE 0C 04 3C \r
+CC 0F B0 13 14 CF CE 0C CC 0E 10 01 0A 14 31 80 \r
+06 00 B0 13 D8 ED 2E 42 CF 01 1F 53 3D 40 12 1D \r
+1F 53 FF 4D FF FF 1E 83 FB 23 3C 40 05 00 0D 43 \r
+CE 01 1E 53 B0 13 FA B7 D2 43 F0 1C 4A 43 B0 13 \r
+F8 E1 0C 93 08 24 B0 13 42 B9 1A 2C F2 B0 20 00 \r
+F0 1C F5 27 1F 3C E1 43 00 00 3C 40 03 00 3D 40 \r
+0A 00 CE 01 B0 13 FA B7 4A 43 B0 13 94 F0 0C 93 \r
+04 20 E2 43 F0 1C 5C 43 10 3C B0 13 42 B9 06 28 \r
+C2 43 D1 1D E2 42 F0 1C 4C 43 07 3C F2 B0 20 00 \r
+F0 1C EB 27 C2 43 D1 1D 4C 43 31 50 06 00 0A 16 \r
+10 01 3C 40 E8 03 B0 13 E8 ED B2 40 2B 5A 5C 01 \r
+CF 0A 1A 43 4A 5F 7F 90 0B 00 10 01 92 93 EA 1C \r
+1C 24 C2 93 31 1D 0B 20 F2 B0 F0 FF F2 1C 04 20 \r
+32 D0 D8 00 03 43 34 3C F2 40 05 00 31 1D D2 83 \r
+31 1D 04 20 F2 F0 0F 00 F2 1C 2A 3C 3C 40 D7 03 \r
+B0 13 8A CC F2 D2 F0 1C 23 3C 3C 40 A3 00 B0 13 \r
+8A CC B2 B2 0A 1E 1C 24 F2 B0 20 00 01 02 18 24 \r
+B2 C2 0A 1E B0 13 24 E3 D2 53 31 1D 5F 42 31 1D \r
+5F 83 6F 93 0D 28 C2 43 31 1D D2 42 59 1E F3 1C \r
+D2 42 5A 1E F4 1C D2 42 5B 1E F5 1C F2 D2 F0 1C \r
+B2 B0 10 00 8C 1C 0A 24 5C 43 6D 43 B0 13 1E 97 \r
+B2 F0 EF FF 8C 1C B2 40 2B 5A 5C 01 10 01 1A 14 \r
+21 82 39 40 CB 00 3C 40 00 40 B0 13 8A CC 3C 40 \r
+03 00 3D 40 05 00 0E 43 B0 13 FA B7 D1 43 02 00 \r
+C1 49 03 00 CC 01 2C 53 6D 43 B0 13 2A CA 3C 40 \r
+03 00 3D 42 0E 43 B0 13 FA B7 3C 40 0A 00 B0 13 \r
+E8 ED CC 01 B0 13 62 D5 0C 93 18 20 C1 93 00 00 \r
+F8 27 B0 13 16 9B 4A 43 5A 92 17 1D F2 2F 3C 40 \r
+0A 00 B0 13 E8 ED 4C 4A B0 13 00 AC 3C 40 F2 1C \r
+7D 40 13 00 B0 13 2A CA 5A 53 EE 3F 3C 40 03 00 \r
+2D 42 0E 43 B0 13 FA B7 B2 40 2B 5A 5C 01 F2 B0 \r
+20 00 F0 1C B8 27 C2 43 D1 1D 21 52 19 16 10 01 \r
+1A 14 21 82 CA 0C F2 B0 40 00 01 02 3C 24 B0 13 \r
+EC D3 82 4C 1E 1E B0 13 C2 CB 81 4C 00 00 81 4D \r
+02 00 4A 93 03 20 B0 13 2C BB 27 3C 2C 41 1D 41 \r
+02 00 B0 13 1C E0 3E 40 CD CC 3F 40 4C 3E B0 13 \r
+44 B7 C9 0C CA 0D 1C 42 1A 1E 1D 42 1C 1E B0 13 \r
+1C E0 3E 40 CD CC 3F 40 4C 3F B0 13 44 B7 CE 0C \r
+CF 0D CC 09 CD 0A B0 13 DE 9E B0 13 38 D4 81 4C \r
+00 00 81 4D 02 00 B0 13 2C BB 1E 42 1E 1E B0 13 \r
+00 80 82 4C 20 1E 21 52 19 16 10 01 1C 41 04 00 \r
+1D 41 06 00 82 4C 1A 1E 82 4D 1C 1E 10 01 5C 43 \r
+B0 13 BA CE 5C 43 6D 42 80 13 0E 1E B0 13 B8 DF \r
+B0 13 A8 D9 B0 13 14 EA 4C 43 B0 13 A6 BD 7C 40 \r
+17 00 6D 43 B0 13 DA E8 7C 40 18 00 6D 43 B0 13 \r
+DA E8 7C 40 19 00 6D 43 B0 13 DA E8 3C 40 00 20 \r
+B0 13 8A CC B0 13 A4 ED B2 40 03 00 EA 1C B2 40 \r
+10 0E EC 1C B0 13 AC B8 4C 93 02 24 B0 13 FE B9 \r
+82 43 EA 1C B0 13 F8 ED 3C 40 00 20 B0 13 8A CC \r
+C2 43 1D 02 82 43 76 1E 7C 40 17 00 6D 42 B0 13 \r
+DA E8 7C 40 18 00 6D 42 B0 13 DA E8 7C 40 19 00 \r
+6D 42 B0 13 DA E8 92 D3 8C 1C 10 01 5A 14 C6 0F \r
+C7 0E C5 0D C9 0C 18 41 1C 00 C7 43 00 00 B0 13 \r
+9E AE CA 0C 0A 93 02 20 2C 42 3C 3C 1F 43 2F 99 \r
+02 24 09 43 09 3C 5C 49 02 00 B0 13 CA E3 C9 0C \r
+09 93 02 20 2C 43 2E 3C 5E 4A 02 00 7E 80 0B 00 \r
+C7 4E 00 00 3D 40 0E 00 0D 5A 4E 4E CC 05 B0 13 \r
+4A ED 09 93 06 24 D9 4A 21 00 07 00 D9 4A 22 00 \r
+08 00 06 93 07 24 3D 40 07 00 0D 5A CC 06 2E 42 \r
+B0 13 4A ED 08 93 06 24 3F 40 07 00 5F FA 0C 00 \r
+C8 4F 00 00 5D 4A 01 00 5C 43 B0 13 24 E2 CA 43 \r
+00 00 0C 43 55 16 10 01 4F 43 4C 93 2D 24 5C 93 \r
+20 24 6C 93 13 24 7C 90 03 00 2A 20 A2 D2 22 03 \r
+A2 C2 24 03 B2 C2 22 03 B0 13 B8 F0 B0 13 06 BD \r
+1F 42 20 03 6F F2 B2 C2 22 03 1A 3C A2 D2 24 03 \r
+B0 13 F4 BC B0 13 06 BD A2 D2 22 03 B0 13 B8 F0 \r
+0F 3C A2 D2 24 03 B2 C2 22 03 A2 D2 22 03 B0 13 \r
+B8 F0 B0 13 EA BC 04 3C A2 D2 24 03 B0 13 EA BC \r
+4C 43 4F 93 01 20 5C 43 10 01 B0 13 06 BD B0 13 \r
+F4 BC 10 01 A2 C2 22 03 B0 13 B8 F0 B2 C2 22 03 \r
+B0 13 B8 F0 10 01 B2 D2 22 03 B0 13 B8 F0 10 01 \r
+1A 14 CB 0C 7B 90 BD 00 07 24 4C 43 7B 90 31 00 \r
+40 28 7B 90 3D 00 3D 2C 0A 42 32 C2 03 43 B2 F0 \r
+BF FF 02 0F B2 B0 10 00 02 0F FC 27 7B 90 3D 00 \r
+26 2C 4C 43 B0 13 A2 EB C9 0C 4C 43 7D 40 29 00 \r
+B0 13 00 DD C2 4B 11 0F A2 B2 30 0F 13 24 7B 90 \r
+32 00 10 24 7B 90 39 00 0D 24 7B 90 38 00 0A 24 \r
+A2 B2 30 0F FD 23 0D 14 3D 40 BF 0C 1D 83 FE 23 \r
+0D 16 03 43 4C 43 CD 09 B0 13 00 DD 03 3C F2 40 \r
+BD 00 11 0F 5C 42 21 0F B2 B0 40 00 02 0F FC 27 \r
+02 4A 19 16 10 01 0A 14 21 82 CA 0C 0C 43 3D 40 \r
+00 08 3E 40 0A 00 B0 13 F2 C8 0D 43 3E 40 07 0D \r
+0F 43 B0 13 1E E7 3C 80 B9 65 3D 70 5E 00 3E 40 \r
+00 08 0F 43 B0 13 28 D9 81 4C 00 00 81 4D 02 00 \r
+1E 42 D4 1E 3E B0 00 80 0F 7F 3F E3 81 5E 00 00 \r
+81 6F 02 00 5A 93 1A 20 1E 42 D2 1E 3E B0 00 80 \r
+0F 7F 3F E3 1F 91 02 00 0D 38 02 20 2E 91 0A 28 \r
+81 9F 02 00 04 38 0C 20 81 9E 00 00 09 2C 92 83 \r
+D2 1E 06 3C 1E 53 82 4E D2 1E 02 3C A2 41 D2 1E \r
+B2 D0 40 00 8C 1C 21 52 0A 16 10 01 4C 43 B0 13 \r
+9A E5 0C 93 42 24 1C 83 42 20 B0 13 46 F0 4C 4C \r
+C2 4C FA 1D B0 13 82 E7 C2 4C 00 1E B0 13 62 E7 \r
+0D 43 82 4C 02 1E 82 4D 04 1E 5C 42 FA 1D 7C 90 \r
+41 00 28 28 1D 42 F8 1D 0D 93 24 24 4C 4C 3C 80 \r
+3C 00 B0 13 10 EC CF 0C 44 19 0F 10 D2 93 F6 1D \r
+03 20 46 19 0C 10 0F 8C CD 0F 0E 43 1D 52 FC 1D \r
+1E 62 FE 1D 3E 90 EB 0B 04 28 08 20 3D 90 01 C2 \r
+05 2C 82 5F FC 1D 82 63 FE 1D 04 3C 82 43 FC 1D \r
+82 43 FE 1D 92 43 F0 1D 10 01 80 00 CE D4 10 01 \r
+3A 14 07 4F 07 ED 0A 4F 5A 02 8A 10 4A 4A 0A 93 \r
+38 24 7F D0 80 00 0B 4D 5B 02 8B 10 4B 4B 0B 93 \r
+2B 24 7D D0 80 00 0B 8A 3B 50 7F 00 3A 40 18 00 \r
+08 43 09 43 0C 8E 0D 7F 03 2C 0C 5E 0D 6F 12 C3 \r
+08 68 09 69 5C 02 0D 6D 1A 83 F4 23 49 93 03 30 \r
+1A 53 1B 83 EF 3F 0C 7E 0D 7F 08 63 49 63 0B 63 \r
+1B 93 0C 38 3B 90 FF 00 0C 34 49 59 8B 10 09 DB \r
+57 02 59 00 0D 49 0C 48 37 16 10 01 0C 43 0D 43 \r
+FB 3F 3C 40 FF FE 3D 43 57 02 5D 00 F5 3F 2A 14 \r
+21 83 C9 0C 3F 40 0B 00 0F 59 68 4F 3A 40 3F 00 \r
+4A F8 3C 40 07 00 0C 59 1D 42 64 1E 2E 42 B0 13 \r
+06 E6 0C 93 2D 24 78 B0 40 00 2A 20 4A 93 10 24 \r
+7A 90 07 00 0D 2C 4A 4A 5A 06 00 18 5F 4A 7A F6 \r
+2C 43 0C 59 4F 13 1C 93 1B 20 D9 43 00 00 1A 3C \r
+7A 90 3F 00 03 24 7A 90 20 00 12 28 2C 43 0C 59 \r
+CD 01 B0 13 EA BF 4C 93 0B 24 D9 43 00 00 00 18 \r
+C2 93 68 1E 07 24 6C 41 80 13 68 1E 4C 93 02 24 \r
+C9 43 00 00 21 53 28 16 10 01 4A 14 C7 0D C8 0C \r
+39 40 B9 1D 3A 40 3F 00 5A F8 09 00 26 43 2F 43 \r
+6F 99 32 20 5A 99 09 00 2F 20 7A 90 3F 00 0B 24 \r
+3C 40 03 00 0C 59 3D 40 05 00 0D 58 2E 42 B0 13 \r
+06 E6 0C 93 21 20 D7 49 0B 00 00 00 57 43 7A 90 \r
+3F 00 16 24 3F 40 0A 00 0F 58 6F 4F 7F B0 80 FF \r
+0A 20 7F B2 0D 24 D9 98 0B 00 02 00 02 20 C9 43 \r
+02 00 47 43 05 3C 5D 49 0A 00 CC 08 B0 13 0A C4 \r
+B0 13 B8 EE CC 07 05 3C 39 50 0C 00 16 83 C7 23 \r
+4C 43 46 16 10 01 4A 14 C9 0F C7 0E C6 0D CA 0C \r
+6C 43 B0 13 FE C4 C8 0C 08 93 02 20 0C 43 36 3C \r
+CF 07 7F 50 0B 00 C8 4F 02 00 3E 40 0B 00 0E 58 \r
+3F 40 80 00 6F FE 4F DA CE 4F 00 00 D8 42 62 1E \r
+0D 00 D2 53 62 1E FD 27 F8 F0 BF 00 0C 00 5F 48 \r
+0C 00 7F F0 F8 00 4F D9 C8 4F 0C 00 F8 F0 7F 00 \r
+0C 00 F8 C2 0C 00 FE F0 7F 00 00 00 3C 40 0E 00 \r
+0C 58 4E 47 CD 06 B0 13 4A ED 3C 40 07 00 0C 58 \r
+1D 42 64 1E 2E 42 B0 13 4A ED CC 08 46 16 10 01 \r
+1F 42 44 1E CF 43 11 00 1F 42 44 1E DF 42 51 1E \r
+13 00 1F 42 44 1E 5E 42 D8 1E 5E 8F 0C 00 CF 4E \r
+16 00 1F 42 44 1E 5E 4F 16 00 8E 11 8F 5E 0A 00 \r
+1F 42 44 1E DF 5F 16 00 15 00 1F 42 44 1E DF 42 \r
+DA 1E 12 00 1F 42 44 1E FF 92 12 00 02 2C FF 42 \r
+12 00 1F 42 44 1E 9F 42 52 1E 04 00 9F 42 54 1E \r
+06 00 1F 42 44 1E DF 42 56 1E 0E 00 1F 42 44 1E \r
+EF B2 1A 00 03 20 4D 43 B0 13 64 DA B0 13 60 CE \r
+D2 C3 D6 1E 10 01 4F 14 1F 42 6E 03 2F 83 36 24 \r
+2F 83 27 24 2F 83 03 24 2F 83 1A 24 31 3C B2 F0 \r
+EF FF 48 03 92 C3 48 03 82 93 50 03 02 20 0F 43 \r
+05 3C 1F 42 50 03 1F 92 50 03 FB 23 1F 52 C0 1E \r
+82 4F 58 03 B2 D0 10 00 48 03 80 13 BC 1E 18 3C \r
+B2 F0 EF FF 4A 03 92 C3 4A 03 B2 D0 80 00 08 1E \r
+0F 3C B2 F0 EF FF 46 03 92 C3 46 03 B0 13 8C DC \r
+B2 D0 10 00 46 03 B0 13 52 A8 02 3C B0 13 D8 DB \r
+B1 C0 D0 00 14 00 4B 16 00 13 0A 14 CA 0D 4C 4C \r
+3C 90 07 00 0E 34 3C 90 06 00 2F 24 1C 83 30 24 \r
+1C 83 14 24 1C 83 2C 24 1C 83 27 24 1C 83 28 24 \r
+2A 3C 3C 80 07 00 2C 93 23 28 2C 83 1E 24 1C 83 \r
+1F 24 1C 83 1A 24 1C 83 1B 24 1D 3C 3A B0 03 00 \r
+0E 20 CC 0A 3D 40 64 00 B0 13 FA EB 0E 93 0A 20 \r
+CC 0A 3D 40 90 01 B0 13 FA EB 0E 93 03 24 7C 40 \r
+1C 00 0A 3C 7C 40 1D 00 07 3C 7C 40 1E 00 04 3C \r
+7C 40 1F 00 01 3C 4C 43 0A 16 10 01 3C 40 B5 1D \r
+0D 43 3E 40 1C 00 B0 13 5C ED E2 43 B5 1D F2 40 \r
+3D 00 B6 1D F2 40 20 00 B7 1D D2 43 B8 1D B0 13 \r
+4E E5 B0 13 02 E8 B0 13 C0 E9 B0 13 D0 EF B0 13 \r
+F2 E3 B0 13 C6 EF B0 13 E0 E0 3F 40 B9 1D CF 43 \r
+00 00 3F 50 0C 00 CF 43 00 00 C2 93 C5 1D 15 20 \r
+E2 43 C5 1D F2 40 03 00 C6 1D 7F 40 3F 00 C2 4F \r
+CE 1D C2 4F CF 1D F2 43 D0 1D B0 13 82 F0 CD 0C \r
+3C 40 C8 1D 2E 42 B0 13 4A ED 0C 43 10 01 F2 D0 \r
+A9 00 C1 05 F2 D0 80 00 C0 05 F2 40 1E 00 C6 05 \r
+C2 43 C7 05 D2 C3 C0 05 F2 F0 DF 00 19 02 F2 F0 \r
+DF 00 05 02 F2 F0 DF 00 04 02 F2 D0 20 00 06 02 \r
+F2 D0 E0 00 0A 02 A2 D3 22 03 92 D3 22 03 3C 40 \r
+47 01 B0 13 8A CC F2 F0 DF 00 1D 02 F2 D0 20 00 \r
+1B 02 6C 42 6D 43 B0 13 F6 CA 6C 42 7D 40 0A 00 \r
+B0 13 F6 CA 6C 42 6D 42 B0 13 F6 CA 3C 40 A3 00 \r
+B0 13 8A CC 6C 43 7D 40 82 00 80 00 F6 CA 1E 42 \r
+44 1E 5F 4E 15 00 8F 11 3F 90 40 00 0B 34 3F 90 \r
+C1 FF 14 34 FE 50 40 00 15 00 1F 42 44 1E 9F 83 \r
+08 00 07 3C FE 80 40 00 15 00 1F 42 44 1E 9F 53 \r
+08 00 1F 42 44 1E 5F 4F 15 00 8F 11 1E 42 44 1E \r
+CE 5F 14 00 1E 42 44 1E 5F 4E 14 00 8F 11 3F 90 \r
+40 00 0B 34 3F 90 C1 FF 0F 34 FE 50 40 00 14 00 \r
+1F 42 44 1E 9F 83 0A 00 10 01 FE 80 40 00 14 00 \r
+1F 42 44 1E 9F 53 0A 00 10 01 1A 14 31 80 22 00 \r
+C9 0D 5A 4C 0B 00 3F 40 CF 00 5F F1 0A 00 5F D2 \r
+66 1E 7F F0 BF 00 C1 4F 0A 00 3D 40 05 00 0D 5C \r
+CC 01 1C 53 2E 42 B0 13 4A ED CC 01 3C 50 05 00 \r
+1D 42 64 1E 2E 42 B0 13 4A ED 3D 40 C0 00 5D F1 \r
+09 00 4D D9 F1 40 0B 00 00 00 C1 4A 0B 00 3F 40 \r
+70 00 5F F1 0A 00 7F D0 0B 00 C1 4F 0A 00 7D F0 \r
+3F 00 C1 4D 09 00 CC 01 4D 43 B0 13 B6 B2 31 50 \r
+22 00 19 16 10 01 21 82 F2 F0 BF 00 05 02 F2 F0 \r
+BF 00 19 02 B2 D0 0C 00 22 03 B2 D0 0C 00 24 03 \r
+C2 43 76 1D 3C 40 CC 0C B0 13 8A CC 7C 40 06 00 \r
+5D 43 B0 13 C6 CF C1 4C 00 00 3C 40 CC 0C B0 13 \r
+8A CC 7C 40 07 00 4D 43 B0 13 CC C6 C1 4C 01 00 \r
+D1 B3 01 00 12 20 C1 93 01 00 0F 24 7C 40 7F 00 \r
+4D 43 B0 13 CC C6 C1 4C 02 00 D1 93 02 00 03 24 \r
+C2 43 76 1D 02 3C D2 43 76 1D 21 52 10 01 2A 14 \r
+5C 93 03 20 3F 40 00 1C 02 3C 3F 40 46 1C 2D 43 \r
+08 43 CB 08 4E 43 79 40 03 00 CF 93 00 00 06 20 \r
+6C 93 02 20 CC 0F 24 3C CB 0F 0C 3C 5C 93 0A 20 \r
+5E 53 2A 42 6A 9F 06 24 5A 4F 01 00 4A 99 02 2C \r
+C8 0F C9 0A 3F 50 23 00 1D 83 E7 23 0B 93 0C 20 \r
+08 93 02 20 0C 43 0C 3C CB 08 5D 4B 01 00 B0 13 \r
+24 E2 EB 43 01 00 03 3C 5E 53 CB 4E 01 00 CC 0B \r
+28 16 10 01 3C 40 10 00 3D 40 00 0A 3E 40 0B 00 \r
+B0 13 F2 C8 5C 06 3D 40 29 00 B0 13 FA EB 1F 42 \r
+A2 1E 0F 5C 3F 90 69 01 03 2C 1C 42 A0 1E 03 3C \r
+1C 42 A0 1E CF 0C 5C 06 0C 5F 5C 02 3D 40 0A 00 \r
+B0 13 FA EB 82 4C A0 1E 3C 90 F0 00 08 28 B2 F0 \r
+DF FF 08 1E 7C 42 4D 43 B0 13 DA E8 07 3C B2 D0 \r
+20 00 08 1E 7C 42 5D 43 B0 13 DA E8 B2 D2 8C 1C \r
+B2 D0 80 00 8C 1C 10 01 1A 14 CF 0E CA 0C 7A 90 \r
+1A 00 31 28 7A 90 2A 00 2E 2C 4E 4A 5E 02 1C 4E \r
+8E 1C 4E 4A 5E 4E E8 F5 7D 90 30 00 05 2C 7D 90 \r
+2D 00 05 20 6B 43 08 3C 7D 90 5B 00 02 28 4B 43 \r
+03 3C 4B 4D 5B 4B 8C F5 7A 90 21 00 11 28 C9 0B \r
+43 18 49 59 43 19 4B 10 4B D9 7A 90 21 00 08 20 \r
+7D 90 31 00 03 24 7D 90 4C 00 02 20 7B 40 80 00 \r
+CD 0B B0 13 A6 CD 19 16 10 01 0A 14 CE 0C 0B 42 \r
+32 C2 03 43 B2 F0 BF FF 02 0F B2 B0 10 00 02 0F \r
+FC 27 7E 90 31 00 23 28 7E 90 3D 00 20 2C 4C 43 \r
+B0 13 0A D7 CA 0C 4C 43 7D 40 29 00 B0 13 1E DF \r
+C2 4E 11 0F A2 B2 30 0F 0D 24 7E 90 32 00 0A 24 \r
+7E 90 38 00 07 24 A2 B2 30 0F FD 23 3C 40 F8 02 \r
+B0 13 64 EA 4C 43 CD 0A B0 13 1E DF 02 3C C2 4E \r
+11 0F 5C 42 21 0F 02 4B 0A 16 10 01 0A 14 CB 0D \r
+CA 0C 4C 43 B0 13 78 BC 7C 40 22 00 B0 13 2E C7 \r
+0C 24 CC 0A B0 13 2E C7 08 24 5C 43 B0 13 78 BC \r
+7C 40 23 00 B0 13 2E C7 02 20 0C 43 16 3C 5B 93 \r
+05 24 4C 43 B0 13 6A D2 4D 4C 0B 3C 5C 43 B0 13 \r
+6A D2 4C 4C 4D 4C 8D 10 4C 43 B0 13 6A D2 4C 4C \r
+0D DC 6C 43 B0 13 78 BC CC 0D 0A 16 10 01 B0 13 \r
+A6 D8 7C 40 03 00 B0 13 78 BC 4C 93 10 01 7C 40 \r
+36 00 B0 13 10 BD 4C 43 3D 40 12 F6 7E 40 27 00 \r
+B0 13 DA D7 7C 40 2C 00 7D 40 88 00 B0 13 00 DD \r
+7C 40 2D 00 7D 40 31 00 B0 13 00 DD 7C 40 2E 00 \r
+7D 40 09 00 B0 13 00 DD 7C 40 36 00 B0 13 10 BD \r
+7C 40 33 00 B0 13 10 BD 7C 40 3D 00 B0 13 10 BD \r
+7C B0 70 00 F9 23 7C 40 36 00 B0 13 10 BD 82 43 \r
+C4 1E B2 D0 01 02 34 0F 82 43 32 0F 10 01 7C 40 \r
+36 00 B0 13 10 BD F2 B0 10 00 D6 1E 1F 24 7C 40 \r
+0A 00 5D 42 98 1E B0 13 00 DD F2 90 7F 00 99 1E \r
+03 38 7D 40 0C 00 02 3C 5D 42 99 1E 7C 40 0C 00 \r
+B0 13 00 DD F2 B2 D6 1E 03 20 7D 40 11 00 02 3C \r
+7D 40 15 00 7C 40 12 00 B0 13 00 DD 7C 40 34 00 \r
+B0 13 10 BD B2 F0 FE FD 32 0F B2 F0 FE FD 32 0F \r
+B2 D0 01 02 36 0F A2 43 C4 1E 10 01 4C 4C C2 93 \r
+93 1E 02 20 4C 43 10 01 41 18 4C 5C 4C 4C F2 F0 \r
+DF 00 06 02 A2 C3 22 03 5F 42 CC 05 C2 4C CE 05 \r
+3F 40 E8 03 D2 B3 DD 05 03 20 1F 83 FB 23 18 3C \r
+0F 93 16 24 5F 42 CC 05 C2 43 CE 05 3F 40 E8 03 \r
+D2 B3 DD 05 03 20 1F 83 FB 23 0A 3C 0F 93 08 24 \r
+5C 42 CC 05 A2 D3 22 03 F2 D0 20 00 06 02 10 01 \r
+C2 43 93 1E 4C 43 10 01 0A 14 CA 0D CB 0C 7B 93 \r
+02 24 CF 0B 02 3C 4B 43 4F 43 4E 4B 4F 4F 0F 8E \r
+1F 53 4C 4B 3D 40 1C 00 B0 13 10 EC 1C 52 BE F6 \r
+4A 93 09 24 8C 43 00 00 8C 43 02 00 CC 43 1A 00 \r
+FC 40 7F 00 10 00 8C 43 18 00 FC F0 FC 00 1A 00 \r
+8C 43 04 00 8C 43 06 00 CC 43 0E 00 CC 43 12 00 \r
+CC 43 0F 00 CC 43 11 00 5B 53 1F 83 DA 23 0A 16 \r
+10 01 1A 14 C9 0D 3A 40 81 00 0A 5C 82 DA B0 01 \r
+CF 09 3F 50 10 00 82 4F 00 07 B2 40 00 02 02 07 \r
+7E 50 10 00 C2 4E 10 07 92 43 0C 07 2C 43 B0 13 \r
+8A CC A2 D3 00 07 C2 43 EA 1E 92 D3 00 07 3C 40 \r
+05 00 B0 13 8A CC C2 93 EA 1E FD 27 39 D0 03 00 \r
+82 C9 00 07 B2 F0 EF FF 00 07 82 CA B0 01 82 43 \r
+0C 07 1C 42 E8 1E 19 16 10 01 B2 40 F4 F2 E6 1E \r
+B2 40 72 F3 E4 1E 00 18 D2 42 FC F2 0E 1E 00 18 \r
+D2 42 7A F3 12 1E 82 43 76 1E 82 43 08 1E 82 43 \r
+0A 1E 82 43 8C 1C 82 43 0C 1E 92 D3 8C 1C B0 13 \r
+CA B5 B0 13 4E E6 B0 13 DC EC B0 13 46 EB B0 13 \r
+E4 EF B0 13 22 E8 B0 13 E8 D8 B0 13 90 EE B0 13 \r
+A8 DD B0 13 EE EF B0 13 F8 EF B0 13 B6 ED 80 00 \r
+74 C5 1A 14 21 82 CA 0C 3C 40 05 00 0C 5A 5D 4A \r
+0E 00 B0 13 14 DC 0C 93 02 20 3F 42 03 3C B0 13 \r
+7C F0 0F 43 F1 40 82 00 00 00 D1 4A 0D 00 01 00 \r
+C1 4F 02 00 6C 43 CD 01 7E 40 03 00 7F 40 03 00 \r
+B0 13 76 C0 C9 0C 09 93 0D 24 3C 40 03 00 0C 59 \r
+3D 40 05 00 0D 5A 2E 42 B0 13 4A ED CC 09 4D 43 \r
+B0 13 40 E1 21 52 19 16 10 01 2A 14 C8 0D C9 0C \r
+5C 42 77 1D B0 13 CA E3 CA 0C B0 13 6A F0 0A 93 \r
+24 24 CC 0A 5D 43 B0 13 28 E5 0C 93 1F 20 09 93 \r
+1D 24 5C 4A 0A 00 5F 4A 01 00 CD 09 CE 08 B0 13 \r
+76 C0 C9 0C 09 93 0E 24 3C 40 03 00 0C 59 3D 40 \r
+03 00 0D 5A 2E 42 B0 13 4A ED CC 09 5D 43 B0 13 \r
+40 E1 04 3C 3C 40 03 00 01 3C 2C 43 28 16 10 01 \r
+0E 42 32 C2 03 43 4C 93 2C 24 4F 4C 3F 50 00 7E \r
+B2 B0 10 00 02 0F FC 27 82 4F 10 0F B2 B0 10 00 \r
+02 0F FC 27 F2 40 3D 00 11 0F B2 B0 10 00 02 0F \r
+FC 27 F2 40 FE 00 11 0F B2 B0 20 00 02 0F FC 27 \r
+C2 43 10 0F B2 B0 80 00 02 0F FC 27 5D 42 20 0F \r
+B2 B0 10 00 02 0F FC 27 F2 40 3D 00 11 0F 4D 9C \r
+D7 23 02 4E 10 01 4C 4C C2 93 93 1E 2E 24 41 18 \r
+4C 5C 6C D3 F2 F0 DF 00 06 02 A2 C3 22 03 5F 42 \r
+CC 05 C2 4C CE 05 3F 40 E8 03 D2 B3 DD 05 03 20 \r
+1F 83 FB 23 18 3C 0F 93 16 24 5F 42 CC 05 C2 4D \r
+CE 05 3F 40 E8 03 D2 B3 DD 05 03 20 1F 83 FB 23 \r
+0A 3C 0F 93 08 24 5F 42 CC 05 A2 D3 22 03 F2 D0 \r
+20 00 06 02 10 01 C2 43 93 1E 10 01 0A 14 CA 0D \r
+6A 92 1A 24 B0 13 0C EF 4C 93 08 20 7C 40 47 00 \r
+3D 40 2A F5 5E 43 B0 13 7A AF 0E 3C 5C 42 FA 1D \r
+0D 43 7E 40 03 00 6F 43 B0 13 06 B5 CD 0C 7C 40 \r
+47 00 5E 43 B0 13 7A AF B0 13 0C EF 4C 93 0F 20 \r
+5A 93 08 24 6A 92 0B 20 7C 40 13 00 4D 43 B0 13 \r
+DA E8 05 3C 7C 40 13 00 5D 43 B0 13 DA E8 0A 16 \r
+10 01 21 82 81 43 00 00 81 43 02 00 7C 40 7F 00 \r
+4D 43 B0 13 CC C6 81 4C 00 00 81 43 02 00 2C 41 \r
+1F 41 02 00 47 18 0C 5C 0D 43 3C F0 00 07 0D F3 \r
+B0 13 3A DB 81 4C 00 00 81 4D 02 00 7C 40 80 00 \r
+5D 43 B0 13 CC C6 81 DC 00 00 12 C3 11 10 02 00 \r
+11 10 00 00 12 C3 11 10 02 00 11 10 00 00 2C 41 \r
+1D 41 02 00 21 52 10 01 1F 42 38 0F 1E 42 0E 0F \r
+0E 93 14 20 0F 93 28 24 3F 90 14 00 0C 20 B2 B0 \r
+00 02 36 0F 03 20 32 C2 03 43 FF 3F B2 F0 FF FD \r
+32 0F 80 00 60 A7 32 C2 03 43 FF 3F 2E 93 11 20 \r
+1F 42 0C 0F 2F 93 0A 24 2F 92 08 24 3F 90 06 00 \r
+05 24 3F 92 03 24 32 C2 03 43 FF 3F 32 C2 03 43 \r
+FF 3F 32 C2 03 43 FF 3F 10 01 B2 B0 30 00 40 03 \r
+2B 24 B2 F0 EF FF 4A 03 B2 F0 7F FF 08 1E 82 93 \r
+50 03 02 20 0F 43 05 3C 1F 42 50 03 1F 92 50 03 \r
+FB 23 0F 5C 82 4F 5A 03 92 C3 4A 03 B2 D0 10 00 \r
+4A 03 B0 13 3E F0 B2 40 2B 5A 5C 01 B0 13 C8 EC \r
+4C 93 03 24 6D 43 B0 13 08 A0 32 C2 03 43 B2 B0 \r
+80 00 08 1E EE 27 32 D2 10 01 B2 F0 FE FD 36 0F \r
+B2 F0 FE FD 32 0F B2 F0 FE FD 32 0F 92 43 C4 1E \r
+7C 40 32 00 B0 13 A2 EB C2 4C C6 1E 7C 43 3D 40 \r
+4E 1E 7E 40 0A 00 B0 13 96 D7 7C 43 B0 13 A2 EB \r
+C2 4C DA 1E 7C B0 80 FF 04 20 F2 80 80 00 DA 1E \r
+03 3C F2 F0 7F 00 DA 1E 1F 42 C8 1E 3F 80 10 00 \r
+82 4F D8 1E 80 00 26 DA 5D 93 10 24 6D 93 08 24 \r
+6D 92 19 20 82 43 9C 1E 7C 42 4D 43 80 00 DA E8 \r
+B0 13 88 CD B2 F0 7F FF 8C 1C 10 01 7C 42 5D 43 \r
+B0 13 DA E8 92 43 9C 1E B0 13 88 CD 7C 40 29 00 \r
+5D 43 80 00 DA E8 10 01 1C 42 A0 1E 0D 43 7E 40 \r
+03 00 4F 43 B0 13 06 B5 CD 0C 7C 40 5D 00 5E 43 \r
+B0 13 7A AF 10 01 5F 93 20 24 4F 93 1B 24 6F 93 \r
+12 24 7F 90 03 00 05 24 6F 92 1C 20 B0 13 F6 CD \r
+10 01 4E 4E 3E E3 CF 0E 6F FC 4D DF CC 4D 00 00 \r
+CC FE 20 00 10 01 B0 13 F6 CD CC DD 00 00 CC DD \r
+20 00 10 01 CC CE 00 00 10 01 6F 4C 4F CE 4D DF \r
+CC 4D 00 00 10 01 4E 4E 3E E3 CC FE 00 00 CC FE \r
+20 00 10 01 92 53 26 1E 82 63 28 1E 1F 43 5F 52 \r
+32 1E 3F 90 3C 00 1F 20 C2 43 32 1E 1F 43 5F 52 \r
+31 1E 3F 90 3C 00 12 20 C2 43 31 1E 1F 43 5F 52 \r
+30 1E F2 40 03 00 2E 1E 3F 90 18 00 03 24 C2 4F \r
+30 1E 10 01 C2 43 30 1E 80 00 08 D3 C2 4F 31 1E \r
+E2 43 2E 1E 10 01 C2 4F 32 1E D2 43 2E 1E 10 01 \r
+0A 14 1F 42 44 1E DF 53 13 00 B0 13 8E C3 1F 42 \r
+44 1E 1E 4F 08 00 1E 5F 0A 00 8F 4E 0C 00 1F 42 \r
+44 1E 9F 4F 0C 00 0A 00 1A 42 44 1E CF 0A 5C 4F \r
+13 00 2D 4F 1E 4F 02 00 3F 40 00 08 B0 13 F2 D5 \r
+8A 8C 0C 00 1F 42 44 1E CF 43 0F 00 1F 42 44 1E \r
+FF F0 FC 00 1A 00 0A 16 10 01 0A 14 CA 0C 7D 40 \r
+46 00 7E 40 5A 00 B0 13 60 EF 0D 43 4E 43 B0 13 \r
+7A AF 5A 93 0D 24 7C 40 29 00 B0 13 0C CF 7C 40 \r
+27 00 B0 13 0C CF 7C 40 28 00 B0 13 0C CF 0C 3C \r
+7C 40 1F 00 B0 13 0C CF 7C 40 20 00 B0 13 0C CF \r
+7C 40 1E 00 B0 13 0C CF 0A 16 10 01 4D 43 B0 13 \r
+DA E8 10 01 0A 14 0A 43 2C 92 22 24 3C 90 05 00 \r
+1C 24 3C 92 17 24 3C 90 0A 00 12 20 2F 4D 0F 93 \r
+0A 24 1F 83 06 24 1F 83 02 24 2C 43 16 3C 6C 43 \r
+03 3C 5C 43 01 3C 4C 43 B0 13 4A EA 0C 43 0D 3C \r
+2A 43 0A 3C B0 13 E2 E7 07 3C B0 13 B8 E6 04 3C \r
+B0 13 C2 E7 B0 13 E2 E5 CC 0A 0A 16 10 01 1A 14 \r
+C9 0C 79 93 02 24 CA 09 02 3C 49 43 4A 43 4F 49 \r
+4A 4A 0A 8F 1A 53 CC 09 B0 13 9A E5 0C 93 09 20 \r
+4C 49 3D 40 1C 00 B0 13 10 EC 1C 52 BE F6 B0 13 \r
+74 D1 59 53 1A 83 EF 23 E2 B3 D6 1E 0A 24 B0 13 \r
+A8 EF 4C 93 06 20 D2 C3 D6 1E B0 13 C8 ED B0 13 \r
+5E F0 19 16 10 01 0A 14 21 83 CA 0D CB 0C 4C 43 \r
+B0 13 78 BC 7C 40 22 00 B0 13 02 D0 0E 24 CC 0B \r
+B0 13 02 D0 0A 24 CC 0A B0 13 10 D0 C1 4C 00 00 \r
+6C 43 B0 13 78 BC 5C 43 01 3C 4C 43 21 53 0A 16 \r
+10 01 B0 13 10 D0 C1 4C 04 00 C1 93 04 00 10 01 \r
+B0 13 A6 D8 7C 40 03 00 B0 13 78 BC 10 01 0A 14 \r
+09 14 09 43 0A 43 1B 43 0F 93 04 24 09 4D 0D 4C \r
+0C 43 0D 3C 5C 02 0D 6D 09 69 09 8E 04 28 1C D3 \r
+5B 02 F8 2B 03 3C 09 5E 5B 02 F4 2B 1B 43 5C 02 \r
+0D 6D 09 69 0A 6A 09 8E 0A 7F 04 28 1C D3 5B 02 \r
+F6 2B 04 3C 09 5E 0A 6F 5B 02 F1 2B 0E 49 0F 4A \r
+09 16 0A 16 10 01 0A 14 7C 40 23 00 B0 13 A2 EB \r
+CA 0C 7A D0 20 00 CD 0A 7C 40 23 00 B0 13 00 DD \r
+7C 40 C4 00 B0 13 90 CA 7C 40 33 00 B0 13 10 BD \r
+7C 40 3D 00 B0 13 10 BD 7C B0 70 00 F9 23 3D 40 \r
+DF 00 4D FA 7C 40 23 00 B0 13 00 DD 7C 40 36 00 \r
+B0 13 10 BD 82 43 C4 1E 0A 16 10 01 0A 14 CA 0D \r
+6A 92 17 24 1C 42 FC 1D 1D 42 FE 1D 3E 40 E8 03 \r
+0F 43 B0 13 1E D0 7E 40 06 00 7F 40 05 00 B0 13 \r
+06 B5 CD 0C 7C 40 5A 00 5E 43 B0 13 7A AF 5A 93 \r
+08 24 6A 92 0B 20 7C 40 10 00 4D 43 B0 13 DA E8 \r
+05 3C 7C 40 10 00 5D 43 B0 13 DA E8 0A 16 10 01 \r
+B2 B0 20 00 08 1E 25 20 B0 13 0C EF 4C 93 21 20 \r
+B0 13 24 EF 4C 93 1D 20 D2 53 89 1E E2 93 89 1E \r
+18 20 4C 43 4D 43 B0 13 DA E8 5C 43 B0 13 BA CE \r
+7C 40 5A 00 3D 40 0A F5 5E 43 B0 13 7A AF 7C 40 \r
+46 00 3D 40 40 F5 5E 43 B0 13 7A AF 3F 40 00 10 \r
+C0 0F 10 01 AC 43 18 00 FC F0 FC 00 1A 00 CC 43 \r
+12 00 5F 42 4A 1E C2 93 4B 1E 06 24 5E 42 4A 1E \r
+12 C3 4E 10 4E 11 4F 8E CC 4F 13 00 E2 B3 D6 1E \r
+11 20 F2 D0 06 00 D6 1E B0 13 AC EE 82 4C 42 1E \r
+C2 93 4B 1E 04 20 B2 50 E0 7F 42 1E 10 01 B2 50 \r
+C0 53 42 1E 10 01 2A 14 1A 41 10 00 49 4C 1B 42 \r
+44 1E 1B 4B 0C 00 0B 89 3B 80 32 00 28 4D C9 0B \r
+09 88 09 93 02 38 28 9E 15 20 8D 4B 00 00 1D 42 \r
+44 1E 4C 4C 1C 5D 0C 00 3C 50 10 00 8E 4C 00 00 \r
+1E 42 44 1E DF 4E 0F 00 00 00 1F 42 44 1E DA 4F \r
+10 00 00 00 28 16 10 01 1A 14 CA 0C 5C 4A 05 00 \r
+CF 0C 3F 80 03 00 06 24 2F 83 2F 93 03 28 7F 40 \r
+03 00 01 3C 5F 43 4C 4C 1D 4A 02 00 5E 4A 04 00 \r
+B0 13 76 C0 C9 0C 09 93 0C 24 3C 40 03 00 0C 59 \r
+2D 4A 2E 42 B0 13 4A ED CC 09 5D 43 B0 13 40 E1 \r
+02 3C 3C 40 03 00 19 16 10 01 A2 D2 22 03 A2 C2 \r
+24 03 3E 42 4F 43 B2 C2 22 03 B0 13 AE D2 4F 5F \r
+A2 B2 20 03 01 24 5F D3 1E 83 F5 23 A2 D2 24 03 \r
+B2 C2 22 03 5C 93 03 24 A2 D2 22 03 02 3C A2 C2 \r
+22 03 B0 13 AE D2 B2 C2 22 03 CC 0F 10 01 B0 13 \r
+B8 F0 B2 D2 22 03 B0 13 B8 F0 10 01 D2 B3 D6 1E \r
+1D 24 A2 93 46 1E 1A 24 1F 42 44 1E 2C 4F 1D 4F \r
+02 00 0D 93 08 20 0C 93 06 20 82 93 46 1E 0E 20 \r
+92 43 46 1E 0F 3C 1E 42 4E 1E 1F 42 50 1E 3E F3 \r
+3F F0 FF 00 0F 9D 02 20 0E 9C 02 24 4C 43 10 01 \r
+A2 43 46 1E 5C 43 10 01 2A 14 19 43 59 52 CB 1E \r
+18 42 CE 1E 5A 42 CC 1E 4C 4A CD 08 B0 13 0A C2 \r
+4C 4C 0C 99 11 34 5A 53 3A 90 0D 00 05 34 C2 4A \r
+CC 1E D2 43 CB 1E 0A 3C D2 43 CB 1E D2 43 CC 1E \r
+18 53 82 48 CE 1E 02 3C C2 49 CB 1E 92 D3 8C 1C \r
+28 16 10 01 F2 B0 10 00 01 02 10 20 D2 B3 01 02 \r
+06 24 C2 93 7F 1E 19 20 B2 D2 76 1E 0C 3C 82 43 \r
+7C 1E F2 40 0A 00 7F 1E 80 00 88 F0 C2 93 7F 1E \r
+0C 20 A2 D2 76 1E 92 53 7C 1E 92 42 26 1E 2A 1E \r
+92 42 28 1E 2C 1E 80 00 8E F0 D2 83 7F 1E 10 01 \r
+2A 14 4A 4C 4C 4A B0 13 58 EE 4C 93 02 20 7A E3 \r
+5A 53 3A B0 00 80 0B 7B 3B E3 38 40 96 F6 09 43 \r
+0F 43 1C 43 0D 43 CE 0F B0 13 08 EE 0C FA 0D FB \r
+CE 0F B0 13 18 EE 3D 48 B0 13 10 EC 09 5C 1F 53 \r
+3F 90 07 00 EE 3B CC 09 28 16 10 01 21 83 81 43 \r
+00 00 7C 40 81 00 5D 43 B0 13 CC C6 81 4C 00 00 \r
+B1 B0 00 20 00 00 02 20 4E 43 08 3C B1 D0 00 C0 \r
+00 00 B1 E3 00 00 91 53 00 00 5E 43 2C 41 5C 03 \r
+CF 0C 4E 93 04 24 3C 40 AC 0A 0C 8F 03 3C 3C 40 \r
+AC 0A 0C 5F 21 53 10 01 0B 4D 0E 4B 0D 93 1F 30 \r
+3B F0 80 7F 1C 24 5B 02 8B 10 7E D0 80 00 3B 80 \r
+7F 00 15 30 3B 90 20 00 0F 34 3B 80 17 00 05 30 \r
+1B 83 08 30 5C 02 0E 6E FB 3F 5E 01 5C 00 1B 53 \r
+01 24 FB 3F 0D 4E 10 01 3C 43 3D 43 10 01 0C 43 \r
+0D 43 10 01 0B 4D 0B EF 0A 30 0D 93 12 30 0D 9F \r
+02 24 19 34 16 3C 0C 9E 18 24 13 28 14 3C 3D B0 \r
+80 7F 04 20 3F B0 80 7F 01 20 0F 24 0D 9F 0B 34 \r
+08 3C 0F 9D 02 24 07 34 04 3C 0E 9C EC 27 01 28 \r
+02 3C 3C 43 10 01 1C 43 10 01 0C 43 10 01 82 43 \r
+EE 1D 4C 43 B0 13 58 F0 B0 13 F8 ED C2 43 FA 1D \r
+C2 43 00 1E 82 43 02 1E 82 43 04 1E 92 D3 8C 1C \r
+7C 40 13 00 6D 42 B0 13 DA E8 7C 40 17 00 6D 42 \r
+B0 13 DA E8 7C 40 18 00 6D 42 B0 13 DA E8 7C 40 \r
+19 00 6D 42 80 00 DA E8 E2 93 AA 1E 13 24 B0 13 \r
+50 EC C2 93 AA 1E 1C 24 82 43 90 03 B2 D0 10 00 \r
+80 03 F2 D0 80 00 0B 02 E2 43 AA 1E 92 42 A8 1E \r
+C0 1E 10 01 B2 F0 CF FF 80 03 F2 F0 7F 00 03 02 \r
+F2 F0 7F 00 0B 02 D2 43 AA 1E 92 42 A6 1E C0 1E \r
+10 01 1A 14 31 80 06 00 C9 0C 5A 42 77 1D CC 0A \r
+B0 13 CA E3 0C 93 02 20 2C 43 13 3C 4D 43 B0 13 \r
+28 E5 0C 93 0E 20 91 43 02 00 C1 4A 04 00 81 43 \r
+00 00 CC 01 2C 53 3D 40 F2 1C CE 09 0F 43 B0 13 \r
+DC BB 31 50 06 00 19 16 10 01 C2 93 A4 1E 20 20 \r
+C2 4C A4 1E B2 40 8F 02 A6 1E 82 4D A8 1E B2 40 \r
+14 01 80 03 B2 40 05 00 92 03 B2 40 80 00 82 03 \r
+F2 D0 80 00 0B 02 00 18 F2 40 18 D5 BC 1E 3C 40 \r
+8F 02 B0 13 D0 E2 92 42 A8 1E C0 1E E2 43 AA 1E \r
+10 01 1A 14 CA 0D CB 0C CC 0A CD 0E B0 13 78 DB \r
+4D 4C CC 0A 49 4B 5C E9 F0 F3 47 18 0C 5C 4B ED \r
+5B 4B F0 F3 0B 5C 4A 4A 47 18 0A 5A CC 0E 4C DD \r
+0C 5A 0C EB 0F 9C 06 2C 3E 40 FF 7F 0C FE 5E 03 \r
+0F 9C FC 2B 19 16 10 01 F2 40 A5 00 21 01 4E 4C \r
+4F 4E 8F 10 0E 5F 3E 50 00 44 82 4E 24 01 4F 4C \r
+3F 50 00 44 82 4F 26 01 92 B3 2C 01 FD 27 C2 4C \r
+20 01 B2 F0 F9 FF 2C 01 A2 B3 2C 01 03 24 A2 B2 \r
+2C 01 FD 27 82 4E 26 01 C2 43 21 01 10 01 1A 14 \r
+3F 40 D2 F6 9F 00 FF FF 12 24 3D 40 D2 F6 0C 3C \r
+4F 13 2A 52 12 3C 3C 4D CA 0D CE 09 B0 13 4A ED \r
+0A 59 CD 0A 1D 53 1D C3 39 4D 09 93 F4 23 3F 40 \r
+FF FF 3F 93 05 24 3A 40 FF FF 0F 0A DF 03 E8 23 \r
+19 16 10 01 1A 14 21 83 CB 0F CA 0D C9 0C 5E 41 \r
+0E 00 B2 B0 40 00 08 1E 10 20 4C 4A B0 13 FE EA \r
+C1 4E 00 00 4C 4C CD 0C 0E 43 CC 09 CF 0B B0 13 \r
+DA E6 4C 4A B0 13 A4 E9 05 3C C1 4E 00 00 0E 43 \r
+B0 13 DA E6 21 53 19 16 10 01 7C 90 3C 00 06 28 \r
+7C 90 3E 00 03 24 32 C2 03 43 FF 3F 0F 42 32 C2 \r
+03 43 B2 B0 10 00 02 0F FC 27 7C 90 2F 00 08 28 \r
+7C 90 3E 00 05 24 7C D0 C0 00 C2 4C 13 0F 04 3C \r
+7C D0 80 00 C2 4C 13 0F 5C 42 22 0F 02 4F 10 01 \r
+0B 4D 0E 4B 3B F0 80 7F 1C 24 5B 02 8B 10 7E D0 \r
+80 00 3B 80 7F 00 15 30 3B 90 10 00 10 34 5E 01 \r
+5C 00 1E 93 01 24 FB 3F 1B 83 03 30 5C 02 0E 6E \r
+FB 3F 0D 93 02 34 3E E3 1E 53 0C 4E 10 01 3C 43 \r
+10 01 0C 43 10 01 0A 14 CB 0D 0A 42 32 C2 03 43 \r
+B2 B0 10 00 02 0F FC 27 7C D0 C0 00 C2 4C 13 0F \r
+4F 4E 1F 83 0A 24 B2 B0 80 00 02 0F FC 27 1D 53 \r
+DD 42 22 0F FF FF 1F 83 F6 23 4D 4E 0D 5B DD 42 \r
+20 0F FF FF 02 4A 0A 16 10 01 0B 42 32 C2 03 43 \r
+B2 B0 10 00 02 0F FC 27 4C 4C 47 18 0C 5C 3C D0 \r
+00 40 6F 4D 0F 5C 82 4F 10 0F 6E 93 0C 28 1D 53 \r
+4E 4E 1E 83 E2 4D 10 0F B2 B0 20 00 02 0F FC 27 \r
+1D 53 1E 83 F7 23 5F 42 20 0F 02 4B 10 01 92 B3 \r
+0A 1E 03 24 5C 43 B0 13 A6 BD A2 B2 0A 1E 03 24 \r
+5C 43 B0 13 A0 BA B2 B2 0A 1E 02 24 B0 13 E8 EE \r
+A2 B3 0A 1E 02 24 B0 13 74 C5 B2 B0 10 00 0A 1E \r
+05 24 6C 43 3D 40 99 19 B0 13 AA D5 82 43 0A 1E \r
+10 01 1A 14 C9 0C 3D 40 0C 00 0D 59 6E 49 7E 80 \r
+0B 00 5C 43 7F 40 03 00 B0 13 76 C0 CA 0C 0A 93 \r
+10 24 3C 40 03 00 0C 5A 3D 40 05 00 0D 59 2E 42 \r
+B0 13 4A ED FA D0 80 00 0E 00 CC 0A 4D 43 B0 13 \r
+40 E1 19 16 10 01 A2 D2 24 03 7F 40 80 00 3E 42 \r
+B2 C2 22 03 CD 0C 4D FF 4D 9F 03 24 A2 C2 22 03 \r
+02 3C A2 D2 22 03 12 C3 4F 10 B0 13 B8 F0 B2 D2 \r
+22 03 B0 13 B8 F0 1E 83 EB 23 B2 C2 22 03 A2 D2 \r
+22 03 A2 C2 24 03 10 01 82 43 18 1E 82 43 24 1E \r
+82 43 20 1E C2 93 76 1D 16 24 B0 13 02 E5 B0 13 \r
+A8 D9 B0 13 14 EA 1C 42 22 1E 0C 93 0C 24 1C 52 \r
+20 1E 82 4C 20 1E 1D 42 1A 1E 1E 42 1C 1E 1F 42 \r
+1E 1E 80 00 B2 93 10 01 0A 14 0A 43 0F 93 05 34 \r
+3E E3 3F E3 1E 53 0F 63 1A D3 0D 93 05 34 3C E3 \r
+3D E3 1C 53 0D 63 3A E3 B0 13 1E D0 1A B3 04 24 \r
+3C E3 3D E3 1C 53 0D 63 2A B3 04 24 3E E3 3F E3 \r
+1E 53 0F 63 0A 16 10 01 B0 13 5C B9 F2 B2 F0 1C \r
+14 24 3C 40 03 00 3D 40 05 00 0E 43 B0 13 FA B7 \r
+3C 40 F2 1C 6D 42 B0 13 2A CA 3C 40 03 00 2D 42 \r
+0E 43 B0 13 FA B7 F2 C2 F0 1C F2 B0 20 00 F0 1C \r
+E3 27 C2 43 D1 1D 10 01 C2 93 76 1D 15 24 82 93 \r
+24 1E 19 20 F2 F0 BF 00 1D 02 F2 D0 40 00 1B 02 \r
+B0 13 54 EF B2 40 10 0E 24 1E F2 B0 40 00 01 02 \r
+FC 27 4C 43 80 00 A0 BA 7C 40 47 00 3D 40 F0 F4 \r
+5E 43 80 00 7A AF 10 01 0A 14 CA 0D CB 0E 4C 4C \r
+3D 40 1C 00 B0 13 10 EC 1F 42 BE F6 0F 5C 8F 93 \r
+18 00 0F 20 8F 4A 00 00 8F 4B 02 00 0B 93 06 20 \r
+0A 93 04 20 1C 52 BE F6 EC C2 1A 00 FF 40 7F 00 \r
+10 00 0A 16 10 01 0A 14 5A 42 57 1E 3C 40 4E 1E \r
+B0 13 82 DE 4C 4C 0C EA 47 18 0C 5C 8C 10 4C 4C \r
+CA 0C C2 4A 57 1E 3A 90 21 00 05 20 D2 D3 D6 1E \r
+B0 13 5E F0 05 3C F2 F0 EF 00 D6 1E B0 13 AE C7 \r
+0A 16 10 01 4C 93 1C 20 4C 43 B0 13 9A E5 0C 93 \r
+04 24 1C 83 09 24 1C 83 13 20 C2 43 DC 1E C2 43 \r
+DD 1E 82 43 DE 1E 10 01 1F 42 BE F6 D2 4F 0E 00 \r
+DC 1E 1E 4F 06 00 92 4F 04 00 DE 1E C2 4E DD 1E \r
+10 01 1A 14 C2 93 A2 1D 16 24 3C 40 7A 1D 29 42 \r
+3A 40 C2 F6 3B 40 A4 1D 4E 43 4F 43 7D 4C 7D 9B \r
+01 20 5E 53 7D 9A 01 20 5F 53 19 83 F7 23 6F 92 \r
+02 24 6E 92 02 20 4C 43 01 3C 5C 43 19 16 10 01 \r
+D2 B3 D6 1E 14 24 1D 42 4E 1E 1E 42 50 1E 3D F3 \r
+3E F0 FF 00 1F 42 44 1E 1E 9F 02 00 08 20 2D 9F \r
+06 20 DF 92 51 1E 13 00 04 24 D2 C3 D6 1E 4C 43 \r
+10 01 EF C2 1A 00 B0 13 00 C1 5C 43 10 01 5C 02 \r
+0D 6D 5C 02 0D 6D 5C 02 0D 6D 5C 02 0D 6D 5C 02 \r
+0D 6D 5C 02 0D 6D 5C 02 0D 6D 5C 02 0D 6D 5C 02 \r
+0D 6D 5C 02 0D 6D 5C 02 0D 6D 5C 02 0D 6D 5C 02 \r
+0D 6D 5C 02 0D 6D 5C 02 0D 6D 10 01 5D 03 5C 00 \r
+5D 03 5C 00 5D 03 5C 00 5D 03 5C 00 5D 03 5C 00 \r
+5D 03 5C 00 5D 03 5C 00 5D 03 5C 00 5D 03 5C 00 \r
+5D 03 5C 00 5D 03 5C 00 5D 03 5C 00 5D 03 5C 00 \r
+5D 03 5C 00 5D 03 5C 00 10 01 0A 14 3F 40 B9 1D \r
+2E 43 0C 43 2D 43 6D 9F 05 20 3F 50 0C 00 1C 53 \r
+1E 83 F8 23 6C 93 02 20 0C 43 0C 3C 4C 4C 3D 40 \r
+0C 00 B0 13 10 EC 3A 40 B9 1D 0A 5C CC 0A B0 13 \r
+70 DD CC 0A 0A 16 10 01 92 C3 44 03 82 93 9A 1E \r
+0E 24 B0 13 9A 82 92 93 9A 1E 03 24 B0 13 86 DF \r
+02 3C B0 13 AE C7 1C 42 94 1E 80 00 BC E8 F2 C2 \r
+D6 1E B0 13 AE C7 1C 42 96 1E B0 13 BC E8 92 43 \r
+9A 1E 10 01 3A 14 C8 0D C7 0C 3A 40 B9 1D 29 43 \r
+2F 43 6F 9A 0E 20 3D 40 03 00 0D 5A CC 07 2E 42 \r
+B0 13 06 E6 0C 93 05 20 58 9A 0A 00 02 20 CC 0A \r
+05 3C 3A 50 0C 00 19 83 EB 23 0C 43 37 16 10 01 \r
+3A 14 C8 0D C7 0C 3A 40 B9 1D 49 43 2F 43 6F 9A \r
+0E 20 3C 40 03 00 0C 5A CD 07 2E 42 B0 13 06 E6 \r
+0C 93 05 20 CA 98 0A 00 02 20 CC 0A 05 3C 3A 50 \r
+0C 00 59 53 EB 27 0C 43 37 16 10 01 C2 93 40 1E \r
+14 20 3F 40 47 01 1F 52 56 03 C2 93 36 1E 08 20 \r
+C2 93 37 1E 0E 24 3F 80 03 00 C2 43 37 1E 09 3C \r
+3F 80 05 00 C2 43 36 1E F8 3F 3F 40 00 80 1F 52 \r
+56 03 82 4F 56 03 10 01 82 43 4C 1E B0 13 64 F0 \r
+F2 40 21 00 48 1E F2 40 06 00 4A 1E C2 43 49 1E \r
+D2 43 4B 1E 7C 43 5D 43 B0 13 88 C8 B0 13 3E C7 \r
+B0 13 76 D0 7C 40 0C 00 5D 42 16 1E 80 00 00 DD \r
+21 83 0F 42 32 C2 03 43 B2 B0 10 00 02 0F FC 27 \r
+4C 4C 47 18 0C 5C 3C D0 00 40 4D 4D 0C 5D 82 4C \r
+10 0F B2 B0 20 00 02 0F FC 27 5E 42 20 0F 81 4E \r
+00 00 02 4F 21 53 10 01 5F 14 1A 42 38 0F 4A 4A \r
+B0 13 24 EF 4C 93 10 20 7A 90 14 00 04 24 4A 93 \r
+0D 20 03 43 0B 3C 1F 42 EE 1D 1F 93 02 24 2F 93 \r
+05 20 B0 13 02 ED 02 3C B0 13 28 CC 5A 16 00 13 \r
+21 83 CC 43 0A 00 EC 43 00 00 DC 42 B8 1D 0B 00 \r
+D2 53 B8 1D 02 3C D2 53 B8 1D C2 93 B8 1D FB 27 \r
+F2 93 B8 1D F8 27 5C 42 B8 1D CD 01 B0 13 A2 E3 \r
+4C 93 F1 23 21 53 10 01 82 43 EE 1D 82 43 F2 1D \r
+82 43 F4 1D 82 43 F0 1D C2 43 FA 1D C2 43 00 1E \r
+82 43 02 1E 82 43 04 1E 82 43 FC 1D 82 43 FE 1D \r
+C2 43 F6 1D B2 40 4B 00 F8 1D C2 43 06 1E 10 01 \r
+B0 13 7C B3 B0 13 5A C9 B0 13 7C 87 B0 13 00 EF \r
+82 93 76 1E 03 20 82 93 08 1E 02 24 B0 13 4C A2 \r
+82 93 0A 1E 02 24 B0 13 1E D8 82 93 8C 1C EE 27 \r
+B0 13 60 9C EB 3F 0A 14 CA 0C 5D 42 EE 1E B0 13 \r
+B0 E0 4C 93 0E 24 B0 13 6E ED CD 0C 1C 43 0C 5A \r
+2E 42 B0 13 06 E6 0C 93 02 20 0C 43 05 3C 2C 43 \r
+03 3C B0 13 B8 EE 1C 43 0A 16 10 01 0E 4C 0D 4C \r
+0D 93 16 24 03 34 3D E3 1D 53 0F 30 3B 40 8F 00 \r
+1B 83 5D 02 FD 2B 4C 4D 8C 10 8D 10 4D 4D 8B 10 \r
+0D DB 5E 02 5D 00 5C 00 10 01 3D 40 00 C7 0C 43 \r
+10 01 0A 14 3A 40 09 00 0F 43 6D 4C 3B 42 4E 4D \r
+0E EF 3E 90 80 00 04 38 4F 5F 7F E0 97 00 01 3C \r
+4F 5F 4F 4F 4D 5D 1B 83 F2 23 1C 53 1A 83 ED 23 \r
+CC 0F 0A 16 10 01 1D 42 9E 1D 0F 42 32 C2 03 43 \r
+D2 43 9C 1D 02 4F 0D 93 07 24 B0 13 9E E8 C2 93 \r
+9B 1D 02 20 1D 83 F9 23 0F 42 32 C2 03 43 C2 43 \r
+9B 1D C2 43 9C 1D 02 4F 10 01 B0 13 16 F0 1F 42 \r
+44 1E FF 90 7F 00 10 00 0A 24 2C 93 05 34 3C 93 \r
+0D 34 DF 83 10 00 10 01 DF 53 10 00 10 01 CF 4C \r
+10 00 1F 42 44 1E FF 50 0C 00 10 00 10 01 7C 90 \r
+2F 00 06 28 7C 90 3E 00 03 24 32 C2 03 43 FF 3F \r
+0F 42 32 C2 03 43 B2 B0 10 00 02 0F FC 27 C2 4C \r
+11 0F B2 B0 20 00 02 0F FC 27 C2 4D 10 0F 02 4F \r
+10 01 4D 93 03 20 32 C2 03 43 FF 3F 0F 42 32 C2 \r
+03 43 B2 B0 10 00 02 0F FC 27 F2 40 7F 00 11 0F \r
+4D 4D B2 B0 20 00 02 0F FC 27 F2 4C 10 0F 1D 83 \r
+F8 23 02 4F 10 01 B2 F0 FE FD 36 0F B2 F0 FE FD \r
+32 0F 7C 40 36 00 B0 13 10 BD 7C 40 3A 00 B0 13 \r
+10 BD 7C 40 36 00 B0 13 10 BD 7C 40 32 00 B0 13 \r
+10 BD 82 43 C4 1E 10 01 F2 F0 DF 00 1B 02 92 C3 \r
+22 03 F2 F0 DF 00 03 02 F2 F0 1F 00 02 02 F2 F0 \r
+1F 00 0A 02 A2 C3 22 03 F2 D0 20 00 05 02 F2 D0 \r
+E0 00 04 02 A2 D3 24 03 10 01 21 83 7C 40 30 00 \r
+B0 13 10 BD 81 43 00 00 02 3C 91 53 00 00 B1 90 \r
+64 00 00 00 FA 2B 7C 40 36 00 B0 13 10 BD 7C B0 \r
+70 00 F9 23 82 43 06 0F 21 53 10 01 0C 93 02 20 \r
+0D 93 14 24 3B 40 9F 00 1B 83 5C 02 0D 6D FC 2B \r
+12 C3 5D 00 5C 00 3E 40 06 00 5D 01 5C 00 1E 83 \r
+FC 37 8B 10 0D DB 12 C3 5D 00 5C 00 10 01 A2 B2 \r
+76 1E 15 24 5F 42 E0 1E 4F 93 0A 24 5F 93 0F 20 \r
+C2 43 E0 1E 92 D3 0C 1E B2 D0 80 00 0C 1E 10 01 \r
+D2 43 E0 1E 92 D3 0C 1E B2 D0 40 00 0C 1E 10 01 \r
+4D 93 03 20 32 C2 03 43 FF 3F 0F 42 32 C2 03 43 \r
+4D 4D B2 B0 10 00 02 0F FC 27 F2 40 BF 00 13 0F \r
+1C 53 DC 42 22 0F FF FF 1D 83 F3 23 02 4F 10 01 \r
+CF 0C FF B0 80 FF 0C 00 02 20 6C 43 10 01 CF 9D \r
+0D 00 0C 20 B0 13 6E ED CD 0C 1C 43 0C 5F 2E 42 \r
+B0 13 06 E6 0C 93 02 20 4C 43 10 01 5C 43 10 01 \r
+82 93 6E 1E 09 20 82 93 6C 1E 06 20 B2 40 04 03 \r
+6C 1E B2 40 02 01 6E 1E B0 13 76 EB C2 4C 75 1E \r
+4C 93 FA 27 3C 40 72 1E 0D 43 1E 43 80 00 5C ED \r
+31 80 06 00 81 43 02 00 D1 4C 05 00 04 00 CF 0C \r
+3F 50 06 00 81 4F 00 00 1D 4C 02 00 2E 42 0E 5C \r
+2F 4C CC 01 2C 53 B0 13 DC BB 31 50 06 00 10 01 \r
+0A 14 CA 0C 3F 40 CF 00 5F FA 0C 00 5F D2 66 1E \r
+CA 4F 0C 00 2C 43 0C 5A B0 13 B6 B2 4C 93 02 20 \r
+0C 43 02 3C 3C 40 09 00 CA 43 00 00 0A 16 10 01 \r
+7C 90 80 00 09 28 4C 4C 3C 80 00 01 2D 43 B0 13 \r
+50 E2 3C 80 4A 00 04 3C 4C 4C 5C 03 3C 80 4A 00 \r
+3C 90 80 FF 02 34 3C 40 80 FF 8C 11 10 01 92 C3 \r
+22 03 F2 F0 DF 00 03 02 F2 F0 1F 00 02 02 A2 C3 \r
+22 03 F2 D0 20 00 05 02 F2 D0 E0 00 04 02 A2 D3 \r
+24 03 92 D3 24 03 D2 43 93 1E 10 01 B2 F0 FF FD \r
+36 0F 7C 40 36 00 B0 13 5A C6 7C 40 3D 00 B0 13 \r
+5A C6 7C B0 F0 FF F9 23 7C 40 3A 00 B0 13 5A C6 \r
+B2 F0 FF FD 32 0F 10 01 C2 93 D1 1D 0E 20 B0 13 \r
+8A 95 B0 13 8C C2 0C 93 0C 20 B0 13 B8 E6 B0 13 \r
+6E ED B0 13 BE E5 B0 13 62 E8 D2 43 D1 1D 80 00 \r
+6A A6 10 01 5C 93 13 20 0C 42 32 C2 03 43 2E 43 \r
+3F 40 00 1C CF 93 00 00 05 24 5D 9F 01 00 02 2C \r
+DF 83 01 00 3F 50 23 00 1E 83 F4 23 02 4C 10 01 \r
+0B 43 0D 93 03 34 3D E3 1D 53 1B D3 0C 93 03 34 \r
+3C E3 1C 53 3B E3 B0 13 FA EB 1B B3 02 24 3C E3 \r
+1C 53 2B B3 02 24 3E E3 1E 53 10 01 4C 4C 3D 40 \r
+1C 00 B0 13 10 EC CF 0C 1F 52 BE F6 EF B2 1A 00 \r
+03 24 0F 43 0D 43 05 3C 1C 52 BE F6 2F 4C 1D 4C \r
+02 00 CC 0F 10 01 C2 93 4A 1E 09 24 1F 42 44 1E \r
+DF 83 13 00 1F 42 44 1E CF 93 13 00 02 24 5C 43 \r
+10 01 8F 43 18 00 5D 43 B0 13 64 DA 4C 43 10 01 \r
+82 4C C0 1E 82 93 50 03 02 20 0F 43 05 3C 1F 42 \r
+50 03 1F 92 50 03 FB 23 0F 5C 82 4F 58 03 92 C3 \r
+48 03 B2 D0 10 00 48 03 10 01 31 40 FC 2B 00 18 \r
+F2 40 BC F0 AC 1E 00 18 F2 40 BC F0 B0 1E B0 13 \r
+98 F0 0C 93 02 24 B0 13 7E D6 0C 43 B0 13 E0 DD \r
+B0 13 9C F0 92 B3 22 03 11 24 7C 40 06 00 B0 13 \r
+1C C8 C2 4C 59 1E 7C 40 07 00 B0 13 1C C8 C2 4C \r
+5A 1E 7C 42 B0 13 1C C8 C2 4C 5B 1E 10 01 5D 93 \r
+12 20 C2 93 89 1E 0A 24 E2 93 89 1E 0C 2C 7C 40 \r
+5A 00 3D 40 04 F5 5E 43 80 00 7A AF 7C 40 5A 00 \r
+3D 40 0A F5 F8 3F 10 01 B2 D0 06 00 06 0A B2 40 \r
+1D 7B 00 0A B2 40 ED 00 04 0A F2 D0 E0 00 4A 02 \r
+F2 D0 E0 00 44 02 B2 43 0A 0A B2 40 FF 00 0C 0A \r
+10 01 3F 40 B9 1D 0E 43 2B 43 6B 9F 07 20 CF 9C \r
+0B 00 04 20 CD 4E 00 00 5C 43 10 01 3F 50 0C 00 \r
+1E 53 2E 93 F1 3B 4C 43 10 01 21 83 CD 01 B0 13 \r
+A2 E3 4C 93 0B 24 6C 41 3D 40 0C 00 B0 13 10 EC \r
+EC 93 B9 1D 03 20 3C 50 B9 1D 01 3C 0C 43 21 53 \r
+10 01 82 93 8C 1E 09 20 82 93 8A 1E 06 20 B2 40 \r
+08 07 8A 1E B2 40 06 05 8C 1E 00 18 C2 43 8E 1E \r
+B0 13 76 EB C2 4C 92 1E 10 01 B2 B0 20 00 08 1E \r
+0F 20 B0 13 0C EF 4C 93 0B 20 F2 C2 03 02 F2 C2 \r
+05 02 F2 C2 1B 02 2C 43 B0 13 20 B1 F2 D2 1B 02 \r
+10 01 B2 B0 20 00 08 1E 0F 20 B0 13 0C EF 4C 93 \r
+0B 20 F2 C2 03 02 F2 C2 05 02 F2 C2 1B 02 1C 43 \r
+B0 13 20 B1 F2 D2 1B 02 10 01 3C 40 03 00 5C F2 \r
+20 01 7C 90 03 00 03 2C 5C 53 B0 13 38 D6 6C 92 \r
+03 28 5C 83 B0 13 90 E4 7C 90 03 00 EE 23 10 01 \r
+F2 40 A5 00 21 01 4E 4C 4F 4E 8F 10 0E 5F 3E 50 \r
+00 44 82 4E 26 01 92 B3 2C 01 FD 27 C2 4C 20 01 \r
+C2 43 21 01 10 01 3F 40 13 00 6F 9C 09 24 5F 4C \r
+0C 00 1F 83 07 24 1F 83 07 20 B0 13 C2 C9 04 3C \r
+DC 43 0C 00 B0 13 CA 99 0C 43 10 01 F2 F0 E0 00 \r
+05 02 F2 F0 E0 00 03 02 F2 D0 1F 00 07 02 F2 F0 \r
+E0 00 19 02 F2 F0 E0 00 1D 02 F2 D0 1F 00 1B 02 \r
+10 01 1A 14 39 40 11 00 3F 40 32 1D 3A 40 5C F6 \r
+3C 4A B0 13 72 E6 2F 52 8F 4C FC FF 8F 4D FE FF \r
+19 83 F6 23 19 16 10 01 4D 93 03 24 5F 4C 0A 00 \r
+02 3C 5F 4C 09 00 4F 93 06 24 CC 93 00 00 03 24 \r
+7F 90 20 00 02 2C 2C 43 10 01 0C 43 10 01 3C 40 \r
+80 1E 0D 43 2E 42 B0 13 5C ED C2 93 88 1E 09 20 \r
+3C 40 84 1E 3D 40 A4 F6 2E 42 B0 13 4A ED D2 43 \r
+88 1E 10 01 B2 B0 20 00 08 1E 0E 20 B0 13 0C EF \r
+4C 93 0A 20 F2 C2 03 02 F2 C2 05 02 F2 C2 1B 02 \r
+B0 13 3E BB F2 D2 1B 02 10 01 4C 4C 3D 40 1C 00 \r
+B0 13 10 EC CF 0C 1F 52 BE F6 EF B2 1A 00 02 24 \r
+2C 43 10 01 1C 52 BE F6 1C 4C 18 00 10 01 CE 0C \r
+6D 4E 5D 92 C2 F6 0C 24 7C 40 09 00 B0 13 1E DF \r
+2D 42 3F 40 A4 1D 1F 53 FF 4E FF FF 1D 83 FB 23 \r
+10 01 0A 14 0A 42 32 C2 03 43 D2 93 78 1D 08 24 \r
+B0 13 C2 E7 7C 40 32 00 B0 13 5A C6 D2 43 78 1D \r
+02 4A 0A 16 10 01 0E 93 02 20 0C 43 10 01 1D 83 \r
+1C 83 1D 53 6B 4D 1C 53 6F 4C 4F 9B 02 20 1E 83 \r
+F8 23 4B 4B 4C 4F 0C 8B 10 01 0A 14 CA 0C 5D 42 \r
+17 1E B0 13 B0 E0 4C 93 04 20 B0 13 B8 EE 1C 43 \r
+04 3C CC 0A B0 13 F4 EE 0C 43 0A 16 10 01 82 43 \r
+26 1E 82 43 28 1E E2 42 30 1E F2 40 1E 00 31 1E \r
+C2 43 32 1E C2 43 2F 1E 82 43 2A 1E 82 43 2C 1E \r
+10 01 0D 4C 0D 93 0E 24 3B 40 8F 00 1B 83 5D 02 \r
+FD 2B 4C 4D 8C 10 8D 10 4D 4D 8B 10 0D DB 12 C3 \r
+5D 00 5C 00 10 01 82 43 90 03 B2 40 C0 00 92 03 \r
+B2 D0 10 00 80 03 92 B3 82 03 FD 27 B2 F0 EF FF \r
+80 03 92 C3 82 03 10 01 D2 93 78 1D 0D 20 7C 40 \r
+36 00 B0 13 5A C6 7C 40 3D 00 B0 13 5A C6 7C B0 \r
+F0 FF F9 23 E2 43 78 1D 10 01 0A 14 CB 0E CA 0C \r
+CE 0F CC 0D CD 0B 5F 41 08 00 B0 13 06 B5 CD 0C \r
+CC 0A 6E 43 B0 13 7A AF 0A 16 10 01 0A 14 CA 0C \r
+5D 42 75 1E B0 13 B0 E0 4C 93 04 20 B0 13 B8 EE \r
+1C 43 03 3C CC 0A B0 13 B6 E4 0A 16 10 01 02 12 \r
+32 C2 03 43 82 4C D0 04 82 4D D2 04 82 4E E0 04 \r
+82 4F E2 04 1C 42 E4 04 1D 42 E6 04 32 41 10 01 \r
+D2 43 34 1E 92 42 50 03 56 03 B0 13 8C DC 92 C3 \r
+46 03 B2 D0 10 00 46 03 7C 40 14 00 5D 43 80 00 \r
+DA E8 1F 42 BE F6 BF 90 FF 00 02 00 05 28 06 20 \r
+BF 90 00 FF 00 00 02 2C 0C 43 10 01 1C 42 DE 1E \r
+10 01 1F 42 BE F6 BF 90 FF 00 02 00 05 28 06 20 \r
+BF 90 00 FF 00 00 02 2C 4C 43 10 01 5C 42 DD 1E \r
+10 01 0A 14 5C 43 B0 13 FE C4 CA 0C 0A 93 07 24 \r
+2C 43 0C 5A B0 13 C4 EE CC 0A B0 13 5E BF 0A 16 \r
+10 01 D2 93 78 1D 09 24 F2 90 03 00 78 1D 08 20 \r
+B0 13 CC E1 E2 43 78 1D 10 01 32 C2 03 43 FF 3F \r
+10 01 D2 93 78 1D 09 24 F2 90 03 00 78 1D 08 24 \r
+F2 40 03 00 78 1D 80 00 8C EB 32 C2 03 43 FF 3F \r
+10 01 C2 43 66 1E 00 18 C2 43 68 1E B0 13 6E ED \r
+82 4C 64 1E B0 13 76 EB C2 4C 62 1E 4C 93 FA 27 \r
+10 01 3C 40 38 1E 3D 40 2E F5 3E 42 B0 13 4A ED \r
+C2 43 37 1E C2 43 36 1E C2 43 34 1E C2 43 40 1E \r
+10 01 B2 F0 CF FF 80 03 F2 F0 7F 00 03 02 F2 F0 \r
+7F 00 0B 02 B2 F0 EF FF 82 03 B0 13 26 F0 80 00 \r
+E4 EF D2 92 C2 F6 A4 1D 08 24 D2 43 A2 1D 7C 40 \r
+07 00 7D 40 07 00 80 00 1E DF 32 C2 03 43 FF 3F \r
+B0 13 CC E1 7C 40 0A 00 5D 42 C6 F6 B0 13 1E DF \r
+F2 90 03 00 78 1D 02 20 80 00 8C EB 10 01 3F 40 \r
+3E 00 0E 42 32 C2 03 43 B0 13 96 E6 02 4E C2 93 \r
+9B 1D 03 20 1F 83 3F 93 F4 23 10 01 CF 0C 82 4F \r
+54 03 92 C3 44 03 B0 13 AC EE 2F 83 0F 8C 3F 90 \r
+00 80 02 28 92 D3 44 03 10 01 CF 0D 7C 90 2A 00 \r
+0A 2C 4E 4C 5D 4E E8 F5 4C 4C 5C 02 1C 4C 8E 1C \r
+CE 0D 80 00 A6 CD 10 01 0C 9D 02 2C 80 00 4A ED \r
+0C 5E 0D 5E 0E 93 06 24 1D 83 1C 83 EC 4D 00 00 \r
+1E 83 FA 23 10 01 CD 0C C2 93 88 1E 02 24 4C 43 \r
+10 01 3C 40 84 1E 2E 42 B0 13 4A ED D2 43 88 1E \r
+5C 43 10 01 D2 93 E0 1E 0A 20 D2 92 E3 1E 31 1E \r
+06 20 D2 92 E2 1E 30 1E 02 20 E2 43 E0 1E 10 01 \r
+5C 43 B0 13 BA CE 6C 43 B0 13 BA CE 5C 43 6D 42 \r
+80 13 0E 1E 6C 43 6D 42 20 00 12 1E 3C B0 00 80 \r
+0D 7D 3D E3 3E 40 3D 00 0F 43 B0 13 1E E7 3E 40 \r
+C8 00 0F 43 80 00 28 D9 3C B0 00 80 0D 7D 3D E3 \r
+3E 40 52 00 0F 43 B0 13 1E E7 3E 40 19 00 0F 43 \r
+80 00 28 D9 B0 13 74 EE 4C 93 08 20 4C 43 4D 43 \r
+B0 13 DA E8 5C 43 5D 43 80 00 DA E8 4C 43 FB 3F \r
+3C 40 00 1C 0D 43 3E 40 46 00 B0 13 5C ED 3C 40 \r
+46 1C 0D 43 3E 40 46 00 80 00 5C ED 0A 14 CF 0C \r
+CC 0D 2A 43 0F 93 05 20 B0 13 16 E9 4C 93 01 24 \r
+0A 43 CC 0A 0A 16 10 01 21 82 CF 0C CC 0D A1 4F \r
+00 00 91 4F 02 00 02 00 CD 01 2E 42 B0 13 F8 E8 \r
+21 52 10 01 C2 93 76 1D 0A 24 B0 13 DA EF F2 F0 \r
+BF 00 1B 02 F2 F0 BF 00 1D 02 82 43 24 1E 10 01 \r
+1F 42 44 1E 5C 4F 11 00 6C 93 02 2C 3C 42 10 01 \r
+5C 53 4C 5C 4C 5C 4C 4C 10 01 7C 90 03 00 07 2C \r
+4C 4C 5D 4C CA F6 7C 40 3E 00 80 00 1E DF 32 C2 \r
+03 43 FF 3F 0C 93 0A 24 5C 0F 1C 53 0F 42 32 C2 \r
+03 43 B0 13 96 E6 02 4F 1C 83 F8 23 10 01 B0 13 \r
+76 EB 7C F0 0F 00 5C 53 4E 4C 1C 42 A0 1D B0 13 \r
+64 EA 1E 83 FA 23 10 01 B2 90 06 00 0E 07 08 20 \r
+92 42 20 07 E8 1E D2 43 EA 1E B1 C0 D0 00 00 00 \r
+00 13 B2 F0 EF FF 46 03 C2 43 34 1E 7C 40 14 00 \r
+4D 43 B0 13 DA E8 5D 43 80 00 08 A0 6D 42 B0 13 \r
+66 EE 4F 43 C2 93 06 1E 01 20 5F 43 C2 4F 06 1E \r
+5D 43 80 00 66 EE 1C 42 D2 1E CF 0C 5F 0A 0C 5F \r
+3D 40 05 00 B0 13 50 E2 3C 50 40 01 10 01 4C 93 \r
+06 24 7C 90 0D 00 06 28 7C 80 0C 00 10 01 3F 40 \r
+0C 00 4C 5F 10 01 3D 40 FF 00 3E 40 0C 00 3F 40 \r
+20 0A 1F 53 CF 4D FF FF 1E 83 FB 23 10 01 5D 42 \r
+92 1E B0 13 B0 E0 4C 93 02 24 0C 43 10 01 B0 13 \r
+B8 EE 1C 43 10 01 F2 40 06 00 E2 1E F2 40 1E 00 \r
+E3 1E F2 40 0A 00 E1 1E C2 43 E0 1E 10 01 D2 53 \r
+5E 1E F2 90 03 00 5E 1E 02 28 C2 43 5E 1E 82 43 \r
+5C 1E 80 00 24 E3 5C 42 9A 1D 3D 40 6D 00 B0 13 \r
+10 EC 7C 50 43 00 C2 4C 9A 1D 10 01 B2 F0 FF FD \r
+32 0F 7C 40 34 00 B0 13 5A C6 B2 D0 00 02 36 0F \r
+10 01 0F 42 32 C2 03 43 7C D0 C0 00 C2 4C 13 0F \r
+5C 42 22 0F 02 4F 10 01 B2 D0 10 00 08 1E 00 18 \r
+F2 40 54 D3 BC 1E 3C 40 99 19 80 00 D0 E2 0E 93 \r
+08 20 2D 93 06 2C 5D 06 3D 50 AE F6 6E 43 80 00 \r
+7A AF 10 01 0E 93 08 20 2D 93 06 2C 5D 06 3D 50 \r
+B6 F6 6E 43 80 00 7A AF 10 01 0E 43 0F 4C 1C 43 \r
+5F 02 0E 6E 0E 9D 01 28 0E 8D 0C 6C F9 2B 10 01 \r
+02 12 32 C2 03 43 82 4C C0 04 82 4D C8 04 1C 42 \r
+CA 04 32 41 10 01 B2 B2 76 1E 07 24 C2 93 34 1E \r
+02 20 80 00 40 E7 80 00 B2 EA 10 01 B2 40 FF 7F \r
+52 03 B2 D0 10 00 42 03 B2 D0 24 01 40 03 10 01 \r
+5F 42 A4 1E 5F 83 D2 83 A4 1E 0F 93 02 20 80 00 \r
+42 E8 10 01 3E 40 0C 00 3F 40 20 0A 1F 53 CF 43 \r
+FF FF 1E 83 FB 23 10 01 5D 93 07 20 7C 40 5A 00 \r
+3D 40 1A F5 5E 43 80 00 7A AF 10 01 5D 93 07 20 \r
+7C 40 5A 00 3D 40 22 F5 5E 43 80 00 7A AF 10 01 \r
+5D 93 07 20 7C 40 5A 00 3D 40 12 F5 5E 43 80 00 \r
+7A AF 10 01 3C 80 05 00 05 24 3C 80 05 00 02 24 \r
+4C 43 10 01 5C 43 10 01 4C 43 D2 93 34 1E 05 20 \r
+B2 90 E2 F2 E4 1E 01 20 5C 43 10 01 B2 40 D9 07 \r
+CE 1E F2 42 CC 1E D2 43 CB 1E C2 43 CA 1E 10 01 \r
+4C ED 4F 4C CC 0D 8C 10 5C EF F0 F3 7C F0 1F 00 \r
+10 01 1F 42 50 03 82 4F C8 1E 1F 92 50 03 F9 23 \r
+80 00 EA CC CF 0C 5F 06 0C 5F 3C 80 40 06 3D 40 \r
+09 00 80 00 50 E2 4C 43 D2 93 58 1E 04 20 82 93 \r
+60 1E 01 24 5C 43 10 01 4C 43 92 93 18 1E 04 20 \r
+82 93 24 1E 01 24 5C 43 10 01 CF 0C 0E 93 05 24 \r
+1F 53 FF 4D FF FF 1E 83 FB 23 10 01 0E 93 06 24 \r
+4D 4D 1C 53 CC 4D FF FF 1E 83 FB 23 10 01 C2 93 \r
+88 1E 03 24 3C 40 84 1E 10 01 3C 40 A4 F6 10 01 \r
+0D 93 02 20 0C 93 04 24 82 4C 8A 1E 82 4D 8C 1E \r
+10 01 0D 93 02 20 0C 93 04 24 82 4C 6C 1E 82 4D \r
+6E 1E 10 01 B0 13 EA DF B2 F0 EF FF 32 0F B2 D0 \r
+10 00 36 0F 10 01 82 43 9C 1E F2 40 0F 00 9E 1E \r
+B2 40 2C 01 A0 1E 10 01 A2 43 9A 1E 92 C3 44 03 \r
+B2 D0 10 00 44 03 10 01 A2 D2 80 03 82 43 80 03 \r
+B2 D0 00 02 80 03 10 01 CE 0C 3C 40 E8 03 B0 13 \r
+64 EA 1E 83 FA 23 10 01 82 43 32 0F 82 43 36 0F \r
+B0 13 EA DF 80 00 28 EE 3E F0 1F 00 04 24 5C 02 \r
+0D 6D 1E 83 FC 23 10 01 3E F0 1F 00 04 24 5D 03 \r
+5C 00 1E 83 FC 23 10 01 7C 40 36 00 B0 13 10 BD \r
+7C 40 39 00 80 00 10 BD 4F 43 C2 93 CA 1E 01 20 \r
+5F 43 C2 4F CA 1E 10 01 4F 43 C2 93 2F 1E 01 20 \r
+5F 43 C2 4F 2F 1E 10 01 4F 43 7C B0 80 FF 01 20 \r
+5F 43 CC 0F 10 01 C2 93 06 1E 02 20 80 00 CC D0 \r
+80 00 C2 AD 4F 43 7C 90 0C 00 01 2C 5F 43 CC 0F \r
+10 01 B0 13 B2 EA B0 13 22 E8 5D 43 80 00 08 A0 \r
+D2 43 5E 1E 82 43 60 1E C2 43 58 1E 10 01 B2 F0 \r
+1F FF 04 0A 4C 4C 82 DC 04 0A 10 01 1C 42 50 03 \r
+1C 92 50 03 FB 23 10 01 C2 93 9C 1D 02 24 D2 43 \r
+9B 1D 10 01 3D 40 79 1D 3E 40 21 00 80 00 4A ED \r
+B2 F0 DF FF 40 03 82 43 50 03 10 01 5C 43 B0 13 \r
+BA CE 6C 43 80 00 BA CE B0 13 24 E3 B2 D0 00 04 \r
+8C 1C 10 01 DC 93 0C 00 02 20 80 00 62 D8 10 01 \r
+B0 13 3E F0 B2 40 2B 5A 5C 01 10 01 4C 43 A2 93 \r
+EE 1D 01 20 5C 43 10 01 4C 43 92 93 EE 1D 01 20 \r
+5C 43 10 01 4C 43 82 93 EA 1C 01 24 5C 43 10 01 \r
+4C 43 92 93 D0 1E 01 20 5C 43 10 01 CF 0C CC 0D \r
+CD 0F 2E 42 80 00 F8 E8 CD 0C 3C 40 80 1E 2E 42 \r
+80 00 4A ED 7C 40 03 00 7D 40 0B 00 80 00 C6 CF \r
+5C 93 02 20 CC 0D 10 01 CC 0E 10 01 1C 42 8C 1C \r
+49 19 0C 10 5C F3 10 01 1C 42 8C 1C 48 19 0C 10 \r
+5C F3 10 01 1C 42 8C 1C 46 19 0C 10 5C F3 10 01 \r
+1C 42 8C 1C 44 19 0C 10 5C F3 10 01 1C 42 8C 1C \r
+45 19 0C 10 5C F3 10 01 1C 42 44 03 7C F0 10 00 \r
+10 01 B2 F0 EF FF 44 03 80 00 86 DF B2 F0 EF FF \r
+08 1E 80 00 26 F0 B0 13 76 EB C2 4C EE 1E 10 01 \r
+B0 13 76 EB C2 4C 17 1E 10 01 7C 40 03 00 4D 43 \r
+80 00 C6 CF C2 43 A4 1E C2 43 AA 1E 10 01 82 43 \r
+EA 1C E2 42 16 1D 10 01 82 43 D0 1E 4C 43 80 00 \r
+A6 BD 1C 42 8C 1C 8C 10 5C F3 10 01 1C 42 8C 1C \r
+5C 0F 5C F3 10 01 5C 42 C6 1E 8C 11 10 01 4C 5C \r
+C2 4C 49 1E 10 01 B2 F0 EF FF 48 03 10 01 B2 D0 \r
+20 00 40 03 10 01 D2 43 E0 1E 80 00 42 E8 32 D0 \r
+D8 00 03 43 10 01 5C 42 DC 1E 10 01 C2 4C 48 1E \r
+10 01 C2 4C 4A 1E 10 01 4D 43 80 00 88 C8 92 D3 \r
+44 03 10 01 92 C3 44 03 10 01 5C 42 78 1D 10 01 \r
+A2 D2 06 0A 10 01 82 43 76 1E 10 01 CC 43 00 00 \r
+10 01 3C 40 C2 F6 10 01 92 D3 04 0A 10 01 92 C3 \r
+04 0A 10 01 80 00 7E 98 1C 43 10 01 03 43 FF 3F \r
+2C 43 10 01 2C 43 10 01 4C 43 10 01 6C 43 10 01 \r
+0C 43 10 01 0C 43 10 01 03 43 10 01 10 01 10 01 \r
+10 01 30 30 30 30 30 31 30 30 32 30 30 33 30 30 \r
+34 30 30 35 30 30 36 30 30 37 30 30 38 30 30 39 \r
+30 31 30 30 31 31 30 31 32 30 31 33 30 31 34 30 \r
+31 35 30 31 36 30 31 37 30 31 38 30 31 39 30 32 \r
+30 30 32 31 30 32 32 30 32 33 30 32 34 30 32 35 \r
+30 32 36 30 32 37 30 32 38 30 32 39 30 33 30 30 \r
+33 31 30 33 32 30 33 33 30 33 34 30 33 35 30 33 \r
+36 30 33 37 30 33 38 30 33 39 30 34 30 30 34 31 \r
+30 34 32 30 34 33 30 34 34 30 34 35 30 34 36 30 \r
+34 37 30 34 38 30 34 39 30 35 30 30 35 31 30 35 \r
+32 30 35 33 30 35 34 30 35 35 30 35 36 30 35 37 \r
+30 35 38 30 35 39 30 36 30 30 36 31 30 36 32 30 \r
+36 33 30 36 34 30 36 35 30 36 36 30 36 37 30 36 \r
+38 30 36 39 30 37 30 30 37 31 30 37 32 30 37 33 \r
+30 37 34 30 37 35 30 37 36 30 37 37 30 37 38 30 \r
+37 39 30 38 30 30 38 31 30 38 32 30 38 33 30 38 \r
+34 30 38 35 30 38 36 30 38 37 30 38 38 30 38 39 \r
+30 39 30 30 39 31 30 39 32 30 39 33 30 39 34 30 \r
+39 35 30 39 36 30 39 37 30 39 38 30 39 39 31 30 \r
+30 31 30 31 31 30 32 31 30 33 31 30 34 31 30 35 \r
+31 30 36 31 30 37 31 30 38 31 30 39 31 31 30 31 \r
+31 31 31 31 32 31 31 33 31 31 34 31 31 35 31 31 \r
+36 31 31 37 31 31 38 31 31 39 31 32 30 31 32 31 \r
+31 32 32 31 32 33 31 32 34 31 32 35 31 32 36 31 \r
+32 37 31 32 38 31 32 39 31 33 30 31 33 31 31 33 \r
+32 31 33 33 31 33 34 31 33 35 31 33 36 31 33 37 \r
+31 33 38 31 33 39 31 34 30 31 34 31 31 34 32 31 \r
+34 33 31 34 34 31 34 35 31 34 36 31 34 37 31 34 \r
+38 31 34 39 31 35 30 31 35 31 31 35 32 31 35 33 \r
+31 35 34 31 35 35 31 35 36 31 35 37 31 35 38 31 \r
+35 39 31 36 30 31 36 31 31 36 32 31 36 33 31 36 \r
+34 31 36 35 31 36 36 31 36 37 31 36 38 31 36 39 \r
+31 37 30 31 37 31 31 37 32 31 37 33 31 37 34 31 \r
+37 35 31 37 36 31 37 37 31 37 38 31 37 39 31 38 \r
+30 00 26 EC 00 00 82 EE 00 00 08 A0 00 00 90 EF \r
+00 00 84 F3 48 EE 00 00 CC 8B 00 00 1E 97 00 00 \r
+0C F0 00 00 06 F3 4E E0 00 00 62 A3 00 00 42 B4 \r
+00 00 78 EF 00 00 18 F3 BE F0 00 00 66 A4 00 00 \r
+1A AB 00 00 9C EF 00 00 2A F3 C0 F0 00 00 2E AA \r
+00 00 42 A9 00 00 0C F0 00 00 3C F3 68 A5 00 00 \r
+76 F0 00 00 5C CB 00 00 0C F0 00 00 4E F3 BE F0 \r
+00 00 BE F0 00 00 E4 AC 00 00 0C F0 00 00 60 F3 \r
+5E EB 00 00 BE F0 00 00 A6 9D 00 00 6C EF 00 00 \r
+F4 F2 38 EE 00 00 D0 8F 00 00 EC B1 00 00 02 F0 \r
+00 00 E2 F2 BE F0 00 00 BE F0 00 00 48 CD 00 00 \r
+84 EF 00 00 96 F3 42 E4 00 00 BE F0 00 00 8C EC \r
+00 00 0C F0 00 00 A8 F3 1A E4 00 00 BE F0 00 00 \r
+78 EC 00 00 0C F0 00 00 BA F3 74 E5 00 00 BE F0 \r
+00 00 A0 EC 00 00 0C F0 00 00 CC F3 CC EA 00 00 \r
+C2 91 00 00 66 EE 00 00 0C F0 00 00 DE F3 20 D1 \r
+00 00 BE F0 00 00 4E E3 00 00 0C F0 00 00 72 F3 \r
+01 80 40 20 10 08 84 42 21 90 48 A4 52 29 14 0A \r
+85 C2 61 B0 58 AC D6 6B 35 9A CD 66 33 99 4C A6 \r
+53 A9 54 2A 95 CA E5 F2 79 3C 9E CF 67 B3 D9 6C \r
+B6 5B 2D 16 0B 05 82 41 A0 50 28 94 4A A5 D2 69 \r
+34 1A 8D 46 23 91 C8 E4 72 39 1C 8E C7 E3 F1 F8 \r
+FC FE FF 7F 3F 1F 0F 07 83 C1 E0 70 38 9C CE E7 \r
+F3 F9 7C BE DF 6F 37 9B 4D 26 13 89 44 22 11 88 \r
+C4 62 31 98 CC E6 73 B9 5C AE D7 EB 75 BA DD 6E \r
+B7 DB 6D 36 1B 0D 06 03 81 C0 60 30 18 8C C6 63 \r
+B1 D8 EC F6 7B 3D 1E 8F 47 A3 D1 E8 F4 7A BD 5E \r
+AF 57 AB 55 AA D5 EA F5 FA FD 7E BF 5F 2F 17 8B \r
+45 A2 51 A8 D4 6A B5 DA ED 76 3B 1D 0E 87 C3 E1 \r
+F0 78 BC DE EF 77 BB 5D 2E 97 CB 65 B2 59 2C 96 \r
+4B 25 92 49 24 12 09 04 02 01 80 40 20 10 08 84 \r
+42 21 90 48 A4 52 29 14 0A 85 C2 61 B0 58 AC D6 \r
+6B 35 9A CD 66 33 99 4C A6 53 A9 54 2A 95 CA E5 \r
+45 52 52 00 20 20 44 4F 4E 45 00 00 30 30 30 30 \r
+30 30 30 00 20 43 4F 4E 46 00 20 52 46 42 53 4C \r
+00 00 20 20 53 59 4E 43 00 00 20 20 20 50 50 54 \r
+00 00 20 20 20 41 43 43 00 00 2D 2D 2D 00 30 30 \r
+30 30 30 30 30 30 00 00 4C 42 00 00 4B 47 00 00 \r
+20 52 41 4D 00 00 30 34 33 30 00 00 43 43 34 33 \r
+30 00 20 4F 46 46 00 00 20 20 4F 4E 00 00 4C 4F \r
+42 41 54 54 00 00 20 20 4F 50 45 4E 00 00 20 20 \r
+4C 4F 3F 54 00 00 2D 2D 2D 2D 00 00 02 1B 01 1E \r
+17 3C 18 10 06 1E 08 05 03 47 0B 08 0C 00 0D 22 \r
+0E B1 0F 3B 10 7B 11 83 12 13 13 22 14 F8 15 42 \r
+19 1D 1A 1C 1B C7 1C 00 1D B2 21 B6 22 10 23 EA \r
+24 2A 25 00 26 1F 2C 81 2D 35 2E 09 F5 60 B6 F2 \r
+63 D3 D7 70 F7 F3 00 00 00 00 00 86 00 77 C7 95 \r
+E6 97 17 F3 67 05 F0 87 85 75 46 C6 37 F5 06 D3 \r
+87 C4 C4 02 67 E3 B6 00 03 01 04 08 10 80 80 80 \r
+80 20 40 02 01 80 04 02 10 20 40 08 08 80 08 08 \r
+08 08 F7 F7 F7 F7 20 40 04 80 7F 7F 7F 7F 7F 10 \r
+01 80 2F 1E 1B 07 37 B2 0A 04 00 00 00 0C 00 23 \r
+2A D4 4D 3B 15 11 F8 57 07 0C 10 1D 1C C7 10 B0 \r
+FF FF F9 B6 10 EA 2A 00 1F 00 67 FF 00 00 6F 00 \r
+1C 02 DD 03 B1 05 9D 07 A2 09 C4 0B 07 0E 6E 10 \r
+01 13 C6 15 C8 18 11 1C B5 1F CC 23 07 04 F5 03 \r
+E8 03 B6 03 84 03 52 03 20 03 EE 02 BC 02 8A 02 \r
+58 02 26 02 F4 01 C2 01 90 01 5E 01 2C 01 2A E6 \r
+00 00 FC E6 00 00 2E EB 00 00 B4 F0 00 00 B0 F0 \r
+00 00 16 DE 00 00 12 00 24 00 47 00 8F 00 1E 01 \r
+3B 02 76 04 79 56 34 12 02 01 01 01 00 00 32 34 \r
+48 00 31 32 48 00 4D 41 4C 45 46 45 4D 41 D2 1D \r
+D2 1D FF FF FF FF 14 32 50 6E 0F 27 8B 00 02 00 \r
+00 \r
+@f6d2\r
+01 00 C2 1E 00 00 01 00 7E 1E 00 00 01 00 7F 1E \r
+0A 00 54 00 8E 1C 20 0A 20 0A 20 0A 20 0A 24 0A \r
+2A 0A 29 0A 27 0A 26 0A 24 0A 24 0A 26 0A 26 0A \r
+24 0A 26 0A 24 0A 26 0A 26 0A 26 0A 21 0A 22 0A \r
+20 0A 23 0A 24 0A 25 0A 26 0A 21 0A 22 0A 23 0A \r
+25 0A 20 0A 20 0A 24 0A 2B 0A 2B 0A 2A 0A 29 0A \r
+28 0A 27 0A 20 0A 24 0A 28 0A 02 00 E4 1E 00 00 \r
+01 00 41 1E 00 00 01 00 31 1D 00 00 02 00 E6 1E \r
+00 00 01 00 D1 1D 00 00 01 00 78 1D 00 00 01 00 \r
+9A 1D 00 00 01 00 9B 1D 00 00 01 00 9C 1D 00 00 \r
+02 00 9E 1D 00 00 02 00 A0 1D 00 00 01 00 A2 1D \r
+00 00 01 00 A4 1D FF 00 04 00 A8 1D 00 00 00 00 \r
+04 00 AC 1D 00 00 00 00 04 00 B0 1D 00 00 00 00 \r
+01 00 88 1E 00 00 01 00 62 1E 00 00 02 00 64 1E \r
+00 00 01 00 66 1E 00 00 04 00 68 1E 00 00 00 00 \r
+01 00 B4 1D 01 00 01 00 17 1E 00 00 02 00 EC 1E \r
+00 00 01 00 EE 1E 00 00 04 00 6C 1E 00 00 00 00 \r
+01 00 70 1E 00 00 01 00 74 1E 00 00 01 00 75 1E \r
+00 00 04 00 8A 1E 00 00 00 00 04 00 8E 1E 00 00 \r
+00 00 01 00 92 1E 00 00 01 00 48 1E 00 00 01 00 \r
+49 1E 00 00 01 00 4A 1E 00 00 01 00 4B 1E 00 00 \r
+02 00 94 1E 00 00 02 00 96 1E 00 00 01 00 98 1E \r
+00 00 01 00 99 1E 00 00 01 00 C6 1E 00 00 02 00 \r
+C8 1E 00 00 02 00 D8 1E 00 00 01 00 DA 1E 00 00 \r
+00 00 \r
+@ffe0\r
+D6 8D \r
+@ffea\r
+38 DD 86 C1 16 85 98 EA \r
+@fffe\r
+FA E2 \r
+q\r
diff --git a/chronos-ti/Recovery/Chronos Watch/Applications/Recovery_ez430_chronos_datalogger_433MHz.txt b/chronos-ti/Recovery/Chronos Watch/Applications/Recovery_ez430_chronos_datalogger_433MHz.txt
new file mode 100755 (executable)
index 0000000..1fba0cf
--- /dev/null
@@ -0,0 +1,1514 @@
+@9e00\r
+5A 14 31 80 1A 00 CA 0E B0 13 DA E6 0E 43 3F 40 \r
+C8 42 B0 13 C4 C8 81 4C 12 00 81 4D 14 00 CC 0A \r
+B0 13 E8 ED 0E 43 3F 40 20 41 B0 13 C4 C8 81 4C \r
+16 00 81 4D 18 00 36 40 11 00 37 40 BA 1D 0A 43 \r
+28 47 19 47 02 00 CC 08 CD 09 1E 41 12 00 1F 41 \r
+14 00 B0 13 36 DC 0C 93 0A 38 81 48 08 00 81 49 \r
+0A 00 27 52 1A 53 16 83 EB 23 4A 4A 03 3C 4A 4A \r
+0A 93 7E 24 3A 90 0F 00 3D 38 3A 90 0F 00 23 24 \r
+B0 13 86 A0 1E 42 FA 1D 1F 42 FC 1D B0 13 C4 B0 \r
+C9 0C CA 0D 1C 42 FA 1D 1D 42 FC 1D 1E 42 F6 1D \r
+1F 42 F8 1D B0 13 3A A0 1C 42 34 FA 1C 82 32 FA \r
+B0 13 4C A0 1C 42 34 FA B0 13 60 A0 81 4C 00 00 \r
+81 4D 02 00 73 3C B0 13 24 A0 C9 0C CA 0D 1C 42 \r
+F6 1D 1D 42 F8 1D 1E 41 08 00 1F 41 0A 00 B0 13 \r
+3A A0 1C 42 32 FA 1C 82 30 FA B0 13 4C A0 1C 42 \r
+30 FA E2 3F C9 0A 59 02 16 49 12 FA 5A 06 17 4A \r
+BA 1D 18 4A BC 1D B0 13 24 A0 C5 0C CA 0D B0 13 \r
+86 A0 CE 07 CF 08 B0 13 C4 B0 3E 40 34 80 3F 40 \r
+37 3A B0 13 10 A0 CC 05 CD 0A B0 13 40 C2 C5 0C \r
+CA 0D CC 07 CD 08 1E 41 08 00 1F 41 0A 00 B0 13 \r
+90 A0 CC 05 CD 0A B0 13 C4 C8 C8 0C CA 0D 1C 49 \r
+14 FA 0C 86 B0 13 0A E5 CE 0C CF 0D CC 08 CD 0A \r
+B0 13 40 C2 C9 0C CA 0D CC 06 B0 13 60 A0 A6 3F \r
+B0 13 86 A0 1E 42 BA 1D 1F 42 BC 1D B0 13 C4 B0 \r
+C9 0C CA 0D 1C 42 BE 1D 1D 42 C0 1D 1E 42 BA 1D \r
+1F 42 BC 1D B0 13 3A A0 1C 42 16 FA 1C 82 14 FA \r
+B0 13 56 A0 81 4C 00 00 81 4D 02 00 2C 41 1D 41 \r
+02 00 B0 13 6A A0 3E 40 F4 FD 3F 40 D4 3B B0 13 \r
+10 A0 1C 41 16 00 1D 41 18 00 B0 13 C4 C8 81 4C \r
+04 00 81 4D 06 00 1C 41 04 00 1D 41 06 00 B0 13 \r
+6A A0 2E 41 1F 41 02 00 B0 13 40 C2 81 4C 0C 00 \r
+81 4D 0E 00 1C 41 0C 00 1D 41 0E 00 B0 13 76 DE \r
+81 4C 10 00 1C 41 10 00 31 50 1A 00 55 16 10 01 \r
+B0 13 40 C2 CE 0C CF 0D 0C 43 3D 40 80 3F B0 13 \r
+90 A0 10 01 1C 41 16 00 1D 41 18 00 1E 41 0C 00 \r
+1F 41 0E 00 B0 13 C4 B0 10 01 B0 13 90 A0 CC 09 \r
+CD 0A B0 13 C4 C8 C9 0C CA 0D 10 01 B0 13 56 A0 \r
+C9 0C CA 0D 10 01 B0 13 78 A0 B0 13 40 C2 10 01 \r
+B0 13 78 A0 B0 13 CA B0 10 01 3E 40 E7 6F 3F 40 \r
+63 3B B0 13 40 C2 10 01 B0 13 0A E5 CE 0C CF 0D \r
+CC 09 CD 0A 10 01 1C 41 16 00 1D 41 18 00 10 01 \r
+B0 13 C4 B0 CE 0C CF 0D 10 01 4A 14 31 82 B0 13 \r
+B2 F3 C8 0C CF 08 3F 50 FF 7F 81 4F 06 00 91 41 \r
+06 00 04 00 82 43 A8 1E 4A 43 49 43 4C 49 B0 13 \r
+0C A3 1F 4C 18 00 1F 83 1D 24 1F 83 14 24 D2 B3 \r
+36 1F 47 24 1E 42 B0 1E 1F 42 B2 1E 3E F3 3F F0 \r
+FF 00 1F 9C 02 00 3D 20 2E 9C 3B 20 D2 C3 36 1F \r
+82 43 A8 1E 36 3C 5A 53 B0 13 50 DB 4C 93 31 24 \r
+C7 09 2F 3C B0 13 FA F0 C6 0C CC 09 B0 13 CC DF \r
+4C 93 0C 20 CC 09 CD 06 CE 08 B0 13 58 B5 1F 42 \r
+A6 1E AF 93 18 00 09 20 5A 53 07 3C 82 43 A8 1E \r
+E2 B2 36 1F 02 20 B0 13 A8 E5 1F 42 A6 1E 9F 93 \r
+18 00 0F 20 CF 01 3F 50 03 00 81 4F 00 00 CC 06 \r
+CD 01 3D 50 06 00 CE 01 2E 52 CF 01 2F 53 B0 13 \r
+08 DA 59 53 AB 27 4A 93 50 24 92 93 A8 1E 18 38 \r
+4C 47 B0 13 0C A3 CC 07 B0 13 8A C1 4C 93 10 24 \r
+5A 83 CF 01 3F 50 03 00 81 4F 00 00 7C 42 CD 01 \r
+3D 50 06 00 CE 01 2E 52 CF 01 2F 53 B0 13 08 DA \r
+4A 93 33 24 1F 42 A4 1E 0F 88 1F 93 2C 34 E2 B2 \r
+36 1F 0D 20 E2 D2 36 1F C2 93 AD 1E 04 20 B2 50 \r
+E0 7F A4 1E 20 3C B2 50 C0 53 A4 1E 1C 3C E2 C2 \r
+36 1F C2 93 AD 1E 03 24 3F 40 40 6C 02 3C 3F 40 \r
+20 00 82 5F A4 1E 49 43 4C 49 B0 13 0C A3 AC 93 \r
+18 00 07 20 CC 09 B0 13 F2 E9 4C 93 02 20 5A 83 \r
+04 24 59 53 F1 27 4A 93 0E 20 F2 F0 F9 00 36 1F \r
+91 91 06 00 04 00 02 24 0E 43 08 3C B0 13 58 F4 \r
+A2 43 FC 1E 70 3C E2 D3 36 1F 1E 43 1F 41 06 00 \r
+0F 88 0F 93 54 38 0E 93 3C 24 E2 B2 36 1F 16 20 \r
+1F 41 06 00 1F 82 A4 1E 3F 80 42 00 0F 93 31 38 \r
+F2 40 07 00 FA 1E C2 43 FB 1E F2 D0 18 00 36 1F \r
+92 42 A4 1E F6 1E A2 43 FC 1E 4B 3C 1F 41 06 00 \r
+0F 88 3F 80 42 00 1F 93 1C 38 F2 40 07 00 FA 1E \r
+C2 43 FB 1E F2 D0 18 00 36 1F 1F 41 06 00 1F 82 \r
+A4 1E 3F 80 42 00 0F 93 05 34 1F 41 06 00 3F 80 \r
+42 00 02 3C 1F 42 A4 1E 82 4F F6 1E 92 43 FC 1E \r
+28 3C D2 41 02 00 FA 1E D2 41 03 00 FB 1E 5F 42 \r
+36 1F 7F C2 7F D0 10 00 C2 4F 36 1F 92 41 06 00 \r
+F6 1E 92 41 04 00 F8 1E 82 43 FC 1E 12 3C D2 91 \r
+02 00 FA 1E 09 24 D2 41 02 00 FA 1E D2 41 03 00 \r
+FB 1E F2 D0 10 00 36 1F 92 41 04 00 F6 1E 92 43 \r
+FC 1E D2 C3 36 1F 31 52 46 16 10 01 3D 40 1C 00 \r
+B0 13 1A F2 1C 52 7A FA 82 4C A6 1E 10 01 6A 14 \r
+31 80 20 00 C8 0F C9 0D CA 0E 81 43 0C 00 81 43 \r
+0E 00 B0 13 0A E5 81 4C 14 00 81 4D 16 00 CC 09 \r
+CD 0A B0 13 DA E6 0E 43 3F 40 C8 42 B0 13 C4 C8 \r
+81 4C 18 00 81 4D 1A 00 CC 08 B0 13 E8 ED 0E 43 \r
+3F 40 20 41 B0 13 C4 C8 81 4C 1C 00 81 4D 1E 00 \r
+1C 41 14 00 1D 41 16 00 3E 40 F4 FD 3F 40 D4 3B \r
+B0 13 40 C2 1E 41 1C 00 1F 41 1E 00 B0 13 CA B0 \r
+81 4C 10 00 81 4D 12 00 1C 41 10 00 1D 41 12 00 \r
+3E 40 E7 6F 3F 40 63 3B B0 13 40 C2 CE 0C CF 0D \r
+1C 41 14 00 1D 41 16 00 B0 13 C4 C8 81 4C 08 00 \r
+81 4D 0A 00 36 40 10 00 37 40 14 FA 0A 43 2C 47 \r
+B0 13 C4 A4 CE 08 CF 09 B0 13 36 DC 0C 93 08 38 \r
+81 48 0C 00 81 49 0E 00 27 53 1A 53 16 83 EF 23 \r
+4A 4A 5A 02 1C 4A 34 FA B0 13 E8 ED C6 0C C7 0D \r
+1C 4A 14 FA B0 13 C4 A4 B0 13 E8 A4 C4 0C C5 0D \r
+1C 41 08 00 1D 41 0A 00 CE 08 CF 09 B0 13 C4 B0 \r
+3E 40 82 A8 3F 40 7B 38 B0 13 40 C2 CE 0C CF 0D \r
+0C 43 3D 40 80 3F B0 13 D6 A4 C4 0C C5 0D 1C 4A \r
+36 FA B0 13 E8 ED CE 06 CF 07 B0 13 D6 A4 C5 0C \r
+CA 0D CC 08 CD 09 B0 13 E8 A4 CE 0C CF 0D CC 05 \r
+CD 0A B0 13 C4 C8 CE 06 CF 07 B0 13 CA B0 81 4C \r
+04 00 81 4D 06 00 1C 41 18 00 1D 41 1A 00 1E 41 \r
+04 00 1F 41 06 00 B0 13 C4 C8 81 4C 00 00 81 4D \r
+02 00 38 40 11 00 3A 40 BA 1D 39 40 36 FA 3C 49 \r
+B0 13 E8 ED 2E 41 1F 41 02 00 B0 13 40 C2 2A 52 \r
+8A 4C FC FF 8A 4D FE FF 18 83 F1 23 31 50 20 00 \r
+64 16 10 01 B0 13 0A E5 C8 0C C9 0D 1C 41 0C 00 \r
+1D 41 0E 00 10 01 B0 13 C4 B0 CE 0C CF 0D CC 04 \r
+CD 05 B0 13 40 C2 10 01 1E 41 10 00 1F 41 12 00 \r
+B0 13 C4 B0 10 01 4F 14 5D 42 1B 02 B2 B0 20 00 \r
+D8 1E D4 20 B2 B0 40 00 D8 1E D0 20 82 43 D8 1E \r
+5E 42 1D 02 4E FD 4B 43 B0 13 12 F4 4C 93 62 20 \r
+7E B0 1F 00 0F 24 32 C2 03 43 C2 43 1B 02 32 D2 \r
+3C 40 A3 00 B0 13 5A DA 92 42 96 1E 9A 1E 92 42 \r
+98 1E 9C 1E 6E B2 39 20 6E B3 22 20 7E B0 10 00 \r
+17 20 5E B3 0E 20 7E B2 6C 24 F2 B2 01 02 69 24 \r
+D2 43 DD 1E C2 43 DC 1E F2 D2 03 02 F2 D2 05 02 \r
+60 3C D2 B3 01 02 5D 24 B2 D2 D8 1E 5B 43 59 3C \r
+F2 B0 10 00 01 02 55 24 A2 D2 D8 1E 5B 43 51 3C \r
+E2 B3 01 02 0B 20 E2 B3 19 02 4B 24 A2 D3 D8 1E \r
+B2 F0 FF FE D8 1E E2 C3 19 02 43 3C A2 D3 D8 1E \r
+B2 F0 FF FE D8 1E 5B 43 3C 3C E2 B2 01 02 0B 20 \r
+E2 B2 19 02 36 24 92 D3 D8 1E B2 F0 7F FF D8 1E \r
+E2 C2 19 02 2E 3C 92 D3 D8 1E B2 F0 7F FF D8 1E \r
+5B 43 27 3C D2 53 E0 1E 5F 42 E0 1E 5F 83 7F 90 \r
+07 00 05 28 F2 F0 0F 00 7A 1D C2 43 E0 1E 6E B2 \r
+13 20 6E B3 0D 20 7E B0 10 00 06 20 5E B3 11 24 \r
+F2 D0 20 00 78 1D 0D 3C F2 D0 30 00 7A 1D 07 3C \r
+F2 D0 20 00 7A 1D 03 3C F2 D0 10 00 7A 1D F2 D2 \r
+78 1D A2 B3 D8 1E 03 24 B2 B2 D8 1E 0D 20 4B 93 \r
+0D 24 B2 B0 10 00 86 1E 02 20 B0 13 80 DC 3C 40 \r
+00 20 B0 13 5A DA 02 3C 82 43 D8 1E 7E B0 20 00 \r
+02 24 A2 D2 88 1E 7E B0 40 00 02 24 A2 D3 88 1E \r
+92 B3 D8 1E 03 20 A2 B3 D8 1E 18 24 3C 40 66 06 \r
+B0 13 5A DA E2 B2 01 02 07 24 E2 D2 19 02 92 C3 \r
+D8 1E B2 D0 80 00 D8 1E E2 B3 01 02 07 24 E2 D3 \r
+19 02 A2 C3 D8 1E B2 D0 00 01 D8 1E 32 C2 03 43 \r
+C2 43 1D 02 C2 4D 1B 02 32 D2 B1 C0 F0 00 14 00 \r
+4B 16 00 13 4F 14 B2 F0 EF FF 42 03 92 C3 42 03 \r
+B2 80 00 80 52 03 B2 D0 10 00 42 03 B0 13 E8 D5 \r
+B2 D0 10 00 14 1D B0 13 06 F4 4C 93 C7 20 B0 13 \r
+12 F4 4C 93 11 24 B2 90 03 00 72 1D 0D 20 C2 93 \r
+76 1D 08 20 7C 40 5A 00 3D 40 00 F9 5E 43 B0 13 \r
+D6 BC 02 3C D2 83 76 1D E2 93 9E 1E 02 28 92 D3 \r
+88 1E B0 13 B6 F4 4C 93 02 24 B2 D2 88 1E B0 13 \r
+F0 F4 4C 93 02 24 A2 D3 88 1E B0 13 FA F3 4C 93 \r
+02 24 B0 13 72 EE B2 B0 20 00 86 1E 10 24 5E 42 \r
+2A 1F CF 0E 5F 83 C2 4F 2A 1F 4E 93 08 20 92 D3 \r
+8A 1E B2 D0 20 00 8A 1E F2 40 0F 00 2A 1F 82 93 \r
+8A 1E 0F 24 92 B3 8A 1E 08 20 A2 B2 8A 1E 09 24 \r
+A2 C2 8A 1E 92 D3 14 1D 04 3C 92 C3 8A 1E A2 D3 \r
+8A 1E A2 B3 86 1E 0E 24 1F 42 96 1E 1E 42 98 1E \r
+1F 82 9A 1E 1E 72 9C 1E 03 20 3F 90 1F 00 02 28 \r
+92 D3 86 1E D2 93 DD 1E 0E 20 E2 92 DC 1E 03 2C \r
+D2 53 DC 1E 08 3C F2 C2 03 02 F2 C2 05 02 C2 43 \r
+DC 1E C2 43 DD 1E E2 B3 01 02 03 24 D2 B3 01 02 \r
+2F 20 C2 43 1C 1F E2 B2 01 02 11 24 D2 53 DA 1E \r
+F2 90 03 00 DA 1E 0D 28 B2 D0 20 00 D8 1E B2 F0 \r
+7F FF D8 1E C2 43 DA 1E E2 C2 19 02 02 3C C2 43 \r
+DA 1E E2 B3 01 02 11 24 D2 53 DB 1E F2 90 03 00 \r
+DB 1E 2C 28 B2 D0 40 00 D8 1E B2 F0 FF FE D8 1E \r
+C2 43 DB 1E E2 C3 19 02 21 3C C2 43 DB 1E 1E 3C \r
+D2 53 1C 1F 5F 42 1C 1F 5F 83 7F 90 03 00 16 28 \r
+1F 42 86 1E 2F C2 2E 42 1E C2 86 1E 0E DF 82 4E \r
+86 1E 92 D3 8A 1E A2 B2 86 1E 04 20 B2 D0 10 00 \r
+8A 1E 02 3C B2 D2 8A 1E C2 43 1C 1F B1 C0 D0 00 \r
+14 00 4B 16 00 13 3C 40 01 1E 0D 43 3E 40 21 00 \r
+B0 13 CC F2 7C 40 30 00 B0 13 EA CF 7C 40 30 00 \r
+B0 13 30 DE 4C 93 AF 20 7C 40 31 00 B0 13 30 DE \r
+7C 90 06 00 A5 20 7C 40 36 00 B0 13 EA CF B0 13 \r
+0C AA FD 23 B2 40 01 02 34 0F 0F 42 32 C2 03 43 \r
+B2 B0 10 00 02 0F FC 27 B2 40 51 7E 10 0F B2 B0 \r
+10 00 02 0F FC 27 F2 40 3D 00 11 0F B2 B0 10 00 \r
+02 0F FC 27 F2 40 FE 00 11 0F B2 B0 20 00 02 0F \r
+FC 27 C2 43 10 0F B2 B0 80 00 02 0F FC 27 F2 90 \r
+51 00 20 0F 72 20 B2 B0 10 00 02 0F FC 27 F2 40 \r
+3D 00 11 0F 02 4F 3B 40 56 F9 4E 43 6C 4B 4F 4E \r
+5F 02 5D 4F 57 F9 B0 13 DC E5 2B 53 5E 53 7E 90 \r
+20 00 F4 2B 3D 40 56 F9 4E 43 6C 4D B0 13 30 DE \r
+4F 4E 5F 02 CF 9C 57 F9 4D 20 2D 53 5E 53 7E 90 \r
+20 00 F3 2B 7C 40 36 00 B0 13 EA CF B0 13 0C AA \r
+FD 23 7C 40 0C 00 5D 42 94 1E B0 13 DC E5 B0 13 \r
+D6 EF 6C 43 B0 13 14 F1 7C 40 34 00 B0 13 EA CF \r
+A2 B3 30 0F FD 27 3E 40 10 00 7C 40 34 00 B0 13 \r
+30 DE 5C F3 5F 42 22 1E 4F 5F 4C DF C2 4C 22 1E \r
+1E 83 F3 23 F2 D0 80 00 22 1E B0 13 EC E8 7C 40 \r
+32 00 B0 13 EA CF D2 43 00 1E B2 40 36 00 26 1E \r
+B2 40 E2 04 28 1E 3C 40 01 1E 0D 43 3E 40 1F 00 \r
+B0 13 CC F2 3C 40 20 1E 0D 43 2E 43 B0 13 CC F2 \r
+32 D2 10 01 32 C2 03 43 FF 3F 32 C2 03 43 FF 3F \r
+32 C2 03 43 FF 3F 32 C2 03 43 FF 3F 7C 40 3D 00 \r
+B0 13 EA CF 7C B0 F0 FF 10 01 C2 43 9E 1D 5F 42 \r
+7A 1D 2F 83 AA 24 1F 83 50 24 1F 83 33 24 1F 83 \r
+16 24 1F 83 06 24 1F 83 A5 20 F2 D0 20 00 78 1D \r
+10 01 7C 40 40 00 B0 13 0E E0 5C 53 7C 90 4F 00 \r
+FA 2B B2 40 00 80 90 1C E2 C3 8C 1C 10 01 E2 43 \r
+7A 1D 3C 40 A4 1D 4D 43 4E 4D 5E 02 5F 4E 7B 1D \r
+47 18 0F 5F 5E 4E 7C 1D 0E 5F 2C 53 8C 4E FE FF \r
+5D 53 7D 90 09 00 F0 2B E2 43 9F 1D F2 40 09 00 \r
+9E 1D 10 01 E2 43 7A 1D 5E 42 7B 1D 47 18 0E 5E \r
+5F 42 7C 1D 0E 5F 82 4E A0 1D 5F 42 7D 1D 47 18 \r
+0F 5F 5D 42 7E 1D 0F 5D 82 4F A2 1D D2 43 9F 1D \r
+4F 8E 5F 53 C2 4F 9E 1D 10 01 3E 40 BF FF 1E F2 \r
+86 1E 5F 42 7B 1D 5F 03 3F F0 C0 FF 0E DF 82 4E \r
+86 1E 3F 40 7F 00 5F F2 7B 1D C2 4F A0 1E D2 42 \r
+7C 1D A1 1E D2 42 7D 1D A2 1E 5F 42 7E 1D 47 18 \r
+0F 5F 5E 42 7F 1D 0E 5F 82 4E 34 1F D2 42 80 1D \r
+32 1F D2 42 81 1D 31 1F 5F 42 84 1D 47 18 0F 5F \r
+5E 42 85 1D 0E 5F CF 0E 1F 52 80 1E 1F 82 7E 1E \r
+82 4F 80 1E 82 4E 7E 1E 5F 42 86 1D 47 18 0F 5F \r
+5C 42 87 1D 0C 5F 82 4C 82 1E 1D 42 78 1E 1E 42 \r
+7A 1E 1F 42 7C 1E B0 13 1E A3 D2 42 88 1D 8D 1C \r
+D2 42 89 1D 8E 1C 7C 40 5A 00 3D 40 EA F8 5E 43 \r
+B0 13 D6 BC D2 43 76 1D 10 01 F2 40 03 00 7A 1D \r
+D2 43 9E 1D 10 01 1A 14 CA 0C 6D 93 3A 24 5D 93 \r
+0E 24 6D 92 5C 20 B0 13 BE AC 6D 42 B0 13 30 F0 \r
+C2 43 9F 1E 4C 43 4D 43 B0 13 30 F0 50 3C C2 93 \r
+9F 1E 18 20 B2 B0 40 00 86 1E 07 20 B0 13 52 AC \r
+5A 93 05 20 B0 13 8A F0 02 3C B0 13 66 AC B0 13 \r
+98 AC C9 0C 5C 42 A1 1E B0 13 74 AC B0 13 BE AC \r
+6D 43 E2 3F B0 13 B0 AC C9 0C 5C 42 A2 1E B0 13 \r
+74 AC 7D 40 1F 00 7E 40 29 00 B0 13 42 F4 5D 43 \r
+D3 3F 5F 42 9E 1E 4F 93 22 24 C2 93 9F 1E 18 20 \r
+4F 4F 2F 83 0D 24 1F 83 1A 20 B2 B0 40 00 86 1E \r
+05 20 B0 13 52 AC B0 13 8A F0 02 3C B0 13 66 AC \r
+B0 13 98 AC CA 0C 5C 42 A1 1E B0 13 8A AC 07 3C \r
+B0 13 B0 AC CA 0C 5C 42 A2 1E B0 13 8A AC 19 16 \r
+10 01 B0 13 50 EE CF 0C CC 0A B0 13 A0 AC 4C 4F \r
+B0 13 7C AC 10 01 B0 13 A0 AC 5C 42 A0 1E B0 13 \r
+7C AC 10 01 B0 13 7C AC CC 0A 10 01 B0 13 CC AC \r
+CC 09 5E 43 B0 13 D6 BC 10 01 B0 13 CC AC CC 0A \r
+5E 43 B0 13 D6 BC 10 01 CC 0A B0 13 B0 AC 10 01 \r
+7D 40 4A 00 7E 40 60 00 B0 13 42 F4 C9 0C 10 01 \r
+7D 40 48 00 7E 40 5E 00 B0 13 42 F4 10 01 7D 40 \r
+1E 00 7E 40 28 00 B0 13 42 F4 10 01 0D 43 6E 43 \r
+4F 43 B0 13 D2 C0 CD 0C 10 01 0A 14 31 82 92 B3 \r
+14 1D 0F 20 A2 B2 14 1D 0C 20 3F 40 0C 00 1F 52 \r
+40 1F 6F 13 4C 93 0C 24 5C 43 6D 43 80 13 8C 1E \r
+07 3C 5C 43 B0 13 44 D6 5C 43 5D 43 80 13 8C 1E \r
+A2 B3 8A 1E 1B 20 92 B3 14 1D 12 20 B2 B2 14 1D \r
+0F 20 3F 40 0C 00 1F 52 42 1F 6F 13 4C 93 61 24 \r
+82 93 8A 1E 5E 20 6C 43 6D 43 80 13 90 1E 59 3C \r
+6C 43 B0 13 44 D6 6C 43 5D 43 F7 3F 6A 43 B2 B2 \r
+8A 1E 2E 20 B2 B0 10 00 8A 1E 26 20 B2 B0 20 00 \r
+8A 1E 1E 20 B2 B0 00 01 8A 1E 14 20 5A 43 B2 B0 \r
+40 00 8A 1E 0B 20 B2 B0 80 00 8A 1E 20 24 CC 01 \r
+3D 40 2A F9 2E 42 B0 13 BA F2 19 3C CC 01 3D 40 \r
+30 F9 F8 3F CC 01 3D 40 36 F9 3E 40 06 00 F3 3F \r
+CC 01 3D 40 3E F9 F9 3F CC 01 3D 40 46 F9 F5 3F \r
+CC 01 3D 40 4E F9 3E 40 06 00 B0 13 BA F2 CC 0A \r
+B0 13 44 D6 CC 0A 6D 42 80 13 90 1E 6A 93 07 24 \r
+7C 40 46 00 CD 01 5E 43 B0 13 D6 BC 06 3C 7C 40 \r
+5A 00 CD 01 5E 43 B0 13 D6 BC 82 43 8A 1E A2 D2 \r
+8A 1E 92 B3 14 1D 10 24 B0 13 FA F3 6C 93 0C 20 \r
+7C 40 17 00 B0 13 22 AE 7C 40 18 00 B0 13 22 AE \r
+7C 40 19 00 B0 13 22 AE 82 43 14 1D 31 52 0A 16 \r
+10 01 7D 40 03 00 B0 13 30 F0 10 01 1A 14 31 80 \r
+16 00 B0 13 88 E2 CA 0C 0A 93 03 20 3C 40 03 00 \r
+97 3C 5C 43 CD 0A B0 13 AA BD 4C 93 04 20 CC 0A \r
+B0 13 FC F4 F3 3F B0 13 02 F5 CD 0C C9 01 39 52 \r
+CC 09 2E 42 B0 13 BA F2 81 49 00 00 CF 01 3F 50 \r
+0C 00 81 4F 02 00 F1 40 09 00 04 00 E1 43 05 00 \r
+CD 01 3D 50 0E 00 3C 40 CE 1E B0 13 DE F0 D1 4A \r
+09 00 12 00 D1 42 D7 1E 0D 00 B0 13 22 F5 C1 4C \r
+13 00 D1 43 0C 00 B0 13 26 F5 C1 4C 14 00 2C 43 \r
+3D 40 03 00 CE 01 B0 13 F6 C2 0C 93 59 20 B0 13 \r
+EA F4 C9 0C E1 43 05 00 CF 01 3F 50 0C 00 81 4F \r
+02 00 CF 0A 3F 50 03 00 81 4F 00 00 79 90 03 00 \r
+06 24 59 93 02 20 B0 13 2E EE B0 13 18 EF B0 13 \r
+74 E5 79 90 03 00 07 24 59 93 03 24 B0 13 F8 EE \r
+02 3C B0 13 58 ED 2C 43 2D 43 CE 01 B0 13 F6 C2 \r
+0C 93 05 24 CC 0A B0 13 FC F4 1C 43 29 3C 3F 40 \r
+7F 00 5F F1 0C 00 5F 93 09 24 7F 90 03 00 06 24 \r
+CC 0A B0 13 FC F4 3C 40 05 00 1A 3C EA 43 00 00 \r
+DA 41 0E 00 0A 00 D2 4A 0B 00 FF 1D F1 90 40 00 \r
+0F 00 02 20 5F 43 02 3C 7F 40 03 00 CA 4F 01 00 \r
+D2 53 D7 1E C2 93 D7 1E 02 20 D2 43 D7 1E 0C 43 \r
+31 50 16 00 19 16 10 01 3A 14 31 82 C9 0C F9 90 \r
+14 00 00 00 05 28 B0 13 26 F5 C9 9C 14 00 74 20 \r
+3C 40 0E 00 0C 59 CD 01 B0 13 1E F4 91 92 D0 1E \r
+02 00 6A 20 91 92 CE 1E 00 00 66 20 58 49 12 00 \r
+3A 40 05 00 0A 59 3C 40 05 00 0C 59 CD 08 B0 13 \r
+7C E3 0C 93 48 20 C2 93 D2 1E 56 24 B0 13 88 E2 \r
+C7 0C 07 93 51 24 3C 40 03 00 0C 57 CD 0A 2E 42 \r
+B0 13 BA F2 6C 43 CD 07 B0 13 AA BD 4C 93 03 24 \r
+D2 93 D6 1E 04 20 CC 07 B0 13 FC F4 3D 3C 5F 42 \r
+D6 1E CE 0F 5E 53 C2 4E D6 1E 4F 4F DF 47 0B 00 \r
+D4 1E C7 48 0A 00 E7 43 00 00 F9 90 40 00 13 00 \r
+02 20 5F 43 02 3C 7F 40 03 00 C7 4F 01 00 D1 47 \r
+09 00 06 00 B0 13 22 F5 C1 4C 07 00 B0 13 A8 B0 \r
+B0 13 96 B0 CD 01 B0 13 B6 B0 D5 27 B0 13 7E B0 \r
+0C 93 12 24 D0 3F B0 13 A8 B0 D1 4C 09 00 06 00 \r
+B0 13 22 F5 C1 4C 07 00 B0 13 96 B0 CD 01 B0 13 \r
+B6 B0 02 24 B0 13 7E B0 31 52 37 16 10 01 3C 40 \r
+03 00 0C 59 CD 0A 2E 42 B0 13 BA F2 CC 09 4D 43 \r
+B0 13 30 E8 10 01 3E 40 07 00 5E F9 0A 00 3F 40 \r
+03 00 4F 8E 6C 43 10 01 F1 40 81 00 08 00 D1 49 \r
+0D 00 09 00 10 01 2D 52 6E 42 B0 13 6A CA C9 0C \r
+09 93 10 01 3B 40 80 00 01 3C 0B 43 0A 14 09 14 \r
+08 14 07 14 21 83 3F B0 80 7F 7B 24 3D B0 80 7F \r
+05 20 0C 4E 0D 4F 8B 10 0D EB 73 3C 5D 02 08 4D \r
+4D 10 38 F0 00 FF 0D D8 5F 02 08 4F 4F 10 38 F0 \r
+00 FF 0F D8 09 4C 0A 4D 3D F0 80 00 C1 4D 00 00 \r
+0B EA 0B EF 3B C0 7F FF 3A D0 80 00 3F D0 80 00 \r
+0A 9F 02 20 09 9E 0A 24 0B 2C 0D 4F 0F 4A 0A 4D \r
+0C 4E 0E 49 09 4C 81 EB 00 00 02 3C 0B 93 4F 20 \r
+0C 43 08 4A 88 10 47 48 8F 10 48 8F 8F 10 0E 24 \r
+38 90 19 00 34 2C 12 C3 4F 10 5E 00 5C 00 3C B0 \r
+00 10 02 24 3C D0 00 20 18 83 F5 23 0B 93 0C 24 \r
+08 8C 09 7E 4A 7F 0C 48 4A 93 12 30 5C 02 09 69 \r
+4A 6A 17 83 2C 24 F8 3F 09 5E 4A 6F 09 28 4A 10 \r
+59 00 5C 00 3C B0 00 10 02 24 3C D0 00 20 17 53 \r
+3C B0 00 80 07 24 09 63 4A 63 07 63 3C B0 00 60 \r
+01 20 19 C3 17 93 13 38 37 90 FF 00 13 34 7A C0 \r
+80 00 87 10 D1 51 00 00 00 00 57 00 0A D7 0C 49 \r
+0D 4A 21 53 07 16 08 16 09 16 0A 16 10 01 0D 43 \r
+0C 43 F7 3F 3D 40 FF FE D1 61 00 00 00 00 5D 00 \r
+3C 43 EF 3F 0A 14 B0 13 14 F3 B0 13 F4 E3 7C 40 \r
+0A 00 B0 13 CC F4 7C 40 06 00 B0 13 D2 F4 82 43 \r
+BE 1E 82 43 C0 1E 7C 40 05 00 B0 13 A6 F4 7C 40 \r
+0C 00 5D 42 94 1E B0 13 2C E4 92 43 BA 1E 7C 40 \r
+17 00 6D 43 B0 13 10 B3 6D 43 B0 13 1A B3 6D 43 \r
+B0 13 30 F0 4C 43 B0 13 10 ED 0C 93 2A 20 4C 43 \r
+1D 42 BE 1E 1E 42 C0 1E B0 13 52 E1 4C 43 B0 13 \r
+52 D7 7A 40 28 00 04 3C 3C 40 99 19 B0 13 5A DA \r
+4C 43 B0 13 10 ED 2C 93 04 20 CF 0A 5A 83 4F 93 \r
+F3 23 4A 93 0E 20 7C 40 46 00 3D 40 0E F9 5E 43 \r
+B0 13 D6 BC 2E 42 3C 40 00 40 B0 13 5A DA 1E 83 \r
+FA 23 4C 43 B0 13 10 ED 1C 93 0D 24 7C 40 17 00 \r
+6D 42 B0 13 10 B3 6D 42 B0 13 1A B3 6D 42 B0 13 \r
+30 F0 4C 43 23 3C A2 43 BA 1E 82 93 C0 1E 0A 20 \r
+82 93 BE 1E 07 20 4C 43 B0 13 C8 E9 82 4C BE 1E \r
+82 4D C0 1E 7C 40 17 00 7D 40 03 00 B0 13 10 B3 \r
+7D 40 03 00 B0 13 1A B3 7D 40 03 00 B0 13 30 F0 \r
+7C 40 13 00 6D 43 B0 13 30 F0 5C 43 0A 16 10 01 \r
+B0 13 30 F0 7C 40 18 00 10 01 B0 13 30 F0 7C 40 \r
+19 00 10 01 1D 42 90 1C 3D 80 00 80 1D C3 5F 42 \r
+7A 1D 2F 83 03 24 1F 83 2D 24 10 01 D2 93 9F 1D \r
+15 24 E2 93 9F 1D 6A 20 5C 02 1F 4C A4 1D B0 13 \r
+34 B4 5F 0E 3F 80 00 80 82 4F B8 1D 3E 40 7D 1D \r
+7F 40 03 00 B0 13 1E B4 FD 2B 10 01 1F 42 A0 1D \r
+0F 5C B0 13 34 B4 1C 52 A0 1D 5C 0E 3C 80 00 80 \r
+82 4C B8 1D 3E 40 7D 1D 7F 40 03 00 B0 13 1E B4 \r
+FD 2B 10 01 1F 42 86 1E 7F F0 C0 00 4F 5F 3E 40 \r
+7F 00 5E F2 A0 1E 4E DF C2 4E 7B 1D D2 42 A1 1E \r
+7C 1D D2 42 A2 1E 7D 1D 1E 42 34 1F CF 0E 8F 10 \r
+C2 4F 7E 1D C2 4E 7F 1D D2 42 32 1F 80 1D D2 42 \r
+31 1F 81 1D C2 43 82 1D C2 43 83 1D 1E 42 7E 1E \r
+CF 0E 8F 10 8F 11 C2 4F 84 1D C2 4E 85 1D 1E 42 \r
+82 1E CF 0E 8F 10 8F 11 C2 4F 86 1D C2 4E 87 1D \r
+D2 42 8D 1C 88 1D D2 42 8E 1C 89 1D CF 0D 8F 10 \r
+C2 4F 8A 1D C2 4D 8B 1D C2 43 8C 1D 10 01 1E 53 \r
+1D 42 B8 1D EE 4D FF FF 92 53 B8 1D 5F 53 7F 90 \r
+13 00 10 01 CE 0F 8E 10 C2 4E 7B 1D C2 4F 7C 1D \r
+10 01 A2 D3 86 1E 82 93 D8 1E 03 24 A2 B2 86 1E \r
+68 20 B2 B0 20 00 D8 1E 5B 20 B2 B0 40 00 D8 1E \r
+4B 20 82 93 D8 1E 69 24 92 B3 D8 1E 32 20 A2 B3 \r
+D8 1E 1A 20 A2 B2 D8 1E 0D 20 B2 B2 D8 1E 5D 24 \r
+1F 42 42 1F 0F 0F 6C 43 4F 13 B2 D2 14 1D B2 C2 \r
+D8 1E 53 3C 1F 42 40 1F 0F 0F 5C 43 4F 13 A2 D2 \r
+14 1D A2 C2 D8 1E 49 3C C2 43 EB 1E 6C 43 6D 42 \r
+80 13 90 1E 1F 42 42 1F 1F 4F 10 00 82 4F 42 1F \r
+00 18 D2 4F 08 00 90 1E B2 D2 14 1D A2 C3 D8 1E \r
+34 3C 5C 43 6D 42 80 13 8C 1E 1F 42 40 1F 1F 4F \r
+10 00 82 4F 40 1F 00 18 D2 4F 08 00 8C 1E A2 D2 \r
+14 1D 92 C3 D8 1E 21 3C B2 F0 BF FF D8 1E 1F 42 \r
+42 1F 3F 0F 04 00 6C 43 4F 13 92 D3 14 1D 15 3C \r
+B2 F0 DF FF D8 1E 1F 42 40 1F 3F 0F 04 00 5C 43 \r
+F3 3F E2 B3 01 02 03 24 D2 B3 01 02 04 20 92 D3 \r
+8A 1E B2 D2 8A 1E 82 43 D8 1E 82 93 86 1E 09 24 \r
+92 B3 86 1E 06 24 92 C3 86 1E B0 13 D6 F3 92 D3 \r
+14 1D A2 C3 86 1E 10 01 1A 14 C9 0C 1A 42 A6 1E \r
+4D 4D 1D 5A 0C 00 0D 8E 3D 80 13 00 0D 93 78 34 \r
+3E 40 1A 00 1E 52 A6 1E 6F 4E 3F F0 03 00 1F 83 \r
+4F 24 1F 83 2C 20 CA 43 12 00 2F 42 6F BE 1A 20 \r
+1C 42 A6 1E D2 9C 11 00 AA 1E 09 2C C2 93 AC 1E \r
+03 20 B0 13 AA D7 09 3C 8C 43 18 00 06 3C B0 13 \r
+8C D5 1F 42 A6 1E DF 53 11 00 CC 09 5D 43 B0 13 \r
+92 E0 4E 3C EE C2 00 00 1F 42 A6 1E 8F 43 00 00 \r
+8F 43 02 00 1C 42 A6 1E B0 13 AA D7 41 3C 3C 40 \r
+80 00 5C 8A 13 00 CF 0A 2D 4F 1E 4F 02 00 3F 40 \r
+00 02 B0 13 14 DD 1C 5A 0C 00 3C 50 00 02 8A 4C \r
+0C 00 1F 42 A6 1E CF 43 0F 00 3F 40 1A 00 1F 52 \r
+A6 1E 3E 40 FC 00 6E FF 5E D3 CF 4E 00 00 20 3C \r
+3C 40 40 00 5C 8A 13 00 2D 4A 1E 4A 02 00 3F 40 \r
+80 1C B0 13 14 DD 1F 42 A6 1E 1C 5F 0A 00 3C 50 \r
+00 06 8F 4C 0C 00 1F 42 A6 1E DF 43 0F 00 3F 40 \r
+1A 00 1F 52 A6 1E 6E 4F 5E C3 6E D3 CF 4E 00 00 \r
+19 16 10 01 21 83 4E 4E 1E 83 48 24 1E 83 2C 24 \r
+2E 83 1E 24 2E 82 13 24 3E 82 72 20 D2 B3 8C 1C \r
+6F 24 E2 B3 8C 1C 6C 20 F2 90 65 00 92 1C 68 28 \r
+B0 13 58 EF 4C 93 64 24 B0 13 04 C5 61 3C D2 B3 \r
+8C 1C 5E 24 E2 B3 8C 1C 5B 20 B0 13 44 E9 58 3C \r
+D2 B3 8C 1C 55 20 7C 40 40 00 B0 13 0E E0 5C 53 \r
+7C 90 4F 00 FA 2B 4C 3C D2 B3 8C 1C 14 24 E2 B3 \r
+8C 1C 11 20 D2 B3 92 1C 05 24 81 43 00 00 CC 01 \r
+B0 13 64 B7 B1 40 FE FF 00 00 CC 01 6D 43 B0 13 \r
+44 E9 B0 13 04 C5 D2 C3 8C 1C 32 3C 5F 42 8C 1C \r
+1F F3 5E 42 8C 1C 2E F3 0E DF 0E 93 29 20 C2 43 \r
+92 1C D2 42 8E 1C 8F 1C B1 40 FB FF 00 00 CC 01 \r
+6D 43 B0 13 44 E9 3C 40 8D 1C B0 13 64 B7 3C 40 \r
+8E 1C B0 13 64 B7 3C 40 31 1F B0 13 64 B7 3C 40 \r
+32 1F B0 13 64 B7 3C 40 34 1F 6D 43 B0 13 44 E9 \r
+3C 40 A0 1E 7D 40 03 00 B0 13 44 E9 D2 D3 8C 1C \r
+21 53 10 01 5D 43 B0 13 44 E9 10 01 1A 14 31 80 \r
+18 00 B0 13 EA F4 C9 0C B0 13 02 F5 81 4C 10 00 \r
+CF 01 2F 52 81 4F 12 00 F1 42 14 00 7A 40 03 00 \r
+C1 4A 15 00 CD 01 3D 50 06 00 3C 40 EC 1E B0 13 \r
+DE F0 D1 43 04 00 D1 42 F4 1E 05 00 D1 43 0A 00 \r
+B0 13 26 F5 C1 4C 0B 00 2C 43 3D 40 03 00 CE 01 \r
+3E 50 10 00 B0 13 F6 C2 C1 4A 15 00 CF 01 2F 52 \r
+81 4F 12 00 CF 01 3F 50 0C 00 81 4F 10 00 79 90 \r
+03 00 06 24 59 93 02 20 B0 13 2E EE B0 13 18 EF \r
+B0 13 74 E5 3A 40 06 00 79 90 03 00 07 24 59 93 \r
+03 24 B0 13 F8 EE 02 3C B0 13 58 ED 2C 43 2D 43 \r
+CE 01 3E 50 10 00 B0 13 F6 C2 0C 93 1D 20 3F 40 \r
+7F 00 5F F1 04 00 5F 93 03 24 7F 90 06 00 14 20 \r
+CC 01 CD 01 3D 50 06 00 2E 42 B0 13 BA F2 2C 41 \r
+1D 41 02 00 B0 13 02 F3 CC 01 3C 50 0C 00 B0 13 \r
+2A F4 D2 53 F4 1E 0A 43 CC 0A 31 50 18 00 19 16 \r
+10 01 0A 14 21 83 C1 43 00 00 F2 90 03 00 00 1E \r
+6B 20 7C 40 3B 00 B0 13 30 DE CE 0C 7C 40 3B 00 \r
+B0 13 30 DE 4E 9C F9 23 4E 93 61 24 CC 01 5D 43 \r
+B0 13 70 E7 6F 41 3F 50 03 00 4E 4E 0E 9F 38 20 \r
+F1 90 1F 00 00 00 34 2C F1 90 0B 00 00 00 30 28 \r
+3C 40 01 1E 0D 43 3E 40 1F 00 B0 13 CC F2 E2 41 \r
+01 1E 3C 40 02 1E 6D 41 B0 13 70 E7 3C 40 20 1E \r
+6D 43 B0 13 70 E7 F2 B0 80 FF 21 1E 14 24 92 53 \r
+34 1E 82 63 36 1E B0 13 CE E1 4C 93 30 20 5C 42 \r
+20 1E B0 13 90 E8 C2 4C 20 1E F2 F0 7F 00 21 1E \r
+B0 13 D8 EE 24 3C 92 53 30 1E 82 63 32 1E 1F 3C \r
+92 53 38 1E 82 63 3A 1E 0A 42 32 C2 03 43 7C 40 \r
+36 00 B0 13 EA CF 7C 40 3D 00 B0 13 EA CF 7C B0 \r
+F0 FF F9 23 7C 40 3A 00 B0 13 EA CF 7C 40 34 00 \r
+B0 13 EA CF 02 4A 03 3C 32 C2 03 43 FF 3F 21 53 \r
+0A 16 10 01 21 82 D2 83 8F 1C 66 20 5F 42 8D 1C \r
+5F 93 51 24 6F 93 4C 24 6F 92 3F 24 7F 90 07 00 \r
+2B 24 7F 90 03 00 22 24 7F 90 05 00 12 24 7F 90 \r
+06 00 45 20 1E 42 7E 1E CF 0E 5F 0D C1 4F 00 00 \r
+B0 13 2C BA C1 4E 01 00 C1 4D 02 00 7D 40 03 00 \r
+36 3C D1 42 C2 1E 00 00 1E 42 82 1E CF 0E 8F 10 \r
+8F 11 C1 4F 01 00 C1 4E 02 00 F0 3F D1 42 C2 1E \r
+00 00 1E 42 7E 1E F2 3F D1 42 C2 1E 00 00 1E 42 \r
+7E 1E CF 0E 5F 0D C1 4F 01 00 B0 13 2C BA C1 4E \r
+02 00 C1 4D 03 00 6D 42 12 3C 1E 42 82 1E CF 0E \r
+8F 10 8F 11 C1 4F 00 00 C1 4E 01 00 6D 43 07 3C \r
+1E 42 7E 1E F4 3F D1 42 C2 1E 00 00 5D 43 CC 01 \r
+7E 42 B0 13 64 B6 D2 42 8E 1C 8F 1C 0C 43 4D 43 \r
+7E 40 10 00 B0 13 64 B6 21 52 10 01 1D 42 82 1E \r
+43 18 4E 5E CF 0D 8F 10 8F 11 7F F0 0F 00 4E DF \r
+10 01 0A 14 4A 4D 10 3C B2 B0 40 00 86 1E 06 20 \r
+7C 40 09 00 5D 43 B0 13 30 F0 05 3C 7C 40 0B 00 \r
+5D 43 B0 13 30 F0 2A 43 B0 13 F8 D6 1A 93 EC 27 \r
+2A 93 13 24 2A 92 3A 20 B0 13 EE EA 7C 40 0B 00 \r
+4D 43 B0 13 30 F0 7C 40 09 00 4D 43 B0 13 30 F0 \r
+6C 43 4D 43 B0 13 14 BB 29 3C B2 B0 40 00 86 1E \r
+19 20 B0 13 38 EF 3C 90 10 27 0F 34 0C 93 0F 34 \r
+3C E3 1C 53 B0 13 FC BA 4D 43 B0 13 30 F0 7C 40 \r
+03 00 5D 43 B0 13 30 F0 0B 3C 3C 40 0F 27 B0 13 \r
+F0 BA 06 3C 1C 42 82 1E 0C 93 EA 3B B0 13 F0 BA \r
+7C 40 46 00 CD 0B 5E 43 B0 13 D6 BC 0A 16 10 01 \r
+B0 13 FC BA 5D 43 B0 13 14 BB 10 01 3C B0 00 80 \r
+0D 7D 3D E3 6E 42 7F 40 03 00 B0 13 D2 C0 CB 0C \r
+6C 43 10 01 B0 13 30 F0 7C 40 03 00 4D 43 B0 13 \r
+30 F0 10 01 6A 14 31 80 06 00 C6 0C 09 43 3A 40 \r
+00 1C 7F 40 03 00 81 4F 00 00 2F 46 1F 93 06 24 \r
+0F 93 0B 20 58 46 02 00 C7 09 10 3C 5C 46 02 00 \r
+B0 13 6A EB C7 0C 07 93 02 20 0C 43 4D 3C 58 47 \r
+09 00 3F 40 03 00 0F 57 81 4F 02 00 24 43 0F 42 \r
+32 C2 03 43 1E 43 6E 9A 39 20 EA 42 00 00 02 4F \r
+3F 40 0B 00 0F 5A 6F 4F 3F F0 3F 00 4E 48 0F 9E \r
+2A 20 25 46 15 93 0E 20 78 90 3F 00 06 20 3F 40 \r
+03 00 0F 57 81 4F 04 00 05 3C 3F 40 07 00 0F 5A \r
+81 4F 04 00 1C 41 04 00 1D 41 02 00 2E 42 B0 13 \r
+7C ED 4C 4C 05 93 02 24 0C 93 0D 20 5F 4A 01 00 \r
+2E 41 4F 9E 08 2C 09 93 02 24 D9 43 00 00 81 4F \r
+00 00 C9 0A 04 3C DA 43 00 00 01 3C 02 4F 3A 50 \r
+23 00 14 83 BC 23 CC 09 31 50 06 00 64 16 10 01 \r
+4D 4D 1D 93 14 24 2D 93 31 24 2D 92 5B 20 B0 13 \r
+EE EA 6C 43 4D 43 B0 13 C6 BC 7C 40 0F 00 4D 43 \r
+B0 13 30 F0 7C 40 1F 00 4D 43 80 00 30 F0 B0 13 \r
+F8 D6 7C 40 1F 00 5D 43 B0 13 30 F0 7C 40 0F 00 \r
+5D 43 B0 13 30 F0 B2 B0 40 00 86 1E 08 20 7C 40 \r
+1D 00 7D 40 46 00 5E 43 B0 13 78 CF 07 3C 7C 40 \r
+1D 00 7D 40 43 00 5E 43 B0 13 78 CF B2 B0 40 00 \r
+86 1E 04 20 B0 13 7C F1 CB 0C 02 3C 1B 42 7E 1E \r
+0B 93 05 38 6C 43 5D 43 B0 13 C6 BC 0B 3C 3B E3 \r
+1B 53 6C 43 4D 43 B0 13 30 F0 7C 40 03 00 5D 43 \r
+B0 13 30 F0 CC 0B 3C B0 00 80 0D 7D 3D E3 7E 40 \r
+03 00 5F 43 B0 13 D2 C0 CD 0C 7C 40 49 00 5E 43 \r
+80 00 D6 BC 10 01 B0 13 30 F0 7C 40 03 00 4D 43 \r
+B0 13 30 F0 10 01 4A 14 C9 0E 4C 4C 3C 80 46 00 \r
+53 24 1C 83 4C 24 1C 83 46 24 1C 83 41 24 1C 83 \r
+3B 24 3C 80 10 00 3C 90 09 00 55 2C 5C 06 00 18 \r
+50 4C 04 BD 62 BD 00 00 5C BD 00 00 58 BD 00 00 \r
+4E BD 00 00 46 BD 00 00 42 BD 00 00 3A BD 00 00 \r
+32 BD 00 00 28 BD 00 00 7A 40 03 00 78 40 22 00 \r
+2E 3C 6A 43 78 40 21 00 2A 3C 6A 43 78 40 23 00 \r
+26 3C 6A 42 F7 3F 6A 43 78 40 25 00 20 3C 7A 40 \r
+03 00 78 40 24 00 1B 3C 6A 42 F0 3F 7A 40 05 00 \r
+E5 3F 7A 40 06 00 E6 3F 6A 43 78 40 1A 00 0F 3C \r
+7A 40 03 00 FA 3F 6A 43 78 40 1C 00 08 3C 7A 40 \r
+03 00 78 40 1B 00 03 3C 6A 42 78 40 1A 00 C7 0D \r
+4A 4A 06 43 CC 08 4C 56 7D 47 CE 09 B0 13 78 CF \r
+16 53 1A 83 F7 23 46 16 10 01 4A 14 21 83 C8 0D \r
+C7 0C 39 40 41 1E CC 01 0D 43 1E 43 B0 13 CC F2 \r
+46 43 09 98 25 24 2F 43 6F 99 22 20 5A 49 09 00 \r
+7A 90 3E 00 1D 2C 57 93 13 24 3C 40 03 00 0C 59 \r
+3D 40 03 00 0D 58 2E 42 B0 13 7C ED 0C 93 10 20 \r
+4F 4A CA 01 3A 50 E0 FF 0A 5F DA 43 00 00 08 3C \r
+C2 9A 3E 1E 05 2C 4A 4A CF 01 0F 8A DF 43 3D 00 \r
+39 50 0C 00 56 53 D5 27 CE 01 0F 43 4C 43 CE 93 \r
+00 00 04 24 1E 53 5C 53 FA 27 09 3C 67 93 04 20 \r
+7C 50 20 00 4F 4C 03 3C 3F 40 3D 00 4F 8C 67 93 \r
+0B 24 5E 42 3F 1E 0F 9E 12 38 5E 42 3E 1E 0F 9E \r
+0F 20 D2 83 3E 1E 0C 3C 5E 42 3E 1E 0E 9F 07 38 \r
+5E 42 3F 1E 0E 9F 04 34 C2 4F 3F 1E 01 3C 0F 43 \r
+C8 4F 09 00 CC 0F 21 53 46 16 10 01 0A 14 CA 0C \r
+5D 93 05 24 6D 92 34 20 C2 43 30 1F 31 3C C2 93 \r
+30 1F 1A 20 5C 42 31 1F B0 13 14 BF 03 20 B0 13 \r
+F4 BE 02 3C B0 13 04 BF 5C 42 32 1F B0 13 14 BF \r
+03 20 B0 13 04 BF 02 3C B0 13 F4 BE B0 13 28 BF \r
+5D 43 B0 13 30 F0 14 3C 1C 42 34 1F 0D 43 6E 42 \r
+4F 43 B0 13 D2 C0 CF 0C CC 0A 7D 40 46 00 7E 40 \r
+5C 00 B0 13 38 BF B0 13 28 BF 4D 43 B0 13 30 F0 \r
+0A 16 10 01 CC 0A 7D 40 48 00 7E 40 5E 00 B0 13 \r
+38 BF 10 01 CC 0A 7D 40 4A 00 7E 40 60 00 B0 13 \r
+38 BF 10 01 0D 43 6E 43 4F 43 B0 13 D2 C0 CF 0C \r
+B2 B0 40 00 86 1E 10 01 CC 0A 7D 40 1F 00 7E 40 \r
+29 00 B0 13 42 F4 10 01 B0 13 42 F4 CD 0F 5E 43 \r
+B0 13 D6 BC 10 01 1A 14 CA 0D C9 0C D2 93 00 1E \r
+58 24 B0 13 EC E8 1D 43 6D 59 CC 09 B0 13 10 E6 \r
+49 43 4A 93 37 24 5A 93 32 20 6A 42 16 3C 7C 40 \r
+36 00 B0 13 EA CF 7C 40 3D 00 B0 13 EA CF 7C B0 \r
+F0 FF F9 23 7C 40 3A 00 B0 13 EA CF 4A 93 02 20 \r
+59 43 2B 3C B0 13 48 F1 5A 83 7C 40 34 00 B0 13 \r
+EA CF A2 B3 30 0F FD 27 92 C3 32 0F 7C 40 35 00 \r
+B0 13 EA CF 3C 40 19 00 B0 13 2E F1 92 B3 32 0F \r
+D6 27 92 C3 32 0F 92 B3 30 0F FD 27 0E 3C 32 C2 \r
+03 43 FF 3F 7C 40 35 00 B0 13 EA CF B2 B0 00 02 \r
+32 0F FC 27 B2 F0 FF FD 32 0F 7C 40 3B 00 B0 13 \r
+EA CF F2 90 03 00 00 1E 02 20 B0 13 C2 F1 CC 09 \r
+03 3C 32 C2 03 43 FF 3F 19 16 10 01 B2 40 23 5A \r
+5C 01 B0 13 BA EB F2 40 A5 00 21 01 F2 D0 80 00 \r
+20 01 C2 43 21 01 F2 D0 03 00 4A 02 92 C3 6C 01 \r
+B2 D0 0C 00 6C 01 82 43 66 01 B2 40 44 00 68 01 \r
+32 D0 40 00 82 43 60 01 B2 40 50 00 62 01 B2 40 \r
+6E 11 64 01 32 C0 40 00 1E 14 3D 40 41 D1 0E 43 \r
+1D 83 0E 73 FD 23 0D 93 FB 23 1D 16 00 3C B2 F0 \r
+F0 FF 6E 01 A2 C3 02 01 A2 B3 02 01 F8 23 32 C2 \r
+03 43 B2 40 52 2D C0 01 A2 43 C2 01 F2 40 0E 00 \r
+D7 01 F2 F0 7F 00 03 02 F2 D0 80 00 05 02 F2 40 \r
+11 00 CD 01 F2 40 12 00 CE 01 F2 40 13 00 CF 01 \r
+82 43 C0 01 32 D2 B0 13 A8 E6 B0 13 66 F3 B0 13 \r
+BE E8 B0 13 C4 EA B0 13 2C EC B0 13 30 F2 80 00 \r
+8A CE 4A 14 C8 0F C6 0E C9 0C CA 0D C7 06 3C 40 \r
+6A 1D 3D 40 18 F9 3E 40 07 00 B0 13 BA F2 0A 93 \r
+1C 20 39 90 B5 00 19 2C 77 90 03 00 0B 2C CD 09 \r
+59 02 0D 59 3D 50 3B F5 3C 40 6A 1D 2E 43 B0 13 \r
+BA F2 22 3C 4C 46 3C 50 67 1D CD 09 59 02 0D 59 \r
+3D 50 3A F5 3E 40 03 00 F2 3F CC 09 CD 0A 3E 40 \r
+0A 00 0F 43 B0 13 B2 D8 7E 50 30 00 4F 46 CF 4E \r
+69 1D CC 09 CD 0A 3E 40 0A 00 0F 43 B0 13 B2 D8 \r
+C9 0C CA 0D 56 83 E9 23 3F 40 6A 1D 4D 43 08 3C \r
+48 93 04 24 FF 40 20 00 00 00 58 83 1F 53 5D 53 \r
+3E 40 30 00 6E 9F 05 20 4E 47 1E 83 4C 4D 0C 9E \r
+EF 3B 3C 40 6A 1D 46 16 10 01 0A 14 CA 0C 1F 42 \r
+A6 1E 8F 93 02 00 10 20 8F 93 00 00 0D 20 C2 93 \r
+AB 1E 0A 24 5E 42 AB 1E 3E 50 64 00 5D 42 3A 1F \r
+0D 9E 02 34 4C 43 42 3C BF 40 00 70 08 00 5C 42 \r
+B3 1E 1D 42 B0 1E 1E 42 B2 1E 3D F3 3E F0 FF 00 \r
+3F 40 00 08 B0 13 14 DD 1C 52 38 1F 1F 42 A6 1E \r
+8F 4C 0A 00 1F 42 A6 1E 9F 42 38 1F 0C 00 1F 42 \r
+A6 1E CF 43 14 00 1F 42 A6 1E CF 43 15 00 1F 42 \r
+A6 1E 8F 93 02 00 05 20 8F 93 00 00 02 20 EF D2 \r
+1A 00 1D 42 A6 1E 1E 42 B0 1E 1F 42 B2 1E 3E F3 \r
+3F F0 FF 00 8D 4E 00 00 8D 4F 02 00 1F 42 A6 1E \r
+9F 43 18 00 CC 0A B0 13 7C CB 5C 43 0A 16 10 01 \r
+3A 14 07 4F 07 ED 0A 4F 5A 02 8A 10 4A 4A 0A 93 \r
+49 24 7F D0 80 00 0B 4D 5B 02 8B 10 4B 4B 0B 93 \r
+3F 24 7D D0 80 00 0B 5A 3B 80 7F 00 08 43 09 43 \r
+0E 93 09 24 1A 43 5E 00 02 28 08 5C 09 6D 59 00 \r
+58 00 5A 02 F8 2B 0E 43 1A 43 5F 00 02 28 08 5C \r
+09 6D 59 00 58 00 5E 00 3E B0 00 10 02 24 3E D0 \r
+00 20 4A 5A F2 23 49 93 02 34 1B 53 03 3C 0E 6E \r
+08 68 49 69 3E B0 00 80 07 24 08 63 49 63 0B 63 \r
+3E B0 00 60 01 20 18 C3 1B 93 0C 38 3B 90 FF 00 \r
+0C 34 49 59 8B 10 09 DB 57 02 59 00 0D 49 0C 48 \r
+37 16 10 01 0C 43 0D 43 FB 3F 3D 40 FF FE 3C 43 \r
+57 02 5D 00 F5 3F CF 0D CD 0E CE 0C C2 93 59 1E \r
+06 20 B0 13 80 F2 4C 93 02 20 2C 43 10 01 2E 83 \r
+2C 24 1E 83 43 24 2E 83 20 24 1E 83 3B 24 3E 80 \r
+03 00 34 24 1E 83 30 20 0E 43 8D 93 00 00 09 20 \r
+0F 93 2A 20 1C 4D 02 00 1D 4D 04 00 B0 13 02 F3 \r
+31 3C 1C 43 2C 9D 20 20 0F 93 1E 20 1C 4D 02 00 \r
+1D 4D 04 00 B0 13 F0 F2 25 3C 3F B0 FE FF 14 20 \r
+CC 0F B0 13 C2 F0 CE 0C 1D 3C 3F 90 03 00 07 24 \r
+2F 93 0A 20 CC 0D B0 13 00 E8 CE 0C 13 3C CC 0D \r
+B0 13 AC DA CE 0C 0E 3C 2E 43 0C 3C B0 13 1A F5 \r
+CE 0C 08 3C B0 13 1E F5 CE 0C 04 3C CC 0F B0 13 \r
+9E D6 CE 0C CC 0E 10 01 0A 14 31 80 06 00 B0 13 \r
+36 F3 2E 42 CF 01 1F 53 3D 40 9A 1D 1F 53 FF 4D \r
+FF FF 1E 83 FB 23 3C 40 05 00 0D 43 CE 01 1E 53 \r
+B0 13 F6 C2 D2 43 78 1D 4A 43 B0 13 18 E9 0C 93 \r
+08 24 B0 13 3E C4 1A 2C F2 B0 20 00 78 1D F5 27 \r
+1F 3C E1 43 00 00 3C 40 03 00 3D 40 0A 00 CE 01 \r
+B0 13 F6 C2 4A 43 B0 13 0E F5 0C 93 04 20 E2 43 \r
+78 1D 5C 43 10 3C B0 13 3E C4 06 28 C2 43 59 1E \r
+E2 42 78 1D 4C 43 07 3C F2 B0 20 00 78 1D EB 27 \r
+C2 43 59 1E 4C 43 31 50 06 00 0A 16 10 01 3C 40 \r
+E8 03 B0 13 46 F3 B2 40 2B 5A 5C 01 CF 0A 1A 43 \r
+4A 5F 7F 90 0B 00 10 01 31 80 0E 00 CE 01 3D 40 \r
+00 18 4F 43 1E 53 FE 4D FF FF 5F 53 7F 90 0D 00 \r
+F9 2B F1 93 00 00 30 24 5F 41 01 00 C2 4F 94 1E \r
+3F 90 15 00 05 38 3F 90 EC 00 02 34 C2 43 94 1E \r
+5F 41 04 00 47 18 0F 5F 5E 41 05 00 0E 5F 82 4E \r
+2E 1F D2 41 06 00 9A 1D D2 41 07 00 9B 1D D2 41 \r
+08 00 9C 1D D2 41 09 00 9D 1D F1 93 0C 00 08 24 \r
+5F 41 0A 00 47 18 0F 5F 5E 41 0B 00 0E 5F 01 3C \r
+0E 43 82 4E 84 1E 13 3C E2 42 94 1E B2 40 F6 FF \r
+2E 1F F2 40 79 00 9A 1D F2 40 56 00 9B 1D F2 40 \r
+34 00 9C 1D F2 40 12 00 9D 1D 82 43 84 1E 31 50 \r
+0E 00 10 01 21 83 5F 42 92 1C 1D 42 90 1C 4C 4F \r
+3E 40 FE 9D 0E 8C 0D 9E 02 2C 4B 43 09 3C 81 4D \r
+00 00 2E 41 3F 40 FE 00 4F 8E C2 4F 92 1C 5B 43 \r
+4E 43 15 3C 4F 4E 5D 4F 93 1C 5E 53 4F 4E 5F 4F \r
+93 1C 47 18 0F 5F 0D 5F 5E 53 1C 42 90 1C CF 0C \r
+2F 53 82 4F 90 1C B0 13 9A EA 5F 42 92 1C 4D 4F \r
+1D 83 4C 4E 0C 9D E6 3B 4B 93 0C 20 5F B3 03 20 \r
+C2 43 92 1C 1A 3C 4F 4F D2 4F 92 1C 93 1C D2 43 \r
+92 1C 13 3C 3C 40 FE 9D 3D 40 FE FF B0 13 9A EA \r
+C2 43 92 1C 5F 42 8C 1C 5F C3 6F D3 C2 4F 8C 1C \r
+7C 40 15 00 6D 42 B0 13 30 F0 21 53 10 01 1A 14 \r
+21 82 CA 0C F2 B0 40 00 01 02 42 24 B0 13 9E DB \r
+82 4C 7C 1E 1C 52 80 1E 3C 80 A1 0A 82 4C 7E 1E \r
+B0 13 AA D3 81 4C 00 00 81 4D 02 00 4A 93 03 20 \r
+B0 13 46 C6 27 3C 2C 41 1D 41 02 00 B0 13 DA E6 \r
+3E 40 CD CC 3F 40 4C 3E B0 13 40 C2 C9 0C CA 0D \r
+1C 42 78 1E 1D 42 7A 1E B0 13 DA E6 3E 40 CD CC \r
+3F 40 4C 3F B0 13 40 C2 CE 0C CF 0D CC 09 CD 0A \r
+B0 13 CA B0 B0 13 EA DB 81 4C 00 00 81 4D 02 00 \r
+B0 13 46 C6 1E 42 7C 1E B0 13 00 9E 82 4C 82 1E \r
+21 52 19 16 10 01 1C 41 04 00 1D 41 06 00 82 4C \r
+78 1E 82 4D 7A 1E 10 01 1A 14 21 82 39 40 CB 00 \r
+3C 40 00 40 B0 13 5A DA 3C 40 03 00 3D 40 05 00 \r
+0E 43 B0 13 F6 C2 D1 43 02 00 C1 49 03 00 CC 01 \r
+2C 53 6D 43 B0 13 78 D2 3C 40 03 00 3D 42 0E 43 \r
+B0 13 F6 C2 3C 40 0A 00 B0 13 46 F3 CC 01 B0 13 \r
+5C DD 0C 93 18 20 C1 93 00 00 F8 27 B0 13 1A AA \r
+4A 43 5A 92 9E 1D F2 2F 3C 40 0A 00 B0 13 46 F3 \r
+4C 4A B0 13 24 B3 3C 40 7A 1D 7D 40 13 00 B0 13 \r
+78 D2 5A 53 EE 3F 3C 40 03 00 2D 42 0E 43 B0 13 \r
+F6 C2 B2 40 2B 5A 5C 01 F2 B0 20 00 78 1D B8 27 \r
+C2 43 59 1E 21 52 19 16 10 01 5A 14 C6 0F C7 0E \r
+C5 0D C9 0C 18 41 1C 00 C7 43 00 00 B0 13 24 BB \r
+CA 0C 0A 93 02 20 2C 42 3C 3C 1F 43 2F 99 02 24 \r
+09 43 09 3C 5C 49 02 00 B0 13 6A EB C9 0C 09 93 \r
+02 20 2C 43 2E 3C 5E 4A 02 00 7E 80 0B 00 C7 4E \r
+00 00 3D 40 0E 00 0D 5A 4E 4E CC 05 B0 13 BA F2 \r
+09 93 06 24 D9 4A 21 00 07 00 D9 4A 22 00 08 00 \r
+06 93 07 24 3D 40 07 00 0D 5A CC 06 2E 42 B0 13 \r
+BA F2 08 93 06 24 3F 40 07 00 5F FA 0C 00 C8 4F \r
+00 00 5D 4A 01 00 5C 43 B0 13 70 E9 CA 43 00 00 \r
+0C 43 55 16 10 01 4F 43 4C 93 2D 24 5C 93 20 24 \r
+6C 93 13 24 7C 90 03 00 2A 20 A2 D2 22 03 A2 C2 \r
+24 03 B2 C2 22 03 B0 13 32 F5 B0 13 24 C8 1F 42 \r
+20 03 6F F2 B2 C2 22 03 1A 3C A2 D2 24 03 B0 13 \r
+12 C8 B0 13 24 C8 A2 D2 22 03 B0 13 32 F5 0F 3C \r
+A2 D2 24 03 B2 C2 22 03 A2 D2 22 03 B0 13 32 F5 \r
+B0 13 08 C8 04 3C A2 D2 24 03 B0 13 08 C8 4C 43 \r
+4F 93 01 20 5C 43 10 01 B0 13 24 C8 B0 13 12 C8 \r
+10 01 A2 C2 22 03 B0 13 32 F5 B2 C2 22 03 B0 13 \r
+32 F5 10 01 B2 D2 22 03 B0 13 32 F5 10 01 1A 14 \r
+CB 0C 7B 90 BD 00 07 24 4C 43 7B 90 31 00 40 28 \r
+7B 90 3D 00 3D 2C 0A 42 32 C2 03 43 B2 F0 BF FF \r
+02 0F B2 B0 10 00 02 0F FC 27 7B 90 3D 00 26 2C \r
+4C 43 B0 13 D8 F1 C9 0C 4C 43 7D 40 29 00 B0 13 \r
+2C E4 C2 4B 11 0F A2 B2 30 0F 13 24 7B 90 32 00 \r
+10 24 7B 90 39 00 0D 24 7B 90 38 00 0A 24 A2 B2 \r
+30 0F FD 23 0D 14 3D 40 BF 0C 1D 83 FE 23 0D 16 \r
+03 43 4C 43 CD 09 B0 13 2C E4 03 3C F2 40 BD 00 \r
+11 0F 5C 42 21 0F B2 B0 40 00 02 0F FC 27 02 4A \r
+19 16 10 01 3A 14 07 4F 07 ED 0A 4F 5A 02 8A 10 \r
+4A 4A 0A 93 38 24 7F D0 80 00 0B 4D 5B 02 8B 10 \r
+4B 4B 0B 93 2B 24 7D D0 80 00 0B 8A 3B 50 7F 00 \r
+3A 40 18 00 08 43 09 43 0C 8E 0D 7F 03 2C 0C 5E \r
+0D 6F 12 C3 08 68 09 69 5C 02 0D 6D 1A 83 F4 23 \r
+49 93 03 30 1A 53 1B 83 EF 3F 0C 7E 0D 7F 08 63 \r
+49 63 0B 63 1B 93 0C 38 3B 90 FF 00 0C 34 49 59 \r
+8B 10 09 DB 57 02 59 00 0D 49 0C 48 37 16 10 01 \r
+0C 43 0D 43 FB 3F 3C 40 FF FE 3D 43 57 02 5D 00 \r
+F5 3F 2A 14 21 83 C9 0C 3F 40 0B 00 0F 59 68 4F \r
+3A 40 3F 00 4A F8 3C 40 07 00 0C 59 1D 42 C6 1E \r
+2E 42 B0 13 7C ED 0C 93 2D 24 78 B0 40 00 2A 20 \r
+4A 93 10 24 7A 90 07 00 0D 2C 4A 4A 5A 06 00 18 \r
+5F 4A 54 FA 2C 43 0C 59 4F 13 1C 93 1B 20 D9 43 \r
+00 00 1A 3C 7A 90 3F 00 03 24 7A 90 20 00 12 28 \r
+2C 43 0C 59 CD 01 B0 13 DE C9 4C 93 0B 24 D9 43 \r
+00 00 00 18 C2 93 CA 1E 07 24 6C 41 80 13 CA 1E \r
+4C 93 02 24 C9 43 00 00 21 53 28 16 10 01 4A 14 \r
+C7 0D C8 0C 39 40 41 1E 3A 40 3F 00 5A F8 09 00 \r
+26 43 2F 43 6F 99 32 20 5A 99 09 00 2F 20 7A 90 \r
+3F 00 0B 24 3C 40 03 00 0C 59 3D 40 05 00 0D 58 \r
+2E 42 B0 13 7C ED 0C 93 21 20 D7 49 0B 00 00 00 \r
+57 43 7A 90 3F 00 16 24 3F 40 0A 00 0F 58 6F 4F \r
+7F B0 80 FF 0A 20 7F B2 0D 24 D9 98 0B 00 02 00 \r
+02 20 C9 43 02 00 47 43 05 3C 5D 49 0A 00 CC 08 \r
+B0 13 0E CE B0 13 BE F3 CC 07 05 3C 39 50 0C 00 \r
+16 83 C7 23 4C 43 46 16 10 01 4A 14 C9 0F C7 0E \r
+C6 0D CA 0C 6C 43 B0 13 02 CF C8 0C 08 93 02 20 \r
+0C 43 36 3C CF 07 7F 50 0B 00 C8 4F 02 00 3E 40 \r
+0B 00 0E 58 3F 40 80 00 6F FE 4F DA CE 4F 00 00 \r
+D8 42 C4 1E 0D 00 D2 53 C4 1E FD 27 F8 F0 BF 00 \r
+0C 00 5F 48 0C 00 7F F0 F8 00 4F D9 C8 4F 0C 00 \r
+F8 F0 7F 00 0C 00 F8 C2 0C 00 FE F0 7F 00 00 00 \r
+3C 40 0E 00 0C 58 4E 47 CD 06 B0 13 BA F2 3C 40 \r
+07 00 0C 58 1D 42 C6 1E 2E 42 B0 13 BA F2 CC 08 \r
+46 16 10 01 5C 43 B0 13 44 D6 5C 43 6D 42 80 13 \r
+8C 1E B0 13 0C E7 7C 40 17 00 6D 43 B0 13 30 F0 \r
+7C 40 18 00 6D 43 B0 13 30 F0 7C 40 19 00 6D 43 \r
+B0 13 30 F0 B0 13 14 F3 B2 40 03 00 72 1D B2 40 \r
+10 0E 74 1D B0 13 A8 C3 4C 93 02 24 B0 13 58 C6 \r
+82 43 72 1D B0 13 56 F3 3C 40 00 20 B0 13 5A DA \r
+C2 43 1D 02 82 43 D8 1E 7C 40 17 00 6D 42 B0 13 \r
+30 F0 7C 40 18 00 6D 42 B0 13 30 F0 7C 40 19 00 \r
+6D 42 B0 13 30 F0 92 D3 14 1D 10 01 1F 42 A6 1E \r
+CF 43 11 00 1F 42 A6 1E DF 42 B3 1E 13 00 1F 42 \r
+A6 1E 5E 42 38 1F 5E 8F 0C 00 CF 4E 16 00 1F 42 \r
+A6 1E 5E 4F 16 00 8E 11 8F 5E 0A 00 1F 42 A6 1E \r
+DF 5F 16 00 15 00 1F 42 A6 1E DF 42 3A 1F 12 00 \r
+1F 42 A6 1E FF 92 12 00 02 2C FF 42 12 00 1F 42 \r
+A6 1E 9F 42 B4 1E 04 00 9F 42 B6 1E 06 00 1F 42 \r
+A6 1E DF 42 B8 1E 0E 00 1F 42 A6 1E EF B2 1A 00 \r
+03 20 4D 43 B0 13 92 E0 B0 13 8C D5 D2 C3 36 1F \r
+10 01 1E 42 A6 1E 5F 4E 15 00 8F 11 3F 90 40 00 \r
+10 34 3F 90 C1 FF 19 34 FE 50 40 00 15 00 1F 42 \r
+A6 1E 9F 83 08 00 1F 42 A6 1E 5F 4F 15 00 8F 11 \r
+0C 3C FE 80 40 00 15 00 1F 42 A6 1E 9F 53 08 00 \r
+1F 42 A6 1E 5F 4F 15 00 8F 11 1E 42 A6 1E CE 5F \r
+14 00 1E 42 A6 1E 5F 4E 14 00 8F 11 3F 90 40 00 \r
+0B 34 3F 90 C1 FF 0F 34 FE 50 40 00 14 00 1F 42 \r
+A6 1E 9F 83 0A 00 10 01 FE 80 40 00 14 00 1F 42 \r
+A6 1E 9F 53 0A 00 10 01 0A 14 5F 42 32 1F 3F 90 \r
+07 00 0E 34 3F 90 06 00 31 24 1F 83 32 24 1F 83 \r
+14 24 1F 83 2E 24 1F 83 29 24 1F 83 2A 24 2C 3C \r
+3F 80 07 00 2F 93 25 28 2F 83 20 24 1F 83 21 24 \r
+1F 83 1C 24 1F 83 1D 24 1F 3C 1A 42 34 1F 3A B0 \r
+03 00 0E 20 CC 0A 3D 40 64 00 B0 13 04 F2 0E 93 \r
+0A 20 CC 0A 3D 40 90 01 B0 13 04 F2 0E 93 03 24 \r
+7C 40 1C 00 0A 3C 7C 40 1D 00 07 3C 7C 40 1E 00 \r
+04 3C 7C 40 1F 00 01 3C 4C 43 0A 16 10 01 3C 40 \r
+3D 1E 0D 43 3E 40 1C 00 B0 13 CC F2 E2 43 3D 1E \r
+F2 40 3D 00 3E 1E F2 40 20 00 3F 1E D2 43 40 1E \r
+B0 13 9E EC B0 13 78 EF B0 13 A6 F0 B0 13 6C F4 \r
+B0 13 92 EB B0 13 62 F4 B0 13 D0 E7 3F 40 41 1E \r
+CF 43 00 00 3F 50 0C 00 CF 43 00 00 C2 93 4D 1E \r
+15 20 E2 43 4D 1E F2 40 03 00 4E 1E 7F 40 3F 00 \r
+C2 4F 56 1E C2 4F 57 1E F2 43 58 1E B0 13 02 F5 \r
+CD 0C 3C 40 50 1E 2E 42 B0 13 BA F2 0C 43 10 01 \r
+7C 40 36 00 B0 13 2E C8 F2 B0 10 00 36 1F 27 24 \r
+7C 40 0A 00 5D 42 FA 1E B0 13 2C E4 F2 90 7F 00 \r
+FB 1E 07 38 7C 40 0C 00 7D 40 0C 00 B0 13 2C E4 \r
+06 3C 7C 40 0C 00 5D 42 FB 1E B0 13 2C E4 F2 B2 \r
+36 1F 07 20 7C 40 12 00 7D 40 11 00 B0 13 2C E4 \r
+06 3C 7C 40 12 00 7D 40 15 00 B0 13 2C E4 7C 40 \r
+34 00 B0 13 2E C8 B2 F0 FE FD 32 0F B2 F0 FE FD \r
+32 0F B2 D0 01 02 36 0F A2 43 1E 1F 10 01 1A 14 \r
+31 80 22 00 C9 0D 5A 4C 0B 00 3F 40 CF 00 5F F1 \r
+0A 00 5F D2 C8 1E 7F F0 BF 00 C1 4F 0A 00 3D 40 \r
+05 00 0D 5C CC 01 1C 53 2E 42 B0 13 BA F2 CC 01 \r
+3C 50 05 00 1D 42 C6 1E 2E 42 B0 13 BA F2 3D 40 \r
+C0 00 5D F1 09 00 4D D9 F1 40 0B 00 00 00 C1 4A \r
+0B 00 3F 40 70 00 5F F1 0A 00 7F D0 0B 00 C1 4F \r
+0A 00 7D F0 3F 00 C1 4D 09 00 CC 01 4D 43 B0 13 \r
+46 BF 31 50 22 00 19 16 10 01 21 82 F2 F0 BF 00 \r
+05 02 F2 F0 BF 00 19 02 B2 D0 0C 00 22 03 B2 D0 \r
+0C 00 24 03 C2 43 FE 1D 3C 40 CC 0C B0 13 5A DA \r
+7C 40 06 00 5D 43 B0 13 5A D8 C1 4C 00 00 3C 40 \r
+CC 0C B0 13 5A DA 7C 40 07 00 4D 43 B0 13 5C D0 \r
+C1 4C 01 00 D1 B3 01 00 12 20 C1 93 01 00 0F 24 \r
+7C 40 7F 00 4D 43 B0 13 5C D0 C1 4C 02 00 D1 93 \r
+02 00 03 24 C2 43 FE 1D 02 3C D2 43 FE 1D 21 52 \r
+10 01 2A 14 5C 93 03 20 3F 40 00 1C 02 3C 3F 40 \r
+46 1C 2D 43 08 43 CB 08 4E 43 79 40 03 00 CF 93 \r
+00 00 06 20 6C 93 02 20 CC 0F 24 3C CB 0F 0C 3C \r
+5C 93 0A 20 5E 53 2A 42 6A 9F 06 24 5A 4F 01 00 \r
+4A 99 02 2C C8 0F C9 0A 3F 50 23 00 1D 83 E7 23 \r
+0B 93 0C 20 08 93 02 20 0C 43 0C 3C CB 08 5D 4B \r
+01 00 B0 13 70 E9 EB 43 01 00 03 3C 5E 53 CB 4E \r
+01 00 CC 0B 28 16 10 01 1A 14 CF 0E CA 0C 7A 90 \r
+1A 00 31 28 7A 90 2A 00 2E 2C 4E 4A 5E 02 1C 4E \r
+16 1D 4E 4A 5E 4E C2 F9 7D 90 30 00 05 2C 7D 90 \r
+2D 00 05 20 6B 43 08 3C 7D 90 5B 00 02 28 4B 43 \r
+03 3C 4B 4D 5B 4B 66 F9 7A 90 21 00 11 28 C9 0B \r
+43 18 49 59 43 19 4B 10 4B D9 7A 90 21 00 08 20 \r
+7D 90 31 00 03 24 7D 90 4C 00 02 20 7B 40 80 00 \r
+CD 0B B0 13 2E D5 19 16 10 01 0A 14 CE 0C 0B 42 \r
+32 C2 03 43 B2 F0 BF FF 02 0F B2 B0 10 00 02 0F \r
+FC 27 7E 90 31 00 23 28 7E 90 3D 00 20 2C 4C 43 \r
+B0 13 30 DE CA 0C 4C 43 7D 40 29 00 B0 13 DC E5 \r
+C2 4E 11 0F A2 B2 30 0F 0D 24 7E 90 32 00 0A 24 \r
+7E 90 38 00 07 24 A2 B2 30 0F FD 23 3C 40 F8 02 \r
+B0 13 2E F1 4C 43 CD 0A B0 13 DC E5 02 3C C2 4E \r
+11 0F 5C 42 21 0F 02 4B 0A 16 10 01 0A 14 CB 0D \r
+CA 0C 4C 43 B0 13 96 C7 7C 40 22 00 B0 13 BE D0 \r
+0C 24 CC 0A B0 13 BE D0 08 24 5C 43 B0 13 96 C7 \r
+7C 40 23 00 B0 13 BE D0 02 20 0C 43 16 3C 5B 93 \r
+05 24 4C 43 B0 13 FE DA 4D 4C 0B 3C 5C 43 B0 13 \r
+FE DA 4C 4C 4D 4C 8D 10 4C 43 B0 13 FE DA 4C 4C \r
+0D DC 6C 43 B0 13 96 C7 CC 0D 0A 16 10 01 B0 13 \r
+50 E0 7C 40 03 00 B0 13 96 C7 4C 93 10 01 7C 40 \r
+36 00 B0 13 2E C8 4C 43 3D 40 EC F9 7E 40 27 00 \r
+B0 13 00 DF 7C 40 2C 00 7D 40 88 00 B0 13 2C E4 \r
+7C 40 2D 00 7D 40 31 00 B0 13 2C E4 7C 40 2E 00 \r
+7D 40 09 00 B0 13 2C E4 7C 40 36 00 B0 13 2E C8 \r
+7C 40 33 00 B0 13 2E C8 7C 40 3D 00 B0 13 2E C8 \r
+7C B0 70 00 F9 23 7C 40 36 00 B0 13 2E C8 82 43 \r
+1E 1F B2 D0 01 02 34 0F 82 43 32 0F 10 01 0A 14 \r
+CA 0D CB 0C 7B 93 02 24 CF 0B 02 3C 4B 43 4F 43 \r
+4E 4B 4F 4F 0F 8E 1F 53 4C 4B 3D 40 1C 00 B0 13 \r
+1A F2 1C 52 7A FA 4A 93 09 24 8C 43 00 00 8C 43 \r
+02 00 CC 43 1A 00 FC 40 7F 00 10 00 8C 43 18 00 \r
+FC F0 FC 00 1A 00 8C 43 04 00 8C 43 06 00 CC 43 \r
+0E 00 CC 43 12 00 CC 43 0F 00 CC 43 11 00 5B 53 \r
+1F 83 DA 23 0A 16 10 01 B0 13 02 D8 5C 06 3D 40 \r
+29 00 B0 13 04 F2 1F 42 2E 1F 0F 5C 3F 90 69 01 \r
+03 2C 1C 42 2C 1F 03 3C 1C 42 2C 1F CF 0C 5C 06 \r
+0C 5F 5C 02 3D 40 0A 00 B0 13 04 F2 82 4C 2C 1F \r
+3C 90 F0 00 08 28 B2 F0 DF FF 86 1E 7C 42 4D 43 \r
+B0 13 30 F0 07 3C B2 D0 20 00 86 1E 7C 42 5D 43 \r
+B0 13 30 F0 B2 D2 14 1D B2 D0 80 00 14 1D 10 01 \r
+1A 14 21 82 CA 0C 3C 40 05 00 0C 5A 5D 4A 0E 00 \r
+B0 13 40 E3 0C 93 02 20 3F 42 03 3C B0 13 FC F4 \r
+0F 43 F1 40 82 00 00 00 D1 4A 0D 00 01 00 C1 4F \r
+02 00 6C 43 CD 01 7E 40 03 00 7F 40 03 00 B0 13 \r
+6A CA C9 0C 09 93 0D 24 3C 40 03 00 0C 59 3D 40 \r
+05 00 0D 5A 2E 42 B0 13 BA F2 CC 09 4D 43 B0 13 \r
+30 E8 21 52 19 16 10 01 2A 14 C8 0D C9 0C 5C 42 \r
+FF 1D B0 13 6A EB CA 0C B0 13 EA F4 0A 93 24 24 \r
+CC 0A 5D 43 B0 13 78 EC 0C 93 1F 20 09 93 1D 24 \r
+5C 4A 0A 00 5F 4A 01 00 CD 09 CE 08 B0 13 6A CA \r
+C9 0C 09 93 0E 24 3C 40 03 00 0C 59 3D 40 03 00 \r
+0D 5A 2E 42 B0 13 BA F2 CC 09 5D 43 B0 13 30 E8 \r
+04 3C 3C 40 03 00 01 3C 2C 43 28 16 10 01 0E 42 \r
+32 C2 03 43 4C 93 2C 24 4F 4C 3F 50 00 7E B2 B0 \r
+10 00 02 0F FC 27 82 4F 10 0F B2 B0 10 00 02 0F \r
+FC 27 F2 40 3D 00 11 0F B2 B0 10 00 02 0F FC 27 \r
+F2 40 FE 00 11 0F B2 B0 20 00 02 0F FC 27 C2 43 \r
+10 0F B2 B0 80 00 02 0F FC 27 5D 42 20 0F B2 B0 \r
+10 00 02 0F FC 27 F2 40 3D 00 11 0F 4D 9C D7 23 \r
+02 4E 10 01 0A 14 CA 0D 6A 92 1A 24 B0 13 FA F3 \r
+4C 93 08 20 7C 40 47 00 3D 40 20 F9 5E 43 B0 13 \r
+D6 BC 0E 3C 5C 42 C2 1E 0D 43 7E 40 03 00 6F 43 \r
+B0 13 D2 C0 CD 0C 7C 40 47 00 5E 43 B0 13 D6 BC \r
+B0 13 FA F3 4C 93 0F 20 5A 93 08 24 6A 92 0B 20 \r
+7C 40 13 00 4D 43 B0 13 30 F0 05 3C 7C 40 13 00 \r
+5D 43 B0 13 30 F0 0A 16 10 01 21 82 81 43 00 00 \r
+81 43 02 00 7C 40 7F 00 4D 43 B0 13 5C D0 81 4C \r
+00 00 81 43 02 00 2C 41 1F 41 02 00 47 18 0C 5C \r
+0D 43 3C F0 00 07 0D F3 B0 13 28 E2 81 4C 00 00 \r
+81 4D 02 00 7C 40 80 00 5D 43 B0 13 5C D0 81 DC \r
+00 00 12 C3 11 10 02 00 11 10 00 00 12 C3 11 10 \r
+02 00 11 10 00 00 2C 41 1D 41 02 00 21 52 10 01 \r
+1F 42 38 0F 1E 42 0E 0F 0E 93 14 20 0F 93 28 24 \r
+3F 90 14 00 0C 20 B2 B0 00 02 36 0F 03 20 32 C2 \r
+03 43 FF 3F B2 F0 FF FD 32 0F 80 00 62 B8 32 C2 \r
+03 43 FF 3F 2E 93 11 20 1F 42 0C 0F 2F 93 0A 24 \r
+2F 92 08 24 3F 90 06 00 05 24 3F 92 03 24 32 C2 \r
+03 43 FF 3F 32 C2 03 43 FF 3F 32 C2 03 43 FF 3F \r
+10 01 B2 F0 FE FD 36 0F B2 F0 FE FD 32 0F B2 F0 \r
+FE FD 32 0F 92 43 1E 1F 7C 40 32 00 B0 13 D8 F1 \r
+C2 4C 20 1F 7C 43 3D 40 B0 1E 7E 40 0A 00 B0 13 \r
+BC DE 7C 43 B0 13 D8 F1 C2 4C 3A 1F 7C B0 80 FF \r
+04 20 F2 80 80 00 3A 1F 03 3C F2 F0 7F 00 3A 1F \r
+1F 42 22 1F 3F 80 10 00 82 4F 38 1F 80 00 90 E1 \r
+B2 40 5A F8 40 1F B2 40 B4 F8 42 1F 00 18 D2 42 \r
+62 F8 8C 1E 00 18 D2 42 BC F8 90 1E 82 43 D8 1E \r
+82 43 86 1E 82 43 88 1E 82 43 14 1D 82 43 8A 1E \r
+92 D3 14 1D B2 D0 40 00 86 1E B0 13 58 C4 B0 13 \r
+C4 ED B0 13 94 F2 B0 13 80 F4 B0 13 44 DF B0 13 \r
+EE F1 B0 13 08 F5 B0 13 A4 F3 80 00 60 E8 5F 93 \r
+20 24 4F 93 1B 24 6F 93 12 24 7F 90 03 00 05 24 \r
+6F 92 1C 20 B0 13 7E D5 10 01 4E 4E 3E E3 CF 0E \r
+6F FC 4D DF CC 4D 00 00 CC FE 20 00 10 01 B0 13 \r
+7E D5 CC DD 00 00 CC DD 20 00 10 01 CC CE 00 00 \r
+10 01 6F 4C 4F CE 4D DF CC 4D 00 00 10 01 4E 4E \r
+3E E3 CC FE 00 00 CC FE 20 00 10 01 0A 14 1F 42 \r
+A6 1E DF 53 13 00 B0 13 02 CC 1F 42 A6 1E 1E 4F \r
+08 00 1E 5F 0A 00 8F 4E 0C 00 1F 42 A6 1E 9F 4F \r
+0C 00 0A 00 1A 42 A6 1E CF 0A 5C 4F 13 00 2D 4F \r
+1E 4F 02 00 3F 40 00 08 B0 13 14 DD 8A 8C 0C 00 \r
+1F 42 A6 1E FF 40 07 00 0F 00 1F 42 A6 1E FF F0 \r
+FC 00 1A 00 0A 16 10 01 92 53 96 1E 82 63 98 1E \r
+1F 43 5F 52 A2 1E 3F 90 3C 00 1F 20 C2 43 A2 1E \r
+1F 43 5F 52 A1 1E 3F 90 3C 00 12 20 C2 43 A1 1E \r
+1F 43 5F 52 A0 1E F2 40 03 00 9E 1E 3F 90 18 00 \r
+03 24 C2 4F A0 1E 10 01 C2 43 A0 1E 80 00 D2 E0 \r
+C2 4F A1 1E E2 43 9E 1E 10 01 C2 4F A2 1E D2 43 \r
+9E 1E 10 01 0A 14 CA 0C 7D 40 46 00 7E 40 5A 00 \r
+B0 13 42 F4 0D 43 4E 43 B0 13 D6 BC 5A 93 0D 24 \r
+7C 40 29 00 B0 13 96 D6 7C 40 27 00 B0 13 96 D6 \r
+7C 40 28 00 B0 13 96 D6 0C 3C 7C 40 1F 00 B0 13 \r
+96 D6 7C 40 20 00 B0 13 96 D6 7C 40 1E 00 B0 13 \r
+96 D6 0A 16 10 01 4D 43 B0 13 30 F0 10 01 0A 14 \r
+0A 43 2C 92 22 24 3C 90 05 00 1C 24 3C 92 17 24 \r
+3C 90 0A 00 12 20 2F 4D 0F 93 0A 24 1F 83 06 24 \r
+1F 83 02 24 2C 43 16 3C 6C 43 03 3C 5C 43 01 3C \r
+4C 43 B0 13 14 F1 0C 43 0D 3C 2A 43 0A 3C B0 13 \r
+18 EF 07 3C B0 13 2E EE 04 3C B0 13 F8 EE B0 13 \r
+58 ED CC 0A 0A 16 10 01 C2 93 76 1E 29 20 C2 93 \r
+FE 1D 07 20 7C 40 47 00 3D 40 14 F9 5E 43 80 00 \r
+D6 BC F2 F0 BF 00 1D 02 F2 D0 40 00 1B 02 B0 13 \r
+36 F4 D2 43 76 1E 7E 40 0F 00 07 3C 4E 93 0B 24 \r
+3C 40 CC 0C B0 13 5A DA 5E 83 F2 B0 40 00 01 02 \r
+F5 27 4E 93 02 20 C2 43 76 1E 4C 43 80 00 AE C5 \r
+10 01 1A 14 C9 0C 79 93 02 24 CA 09 02 3C 49 43 \r
+4A 43 4F 49 4A 4A 0A 8F 1A 53 CC 09 B0 13 10 ED \r
+0C 93 09 20 4C 49 3D 40 1C 00 B0 13 1A F2 1C 52 \r
+7A FA B0 13 AA D7 59 53 1A 83 EF 23 E2 B3 36 1F \r
+0A 24 B0 13 4E F4 4C 93 06 20 D2 C3 36 1F B0 13 \r
+26 F3 B0 13 DE F4 19 16 10 01 AC 43 18 00 FC F0 \r
+FC 00 1A 00 CC 43 12 00 5F 42 AC 1E C2 93 AD 1E \r
+03 20 CC 4F 13 00 08 3C 5E 42 AC 1E 12 C3 4E 10 \r
+4E 11 4F 8E CC 4F 13 00 E2 B3 36 1F 11 20 F2 D0 \r
+06 00 36 1F B0 13 B2 F3 82 4C A4 1E C2 93 AD 1E \r
+04 20 B2 50 E0 7F A4 1E 10 01 B2 50 C0 53 A4 1E \r
+10 01 B2 D0 91 00 B0 01 B2 40 10 0A 00 07 B2 40 \r
+00 02 02 07 F2 40 1B 00 10 07 92 43 0C 07 2C 43 \r
+B0 13 5A DA A2 D3 00 07 C2 43 46 1F 92 D3 00 07 \r
+3C 40 05 00 B0 13 5A DA C2 93 46 1F FD 27 B2 F0 \r
+FC F5 00 07 B2 F0 EF FF 00 07 B2 F0 6E FF B0 01 \r
+82 43 0C 07 1C 42 44 1F 10 01 0A 14 21 83 CA 0D \r
+CB 0C 4C 43 B0 13 96 C7 7C 40 22 00 B0 13 96 D8 \r
+0E 24 CC 0B B0 13 96 D8 0A 24 CC 0A B0 13 A4 D8 \r
+C1 4C 00 00 6C 43 B0 13 96 C7 5C 43 01 3C 4C 43 \r
+21 53 0A 16 10 01 B0 13 A4 D8 C1 4C 04 00 C1 93 \r
+04 00 10 01 B0 13 50 E0 7C 40 03 00 B0 13 96 C7 \r
+10 01 0A 14 09 14 09 43 0A 43 1B 43 0F 93 04 24 \r
+09 4D 0D 4C 0C 43 0D 3C 5C 02 0D 6D 09 69 09 8E \r
+04 28 1C D3 5B 02 F8 2B 03 3C 09 5E 5B 02 F4 2B \r
+1B 43 5C 02 0D 6D 09 69 0A 6A 09 8E 0A 7F 04 28 \r
+1C D3 5B 02 F6 2B 04 3C 09 5E 0A 6F 5B 02 F1 2B \r
+0E 49 0F 4A 09 16 0A 16 10 01 0A 14 7C 40 23 00 \r
+B0 13 D8 F1 CA 0C 7A D0 20 00 CD 0A 7C 40 23 00 \r
+B0 13 2C E4 7C 40 C6 00 B0 13 DE D2 7C 40 33 00 \r
+B0 13 2E C8 7C 40 3D 00 B0 13 2E C8 7C B0 70 00 \r
+F9 23 3D 40 DF 00 4D FA 7C 40 23 00 B0 13 2C E4 \r
+7C 40 36 00 B0 13 2E C8 82 43 1E 1F 0A 16 10 01 \r
+4F 14 1F 42 6E 03 2F 83 1E 24 2F 82 0B 24 2F 83 \r
+1C 20 B2 F0 EF FF 4A 03 92 C3 4A 03 B2 D0 80 00 \r
+86 1E 13 3C B2 F0 EF FF 48 03 92 C3 48 03 1F 42 \r
+50 03 1F 52 1A 1F 82 4F 58 03 B2 D0 10 00 48 03 \r
+80 13 16 1F 02 3C B0 13 04 E3 B1 C0 D0 00 14 00 \r
+4B 16 00 13 B2 B0 20 00 86 1E 25 20 B0 13 FA F3 \r
+4C 93 21 20 B0 13 12 F4 4C 93 1D 20 D2 53 EB 1E \r
+E2 93 EB 1E 18 20 4C 43 4D 43 B0 13 30 F0 5C 43 \r
+B0 13 44 D6 7C 40 5A 00 3D 40 F8 F8 5E 43 B0 13 \r
+D6 BC 7C 40 46 00 3D 40 24 F9 5E 43 B0 13 D6 BC \r
+3F 40 00 10 C0 0F 10 01 2A 14 1A 41 10 00 49 4C \r
+1B 42 A6 1E 1B 4B 0C 00 0B 89 3B 80 32 00 28 4D \r
+C9 0B 09 88 09 93 02 38 28 9E 15 20 8D 4B 00 00 \r
+1D 42 A6 1E 4C 4C 1C 5D 0C 00 3C 50 10 00 8E 4C \r
+00 00 1E 42 A6 1E DF 4E 0F 00 00 00 1F 42 A6 1E \r
+DA 4F 10 00 00 00 28 16 10 01 B2 B0 30 00 40 03 \r
+24 24 B2 F0 EF FF 4A 03 B2 F0 7F FF 86 1E 82 93 \r
+50 03 02 20 0F 43 05 3C 1F 42 50 03 1F 92 50 03 \r
+FB 23 0F 5C 82 4F 5A 03 92 C3 4A 03 B2 D0 10 00 \r
+4A 03 B0 13 BE F4 B2 40 2B 5A 5C 01 32 C2 03 43 \r
+B2 B0 80 00 86 1E F5 27 32 D2 10 01 1A 14 CA 0C \r
+5C 4A 05 00 CF 0C 3F 80 03 00 06 24 2F 83 2F 93 \r
+03 28 7F 40 03 00 01 3C 5F 43 4C 4C 1D 4A 02 00 \r
+5E 4A 04 00 B0 13 6A CA C9 0C 09 93 0C 24 3C 40 \r
+03 00 0C 59 2D 4A 2E 42 B0 13 BA F2 CC 09 5D 43 \r
+B0 13 30 E8 02 3C 3C 40 03 00 19 16 10 01 A2 D2 \r
+22 03 A2 C2 24 03 3E 42 4F 43 B2 C2 22 03 B0 13 \r
+42 DB 4F 5F A2 B2 20 03 01 24 5F D3 1E 83 F5 23 \r
+A2 D2 24 03 B2 C2 22 03 5C 93 03 24 A2 D2 22 03 \r
+02 3C A2 C2 22 03 B0 13 42 DB B2 C2 22 03 CC 0F \r
+10 01 B0 13 32 F5 B2 D2 22 03 B0 13 32 F5 10 01 \r
+D2 B3 36 1F 1E 24 A2 93 A8 1E 1B 24 1F 42 A6 1E \r
+2E 4F 1F 4F 02 00 0F 93 09 20 0E 93 07 20 82 93 \r
+A8 1E 0F 20 92 43 A8 1E 5C 43 10 01 1C 42 B0 1E \r
+1D 42 B2 1E 3C F3 3D F0 FF 00 0D 9F 02 20 0C 9E \r
+02 24 4C 43 10 01 A2 43 A8 1E 5C 43 10 01 21 83 \r
+81 43 00 00 7C 40 81 00 5D 43 B0 13 5C D0 81 4C \r
+00 00 B1 B0 00 20 00 00 02 20 4E 43 08 3C B1 D0 \r
+00 C0 00 00 B1 E3 00 00 91 53 00 00 5E 43 2C 41 \r
+5C 03 CF 0C 4E 93 04 24 3C 40 AC 0A 0C 8F 03 3C \r
+3C 40 AC 0A 0C 5F 21 53 10 01 0B 4D 0E 4B 0D 93 \r
+1F 30 3B F0 80 7F 1C 24 5B 02 8B 10 7E D0 80 00 \r
+3B 80 7F 00 15 30 3B 90 20 00 0F 34 3B 80 17 00 \r
+05 30 1B 83 08 30 5C 02 0E 6E FB 3F 5E 01 5C 00 \r
+1B 53 01 24 FB 3F 0D 4E 10 01 3C 43 3D 43 10 01 \r
+0C 43 0D 43 10 01 0B 4D 0B EF 0A 30 0D 93 12 30 \r
+0D 9F 02 24 19 34 16 3C 0C 9E 18 24 13 28 14 3C \r
+3D B0 80 7F 04 20 3F B0 80 7F 01 20 0F 24 0D 9F \r
+0B 34 08 3C 0F 9D 02 24 07 34 04 3C 0E 9C EC 27 \r
+01 28 02 3C 3C 43 10 01 1C 43 10 01 0C 43 10 01 \r
+C2 93 FE 1E 21 20 D2 43 FE 1E B2 40 8F 02 00 1F \r
+B2 40 33 13 02 1F B2 40 14 01 80 03 B2 40 05 00 \r
+92 03 B2 40 80 00 82 03 F2 D0 80 00 0B 02 00 18 \r
+F2 40 CA DC 16 1F 3C 40 8F 02 B0 13 1C EA 92 42 \r
+02 1F 1A 1F E2 43 04 1F 10 01 E2 93 04 1F 13 24 \r
+B0 13 44 F2 C2 93 04 1F 1C 24 82 43 90 03 B2 D0 \r
+10 00 80 03 F2 D0 80 00 0B 02 E2 43 04 1F 92 42 \r
+02 1F 1A 1F 10 01 B2 F0 CF FF 80 03 F2 F0 7F 00 \r
+03 02 F2 F0 7F 00 0B 02 D2 43 04 1F 92 42 00 1F \r
+1A 1F 10 01 1A 14 CB 0E CA 0D CE 0C CC 0A CD 0B \r
+B0 13 66 E2 4D 4C CC 0A 49 4E 5C E9 5A F7 47 18 \r
+0C 5C 4E ED 5E 4E 5A F7 0E 5C 4A 4A 47 18 0A 5A \r
+CC 0B 4C DD 0C 5A 0C EE 0F 9C 06 2C 3E 40 FF 7F \r
+0C FE 5E 03 0F 9C FC 2B 19 16 10 01 1A 14 31 80 \r
+06 00 C9 0C 5A 42 FF 1D CC 0A B0 13 6A EB 0C 93 \r
+02 20 2C 43 13 3C 4D 43 B0 13 78 EC 0C 93 0E 20 \r
+91 43 02 00 C1 4A 04 00 81 43 00 00 CC 01 2C 53 \r
+3D 40 7A 1D CE 09 0F 43 B0 13 FA C6 31 50 06 00 \r
+19 16 10 01 F2 40 A5 00 21 01 4E 4C 4F 4E 8F 10 \r
+0E 5F 3E 50 00 44 82 4E 24 01 4F 4C 3F 50 00 44 \r
+82 4F 26 01 92 B3 2C 01 FD 27 C2 4C 20 01 B2 F0 \r
+F9 FF 2C 01 A2 B3 2C 01 03 24 A2 B2 2C 01 FD 27 \r
+82 4E 26 01 C2 43 21 01 10 01 1A 14 3F 40 8E FA \r
+9F 00 FF FF 12 24 3D 40 8E FA 0C 3C 4F 13 2A 52 \r
+12 3C 3C 4D CA 0D CE 09 B0 13 BA F2 0A 59 CD 0A \r
+1D 53 1D C3 39 4D 09 93 F4 23 3F 40 FF FF 3F 93 \r
+05 24 3A 40 FF FF 0F 0A DF 03 E8 23 19 16 10 01 \r
+7C 90 3C 00 06 28 7C 90 3E 00 03 24 32 C2 03 43 \r
+FF 3F 0F 42 32 C2 03 43 B2 B0 10 00 02 0F FC 27 \r
+7C 90 2F 00 08 28 7C 90 3E 00 05 24 7C D0 C0 00 \r
+C2 4C 13 0F 04 3C 7C D0 80 00 C2 4C 13 0F 5C 42 \r
+22 0F 02 4F 10 01 0B 4D 0E 4B 3B F0 80 7F 1C 24 \r
+5B 02 8B 10 7E D0 80 00 3B 80 7F 00 15 30 3B 90 \r
+10 00 10 34 5E 01 5C 00 1E 93 01 24 FB 3F 1B 83 \r
+03 30 5C 02 0E 6E FB 3F 0D 93 02 34 3E E3 1E 53 \r
+0C 4E 10 01 3C 43 10 01 0C 43 10 01 0A 14 CB 0D \r
+0A 42 32 C2 03 43 B2 B0 10 00 02 0F FC 27 7C D0 \r
+C0 00 C2 4C 13 0F 4F 4E 1F 83 0A 24 B2 B0 80 00 \r
+02 0F FC 27 1D 53 DD 42 22 0F FF FF 1F 83 F6 23 \r
+4D 4E 0D 5B DD 42 20 0F FF FF 02 4A 0A 16 10 01 \r
+0B 42 32 C2 03 43 B2 B0 10 00 02 0F FC 27 4C 4C \r
+47 18 0C 5C 3C D0 00 40 6F 4D 0F 5C 82 4F 10 0F \r
+6E 93 0C 28 1D 53 4E 4E 1E 83 E2 4D 10 0F B2 B0 \r
+20 00 02 0F FC 27 1D 53 1E 83 F7 23 5F 42 20 0F \r
+02 4B 10 01 C2 43 76 1E 82 43 82 1E 82 43 7E 1E \r
+82 43 80 1E C2 93 FE 1D 16 24 B0 13 52 EC B0 13 \r
+F8 D6 B0 13 EE EA 1C 42 84 1E 0C 93 0C 24 1C 52 \r
+82 1E 82 4C 82 1E 1D 42 78 1E 1E 42 7A 1E 1F 42 \r
+7C 1E 80 00 1E A3 10 01 1A 14 C9 0C 3D 40 0C 00 \r
+0D 59 6E 49 7E 80 0B 00 5C 43 7F 40 03 00 B0 13 \r
+6A CA CA 0C 0A 93 10 24 3C 40 03 00 0C 5A 3D 40 \r
+05 00 0D 59 2E 42 B0 13 BA F2 FA D0 80 00 0E 00 \r
+CC 0A 4D 43 B0 13 30 E8 19 16 10 01 D2 B3 36 1F \r
+0E 24 1D 42 B0 1E 1E 42 B2 1E 3D F3 3E F0 FF 00 \r
+1F 42 A6 1E 1E 9F 02 00 02 20 2D 9F 02 24 4C 43 \r
+10 01 DF 92 B3 1E 13 00 04 24 D2 C3 36 1F 4C 43 \r
+10 01 EF C2 1A 00 B0 13 7C CB 5C 43 10 01 4F 4C \r
+48 18 0F 5F 7C 90 40 00 1A 28 7C 90 4F 00 17 2C \r
+92 B3 44 01 FD 23 32 C2 03 43 B2 40 00 A5 44 01 \r
+B2 40 02 A5 40 01 8F 43 00 00 B2 40 40 A5 40 01 \r
+B2 40 00 A5 40 01 B2 40 10 A5 44 01 32 D2 10 01 \r
+A2 D2 24 03 7F 40 80 00 3E 42 B2 C2 22 03 CD 0C \r
+4D FF 4D 9F 03 24 A2 C2 22 03 02 3C A2 D2 22 03 \r
+12 C3 4F 10 B0 13 32 F5 B2 D2 22 03 B0 13 32 F5 \r
+1E 83 EB 23 B2 C2 22 03 A2 D2 22 03 A2 C2 24 03 \r
+10 01 4C 93 1D 20 4C 43 B0 13 10 ED 0C 93 04 24 \r
+1C 83 09 24 1C 83 14 20 C2 43 3C 1F C2 43 3D 1F \r
+82 43 3E 1F 10 01 1F 42 7A FA D2 4F 0E 00 3C 1F \r
+1E 4F 04 00 1F 4F 06 00 C2 4F 3D 1F 82 4E 3E 1F \r
+10 01 0A 14 1A 43 5A 52 31 1F D2 53 31 1F B0 13 \r
+88 CC 4C 4C 0C 9A 11 34 1F 43 5F 52 32 1F 7F 90 \r
+0D 00 05 2C D2 53 32 1F D2 43 31 1F 06 3C D2 43 \r
+31 1F D2 43 32 1F 92 53 34 1F 92 D3 14 1D 0A 16 \r
+10 01 0A 14 0A 43 0F 93 05 34 3E E3 3F E3 1E 53 \r
+0F 63 1A D3 0D 93 05 34 3C E3 3D E3 1C 53 0D 63 \r
+3A E3 B0 13 B2 D8 1A B3 04 24 3C E3 3D E3 1C 53 \r
+0D 63 2A B3 04 24 3E E3 3F E3 1E 53 0F 63 0A 16 \r
+10 01 0A 14 CA 0D CB 0E 4C 4C 3D 40 1C 00 B0 13 \r
+1A F2 1F 42 7A FA 0F 5C 8F 93 18 00 0F 20 8F 4A \r
+00 00 8F 4B 02 00 0B 93 06 20 0A 93 04 20 1C 52 \r
+7A FA EC C2 1A 00 FF 40 7F 00 10 00 0A 16 10 01 \r
+0A 14 5A 42 B9 1E 3C 40 B0 1E B0 13 40 E5 4C 4C \r
+0C EA 47 18 0C 5C 8C 10 4C 4C CA 0C C2 4A B9 1E \r
+3A 90 21 00 05 20 D2 D3 36 1F B0 13 DE F4 05 3C \r
+F2 F0 EF 00 36 1F B0 13 90 CD 0A 16 10 01 1A 14 \r
+C2 93 2A 1E 16 24 3C 40 02 1E 29 42 3A 40 7E FA \r
+3B 40 2C 1E 4E 43 4F 43 7D 4C 7D 9B 01 20 5E 53 \r
+7D 9A 01 20 5F 53 19 83 F7 23 6F 92 02 24 6E 92 \r
+02 20 4C 43 01 3C 5C 43 19 16 10 01 5C 02 0D 6D \r
+5C 02 0D 6D 5C 02 0D 6D 5C 02 0D 6D 5C 02 0D 6D \r
+5C 02 0D 6D 5C 02 0D 6D 5C 02 0D 6D 5C 02 0D 6D \r
+5C 02 0D 6D 5C 02 0D 6D 5C 02 0D 6D 5C 02 0D 6D \r
+5C 02 0D 6D 5C 02 0D 6D 10 01 5D 03 5C 00 5D 03 \r
+5C 00 5D 03 5C 00 5D 03 5C 00 5D 03 5C 00 5D 03 \r
+5C 00 5D 03 5C 00 5D 03 5C 00 5D 03 5C 00 5D 03 \r
+5C 00 5D 03 5C 00 5D 03 5C 00 5D 03 5C 00 5D 03 \r
+5C 00 5D 03 5C 00 10 01 0A 14 3F 40 41 1E 2E 43 \r
+0C 43 2D 43 6D 9F 05 20 3F 50 0C 00 1C 53 1E 83 \r
+F8 23 6C 93 02 20 0C 43 0C 3C 4C 4C 3D 40 0C 00 \r
+B0 13 1A F2 3A 40 41 1E 0A 5C CC 0A B0 13 9C E4 \r
+CC 0A 0A 16 10 01 82 43 BA 1E 4C 43 B0 13 D8 F4 \r
+B0 13 56 F3 C2 43 C2 1E 92 D3 14 1D 7C 40 13 00 \r
+6D 42 B0 13 30 F0 7C 40 17 00 6D 42 B0 13 30 F0 \r
+7C 40 18 00 6D 42 B0 13 30 F0 7C 40 19 00 6D 42 \r
+80 00 30 F0 92 C3 44 03 82 93 FC 1E 0E 24 B0 13 \r
+9A A0 92 93 FC 1E 03 24 B0 13 44 E6 02 3C B0 13 \r
+90 CD 1C 42 F6 1E 80 00 12 F0 F2 C2 36 1F B0 13 \r
+90 CD 1C 42 F8 1E B0 13 12 F0 92 43 FC 1E 10 01 \r
+3A 14 C8 0D C7 0C 3A 40 41 1E 29 43 2F 43 6F 9A \r
+0E 20 3D 40 03 00 0D 5A CC 07 2E 42 B0 13 7C ED \r
+0C 93 05 20 58 9A 0A 00 02 20 CC 0A 05 3C 3A 50 \r
+0C 00 19 83 EB 23 0C 43 37 16 10 01 3A 14 C8 0D \r
+C7 0C 3A 40 41 1E 49 43 2F 43 6F 9A 0E 20 3C 40 \r
+03 00 0C 5A CD 07 2E 42 B0 13 7C ED 0C 93 05 20 \r
+CA 98 0A 00 02 20 CC 0A 05 3C 3A 50 0C 00 59 53 \r
+EB 27 0C 43 37 16 10 01 D2 B3 8D 1C 0A 24 B0 13 \r
+FA F3 4C 93 06 20 B0 13 F4 B1 4C 93 02 20 B0 13 \r
+C6 E2 F2 B0 06 00 8D 1C 02 24 B0 13 F8 D6 7C 40 \r
+15 00 7D 40 03 00 B0 13 30 F0 0C 43 4D 43 5E 43 \r
+80 00 64 B6 82 43 AE 1E B0 13 E4 F4 F2 40 21 00 \r
+AA 1E F2 40 06 00 AC 1E C2 43 AB 1E D2 43 AD 1E \r
+7C 43 5D 43 B0 13 3E D1 B0 13 CE D0 B0 13 0A D9 \r
+7C 40 0C 00 5D 42 94 1E 80 00 2C E4 21 83 0F 42 \r
+32 C2 03 43 B2 B0 10 00 02 0F FC 27 4C 4C 47 18 \r
+0C 5C 3C D0 00 40 4D 4D 0C 5D 82 4C 10 0F B2 B0 \r
+20 00 02 0F FC 27 5E 42 20 0F 81 4E 00 00 02 4F \r
+21 53 10 01 5F 14 1A 42 38 0F 4A 4A B0 13 12 F4 \r
+4C 93 10 20 7A 90 14 00 04 24 4A 93 0D 20 03 43 \r
+0B 3C 1F 42 BA 1E 1F 93 02 24 2F 93 05 20 B0 13 \r
+A8 F2 02 3C B0 13 10 D4 5A 16 00 13 21 83 CC 43 \r
+0A 00 EC 43 00 00 DC 42 40 1E 0B 00 D2 53 40 1E \r
+02 3C D2 53 40 1E C2 93 40 1E FB 27 F2 93 40 1E \r
+F8 27 5C 42 40 1E CD 01 B0 13 42 EB 4C 93 F1 23 \r
+21 53 10 01 0A 14 CA 0C 5D 42 4A 1F B0 13 A0 E7 \r
+4C 93 0E 24 B0 13 DE F2 CD 0C 1C 43 0C 5A 2E 42 \r
+B0 13 7C ED 0C 93 02 20 0C 43 05 3C 2C 43 03 3C \r
+B0 13 BE F3 1C 43 0A 16 10 01 0E 4C 0D 4C 0D 93 \r
+16 24 03 34 3D E3 1D 53 0F 30 3B 40 8F 00 1B 83 \r
+5D 02 FD 2B 4C 4D 8C 10 8D 10 4D 4D 8B 10 0D DB \r
+5E 02 5D 00 5C 00 10 01 3D 40 00 C7 0C 43 10 01 \r
+0A 14 3A 40 09 00 0F 43 6D 4C 3B 42 4E 4D 0E EF \r
+3E 90 80 00 04 38 4F 5F 7F E0 97 00 02 3C 4F 5F \r
+4F 4F 4D 5D 1B 83 F2 23 1C 53 1A 83 ED 23 CC 0F \r
+0A 16 10 01 1D 42 26 1E 0F 42 32 C2 03 43 D2 43 \r
+24 1E 02 4F 0D 93 07 24 B0 13 F4 EF C2 93 23 1E \r
+02 20 1D 83 F9 23 0F 42 32 C2 03 43 C2 43 23 1E \r
+C2 43 24 1E 02 4F 10 01 B0 13 9E F4 1F 42 A6 1E \r
+FF 90 7F 00 10 00 0A 24 2C 93 05 34 3C 93 0D 34 \r
+DF 83 10 00 10 01 DF 53 10 00 10 01 CF 4C 10 00 \r
+1F 42 A6 1E FF 50 0C 00 10 00 10 01 7C 90 2F 00 \r
+06 28 7C 90 3E 00 03 24 32 C2 03 43 FF 3F 0F 42 \r
+32 C2 03 43 B2 B0 10 00 02 0F FC 27 C2 4C 11 0F \r
+B2 B0 20 00 02 0F FC 27 C2 4D 10 0F 02 4F 10 01 \r
+4D 93 03 20 32 C2 03 43 FF 3F 0F 42 32 C2 03 43 \r
+B2 B0 10 00 02 0F FC 27 F2 40 7F 00 11 0F 4D 4D \r
+B2 B0 20 00 02 0F FC 27 F2 4C 10 0F 1D 83 F8 23 \r
+02 4F 10 01 B2 F0 FE FD 36 0F B2 F0 FE FD 32 0F \r
+7C 40 36 00 B0 13 2E C8 7C 40 3A 00 B0 13 2E C8 \r
+7C 40 36 00 B0 13 2E C8 7C 40 32 00 B0 13 2E C8 \r
+82 43 1E 1F 10 01 B0 13 0C C0 B0 13 D0 D4 B0 13 \r
+EE F3 82 93 D8 1E 03 20 82 93 86 1E 02 24 B0 13 \r
+42 B4 82 93 88 1E 02 24 B0 13 C4 EC 82 93 14 1D \r
+EE 27 B0 13 DA AC EB 3F 21 83 7C 40 30 00 B0 13 \r
+2E C8 81 43 00 00 02 3C 91 53 00 00 B1 90 64 00 \r
+00 00 FA 2B 7C 40 36 00 B0 13 2E C8 7C B0 70 00 \r
+F9 23 82 43 06 0F 21 53 10 01 0C 93 02 20 0D 93 \r
+14 24 3B 40 9F 00 1B 83 5C 02 0D 6D FC 2B 12 C3 \r
+5D 00 5C 00 3E 40 06 00 5D 01 5C 00 1E 83 FC 37 \r
+8B 10 0D DB 12 C3 5D 00 5C 00 10 01 D2 B3 8D 1C \r
+06 24 B0 13 FA F3 4C 93 02 24 B0 13 C6 E2 0C 43 \r
+4D 43 6E 43 B0 13 64 B6 F2 B0 06 00 8D 1C 02 24 \r
+B0 13 EE EA 7C 40 15 00 6D 42 80 00 30 F0 B2 B0 \r
+20 00 86 1E 14 20 B0 13 12 F4 4C 93 10 20 A2 B2 \r
+D8 1E 0D 24 1F 42 BA 1E 0F 93 05 20 B0 13 F4 B1 \r
+4C 93 03 24 10 01 2F 93 02 20 80 00 C6 E2 10 01 \r
+4D 93 03 20 32 C2 03 43 FF 3F 0F 42 32 C2 03 43 \r
+4D 4D B2 B0 10 00 02 0F FC 27 F2 40 BF 00 13 0F \r
+1C 53 DC 42 22 0F FF FF 1D 83 F3 23 02 4F 10 01 \r
+CF 0C FF B0 80 FF 0C 00 02 20 6C 43 10 01 CF 9D \r
+0D 00 0C 20 B0 13 DE F2 CD 0C 1C 43 0C 5F 2E 42 \r
+B0 13 7C ED 0C 93 02 20 4C 43 10 01 5C 43 10 01 \r
+82 93 D0 1E 09 20 82 93 CE 1E 06 20 B2 40 04 03 \r
+CE 1E B2 40 02 01 D0 1E B0 13 AC F1 C2 4C D7 1E \r
+4C 93 FA 27 3C 40 D4 1E 0D 43 1E 43 80 00 CC F2 \r
+31 80 06 00 81 43 02 00 D1 4C 05 00 04 00 CF 0C \r
+3F 50 06 00 81 4F 00 00 1D 4C 02 00 2E 42 0E 5C \r
+2F 4C CC 01 2C 53 B0 13 FA C6 31 50 06 00 10 01 \r
+0A 14 CA 0C 3F 40 CF 00 5F FA 0C 00 5F D2 C8 1E \r
+CA 4F 0C 00 2C 43 0C 5A B0 13 46 BF 4C 93 02 20 \r
+0C 43 02 3C 3C 40 09 00 CA 43 00 00 0A 16 10 01 \r
+7C 40 40 00 B0 13 0E E0 5C 53 7C 90 4F 00 FA 2B \r
+C2 43 8C 1C F2 40 06 00 8D 1C F2 40 05 00 8E 1C \r
+C2 43 8F 1C B2 40 00 80 90 1C C2 43 92 1C 10 01 \r
+7C 90 80 00 09 28 4C 4C 3C 80 00 01 2D 43 B0 13 \r
+9C E9 3C 80 4A 00 04 3C 4C 4C 5C 03 3C 80 4A 00 \r
+3C 90 80 FF 02 34 3C 40 80 FF 8C 11 10 01 92 C3 \r
+22 03 F2 F0 DF 00 03 02 F2 F0 1F 00 02 02 A2 C3 \r
+22 03 F2 D0 20 00 05 02 F2 D0 E0 00 04 02 A2 D3 \r
+24 03 92 D3 24 03 D2 43 F5 1E 10 01 B2 F0 FF FD \r
+36 0F 7C 40 36 00 B0 13 EA CF 7C 40 3D 00 B0 13 \r
+EA CF 7C B0 F0 FF F9 23 7C 40 3A 00 B0 13 EA CF \r
+B2 F0 FF FD 32 0F 10 01 C2 93 59 1E 0E 20 B0 13 \r
+86 A8 B0 13 0E CD 0C 93 0C 20 B0 13 2E EE B0 13 \r
+DE F2 B0 13 34 ED B0 13 B8 EF D2 43 59 1E 80 00 \r
+6C B7 10 01 4D 93 13 24 4D 4D 0E 43 5F 42 92 1C \r
+7F 90 80 00 09 2C CB 0F 5B 53 C2 4B 92 1C CB 0E \r
+0B 5C 4F 4F EF 4B 93 1C 1E 53 1D 83 EF 23 10 01 \r
+5C 93 13 20 0C 42 32 C2 03 43 2E 43 3F 40 00 1C \r
+CF 93 00 00 05 24 5D 9F 01 00 02 2C DF 83 01 00 \r
+3F 50 23 00 1E 83 F4 23 02 4C 10 01 0B 43 0D 93 \r
+03 34 3D E3 1D 53 1B D3 0C 93 03 34 3C E3 1C 53 \r
+3B E3 B0 13 04 F2 1B B3 02 24 3C E3 1C 53 2B B3 \r
+02 24 3E E3 1E 53 10 01 4C 4C 3D 40 1C 00 B0 13 \r
+1A F2 CF 0C 1F 52 7A FA EF B2 1A 00 03 24 0F 43 \r
+0D 43 05 3C 1C 52 7A FA 2F 4C 1D 4C 02 00 CC 0F \r
+10 01 C2 93 AC 1E 09 24 1F 42 A6 1E DF 83 13 00 \r
+1F 42 A6 1E CF 93 13 00 02 24 5C 43 10 01 8F 43 \r
+18 00 5D 43 B0 13 92 E0 4C 43 10 01 82 4C 1A 1F \r
+82 93 50 03 02 20 0F 43 05 3C 1F 42 50 03 1F 92 \r
+50 03 FB 23 0F 5C 82 4F 58 03 92 C3 48 03 B2 D0 \r
+10 00 48 03 10 01 31 40 FC 2B 00 18 F2 40 36 F5 \r
+06 1F 00 18 F2 40 36 F5 0A 1F B0 13 12 F5 0C 93 \r
+02 24 B0 13 EA DD 0C 43 B0 13 76 E6 B0 13 16 F5 \r
+5D 93 12 20 C2 93 EB 1E 0A 24 E2 93 EB 1E 0C 2C \r
+7C 40 5A 00 3D 40 F2 F8 5E 43 80 00 D6 BC 7C 40 \r
+5A 00 3D 40 F8 F8 F8 3F 10 01 92 B3 44 01 FD 23 \r
+32 C2 03 43 B2 40 00 A5 44 01 B2 40 40 A5 40 01 \r
+8C 4D 00 00 B2 40 00 A5 40 01 B2 40 10 A5 44 01 \r
+32 D2 10 01 B2 D0 06 00 06 0A B2 40 1D 7B 00 0A \r
+B2 40 ED 00 04 0A F2 D0 E0 00 4A 02 F2 D0 E0 00 \r
+44 02 B2 43 0A 0A B2 40 FF 00 0C 0A 10 01 C2 93 \r
+FE 1D 11 24 C2 93 76 1E 0E 24 B0 13 B6 F4 4C 93 \r
+0A 20 B0 13 76 F4 C2 43 76 1E F2 F0 BF 00 1B 02 \r
+F2 F0 BF 00 1D 02 10 01 F2 C2 03 02 F2 C2 05 02 \r
+D2 B3 8C 1C 0B 20 E2 B3 8C 1C 02 20 80 00 B8 E3 \r
+92 D3 8A 1E B2 D0 00 01 8A 1E 10 01 80 00 0C E7 \r
+10 01 3F 40 41 1E 0E 43 2B 43 6B 9F 07 20 CF 9C \r
+0B 00 04 20 CD 4E 00 00 5C 43 10 01 3F 50 0C 00 \r
+1E 53 2E 93 F1 3B 4C 43 10 01 21 83 CD 01 B0 13 \r
+42 EB 4C 93 0B 24 6C 41 3D 40 0C 00 B0 13 1A F2 \r
+EC 93 41 1E 03 20 3C 50 41 1E 01 3C 0C 43 21 53 \r
+10 01 82 93 EE 1E 09 20 82 93 EC 1E 06 20 B2 40 \r
+08 07 EC 1E B2 40 06 05 EE 1E 00 18 C2 43 F0 1E \r
+B0 13 AC F1 C2 4C F4 1E 10 01 3C 40 03 00 5C F2 \r
+20 01 7C 90 03 00 03 2C 5C 53 B0 13 A4 DD 6C 92 \r
+03 28 5C 83 B0 13 E0 EB 7C 90 03 00 EE 23 10 01 \r
+F2 40 A5 00 21 01 4E 4C 4F 4E 8F 10 0E 5F 3E 50 \r
+00 44 82 4E 26 01 92 B3 2C 01 FD 27 C2 4C 20 01 \r
+C2 43 21 01 10 01 3F 40 13 00 6F 9C 09 24 5F 4C \r
+0C 00 1F 83 07 24 1F 83 07 20 B0 13 10 D2 04 3C \r
+DC 43 0C 00 B0 13 78 AF 0C 43 10 01 F2 F0 E0 00 \r
+05 02 F2 F0 E0 00 03 02 F2 D0 1F 00 07 02 F2 F0 \r
+E0 00 19 02 F2 F0 E0 00 1D 02 F2 D0 1F 00 1B 02 \r
+10 01 1A 14 39 40 11 00 3F 40 BA 1D 3A 40 36 FA \r
+3C 4A B0 13 E8 ED 2F 52 8F 4C FC FF 8F 4D FE FF \r
+19 83 F6 23 19 16 10 01 4D 93 03 24 5F 4C 0A 00 \r
+02 3C 5F 4C 09 00 4F 93 06 24 CC 93 00 00 03 24 \r
+7F 90 20 00 02 2C 2C 43 10 01 0C 43 10 01 3C 40 \r
+E2 1E 0D 43 2E 42 B0 13 CC F2 C2 93 EA 1E 09 20 \r
+3C 40 E6 1E 3D 40 70 FA 2E 42 B0 13 BA F2 D2 43 \r
+EA 1E 10 01 A2 B3 88 1E 03 24 5C 43 B0 13 AE C5 \r
+B2 B2 88 1E 02 24 B0 13 54 B9 92 B3 88 1E 02 24 \r
+B0 13 A8 D1 82 43 88 1E 10 01 B2 B0 20 00 86 1E \r
+0E 20 B0 13 FA F3 4C 93 0A 20 F2 C2 03 02 F2 C2 \r
+05 02 F2 C2 1B 02 B0 13 F4 CA F2 D2 1B 02 10 01 \r
+4C 4C 3D 40 1C 00 B0 13 1A F2 CF 0C 1F 52 7A FA \r
+EF B2 1A 00 02 24 2C 43 10 01 1C 52 7A FA 1C 4C \r
+18 00 10 01 CE 0C 6D 4E 5D 92 7E FA 0C 24 7C 40 \r
+09 00 B0 13 DC E5 2D 42 3F 40 2C 1E 1F 53 FF 4E \r
+FF FF 1D 83 FB 23 10 01 0A 14 0A 42 32 C2 03 43 \r
+D2 93 00 1E 08 24 B0 13 F8 EE 7C 40 32 00 B0 13 \r
+EA CF D2 43 00 1E 02 4A 0A 16 10 01 0E 93 02 20 \r
+0C 43 10 01 1D 83 1C 83 1D 53 6B 4D 1C 53 6F 4C \r
+4F 9B 02 20 1E 83 F8 23 4B 4B 4C 4F 0C 8B 10 01 \r
+0A 14 CA 0C 5D 42 95 1E B0 13 A0 E7 4C 93 04 20 \r
+B0 13 BE F3 1C 43 04 3C CC 0A B0 13 E2 F3 0C 43 \r
+0A 16 10 01 82 43 96 1E 82 43 98 1E E2 42 A0 1E \r
+F2 40 1E 00 A1 1E C2 43 A2 1E C2 43 9F 1E 82 43 \r
+9A 1E 82 43 9C 1E 10 01 0D 4C 0D 93 0E 24 3B 40 \r
+8F 00 1B 83 5D 02 FD 2B 4C 4D 8C 10 8D 10 4D 4D \r
+8B 10 0D DB 12 C3 5D 00 5C 00 10 01 82 43 90 03 \r
+B2 40 C0 00 92 03 B2 D0 10 00 80 03 92 B3 82 03 \r
+FD 27 B2 F0 EF FF 80 03 92 C3 82 03 10 01 D2 93 \r
+00 1E 0D 20 7C 40 36 00 B0 13 EA CF 7C 40 3D 00 \r
+B0 13 EA CF 7C B0 F0 FF F9 23 E2 43 00 1E 10 01 \r
+5F 42 A0 1E 4F 93 09 24 7F 90 0D 00 02 2C CC 0F \r
+10 01 CC 0F 7C 80 0C 00 10 01 3C 40 0C 00 4C 5F \r
+10 01 4C 43 B0 13 10 ED 0C 93 09 24 1C 83 09 20 \r
+B0 13 C6 F4 C2 4C C2 1E 92 43 BC 1E 10 01 80 00 \r
+C6 E2 10 01 0A 14 CA 0C 5D 42 D7 1E B0 13 A0 E7 \r
+4C 93 04 20 B0 13 BE F3 1C 43 03 3C CC 0A B0 13 \r
+06 EC 0A 16 10 01 02 12 32 C2 03 43 82 4C D0 04 \r
+82 4D D2 04 82 4E E0 04 82 4F E2 04 1C 42 E4 04 \r
+1D 42 E6 04 32 41 10 01 0A 14 5C 43 B0 13 02 CF \r
+CA 0C 0A 93 07 24 2C 43 0C 5A B0 13 CA F3 CC 0A \r
+B0 13 52 C9 0A 16 10 01 D2 93 00 1E 09 24 F2 90 \r
+03 00 00 1E 08 20 B0 13 EC E8 E2 43 00 1E 10 01 \r
+32 C2 03 43 FF 3F 10 01 D2 93 00 1E 09 24 F2 90 \r
+03 00 00 1E 08 24 F2 40 03 00 00 1E 80 00 C2 F1 \r
+32 C2 03 43 FF 3F 10 01 1C 42 82 1E 3C B0 00 80 \r
+0D 7D 3D E3 3E 40 52 00 0F 43 B0 13 B6 EE 3E 40 \r
+19 00 0F 43 80 00 12 E1 B0 13 FA F3 4C 93 0A 24 \r
+4C 43 1F 42 54 03 1F 82 50 03 3F 90 F5 01 03 28 \r
+5C 43 10 01 5C 43 10 01 C2 43 C8 1E 00 18 C2 43 \r
+CA 1E B0 13 DE F2 82 4C C6 1E B0 13 AC F1 C2 4C \r
+C4 1E 4C 93 FA 27 10 01 B2 F0 CF FF 80 03 F2 F0 \r
+7F 00 03 02 F2 F0 7F 00 0B 02 B2 F0 EF FF 82 03 \r
+B0 13 AE F4 80 00 80 F4 D2 92 7E FA 2C 1E 08 24 \r
+D2 43 2A 1E 7C 40 07 00 7D 40 07 00 80 00 DC E5 \r
+32 C2 03 43 FF 3F B0 13 EC E8 7C 40 0A 00 5D 42 \r
+82 FA B0 13 DC E5 F2 90 03 00 00 1E 02 20 80 00 \r
+C2 F1 10 01 3F 40 3E 00 0E 42 32 C2 03 43 B0 13 \r
+0C EE 02 4E C2 93 23 1E 03 20 1F 83 3F 93 F4 23 \r
+10 01 CF 0C 82 4F 54 03 92 C3 44 03 B0 13 B2 F3 \r
+2F 83 0F 8C 3F 90 00 80 02 28 92 D3 44 03 10 01 \r
+CF 0D 7C 90 2A 00 0A 2C 4E 4C 5D 4E C2 F9 4C 4C \r
+5C 02 1C 4C 16 1D CE 0D 80 00 2E D5 10 01 0C 9D \r
+02 2C 80 00 BA F2 0C 5E 0D 5E 0E 93 06 24 1D 83 \r
+1C 83 EC 4D 00 00 1E 83 FA 23 10 01 CD 0C C2 93 \r
+EA 1E 02 24 4C 43 10 01 3C 40 E6 1E 2E 42 B0 13 \r
+BA F2 D2 43 EA 1E 5C 43 10 01 B0 13 96 F3 4C 93 \r
+08 20 4C 43 4D 43 B0 13 30 F0 5C 43 5D 43 80 00 \r
+30 F0 4C 43 FB 3F 3C 40 00 1C 0D 43 3E 40 46 00 \r
+B0 13 CC F2 3C 40 46 1C 0D 43 3E 40 46 00 80 00 \r
+CC F2 0A 14 CF 0C CC 0D 2A 43 0F 93 05 20 B0 13 \r
+6C F0 4C 93 01 24 0A 43 CC 0A 0A 16 10 01 21 82 \r
+CF 0C CC 0D A1 4F 00 00 91 4F 02 00 02 00 CD 01 \r
+2E 42 B0 13 4E F0 21 52 10 01 1F 42 A6 1E 5C 4F \r
+11 00 6C 93 02 2C 3C 42 10 01 5C 53 4C 5C 4C 5C \r
+4C 4C 10 01 7C 90 03 00 07 2C 4C 4C 5D 4C 86 FA \r
+7C 40 3E 00 80 00 DC E5 32 C2 03 43 FF 3F 0C 93 \r
+0A 24 5C 0F 1C 53 0F 42 32 C2 03 43 B0 13 0C EE \r
+02 4F 1C 83 F8 23 10 01 B0 13 AC F1 7C F0 0F 00 \r
+5C 53 4E 4C 1C 42 28 1E B0 13 2E F1 1E 83 FA 23 \r
+10 01 B2 90 06 00 0E 07 08 20 92 42 20 07 44 1F \r
+D2 43 46 1F B1 C0 D0 00 00 00 00 13 1C 42 7E 1E \r
+CF 0C 5F 0A 0C 5F 3D 40 05 00 B0 13 9C E9 3C 50 \r
+40 01 10 01 5D 42 F4 1E B0 13 A0 E7 4C 93 02 24 \r
+0C 43 10 01 B0 13 BE F3 1C 43 10 01 5C 42 22 1E \r
+3D 40 6D 00 B0 13 1A F2 7C 50 43 00 C2 4C 22 1E \r
+10 01 B2 F0 FF FD 32 0F 7C 40 34 00 B0 13 EA CF \r
+B2 D0 00 02 36 0F 10 01 0F 42 32 C2 03 43 7C D0 \r
+C0 00 C2 4C 13 0F 5C 42 22 0F 02 4F 10 01 82 43 \r
+BA 1E 82 43 BE 1E 82 43 C0 1E 82 43 BC 1E C2 43 \r
+C2 1E 10 01 0E 43 0F 4C 1C 43 5F 02 0E 6E 0E 9D \r
+01 28 0E 8D 0C 6C F9 2B 10 01 02 12 32 C2 03 43 \r
+82 4C C0 04 82 4D C8 04 1C 42 CA 04 32 41 10 01 \r
+B2 40 FF 7F 52 03 B2 D0 10 00 42 03 B2 D0 24 01 \r
+40 03 10 01 5F 42 FE 1E 5F 83 D2 83 FE 1E 0F 93 \r
+02 20 80 00 98 EF 10 01 5D 93 07 20 7C 40 5B 00 \r
+3D 40 08 F9 5E 43 80 00 D6 BC 10 01 5D 93 07 20 \r
+7C 40 5A 00 3D 40 00 F9 5E 43 80 00 D6 BC 10 01 \r
+3C 80 05 00 05 24 3C 80 05 00 02 24 4C 43 10 01 \r
+5C 43 10 01 B2 40 D9 07 34 1F F2 42 32 1F D2 43 \r
+31 1F C2 43 30 1F 10 01 1F 42 50 03 82 4F 22 1F \r
+1F 92 50 03 F9 23 80 00 72 D4 CF 0C 0E 93 05 24 \r
+1F 53 FF 4D FF FF 1E 83 FB 23 10 01 0E 93 06 24 \r
+4D 4D 1C 53 CC 4D FF FF 1E 83 FB 23 10 01 C2 93 \r
+EA 1E 03 24 3C 40 E6 1E 10 01 3C 40 70 FA 10 01 \r
+0D 93 02 20 0C 93 04 24 82 4C EC 1E 82 4D EE 1E \r
+10 01 0D 93 02 20 0C 93 04 24 82 4C CE 1E 82 4D \r
+D0 1E 10 01 B0 13 A8 E6 B2 F0 EF FF 32 0F B2 D0 \r
+10 00 36 0F 10 01 A2 43 FC 1E 92 C3 44 03 B2 D0 \r
+10 00 44 03 10 01 A2 D2 80 03 82 43 80 03 B2 D0 \r
+00 02 80 03 10 01 CE 0C 3C 40 E8 03 B0 13 2E F1 \r
+1E 83 FA 23 10 01 82 43 32 0F 82 43 36 0F B0 13 \r
+A8 E6 80 00 66 F3 7C 40 36 00 B0 13 2E C8 7C 40 \r
+39 00 80 00 2E C8 4F 43 C2 93 30 1F 01 20 5F 43 \r
+C2 4F 30 1F 10 01 4F 43 C2 93 9F 1E 01 20 5F 43 \r
+C2 4F 9F 1E 10 01 4C 43 F2 90 0C 00 A0 1E 01 2C \r
+5C 43 10 01 F2 40 0F 00 2A 1F B2 40 2C 01 2C 1F \r
+10 01 1C 42 50 03 1C 92 50 03 FB 23 10 01 C2 93 \r
+24 1E 02 24 D2 43 23 1E 10 01 3D 40 01 1E 3E 40 \r
+21 00 80 00 BA F2 5C 43 B0 13 44 D6 6C 43 80 00 \r
+44 D6 DC 93 0C 00 02 20 80 00 88 DF 10 01 B0 13 \r
+BE F4 B2 40 2B 5A 5C 01 10 01 4C 43 A2 93 BA 1E \r
+01 20 5C 43 10 01 4C 43 92 93 BA 1E 01 20 5C 43 \r
+10 01 4C 43 82 93 72 1D 01 24 5C 43 10 01 CF 0C \r
+CC 0D CD 0F 2E 42 80 00 4E F0 CD 0C 3C 40 E2 1E \r
+2E 42 80 00 BA F2 7C 40 03 00 7D 40 0B 00 80 00 \r
+5A D8 5C 93 02 20 CC 0D 10 01 CC 0E 10 01 1C 42 \r
+44 03 7C F0 10 00 10 01 B2 F0 EF FF 44 03 80 00 \r
+44 E6 B0 13 AC F1 C2 4C 4A 1F 10 01 B0 13 AC F1 \r
+C2 4C 95 1E 10 01 7C 40 03 00 4D 43 80 00 5A D8 \r
+C2 43 FE 1E C2 43 04 1F 10 01 1C 42 14 1D 8C 10 \r
+5C F3 10 01 1C 42 14 1D 5C 0F 5C F3 10 01 5C 42 \r
+20 1F 8C 11 10 01 4C 5C C2 4C AB 1E 10 01 B2 F0 \r
+EF FF 48 03 10 01 1C 43 5C F2 8C 1C 10 01 32 D0 \r
+D8 00 03 43 10 01 5C 42 3C 1F 10 01 C2 4C AA 1E \r
+10 01 C2 4C AC 1E 10 01 4D 43 80 00 3E D1 92 D3 \r
+44 03 10 01 92 C3 44 03 10 01 5C 42 00 1E 10 01 \r
+5C 42 76 1E 10 01 82 43 D8 1E 10 01 CC 43 00 00 \r
+10 01 3C 40 7E FA 10 01 82 43 72 1D 10 01 80 00 \r
+2C AE 1C 43 10 01 03 43 FF 3F 2C 43 10 01 2C 43 \r
+10 01 4C 43 10 01 6C 43 10 01 0C 43 10 01 0C 43 \r
+10 01 03 43 10 01 10 01 10 01 30 30 30 30 30 31 \r
+30 30 32 30 30 33 30 30 34 30 30 35 30 30 36 30 \r
+30 37 30 30 38 30 30 39 30 31 30 30 31 31 30 31 \r
+32 30 31 33 30 31 34 30 31 35 30 31 36 30 31 37 \r
+30 31 38 30 31 39 30 32 30 30 32 31 30 32 32 30 \r
+32 33 30 32 34 30 32 35 30 32 36 30 32 37 30 32 \r
+38 30 32 39 30 33 30 30 33 31 30 33 32 30 33 33 \r
+30 33 34 30 33 35 30 33 36 30 33 37 30 33 38 30 \r
+33 39 30 34 30 30 34 31 30 34 32 30 34 33 30 34 \r
+34 30 34 35 30 34 36 30 34 37 30 34 38 30 34 39 \r
+30 35 30 30 35 31 30 35 32 30 35 33 30 35 34 30 \r
+35 35 30 35 36 30 35 37 30 35 38 30 35 39 30 36 \r
+30 30 36 31 30 36 32 30 36 33 30 36 34 30 36 35 \r
+30 36 36 30 36 37 30 36 38 30 36 39 30 37 30 30 \r
+37 31 30 37 32 30 37 33 30 37 34 30 37 35 30 37 \r
+36 30 37 37 30 37 38 30 37 39 30 38 30 30 38 31 \r
+30 38 32 30 38 33 30 38 34 30 38 35 30 38 36 30 \r
+38 37 30 38 38 30 38 39 30 39 30 30 39 31 30 39 \r
+32 30 39 33 30 39 34 30 39 35 30 39 36 30 39 37 \r
+30 39 38 30 39 39 31 30 30 31 30 31 31 30 32 31 \r
+30 33 31 30 34 31 30 35 31 30 36 31 30 37 31 30 \r
+38 31 30 39 31 31 30 31 31 31 31 31 32 31 31 33 \r
+31 31 34 31 31 35 31 31 36 31 31 37 31 31 38 31 \r
+31 39 31 32 30 31 32 31 31 32 32 31 32 33 31 32 \r
+34 31 32 35 31 32 36 31 32 37 31 32 38 31 32 39 \r
+31 33 30 31 33 31 31 33 32 31 33 33 31 33 34 31 \r
+33 35 31 33 36 31 33 37 31 33 38 31 33 39 31 34 \r
+30 31 34 31 31 34 32 31 34 33 31 34 34 31 34 35 \r
+31 34 36 31 34 37 31 34 38 31 34 39 31 35 30 31 \r
+35 31 31 35 32 31 35 33 31 35 34 31 35 35 31 35 \r
+36 31 35 37 31 35 38 31 35 39 31 36 30 31 36 31 \r
+31 36 32 31 36 33 31 36 34 31 36 35 31 36 36 31 \r
+36 37 31 36 38 31 36 39 31 37 30 31 37 31 31 37 \r
+32 31 37 33 31 37 34 31 37 35 31 37 36 31 37 37 \r
+31 37 38 31 37 39 31 38 30 00 01 80 40 20 10 08 \r
+84 42 21 90 48 A4 52 29 14 0A 85 C2 61 B0 58 AC \r
+D6 6B 35 9A CD 66 33 99 4C A6 53 A9 54 2A 95 CA \r
+E5 F2 79 3C 9E CF 67 B3 D9 6C B6 5B 2D 16 0B 05 \r
+82 41 A0 50 28 94 4A A5 D2 69 34 1A 8D 46 23 91 \r
+C8 E4 72 39 1C 8E C7 E3 F1 F8 FC FE FF 7F 3F 1F \r
+0F 07 83 C1 E0 70 38 9C CE E7 F3 F9 7C BE DF 6F \r
+37 9B 4D 26 13 89 44 22 11 88 C4 62 31 98 CC E6 \r
+73 B9 5C AE D7 EB 75 BA DD 6E B7 DB 6D 36 1B 0D \r
+06 03 81 C0 60 30 18 8C C6 63 B1 D8 EC F6 7B 3D \r
+1E 8F 47 A3 D1 E8 F4 7A BD 5E AF 57 AB 55 AA D5 \r
+EA F5 FA FD 7E BF 5F 2F 17 8B 45 A2 51 A8 D4 6A \r
+B5 DA ED 76 3B 1D 0E 87 C3 E1 F0 78 BC DE EF 77 \r
+BB 5D 2E 97 CB 65 B2 59 2C 96 4B 25 92 49 24 12 \r
+09 04 02 01 80 40 20 10 08 84 42 21 90 48 A4 52 \r
+29 14 0A 85 C2 61 B0 58 AC D6 6B 35 9A CD 66 33 \r
+99 4C A6 53 A9 54 2A 95 CA E5 86 F3 00 00 38 F5 \r
+00 00 86 AB 00 00 94 F4 00 00 6C F8 38 F5 00 00 \r
+38 F5 00 00 00 BC 00 00 94 F4 00 00 7E F8 38 F5 \r
+00 00 38 F5 00 00 42 BA 00 00 94 F4 00 00 90 F8 \r
+3E E7 00 00 F6 F4 00 00 44 D3 00 00 94 F4 00 00 \r
+5A F8 76 F3 00 00 38 F5 00 00 7C BE 00 00 8A F4 \r
+00 00 B4 F8 18 EB 00 00 38 F5 00 00 58 F2 00 00 \r
+94 F4 00 00 C6 F8 EA EC 00 00 38 F5 00 00 6C F2 \r
+00 00 94 F4 00 00 D8 F8 B4 D9 00 00 38 F5 00 00 \r
+70 EA 00 00 94 F4 00 00 A2 F8 20 20 44 4F 4E 45 \r
+00 00 20 43 4F 4E 46 00 20 52 46 42 53 4C 00 00 \r
+20 20 53 59 4E 43 00 00 20 44 4C 4F 47 00 46 41 \r
+49 4C 00 00 45 52 52 00 30 30 30 30 30 30 30 00 \r
+2D 2D 2D 00 20 52 41 4D 00 00 20 4F 46 46 00 00 \r
+20 20 4F 4E 00 00 20 4E 4F 4D 45 4D 00 00 4C 4F \r
+42 41 54 54 00 00 20 20 4F 50 45 4E 00 00 20 20 \r
+4C 4F 3F 54 00 00 02 1B 01 1E 17 3C 18 10 06 1E \r
+08 05 03 47 0B 08 0C 00 0D 10 0E B0 0F 71 10 7B \r
+11 83 12 13 13 22 14 F8 15 42 19 1D 1A 1C 1B C7 \r
+1C 00 1D B2 21 B6 22 10 23 EA 24 2A 25 00 26 1F \r
+2C 81 2D 35 2E 09 F5 60 B6 F2 63 D3 D7 70 F7 F3 \r
+00 00 00 00 00 86 00 77 C7 95 E6 97 17 F3 67 05 \r
+F0 87 85 75 46 C6 37 F5 06 D3 87 C4 C4 02 67 E3 \r
+B6 00 03 01 04 08 10 80 80 80 80 20 40 02 01 80 \r
+04 02 10 20 40 08 08 80 08 08 08 08 F7 F7 F7 F7 \r
+20 40 04 80 7F 7F 7F 7F 7F 10 01 80 2F 1E 1B 07 \r
+37 B2 0A 04 00 00 00 0C 00 10 AA 56 4D 3B 15 11 \r
+F8 57 07 0C 10 1D 1C C7 10 B0 FF FF F9 B6 10 EA \r
+2A 00 1F 00 67 FF 00 00 6F 00 1C 02 DD 03 B1 05 \r
+9D 07 A2 09 C4 0B 07 0E 6E 10 01 13 C6 15 C8 18 \r
+11 1C B5 1F CC 23 07 04 F5 03 E8 03 B6 03 84 03 \r
+52 03 20 03 EE 02 BC 02 8A 02 58 02 26 02 F4 01 \r
+C2 01 90 01 5E 01 2C 01 A0 ED 00 00 94 EE 00 00 \r
+94 F1 00 00 2E F5 00 00 2A F5 00 00 D4 E4 00 00 \r
+79 56 34 12 02 01 01 01 00 00 5A 1E 5A 1E FF FF \r
+FF FF 00 32 50 6E 0F 27 8D 00 02 00 00 \r
+@fa8e\r
+01 00 1C 1F 00 00 01 00 E0 1E 00 00 01 00 E1 1E \r
+0A 00 54 00 16 1D 20 0A 20 0A 20 0A 20 0A 24 0A \r
+2A 0A 29 0A 27 0A 26 0A 24 0A 24 0A 26 0A 26 0A \r
+24 0A 26 0A 24 0A 26 0A 26 0A 26 0A 21 0A 22 0A \r
+20 0A 23 0A 24 0A 25 0A 26 0A 21 0A 22 0A 23 0A \r
+25 0A 20 0A 20 0A 24 0A 2B 0A 2B 0A 2A 0A 29 0A \r
+28 0A 27 0A 20 0A 24 0A 28 0A 02 00 40 1F 00 00 \r
+02 00 42 1F 00 00 01 00 59 1E 00 00 01 00 00 1E \r
+00 00 01 00 22 1E 00 00 01 00 23 1E 00 00 01 00 \r
+24 1E 00 00 02 00 26 1E 00 00 02 00 28 1E 00 00 \r
+01 00 2A 1E 00 00 01 00 2C 1E FF 00 04 00 30 1E \r
+00 00 00 00 04 00 34 1E 00 00 00 00 04 00 38 1E \r
+00 00 00 00 01 00 EA 1E 00 00 01 00 C4 1E 00 00 \r
+02 00 C6 1E 00 00 01 00 C8 1E 00 00 04 00 CA 1E \r
+00 00 00 00 01 00 3C 1E 01 00 01 00 95 1E 00 00 \r
+02 00 48 1F 00 00 01 00 4A 1F 00 00 04 00 CE 1E \r
+00 00 00 00 01 00 D2 1E 00 00 01 00 D6 1E 00 00 \r
+01 00 D7 1E 00 00 04 00 EC 1E 00 00 00 00 04 00 \r
+F0 1E 00 00 00 00 01 00 F4 1E 00 00 01 00 AA 1E \r
+00 00 01 00 AB 1E 00 00 01 00 AC 1E 00 00 01 00 \r
+AD 1E 00 00 02 00 F6 1E 00 00 02 00 F8 1E 00 00 \r
+01 00 FA 1E 00 00 01 00 FB 1E 00 00 01 00 20 1F \r
+00 00 02 00 22 1F 00 00 02 00 38 1F 00 00 01 00 \r
+3A 1F 00 00 00 00 \r
+@ffe0\r
+F6 A4 \r
+@ffea\r
+64 E4 60 D9 C4 A6 62 F1 \r
+@fffe\r
+46 EA \r
+q\r
diff --git a/chronos-ti/Recovery/Chronos Watch/Applications/Recovery_ez430_chronos_datalogger_868MHz.txt b/chronos-ti/Recovery/Chronos Watch/Applications/Recovery_ez430_chronos_datalogger_868MHz.txt
new file mode 100755 (executable)
index 0000000..fc17c09
--- /dev/null
@@ -0,0 +1,1514 @@
+@9e00\r
+5A 14 31 80 1A 00 CA 0E B0 13 DA E6 0E 43 3F 40 \r
+C8 42 B0 13 C4 C8 81 4C 12 00 81 4D 14 00 CC 0A \r
+B0 13 E8 ED 0E 43 3F 40 20 41 B0 13 C4 C8 81 4C \r
+16 00 81 4D 18 00 36 40 11 00 37 40 BA 1D 0A 43 \r
+28 47 19 47 02 00 CC 08 CD 09 1E 41 12 00 1F 41 \r
+14 00 B0 13 36 DC 0C 93 0A 38 81 48 08 00 81 49 \r
+0A 00 27 52 1A 53 16 83 EB 23 4A 4A 03 3C 4A 4A \r
+0A 93 7E 24 3A 90 0F 00 3D 38 3A 90 0F 00 23 24 \r
+B0 13 86 A0 1E 42 FA 1D 1F 42 FC 1D B0 13 C4 B0 \r
+C9 0C CA 0D 1C 42 FA 1D 1D 42 FC 1D 1E 42 F6 1D \r
+1F 42 F8 1D B0 13 3A A0 1C 42 34 FA 1C 82 32 FA \r
+B0 13 4C A0 1C 42 34 FA B0 13 60 A0 81 4C 00 00 \r
+81 4D 02 00 73 3C B0 13 24 A0 C9 0C CA 0D 1C 42 \r
+F6 1D 1D 42 F8 1D 1E 41 08 00 1F 41 0A 00 B0 13 \r
+3A A0 1C 42 32 FA 1C 82 30 FA B0 13 4C A0 1C 42 \r
+30 FA E2 3F C9 0A 59 02 16 49 12 FA 5A 06 17 4A \r
+BA 1D 18 4A BC 1D B0 13 24 A0 C5 0C CA 0D B0 13 \r
+86 A0 CE 07 CF 08 B0 13 C4 B0 3E 40 34 80 3F 40 \r
+37 3A B0 13 10 A0 CC 05 CD 0A B0 13 40 C2 C5 0C \r
+CA 0D CC 07 CD 08 1E 41 08 00 1F 41 0A 00 B0 13 \r
+90 A0 CC 05 CD 0A B0 13 C4 C8 C8 0C CA 0D 1C 49 \r
+14 FA 0C 86 B0 13 0A E5 CE 0C CF 0D CC 08 CD 0A \r
+B0 13 40 C2 C9 0C CA 0D CC 06 B0 13 60 A0 A6 3F \r
+B0 13 86 A0 1E 42 BA 1D 1F 42 BC 1D B0 13 C4 B0 \r
+C9 0C CA 0D 1C 42 BE 1D 1D 42 C0 1D 1E 42 BA 1D \r
+1F 42 BC 1D B0 13 3A A0 1C 42 16 FA 1C 82 14 FA \r
+B0 13 56 A0 81 4C 00 00 81 4D 02 00 2C 41 1D 41 \r
+02 00 B0 13 6A A0 3E 40 F4 FD 3F 40 D4 3B B0 13 \r
+10 A0 1C 41 16 00 1D 41 18 00 B0 13 C4 C8 81 4C \r
+04 00 81 4D 06 00 1C 41 04 00 1D 41 06 00 B0 13 \r
+6A A0 2E 41 1F 41 02 00 B0 13 40 C2 81 4C 0C 00 \r
+81 4D 0E 00 1C 41 0C 00 1D 41 0E 00 B0 13 76 DE \r
+81 4C 10 00 1C 41 10 00 31 50 1A 00 55 16 10 01 \r
+B0 13 40 C2 CE 0C CF 0D 0C 43 3D 40 80 3F B0 13 \r
+90 A0 10 01 1C 41 16 00 1D 41 18 00 1E 41 0C 00 \r
+1F 41 0E 00 B0 13 C4 B0 10 01 B0 13 90 A0 CC 09 \r
+CD 0A B0 13 C4 C8 C9 0C CA 0D 10 01 B0 13 56 A0 \r
+C9 0C CA 0D 10 01 B0 13 78 A0 B0 13 40 C2 10 01 \r
+B0 13 78 A0 B0 13 CA B0 10 01 3E 40 E7 6F 3F 40 \r
+63 3B B0 13 40 C2 10 01 B0 13 0A E5 CE 0C CF 0D \r
+CC 09 CD 0A 10 01 1C 41 16 00 1D 41 18 00 10 01 \r
+B0 13 C4 B0 CE 0C CF 0D 10 01 4A 14 31 82 B0 13 \r
+B2 F3 C8 0C CF 08 3F 50 FF 7F 81 4F 06 00 91 41 \r
+06 00 04 00 82 43 A8 1E 4A 43 49 43 4C 49 B0 13 \r
+0C A3 1F 4C 18 00 1F 83 1D 24 1F 83 14 24 D2 B3 \r
+36 1F 47 24 1E 42 B0 1E 1F 42 B2 1E 3E F3 3F F0 \r
+FF 00 1F 9C 02 00 3D 20 2E 9C 3B 20 D2 C3 36 1F \r
+82 43 A8 1E 36 3C 5A 53 B0 13 50 DB 4C 93 31 24 \r
+C7 09 2F 3C B0 13 FA F0 C6 0C CC 09 B0 13 CC DF \r
+4C 93 0C 20 CC 09 CD 06 CE 08 B0 13 58 B5 1F 42 \r
+A6 1E AF 93 18 00 09 20 5A 53 07 3C 82 43 A8 1E \r
+E2 B2 36 1F 02 20 B0 13 A8 E5 1F 42 A6 1E 9F 93 \r
+18 00 0F 20 CF 01 3F 50 03 00 81 4F 00 00 CC 06 \r
+CD 01 3D 50 06 00 CE 01 2E 52 CF 01 2F 53 B0 13 \r
+08 DA 59 53 AB 27 4A 93 50 24 92 93 A8 1E 18 38 \r
+4C 47 B0 13 0C A3 CC 07 B0 13 8A C1 4C 93 10 24 \r
+5A 83 CF 01 3F 50 03 00 81 4F 00 00 7C 42 CD 01 \r
+3D 50 06 00 CE 01 2E 52 CF 01 2F 53 B0 13 08 DA \r
+4A 93 33 24 1F 42 A4 1E 0F 88 1F 93 2C 34 E2 B2 \r
+36 1F 0D 20 E2 D2 36 1F C2 93 AD 1E 04 20 B2 50 \r
+E0 7F A4 1E 20 3C B2 50 C0 53 A4 1E 1C 3C E2 C2 \r
+36 1F C2 93 AD 1E 03 24 3F 40 40 6C 02 3C 3F 40 \r
+20 00 82 5F A4 1E 49 43 4C 49 B0 13 0C A3 AC 93 \r
+18 00 07 20 CC 09 B0 13 F2 E9 4C 93 02 20 5A 83 \r
+04 24 59 53 F1 27 4A 93 0E 20 F2 F0 F9 00 36 1F \r
+91 91 06 00 04 00 02 24 0E 43 08 3C B0 13 58 F4 \r
+A2 43 FC 1E 70 3C E2 D3 36 1F 1E 43 1F 41 06 00 \r
+0F 88 0F 93 54 38 0E 93 3C 24 E2 B2 36 1F 16 20 \r
+1F 41 06 00 1F 82 A4 1E 3F 80 42 00 0F 93 31 38 \r
+F2 40 07 00 FA 1E C2 43 FB 1E F2 D0 18 00 36 1F \r
+92 42 A4 1E F6 1E A2 43 FC 1E 4B 3C 1F 41 06 00 \r
+0F 88 3F 80 42 00 1F 93 1C 38 F2 40 07 00 FA 1E \r
+C2 43 FB 1E F2 D0 18 00 36 1F 1F 41 06 00 1F 82 \r
+A4 1E 3F 80 42 00 0F 93 05 34 1F 41 06 00 3F 80 \r
+42 00 02 3C 1F 42 A4 1E 82 4F F6 1E 92 43 FC 1E \r
+28 3C D2 41 02 00 FA 1E D2 41 03 00 FB 1E 5F 42 \r
+36 1F 7F C2 7F D0 10 00 C2 4F 36 1F 92 41 06 00 \r
+F6 1E 92 41 04 00 F8 1E 82 43 FC 1E 12 3C D2 91 \r
+02 00 FA 1E 09 24 D2 41 02 00 FA 1E D2 41 03 00 \r
+FB 1E F2 D0 10 00 36 1F 92 41 04 00 F6 1E 92 43 \r
+FC 1E D2 C3 36 1F 31 52 46 16 10 01 3D 40 1C 00 \r
+B0 13 1A F2 1C 52 7A FA 82 4C A6 1E 10 01 6A 14 \r
+31 80 20 00 C8 0F C9 0D CA 0E 81 43 0C 00 81 43 \r
+0E 00 B0 13 0A E5 81 4C 14 00 81 4D 16 00 CC 09 \r
+CD 0A B0 13 DA E6 0E 43 3F 40 C8 42 B0 13 C4 C8 \r
+81 4C 18 00 81 4D 1A 00 CC 08 B0 13 E8 ED 0E 43 \r
+3F 40 20 41 B0 13 C4 C8 81 4C 1C 00 81 4D 1E 00 \r
+1C 41 14 00 1D 41 16 00 3E 40 F4 FD 3F 40 D4 3B \r
+B0 13 40 C2 1E 41 1C 00 1F 41 1E 00 B0 13 CA B0 \r
+81 4C 10 00 81 4D 12 00 1C 41 10 00 1D 41 12 00 \r
+3E 40 E7 6F 3F 40 63 3B B0 13 40 C2 CE 0C CF 0D \r
+1C 41 14 00 1D 41 16 00 B0 13 C4 C8 81 4C 08 00 \r
+81 4D 0A 00 36 40 10 00 37 40 14 FA 0A 43 2C 47 \r
+B0 13 C4 A4 CE 08 CF 09 B0 13 36 DC 0C 93 08 38 \r
+81 48 0C 00 81 49 0E 00 27 53 1A 53 16 83 EF 23 \r
+4A 4A 5A 02 1C 4A 34 FA B0 13 E8 ED C6 0C C7 0D \r
+1C 4A 14 FA B0 13 C4 A4 B0 13 E8 A4 C4 0C C5 0D \r
+1C 41 08 00 1D 41 0A 00 CE 08 CF 09 B0 13 C4 B0 \r
+3E 40 82 A8 3F 40 7B 38 B0 13 40 C2 CE 0C CF 0D \r
+0C 43 3D 40 80 3F B0 13 D6 A4 C4 0C C5 0D 1C 4A \r
+36 FA B0 13 E8 ED CE 06 CF 07 B0 13 D6 A4 C5 0C \r
+CA 0D CC 08 CD 09 B0 13 E8 A4 CE 0C CF 0D CC 05 \r
+CD 0A B0 13 C4 C8 CE 06 CF 07 B0 13 CA B0 81 4C \r
+04 00 81 4D 06 00 1C 41 18 00 1D 41 1A 00 1E 41 \r
+04 00 1F 41 06 00 B0 13 C4 C8 81 4C 00 00 81 4D \r
+02 00 38 40 11 00 3A 40 BA 1D 39 40 36 FA 3C 49 \r
+B0 13 E8 ED 2E 41 1F 41 02 00 B0 13 40 C2 2A 52 \r
+8A 4C FC FF 8A 4D FE FF 18 83 F1 23 31 50 20 00 \r
+64 16 10 01 B0 13 0A E5 C8 0C C9 0D 1C 41 0C 00 \r
+1D 41 0E 00 10 01 B0 13 C4 B0 CE 0C CF 0D CC 04 \r
+CD 05 B0 13 40 C2 10 01 1E 41 10 00 1F 41 12 00 \r
+B0 13 C4 B0 10 01 4F 14 5D 42 1B 02 B2 B0 20 00 \r
+D8 1E D4 20 B2 B0 40 00 D8 1E D0 20 82 43 D8 1E \r
+5E 42 1D 02 4E FD 4B 43 B0 13 12 F4 4C 93 62 20 \r
+7E B0 1F 00 0F 24 32 C2 03 43 C2 43 1B 02 32 D2 \r
+3C 40 A3 00 B0 13 5A DA 92 42 96 1E 9A 1E 92 42 \r
+98 1E 9C 1E 6E B2 39 20 6E B3 22 20 7E B0 10 00 \r
+17 20 5E B3 0E 20 7E B2 6C 24 F2 B2 01 02 69 24 \r
+D2 43 DD 1E C2 43 DC 1E F2 D2 03 02 F2 D2 05 02 \r
+60 3C D2 B3 01 02 5D 24 B2 D2 D8 1E 5B 43 59 3C \r
+F2 B0 10 00 01 02 55 24 A2 D2 D8 1E 5B 43 51 3C \r
+E2 B3 01 02 0B 20 E2 B3 19 02 4B 24 A2 D3 D8 1E \r
+B2 F0 FF FE D8 1E E2 C3 19 02 43 3C A2 D3 D8 1E \r
+B2 F0 FF FE D8 1E 5B 43 3C 3C E2 B2 01 02 0B 20 \r
+E2 B2 19 02 36 24 92 D3 D8 1E B2 F0 7F FF D8 1E \r
+E2 C2 19 02 2E 3C 92 D3 D8 1E B2 F0 7F FF D8 1E \r
+5B 43 27 3C D2 53 E0 1E 5F 42 E0 1E 5F 83 7F 90 \r
+07 00 05 28 F2 F0 0F 00 7A 1D C2 43 E0 1E 6E B2 \r
+13 20 6E B3 0D 20 7E B0 10 00 06 20 5E B3 11 24 \r
+F2 D0 20 00 78 1D 0D 3C F2 D0 30 00 7A 1D 07 3C \r
+F2 D0 20 00 7A 1D 03 3C F2 D0 10 00 7A 1D F2 D2 \r
+78 1D A2 B3 D8 1E 03 24 B2 B2 D8 1E 0D 20 4B 93 \r
+0D 24 B2 B0 10 00 86 1E 02 20 B0 13 80 DC 3C 40 \r
+00 20 B0 13 5A DA 02 3C 82 43 D8 1E 7E B0 20 00 \r
+02 24 A2 D2 88 1E 7E B0 40 00 02 24 A2 D3 88 1E \r
+92 B3 D8 1E 03 20 A2 B3 D8 1E 18 24 3C 40 66 06 \r
+B0 13 5A DA E2 B2 01 02 07 24 E2 D2 19 02 92 C3 \r
+D8 1E B2 D0 80 00 D8 1E E2 B3 01 02 07 24 E2 D3 \r
+19 02 A2 C3 D8 1E B2 D0 00 01 D8 1E 32 C2 03 43 \r
+C2 43 1D 02 C2 4D 1B 02 32 D2 B1 C0 F0 00 14 00 \r
+4B 16 00 13 4F 14 B2 F0 EF FF 42 03 92 C3 42 03 \r
+B2 80 00 80 52 03 B2 D0 10 00 42 03 B0 13 E8 D5 \r
+B2 D0 10 00 14 1D B0 13 06 F4 4C 93 C7 20 B0 13 \r
+12 F4 4C 93 11 24 B2 90 03 00 72 1D 0D 20 C2 93 \r
+76 1D 08 20 7C 40 5A 00 3D 40 00 F9 5E 43 B0 13 \r
+D6 BC 02 3C D2 83 76 1D E2 93 9E 1E 02 28 92 D3 \r
+88 1E B0 13 B6 F4 4C 93 02 24 B2 D2 88 1E B0 13 \r
+F0 F4 4C 93 02 24 A2 D3 88 1E B0 13 FA F3 4C 93 \r
+02 24 B0 13 72 EE B2 B0 20 00 86 1E 10 24 5E 42 \r
+2A 1F CF 0E 5F 83 C2 4F 2A 1F 4E 93 08 20 92 D3 \r
+8A 1E B2 D0 20 00 8A 1E F2 40 0F 00 2A 1F 82 93 \r
+8A 1E 0F 24 92 B3 8A 1E 08 20 A2 B2 8A 1E 09 24 \r
+A2 C2 8A 1E 92 D3 14 1D 04 3C 92 C3 8A 1E A2 D3 \r
+8A 1E A2 B3 86 1E 0E 24 1F 42 96 1E 1E 42 98 1E \r
+1F 82 9A 1E 1E 72 9C 1E 03 20 3F 90 1F 00 02 28 \r
+92 D3 86 1E D2 93 DD 1E 0E 20 E2 92 DC 1E 03 2C \r
+D2 53 DC 1E 08 3C F2 C2 03 02 F2 C2 05 02 C2 43 \r
+DC 1E C2 43 DD 1E E2 B3 01 02 03 24 D2 B3 01 02 \r
+2F 20 C2 43 1C 1F E2 B2 01 02 11 24 D2 53 DA 1E \r
+F2 90 03 00 DA 1E 0D 28 B2 D0 20 00 D8 1E B2 F0 \r
+7F FF D8 1E C2 43 DA 1E E2 C2 19 02 02 3C C2 43 \r
+DA 1E E2 B3 01 02 11 24 D2 53 DB 1E F2 90 03 00 \r
+DB 1E 2C 28 B2 D0 40 00 D8 1E B2 F0 FF FE D8 1E \r
+C2 43 DB 1E E2 C3 19 02 21 3C C2 43 DB 1E 1E 3C \r
+D2 53 1C 1F 5F 42 1C 1F 5F 83 7F 90 03 00 16 28 \r
+1F 42 86 1E 2F C2 2E 42 1E C2 86 1E 0E DF 82 4E \r
+86 1E 92 D3 8A 1E A2 B2 86 1E 04 20 B2 D0 10 00 \r
+8A 1E 02 3C B2 D2 8A 1E C2 43 1C 1F B1 C0 D0 00 \r
+14 00 4B 16 00 13 3C 40 01 1E 0D 43 3E 40 21 00 \r
+B0 13 CC F2 7C 40 30 00 B0 13 EA CF 7C 40 30 00 \r
+B0 13 30 DE 4C 93 AF 20 7C 40 31 00 B0 13 30 DE \r
+7C 90 06 00 A5 20 7C 40 36 00 B0 13 EA CF B0 13 \r
+0C AA FD 23 B2 40 01 02 34 0F 0F 42 32 C2 03 43 \r
+B2 B0 10 00 02 0F FC 27 B2 40 51 7E 10 0F B2 B0 \r
+10 00 02 0F FC 27 F2 40 3D 00 11 0F B2 B0 10 00 \r
+02 0F FC 27 F2 40 FE 00 11 0F B2 B0 20 00 02 0F \r
+FC 27 C2 43 10 0F B2 B0 80 00 02 0F FC 27 F2 90 \r
+51 00 20 0F 72 20 B2 B0 10 00 02 0F FC 27 F2 40 \r
+3D 00 11 0F 02 4F 3B 40 56 F9 4E 43 6C 4B 4F 4E \r
+5F 02 5D 4F 57 F9 B0 13 DC E5 2B 53 5E 53 7E 90 \r
+20 00 F4 2B 3D 40 56 F9 4E 43 6C 4D B0 13 30 DE \r
+4F 4E 5F 02 CF 9C 57 F9 4D 20 2D 53 5E 53 7E 90 \r
+20 00 F3 2B 7C 40 36 00 B0 13 EA CF B0 13 0C AA \r
+FD 23 7C 40 0C 00 5D 42 94 1E B0 13 DC E5 B0 13 \r
+D6 EF 6C 43 B0 13 14 F1 7C 40 34 00 B0 13 EA CF \r
+A2 B3 30 0F FD 27 3E 40 10 00 7C 40 34 00 B0 13 \r
+30 DE 5C F3 5F 42 22 1E 4F 5F 4C DF C2 4C 22 1E \r
+1E 83 F3 23 F2 D0 80 00 22 1E B0 13 EC E8 7C 40 \r
+32 00 B0 13 EA CF D2 43 00 1E B2 40 36 00 26 1E \r
+B2 40 E2 04 28 1E 3C 40 01 1E 0D 43 3E 40 1F 00 \r
+B0 13 CC F2 3C 40 20 1E 0D 43 2E 43 B0 13 CC F2 \r
+32 D2 10 01 32 C2 03 43 FF 3F 32 C2 03 43 FF 3F \r
+32 C2 03 43 FF 3F 32 C2 03 43 FF 3F 7C 40 3D 00 \r
+B0 13 EA CF 7C B0 F0 FF 10 01 C2 43 9E 1D 5F 42 \r
+7A 1D 2F 83 AA 24 1F 83 50 24 1F 83 33 24 1F 83 \r
+16 24 1F 83 06 24 1F 83 A5 20 F2 D0 20 00 78 1D \r
+10 01 7C 40 40 00 B0 13 0E E0 5C 53 7C 90 4F 00 \r
+FA 2B B2 40 00 80 90 1C E2 C3 8C 1C 10 01 E2 43 \r
+7A 1D 3C 40 A4 1D 4D 43 4E 4D 5E 02 5F 4E 7B 1D \r
+47 18 0F 5F 5E 4E 7C 1D 0E 5F 2C 53 8C 4E FE FF \r
+5D 53 7D 90 09 00 F0 2B E2 43 9F 1D F2 40 09 00 \r
+9E 1D 10 01 E2 43 7A 1D 5E 42 7B 1D 47 18 0E 5E \r
+5F 42 7C 1D 0E 5F 82 4E A0 1D 5F 42 7D 1D 47 18 \r
+0F 5F 5D 42 7E 1D 0F 5D 82 4F A2 1D D2 43 9F 1D \r
+4F 8E 5F 53 C2 4F 9E 1D 10 01 3E 40 BF FF 1E F2 \r
+86 1E 5F 42 7B 1D 5F 03 3F F0 C0 FF 0E DF 82 4E \r
+86 1E 3F 40 7F 00 5F F2 7B 1D C2 4F A0 1E D2 42 \r
+7C 1D A1 1E D2 42 7D 1D A2 1E 5F 42 7E 1D 47 18 \r
+0F 5F 5E 42 7F 1D 0E 5F 82 4E 34 1F D2 42 80 1D \r
+32 1F D2 42 81 1D 31 1F 5F 42 84 1D 47 18 0F 5F \r
+5E 42 85 1D 0E 5F CF 0E 1F 52 80 1E 1F 82 7E 1E \r
+82 4F 80 1E 82 4E 7E 1E 5F 42 86 1D 47 18 0F 5F \r
+5C 42 87 1D 0C 5F 82 4C 82 1E 1D 42 78 1E 1E 42 \r
+7A 1E 1F 42 7C 1E B0 13 1E A3 D2 42 88 1D 8D 1C \r
+D2 42 89 1D 8E 1C 7C 40 5A 00 3D 40 EA F8 5E 43 \r
+B0 13 D6 BC D2 43 76 1D 10 01 F2 40 03 00 7A 1D \r
+D2 43 9E 1D 10 01 1A 14 CA 0C 6D 93 3A 24 5D 93 \r
+0E 24 6D 92 5C 20 B0 13 BE AC 6D 42 B0 13 30 F0 \r
+C2 43 9F 1E 4C 43 4D 43 B0 13 30 F0 50 3C C2 93 \r
+9F 1E 18 20 B2 B0 40 00 86 1E 07 20 B0 13 52 AC \r
+5A 93 05 20 B0 13 8A F0 02 3C B0 13 66 AC B0 13 \r
+98 AC C9 0C 5C 42 A1 1E B0 13 74 AC B0 13 BE AC \r
+6D 43 E2 3F B0 13 B0 AC C9 0C 5C 42 A2 1E B0 13 \r
+74 AC 7D 40 1F 00 7E 40 29 00 B0 13 42 F4 5D 43 \r
+D3 3F 5F 42 9E 1E 4F 93 22 24 C2 93 9F 1E 18 20 \r
+4F 4F 2F 83 0D 24 1F 83 1A 20 B2 B0 40 00 86 1E \r
+05 20 B0 13 52 AC B0 13 8A F0 02 3C B0 13 66 AC \r
+B0 13 98 AC CA 0C 5C 42 A1 1E B0 13 8A AC 07 3C \r
+B0 13 B0 AC CA 0C 5C 42 A2 1E B0 13 8A AC 19 16 \r
+10 01 B0 13 50 EE CF 0C CC 0A B0 13 A0 AC 4C 4F \r
+B0 13 7C AC 10 01 B0 13 A0 AC 5C 42 A0 1E B0 13 \r
+7C AC 10 01 B0 13 7C AC CC 0A 10 01 B0 13 CC AC \r
+CC 09 5E 43 B0 13 D6 BC 10 01 B0 13 CC AC CC 0A \r
+5E 43 B0 13 D6 BC 10 01 CC 0A B0 13 B0 AC 10 01 \r
+7D 40 4A 00 7E 40 60 00 B0 13 42 F4 C9 0C 10 01 \r
+7D 40 48 00 7E 40 5E 00 B0 13 42 F4 10 01 7D 40 \r
+1E 00 7E 40 28 00 B0 13 42 F4 10 01 0D 43 6E 43 \r
+4F 43 B0 13 D2 C0 CD 0C 10 01 0A 14 31 82 92 B3 \r
+14 1D 0F 20 A2 B2 14 1D 0C 20 3F 40 0C 00 1F 52 \r
+40 1F 6F 13 4C 93 0C 24 5C 43 6D 43 80 13 8C 1E \r
+07 3C 5C 43 B0 13 44 D6 5C 43 5D 43 80 13 8C 1E \r
+A2 B3 8A 1E 1B 20 92 B3 14 1D 12 20 B2 B2 14 1D \r
+0F 20 3F 40 0C 00 1F 52 42 1F 6F 13 4C 93 61 24 \r
+82 93 8A 1E 5E 20 6C 43 6D 43 80 13 90 1E 59 3C \r
+6C 43 B0 13 44 D6 6C 43 5D 43 F7 3F 6A 43 B2 B2 \r
+8A 1E 2E 20 B2 B0 10 00 8A 1E 26 20 B2 B0 20 00 \r
+8A 1E 1E 20 B2 B0 00 01 8A 1E 14 20 5A 43 B2 B0 \r
+40 00 8A 1E 0B 20 B2 B0 80 00 8A 1E 20 24 CC 01 \r
+3D 40 2A F9 2E 42 B0 13 BA F2 19 3C CC 01 3D 40 \r
+30 F9 F8 3F CC 01 3D 40 36 F9 3E 40 06 00 F3 3F \r
+CC 01 3D 40 3E F9 F9 3F CC 01 3D 40 46 F9 F5 3F \r
+CC 01 3D 40 4E F9 3E 40 06 00 B0 13 BA F2 CC 0A \r
+B0 13 44 D6 CC 0A 6D 42 80 13 90 1E 6A 93 07 24 \r
+7C 40 46 00 CD 01 5E 43 B0 13 D6 BC 06 3C 7C 40 \r
+5A 00 CD 01 5E 43 B0 13 D6 BC 82 43 8A 1E A2 D2 \r
+8A 1E 92 B3 14 1D 10 24 B0 13 FA F3 6C 93 0C 20 \r
+7C 40 17 00 B0 13 22 AE 7C 40 18 00 B0 13 22 AE \r
+7C 40 19 00 B0 13 22 AE 82 43 14 1D 31 52 0A 16 \r
+10 01 7D 40 03 00 B0 13 30 F0 10 01 1A 14 31 80 \r
+16 00 B0 13 88 E2 CA 0C 0A 93 03 20 3C 40 03 00 \r
+97 3C 5C 43 CD 0A B0 13 AA BD 4C 93 04 20 CC 0A \r
+B0 13 FC F4 F3 3F B0 13 02 F5 CD 0C C9 01 39 52 \r
+CC 09 2E 42 B0 13 BA F2 81 49 00 00 CF 01 3F 50 \r
+0C 00 81 4F 02 00 F1 40 09 00 04 00 E1 43 05 00 \r
+CD 01 3D 50 0E 00 3C 40 CE 1E B0 13 DE F0 D1 4A \r
+09 00 12 00 D1 42 D7 1E 0D 00 B0 13 22 F5 C1 4C \r
+13 00 D1 43 0C 00 B0 13 26 F5 C1 4C 14 00 2C 43 \r
+3D 40 03 00 CE 01 B0 13 F6 C2 0C 93 59 20 B0 13 \r
+EA F4 C9 0C E1 43 05 00 CF 01 3F 50 0C 00 81 4F \r
+02 00 CF 0A 3F 50 03 00 81 4F 00 00 79 90 03 00 \r
+06 24 59 93 02 20 B0 13 2E EE B0 13 18 EF B0 13 \r
+74 E5 79 90 03 00 07 24 59 93 03 24 B0 13 F8 EE \r
+02 3C B0 13 58 ED 2C 43 2D 43 CE 01 B0 13 F6 C2 \r
+0C 93 05 24 CC 0A B0 13 FC F4 1C 43 29 3C 3F 40 \r
+7F 00 5F F1 0C 00 5F 93 09 24 7F 90 03 00 06 24 \r
+CC 0A B0 13 FC F4 3C 40 05 00 1A 3C EA 43 00 00 \r
+DA 41 0E 00 0A 00 D2 4A 0B 00 FF 1D F1 90 40 00 \r
+0F 00 02 20 5F 43 02 3C 7F 40 03 00 CA 4F 01 00 \r
+D2 53 D7 1E C2 93 D7 1E 02 20 D2 43 D7 1E 0C 43 \r
+31 50 16 00 19 16 10 01 3A 14 31 82 C9 0C F9 90 \r
+14 00 00 00 05 28 B0 13 26 F5 C9 9C 14 00 74 20 \r
+3C 40 0E 00 0C 59 CD 01 B0 13 1E F4 91 92 D0 1E \r
+02 00 6A 20 91 92 CE 1E 00 00 66 20 58 49 12 00 \r
+3A 40 05 00 0A 59 3C 40 05 00 0C 59 CD 08 B0 13 \r
+7C E3 0C 93 48 20 C2 93 D2 1E 56 24 B0 13 88 E2 \r
+C7 0C 07 93 51 24 3C 40 03 00 0C 57 CD 0A 2E 42 \r
+B0 13 BA F2 6C 43 CD 07 B0 13 AA BD 4C 93 03 24 \r
+D2 93 D6 1E 04 20 CC 07 B0 13 FC F4 3D 3C 5F 42 \r
+D6 1E CE 0F 5E 53 C2 4E D6 1E 4F 4F DF 47 0B 00 \r
+D4 1E C7 48 0A 00 E7 43 00 00 F9 90 40 00 13 00 \r
+02 20 5F 43 02 3C 7F 40 03 00 C7 4F 01 00 D1 47 \r
+09 00 06 00 B0 13 22 F5 C1 4C 07 00 B0 13 A8 B0 \r
+B0 13 96 B0 CD 01 B0 13 B6 B0 D5 27 B0 13 7E B0 \r
+0C 93 12 24 D0 3F B0 13 A8 B0 D1 4C 09 00 06 00 \r
+B0 13 22 F5 C1 4C 07 00 B0 13 96 B0 CD 01 B0 13 \r
+B6 B0 02 24 B0 13 7E B0 31 52 37 16 10 01 3C 40 \r
+03 00 0C 59 CD 0A 2E 42 B0 13 BA F2 CC 09 4D 43 \r
+B0 13 30 E8 10 01 3E 40 07 00 5E F9 0A 00 3F 40 \r
+03 00 4F 8E 6C 43 10 01 F1 40 81 00 08 00 D1 49 \r
+0D 00 09 00 10 01 2D 52 6E 42 B0 13 6A CA C9 0C \r
+09 93 10 01 3B 40 80 00 01 3C 0B 43 0A 14 09 14 \r
+08 14 07 14 21 83 3F B0 80 7F 7B 24 3D B0 80 7F \r
+05 20 0C 4E 0D 4F 8B 10 0D EB 73 3C 5D 02 08 4D \r
+4D 10 38 F0 00 FF 0D D8 5F 02 08 4F 4F 10 38 F0 \r
+00 FF 0F D8 09 4C 0A 4D 3D F0 80 00 C1 4D 00 00 \r
+0B EA 0B EF 3B C0 7F FF 3A D0 80 00 3F D0 80 00 \r
+0A 9F 02 20 09 9E 0A 24 0B 2C 0D 4F 0F 4A 0A 4D \r
+0C 4E 0E 49 09 4C 81 EB 00 00 02 3C 0B 93 4F 20 \r
+0C 43 08 4A 88 10 47 48 8F 10 48 8F 8F 10 0E 24 \r
+38 90 19 00 34 2C 12 C3 4F 10 5E 00 5C 00 3C B0 \r
+00 10 02 24 3C D0 00 20 18 83 F5 23 0B 93 0C 24 \r
+08 8C 09 7E 4A 7F 0C 48 4A 93 12 30 5C 02 09 69 \r
+4A 6A 17 83 2C 24 F8 3F 09 5E 4A 6F 09 28 4A 10 \r
+59 00 5C 00 3C B0 00 10 02 24 3C D0 00 20 17 53 \r
+3C B0 00 80 07 24 09 63 4A 63 07 63 3C B0 00 60 \r
+01 20 19 C3 17 93 13 38 37 90 FF 00 13 34 7A C0 \r
+80 00 87 10 D1 51 00 00 00 00 57 00 0A D7 0C 49 \r
+0D 4A 21 53 07 16 08 16 09 16 0A 16 10 01 0D 43 \r
+0C 43 F7 3F 3D 40 FF FE D1 61 00 00 00 00 5D 00 \r
+3C 43 EF 3F 0A 14 B0 13 14 F3 B0 13 F4 E3 7C 40 \r
+0A 00 B0 13 CC F4 7C 40 06 00 B0 13 D2 F4 82 43 \r
+BE 1E 82 43 C0 1E 7C 40 05 00 B0 13 A6 F4 7C 40 \r
+0C 00 5D 42 94 1E B0 13 2C E4 92 43 BA 1E 7C 40 \r
+17 00 6D 43 B0 13 10 B3 6D 43 B0 13 1A B3 6D 43 \r
+B0 13 30 F0 4C 43 B0 13 10 ED 0C 93 2A 20 4C 43 \r
+1D 42 BE 1E 1E 42 C0 1E B0 13 52 E1 4C 43 B0 13 \r
+52 D7 7A 40 28 00 04 3C 3C 40 99 19 B0 13 5A DA \r
+4C 43 B0 13 10 ED 2C 93 04 20 CF 0A 5A 83 4F 93 \r
+F3 23 4A 93 0E 20 7C 40 46 00 3D 40 0E F9 5E 43 \r
+B0 13 D6 BC 2E 42 3C 40 00 40 B0 13 5A DA 1E 83 \r
+FA 23 4C 43 B0 13 10 ED 1C 93 0D 24 7C 40 17 00 \r
+6D 42 B0 13 10 B3 6D 42 B0 13 1A B3 6D 42 B0 13 \r
+30 F0 4C 43 23 3C A2 43 BA 1E 82 93 C0 1E 0A 20 \r
+82 93 BE 1E 07 20 4C 43 B0 13 C8 E9 82 4C BE 1E \r
+82 4D C0 1E 7C 40 17 00 7D 40 03 00 B0 13 10 B3 \r
+7D 40 03 00 B0 13 1A B3 7D 40 03 00 B0 13 30 F0 \r
+7C 40 13 00 6D 43 B0 13 30 F0 5C 43 0A 16 10 01 \r
+B0 13 30 F0 7C 40 18 00 10 01 B0 13 30 F0 7C 40 \r
+19 00 10 01 1D 42 90 1C 3D 80 00 80 1D C3 5F 42 \r
+7A 1D 2F 83 03 24 1F 83 2D 24 10 01 D2 93 9F 1D \r
+15 24 E2 93 9F 1D 6A 20 5C 02 1F 4C A4 1D B0 13 \r
+34 B4 5F 0E 3F 80 00 80 82 4F B8 1D 3E 40 7D 1D \r
+7F 40 03 00 B0 13 1E B4 FD 2B 10 01 1F 42 A0 1D \r
+0F 5C B0 13 34 B4 1C 52 A0 1D 5C 0E 3C 80 00 80 \r
+82 4C B8 1D 3E 40 7D 1D 7F 40 03 00 B0 13 1E B4 \r
+FD 2B 10 01 1F 42 86 1E 7F F0 C0 00 4F 5F 3E 40 \r
+7F 00 5E F2 A0 1E 4E DF C2 4E 7B 1D D2 42 A1 1E \r
+7C 1D D2 42 A2 1E 7D 1D 1E 42 34 1F CF 0E 8F 10 \r
+C2 4F 7E 1D C2 4E 7F 1D D2 42 32 1F 80 1D D2 42 \r
+31 1F 81 1D C2 43 82 1D C2 43 83 1D 1E 42 7E 1E \r
+CF 0E 8F 10 8F 11 C2 4F 84 1D C2 4E 85 1D 1E 42 \r
+82 1E CF 0E 8F 10 8F 11 C2 4F 86 1D C2 4E 87 1D \r
+D2 42 8D 1C 88 1D D2 42 8E 1C 89 1D CF 0D 8F 10 \r
+C2 4F 8A 1D C2 4D 8B 1D C2 43 8C 1D 10 01 1E 53 \r
+1D 42 B8 1D EE 4D FF FF 92 53 B8 1D 5F 53 7F 90 \r
+13 00 10 01 CE 0F 8E 10 C2 4E 7B 1D C2 4F 7C 1D \r
+10 01 A2 D3 86 1E 82 93 D8 1E 03 24 A2 B2 86 1E \r
+68 20 B2 B0 20 00 D8 1E 5B 20 B2 B0 40 00 D8 1E \r
+4B 20 82 93 D8 1E 69 24 92 B3 D8 1E 32 20 A2 B3 \r
+D8 1E 1A 20 A2 B2 D8 1E 0D 20 B2 B2 D8 1E 5D 24 \r
+1F 42 42 1F 0F 0F 6C 43 4F 13 B2 D2 14 1D B2 C2 \r
+D8 1E 53 3C 1F 42 40 1F 0F 0F 5C 43 4F 13 A2 D2 \r
+14 1D A2 C2 D8 1E 49 3C C2 43 EB 1E 6C 43 6D 42 \r
+80 13 90 1E 1F 42 42 1F 1F 4F 10 00 82 4F 42 1F \r
+00 18 D2 4F 08 00 90 1E B2 D2 14 1D A2 C3 D8 1E \r
+34 3C 5C 43 6D 42 80 13 8C 1E 1F 42 40 1F 1F 4F \r
+10 00 82 4F 40 1F 00 18 D2 4F 08 00 8C 1E A2 D2 \r
+14 1D 92 C3 D8 1E 21 3C B2 F0 BF FF D8 1E 1F 42 \r
+42 1F 3F 0F 04 00 6C 43 4F 13 92 D3 14 1D 15 3C \r
+B2 F0 DF FF D8 1E 1F 42 40 1F 3F 0F 04 00 5C 43 \r
+F3 3F E2 B3 01 02 03 24 D2 B3 01 02 04 20 92 D3 \r
+8A 1E B2 D2 8A 1E 82 43 D8 1E 82 93 86 1E 09 24 \r
+92 B3 86 1E 06 24 92 C3 86 1E B0 13 D6 F3 92 D3 \r
+14 1D A2 C3 86 1E 10 01 1A 14 C9 0C 1A 42 A6 1E \r
+4D 4D 1D 5A 0C 00 0D 8E 3D 80 13 00 0D 93 78 34 \r
+3E 40 1A 00 1E 52 A6 1E 6F 4E 3F F0 03 00 1F 83 \r
+4F 24 1F 83 2C 20 CA 43 12 00 2F 42 6F BE 1A 20 \r
+1C 42 A6 1E D2 9C 11 00 AA 1E 09 2C C2 93 AC 1E \r
+03 20 B0 13 AA D7 09 3C 8C 43 18 00 06 3C B0 13 \r
+8C D5 1F 42 A6 1E DF 53 11 00 CC 09 5D 43 B0 13 \r
+92 E0 4E 3C EE C2 00 00 1F 42 A6 1E 8F 43 00 00 \r
+8F 43 02 00 1C 42 A6 1E B0 13 AA D7 41 3C 3C 40 \r
+80 00 5C 8A 13 00 CF 0A 2D 4F 1E 4F 02 00 3F 40 \r
+00 02 B0 13 14 DD 1C 5A 0C 00 3C 50 00 02 8A 4C \r
+0C 00 1F 42 A6 1E CF 43 0F 00 3F 40 1A 00 1F 52 \r
+A6 1E 3E 40 FC 00 6E FF 5E D3 CF 4E 00 00 20 3C \r
+3C 40 40 00 5C 8A 13 00 2D 4A 1E 4A 02 00 3F 40 \r
+80 1C B0 13 14 DD 1F 42 A6 1E 1C 5F 0A 00 3C 50 \r
+00 06 8F 4C 0C 00 1F 42 A6 1E DF 43 0F 00 3F 40 \r
+1A 00 1F 52 A6 1E 6E 4F 5E C3 6E D3 CF 4E 00 00 \r
+19 16 10 01 21 83 4E 4E 1E 83 48 24 1E 83 2C 24 \r
+2E 83 1E 24 2E 82 13 24 3E 82 72 20 D2 B3 8C 1C \r
+6F 24 E2 B3 8C 1C 6C 20 F2 90 65 00 92 1C 68 28 \r
+B0 13 58 EF 4C 93 64 24 B0 13 04 C5 61 3C D2 B3 \r
+8C 1C 5E 24 E2 B3 8C 1C 5B 20 B0 13 44 E9 58 3C \r
+D2 B3 8C 1C 55 20 7C 40 40 00 B0 13 0E E0 5C 53 \r
+7C 90 4F 00 FA 2B 4C 3C D2 B3 8C 1C 14 24 E2 B3 \r
+8C 1C 11 20 D2 B3 92 1C 05 24 81 43 00 00 CC 01 \r
+B0 13 64 B7 B1 40 FE FF 00 00 CC 01 6D 43 B0 13 \r
+44 E9 B0 13 04 C5 D2 C3 8C 1C 32 3C 5F 42 8C 1C \r
+1F F3 5E 42 8C 1C 2E F3 0E DF 0E 93 29 20 C2 43 \r
+92 1C D2 42 8E 1C 8F 1C B1 40 FB FF 00 00 CC 01 \r
+6D 43 B0 13 44 E9 3C 40 8D 1C B0 13 64 B7 3C 40 \r
+8E 1C B0 13 64 B7 3C 40 31 1F B0 13 64 B7 3C 40 \r
+32 1F B0 13 64 B7 3C 40 34 1F 6D 43 B0 13 44 E9 \r
+3C 40 A0 1E 7D 40 03 00 B0 13 44 E9 D2 D3 8C 1C \r
+21 53 10 01 5D 43 B0 13 44 E9 10 01 1A 14 31 80 \r
+18 00 B0 13 EA F4 C9 0C B0 13 02 F5 81 4C 10 00 \r
+CF 01 2F 52 81 4F 12 00 F1 42 14 00 7A 40 03 00 \r
+C1 4A 15 00 CD 01 3D 50 06 00 3C 40 EC 1E B0 13 \r
+DE F0 D1 43 04 00 D1 42 F4 1E 05 00 D1 43 0A 00 \r
+B0 13 26 F5 C1 4C 0B 00 2C 43 3D 40 03 00 CE 01 \r
+3E 50 10 00 B0 13 F6 C2 C1 4A 15 00 CF 01 2F 52 \r
+81 4F 12 00 CF 01 3F 50 0C 00 81 4F 10 00 79 90 \r
+03 00 06 24 59 93 02 20 B0 13 2E EE B0 13 18 EF \r
+B0 13 74 E5 3A 40 06 00 79 90 03 00 07 24 59 93 \r
+03 24 B0 13 F8 EE 02 3C B0 13 58 ED 2C 43 2D 43 \r
+CE 01 3E 50 10 00 B0 13 F6 C2 0C 93 1D 20 3F 40 \r
+7F 00 5F F1 04 00 5F 93 03 24 7F 90 06 00 14 20 \r
+CC 01 CD 01 3D 50 06 00 2E 42 B0 13 BA F2 2C 41 \r
+1D 41 02 00 B0 13 02 F3 CC 01 3C 50 0C 00 B0 13 \r
+2A F4 D2 53 F4 1E 0A 43 CC 0A 31 50 18 00 19 16 \r
+10 01 0A 14 21 83 C1 43 00 00 F2 90 03 00 00 1E \r
+6B 20 7C 40 3B 00 B0 13 30 DE CE 0C 7C 40 3B 00 \r
+B0 13 30 DE 4E 9C F9 23 4E 93 61 24 CC 01 5D 43 \r
+B0 13 70 E7 6F 41 3F 50 03 00 4E 4E 0E 9F 38 20 \r
+F1 90 1F 00 00 00 34 2C F1 90 0B 00 00 00 30 28 \r
+3C 40 01 1E 0D 43 3E 40 1F 00 B0 13 CC F2 E2 41 \r
+01 1E 3C 40 02 1E 6D 41 B0 13 70 E7 3C 40 20 1E \r
+6D 43 B0 13 70 E7 F2 B0 80 FF 21 1E 14 24 92 53 \r
+34 1E 82 63 36 1E B0 13 CE E1 4C 93 30 20 5C 42 \r
+20 1E B0 13 90 E8 C2 4C 20 1E F2 F0 7F 00 21 1E \r
+B0 13 D8 EE 24 3C 92 53 30 1E 82 63 32 1E 1F 3C \r
+92 53 38 1E 82 63 3A 1E 0A 42 32 C2 03 43 7C 40 \r
+36 00 B0 13 EA CF 7C 40 3D 00 B0 13 EA CF 7C B0 \r
+F0 FF F9 23 7C 40 3A 00 B0 13 EA CF 7C 40 34 00 \r
+B0 13 EA CF 02 4A 03 3C 32 C2 03 43 FF 3F 21 53 \r
+0A 16 10 01 21 82 D2 83 8F 1C 66 20 5F 42 8D 1C \r
+5F 93 51 24 6F 93 4C 24 6F 92 3F 24 7F 90 07 00 \r
+2B 24 7F 90 03 00 22 24 7F 90 05 00 12 24 7F 90 \r
+06 00 45 20 1E 42 7E 1E CF 0E 5F 0D C1 4F 00 00 \r
+B0 13 2C BA C1 4E 01 00 C1 4D 02 00 7D 40 03 00 \r
+36 3C D1 42 C2 1E 00 00 1E 42 82 1E CF 0E 8F 10 \r
+8F 11 C1 4F 01 00 C1 4E 02 00 F0 3F D1 42 C2 1E \r
+00 00 1E 42 7E 1E F2 3F D1 42 C2 1E 00 00 1E 42 \r
+7E 1E CF 0E 5F 0D C1 4F 01 00 B0 13 2C BA C1 4E \r
+02 00 C1 4D 03 00 6D 42 12 3C 1E 42 82 1E CF 0E \r
+8F 10 8F 11 C1 4F 00 00 C1 4E 01 00 6D 43 07 3C \r
+1E 42 7E 1E F4 3F D1 42 C2 1E 00 00 5D 43 CC 01 \r
+7E 42 B0 13 64 B6 D2 42 8E 1C 8F 1C 0C 43 4D 43 \r
+7E 40 10 00 B0 13 64 B6 21 52 10 01 1D 42 82 1E \r
+43 18 4E 5E CF 0D 8F 10 8F 11 7F F0 0F 00 4E DF \r
+10 01 0A 14 4A 4D 10 3C B2 B0 40 00 86 1E 06 20 \r
+7C 40 09 00 5D 43 B0 13 30 F0 05 3C 7C 40 0B 00 \r
+5D 43 B0 13 30 F0 2A 43 B0 13 F8 D6 1A 93 EC 27 \r
+2A 93 13 24 2A 92 3A 20 B0 13 EE EA 7C 40 0B 00 \r
+4D 43 B0 13 30 F0 7C 40 09 00 4D 43 B0 13 30 F0 \r
+6C 43 4D 43 B0 13 14 BB 29 3C B2 B0 40 00 86 1E \r
+19 20 B0 13 38 EF 3C 90 10 27 0F 34 0C 93 0F 34 \r
+3C E3 1C 53 B0 13 FC BA 4D 43 B0 13 30 F0 7C 40 \r
+03 00 5D 43 B0 13 30 F0 0B 3C 3C 40 0F 27 B0 13 \r
+F0 BA 06 3C 1C 42 82 1E 0C 93 EA 3B B0 13 F0 BA \r
+7C 40 46 00 CD 0B 5E 43 B0 13 D6 BC 0A 16 10 01 \r
+B0 13 FC BA 5D 43 B0 13 14 BB 10 01 3C B0 00 80 \r
+0D 7D 3D E3 6E 42 7F 40 03 00 B0 13 D2 C0 CB 0C \r
+6C 43 10 01 B0 13 30 F0 7C 40 03 00 4D 43 B0 13 \r
+30 F0 10 01 6A 14 31 80 06 00 C6 0C 09 43 3A 40 \r
+00 1C 7F 40 03 00 81 4F 00 00 2F 46 1F 93 06 24 \r
+0F 93 0B 20 58 46 02 00 C7 09 10 3C 5C 46 02 00 \r
+B0 13 6A EB C7 0C 07 93 02 20 0C 43 4D 3C 58 47 \r
+09 00 3F 40 03 00 0F 57 81 4F 02 00 24 43 0F 42 \r
+32 C2 03 43 1E 43 6E 9A 39 20 EA 42 00 00 02 4F \r
+3F 40 0B 00 0F 5A 6F 4F 3F F0 3F 00 4E 48 0F 9E \r
+2A 20 25 46 15 93 0E 20 78 90 3F 00 06 20 3F 40 \r
+03 00 0F 57 81 4F 04 00 05 3C 3F 40 07 00 0F 5A \r
+81 4F 04 00 1C 41 04 00 1D 41 02 00 2E 42 B0 13 \r
+7C ED 4C 4C 05 93 02 24 0C 93 0D 20 5F 4A 01 00 \r
+2E 41 4F 9E 08 2C 09 93 02 24 D9 43 00 00 81 4F \r
+00 00 C9 0A 04 3C DA 43 00 00 01 3C 02 4F 3A 50 \r
+23 00 14 83 BC 23 CC 09 31 50 06 00 64 16 10 01 \r
+4D 4D 1D 93 14 24 2D 93 31 24 2D 92 5B 20 B0 13 \r
+EE EA 6C 43 4D 43 B0 13 C6 BC 7C 40 0F 00 4D 43 \r
+B0 13 30 F0 7C 40 1F 00 4D 43 80 00 30 F0 B0 13 \r
+F8 D6 7C 40 1F 00 5D 43 B0 13 30 F0 7C 40 0F 00 \r
+5D 43 B0 13 30 F0 B2 B0 40 00 86 1E 08 20 7C 40 \r
+1D 00 7D 40 46 00 5E 43 B0 13 78 CF 07 3C 7C 40 \r
+1D 00 7D 40 43 00 5E 43 B0 13 78 CF B2 B0 40 00 \r
+86 1E 04 20 B0 13 7C F1 CB 0C 02 3C 1B 42 7E 1E \r
+0B 93 05 38 6C 43 5D 43 B0 13 C6 BC 0B 3C 3B E3 \r
+1B 53 6C 43 4D 43 B0 13 30 F0 7C 40 03 00 5D 43 \r
+B0 13 30 F0 CC 0B 3C B0 00 80 0D 7D 3D E3 7E 40 \r
+03 00 5F 43 B0 13 D2 C0 CD 0C 7C 40 49 00 5E 43 \r
+80 00 D6 BC 10 01 B0 13 30 F0 7C 40 03 00 4D 43 \r
+B0 13 30 F0 10 01 4A 14 C9 0E 4C 4C 3C 80 46 00 \r
+53 24 1C 83 4C 24 1C 83 46 24 1C 83 41 24 1C 83 \r
+3B 24 3C 80 10 00 3C 90 09 00 55 2C 5C 06 00 18 \r
+50 4C 04 BD 62 BD 00 00 5C BD 00 00 58 BD 00 00 \r
+4E BD 00 00 46 BD 00 00 42 BD 00 00 3A BD 00 00 \r
+32 BD 00 00 28 BD 00 00 7A 40 03 00 78 40 22 00 \r
+2E 3C 6A 43 78 40 21 00 2A 3C 6A 43 78 40 23 00 \r
+26 3C 6A 42 F7 3F 6A 43 78 40 25 00 20 3C 7A 40 \r
+03 00 78 40 24 00 1B 3C 6A 42 F0 3F 7A 40 05 00 \r
+E5 3F 7A 40 06 00 E6 3F 6A 43 78 40 1A 00 0F 3C \r
+7A 40 03 00 FA 3F 6A 43 78 40 1C 00 08 3C 7A 40 \r
+03 00 78 40 1B 00 03 3C 6A 42 78 40 1A 00 C7 0D \r
+4A 4A 06 43 CC 08 4C 56 7D 47 CE 09 B0 13 78 CF \r
+16 53 1A 83 F7 23 46 16 10 01 4A 14 21 83 C8 0D \r
+C7 0C 39 40 41 1E CC 01 0D 43 1E 43 B0 13 CC F2 \r
+46 43 09 98 25 24 2F 43 6F 99 22 20 5A 49 09 00 \r
+7A 90 3E 00 1D 2C 57 93 13 24 3C 40 03 00 0C 59 \r
+3D 40 03 00 0D 58 2E 42 B0 13 7C ED 0C 93 10 20 \r
+4F 4A CA 01 3A 50 E0 FF 0A 5F DA 43 00 00 08 3C \r
+C2 9A 3E 1E 05 2C 4A 4A CF 01 0F 8A DF 43 3D 00 \r
+39 50 0C 00 56 53 D5 27 CE 01 0F 43 4C 43 CE 93 \r
+00 00 04 24 1E 53 5C 53 FA 27 09 3C 67 93 04 20 \r
+7C 50 20 00 4F 4C 03 3C 3F 40 3D 00 4F 8C 67 93 \r
+0B 24 5E 42 3F 1E 0F 9E 12 38 5E 42 3E 1E 0F 9E \r
+0F 20 D2 83 3E 1E 0C 3C 5E 42 3E 1E 0E 9F 07 38 \r
+5E 42 3F 1E 0E 9F 04 34 C2 4F 3F 1E 01 3C 0F 43 \r
+C8 4F 09 00 CC 0F 21 53 46 16 10 01 0A 14 CA 0C \r
+5D 93 05 24 6D 92 34 20 C2 43 30 1F 31 3C C2 93 \r
+30 1F 1A 20 5C 42 31 1F B0 13 14 BF 03 20 B0 13 \r
+F4 BE 02 3C B0 13 04 BF 5C 42 32 1F B0 13 14 BF \r
+03 20 B0 13 04 BF 02 3C B0 13 F4 BE B0 13 28 BF \r
+5D 43 B0 13 30 F0 14 3C 1C 42 34 1F 0D 43 6E 42 \r
+4F 43 B0 13 D2 C0 CF 0C CC 0A 7D 40 46 00 7E 40 \r
+5C 00 B0 13 38 BF B0 13 28 BF 4D 43 B0 13 30 F0 \r
+0A 16 10 01 CC 0A 7D 40 48 00 7E 40 5E 00 B0 13 \r
+38 BF 10 01 CC 0A 7D 40 4A 00 7E 40 60 00 B0 13 \r
+38 BF 10 01 0D 43 6E 43 4F 43 B0 13 D2 C0 CF 0C \r
+B2 B0 40 00 86 1E 10 01 CC 0A 7D 40 1F 00 7E 40 \r
+29 00 B0 13 42 F4 10 01 B0 13 42 F4 CD 0F 5E 43 \r
+B0 13 D6 BC 10 01 1A 14 CA 0D C9 0C D2 93 00 1E \r
+58 24 B0 13 EC E8 1D 43 6D 59 CC 09 B0 13 10 E6 \r
+49 43 4A 93 37 24 5A 93 32 20 6A 42 16 3C 7C 40 \r
+36 00 B0 13 EA CF 7C 40 3D 00 B0 13 EA CF 7C B0 \r
+F0 FF F9 23 7C 40 3A 00 B0 13 EA CF 4A 93 02 20 \r
+59 43 2B 3C B0 13 48 F1 5A 83 7C 40 34 00 B0 13 \r
+EA CF A2 B3 30 0F FD 27 92 C3 32 0F 7C 40 35 00 \r
+B0 13 EA CF 3C 40 19 00 B0 13 2E F1 92 B3 32 0F \r
+D6 27 92 C3 32 0F 92 B3 30 0F FD 27 0E 3C 32 C2 \r
+03 43 FF 3F 7C 40 35 00 B0 13 EA CF B2 B0 00 02 \r
+32 0F FC 27 B2 F0 FF FD 32 0F 7C 40 3B 00 B0 13 \r
+EA CF F2 90 03 00 00 1E 02 20 B0 13 C2 F1 CC 09 \r
+03 3C 32 C2 03 43 FF 3F 19 16 10 01 B2 40 23 5A \r
+5C 01 B0 13 BA EB F2 40 A5 00 21 01 F2 D0 80 00 \r
+20 01 C2 43 21 01 F2 D0 03 00 4A 02 92 C3 6C 01 \r
+B2 D0 0C 00 6C 01 82 43 66 01 B2 40 44 00 68 01 \r
+32 D0 40 00 82 43 60 01 B2 40 50 00 62 01 B2 40 \r
+6E 11 64 01 32 C0 40 00 1E 14 3D 40 41 D1 0E 43 \r
+1D 83 0E 73 FD 23 0D 93 FB 23 1D 16 00 3C B2 F0 \r
+F0 FF 6E 01 A2 C3 02 01 A2 B3 02 01 F8 23 32 C2 \r
+03 43 B2 40 52 2D C0 01 A2 43 C2 01 F2 40 0E 00 \r
+D7 01 F2 F0 7F 00 03 02 F2 D0 80 00 05 02 F2 40 \r
+11 00 CD 01 F2 40 12 00 CE 01 F2 40 13 00 CF 01 \r
+82 43 C0 01 32 D2 B0 13 A8 E6 B0 13 66 F3 B0 13 \r
+BE E8 B0 13 C4 EA B0 13 2C EC B0 13 30 F2 80 00 \r
+8A CE 4A 14 C8 0F C6 0E C9 0C CA 0D C7 06 3C 40 \r
+6A 1D 3D 40 18 F9 3E 40 07 00 B0 13 BA F2 0A 93 \r
+1C 20 39 90 B5 00 19 2C 77 90 03 00 0B 2C CD 09 \r
+59 02 0D 59 3D 50 3B F5 3C 40 6A 1D 2E 43 B0 13 \r
+BA F2 22 3C 4C 46 3C 50 67 1D CD 09 59 02 0D 59 \r
+3D 50 3A F5 3E 40 03 00 F2 3F CC 09 CD 0A 3E 40 \r
+0A 00 0F 43 B0 13 B2 D8 7E 50 30 00 4F 46 CF 4E \r
+69 1D CC 09 CD 0A 3E 40 0A 00 0F 43 B0 13 B2 D8 \r
+C9 0C CA 0D 56 83 E9 23 3F 40 6A 1D 4D 43 08 3C \r
+48 93 04 24 FF 40 20 00 00 00 58 83 1F 53 5D 53 \r
+3E 40 30 00 6E 9F 05 20 4E 47 1E 83 4C 4D 0C 9E \r
+EF 3B 3C 40 6A 1D 46 16 10 01 0A 14 CA 0C 1F 42 \r
+A6 1E 8F 93 02 00 10 20 8F 93 00 00 0D 20 C2 93 \r
+AB 1E 0A 24 5E 42 AB 1E 3E 50 64 00 5D 42 3A 1F \r
+0D 9E 02 34 4C 43 42 3C BF 40 00 70 08 00 5C 42 \r
+B3 1E 1D 42 B0 1E 1E 42 B2 1E 3D F3 3E F0 FF 00 \r
+3F 40 00 08 B0 13 14 DD 1C 52 38 1F 1F 42 A6 1E \r
+8F 4C 0A 00 1F 42 A6 1E 9F 42 38 1F 0C 00 1F 42 \r
+A6 1E CF 43 14 00 1F 42 A6 1E CF 43 15 00 1F 42 \r
+A6 1E 8F 93 02 00 05 20 8F 93 00 00 02 20 EF D2 \r
+1A 00 1D 42 A6 1E 1E 42 B0 1E 1F 42 B2 1E 3E F3 \r
+3F F0 FF 00 8D 4E 00 00 8D 4F 02 00 1F 42 A6 1E \r
+9F 43 18 00 CC 0A B0 13 7C CB 5C 43 0A 16 10 01 \r
+3A 14 07 4F 07 ED 0A 4F 5A 02 8A 10 4A 4A 0A 93 \r
+49 24 7F D0 80 00 0B 4D 5B 02 8B 10 4B 4B 0B 93 \r
+3F 24 7D D0 80 00 0B 5A 3B 80 7F 00 08 43 09 43 \r
+0E 93 09 24 1A 43 5E 00 02 28 08 5C 09 6D 59 00 \r
+58 00 5A 02 F8 2B 0E 43 1A 43 5F 00 02 28 08 5C \r
+09 6D 59 00 58 00 5E 00 3E B0 00 10 02 24 3E D0 \r
+00 20 4A 5A F2 23 49 93 02 34 1B 53 03 3C 0E 6E \r
+08 68 49 69 3E B0 00 80 07 24 08 63 49 63 0B 63 \r
+3E B0 00 60 01 20 18 C3 1B 93 0C 38 3B 90 FF 00 \r
+0C 34 49 59 8B 10 09 DB 57 02 59 00 0D 49 0C 48 \r
+37 16 10 01 0C 43 0D 43 FB 3F 3D 40 FF FE 3C 43 \r
+57 02 5D 00 F5 3F CF 0D CD 0E CE 0C C2 93 59 1E \r
+06 20 B0 13 80 F2 4C 93 02 20 2C 43 10 01 2E 83 \r
+2C 24 1E 83 43 24 2E 83 20 24 1E 83 3B 24 3E 80 \r
+03 00 34 24 1E 83 30 20 0E 43 8D 93 00 00 09 20 \r
+0F 93 2A 20 1C 4D 02 00 1D 4D 04 00 B0 13 02 F3 \r
+31 3C 1C 43 2C 9D 20 20 0F 93 1E 20 1C 4D 02 00 \r
+1D 4D 04 00 B0 13 F0 F2 25 3C 3F B0 FE FF 14 20 \r
+CC 0F B0 13 C2 F0 CE 0C 1D 3C 3F 90 03 00 07 24 \r
+2F 93 0A 20 CC 0D B0 13 00 E8 CE 0C 13 3C CC 0D \r
+B0 13 AC DA CE 0C 0E 3C 2E 43 0C 3C B0 13 1A F5 \r
+CE 0C 08 3C B0 13 1E F5 CE 0C 04 3C CC 0F B0 13 \r
+9E D6 CE 0C CC 0E 10 01 0A 14 31 80 06 00 B0 13 \r
+36 F3 2E 42 CF 01 1F 53 3D 40 9A 1D 1F 53 FF 4D \r
+FF FF 1E 83 FB 23 3C 40 05 00 0D 43 CE 01 1E 53 \r
+B0 13 F6 C2 D2 43 78 1D 4A 43 B0 13 18 E9 0C 93 \r
+08 24 B0 13 3E C4 1A 2C F2 B0 20 00 78 1D F5 27 \r
+1F 3C E1 43 00 00 3C 40 03 00 3D 40 0A 00 CE 01 \r
+B0 13 F6 C2 4A 43 B0 13 0E F5 0C 93 04 20 E2 43 \r
+78 1D 5C 43 10 3C B0 13 3E C4 06 28 C2 43 59 1E \r
+E2 42 78 1D 4C 43 07 3C F2 B0 20 00 78 1D EB 27 \r
+C2 43 59 1E 4C 43 31 50 06 00 0A 16 10 01 3C 40 \r
+E8 03 B0 13 46 F3 B2 40 2B 5A 5C 01 CF 0A 1A 43 \r
+4A 5F 7F 90 0B 00 10 01 31 80 0E 00 CE 01 3D 40 \r
+00 18 4F 43 1E 53 FE 4D FF FF 5F 53 7F 90 0D 00 \r
+F9 2B F1 93 00 00 30 24 5F 41 01 00 C2 4F 94 1E \r
+3F 90 15 00 05 38 3F 90 EC 00 02 34 C2 43 94 1E \r
+5F 41 04 00 47 18 0F 5F 5E 41 05 00 0E 5F 82 4E \r
+2E 1F D2 41 06 00 9A 1D D2 41 07 00 9B 1D D2 41 \r
+08 00 9C 1D D2 41 09 00 9D 1D F1 93 0C 00 08 24 \r
+5F 41 0A 00 47 18 0F 5F 5E 41 0B 00 0E 5F 01 3C \r
+0E 43 82 4E 84 1E 13 3C E2 42 94 1E B2 40 F6 FF \r
+2E 1F F2 40 79 00 9A 1D F2 40 56 00 9B 1D F2 40 \r
+34 00 9C 1D F2 40 12 00 9D 1D 82 43 84 1E 31 50 \r
+0E 00 10 01 21 83 5F 42 92 1C 1D 42 90 1C 4C 4F \r
+3E 40 FE 9D 0E 8C 0D 9E 02 2C 4B 43 09 3C 81 4D \r
+00 00 2E 41 3F 40 FE 00 4F 8E C2 4F 92 1C 5B 43 \r
+4E 43 15 3C 4F 4E 5D 4F 93 1C 5E 53 4F 4E 5F 4F \r
+93 1C 47 18 0F 5F 0D 5F 5E 53 1C 42 90 1C CF 0C \r
+2F 53 82 4F 90 1C B0 13 9A EA 5F 42 92 1C 4D 4F \r
+1D 83 4C 4E 0C 9D E6 3B 4B 93 0C 20 5F B3 03 20 \r
+C2 43 92 1C 1A 3C 4F 4F D2 4F 92 1C 93 1C D2 43 \r
+92 1C 13 3C 3C 40 FE 9D 3D 40 FE FF B0 13 9A EA \r
+C2 43 92 1C 5F 42 8C 1C 5F C3 6F D3 C2 4F 8C 1C \r
+7C 40 15 00 6D 42 B0 13 30 F0 21 53 10 01 1A 14 \r
+21 82 CA 0C F2 B0 40 00 01 02 42 24 B0 13 9E DB \r
+82 4C 7C 1E 1C 52 80 1E 3C 80 A1 0A 82 4C 7E 1E \r
+B0 13 AA D3 81 4C 00 00 81 4D 02 00 4A 93 03 20 \r
+B0 13 46 C6 27 3C 2C 41 1D 41 02 00 B0 13 DA E6 \r
+3E 40 CD CC 3F 40 4C 3E B0 13 40 C2 C9 0C CA 0D \r
+1C 42 78 1E 1D 42 7A 1E B0 13 DA E6 3E 40 CD CC \r
+3F 40 4C 3F B0 13 40 C2 CE 0C CF 0D CC 09 CD 0A \r
+B0 13 CA B0 B0 13 EA DB 81 4C 00 00 81 4D 02 00 \r
+B0 13 46 C6 1E 42 7C 1E B0 13 00 9E 82 4C 82 1E \r
+21 52 19 16 10 01 1C 41 04 00 1D 41 06 00 82 4C \r
+78 1E 82 4D 7A 1E 10 01 1A 14 21 82 39 40 CB 00 \r
+3C 40 00 40 B0 13 5A DA 3C 40 03 00 3D 40 05 00 \r
+0E 43 B0 13 F6 C2 D1 43 02 00 C1 49 03 00 CC 01 \r
+2C 53 6D 43 B0 13 78 D2 3C 40 03 00 3D 42 0E 43 \r
+B0 13 F6 C2 3C 40 0A 00 B0 13 46 F3 CC 01 B0 13 \r
+5C DD 0C 93 18 20 C1 93 00 00 F8 27 B0 13 1A AA \r
+4A 43 5A 92 9E 1D F2 2F 3C 40 0A 00 B0 13 46 F3 \r
+4C 4A B0 13 24 B3 3C 40 7A 1D 7D 40 13 00 B0 13 \r
+78 D2 5A 53 EE 3F 3C 40 03 00 2D 42 0E 43 B0 13 \r
+F6 C2 B2 40 2B 5A 5C 01 F2 B0 20 00 78 1D B8 27 \r
+C2 43 59 1E 21 52 19 16 10 01 5A 14 C6 0F C7 0E \r
+C5 0D C9 0C 18 41 1C 00 C7 43 00 00 B0 13 24 BB \r
+CA 0C 0A 93 02 20 2C 42 3C 3C 1F 43 2F 99 02 24 \r
+09 43 09 3C 5C 49 02 00 B0 13 6A EB C9 0C 09 93 \r
+02 20 2C 43 2E 3C 5E 4A 02 00 7E 80 0B 00 C7 4E \r
+00 00 3D 40 0E 00 0D 5A 4E 4E CC 05 B0 13 BA F2 \r
+09 93 06 24 D9 4A 21 00 07 00 D9 4A 22 00 08 00 \r
+06 93 07 24 3D 40 07 00 0D 5A CC 06 2E 42 B0 13 \r
+BA F2 08 93 06 24 3F 40 07 00 5F FA 0C 00 C8 4F \r
+00 00 5D 4A 01 00 5C 43 B0 13 70 E9 CA 43 00 00 \r
+0C 43 55 16 10 01 4F 43 4C 93 2D 24 5C 93 20 24 \r
+6C 93 13 24 7C 90 03 00 2A 20 A2 D2 22 03 A2 C2 \r
+24 03 B2 C2 22 03 B0 13 32 F5 B0 13 24 C8 1F 42 \r
+20 03 6F F2 B2 C2 22 03 1A 3C A2 D2 24 03 B0 13 \r
+12 C8 B0 13 24 C8 A2 D2 22 03 B0 13 32 F5 0F 3C \r
+A2 D2 24 03 B2 C2 22 03 A2 D2 22 03 B0 13 32 F5 \r
+B0 13 08 C8 04 3C A2 D2 24 03 B0 13 08 C8 4C 43 \r
+4F 93 01 20 5C 43 10 01 B0 13 24 C8 B0 13 12 C8 \r
+10 01 A2 C2 22 03 B0 13 32 F5 B2 C2 22 03 B0 13 \r
+32 F5 10 01 B2 D2 22 03 B0 13 32 F5 10 01 1A 14 \r
+CB 0C 7B 90 BD 00 07 24 4C 43 7B 90 31 00 40 28 \r
+7B 90 3D 00 3D 2C 0A 42 32 C2 03 43 B2 F0 BF FF \r
+02 0F B2 B0 10 00 02 0F FC 27 7B 90 3D 00 26 2C \r
+4C 43 B0 13 D8 F1 C9 0C 4C 43 7D 40 29 00 B0 13 \r
+2C E4 C2 4B 11 0F A2 B2 30 0F 13 24 7B 90 32 00 \r
+10 24 7B 90 39 00 0D 24 7B 90 38 00 0A 24 A2 B2 \r
+30 0F FD 23 0D 14 3D 40 BF 0C 1D 83 FE 23 0D 16 \r
+03 43 4C 43 CD 09 B0 13 2C E4 03 3C F2 40 BD 00 \r
+11 0F 5C 42 21 0F B2 B0 40 00 02 0F FC 27 02 4A \r
+19 16 10 01 3A 14 07 4F 07 ED 0A 4F 5A 02 8A 10 \r
+4A 4A 0A 93 38 24 7F D0 80 00 0B 4D 5B 02 8B 10 \r
+4B 4B 0B 93 2B 24 7D D0 80 00 0B 8A 3B 50 7F 00 \r
+3A 40 18 00 08 43 09 43 0C 8E 0D 7F 03 2C 0C 5E \r
+0D 6F 12 C3 08 68 09 69 5C 02 0D 6D 1A 83 F4 23 \r
+49 93 03 30 1A 53 1B 83 EF 3F 0C 7E 0D 7F 08 63 \r
+49 63 0B 63 1B 93 0C 38 3B 90 FF 00 0C 34 49 59 \r
+8B 10 09 DB 57 02 59 00 0D 49 0C 48 37 16 10 01 \r
+0C 43 0D 43 FB 3F 3C 40 FF FE 3D 43 57 02 5D 00 \r
+F5 3F 2A 14 21 83 C9 0C 3F 40 0B 00 0F 59 68 4F \r
+3A 40 3F 00 4A F8 3C 40 07 00 0C 59 1D 42 C6 1E \r
+2E 42 B0 13 7C ED 0C 93 2D 24 78 B0 40 00 2A 20 \r
+4A 93 10 24 7A 90 07 00 0D 2C 4A 4A 5A 06 00 18 \r
+5F 4A 54 FA 2C 43 0C 59 4F 13 1C 93 1B 20 D9 43 \r
+00 00 1A 3C 7A 90 3F 00 03 24 7A 90 20 00 12 28 \r
+2C 43 0C 59 CD 01 B0 13 DE C9 4C 93 0B 24 D9 43 \r
+00 00 00 18 C2 93 CA 1E 07 24 6C 41 80 13 CA 1E \r
+4C 93 02 24 C9 43 00 00 21 53 28 16 10 01 4A 14 \r
+C7 0D C8 0C 39 40 41 1E 3A 40 3F 00 5A F8 09 00 \r
+26 43 2F 43 6F 99 32 20 5A 99 09 00 2F 20 7A 90 \r
+3F 00 0B 24 3C 40 03 00 0C 59 3D 40 05 00 0D 58 \r
+2E 42 B0 13 7C ED 0C 93 21 20 D7 49 0B 00 00 00 \r
+57 43 7A 90 3F 00 16 24 3F 40 0A 00 0F 58 6F 4F \r
+7F B0 80 FF 0A 20 7F B2 0D 24 D9 98 0B 00 02 00 \r
+02 20 C9 43 02 00 47 43 05 3C 5D 49 0A 00 CC 08 \r
+B0 13 0E CE B0 13 BE F3 CC 07 05 3C 39 50 0C 00 \r
+16 83 C7 23 4C 43 46 16 10 01 4A 14 C9 0F C7 0E \r
+C6 0D CA 0C 6C 43 B0 13 02 CF C8 0C 08 93 02 20 \r
+0C 43 36 3C CF 07 7F 50 0B 00 C8 4F 02 00 3E 40 \r
+0B 00 0E 58 3F 40 80 00 6F FE 4F DA CE 4F 00 00 \r
+D8 42 C4 1E 0D 00 D2 53 C4 1E FD 27 F8 F0 BF 00 \r
+0C 00 5F 48 0C 00 7F F0 F8 00 4F D9 C8 4F 0C 00 \r
+F8 F0 7F 00 0C 00 F8 C2 0C 00 FE F0 7F 00 00 00 \r
+3C 40 0E 00 0C 58 4E 47 CD 06 B0 13 BA F2 3C 40 \r
+07 00 0C 58 1D 42 C6 1E 2E 42 B0 13 BA F2 CC 08 \r
+46 16 10 01 5C 43 B0 13 44 D6 5C 43 6D 42 80 13 \r
+8C 1E B0 13 0C E7 7C 40 17 00 6D 43 B0 13 30 F0 \r
+7C 40 18 00 6D 43 B0 13 30 F0 7C 40 19 00 6D 43 \r
+B0 13 30 F0 B0 13 14 F3 B2 40 03 00 72 1D B2 40 \r
+10 0E 74 1D B0 13 A8 C3 4C 93 02 24 B0 13 58 C6 \r
+82 43 72 1D B0 13 56 F3 3C 40 00 20 B0 13 5A DA \r
+C2 43 1D 02 82 43 D8 1E 7C 40 17 00 6D 42 B0 13 \r
+30 F0 7C 40 18 00 6D 42 B0 13 30 F0 7C 40 19 00 \r
+6D 42 B0 13 30 F0 92 D3 14 1D 10 01 1F 42 A6 1E \r
+CF 43 11 00 1F 42 A6 1E DF 42 B3 1E 13 00 1F 42 \r
+A6 1E 5E 42 38 1F 5E 8F 0C 00 CF 4E 16 00 1F 42 \r
+A6 1E 5E 4F 16 00 8E 11 8F 5E 0A 00 1F 42 A6 1E \r
+DF 5F 16 00 15 00 1F 42 A6 1E DF 42 3A 1F 12 00 \r
+1F 42 A6 1E FF 92 12 00 02 2C FF 42 12 00 1F 42 \r
+A6 1E 9F 42 B4 1E 04 00 9F 42 B6 1E 06 00 1F 42 \r
+A6 1E DF 42 B8 1E 0E 00 1F 42 A6 1E EF B2 1A 00 \r
+03 20 4D 43 B0 13 92 E0 B0 13 8C D5 D2 C3 36 1F \r
+10 01 1E 42 A6 1E 5F 4E 15 00 8F 11 3F 90 40 00 \r
+10 34 3F 90 C1 FF 19 34 FE 50 40 00 15 00 1F 42 \r
+A6 1E 9F 83 08 00 1F 42 A6 1E 5F 4F 15 00 8F 11 \r
+0C 3C FE 80 40 00 15 00 1F 42 A6 1E 9F 53 08 00 \r
+1F 42 A6 1E 5F 4F 15 00 8F 11 1E 42 A6 1E CE 5F \r
+14 00 1E 42 A6 1E 5F 4E 14 00 8F 11 3F 90 40 00 \r
+0B 34 3F 90 C1 FF 0F 34 FE 50 40 00 14 00 1F 42 \r
+A6 1E 9F 83 0A 00 10 01 FE 80 40 00 14 00 1F 42 \r
+A6 1E 9F 53 0A 00 10 01 0A 14 5F 42 32 1F 3F 90 \r
+07 00 0E 34 3F 90 06 00 31 24 1F 83 32 24 1F 83 \r
+14 24 1F 83 2E 24 1F 83 29 24 1F 83 2A 24 2C 3C \r
+3F 80 07 00 2F 93 25 28 2F 83 20 24 1F 83 21 24 \r
+1F 83 1C 24 1F 83 1D 24 1F 3C 1A 42 34 1F 3A B0 \r
+03 00 0E 20 CC 0A 3D 40 64 00 B0 13 04 F2 0E 93 \r
+0A 20 CC 0A 3D 40 90 01 B0 13 04 F2 0E 93 03 24 \r
+7C 40 1C 00 0A 3C 7C 40 1D 00 07 3C 7C 40 1E 00 \r
+04 3C 7C 40 1F 00 01 3C 4C 43 0A 16 10 01 3C 40 \r
+3D 1E 0D 43 3E 40 1C 00 B0 13 CC F2 E2 43 3D 1E \r
+F2 40 3D 00 3E 1E F2 40 20 00 3F 1E D2 43 40 1E \r
+B0 13 9E EC B0 13 78 EF B0 13 A6 F0 B0 13 6C F4 \r
+B0 13 92 EB B0 13 62 F4 B0 13 D0 E7 3F 40 41 1E \r
+CF 43 00 00 3F 50 0C 00 CF 43 00 00 C2 93 4D 1E \r
+15 20 E2 43 4D 1E F2 40 03 00 4E 1E 7F 40 3F 00 \r
+C2 4F 56 1E C2 4F 57 1E F2 43 58 1E B0 13 02 F5 \r
+CD 0C 3C 40 50 1E 2E 42 B0 13 BA F2 0C 43 10 01 \r
+7C 40 36 00 B0 13 2E C8 F2 B0 10 00 36 1F 27 24 \r
+7C 40 0A 00 5D 42 FA 1E B0 13 2C E4 F2 90 7F 00 \r
+FB 1E 07 38 7C 40 0C 00 7D 40 0C 00 B0 13 2C E4 \r
+06 3C 7C 40 0C 00 5D 42 FB 1E B0 13 2C E4 F2 B2 \r
+36 1F 07 20 7C 40 12 00 7D 40 11 00 B0 13 2C E4 \r
+06 3C 7C 40 12 00 7D 40 15 00 B0 13 2C E4 7C 40 \r
+34 00 B0 13 2E C8 B2 F0 FE FD 32 0F B2 F0 FE FD \r
+32 0F B2 D0 01 02 36 0F A2 43 1E 1F 10 01 1A 14 \r
+31 80 22 00 C9 0D 5A 4C 0B 00 3F 40 CF 00 5F F1 \r
+0A 00 5F D2 C8 1E 7F F0 BF 00 C1 4F 0A 00 3D 40 \r
+05 00 0D 5C CC 01 1C 53 2E 42 B0 13 BA F2 CC 01 \r
+3C 50 05 00 1D 42 C6 1E 2E 42 B0 13 BA F2 3D 40 \r
+C0 00 5D F1 09 00 4D D9 F1 40 0B 00 00 00 C1 4A \r
+0B 00 3F 40 70 00 5F F1 0A 00 7F D0 0B 00 C1 4F \r
+0A 00 7D F0 3F 00 C1 4D 09 00 CC 01 4D 43 B0 13 \r
+46 BF 31 50 22 00 19 16 10 01 21 82 F2 F0 BF 00 \r
+05 02 F2 F0 BF 00 19 02 B2 D0 0C 00 22 03 B2 D0 \r
+0C 00 24 03 C2 43 FE 1D 3C 40 CC 0C B0 13 5A DA \r
+7C 40 06 00 5D 43 B0 13 5A D8 C1 4C 00 00 3C 40 \r
+CC 0C B0 13 5A DA 7C 40 07 00 4D 43 B0 13 5C D0 \r
+C1 4C 01 00 D1 B3 01 00 12 20 C1 93 01 00 0F 24 \r
+7C 40 7F 00 4D 43 B0 13 5C D0 C1 4C 02 00 D1 93 \r
+02 00 03 24 C2 43 FE 1D 02 3C D2 43 FE 1D 21 52 \r
+10 01 2A 14 5C 93 03 20 3F 40 00 1C 02 3C 3F 40 \r
+46 1C 2D 43 08 43 CB 08 4E 43 79 40 03 00 CF 93 \r
+00 00 06 20 6C 93 02 20 CC 0F 24 3C CB 0F 0C 3C \r
+5C 93 0A 20 5E 53 2A 42 6A 9F 06 24 5A 4F 01 00 \r
+4A 99 02 2C C8 0F C9 0A 3F 50 23 00 1D 83 E7 23 \r
+0B 93 0C 20 08 93 02 20 0C 43 0C 3C CB 08 5D 4B \r
+01 00 B0 13 70 E9 EB 43 01 00 03 3C 5E 53 CB 4E \r
+01 00 CC 0B 28 16 10 01 1A 14 CF 0E CA 0C 7A 90 \r
+1A 00 31 28 7A 90 2A 00 2E 2C 4E 4A 5E 02 1C 4E \r
+16 1D 4E 4A 5E 4E C2 F9 7D 90 30 00 05 2C 7D 90 \r
+2D 00 05 20 6B 43 08 3C 7D 90 5B 00 02 28 4B 43 \r
+03 3C 4B 4D 5B 4B 66 F9 7A 90 21 00 11 28 C9 0B \r
+43 18 49 59 43 19 4B 10 4B D9 7A 90 21 00 08 20 \r
+7D 90 31 00 03 24 7D 90 4C 00 02 20 7B 40 80 00 \r
+CD 0B B0 13 2E D5 19 16 10 01 0A 14 CE 0C 0B 42 \r
+32 C2 03 43 B2 F0 BF FF 02 0F B2 B0 10 00 02 0F \r
+FC 27 7E 90 31 00 23 28 7E 90 3D 00 20 2C 4C 43 \r
+B0 13 30 DE CA 0C 4C 43 7D 40 29 00 B0 13 DC E5 \r
+C2 4E 11 0F A2 B2 30 0F 0D 24 7E 90 32 00 0A 24 \r
+7E 90 38 00 07 24 A2 B2 30 0F FD 23 3C 40 F8 02 \r
+B0 13 2E F1 4C 43 CD 0A B0 13 DC E5 02 3C C2 4E \r
+11 0F 5C 42 21 0F 02 4B 0A 16 10 01 0A 14 CB 0D \r
+CA 0C 4C 43 B0 13 96 C7 7C 40 22 00 B0 13 BE D0 \r
+0C 24 CC 0A B0 13 BE D0 08 24 5C 43 B0 13 96 C7 \r
+7C 40 23 00 B0 13 BE D0 02 20 0C 43 16 3C 5B 93 \r
+05 24 4C 43 B0 13 FE DA 4D 4C 0B 3C 5C 43 B0 13 \r
+FE DA 4C 4C 4D 4C 8D 10 4C 43 B0 13 FE DA 4C 4C \r
+0D DC 6C 43 B0 13 96 C7 CC 0D 0A 16 10 01 B0 13 \r
+50 E0 7C 40 03 00 B0 13 96 C7 4C 93 10 01 7C 40 \r
+36 00 B0 13 2E C8 4C 43 3D 40 EC F9 7E 40 27 00 \r
+B0 13 00 DF 7C 40 2C 00 7D 40 88 00 B0 13 2C E4 \r
+7C 40 2D 00 7D 40 31 00 B0 13 2C E4 7C 40 2E 00 \r
+7D 40 09 00 B0 13 2C E4 7C 40 36 00 B0 13 2E C8 \r
+7C 40 33 00 B0 13 2E C8 7C 40 3D 00 B0 13 2E C8 \r
+7C B0 70 00 F9 23 7C 40 36 00 B0 13 2E C8 82 43 \r
+1E 1F B2 D0 01 02 34 0F 82 43 32 0F 10 01 0A 14 \r
+CA 0D CB 0C 7B 93 02 24 CF 0B 02 3C 4B 43 4F 43 \r
+4E 4B 4F 4F 0F 8E 1F 53 4C 4B 3D 40 1C 00 B0 13 \r
+1A F2 1C 52 7A FA 4A 93 09 24 8C 43 00 00 8C 43 \r
+02 00 CC 43 1A 00 FC 40 7F 00 10 00 8C 43 18 00 \r
+FC F0 FC 00 1A 00 8C 43 04 00 8C 43 06 00 CC 43 \r
+0E 00 CC 43 12 00 CC 43 0F 00 CC 43 11 00 5B 53 \r
+1F 83 DA 23 0A 16 10 01 B0 13 02 D8 5C 06 3D 40 \r
+29 00 B0 13 04 F2 1F 42 2E 1F 0F 5C 3F 90 69 01 \r
+03 2C 1C 42 2C 1F 03 3C 1C 42 2C 1F CF 0C 5C 06 \r
+0C 5F 5C 02 3D 40 0A 00 B0 13 04 F2 82 4C 2C 1F \r
+3C 90 F0 00 08 28 B2 F0 DF FF 86 1E 7C 42 4D 43 \r
+B0 13 30 F0 07 3C B2 D0 20 00 86 1E 7C 42 5D 43 \r
+B0 13 30 F0 B2 D2 14 1D B2 D0 80 00 14 1D 10 01 \r
+1A 14 21 82 CA 0C 3C 40 05 00 0C 5A 5D 4A 0E 00 \r
+B0 13 40 E3 0C 93 02 20 3F 42 03 3C B0 13 FC F4 \r
+0F 43 F1 40 82 00 00 00 D1 4A 0D 00 01 00 C1 4F \r
+02 00 6C 43 CD 01 7E 40 03 00 7F 40 03 00 B0 13 \r
+6A CA C9 0C 09 93 0D 24 3C 40 03 00 0C 59 3D 40 \r
+05 00 0D 5A 2E 42 B0 13 BA F2 CC 09 4D 43 B0 13 \r
+30 E8 21 52 19 16 10 01 2A 14 C8 0D C9 0C 5C 42 \r
+FF 1D B0 13 6A EB CA 0C B0 13 EA F4 0A 93 24 24 \r
+CC 0A 5D 43 B0 13 78 EC 0C 93 1F 20 09 93 1D 24 \r
+5C 4A 0A 00 5F 4A 01 00 CD 09 CE 08 B0 13 6A CA \r
+C9 0C 09 93 0E 24 3C 40 03 00 0C 59 3D 40 03 00 \r
+0D 5A 2E 42 B0 13 BA F2 CC 09 5D 43 B0 13 30 E8 \r
+04 3C 3C 40 03 00 01 3C 2C 43 28 16 10 01 0E 42 \r
+32 C2 03 43 4C 93 2C 24 4F 4C 3F 50 00 7E B2 B0 \r
+10 00 02 0F FC 27 82 4F 10 0F B2 B0 10 00 02 0F \r
+FC 27 F2 40 3D 00 11 0F B2 B0 10 00 02 0F FC 27 \r
+F2 40 FE 00 11 0F B2 B0 20 00 02 0F FC 27 C2 43 \r
+10 0F B2 B0 80 00 02 0F FC 27 5D 42 20 0F B2 B0 \r
+10 00 02 0F FC 27 F2 40 3D 00 11 0F 4D 9C D7 23 \r
+02 4E 10 01 0A 14 CA 0D 6A 92 1A 24 B0 13 FA F3 \r
+4C 93 08 20 7C 40 47 00 3D 40 20 F9 5E 43 B0 13 \r
+D6 BC 0E 3C 5C 42 C2 1E 0D 43 7E 40 03 00 6F 43 \r
+B0 13 D2 C0 CD 0C 7C 40 47 00 5E 43 B0 13 D6 BC \r
+B0 13 FA F3 4C 93 0F 20 5A 93 08 24 6A 92 0B 20 \r
+7C 40 13 00 4D 43 B0 13 30 F0 05 3C 7C 40 13 00 \r
+5D 43 B0 13 30 F0 0A 16 10 01 21 82 81 43 00 00 \r
+81 43 02 00 7C 40 7F 00 4D 43 B0 13 5C D0 81 4C \r
+00 00 81 43 02 00 2C 41 1F 41 02 00 47 18 0C 5C \r
+0D 43 3C F0 00 07 0D F3 B0 13 28 E2 81 4C 00 00 \r
+81 4D 02 00 7C 40 80 00 5D 43 B0 13 5C D0 81 DC \r
+00 00 12 C3 11 10 02 00 11 10 00 00 12 C3 11 10 \r
+02 00 11 10 00 00 2C 41 1D 41 02 00 21 52 10 01 \r
+1F 42 38 0F 1E 42 0E 0F 0E 93 14 20 0F 93 28 24 \r
+3F 90 14 00 0C 20 B2 B0 00 02 36 0F 03 20 32 C2 \r
+03 43 FF 3F B2 F0 FF FD 32 0F 80 00 62 B8 32 C2 \r
+03 43 FF 3F 2E 93 11 20 1F 42 0C 0F 2F 93 0A 24 \r
+2F 92 08 24 3F 90 06 00 05 24 3F 92 03 24 32 C2 \r
+03 43 FF 3F 32 C2 03 43 FF 3F 32 C2 03 43 FF 3F \r
+10 01 B2 F0 FE FD 36 0F B2 F0 FE FD 32 0F B2 F0 \r
+FE FD 32 0F 92 43 1E 1F 7C 40 32 00 B0 13 D8 F1 \r
+C2 4C 20 1F 7C 43 3D 40 B0 1E 7E 40 0A 00 B0 13 \r
+BC DE 7C 43 B0 13 D8 F1 C2 4C 3A 1F 7C B0 80 FF \r
+04 20 F2 80 80 00 3A 1F 03 3C F2 F0 7F 00 3A 1F \r
+1F 42 22 1F 3F 80 10 00 82 4F 38 1F 80 00 90 E1 \r
+B2 40 5A F8 40 1F B2 40 B4 F8 42 1F 00 18 D2 42 \r
+62 F8 8C 1E 00 18 D2 42 BC F8 90 1E 82 43 D8 1E \r
+82 43 86 1E 82 43 88 1E 82 43 14 1D 82 43 8A 1E \r
+92 D3 14 1D B2 D0 40 00 86 1E B0 13 58 C4 B0 13 \r
+C4 ED B0 13 94 F2 B0 13 80 F4 B0 13 44 DF B0 13 \r
+EE F1 B0 13 08 F5 B0 13 A4 F3 80 00 60 E8 5F 93 \r
+20 24 4F 93 1B 24 6F 93 12 24 7F 90 03 00 05 24 \r
+6F 92 1C 20 B0 13 7E D5 10 01 4E 4E 3E E3 CF 0E \r
+6F FC 4D DF CC 4D 00 00 CC FE 20 00 10 01 B0 13 \r
+7E D5 CC DD 00 00 CC DD 20 00 10 01 CC CE 00 00 \r
+10 01 6F 4C 4F CE 4D DF CC 4D 00 00 10 01 4E 4E \r
+3E E3 CC FE 00 00 CC FE 20 00 10 01 0A 14 1F 42 \r
+A6 1E DF 53 13 00 B0 13 02 CC 1F 42 A6 1E 1E 4F \r
+08 00 1E 5F 0A 00 8F 4E 0C 00 1F 42 A6 1E 9F 4F \r
+0C 00 0A 00 1A 42 A6 1E CF 0A 5C 4F 13 00 2D 4F \r
+1E 4F 02 00 3F 40 00 08 B0 13 14 DD 8A 8C 0C 00 \r
+1F 42 A6 1E FF 40 07 00 0F 00 1F 42 A6 1E FF F0 \r
+FC 00 1A 00 0A 16 10 01 92 53 96 1E 82 63 98 1E \r
+1F 43 5F 52 A2 1E 3F 90 3C 00 1F 20 C2 43 A2 1E \r
+1F 43 5F 52 A1 1E 3F 90 3C 00 12 20 C2 43 A1 1E \r
+1F 43 5F 52 A0 1E F2 40 03 00 9E 1E 3F 90 18 00 \r
+03 24 C2 4F A0 1E 10 01 C2 43 A0 1E 80 00 D2 E0 \r
+C2 4F A1 1E E2 43 9E 1E 10 01 C2 4F A2 1E D2 43 \r
+9E 1E 10 01 0A 14 CA 0C 7D 40 46 00 7E 40 5A 00 \r
+B0 13 42 F4 0D 43 4E 43 B0 13 D6 BC 5A 93 0D 24 \r
+7C 40 29 00 B0 13 96 D6 7C 40 27 00 B0 13 96 D6 \r
+7C 40 28 00 B0 13 96 D6 0C 3C 7C 40 1F 00 B0 13 \r
+96 D6 7C 40 20 00 B0 13 96 D6 7C 40 1E 00 B0 13 \r
+96 D6 0A 16 10 01 4D 43 B0 13 30 F0 10 01 0A 14 \r
+0A 43 2C 92 22 24 3C 90 05 00 1C 24 3C 92 17 24 \r
+3C 90 0A 00 12 20 2F 4D 0F 93 0A 24 1F 83 06 24 \r
+1F 83 02 24 2C 43 16 3C 6C 43 03 3C 5C 43 01 3C \r
+4C 43 B0 13 14 F1 0C 43 0D 3C 2A 43 0A 3C B0 13 \r
+18 EF 07 3C B0 13 2E EE 04 3C B0 13 F8 EE B0 13 \r
+58 ED CC 0A 0A 16 10 01 C2 93 76 1E 29 20 C2 93 \r
+FE 1D 07 20 7C 40 47 00 3D 40 14 F9 5E 43 80 00 \r
+D6 BC F2 F0 BF 00 1D 02 F2 D0 40 00 1B 02 B0 13 \r
+36 F4 D2 43 76 1E 7E 40 0F 00 07 3C 4E 93 0B 24 \r
+3C 40 CC 0C B0 13 5A DA 5E 83 F2 B0 40 00 01 02 \r
+F5 27 4E 93 02 20 C2 43 76 1E 4C 43 80 00 AE C5 \r
+10 01 1A 14 C9 0C 79 93 02 24 CA 09 02 3C 49 43 \r
+4A 43 4F 49 4A 4A 0A 8F 1A 53 CC 09 B0 13 10 ED \r
+0C 93 09 20 4C 49 3D 40 1C 00 B0 13 1A F2 1C 52 \r
+7A FA B0 13 AA D7 59 53 1A 83 EF 23 E2 B3 36 1F \r
+0A 24 B0 13 4E F4 4C 93 06 20 D2 C3 36 1F B0 13 \r
+26 F3 B0 13 DE F4 19 16 10 01 AC 43 18 00 FC F0 \r
+FC 00 1A 00 CC 43 12 00 5F 42 AC 1E C2 93 AD 1E \r
+03 20 CC 4F 13 00 08 3C 5E 42 AC 1E 12 C3 4E 10 \r
+4E 11 4F 8E CC 4F 13 00 E2 B3 36 1F 11 20 F2 D0 \r
+06 00 36 1F B0 13 B2 F3 82 4C A4 1E C2 93 AD 1E \r
+04 20 B2 50 E0 7F A4 1E 10 01 B2 50 C0 53 A4 1E \r
+10 01 B2 D0 91 00 B0 01 B2 40 10 0A 00 07 B2 40 \r
+00 02 02 07 F2 40 1B 00 10 07 92 43 0C 07 2C 43 \r
+B0 13 5A DA A2 D3 00 07 C2 43 46 1F 92 D3 00 07 \r
+3C 40 05 00 B0 13 5A DA C2 93 46 1F FD 27 B2 F0 \r
+FC F5 00 07 B2 F0 EF FF 00 07 B2 F0 6E FF B0 01 \r
+82 43 0C 07 1C 42 44 1F 10 01 0A 14 21 83 CA 0D \r
+CB 0C 4C 43 B0 13 96 C7 7C 40 22 00 B0 13 96 D8 \r
+0E 24 CC 0B B0 13 96 D8 0A 24 CC 0A B0 13 A4 D8 \r
+C1 4C 00 00 6C 43 B0 13 96 C7 5C 43 01 3C 4C 43 \r
+21 53 0A 16 10 01 B0 13 A4 D8 C1 4C 04 00 C1 93 \r
+04 00 10 01 B0 13 50 E0 7C 40 03 00 B0 13 96 C7 \r
+10 01 0A 14 09 14 09 43 0A 43 1B 43 0F 93 04 24 \r
+09 4D 0D 4C 0C 43 0D 3C 5C 02 0D 6D 09 69 09 8E \r
+04 28 1C D3 5B 02 F8 2B 03 3C 09 5E 5B 02 F4 2B \r
+1B 43 5C 02 0D 6D 09 69 0A 6A 09 8E 0A 7F 04 28 \r
+1C D3 5B 02 F6 2B 04 3C 09 5E 0A 6F 5B 02 F1 2B \r
+0E 49 0F 4A 09 16 0A 16 10 01 0A 14 7C 40 23 00 \r
+B0 13 D8 F1 CA 0C 7A D0 20 00 CD 0A 7C 40 23 00 \r
+B0 13 2C E4 7C 40 C6 00 B0 13 DE D2 7C 40 33 00 \r
+B0 13 2E C8 7C 40 3D 00 B0 13 2E C8 7C B0 70 00 \r
+F9 23 3D 40 DF 00 4D FA 7C 40 23 00 B0 13 2C E4 \r
+7C 40 36 00 B0 13 2E C8 82 43 1E 1F 0A 16 10 01 \r
+4F 14 1F 42 6E 03 2F 83 1E 24 2F 82 0B 24 2F 83 \r
+1C 20 B2 F0 EF FF 4A 03 92 C3 4A 03 B2 D0 80 00 \r
+86 1E 13 3C B2 F0 EF FF 48 03 92 C3 48 03 1F 42 \r
+50 03 1F 52 1A 1F 82 4F 58 03 B2 D0 10 00 48 03 \r
+80 13 16 1F 02 3C B0 13 04 E3 B1 C0 D0 00 14 00 \r
+4B 16 00 13 B2 B0 20 00 86 1E 25 20 B0 13 FA F3 \r
+4C 93 21 20 B0 13 12 F4 4C 93 1D 20 D2 53 EB 1E \r
+E2 93 EB 1E 18 20 4C 43 4D 43 B0 13 30 F0 5C 43 \r
+B0 13 44 D6 7C 40 5A 00 3D 40 F8 F8 5E 43 B0 13 \r
+D6 BC 7C 40 46 00 3D 40 24 F9 5E 43 B0 13 D6 BC \r
+3F 40 00 10 C0 0F 10 01 2A 14 1A 41 10 00 49 4C \r
+1B 42 A6 1E 1B 4B 0C 00 0B 89 3B 80 32 00 28 4D \r
+C9 0B 09 88 09 93 02 38 28 9E 15 20 8D 4B 00 00 \r
+1D 42 A6 1E 4C 4C 1C 5D 0C 00 3C 50 10 00 8E 4C \r
+00 00 1E 42 A6 1E DF 4E 0F 00 00 00 1F 42 A6 1E \r
+DA 4F 10 00 00 00 28 16 10 01 B2 B0 30 00 40 03 \r
+24 24 B2 F0 EF FF 4A 03 B2 F0 7F FF 86 1E 82 93 \r
+50 03 02 20 0F 43 05 3C 1F 42 50 03 1F 92 50 03 \r
+FB 23 0F 5C 82 4F 5A 03 92 C3 4A 03 B2 D0 10 00 \r
+4A 03 B0 13 BE F4 B2 40 2B 5A 5C 01 32 C2 03 43 \r
+B2 B0 80 00 86 1E F5 27 32 D2 10 01 1A 14 CA 0C \r
+5C 4A 05 00 CF 0C 3F 80 03 00 06 24 2F 83 2F 93 \r
+03 28 7F 40 03 00 01 3C 5F 43 4C 4C 1D 4A 02 00 \r
+5E 4A 04 00 B0 13 6A CA C9 0C 09 93 0C 24 3C 40 \r
+03 00 0C 59 2D 4A 2E 42 B0 13 BA F2 CC 09 5D 43 \r
+B0 13 30 E8 02 3C 3C 40 03 00 19 16 10 01 A2 D2 \r
+22 03 A2 C2 24 03 3E 42 4F 43 B2 C2 22 03 B0 13 \r
+42 DB 4F 5F A2 B2 20 03 01 24 5F D3 1E 83 F5 23 \r
+A2 D2 24 03 B2 C2 22 03 5C 93 03 24 A2 D2 22 03 \r
+02 3C A2 C2 22 03 B0 13 42 DB B2 C2 22 03 CC 0F \r
+10 01 B0 13 32 F5 B2 D2 22 03 B0 13 32 F5 10 01 \r
+D2 B3 36 1F 1E 24 A2 93 A8 1E 1B 24 1F 42 A6 1E \r
+2E 4F 1F 4F 02 00 0F 93 09 20 0E 93 07 20 82 93 \r
+A8 1E 0F 20 92 43 A8 1E 5C 43 10 01 1C 42 B0 1E \r
+1D 42 B2 1E 3C F3 3D F0 FF 00 0D 9F 02 20 0C 9E \r
+02 24 4C 43 10 01 A2 43 A8 1E 5C 43 10 01 21 83 \r
+81 43 00 00 7C 40 81 00 5D 43 B0 13 5C D0 81 4C \r
+00 00 B1 B0 00 20 00 00 02 20 4E 43 08 3C B1 D0 \r
+00 C0 00 00 B1 E3 00 00 91 53 00 00 5E 43 2C 41 \r
+5C 03 CF 0C 4E 93 04 24 3C 40 AC 0A 0C 8F 03 3C \r
+3C 40 AC 0A 0C 5F 21 53 10 01 0B 4D 0E 4B 0D 93 \r
+1F 30 3B F0 80 7F 1C 24 5B 02 8B 10 7E D0 80 00 \r
+3B 80 7F 00 15 30 3B 90 20 00 0F 34 3B 80 17 00 \r
+05 30 1B 83 08 30 5C 02 0E 6E FB 3F 5E 01 5C 00 \r
+1B 53 01 24 FB 3F 0D 4E 10 01 3C 43 3D 43 10 01 \r
+0C 43 0D 43 10 01 0B 4D 0B EF 0A 30 0D 93 12 30 \r
+0D 9F 02 24 19 34 16 3C 0C 9E 18 24 13 28 14 3C \r
+3D B0 80 7F 04 20 3F B0 80 7F 01 20 0F 24 0D 9F \r
+0B 34 08 3C 0F 9D 02 24 07 34 04 3C 0E 9C EC 27 \r
+01 28 02 3C 3C 43 10 01 1C 43 10 01 0C 43 10 01 \r
+C2 93 FE 1E 21 20 D2 43 FE 1E B2 40 8F 02 00 1F \r
+B2 40 33 13 02 1F B2 40 14 01 80 03 B2 40 05 00 \r
+92 03 B2 40 80 00 82 03 F2 D0 80 00 0B 02 00 18 \r
+F2 40 CA DC 16 1F 3C 40 8F 02 B0 13 1C EA 92 42 \r
+02 1F 1A 1F E2 43 04 1F 10 01 E2 93 04 1F 13 24 \r
+B0 13 44 F2 C2 93 04 1F 1C 24 82 43 90 03 B2 D0 \r
+10 00 80 03 F2 D0 80 00 0B 02 E2 43 04 1F 92 42 \r
+02 1F 1A 1F 10 01 B2 F0 CF FF 80 03 F2 F0 7F 00 \r
+03 02 F2 F0 7F 00 0B 02 D2 43 04 1F 92 42 00 1F \r
+1A 1F 10 01 1A 14 CB 0E CA 0D CE 0C CC 0A CD 0B \r
+B0 13 66 E2 4D 4C CC 0A 49 4E 5C E9 5A F7 47 18 \r
+0C 5C 4E ED 5E 4E 5A F7 0E 5C 4A 4A 47 18 0A 5A \r
+CC 0B 4C DD 0C 5A 0C EE 0F 9C 06 2C 3E 40 FF 7F \r
+0C FE 5E 03 0F 9C FC 2B 19 16 10 01 1A 14 31 80 \r
+06 00 C9 0C 5A 42 FF 1D CC 0A B0 13 6A EB 0C 93 \r
+02 20 2C 43 13 3C 4D 43 B0 13 78 EC 0C 93 0E 20 \r
+91 43 02 00 C1 4A 04 00 81 43 00 00 CC 01 2C 53 \r
+3D 40 7A 1D CE 09 0F 43 B0 13 FA C6 31 50 06 00 \r
+19 16 10 01 F2 40 A5 00 21 01 4E 4C 4F 4E 8F 10 \r
+0E 5F 3E 50 00 44 82 4E 24 01 4F 4C 3F 50 00 44 \r
+82 4F 26 01 92 B3 2C 01 FD 27 C2 4C 20 01 B2 F0 \r
+F9 FF 2C 01 A2 B3 2C 01 03 24 A2 B2 2C 01 FD 27 \r
+82 4E 26 01 C2 43 21 01 10 01 1A 14 3F 40 8E FA \r
+9F 00 FF FF 12 24 3D 40 8E FA 0C 3C 4F 13 2A 52 \r
+12 3C 3C 4D CA 0D CE 09 B0 13 BA F2 0A 59 CD 0A \r
+1D 53 1D C3 39 4D 09 93 F4 23 3F 40 FF FF 3F 93 \r
+05 24 3A 40 FF FF 0F 0A DF 03 E8 23 19 16 10 01 \r
+7C 90 3C 00 06 28 7C 90 3E 00 03 24 32 C2 03 43 \r
+FF 3F 0F 42 32 C2 03 43 B2 B0 10 00 02 0F FC 27 \r
+7C 90 2F 00 08 28 7C 90 3E 00 05 24 7C D0 C0 00 \r
+C2 4C 13 0F 04 3C 7C D0 80 00 C2 4C 13 0F 5C 42 \r
+22 0F 02 4F 10 01 0B 4D 0E 4B 3B F0 80 7F 1C 24 \r
+5B 02 8B 10 7E D0 80 00 3B 80 7F 00 15 30 3B 90 \r
+10 00 10 34 5E 01 5C 00 1E 93 01 24 FB 3F 1B 83 \r
+03 30 5C 02 0E 6E FB 3F 0D 93 02 34 3E E3 1E 53 \r
+0C 4E 10 01 3C 43 10 01 0C 43 10 01 0A 14 CB 0D \r
+0A 42 32 C2 03 43 B2 B0 10 00 02 0F FC 27 7C D0 \r
+C0 00 C2 4C 13 0F 4F 4E 1F 83 0A 24 B2 B0 80 00 \r
+02 0F FC 27 1D 53 DD 42 22 0F FF FF 1F 83 F6 23 \r
+4D 4E 0D 5B DD 42 20 0F FF FF 02 4A 0A 16 10 01 \r
+0B 42 32 C2 03 43 B2 B0 10 00 02 0F FC 27 4C 4C \r
+47 18 0C 5C 3C D0 00 40 6F 4D 0F 5C 82 4F 10 0F \r
+6E 93 0C 28 1D 53 4E 4E 1E 83 E2 4D 10 0F B2 B0 \r
+20 00 02 0F FC 27 1D 53 1E 83 F7 23 5F 42 20 0F \r
+02 4B 10 01 C2 43 76 1E 82 43 82 1E 82 43 7E 1E \r
+82 43 80 1E C2 93 FE 1D 16 24 B0 13 52 EC B0 13 \r
+F8 D6 B0 13 EE EA 1C 42 84 1E 0C 93 0C 24 1C 52 \r
+82 1E 82 4C 82 1E 1D 42 78 1E 1E 42 7A 1E 1F 42 \r
+7C 1E 80 00 1E A3 10 01 1A 14 C9 0C 3D 40 0C 00 \r
+0D 59 6E 49 7E 80 0B 00 5C 43 7F 40 03 00 B0 13 \r
+6A CA CA 0C 0A 93 10 24 3C 40 03 00 0C 5A 3D 40 \r
+05 00 0D 59 2E 42 B0 13 BA F2 FA D0 80 00 0E 00 \r
+CC 0A 4D 43 B0 13 30 E8 19 16 10 01 D2 B3 36 1F \r
+0E 24 1D 42 B0 1E 1E 42 B2 1E 3D F3 3E F0 FF 00 \r
+1F 42 A6 1E 1E 9F 02 00 02 20 2D 9F 02 24 4C 43 \r
+10 01 DF 92 B3 1E 13 00 04 24 D2 C3 36 1F 4C 43 \r
+10 01 EF C2 1A 00 B0 13 7C CB 5C 43 10 01 4F 4C \r
+48 18 0F 5F 7C 90 40 00 1A 28 7C 90 4F 00 17 2C \r
+92 B3 44 01 FD 23 32 C2 03 43 B2 40 00 A5 44 01 \r
+B2 40 02 A5 40 01 8F 43 00 00 B2 40 40 A5 40 01 \r
+B2 40 00 A5 40 01 B2 40 10 A5 44 01 32 D2 10 01 \r
+A2 D2 24 03 7F 40 80 00 3E 42 B2 C2 22 03 CD 0C \r
+4D FF 4D 9F 03 24 A2 C2 22 03 02 3C A2 D2 22 03 \r
+12 C3 4F 10 B0 13 32 F5 B2 D2 22 03 B0 13 32 F5 \r
+1E 83 EB 23 B2 C2 22 03 A2 D2 22 03 A2 C2 24 03 \r
+10 01 4C 93 1D 20 4C 43 B0 13 10 ED 0C 93 04 24 \r
+1C 83 09 24 1C 83 14 20 C2 43 3C 1F C2 43 3D 1F \r
+82 43 3E 1F 10 01 1F 42 7A FA D2 4F 0E 00 3C 1F \r
+1E 4F 04 00 1F 4F 06 00 C2 4F 3D 1F 82 4E 3E 1F \r
+10 01 0A 14 1A 43 5A 52 31 1F D2 53 31 1F B0 13 \r
+88 CC 4C 4C 0C 9A 11 34 1F 43 5F 52 32 1F 7F 90 \r
+0D 00 05 2C D2 53 32 1F D2 43 31 1F 06 3C D2 43 \r
+31 1F D2 43 32 1F 92 53 34 1F 92 D3 14 1D 0A 16 \r
+10 01 0A 14 0A 43 0F 93 05 34 3E E3 3F E3 1E 53 \r
+0F 63 1A D3 0D 93 05 34 3C E3 3D E3 1C 53 0D 63 \r
+3A E3 B0 13 B2 D8 1A B3 04 24 3C E3 3D E3 1C 53 \r
+0D 63 2A B3 04 24 3E E3 3F E3 1E 53 0F 63 0A 16 \r
+10 01 0A 14 CA 0D CB 0E 4C 4C 3D 40 1C 00 B0 13 \r
+1A F2 1F 42 7A FA 0F 5C 8F 93 18 00 0F 20 8F 4A \r
+00 00 8F 4B 02 00 0B 93 06 20 0A 93 04 20 1C 52 \r
+7A FA EC C2 1A 00 FF 40 7F 00 10 00 0A 16 10 01 \r
+0A 14 5A 42 B9 1E 3C 40 B0 1E B0 13 40 E5 4C 4C \r
+0C EA 47 18 0C 5C 8C 10 4C 4C CA 0C C2 4A B9 1E \r
+3A 90 21 00 05 20 D2 D3 36 1F B0 13 DE F4 05 3C \r
+F2 F0 EF 00 36 1F B0 13 90 CD 0A 16 10 01 1A 14 \r
+C2 93 2A 1E 16 24 3C 40 02 1E 29 42 3A 40 7E FA \r
+3B 40 2C 1E 4E 43 4F 43 7D 4C 7D 9B 01 20 5E 53 \r
+7D 9A 01 20 5F 53 19 83 F7 23 6F 92 02 24 6E 92 \r
+02 20 4C 43 01 3C 5C 43 19 16 10 01 5C 02 0D 6D \r
+5C 02 0D 6D 5C 02 0D 6D 5C 02 0D 6D 5C 02 0D 6D \r
+5C 02 0D 6D 5C 02 0D 6D 5C 02 0D 6D 5C 02 0D 6D \r
+5C 02 0D 6D 5C 02 0D 6D 5C 02 0D 6D 5C 02 0D 6D \r
+5C 02 0D 6D 5C 02 0D 6D 10 01 5D 03 5C 00 5D 03 \r
+5C 00 5D 03 5C 00 5D 03 5C 00 5D 03 5C 00 5D 03 \r
+5C 00 5D 03 5C 00 5D 03 5C 00 5D 03 5C 00 5D 03 \r
+5C 00 5D 03 5C 00 5D 03 5C 00 5D 03 5C 00 5D 03 \r
+5C 00 5D 03 5C 00 10 01 0A 14 3F 40 41 1E 2E 43 \r
+0C 43 2D 43 6D 9F 05 20 3F 50 0C 00 1C 53 1E 83 \r
+F8 23 6C 93 02 20 0C 43 0C 3C 4C 4C 3D 40 0C 00 \r
+B0 13 1A F2 3A 40 41 1E 0A 5C CC 0A B0 13 9C E4 \r
+CC 0A 0A 16 10 01 82 43 BA 1E 4C 43 B0 13 D8 F4 \r
+B0 13 56 F3 C2 43 C2 1E 92 D3 14 1D 7C 40 13 00 \r
+6D 42 B0 13 30 F0 7C 40 17 00 6D 42 B0 13 30 F0 \r
+7C 40 18 00 6D 42 B0 13 30 F0 7C 40 19 00 6D 42 \r
+80 00 30 F0 92 C3 44 03 82 93 FC 1E 0E 24 B0 13 \r
+9A A0 92 93 FC 1E 03 24 B0 13 44 E6 02 3C B0 13 \r
+90 CD 1C 42 F6 1E 80 00 12 F0 F2 C2 36 1F B0 13 \r
+90 CD 1C 42 F8 1E B0 13 12 F0 92 43 FC 1E 10 01 \r
+3A 14 C8 0D C7 0C 3A 40 41 1E 29 43 2F 43 6F 9A \r
+0E 20 3D 40 03 00 0D 5A CC 07 2E 42 B0 13 7C ED \r
+0C 93 05 20 58 9A 0A 00 02 20 CC 0A 05 3C 3A 50 \r
+0C 00 19 83 EB 23 0C 43 37 16 10 01 3A 14 C8 0D \r
+C7 0C 3A 40 41 1E 49 43 2F 43 6F 9A 0E 20 3C 40 \r
+03 00 0C 5A CD 07 2E 42 B0 13 7C ED 0C 93 05 20 \r
+CA 98 0A 00 02 20 CC 0A 05 3C 3A 50 0C 00 59 53 \r
+EB 27 0C 43 37 16 10 01 D2 B3 8D 1C 0A 24 B0 13 \r
+FA F3 4C 93 06 20 B0 13 F4 B1 4C 93 02 20 B0 13 \r
+C6 E2 F2 B0 06 00 8D 1C 02 24 B0 13 F8 D6 7C 40 \r
+15 00 7D 40 03 00 B0 13 30 F0 0C 43 4D 43 5E 43 \r
+80 00 64 B6 82 43 AE 1E B0 13 E4 F4 F2 40 21 00 \r
+AA 1E F2 40 06 00 AC 1E C2 43 AB 1E D2 43 AD 1E \r
+7C 43 5D 43 B0 13 3E D1 B0 13 CE D0 B0 13 0A D9 \r
+7C 40 0C 00 5D 42 94 1E 80 00 2C E4 21 83 0F 42 \r
+32 C2 03 43 B2 B0 10 00 02 0F FC 27 4C 4C 47 18 \r
+0C 5C 3C D0 00 40 4D 4D 0C 5D 82 4C 10 0F B2 B0 \r
+20 00 02 0F FC 27 5E 42 20 0F 81 4E 00 00 02 4F \r
+21 53 10 01 5F 14 1A 42 38 0F 4A 4A B0 13 12 F4 \r
+4C 93 10 20 7A 90 14 00 04 24 4A 93 0D 20 03 43 \r
+0B 3C 1F 42 BA 1E 1F 93 02 24 2F 93 05 20 B0 13 \r
+A8 F2 02 3C B0 13 10 D4 5A 16 00 13 21 83 CC 43 \r
+0A 00 EC 43 00 00 DC 42 40 1E 0B 00 D2 53 40 1E \r
+02 3C D2 53 40 1E C2 93 40 1E FB 27 F2 93 40 1E \r
+F8 27 5C 42 40 1E CD 01 B0 13 42 EB 4C 93 F1 23 \r
+21 53 10 01 0A 14 CA 0C 5D 42 4A 1F B0 13 A0 E7 \r
+4C 93 0E 24 B0 13 DE F2 CD 0C 1C 43 0C 5A 2E 42 \r
+B0 13 7C ED 0C 93 02 20 0C 43 05 3C 2C 43 03 3C \r
+B0 13 BE F3 1C 43 0A 16 10 01 0E 4C 0D 4C 0D 93 \r
+16 24 03 34 3D E3 1D 53 0F 30 3B 40 8F 00 1B 83 \r
+5D 02 FD 2B 4C 4D 8C 10 8D 10 4D 4D 8B 10 0D DB \r
+5E 02 5D 00 5C 00 10 01 3D 40 00 C7 0C 43 10 01 \r
+0A 14 3A 40 09 00 0F 43 6D 4C 3B 42 4E 4D 0E EF \r
+3E 90 80 00 04 38 4F 5F 7F E0 97 00 02 3C 4F 5F \r
+4F 4F 4D 5D 1B 83 F2 23 1C 53 1A 83 ED 23 CC 0F \r
+0A 16 10 01 1D 42 26 1E 0F 42 32 C2 03 43 D2 43 \r
+24 1E 02 4F 0D 93 07 24 B0 13 F4 EF C2 93 23 1E \r
+02 20 1D 83 F9 23 0F 42 32 C2 03 43 C2 43 23 1E \r
+C2 43 24 1E 02 4F 10 01 B0 13 9E F4 1F 42 A6 1E \r
+FF 90 7F 00 10 00 0A 24 2C 93 05 34 3C 93 0D 34 \r
+DF 83 10 00 10 01 DF 53 10 00 10 01 CF 4C 10 00 \r
+1F 42 A6 1E FF 50 0C 00 10 00 10 01 7C 90 2F 00 \r
+06 28 7C 90 3E 00 03 24 32 C2 03 43 FF 3F 0F 42 \r
+32 C2 03 43 B2 B0 10 00 02 0F FC 27 C2 4C 11 0F \r
+B2 B0 20 00 02 0F FC 27 C2 4D 10 0F 02 4F 10 01 \r
+4D 93 03 20 32 C2 03 43 FF 3F 0F 42 32 C2 03 43 \r
+B2 B0 10 00 02 0F FC 27 F2 40 7F 00 11 0F 4D 4D \r
+B2 B0 20 00 02 0F FC 27 F2 4C 10 0F 1D 83 F8 23 \r
+02 4F 10 01 B2 F0 FE FD 36 0F B2 F0 FE FD 32 0F \r
+7C 40 36 00 B0 13 2E C8 7C 40 3A 00 B0 13 2E C8 \r
+7C 40 36 00 B0 13 2E C8 7C 40 32 00 B0 13 2E C8 \r
+82 43 1E 1F 10 01 B0 13 0C C0 B0 13 D0 D4 B0 13 \r
+EE F3 82 93 D8 1E 03 20 82 93 86 1E 02 24 B0 13 \r
+42 B4 82 93 88 1E 02 24 B0 13 C4 EC 82 93 14 1D \r
+EE 27 B0 13 DA AC EB 3F 21 83 7C 40 30 00 B0 13 \r
+2E C8 81 43 00 00 02 3C 91 53 00 00 B1 90 64 00 \r
+00 00 FA 2B 7C 40 36 00 B0 13 2E C8 7C B0 70 00 \r
+F9 23 82 43 06 0F 21 53 10 01 0C 93 02 20 0D 93 \r
+14 24 3B 40 9F 00 1B 83 5C 02 0D 6D FC 2B 12 C3 \r
+5D 00 5C 00 3E 40 06 00 5D 01 5C 00 1E 83 FC 37 \r
+8B 10 0D DB 12 C3 5D 00 5C 00 10 01 D2 B3 8D 1C \r
+06 24 B0 13 FA F3 4C 93 02 24 B0 13 C6 E2 0C 43 \r
+4D 43 6E 43 B0 13 64 B6 F2 B0 06 00 8D 1C 02 24 \r
+B0 13 EE EA 7C 40 15 00 6D 42 80 00 30 F0 B2 B0 \r
+20 00 86 1E 14 20 B0 13 12 F4 4C 93 10 20 A2 B2 \r
+D8 1E 0D 24 1F 42 BA 1E 0F 93 05 20 B0 13 F4 B1 \r
+4C 93 03 24 10 01 2F 93 02 20 80 00 C6 E2 10 01 \r
+4D 93 03 20 32 C2 03 43 FF 3F 0F 42 32 C2 03 43 \r
+4D 4D B2 B0 10 00 02 0F FC 27 F2 40 BF 00 13 0F \r
+1C 53 DC 42 22 0F FF FF 1D 83 F3 23 02 4F 10 01 \r
+CF 0C FF B0 80 FF 0C 00 02 20 6C 43 10 01 CF 9D \r
+0D 00 0C 20 B0 13 DE F2 CD 0C 1C 43 0C 5F 2E 42 \r
+B0 13 7C ED 0C 93 02 20 4C 43 10 01 5C 43 10 01 \r
+82 93 D0 1E 09 20 82 93 CE 1E 06 20 B2 40 04 03 \r
+CE 1E B2 40 02 01 D0 1E B0 13 AC F1 C2 4C D7 1E \r
+4C 93 FA 27 3C 40 D4 1E 0D 43 1E 43 80 00 CC F2 \r
+31 80 06 00 81 43 02 00 D1 4C 05 00 04 00 CF 0C \r
+3F 50 06 00 81 4F 00 00 1D 4C 02 00 2E 42 0E 5C \r
+2F 4C CC 01 2C 53 B0 13 FA C6 31 50 06 00 10 01 \r
+0A 14 CA 0C 3F 40 CF 00 5F FA 0C 00 5F D2 C8 1E \r
+CA 4F 0C 00 2C 43 0C 5A B0 13 46 BF 4C 93 02 20 \r
+0C 43 02 3C 3C 40 09 00 CA 43 00 00 0A 16 10 01 \r
+7C 40 40 00 B0 13 0E E0 5C 53 7C 90 4F 00 FA 2B \r
+C2 43 8C 1C F2 40 06 00 8D 1C F2 40 05 00 8E 1C \r
+C2 43 8F 1C B2 40 00 80 90 1C C2 43 92 1C 10 01 \r
+7C 90 80 00 09 28 4C 4C 3C 80 00 01 2D 43 B0 13 \r
+9C E9 3C 80 4A 00 04 3C 4C 4C 5C 03 3C 80 4A 00 \r
+3C 90 80 FF 02 34 3C 40 80 FF 8C 11 10 01 92 C3 \r
+22 03 F2 F0 DF 00 03 02 F2 F0 1F 00 02 02 A2 C3 \r
+22 03 F2 D0 20 00 05 02 F2 D0 E0 00 04 02 A2 D3 \r
+24 03 92 D3 24 03 D2 43 F5 1E 10 01 B2 F0 FF FD \r
+36 0F 7C 40 36 00 B0 13 EA CF 7C 40 3D 00 B0 13 \r
+EA CF 7C B0 F0 FF F9 23 7C 40 3A 00 B0 13 EA CF \r
+B2 F0 FF FD 32 0F 10 01 C2 93 59 1E 0E 20 B0 13 \r
+86 A8 B0 13 0E CD 0C 93 0C 20 B0 13 2E EE B0 13 \r
+DE F2 B0 13 34 ED B0 13 B8 EF D2 43 59 1E 80 00 \r
+6C B7 10 01 4D 93 13 24 4D 4D 0E 43 5F 42 92 1C \r
+7F 90 80 00 09 2C CB 0F 5B 53 C2 4B 92 1C CB 0E \r
+0B 5C 4F 4F EF 4B 93 1C 1E 53 1D 83 EF 23 10 01 \r
+5C 93 13 20 0C 42 32 C2 03 43 2E 43 3F 40 00 1C \r
+CF 93 00 00 05 24 5D 9F 01 00 02 2C DF 83 01 00 \r
+3F 50 23 00 1E 83 F4 23 02 4C 10 01 0B 43 0D 93 \r
+03 34 3D E3 1D 53 1B D3 0C 93 03 34 3C E3 1C 53 \r
+3B E3 B0 13 04 F2 1B B3 02 24 3C E3 1C 53 2B B3 \r
+02 24 3E E3 1E 53 10 01 4C 4C 3D 40 1C 00 B0 13 \r
+1A F2 CF 0C 1F 52 7A FA EF B2 1A 00 03 24 0F 43 \r
+0D 43 05 3C 1C 52 7A FA 2F 4C 1D 4C 02 00 CC 0F \r
+10 01 C2 93 AC 1E 09 24 1F 42 A6 1E DF 83 13 00 \r
+1F 42 A6 1E CF 93 13 00 02 24 5C 43 10 01 8F 43 \r
+18 00 5D 43 B0 13 92 E0 4C 43 10 01 82 4C 1A 1F \r
+82 93 50 03 02 20 0F 43 05 3C 1F 42 50 03 1F 92 \r
+50 03 FB 23 0F 5C 82 4F 58 03 92 C3 48 03 B2 D0 \r
+10 00 48 03 10 01 31 40 FC 2B 00 18 F2 40 36 F5 \r
+06 1F 00 18 F2 40 36 F5 0A 1F B0 13 12 F5 0C 93 \r
+02 24 B0 13 EA DD 0C 43 B0 13 76 E6 B0 13 16 F5 \r
+5D 93 12 20 C2 93 EB 1E 0A 24 E2 93 EB 1E 0C 2C \r
+7C 40 5A 00 3D 40 F2 F8 5E 43 80 00 D6 BC 7C 40 \r
+5A 00 3D 40 F8 F8 F8 3F 10 01 92 B3 44 01 FD 23 \r
+32 C2 03 43 B2 40 00 A5 44 01 B2 40 40 A5 40 01 \r
+8C 4D 00 00 B2 40 00 A5 40 01 B2 40 10 A5 44 01 \r
+32 D2 10 01 B2 D0 06 00 06 0A B2 40 1D 7B 00 0A \r
+B2 40 ED 00 04 0A F2 D0 E0 00 4A 02 F2 D0 E0 00 \r
+44 02 B2 43 0A 0A B2 40 FF 00 0C 0A 10 01 C2 93 \r
+FE 1D 11 24 C2 93 76 1E 0E 24 B0 13 B6 F4 4C 93 \r
+0A 20 B0 13 76 F4 C2 43 76 1E F2 F0 BF 00 1B 02 \r
+F2 F0 BF 00 1D 02 10 01 F2 C2 03 02 F2 C2 05 02 \r
+D2 B3 8C 1C 0B 20 E2 B3 8C 1C 02 20 80 00 B8 E3 \r
+92 D3 8A 1E B2 D0 00 01 8A 1E 10 01 80 00 0C E7 \r
+10 01 3F 40 41 1E 0E 43 2B 43 6B 9F 07 20 CF 9C \r
+0B 00 04 20 CD 4E 00 00 5C 43 10 01 3F 50 0C 00 \r
+1E 53 2E 93 F1 3B 4C 43 10 01 21 83 CD 01 B0 13 \r
+42 EB 4C 93 0B 24 6C 41 3D 40 0C 00 B0 13 1A F2 \r
+EC 93 41 1E 03 20 3C 50 41 1E 01 3C 0C 43 21 53 \r
+10 01 82 93 EE 1E 09 20 82 93 EC 1E 06 20 B2 40 \r
+08 07 EC 1E B2 40 06 05 EE 1E 00 18 C2 43 F0 1E \r
+B0 13 AC F1 C2 4C F4 1E 10 01 3C 40 03 00 5C F2 \r
+20 01 7C 90 03 00 03 2C 5C 53 B0 13 A4 DD 6C 92 \r
+03 28 5C 83 B0 13 E0 EB 7C 90 03 00 EE 23 10 01 \r
+F2 40 A5 00 21 01 4E 4C 4F 4E 8F 10 0E 5F 3E 50 \r
+00 44 82 4E 26 01 92 B3 2C 01 FD 27 C2 4C 20 01 \r
+C2 43 21 01 10 01 3F 40 13 00 6F 9C 09 24 5F 4C \r
+0C 00 1F 83 07 24 1F 83 07 20 B0 13 10 D2 04 3C \r
+DC 43 0C 00 B0 13 78 AF 0C 43 10 01 F2 F0 E0 00 \r
+05 02 F2 F0 E0 00 03 02 F2 D0 1F 00 07 02 F2 F0 \r
+E0 00 19 02 F2 F0 E0 00 1D 02 F2 D0 1F 00 1B 02 \r
+10 01 1A 14 39 40 11 00 3F 40 BA 1D 3A 40 36 FA \r
+3C 4A B0 13 E8 ED 2F 52 8F 4C FC FF 8F 4D FE FF \r
+19 83 F6 23 19 16 10 01 4D 93 03 24 5F 4C 0A 00 \r
+02 3C 5F 4C 09 00 4F 93 06 24 CC 93 00 00 03 24 \r
+7F 90 20 00 02 2C 2C 43 10 01 0C 43 10 01 3C 40 \r
+E2 1E 0D 43 2E 42 B0 13 CC F2 C2 93 EA 1E 09 20 \r
+3C 40 E6 1E 3D 40 70 FA 2E 42 B0 13 BA F2 D2 43 \r
+EA 1E 10 01 A2 B3 88 1E 03 24 5C 43 B0 13 AE C5 \r
+B2 B2 88 1E 02 24 B0 13 54 B9 92 B3 88 1E 02 24 \r
+B0 13 A8 D1 82 43 88 1E 10 01 B2 B0 20 00 86 1E \r
+0E 20 B0 13 FA F3 4C 93 0A 20 F2 C2 03 02 F2 C2 \r
+05 02 F2 C2 1B 02 B0 13 F4 CA F2 D2 1B 02 10 01 \r
+4C 4C 3D 40 1C 00 B0 13 1A F2 CF 0C 1F 52 7A FA \r
+EF B2 1A 00 02 24 2C 43 10 01 1C 52 7A FA 1C 4C \r
+18 00 10 01 CE 0C 6D 4E 5D 92 7E FA 0C 24 7C 40 \r
+09 00 B0 13 DC E5 2D 42 3F 40 2C 1E 1F 53 FF 4E \r
+FF FF 1D 83 FB 23 10 01 0A 14 0A 42 32 C2 03 43 \r
+D2 93 00 1E 08 24 B0 13 F8 EE 7C 40 32 00 B0 13 \r
+EA CF D2 43 00 1E 02 4A 0A 16 10 01 0E 93 02 20 \r
+0C 43 10 01 1D 83 1C 83 1D 53 6B 4D 1C 53 6F 4C \r
+4F 9B 02 20 1E 83 F8 23 4B 4B 4C 4F 0C 8B 10 01 \r
+0A 14 CA 0C 5D 42 95 1E B0 13 A0 E7 4C 93 04 20 \r
+B0 13 BE F3 1C 43 04 3C CC 0A B0 13 E2 F3 0C 43 \r
+0A 16 10 01 82 43 96 1E 82 43 98 1E E2 42 A0 1E \r
+F2 40 1E 00 A1 1E C2 43 A2 1E C2 43 9F 1E 82 43 \r
+9A 1E 82 43 9C 1E 10 01 0D 4C 0D 93 0E 24 3B 40 \r
+8F 00 1B 83 5D 02 FD 2B 4C 4D 8C 10 8D 10 4D 4D \r
+8B 10 0D DB 12 C3 5D 00 5C 00 10 01 82 43 90 03 \r
+B2 40 C0 00 92 03 B2 D0 10 00 80 03 92 B3 82 03 \r
+FD 27 B2 F0 EF FF 80 03 92 C3 82 03 10 01 D2 93 \r
+00 1E 0D 20 7C 40 36 00 B0 13 EA CF 7C 40 3D 00 \r
+B0 13 EA CF 7C B0 F0 FF F9 23 E2 43 00 1E 10 01 \r
+5F 42 A0 1E 4F 93 09 24 7F 90 0D 00 02 2C CC 0F \r
+10 01 CC 0F 7C 80 0C 00 10 01 3C 40 0C 00 4C 5F \r
+10 01 4C 43 B0 13 10 ED 0C 93 09 24 1C 83 09 20 \r
+B0 13 C6 F4 C2 4C C2 1E 92 43 BC 1E 10 01 80 00 \r
+C6 E2 10 01 0A 14 CA 0C 5D 42 D7 1E B0 13 A0 E7 \r
+4C 93 04 20 B0 13 BE F3 1C 43 03 3C CC 0A B0 13 \r
+06 EC 0A 16 10 01 02 12 32 C2 03 43 82 4C D0 04 \r
+82 4D D2 04 82 4E E0 04 82 4F E2 04 1C 42 E4 04 \r
+1D 42 E6 04 32 41 10 01 0A 14 5C 43 B0 13 02 CF \r
+CA 0C 0A 93 07 24 2C 43 0C 5A B0 13 CA F3 CC 0A \r
+B0 13 52 C9 0A 16 10 01 D2 93 00 1E 09 24 F2 90 \r
+03 00 00 1E 08 20 B0 13 EC E8 E2 43 00 1E 10 01 \r
+32 C2 03 43 FF 3F 10 01 D2 93 00 1E 09 24 F2 90 \r
+03 00 00 1E 08 24 F2 40 03 00 00 1E 80 00 C2 F1 \r
+32 C2 03 43 FF 3F 10 01 1C 42 82 1E 3C B0 00 80 \r
+0D 7D 3D E3 3E 40 52 00 0F 43 B0 13 B6 EE 3E 40 \r
+19 00 0F 43 80 00 12 E1 B0 13 FA F3 4C 93 0A 24 \r
+4C 43 1F 42 54 03 1F 82 50 03 3F 90 F5 01 03 28 \r
+5C 43 10 01 5C 43 10 01 C2 43 C8 1E 00 18 C2 43 \r
+CA 1E B0 13 DE F2 82 4C C6 1E B0 13 AC F1 C2 4C \r
+C4 1E 4C 93 FA 27 10 01 B2 F0 CF FF 80 03 F2 F0 \r
+7F 00 03 02 F2 F0 7F 00 0B 02 B2 F0 EF FF 82 03 \r
+B0 13 AE F4 80 00 80 F4 D2 92 7E FA 2C 1E 08 24 \r
+D2 43 2A 1E 7C 40 07 00 7D 40 07 00 80 00 DC E5 \r
+32 C2 03 43 FF 3F B0 13 EC E8 7C 40 0A 00 5D 42 \r
+82 FA B0 13 DC E5 F2 90 03 00 00 1E 02 20 80 00 \r
+C2 F1 10 01 3F 40 3E 00 0E 42 32 C2 03 43 B0 13 \r
+0C EE 02 4E C2 93 23 1E 03 20 1F 83 3F 93 F4 23 \r
+10 01 CF 0C 82 4F 54 03 92 C3 44 03 B0 13 B2 F3 \r
+2F 83 0F 8C 3F 90 00 80 02 28 92 D3 44 03 10 01 \r
+CF 0D 7C 90 2A 00 0A 2C 4E 4C 5D 4E C2 F9 4C 4C \r
+5C 02 1C 4C 16 1D CE 0D 80 00 2E D5 10 01 0C 9D \r
+02 2C 80 00 BA F2 0C 5E 0D 5E 0E 93 06 24 1D 83 \r
+1C 83 EC 4D 00 00 1E 83 FA 23 10 01 CD 0C C2 93 \r
+EA 1E 02 24 4C 43 10 01 3C 40 E6 1E 2E 42 B0 13 \r
+BA F2 D2 43 EA 1E 5C 43 10 01 B0 13 96 F3 4C 93 \r
+08 20 4C 43 4D 43 B0 13 30 F0 5C 43 5D 43 80 00 \r
+30 F0 4C 43 FB 3F 3C 40 00 1C 0D 43 3E 40 46 00 \r
+B0 13 CC F2 3C 40 46 1C 0D 43 3E 40 46 00 80 00 \r
+CC F2 0A 14 CF 0C CC 0D 2A 43 0F 93 05 20 B0 13 \r
+6C F0 4C 93 01 24 0A 43 CC 0A 0A 16 10 01 21 82 \r
+CF 0C CC 0D A1 4F 00 00 91 4F 02 00 02 00 CD 01 \r
+2E 42 B0 13 4E F0 21 52 10 01 1F 42 A6 1E 5C 4F \r
+11 00 6C 93 02 2C 3C 42 10 01 5C 53 4C 5C 4C 5C \r
+4C 4C 10 01 7C 90 03 00 07 2C 4C 4C 5D 4C 86 FA \r
+7C 40 3E 00 80 00 DC E5 32 C2 03 43 FF 3F 0C 93 \r
+0A 24 5C 0F 1C 53 0F 42 32 C2 03 43 B0 13 0C EE \r
+02 4F 1C 83 F8 23 10 01 B0 13 AC F1 7C F0 0F 00 \r
+5C 53 4E 4C 1C 42 28 1E B0 13 2E F1 1E 83 FA 23 \r
+10 01 B2 90 06 00 0E 07 08 20 92 42 20 07 44 1F \r
+D2 43 46 1F B1 C0 D0 00 00 00 00 13 1C 42 7E 1E \r
+CF 0C 5F 0A 0C 5F 3D 40 05 00 B0 13 9C E9 3C 50 \r
+40 01 10 01 5D 42 F4 1E B0 13 A0 E7 4C 93 02 24 \r
+0C 43 10 01 B0 13 BE F3 1C 43 10 01 5C 42 22 1E \r
+3D 40 6D 00 B0 13 1A F2 7C 50 43 00 C2 4C 22 1E \r
+10 01 B2 F0 FF FD 32 0F 7C 40 34 00 B0 13 EA CF \r
+B2 D0 00 02 36 0F 10 01 0F 42 32 C2 03 43 7C D0 \r
+C0 00 C2 4C 13 0F 5C 42 22 0F 02 4F 10 01 82 43 \r
+BA 1E 82 43 BE 1E 82 43 C0 1E 82 43 BC 1E C2 43 \r
+C2 1E 10 01 0E 43 0F 4C 1C 43 5F 02 0E 6E 0E 9D \r
+01 28 0E 8D 0C 6C F9 2B 10 01 02 12 32 C2 03 43 \r
+82 4C C0 04 82 4D C8 04 1C 42 CA 04 32 41 10 01 \r
+B2 40 FF 7F 52 03 B2 D0 10 00 42 03 B2 D0 24 01 \r
+40 03 10 01 5F 42 FE 1E 5F 83 D2 83 FE 1E 0F 93 \r
+02 20 80 00 98 EF 10 01 5D 93 07 20 7C 40 5B 00 \r
+3D 40 08 F9 5E 43 80 00 D6 BC 10 01 5D 93 07 20 \r
+7C 40 5A 00 3D 40 00 F9 5E 43 80 00 D6 BC 10 01 \r
+3C 80 05 00 05 24 3C 80 05 00 02 24 4C 43 10 01 \r
+5C 43 10 01 B2 40 D9 07 34 1F F2 42 32 1F D2 43 \r
+31 1F C2 43 30 1F 10 01 1F 42 50 03 82 4F 22 1F \r
+1F 92 50 03 F9 23 80 00 72 D4 CF 0C 0E 93 05 24 \r
+1F 53 FF 4D FF FF 1E 83 FB 23 10 01 0E 93 06 24 \r
+4D 4D 1C 53 CC 4D FF FF 1E 83 FB 23 10 01 C2 93 \r
+EA 1E 03 24 3C 40 E6 1E 10 01 3C 40 70 FA 10 01 \r
+0D 93 02 20 0C 93 04 24 82 4C EC 1E 82 4D EE 1E \r
+10 01 0D 93 02 20 0C 93 04 24 82 4C CE 1E 82 4D \r
+D0 1E 10 01 B0 13 A8 E6 B2 F0 EF FF 32 0F B2 D0 \r
+10 00 36 0F 10 01 A2 43 FC 1E 92 C3 44 03 B2 D0 \r
+10 00 44 03 10 01 A2 D2 80 03 82 43 80 03 B2 D0 \r
+00 02 80 03 10 01 CE 0C 3C 40 E8 03 B0 13 2E F1 \r
+1E 83 FA 23 10 01 82 43 32 0F 82 43 36 0F B0 13 \r
+A8 E6 80 00 66 F3 7C 40 36 00 B0 13 2E C8 7C 40 \r
+39 00 80 00 2E C8 4F 43 C2 93 30 1F 01 20 5F 43 \r
+C2 4F 30 1F 10 01 4F 43 C2 93 9F 1E 01 20 5F 43 \r
+C2 4F 9F 1E 10 01 4C 43 F2 90 0C 00 A0 1E 01 2C \r
+5C 43 10 01 F2 40 0F 00 2A 1F B2 40 2C 01 2C 1F \r
+10 01 1C 42 50 03 1C 92 50 03 FB 23 10 01 C2 93 \r
+24 1E 02 24 D2 43 23 1E 10 01 3D 40 01 1E 3E 40 \r
+21 00 80 00 BA F2 5C 43 B0 13 44 D6 6C 43 80 00 \r
+44 D6 DC 93 0C 00 02 20 80 00 88 DF 10 01 B0 13 \r
+BE F4 B2 40 2B 5A 5C 01 10 01 4C 43 A2 93 BA 1E \r
+01 20 5C 43 10 01 4C 43 92 93 BA 1E 01 20 5C 43 \r
+10 01 4C 43 82 93 72 1D 01 24 5C 43 10 01 CF 0C \r
+CC 0D CD 0F 2E 42 80 00 4E F0 CD 0C 3C 40 E2 1E \r
+2E 42 80 00 BA F2 7C 40 03 00 7D 40 0B 00 80 00 \r
+5A D8 5C 93 02 20 CC 0D 10 01 CC 0E 10 01 1C 42 \r
+44 03 7C F0 10 00 10 01 B2 F0 EF FF 44 03 80 00 \r
+44 E6 B0 13 AC F1 C2 4C 4A 1F 10 01 B0 13 AC F1 \r
+C2 4C 95 1E 10 01 7C 40 03 00 4D 43 80 00 5A D8 \r
+C2 43 FE 1E C2 43 04 1F 10 01 1C 42 14 1D 8C 10 \r
+5C F3 10 01 1C 42 14 1D 5C 0F 5C F3 10 01 5C 42 \r
+20 1F 8C 11 10 01 4C 5C C2 4C AB 1E 10 01 B2 F0 \r
+EF FF 48 03 10 01 1C 43 5C F2 8C 1C 10 01 32 D0 \r
+D8 00 03 43 10 01 5C 42 3C 1F 10 01 C2 4C AA 1E \r
+10 01 C2 4C AC 1E 10 01 4D 43 80 00 3E D1 92 D3 \r
+44 03 10 01 92 C3 44 03 10 01 5C 42 00 1E 10 01 \r
+5C 42 76 1E 10 01 82 43 D8 1E 10 01 CC 43 00 00 \r
+10 01 3C 40 7E FA 10 01 82 43 72 1D 10 01 80 00 \r
+2C AE 1C 43 10 01 03 43 FF 3F 2C 43 10 01 2C 43 \r
+10 01 4C 43 10 01 6C 43 10 01 0C 43 10 01 0C 43 \r
+10 01 03 43 10 01 10 01 10 01 30 30 30 30 30 31 \r
+30 30 32 30 30 33 30 30 34 30 30 35 30 30 36 30 \r
+30 37 30 30 38 30 30 39 30 31 30 30 31 31 30 31 \r
+32 30 31 33 30 31 34 30 31 35 30 31 36 30 31 37 \r
+30 31 38 30 31 39 30 32 30 30 32 31 30 32 32 30 \r
+32 33 30 32 34 30 32 35 30 32 36 30 32 37 30 32 \r
+38 30 32 39 30 33 30 30 33 31 30 33 32 30 33 33 \r
+30 33 34 30 33 35 30 33 36 30 33 37 30 33 38 30 \r
+33 39 30 34 30 30 34 31 30 34 32 30 34 33 30 34 \r
+34 30 34 35 30 34 36 30 34 37 30 34 38 30 34 39 \r
+30 35 30 30 35 31 30 35 32 30 35 33 30 35 34 30 \r
+35 35 30 35 36 30 35 37 30 35 38 30 35 39 30 36 \r
+30 30 36 31 30 36 32 30 36 33 30 36 34 30 36 35 \r
+30 36 36 30 36 37 30 36 38 30 36 39 30 37 30 30 \r
+37 31 30 37 32 30 37 33 30 37 34 30 37 35 30 37 \r
+36 30 37 37 30 37 38 30 37 39 30 38 30 30 38 31 \r
+30 38 32 30 38 33 30 38 34 30 38 35 30 38 36 30 \r
+38 37 30 38 38 30 38 39 30 39 30 30 39 31 30 39 \r
+32 30 39 33 30 39 34 30 39 35 30 39 36 30 39 37 \r
+30 39 38 30 39 39 31 30 30 31 30 31 31 30 32 31 \r
+30 33 31 30 34 31 30 35 31 30 36 31 30 37 31 30 \r
+38 31 30 39 31 31 30 31 31 31 31 31 32 31 31 33 \r
+31 31 34 31 31 35 31 31 36 31 31 37 31 31 38 31 \r
+31 39 31 32 30 31 32 31 31 32 32 31 32 33 31 32 \r
+34 31 32 35 31 32 36 31 32 37 31 32 38 31 32 39 \r
+31 33 30 31 33 31 31 33 32 31 33 33 31 33 34 31 \r
+33 35 31 33 36 31 33 37 31 33 38 31 33 39 31 34 \r
+30 31 34 31 31 34 32 31 34 33 31 34 34 31 34 35 \r
+31 34 36 31 34 37 31 34 38 31 34 39 31 35 30 31 \r
+35 31 31 35 32 31 35 33 31 35 34 31 35 35 31 35 \r
+36 31 35 37 31 35 38 31 35 39 31 36 30 31 36 31 \r
+31 36 32 31 36 33 31 36 34 31 36 35 31 36 36 31 \r
+36 37 31 36 38 31 36 39 31 37 30 31 37 31 31 37 \r
+32 31 37 33 31 37 34 31 37 35 31 37 36 31 37 37 \r
+31 37 38 31 37 39 31 38 30 00 01 80 40 20 10 08 \r
+84 42 21 90 48 A4 52 29 14 0A 85 C2 61 B0 58 AC \r
+D6 6B 35 9A CD 66 33 99 4C A6 53 A9 54 2A 95 CA \r
+E5 F2 79 3C 9E CF 67 B3 D9 6C B6 5B 2D 16 0B 05 \r
+82 41 A0 50 28 94 4A A5 D2 69 34 1A 8D 46 23 91 \r
+C8 E4 72 39 1C 8E C7 E3 F1 F8 FC FE FF 7F 3F 1F \r
+0F 07 83 C1 E0 70 38 9C CE E7 F3 F9 7C BE DF 6F \r
+37 9B 4D 26 13 89 44 22 11 88 C4 62 31 98 CC E6 \r
+73 B9 5C AE D7 EB 75 BA DD 6E B7 DB 6D 36 1B 0D \r
+06 03 81 C0 60 30 18 8C C6 63 B1 D8 EC F6 7B 3D \r
+1E 8F 47 A3 D1 E8 F4 7A BD 5E AF 57 AB 55 AA D5 \r
+EA F5 FA FD 7E BF 5F 2F 17 8B 45 A2 51 A8 D4 6A \r
+B5 DA ED 76 3B 1D 0E 87 C3 E1 F0 78 BC DE EF 77 \r
+BB 5D 2E 97 CB 65 B2 59 2C 96 4B 25 92 49 24 12 \r
+09 04 02 01 80 40 20 10 08 84 42 21 90 48 A4 52 \r
+29 14 0A 85 C2 61 B0 58 AC D6 6B 35 9A CD 66 33 \r
+99 4C A6 53 A9 54 2A 95 CA E5 86 F3 00 00 38 F5 \r
+00 00 86 AB 00 00 94 F4 00 00 6C F8 38 F5 00 00 \r
+38 F5 00 00 00 BC 00 00 94 F4 00 00 7E F8 38 F5 \r
+00 00 38 F5 00 00 42 BA 00 00 94 F4 00 00 90 F8 \r
+3E E7 00 00 F6 F4 00 00 44 D3 00 00 94 F4 00 00 \r
+5A F8 76 F3 00 00 38 F5 00 00 7C BE 00 00 8A F4 \r
+00 00 B4 F8 18 EB 00 00 38 F5 00 00 58 F2 00 00 \r
+94 F4 00 00 C6 F8 EA EC 00 00 38 F5 00 00 6C F2 \r
+00 00 94 F4 00 00 D8 F8 B4 D9 00 00 38 F5 00 00 \r
+70 EA 00 00 94 F4 00 00 A2 F8 20 20 44 4F 4E 45 \r
+00 00 20 43 4F 4E 46 00 20 52 46 42 53 4C 00 00 \r
+20 20 53 59 4E 43 00 00 20 44 4C 4F 47 00 46 41 \r
+49 4C 00 00 45 52 52 00 30 30 30 30 30 30 30 00 \r
+2D 2D 2D 00 20 52 41 4D 00 00 20 4F 46 46 00 00 \r
+20 20 4F 4E 00 00 20 4E 4F 4D 45 4D 00 00 4C 4F \r
+42 41 54 54 00 00 20 20 4F 50 45 4E 00 00 20 20 \r
+4C 4F 3F 54 00 00 02 1B 01 1E 17 3C 18 10 06 1E \r
+08 05 03 47 0B 08 0C 00 0D 21 0E 71 0F 7A 10 7B \r
+11 83 12 13 13 22 14 F8 15 42 19 1D 1A 1C 1B C7 \r
+1C 00 1D B2 21 B6 22 10 23 EA 24 2A 25 00 26 1F \r
+2C 81 2D 35 2E 09 F5 60 B6 F2 63 D3 D7 70 F7 F3 \r
+00 00 00 00 00 86 00 77 C7 95 E6 97 17 F3 67 05 \r
+F0 87 85 75 46 C6 37 F5 06 D3 87 C4 C4 02 67 E3 \r
+B6 00 03 01 04 08 10 80 80 80 80 20 40 02 01 80 \r
+04 02 10 20 40 08 08 80 08 08 08 08 F7 F7 F7 F7 \r
+20 40 04 80 7F 7F 7F 7F 7F 10 01 80 2F 1E 1B 07 \r
+37 B2 0A 04 00 00 00 0C 00 21 64 EC 4D 3B 15 11 \r
+F8 57 07 0C 10 1D 1C C7 10 B0 FF FF F9 B6 10 EA \r
+2A 00 1F 00 67 FF 00 00 6F 00 1C 02 DD 03 B1 05 \r
+9D 07 A2 09 C4 0B 07 0E 6E 10 01 13 C6 15 C8 18 \r
+11 1C B5 1F CC 23 07 04 F5 03 E8 03 B6 03 84 03 \r
+52 03 20 03 EE 02 BC 02 8A 02 58 02 26 02 F4 01 \r
+C2 01 90 01 5E 01 2C 01 A0 ED 00 00 94 EE 00 00 \r
+94 F1 00 00 2E F5 00 00 2A F5 00 00 D4 E4 00 00 \r
+79 56 34 12 02 01 01 01 00 00 5A 1E 5A 1E FF FF \r
+FF FF 00 32 50 6E 0F 27 8C 00 02 00 00 \r
+@fa8e\r
+01 00 1C 1F 00 00 01 00 E0 1E 00 00 01 00 E1 1E \r
+0A 00 54 00 16 1D 20 0A 20 0A 20 0A 20 0A 24 0A \r
+2A 0A 29 0A 27 0A 26 0A 24 0A 24 0A 26 0A 26 0A \r
+24 0A 26 0A 24 0A 26 0A 26 0A 26 0A 21 0A 22 0A \r
+20 0A 23 0A 24 0A 25 0A 26 0A 21 0A 22 0A 23 0A \r
+25 0A 20 0A 20 0A 24 0A 2B 0A 2B 0A 2A 0A 29 0A \r
+28 0A 27 0A 20 0A 24 0A 28 0A 02 00 40 1F 00 00 \r
+02 00 42 1F 00 00 01 00 59 1E 00 00 01 00 00 1E \r
+00 00 01 00 22 1E 00 00 01 00 23 1E 00 00 01 00 \r
+24 1E 00 00 02 00 26 1E 00 00 02 00 28 1E 00 00 \r
+01 00 2A 1E 00 00 01 00 2C 1E FF 00 04 00 30 1E \r
+00 00 00 00 04 00 34 1E 00 00 00 00 04 00 38 1E \r
+00 00 00 00 01 00 EA 1E 00 00 01 00 C4 1E 00 00 \r
+02 00 C6 1E 00 00 01 00 C8 1E 00 00 04 00 CA 1E \r
+00 00 00 00 01 00 3C 1E 01 00 01 00 95 1E 00 00 \r
+02 00 48 1F 00 00 01 00 4A 1F 00 00 04 00 CE 1E \r
+00 00 00 00 01 00 D2 1E 00 00 01 00 D6 1E 00 00 \r
+01 00 D7 1E 00 00 04 00 EC 1E 00 00 00 00 04 00 \r
+F0 1E 00 00 00 00 01 00 F4 1E 00 00 01 00 AA 1E \r
+00 00 01 00 AB 1E 00 00 01 00 AC 1E 00 00 01 00 \r
+AD 1E 00 00 02 00 F6 1E 00 00 02 00 F8 1E 00 00 \r
+01 00 FA 1E 00 00 01 00 FB 1E 00 00 01 00 20 1F \r
+00 00 02 00 22 1F 00 00 02 00 38 1F 00 00 01 00 \r
+3A 1F 00 00 00 00 \r
+@ffe0\r
+F6 A4 \r
+@ffea\r
+64 E4 60 D9 C4 A6 62 F1 \r
+@fffe\r
+46 EA \r
+q\r
diff --git a/chronos-ti/Recovery/Chronos Watch/Applications/Recovery_ez430_chronos_datalogger_915MHz.txt b/chronos-ti/Recovery/Chronos Watch/Applications/Recovery_ez430_chronos_datalogger_915MHz.txt
new file mode 100755 (executable)
index 0000000..8511b06
--- /dev/null
@@ -0,0 +1,1513 @@
+@9e00\r
+5A 14 31 80 1A 00 CA 0E B0 13 B2 E6 0E 43 3F 40 \r
+C8 42 B0 13 CE C8 81 4C 12 00 81 4D 14 00 CC 0A \r
+B0 13 C0 ED 0E 43 3F 40 20 41 B0 13 CE C8 81 4C \r
+16 00 81 4D 18 00 36 40 11 00 37 40 BA 1D 0A 43 \r
+28 47 19 47 02 00 CC 08 CD 09 1E 41 12 00 1F 41 \r
+14 00 B0 13 16 DC 0C 93 0A 38 81 48 08 00 81 49 \r
+0A 00 27 52 1A 53 16 83 EB 23 4A 4A 03 3C 4A 4A \r
+0A 93 7E 24 3A 90 0F 00 3D 38 3A 90 0F 00 23 24 \r
+B0 13 86 A0 1E 42 FA 1D 1F 42 FC 1D B0 13 BC B0 \r
+C9 0C CA 0D 1C 42 FA 1D 1D 42 FC 1D 1E 42 F6 1D \r
+1F 42 F8 1D B0 13 3A A0 1C 42 1E FA 1C 82 1C FA \r
+B0 13 4C A0 1C 42 1E FA B0 13 60 A0 81 4C 00 00 \r
+81 4D 02 00 73 3C B0 13 24 A0 C9 0C CA 0D 1C 42 \r
+F6 1D 1D 42 F8 1D 1E 41 08 00 1F 41 0A 00 B0 13 \r
+3A A0 1C 42 1C FA 1C 82 1A FA B0 13 4C A0 1C 42 \r
+1A FA E2 3F C9 0A 59 02 16 49 FC F9 5A 06 17 4A \r
+BA 1D 18 4A BC 1D B0 13 24 A0 C5 0C CA 0D B0 13 \r
+86 A0 CE 07 CF 08 B0 13 BC B0 3E 40 34 80 3F 40 \r
+37 3A B0 13 10 A0 CC 05 CD 0A B0 13 4A C2 C5 0C \r
+CA 0D CC 07 CD 08 1E 41 08 00 1F 41 0A 00 B0 13 \r
+90 A0 CC 05 CD 0A B0 13 CE C8 C8 0C CA 0D 1C 49 \r
+FE F9 0C 86 B0 13 E2 E4 CE 0C CF 0D CC 08 CD 0A \r
+B0 13 4A C2 C9 0C CA 0D CC 06 B0 13 60 A0 A6 3F \r
+B0 13 86 A0 1E 42 BA 1D 1F 42 BC 1D B0 13 BC B0 \r
+C9 0C CA 0D 1C 42 BE 1D 1D 42 C0 1D 1E 42 BA 1D \r
+1F 42 BC 1D B0 13 3A A0 1C 42 00 FA 1C 82 FE F9 \r
+B0 13 56 A0 81 4C 00 00 81 4D 02 00 2C 41 1D 41 \r
+02 00 B0 13 6A A0 3E 40 F4 FD 3F 40 D4 3B B0 13 \r
+10 A0 1C 41 16 00 1D 41 18 00 B0 13 CE C8 81 4C \r
+04 00 81 4D 06 00 1C 41 04 00 1D 41 06 00 B0 13 \r
+6A A0 2E 41 1F 41 02 00 B0 13 4A C2 81 4C 0C 00 \r
+81 4D 0E 00 1C 41 0C 00 1D 41 0E 00 B0 13 54 DE \r
+81 4C 10 00 1C 41 10 00 31 50 1A 00 55 16 10 01 \r
+B0 13 4A C2 CE 0C CF 0D 0C 43 3D 40 80 3F B0 13 \r
+90 A0 10 01 1C 41 16 00 1D 41 18 00 1E 41 0C 00 \r
+1F 41 0E 00 B0 13 BC B0 10 01 B0 13 90 A0 CC 09 \r
+CD 0A B0 13 CE C8 C9 0C CA 0D 10 01 B0 13 56 A0 \r
+C9 0C CA 0D 10 01 B0 13 78 A0 B0 13 4A C2 10 01 \r
+B0 13 78 A0 B0 13 C2 B0 10 01 3E 40 E7 6F 3F 40 \r
+63 3B B0 13 4A C2 10 01 B0 13 E2 E4 CE 0C CF 0D \r
+CC 09 CD 0A 10 01 1C 41 16 00 1D 41 18 00 10 01 \r
+B0 13 BC B0 CE 0C CF 0D 10 01 4A 14 31 82 B0 13 \r
+9C F3 C8 0C CF 08 3F 50 FF 7F 81 4F 06 00 91 41 \r
+06 00 04 00 82 43 A8 1E 4A 43 49 43 4C 49 B0 13 \r
+04 A3 1F 4C 18 00 1F 83 1D 24 1F 83 14 24 D2 B3 \r
+36 1F 47 24 1E 42 B0 1E 1F 42 B2 1E 3E F3 3F F0 \r
+FF 00 1F 9C 02 00 3D 20 2E 9C 3B 20 D2 C3 36 1F \r
+82 43 A8 1E 36 3C 5A 53 B0 13 32 DB 4C 93 31 24 \r
+C7 09 2F 3C B0 13 D2 F0 C6 0C CC 09 B0 13 A6 E1 \r
+4C 93 0C 20 CC 09 CD 06 CE 08 B0 13 1C B3 1F 42 \r
+A6 1E AF 93 18 00 09 20 5A 53 07 3C 82 43 A8 1E \r
+E2 B2 36 1F 02 20 B0 13 80 E5 1F 42 A6 1E 9F 93 \r
+18 00 0F 20 CF 01 3F 50 03 00 81 4F 00 00 CC 06 \r
+CD 01 3D 50 06 00 CE 01 2E 52 CF 01 2F 53 B0 13 \r
+EA D9 59 53 AB 27 4A 93 50 24 92 93 A8 1E 18 38 \r
+4C 47 B0 13 04 A3 CC 07 B0 13 94 C1 4C 93 10 24 \r
+5A 83 CF 01 3F 50 03 00 81 4F 00 00 7C 42 CD 01 \r
+3D 50 06 00 CE 01 2E 52 CF 01 2F 53 B0 13 EA D9 \r
+4A 93 33 24 1F 42 A4 1E 0F 88 1F 93 2C 34 E2 B2 \r
+36 1F 0D 20 E2 D2 36 1F C2 93 AD 1E 04 20 B2 50 \r
+E0 7F A4 1E 20 3C B2 50 C0 53 A4 1E 1C 3C E2 C2 \r
+36 1F C2 93 AD 1E 03 24 3F 40 40 6C 02 3C 3F 40 \r
+20 00 82 5F A4 1E 49 43 4C 49 B0 13 04 A3 AC 93 \r
+18 00 07 20 CC 09 B0 13 CA E9 4C 93 02 20 5A 83 \r
+04 24 59 53 F1 27 4A 93 0E 20 F2 F0 F9 00 36 1F \r
+91 91 06 00 04 00 02 24 0E 43 08 3C B0 13 42 F4 \r
+A2 43 FC 1E 6C 3C E2 D3 36 1F 1E 43 1F 41 06 00 \r
+0F 88 0F 93 50 38 0E 93 38 24 E2 B2 36 1F 15 20 \r
+1F 41 06 00 1F 82 A4 1E 3F 80 42 00 0F 93 2D 38 \r
+C2 43 FA 1E C2 43 FB 1E F2 D0 18 00 36 1F 92 42 \r
+A4 1E F6 1E A2 43 FC 1E 48 3C 1F 41 06 00 0F 88 \r
+3F 80 42 00 1F 93 19 38 C2 43 FA 1E C2 43 FB 1E \r
+F2 D0 18 00 36 1F 1F 41 06 00 1F 82 A4 1E 3F 80 \r
+42 00 0F 93 05 34 1F 41 06 00 3F 80 42 00 02 3C \r
+1F 42 A4 1E 82 4F F6 1E 26 3C D2 41 02 00 FA 1E \r
+D2 41 03 00 FB 1E 5F 42 36 1F 7F C2 7F D0 10 00 \r
+C2 4F 36 1F 92 41 06 00 F6 1E 92 41 04 00 F8 1E \r
+82 43 FC 1E 12 3C D2 91 02 00 FA 1E 09 24 D2 41 \r
+02 00 FA 1E D2 41 03 00 FB 1E F2 D0 10 00 36 1F \r
+92 41 04 00 F6 1E 92 43 FC 1E D2 C3 36 1F 31 52 \r
+46 16 10 01 3D 40 1C 00 B0 13 F2 F1 1C 52 64 FA \r
+82 4C A6 1E 10 01 6A 14 31 80 20 00 C8 0F C9 0D \r
+CA 0E 81 43 0C 00 81 43 0E 00 B0 13 E2 E4 81 4C \r
+14 00 81 4D 16 00 CC 09 CD 0A B0 13 B2 E6 0E 43 \r
+3F 40 C8 42 B0 13 CE C8 81 4C 18 00 81 4D 1A 00 \r
+CC 08 B0 13 C0 ED 0E 43 3F 40 20 41 B0 13 CE C8 \r
+81 4C 1C 00 81 4D 1E 00 1C 41 14 00 1D 41 16 00 \r
+3E 40 F4 FD 3F 40 D4 3B B0 13 4A C2 1E 41 1C 00 \r
+1F 41 1E 00 B0 13 C2 B0 81 4C 10 00 81 4D 12 00 \r
+1C 41 10 00 1D 41 12 00 3E 40 E7 6F 3F 40 63 3B \r
+B0 13 4A C2 CE 0C CF 0D 1C 41 14 00 1D 41 16 00 \r
+B0 13 CE C8 81 4C 08 00 81 4D 0A 00 36 40 10 00 \r
+37 40 FE F9 0A 43 2C 47 B0 13 BC A4 CE 08 CF 09 \r
+B0 13 16 DC 0C 93 08 38 81 48 0C 00 81 49 0E 00 \r
+27 53 1A 53 16 83 EF 23 4A 4A 5A 02 1C 4A 1E FA \r
+B0 13 C0 ED C6 0C C7 0D 1C 4A FE F9 B0 13 BC A4 \r
+B0 13 E0 A4 C4 0C C5 0D 1C 41 08 00 1D 41 0A 00 \r
+CE 08 CF 09 B0 13 BC B0 3E 40 82 A8 3F 40 7B 38 \r
+B0 13 4A C2 CE 0C CF 0D 0C 43 3D 40 80 3F B0 13 \r
+CE A4 C4 0C C5 0D 1C 4A 20 FA B0 13 C0 ED CE 06 \r
+CF 07 B0 13 CE A4 C5 0C CA 0D CC 08 CD 09 B0 13 \r
+E0 A4 CE 0C CF 0D CC 05 CD 0A B0 13 CE C8 CE 06 \r
+CF 07 B0 13 C2 B0 81 4C 04 00 81 4D 06 00 1C 41 \r
+18 00 1D 41 1A 00 1E 41 04 00 1F 41 06 00 B0 13 \r
+CE C8 81 4C 00 00 81 4D 02 00 38 40 11 00 3A 40 \r
+BA 1D 39 40 20 FA 3C 49 B0 13 C0 ED 2E 41 1F 41 \r
+02 00 B0 13 4A C2 2A 52 8A 4C FC FF 8A 4D FE FF \r
+18 83 F1 23 31 50 20 00 64 16 10 01 B0 13 E2 E4 \r
+C8 0C C9 0D 1C 41 0C 00 1D 41 0E 00 10 01 B0 13 \r
+BC B0 CE 0C CF 0D CC 04 CD 05 B0 13 4A C2 10 01 \r
+1E 41 10 00 1F 41 12 00 B0 13 BC B0 10 01 4F 14 \r
+5D 42 1B 02 B2 B0 20 00 D8 1E D4 20 B2 B0 40 00 \r
+D8 1E D0 20 82 43 D8 1E 5E 42 1D 02 4E FD 4B 43 \r
+B0 13 FC F3 4C 93 62 20 7E B0 1F 00 0F 24 32 C2 \r
+03 43 C2 43 1B 02 32 D2 3C 40 A3 00 B0 13 3C DA \r
+92 42 96 1E 9A 1E 92 42 98 1E 9C 1E 6E B2 39 20 \r
+6E B3 22 20 7E B0 10 00 17 20 5E B3 0E 20 7E B2 \r
+6C 24 F2 B2 01 02 69 24 D2 43 DD 1E C2 43 DC 1E \r
+F2 D2 03 02 F2 D2 05 02 60 3C D2 B3 01 02 5D 24 \r
+B2 D2 D8 1E 5B 43 59 3C F2 B0 10 00 01 02 55 24 \r
+A2 D2 D8 1E 5B 43 51 3C E2 B3 01 02 0B 20 E2 B3 \r
+19 02 4B 24 A2 D3 D8 1E B2 F0 FF FE D8 1E E2 C3 \r
+19 02 43 3C A2 D3 D8 1E B2 F0 FF FE D8 1E 5B 43 \r
+3C 3C E2 B2 01 02 0B 20 E2 B2 19 02 36 24 92 D3 \r
+D8 1E B2 F0 7F FF D8 1E E2 C2 19 02 2E 3C 92 D3 \r
+D8 1E B2 F0 7F FF D8 1E 5B 43 27 3C D2 53 E0 1E \r
+5F 42 E0 1E 5F 83 7F 90 07 00 05 28 F2 F0 0F 00 \r
+7A 1D C2 43 E0 1E 6E B2 13 20 6E B3 0D 20 7E B0 \r
+10 00 06 20 5E B3 11 24 F2 D0 20 00 78 1D 0D 3C \r
+F2 D0 30 00 7A 1D 07 3C F2 D0 20 00 7A 1D 03 3C \r
+F2 D0 10 00 7A 1D F2 D2 78 1D A2 B3 D8 1E 03 24 \r
+B2 B2 D8 1E 0D 20 4B 93 0D 24 B2 B0 10 00 86 1E \r
+02 20 B0 13 60 DC 3C 40 00 20 B0 13 3C DA 02 3C \r
+82 43 D8 1E 7E B0 20 00 02 24 A2 D2 88 1E 7E B0 \r
+40 00 02 24 A2 D3 88 1E 92 B3 D8 1E 03 20 A2 B3 \r
+D8 1E 18 24 3C 40 66 06 B0 13 3C DA E2 B2 01 02 \r
+07 24 E2 D2 19 02 92 C3 D8 1E B2 D0 80 00 D8 1E \r
+E2 B3 01 02 07 24 E2 D3 19 02 A2 C3 D8 1E B2 D0 \r
+00 01 D8 1E 32 C2 03 43 C2 43 1D 02 C2 4D 1B 02 \r
+32 D2 B1 C0 F0 00 14 00 4B 16 00 13 4F 14 B2 F0 \r
+EF FF 42 03 92 C3 42 03 B2 80 00 80 52 03 B2 D0 \r
+10 00 42 03 B0 13 1E D5 B2 D0 10 00 14 1D B0 13 \r
+F0 F3 4C 93 C7 20 B0 13 FC F3 4C 93 11 24 B2 90 \r
+03 00 72 1D 0D 20 C2 93 76 1D 08 20 7C 40 5A 00 \r
+3D 40 EA F8 5E 43 B0 13 E0 BC 02 3C D2 83 76 1D \r
+E2 93 9E 1E 02 28 92 D3 88 1E B0 13 A0 F4 4C 93 \r
+02 24 B2 D2 88 1E B0 13 DA F4 4C 93 02 24 A2 D3 \r
+88 1E B0 13 E4 F3 4C 93 02 24 B0 13 4A EE B2 B0 \r
+20 00 86 1E 10 24 5E 42 2A 1F CF 0E 5F 83 C2 4F \r
+2A 1F 4E 93 08 20 92 D3 8A 1E B2 D0 20 00 8A 1E \r
+F2 40 0F 00 2A 1F 82 93 8A 1E 0F 24 92 B3 8A 1E \r
+08 20 A2 B2 8A 1E 09 24 A2 C2 8A 1E 92 D3 14 1D \r
+04 3C 92 C3 8A 1E A2 D3 8A 1E A2 B3 86 1E 0E 24 \r
+1F 42 96 1E 1E 42 98 1E 1F 82 9A 1E 1E 72 9C 1E \r
+03 20 3F 90 1F 00 02 28 92 D3 86 1E D2 93 DD 1E \r
+0E 20 E2 92 DC 1E 03 2C D2 53 DC 1E 08 3C F2 C2 \r
+03 02 F2 C2 05 02 C2 43 DC 1E C2 43 DD 1E E2 B3 \r
+01 02 03 24 D2 B3 01 02 2F 20 C2 43 1C 1F E2 B2 \r
+01 02 11 24 D2 53 DA 1E F2 90 03 00 DA 1E 0D 28 \r
+B2 D0 20 00 D8 1E B2 F0 7F FF D8 1E C2 43 DA 1E \r
+E2 C2 19 02 02 3C C2 43 DA 1E E2 B3 01 02 11 24 \r
+D2 53 DB 1E F2 90 03 00 DB 1E 2C 28 B2 D0 40 00 \r
+D8 1E B2 F0 FF FE D8 1E C2 43 DB 1E E2 C3 19 02 \r
+21 3C C2 43 DB 1E 1E 3C D2 53 1C 1F 5F 42 1C 1F \r
+5F 83 7F 90 03 00 16 28 1F 42 86 1E 2F C2 2E 42 \r
+1E C2 86 1E 0E DF 82 4E 86 1E 92 D3 8A 1E A2 B2 \r
+86 1E 04 20 B2 D0 10 00 8A 1E 02 3C B2 D2 8A 1E \r
+C2 43 1C 1F B1 C0 D0 00 14 00 4B 16 00 13 3C 40 \r
+01 1E 0D 43 3E 40 21 00 B0 13 B6 F2 7C 40 30 00 \r
+B0 13 6C CF 7C 40 30 00 B0 13 0E DE 4C 93 AF 20 \r
+7C 40 31 00 B0 13 0E DE 7C 90 06 00 A5 20 7C 40 \r
+36 00 B0 13 6C CF B0 13 04 AA FD 23 B2 40 01 02 \r
+34 0F 0F 42 32 C2 03 43 B2 B0 10 00 02 0F FC 27 \r
+B2 40 51 7E 10 0F B2 B0 10 00 02 0F FC 27 F2 40 \r
+3D 00 11 0F B2 B0 10 00 02 0F FC 27 F2 40 FE 00 \r
+11 0F B2 B0 20 00 02 0F FC 27 C2 43 10 0F B2 B0 \r
+80 00 02 0F FC 27 F2 90 51 00 20 0F 72 20 B2 B0 \r
+10 00 02 0F FC 27 F2 40 3D 00 11 0F 02 4F 3B 40 \r
+40 F9 4E 43 6C 4B 4F 4E 5F 02 5D 4F 41 F9 B0 13 \r
+B4 E5 2B 53 5E 53 7E 90 20 00 F4 2B 3D 40 40 F9 \r
+4E 43 6C 4D B0 13 0E DE 4F 4E 5F 02 CF 9C 41 F9 \r
+4D 20 2D 53 5E 53 7E 90 20 00 F3 2B 7C 40 36 00 \r
+B0 13 6C CF B0 13 04 AA FD 23 7C 40 0C 00 5D 42 \r
+94 1E B0 13 B4 E5 B0 13 AE EF 6C 43 B0 13 EC F0 \r
+7C 40 34 00 B0 13 6C CF A2 B3 30 0F FD 27 3E 40 \r
+10 00 7C 40 34 00 B0 13 0E DE 5C F3 5F 42 22 1E \r
+4F 5F 4C DF C2 4C 22 1E 1E 83 F3 23 F2 D0 80 00 \r
+22 1E B0 13 C4 E8 7C 40 32 00 B0 13 6C CF D2 43 \r
+00 1E B2 40 36 00 26 1E B2 40 E2 04 28 1E 3C 40 \r
+01 1E 0D 43 3E 40 1F 00 B0 13 B6 F2 3C 40 20 1E \r
+0D 43 2E 43 B0 13 B6 F2 32 D2 10 01 32 C2 03 43 \r
+FF 3F 32 C2 03 43 FF 3F 32 C2 03 43 FF 3F 32 C2 \r
+03 43 FF 3F 7C 40 3D 00 B0 13 6C CF 7C B0 F0 FF \r
+10 01 C2 43 9E 1D 5F 42 7A 1D 2F 83 AA 24 1F 83 \r
+50 24 1F 83 33 24 1F 83 16 24 1F 83 06 24 1F 83 \r
+A5 20 F2 D0 20 00 78 1D 10 01 7C 40 40 00 B0 13 \r
+AA DF 5C 53 7C 90 4F 00 FA 2B B2 40 00 80 90 1C \r
+E2 C3 8C 1C 10 01 E2 43 7A 1D 3C 40 A4 1D 4D 43 \r
+4E 4D 5E 02 5F 4E 7B 1D 47 18 0F 5F 5E 4E 7C 1D \r
+0E 5F 2C 53 8C 4E FE FF 5D 53 7D 90 09 00 F0 2B \r
+E2 43 9F 1D F2 40 09 00 9E 1D 10 01 E2 43 7A 1D \r
+5E 42 7B 1D 47 18 0E 5E 5F 42 7C 1D 0E 5F 82 4E \r
+A0 1D 5F 42 7D 1D 47 18 0F 5F 5D 42 7E 1D 0F 5D \r
+82 4F A2 1D D2 43 9F 1D 4F 8E 5F 53 C2 4F 9E 1D \r
+10 01 3E 40 BF FF 1E F2 86 1E 5F 42 7B 1D 5F 03 \r
+3F F0 C0 FF 0E DF 82 4E 86 1E 3F 40 7F 00 5F F2 \r
+7B 1D C2 4F A0 1E D2 42 7C 1D A1 1E D2 42 7D 1D \r
+A2 1E 5F 42 7E 1D 47 18 0F 5F 5E 42 7F 1D 0E 5F \r
+82 4E 34 1F D2 42 80 1D 32 1F D2 42 81 1D 31 1F \r
+5F 42 84 1D 47 18 0F 5F 5E 42 85 1D 0E 5F CF 0E \r
+1F 52 80 1E 1F 82 7E 1E 82 4F 80 1E 82 4E 7E 1E \r
+5F 42 86 1D 47 18 0F 5F 5C 42 87 1D 0C 5F 82 4C \r
+82 1E 1D 42 78 1E 1E 42 7A 1E 1F 42 7C 1E B0 13 \r
+16 A3 D2 42 88 1D 8D 1C D2 42 89 1D 8E 1C 7C 40 \r
+5A 00 3D 40 D4 F8 5E 43 B0 13 E0 BC D2 43 76 1D \r
+10 01 F2 40 03 00 7A 1D D2 43 9E 1D 10 01 1A 14 \r
+CA 0C 6D 93 3A 24 5D 93 0E 24 6D 92 5C 20 B0 13 \r
+B6 AC 6D 42 B0 13 08 F0 C2 43 9F 1E 4C 43 4D 43 \r
+B0 13 08 F0 50 3C C2 93 9F 1E 18 20 B2 B0 40 00 \r
+86 1E 07 20 B0 13 4A AC 5A 93 05 20 B0 13 62 F0 \r
+02 3C B0 13 5E AC B0 13 90 AC C9 0C 5C 42 A1 1E \r
+B0 13 6C AC B0 13 B6 AC 6D 43 E2 3F B0 13 A8 AC \r
+C9 0C 5C 42 A2 1E B0 13 6C AC 7D 40 1F 00 7E 40 \r
+29 00 B0 13 2C F4 5D 43 D3 3F 5F 42 9E 1E 4F 93 \r
+22 24 C2 93 9F 1E 18 20 4F 4F 2F 83 0D 24 1F 83 \r
+1A 20 B2 B0 40 00 86 1E 05 20 B0 13 4A AC B0 13 \r
+62 F0 02 3C B0 13 5E AC B0 13 90 AC CA 0C 5C 42 \r
+A1 1E B0 13 82 AC 07 3C B0 13 A8 AC CA 0C 5C 42 \r
+A2 1E B0 13 82 AC 19 16 10 01 B0 13 28 EE CF 0C \r
+CC 0A B0 13 98 AC 4C 4F B0 13 74 AC 10 01 B0 13 \r
+98 AC 5C 42 A0 1E B0 13 74 AC 10 01 B0 13 74 AC \r
+CC 0A 10 01 B0 13 C4 AC CC 09 5E 43 B0 13 E0 BC \r
+10 01 B0 13 C4 AC CC 0A 5E 43 B0 13 E0 BC 10 01 \r
+CC 0A B0 13 A8 AC 10 01 7D 40 4A 00 7E 40 60 00 \r
+B0 13 2C F4 C9 0C 10 01 7D 40 48 00 7E 40 5E 00 \r
+B0 13 2C F4 10 01 7D 40 1E 00 7E 40 28 00 B0 13 \r
+2C F4 10 01 0D 43 6E 43 4F 43 B0 13 DC C0 CD 0C \r
+10 01 0A 14 31 82 92 B3 14 1D 0F 20 A2 B2 14 1D \r
+0C 20 3F 40 0C 00 1F 52 40 1F 6F 13 4C 93 0C 24 \r
+5C 43 6D 43 80 13 8C 1E 07 3C 5C 43 B0 13 D4 D5 \r
+5C 43 5D 43 80 13 8C 1E A2 B3 8A 1E 1B 20 92 B3 \r
+14 1D 12 20 B2 B2 14 1D 0F 20 3F 40 0C 00 1F 52 \r
+42 1F 6F 13 4C 93 61 24 82 93 8A 1E 5E 20 6C 43 \r
+6D 43 80 13 90 1E 59 3C 6C 43 B0 13 D4 D5 6C 43 \r
+5D 43 F7 3F 6A 43 B2 B2 8A 1E 2E 20 B2 B0 10 00 \r
+8A 1E 26 20 B2 B0 20 00 8A 1E 1E 20 B2 B0 00 01 \r
+8A 1E 14 20 5A 43 B2 B0 40 00 8A 1E 0B 20 B2 B0 \r
+80 00 8A 1E 20 24 CC 01 3D 40 14 F9 2E 42 B0 13 \r
+A4 F2 19 3C CC 01 3D 40 1A F9 F8 3F CC 01 3D 40 \r
+20 F9 3E 40 06 00 F3 3F CC 01 3D 40 28 F9 F9 3F \r
+CC 01 3D 40 30 F9 F5 3F CC 01 3D 40 38 F9 3E 40 \r
+06 00 B0 13 A4 F2 CC 0A B0 13 D4 D5 CC 0A 6D 42 \r
+80 13 90 1E 6A 93 07 24 7C 40 46 00 CD 01 5E 43 \r
+B0 13 E0 BC 06 3C 7C 40 5A 00 CD 01 5E 43 B0 13 \r
+E0 BC 82 43 8A 1E A2 D2 8A 1E 92 B3 14 1D 10 24 \r
+B0 13 E4 F3 6C 93 0C 20 7C 40 17 00 B0 13 1A AE \r
+7C 40 18 00 B0 13 1A AE 7C 40 19 00 B0 13 1A AE \r
+82 43 14 1D 31 52 0A 16 10 01 7D 40 03 00 B0 13 \r
+08 F0 10 01 1A 14 31 80 16 00 B0 13 60 E2 CA 0C \r
+0A 93 03 20 3C 40 03 00 97 3C 5C 43 CD 0A B0 13 \r
+B4 BD 4C 93 04 20 CC 0A B0 13 E6 F4 F3 3F B0 13 \r
+EC F4 CD 0C C9 01 39 52 CC 09 2E 42 B0 13 A4 F2 \r
+81 49 00 00 CF 01 3F 50 0C 00 81 4F 02 00 F1 40 \r
+09 00 04 00 E1 43 05 00 CD 01 3D 50 0E 00 3C 40 \r
+CE 1E B0 13 B6 F0 D1 4A 09 00 12 00 D1 42 D7 1E \r
+0D 00 B0 13 0C F5 C1 4C 13 00 D1 43 0C 00 B0 13 \r
+10 F5 C1 4C 14 00 2C 43 3D 40 03 00 CE 01 B0 13 \r
+00 C3 0C 93 59 20 B0 13 D4 F4 C9 0C E1 43 05 00 \r
+CF 01 3F 50 0C 00 81 4F 02 00 CF 0A 3F 50 03 00 \r
+81 4F 00 00 79 90 03 00 06 24 59 93 02 20 B0 13 \r
+06 EE B0 13 F0 EE B0 13 4C E5 79 90 03 00 07 24 \r
+59 93 03 24 B0 13 D0 EE 02 3C B0 13 30 ED 2C 43 \r
+2D 43 CE 01 B0 13 00 C3 0C 93 05 24 CC 0A B0 13 \r
+E6 F4 1C 43 29 3C 3F 40 7F 00 5F F1 0C 00 5F 93 \r
+09 24 7F 90 03 00 06 24 CC 0A B0 13 E6 F4 3C 40 \r
+05 00 1A 3C EA 43 00 00 DA 41 0E 00 0A 00 D2 4A \r
+0B 00 FF 1D F1 90 40 00 0F 00 02 20 5F 43 02 3C \r
+7F 40 03 00 CA 4F 01 00 D2 53 D7 1E C2 93 D7 1E \r
+02 20 D2 43 D7 1E 0C 43 31 50 16 00 19 16 10 01 \r
+3A 14 31 82 C9 0C F9 90 14 00 00 00 05 28 B0 13 \r
+10 F5 C9 9C 14 00 74 20 3C 40 0E 00 0C 59 CD 01 \r
+B0 13 08 F4 91 92 D0 1E 02 00 6A 20 91 92 CE 1E \r
+00 00 66 20 58 49 12 00 3A 40 05 00 0A 59 3C 40 \r
+05 00 0C 59 CD 08 B0 13 54 E3 0C 93 48 20 C2 93 \r
+D2 1E 56 24 B0 13 60 E2 C7 0C 07 93 51 24 3C 40 \r
+03 00 0C 57 CD 0A 2E 42 B0 13 A4 F2 6C 43 CD 07 \r
+B0 13 B4 BD 4C 93 03 24 D2 93 D6 1E 04 20 CC 07 \r
+B0 13 E6 F4 3D 3C 5F 42 D6 1E CE 0F 5E 53 C2 4E \r
+D6 1E 4F 4F DF 47 0B 00 D4 1E C7 48 0A 00 E7 43 \r
+00 00 F9 90 40 00 13 00 02 20 5F 43 02 3C 7F 40 \r
+03 00 C7 4F 01 00 D1 47 09 00 06 00 B0 13 0C F5 \r
+C1 4C 07 00 B0 13 A0 B0 B0 13 8E B0 CD 01 B0 13 \r
+AE B0 D5 27 B0 13 76 B0 0C 93 12 24 D0 3F B0 13 \r
+A0 B0 D1 4C 09 00 06 00 B0 13 0C F5 C1 4C 07 00 \r
+B0 13 8E B0 CD 01 B0 13 AE B0 02 24 B0 13 76 B0 \r
+31 52 37 16 10 01 3C 40 03 00 0C 59 CD 0A 2E 42 \r
+B0 13 A4 F2 CC 09 4D 43 B0 13 08 E8 10 01 3E 40 \r
+07 00 5E F9 0A 00 3F 40 03 00 4F 8E 6C 43 10 01 \r
+F1 40 81 00 08 00 D1 49 0D 00 09 00 10 01 2D 52 \r
+6E 42 B0 13 74 CA C9 0C 09 93 10 01 3B 40 80 00 \r
+01 3C 0B 43 0A 14 09 14 08 14 07 14 21 83 3F B0 \r
+80 7F 7B 24 3D B0 80 7F 05 20 0C 4E 0D 4F 8B 10 \r
+0D EB 73 3C 5D 02 08 4D 4D 10 38 F0 00 FF 0D D8 \r
+5F 02 08 4F 4F 10 38 F0 00 FF 0F D8 09 4C 0A 4D \r
+3D F0 80 00 C1 4D 00 00 0B EA 0B EF 3B C0 7F FF \r
+3A D0 80 00 3F D0 80 00 0A 9F 02 20 09 9E 0A 24 \r
+0B 2C 0D 4F 0F 4A 0A 4D 0C 4E 0E 49 09 4C 81 EB \r
+00 00 02 3C 0B 93 4F 20 0C 43 08 4A 88 10 47 48 \r
+8F 10 48 8F 8F 10 0E 24 38 90 19 00 34 2C 12 C3 \r
+4F 10 5E 00 5C 00 3C B0 00 10 02 24 3C D0 00 20 \r
+18 83 F5 23 0B 93 0C 24 08 8C 09 7E 4A 7F 0C 48 \r
+4A 93 12 30 5C 02 09 69 4A 6A 17 83 2C 24 F8 3F \r
+09 5E 4A 6F 09 28 4A 10 59 00 5C 00 3C B0 00 10 \r
+02 24 3C D0 00 20 17 53 3C B0 00 80 07 24 09 63 \r
+4A 63 07 63 3C B0 00 60 01 20 19 C3 17 93 13 38 \r
+37 90 FF 00 13 34 7A C0 80 00 87 10 D1 51 00 00 \r
+00 00 57 00 0A D7 0C 49 0D 4A 21 53 07 16 08 16 \r
+09 16 0A 16 10 01 0D 43 0C 43 F7 3F 3D 40 FF FE \r
+D1 61 00 00 00 00 5D 00 3C 43 EF 3F 0A 14 B0 13 \r
+FE F2 B0 13 CC E3 7C 40 0A 00 B0 13 B6 F4 7C 40 \r
+06 00 B0 13 BC F4 82 43 BE 1E 82 43 C0 1E 7C 40 \r
+05 00 B0 13 90 F4 7C 40 0C 00 5D 42 94 1E B0 13 \r
+04 E4 92 43 BA 1E 7C 40 17 00 6D 43 B0 13 08 B3 \r
+6D 43 B0 13 12 B3 6D 43 B0 13 08 F0 4C 43 B0 13 \r
+E8 EC 0C 93 2A 20 4C 43 1D 42 BE 1E 1E 42 C0 1E \r
+B0 13 AE E0 4C 43 B0 13 E2 D6 7A 40 28 00 04 3C \r
+3C 40 99 19 B0 13 3C DA 4C 43 B0 13 E8 EC 2C 93 \r
+04 20 CF 0A 5A 83 4F 93 F3 23 4A 93 0E 20 7C 40 \r
+46 00 3D 40 F8 F8 5E 43 B0 13 E0 BC 2E 42 3C 40 \r
+00 40 B0 13 3C DA 1E 83 FA 23 4C 43 B0 13 E8 EC \r
+1C 93 0D 24 7C 40 17 00 6D 42 B0 13 08 B3 6D 42 \r
+B0 13 12 B3 6D 42 B0 13 08 F0 4C 43 23 3C A2 43 \r
+BA 1E 82 93 C0 1E 0A 20 82 93 BE 1E 07 20 4C 43 \r
+B0 13 A0 E9 82 4C BE 1E 82 4D C0 1E 7C 40 17 00 \r
+7D 40 03 00 B0 13 08 B3 7D 40 03 00 B0 13 12 B3 \r
+7D 40 03 00 B0 13 08 F0 7C 40 13 00 6D 43 B0 13 \r
+08 F0 5C 43 0A 16 10 01 B0 13 08 F0 7C 40 18 00 \r
+10 01 B0 13 08 F0 7C 40 19 00 10 01 1A 14 C9 0C \r
+1A 42 A6 1E 4D 4D 1D 5A 0C 00 0D 8E 3D 80 13 00 \r
+0D 93 81 34 3E 40 1A 00 1E 52 A6 1E 6F 4E 3F F0 \r
+03 00 1F 83 4E 24 1F 83 2C 20 CA 43 12 00 2F 42 \r
+6F BE 1A 20 1C 42 A6 1E D2 9C 11 00 AA 1E 09 2C \r
+C2 93 AC 1E 03 20 B0 13 98 D9 09 3C 8C 43 18 00 \r
+06 3C B0 13 7A D5 1F 42 A6 1E DF 53 11 00 CC 09 \r
+5D 43 B0 13 2A E1 57 3C EE C2 00 00 1F 42 A6 1E \r
+8F 43 00 00 8F 43 02 00 1C 42 A6 1E B0 13 98 D9 \r
+4A 3C 3C 40 80 00 5C 8A 13 00 CF 0A 2D 4F 1E 4F \r
+02 00 3F 40 00 02 B0 13 3C DD 1C 5A 0C 00 3C 50 \r
+00 02 8A 4C 0C 00 1F 42 A6 1E FF 40 22 00 0F 00 \r
+3E 40 1A 00 1E 52 A6 1E 3F 40 FC 00 6F FE 5F D3 \r
+28 3C 3C 40 40 00 5C 8A 13 00 2D 4A 1E 4A 02 00 \r
+3F 40 80 1C B0 13 3C DD 1F 42 A6 1E 1C 5F 0A 00 \r
+3C 50 00 06 8F 4C 0C 00 1F 42 A6 1E DF 43 0F 00 \r
+1A 42 A6 1E CF 0A 5C 4F 13 00 2D 4F B0 13 80 F2 \r
+CA 5C 0F 00 3E 40 1A 00 1E 52 A6 1E 6F 4E 5F C3 \r
+6F D3 CE 4F 00 00 19 16 10 01 1D 42 90 1C 3D 80 \r
+00 80 1D C3 5F 42 7A 1D 2F 83 03 24 1F 83 2D 24 \r
+10 01 D2 93 9F 1D 15 24 E2 93 9F 1D 6A 20 5C 02 \r
+1F 4C A4 1D B0 13 4A B5 5F 0E 3F 80 00 80 82 4F \r
+B8 1D 3E 40 7D 1D 7F 40 03 00 B0 13 34 B5 FD 2B \r
+10 01 1F 42 A0 1D 0F 5C B0 13 4A B5 1C 52 A0 1D \r
+5C 0E 3C 80 00 80 82 4C B8 1D 3E 40 7D 1D 7F 40 \r
+03 00 B0 13 34 B5 FD 2B 10 01 1F 42 86 1E 7F F0 \r
+C0 00 4F 5F 3E 40 7F 00 5E F2 A0 1E 4E DF C2 4E \r
+7B 1D D2 42 A1 1E 7C 1D D2 42 A2 1E 7D 1D 1E 42 \r
+34 1F CF 0E 8F 10 C2 4F 7E 1D C2 4E 7F 1D D2 42 \r
+32 1F 80 1D D2 42 31 1F 81 1D C2 43 82 1D C2 43 \r
+83 1D 1E 42 7E 1E CF 0E 8F 10 8F 11 C2 4F 84 1D \r
+C2 4E 85 1D 1E 42 82 1E CF 0E 8F 10 8F 11 C2 4F \r
+86 1D C2 4E 87 1D D2 42 8D 1C 88 1D D2 42 8E 1C \r
+89 1D CF 0D 8F 10 C2 4F 8A 1D C2 4D 8B 1D C2 43 \r
+8C 1D 10 01 1E 53 1D 42 B8 1D EE 4D FF FF 92 53 \r
+B8 1D 5F 53 7F 90 13 00 10 01 CE 0F 8E 10 C2 4E \r
+7B 1D C2 4F 7C 1D 10 01 A2 D3 86 1E 82 93 D8 1E \r
+03 24 A2 B2 86 1E 68 20 B2 B0 20 00 D8 1E 5B 20 \r
+B2 B0 40 00 D8 1E 4B 20 82 93 D8 1E 69 24 92 B3 \r
+D8 1E 32 20 A2 B3 D8 1E 1A 20 A2 B2 D8 1E 0D 20 \r
+B2 B2 D8 1E 5D 24 1F 42 42 1F 0F 0F 6C 43 4F 13 \r
+B2 D2 14 1D B2 C2 D8 1E 53 3C 1F 42 40 1F 0F 0F \r
+5C 43 4F 13 A2 D2 14 1D A2 C2 D8 1E 49 3C C2 43 \r
+EB 1E 6C 43 6D 42 80 13 90 1E 1F 42 42 1F 1F 4F \r
+10 00 82 4F 42 1F 00 18 D2 4F 08 00 90 1E B2 D2 \r
+14 1D A2 C3 D8 1E 34 3C 5C 43 6D 42 80 13 8C 1E \r
+1F 42 40 1F 1F 4F 10 00 82 4F 40 1F 00 18 D2 4F \r
+08 00 8C 1E A2 D2 14 1D 92 C3 D8 1E 21 3C B2 F0 \r
+BF FF D8 1E 1F 42 42 1F 3F 0F 04 00 6C 43 4F 13 \r
+92 D3 14 1D 15 3C B2 F0 DF FF D8 1E 1F 42 40 1F \r
+3F 0F 04 00 5C 43 F3 3F E2 B3 01 02 03 24 D2 B3 \r
+01 02 04 20 92 D3 8A 1E B2 D2 8A 1E 82 43 D8 1E \r
+82 93 86 1E 09 24 92 B3 86 1E 06 24 92 C3 86 1E \r
+B0 13 C0 F3 92 D3 14 1D A2 C3 86 1E 10 01 21 83 \r
+4E 4E 1E 83 48 24 1E 83 2C 24 2E 83 1E 24 2E 82 \r
+13 24 3E 82 72 20 D2 B3 8C 1C 6F 24 E2 B3 8C 1C \r
+6C 20 F2 90 65 00 92 1C 68 28 B0 13 30 EF 4C 93 \r
+64 24 B0 13 0E C5 61 3C D2 B3 8C 1C 5E 24 E2 B3 \r
+8C 1C 5B 20 B0 13 1C E9 58 3C D2 B3 8C 1C 55 20 \r
+7C 40 40 00 B0 13 AA DF 5C 53 7C 90 4F 00 FA 2B \r
+4C 3C D2 B3 8C 1C 14 24 E2 B3 8C 1C 11 20 D2 B3 \r
+92 1C 05 24 81 43 00 00 CC 01 B0 13 6E B7 B1 40 \r
+FE FF 00 00 CC 01 6D 43 B0 13 1C E9 B0 13 0E C5 \r
+D2 C3 8C 1C 32 3C 5F 42 8C 1C 1F F3 5E 42 8C 1C \r
+2E F3 0E DF 0E 93 29 20 C2 43 92 1C D2 42 8E 1C \r
+8F 1C B1 40 FB FF 00 00 CC 01 6D 43 B0 13 1C E9 \r
+3C 40 8D 1C B0 13 6E B7 3C 40 8E 1C B0 13 6E B7 \r
+3C 40 31 1F B0 13 6E B7 3C 40 32 1F B0 13 6E B7 \r
+3C 40 34 1F 6D 43 B0 13 1C E9 3C 40 A0 1E 7D 40 \r
+03 00 B0 13 1C E9 D2 D3 8C 1C 21 53 10 01 5D 43 \r
+B0 13 1C E9 10 01 1A 14 31 80 18 00 B0 13 D4 F4 \r
+C9 0C B0 13 EC F4 81 4C 10 00 CF 01 2F 52 81 4F \r
+12 00 F1 42 14 00 7A 40 03 00 C1 4A 15 00 CD 01 \r
+3D 50 06 00 3C 40 EC 1E B0 13 B6 F0 D1 43 04 00 \r
+D1 42 F4 1E 05 00 D1 43 0A 00 B0 13 10 F5 C1 4C \r
+0B 00 2C 43 3D 40 03 00 CE 01 3E 50 10 00 B0 13 \r
+00 C3 C1 4A 15 00 CF 01 2F 52 81 4F 12 00 CF 01 \r
+3F 50 0C 00 81 4F 10 00 79 90 03 00 06 24 59 93 \r
+02 20 B0 13 06 EE B0 13 F0 EE B0 13 4C E5 3A 40 \r
+06 00 79 90 03 00 07 24 59 93 03 24 B0 13 D0 EE \r
+02 3C B0 13 30 ED 2C 43 2D 43 CE 01 3E 50 10 00 \r
+B0 13 00 C3 0C 93 1D 20 3F 40 7F 00 5F F1 04 00 \r
+5F 93 03 24 7F 90 06 00 14 20 CC 01 CD 01 3D 50 \r
+06 00 2E 42 B0 13 A4 F2 2C 41 1D 41 02 00 B0 13 \r
+EC F2 CC 01 3C 50 0C 00 B0 13 14 F4 D2 53 F4 1E \r
+0A 43 CC 0A 31 50 18 00 19 16 10 01 0A 14 21 83 \r
+C1 43 00 00 F2 90 03 00 00 1E 6B 20 7C 40 3B 00 \r
+B0 13 0E DE CE 0C 7C 40 3B 00 B0 13 0E DE 4E 9C \r
+F9 23 4E 93 61 24 CC 01 5D 43 B0 13 48 E7 6F 41 \r
+3F 50 03 00 4E 4E 0E 9F 38 20 F1 90 1F 00 00 00 \r
+34 2C F1 90 0B 00 00 00 30 28 3C 40 01 1E 0D 43 \r
+3E 40 1F 00 B0 13 B6 F2 E2 41 01 1E 3C 40 02 1E \r
+6D 41 B0 13 48 E7 3C 40 20 1E 6D 43 B0 13 48 E7 \r
+F2 B0 80 FF 21 1E 14 24 92 53 34 1E 82 63 36 1E \r
+B0 13 68 E1 4C 93 30 20 5C 42 20 1E B0 13 68 E8 \r
+C2 4C 20 1E F2 F0 7F 00 21 1E B0 13 B0 EE 24 3C \r
+92 53 30 1E 82 63 32 1E 1F 3C 92 53 38 1E 82 63 \r
+3A 1E 0A 42 32 C2 03 43 7C 40 36 00 B0 13 6C CF \r
+7C 40 3D 00 B0 13 6C CF 7C B0 F0 FF F9 23 7C 40 \r
+3A 00 B0 13 6C CF 7C 40 34 00 B0 13 6C CF 02 4A \r
+03 3C 32 C2 03 43 FF 3F 21 53 0A 16 10 01 21 82 \r
+D2 83 8F 1C 66 20 5F 42 8D 1C 5F 93 51 24 6F 93 \r
+4C 24 6F 92 3F 24 7F 90 07 00 2B 24 7F 90 03 00 \r
+22 24 7F 90 05 00 12 24 7F 90 06 00 45 20 1E 42 \r
+7E 1E CF 0E 5F 0D C1 4F 00 00 B0 13 36 BA C1 4E \r
+01 00 C1 4D 02 00 7D 40 03 00 36 3C D1 42 C2 1E \r
+00 00 1E 42 82 1E CF 0E 8F 10 8F 11 C1 4F 01 00 \r
+C1 4E 02 00 F0 3F D1 42 C2 1E 00 00 1E 42 7E 1E \r
+F2 3F D1 42 C2 1E 00 00 1E 42 7E 1E CF 0E 5F 0D \r
+C1 4F 01 00 B0 13 36 BA C1 4E 02 00 C1 4D 03 00 \r
+6D 42 12 3C 1E 42 82 1E CF 0E 8F 10 8F 11 C1 4F \r
+00 00 C1 4E 01 00 6D 43 07 3C 1E 42 7E 1E F4 3F \r
+D1 42 C2 1E 00 00 5D 43 CC 01 7E 42 B0 13 6E B6 \r
+D2 42 8E 1C 8F 1C 0C 43 4D 43 7E 40 10 00 B0 13 \r
+6E B6 21 52 10 01 1D 42 82 1E 43 18 4E 5E CF 0D \r
+8F 10 8F 11 7F F0 0F 00 4E DF 10 01 0A 14 4A 4D \r
+10 3C B2 B0 40 00 86 1E 06 20 7C 40 09 00 5D 43 \r
+B0 13 08 F0 05 3C 7C 40 0B 00 5D 43 B0 13 08 F0 \r
+2A 43 B0 13 88 D6 1A 93 EC 27 2A 93 13 24 2A 92 \r
+3A 20 B0 13 C6 EA 7C 40 0B 00 4D 43 B0 13 08 F0 \r
+7C 40 09 00 4D 43 B0 13 08 F0 6C 43 4D 43 B0 13 \r
+1E BB 29 3C B2 B0 40 00 86 1E 19 20 B0 13 10 EF \r
+3C 90 10 27 0F 34 0C 93 0F 34 3C E3 1C 53 B0 13 \r
+06 BB 4D 43 B0 13 08 F0 7C 40 03 00 5D 43 B0 13 \r
+08 F0 0B 3C 3C 40 0F 27 B0 13 FA BA 06 3C 1C 42 \r
+82 1E 0C 93 EA 3B B0 13 FA BA 7C 40 46 00 CD 0B \r
+5E 43 B0 13 E0 BC 0A 16 10 01 B0 13 06 BB 5D 43 \r
+B0 13 1E BB 10 01 3C B0 00 80 0D 7D 3D E3 6E 42 \r
+7F 40 03 00 B0 13 DC C0 CB 0C 6C 43 10 01 B0 13 \r
+08 F0 7C 40 03 00 4D 43 B0 13 08 F0 10 01 6A 14 \r
+31 80 06 00 C6 0C 09 43 3A 40 00 1C 7F 40 03 00 \r
+81 4F 00 00 2F 46 1F 93 06 24 0F 93 0B 20 58 46 \r
+02 00 C7 09 10 3C 5C 46 02 00 B0 13 42 EB C7 0C \r
+07 93 02 20 0C 43 4D 3C 58 47 09 00 3F 40 03 00 \r
+0F 57 81 4F 02 00 24 43 0F 42 32 C2 03 43 1E 43 \r
+6E 9A 39 20 EA 42 00 00 02 4F 3F 40 0B 00 0F 5A \r
+6F 4F 3F F0 3F 00 4E 48 0F 9E 2A 20 25 46 15 93 \r
+0E 20 78 90 3F 00 06 20 3F 40 03 00 0F 57 81 4F \r
+04 00 05 3C 3F 40 07 00 0F 5A 81 4F 04 00 1C 41 \r
+04 00 1D 41 02 00 2E 42 B0 13 54 ED 4C 4C 05 93 \r
+02 24 0C 93 0D 20 5F 4A 01 00 2E 41 4F 9E 08 2C \r
+09 93 02 24 D9 43 00 00 81 4F 00 00 C9 0A 04 3C \r
+DA 43 00 00 01 3C 02 4F 3A 50 23 00 14 83 BC 23 \r
+CC 09 31 50 06 00 64 16 10 01 4D 4D 1D 93 14 24 \r
+2D 93 31 24 2D 92 5B 20 B0 13 C6 EA 6C 43 4D 43 \r
+B0 13 D0 BC 7C 40 0F 00 4D 43 B0 13 08 F0 7C 40 \r
+1F 00 4D 43 80 00 08 F0 B0 13 88 D6 7C 40 1F 00 \r
+5D 43 B0 13 08 F0 7C 40 0F 00 5D 43 B0 13 08 F0 \r
+B2 B0 40 00 86 1E 08 20 7C 40 1D 00 7D 40 46 00 \r
+5E 43 B0 13 FA CE 07 3C 7C 40 1D 00 7D 40 43 00 \r
+5E 43 B0 13 FA CE B2 B0 40 00 86 1E 04 20 B0 13 \r
+54 F1 CB 0C 02 3C 1B 42 7E 1E 0B 93 05 38 6C 43 \r
+5D 43 B0 13 D0 BC 0B 3C 3B E3 1B 53 6C 43 4D 43 \r
+B0 13 08 F0 7C 40 03 00 5D 43 B0 13 08 F0 CC 0B \r
+3C B0 00 80 0D 7D 3D E3 7E 40 03 00 5F 43 B0 13 \r
+DC C0 CD 0C 7C 40 49 00 5E 43 80 00 E0 BC 10 01 \r
+B0 13 08 F0 7C 40 03 00 4D 43 B0 13 08 F0 10 01 \r
+4A 14 C9 0E 4C 4C 3C 80 46 00 53 24 1C 83 4C 24 \r
+1C 83 46 24 1C 83 41 24 1C 83 3B 24 3C 80 10 00 \r
+3C 90 09 00 55 2C 5C 06 00 18 50 4C 0E BD 6C BD \r
+00 00 66 BD 00 00 62 BD 00 00 58 BD 00 00 50 BD \r
+00 00 4C BD 00 00 44 BD 00 00 3C BD 00 00 32 BD \r
+00 00 7A 40 03 00 78 40 22 00 2E 3C 6A 43 78 40 \r
+21 00 2A 3C 6A 43 78 40 23 00 26 3C 6A 42 F7 3F \r
+6A 43 78 40 25 00 20 3C 7A 40 03 00 78 40 24 00 \r
+1B 3C 6A 42 F0 3F 7A 40 05 00 E5 3F 7A 40 06 00 \r
+E6 3F 6A 43 78 40 1A 00 0F 3C 7A 40 03 00 FA 3F \r
+6A 43 78 40 1C 00 08 3C 7A 40 03 00 78 40 1B 00 \r
+03 3C 6A 42 78 40 1A 00 C7 0D 4A 4A 06 43 CC 08 \r
+4C 56 7D 47 CE 09 B0 13 FA CE 16 53 1A 83 F7 23 \r
+46 16 10 01 4A 14 21 83 C8 0D C7 0C 39 40 41 1E \r
+CC 01 0D 43 1E 43 B0 13 B6 F2 46 43 09 98 25 24 \r
+2F 43 6F 99 22 20 5A 49 09 00 7A 90 3E 00 1D 2C \r
+57 93 13 24 3C 40 03 00 0C 59 3D 40 03 00 0D 58 \r
+2E 42 B0 13 54 ED 0C 93 10 20 4F 4A CA 01 3A 50 \r
+E0 FF 0A 5F DA 43 00 00 08 3C C2 9A 3E 1E 05 2C \r
+4A 4A CF 01 0F 8A DF 43 3D 00 39 50 0C 00 56 53 \r
+D5 27 CE 01 0F 43 4C 43 CE 93 00 00 04 24 1E 53 \r
+5C 53 FA 27 09 3C 67 93 04 20 7C 50 20 00 4F 4C \r
+03 3C 3F 40 3D 00 4F 8C 67 93 0B 24 5E 42 3F 1E \r
+0F 9E 12 38 5E 42 3E 1E 0F 9E 0F 20 D2 83 3E 1E \r
+0C 3C 5E 42 3E 1E 0E 9F 07 38 5E 42 3F 1E 0E 9F \r
+04 34 C2 4F 3F 1E 01 3C 0F 43 C8 4F 09 00 CC 0F \r
+21 53 46 16 10 01 0A 14 CA 0C 5D 93 05 24 6D 92 \r
+34 20 C2 43 30 1F 31 3C C2 93 30 1F 1A 20 5C 42 \r
+31 1F B0 13 1E BF 03 20 B0 13 FE BE 02 3C B0 13 \r
+0E BF 5C 42 32 1F B0 13 1E BF 03 20 B0 13 0E BF \r
+02 3C B0 13 FE BE B0 13 32 BF 5D 43 B0 13 08 F0 \r
+14 3C 1C 42 34 1F 0D 43 6E 42 4F 43 B0 13 DC C0 \r
+CF 0C CC 0A 7D 40 46 00 7E 40 5C 00 B0 13 42 BF \r
+B0 13 32 BF 4D 43 B0 13 08 F0 0A 16 10 01 CC 0A \r
+7D 40 48 00 7E 40 5E 00 B0 13 42 BF 10 01 CC 0A \r
+7D 40 4A 00 7E 40 60 00 B0 13 42 BF 10 01 0D 43 \r
+6E 43 4F 43 B0 13 DC C0 CF 0C B2 B0 40 00 86 1E \r
+10 01 CC 0A 7D 40 1F 00 7E 40 29 00 B0 13 2C F4 \r
+10 01 B0 13 2C F4 CD 0F 5E 43 B0 13 E0 BC 10 01 \r
+1A 14 CA 0D C9 0C D2 93 00 1E 58 24 B0 13 C4 E8 \r
+1D 43 6D 59 CC 09 B0 13 E8 E5 49 43 4A 93 37 24 \r
+5A 93 32 20 6A 42 16 3C 7C 40 36 00 B0 13 6C CF \r
+7C 40 3D 00 B0 13 6C CF 7C B0 F0 FF F9 23 7C 40 \r
+3A 00 B0 13 6C CF 4A 93 02 20 59 43 2B 3C B0 13 \r
+20 F1 5A 83 7C 40 34 00 B0 13 6C CF A2 B3 30 0F \r
+FD 27 92 C3 32 0F 7C 40 35 00 B0 13 6C CF 3C 40 \r
+19 00 B0 13 06 F1 92 B3 32 0F D6 27 92 C3 32 0F \r
+92 B3 30 0F FD 27 0E 3C 32 C2 03 43 FF 3F 7C 40 \r
+35 00 B0 13 6C CF B2 B0 00 02 32 0F FC 27 B2 F0 \r
+FF FD 32 0F 7C 40 3B 00 B0 13 6C CF F2 90 03 00 \r
+00 1E 02 20 B0 13 9A F1 CC 09 03 3C 32 C2 03 43 \r
+FF 3F 19 16 10 01 B2 40 23 5A 5C 01 B0 13 92 EB \r
+F2 40 A5 00 21 01 F2 D0 80 00 20 01 C2 43 21 01 \r
+F2 D0 03 00 4A 02 92 C3 6C 01 B2 D0 0C 00 6C 01 \r
+82 43 66 01 B2 40 44 00 68 01 32 D0 40 00 82 43 \r
+60 01 B2 40 50 00 62 01 B2 40 6E 11 64 01 32 C0 \r
+40 00 1E 14 3D 40 41 D1 0E 43 1D 83 0E 73 FD 23 \r
+0D 93 FB 23 1D 16 00 3C B2 F0 F0 FF 6E 01 A2 C3 \r
+02 01 A2 B3 02 01 F8 23 32 C2 03 43 B2 40 52 2D \r
+C0 01 A2 43 C2 01 F2 40 0E 00 D7 01 F2 F0 7F 00 \r
+03 02 F2 D0 80 00 05 02 F2 40 11 00 CD 01 F2 40 \r
+12 00 CE 01 F2 40 13 00 CF 01 82 43 C0 01 32 D2 \r
+B0 13 80 E6 B0 13 50 F3 B0 13 96 E8 B0 13 9C EA \r
+B0 13 04 EC B0 13 08 F2 80 00 0C CE 4A 14 C8 0F \r
+C6 0E C9 0C CA 0D C7 06 3C 40 6A 1D 3D 40 02 F9 \r
+3E 40 07 00 B0 13 A4 F2 0A 93 1C 20 39 90 B5 00 \r
+19 2C 77 90 03 00 0B 2C CD 09 59 02 0D 59 3D 50 \r
+25 F5 3C 40 6A 1D 2E 43 B0 13 A4 F2 22 3C 4C 46 \r
+3C 50 67 1D CD 09 59 02 0D 59 3D 50 24 F5 3E 40 \r
+03 00 F2 3F CC 09 CD 0A 3E 40 0A 00 0F 43 B0 13 \r
+42 D8 7E 50 30 00 4F 46 CF 4E 69 1D CC 09 CD 0A \r
+3E 40 0A 00 0F 43 B0 13 42 D8 C9 0C CA 0D 56 83 \r
+E9 23 3F 40 6A 1D 4D 43 08 3C 48 93 04 24 FF 40 \r
+20 00 00 00 58 83 1F 53 5D 53 3E 40 30 00 6E 9F \r
+05 20 4E 47 1E 83 4C 4D 0C 9E EF 3B 3C 40 6A 1D \r
+46 16 10 01 0A 14 CA 0C 1F 42 A6 1E 8F 93 02 00 \r
+10 20 8F 93 00 00 0D 20 C2 93 AB 1E 0A 24 5E 42 \r
+AB 1E 3E 50 64 00 5D 42 3A 1F 0D 9E 02 34 4C 43 \r
+42 3C BF 40 00 70 08 00 5C 42 B3 1E 1D 42 B0 1E \r
+1E 42 B2 1E 3D F3 3E F0 FF 00 3F 40 00 08 B0 13 \r
+3C DD 1C 52 38 1F 1F 42 A6 1E 8F 4C 0A 00 1F 42 \r
+A6 1E 9F 42 38 1F 0C 00 1F 42 A6 1E CF 43 14 00 \r
+1F 42 A6 1E CF 43 15 00 1F 42 A6 1E 8F 93 02 00 \r
+05 20 8F 93 00 00 02 20 EF D2 1A 00 1D 42 A6 1E \r
+1E 42 B0 1E 1F 42 B2 1E 3E F3 3F F0 FF 00 8D 4E \r
+00 00 8D 4F 02 00 1F 42 A6 1E 9F 43 18 00 CC 0A \r
+B0 13 86 CB 5C 43 0A 16 10 01 3A 14 07 4F 07 ED \r
+0A 4F 5A 02 8A 10 4A 4A 0A 93 49 24 7F D0 80 00 \r
+0B 4D 5B 02 8B 10 4B 4B 0B 93 3F 24 7D D0 80 00 \r
+0B 5A 3B 80 7F 00 08 43 09 43 0E 93 09 24 1A 43 \r
+5E 00 02 28 08 5C 09 6D 59 00 58 00 5A 02 F8 2B \r
+0E 43 1A 43 5F 00 02 28 08 5C 09 6D 59 00 58 00 \r
+5E 00 3E B0 00 10 02 24 3E D0 00 20 4A 5A F2 23 \r
+49 93 02 34 1B 53 03 3C 0E 6E 08 68 49 69 3E B0 \r
+00 80 07 24 08 63 49 63 0B 63 3E B0 00 60 01 20 \r
+18 C3 1B 93 0C 38 3B 90 FF 00 0C 34 49 59 8B 10 \r
+09 DB 57 02 59 00 0D 49 0C 48 37 16 10 01 0C 43 \r
+0D 43 FB 3F 3D 40 FF FE 3C 43 57 02 5D 00 F5 3F \r
+CF 0D CD 0E CE 0C C2 93 59 1E 06 20 B0 13 58 F2 \r
+4C 93 02 20 2C 43 10 01 2E 83 2C 24 1E 83 43 24 \r
+2E 83 20 24 1E 83 3B 24 3E 80 03 00 34 24 1E 83 \r
+30 20 0E 43 8D 93 00 00 09 20 0F 93 2A 20 1C 4D \r
+02 00 1D 4D 04 00 B0 13 EC F2 31 3C 1C 43 2C 9D \r
+20 20 0F 93 1E 20 1C 4D 02 00 1D 4D 04 00 B0 13 \r
+DA F2 25 3C 3F B0 FE FF 14 20 CC 0F B0 13 9A F0 \r
+CE 0C 1D 3C 3F 90 03 00 07 24 2F 93 0A 20 CC 0D \r
+B0 13 D8 E7 CE 0C 13 3C CC 0D B0 13 8E DA CE 0C \r
+0E 3C 2E 43 0C 3C B0 13 04 F5 CE 0C 08 3C B0 13 \r
+08 F5 CE 0C 04 3C CC 0F B0 13 2E D6 CE 0C CC 0E \r
+10 01 0A 14 31 80 06 00 B0 13 20 F3 2E 42 CF 01 \r
+1F 53 3D 40 9A 1D 1F 53 FF 4D FF FF 1E 83 FB 23 \r
+3C 40 05 00 0D 43 CE 01 1E 53 B0 13 00 C3 D2 43 \r
+78 1D 4A 43 B0 13 F0 E8 0C 93 08 24 B0 13 48 C4 \r
+1A 2C F2 B0 20 00 78 1D F5 27 1F 3C E1 43 00 00 \r
+3C 40 03 00 3D 40 0A 00 CE 01 B0 13 00 C3 4A 43 \r
+B0 13 F8 F4 0C 93 04 20 E2 43 78 1D 5C 43 10 3C \r
+B0 13 48 C4 06 28 C2 43 59 1E E2 42 78 1D 4C 43 \r
+07 3C F2 B0 20 00 78 1D EB 27 C2 43 59 1E 4C 43 \r
+31 50 06 00 0A 16 10 01 3C 40 E8 03 B0 13 30 F3 \r
+B2 40 2B 5A 5C 01 CF 0A 1A 43 4A 5F 7F 90 0B 00 \r
+10 01 31 80 0E 00 CE 01 3D 40 00 18 4F 43 1E 53 \r
+FE 4D FF FF 5F 53 7F 90 0D 00 F9 2B F1 93 00 00 \r
+30 24 5F 41 01 00 C2 4F 94 1E 3F 90 15 00 05 38 \r
+3F 90 EC 00 02 34 C2 43 94 1E 5F 41 04 00 47 18 \r
+0F 5F 5E 41 05 00 0E 5F 82 4E 2E 1F D2 41 06 00 \r
+9A 1D D2 41 07 00 9B 1D D2 41 08 00 9C 1D D2 41 \r
+09 00 9D 1D F1 93 0C 00 08 24 5F 41 0A 00 47 18 \r
+0F 5F 5E 41 0B 00 0E 5F 01 3C 0E 43 82 4E 84 1E \r
+13 3C E2 42 94 1E B2 40 F6 FF 2E 1F F2 40 79 00 \r
+9A 1D F2 40 56 00 9B 1D F2 40 34 00 9C 1D F2 40 \r
+12 00 9D 1D 82 43 84 1E 31 50 0E 00 10 01 21 83 \r
+5F 42 92 1C 1D 42 90 1C 4C 4F 3E 40 FE 9D 0E 8C \r
+0D 9E 02 2C 4B 43 09 3C 81 4D 00 00 2E 41 3F 40 \r
+FE 00 4F 8E C2 4F 92 1C 5B 43 4E 43 15 3C 4F 4E \r
+5D 4F 93 1C 5E 53 4F 4E 5F 4F 93 1C 47 18 0F 5F \r
+0D 5F 5E 53 1C 42 90 1C CF 0C 2F 53 82 4F 90 1C \r
+B0 13 72 EA 5F 42 92 1C 4D 4F 1D 83 4C 4E 0C 9D \r
+E6 3B 4B 93 0C 20 5F B3 03 20 C2 43 92 1C 1A 3C \r
+4F 4F D2 4F 92 1C 93 1C D2 43 92 1C 13 3C 3C 40 \r
+FE 9D 3D 40 FE FF B0 13 72 EA C2 43 92 1C 5F 42 \r
+8C 1C 5F C3 6F D3 C2 4F 8C 1C 7C 40 15 00 6D 42 \r
+B0 13 08 F0 21 53 10 01 1A 14 21 82 CA 0C F2 B0 \r
+40 00 01 02 42 24 B0 13 7E DB 82 4C 7C 1E 1C 52 \r
+80 1E 3C 80 A1 0A 82 4C 7E 1E B0 13 9A D3 81 4C \r
+00 00 81 4D 02 00 4A 93 03 20 B0 13 50 C6 27 3C \r
+2C 41 1D 41 02 00 B0 13 B2 E6 3E 40 CD CC 3F 40 \r
+4C 3E B0 13 4A C2 C9 0C CA 0D 1C 42 78 1E 1D 42 \r
+7A 1E B0 13 B2 E6 3E 40 CD CC 3F 40 4C 3F B0 13 \r
+4A C2 CE 0C CF 0D CC 09 CD 0A B0 13 C2 B0 B0 13 \r
+CA DB 81 4C 00 00 81 4D 02 00 B0 13 50 C6 1E 42 \r
+7C 1E B0 13 00 9E 82 4C 82 1E 21 52 19 16 10 01 \r
+1C 41 04 00 1D 41 06 00 82 4C 78 1E 82 4D 7A 1E \r
+10 01 1A 14 21 82 39 40 CB 00 3C 40 00 40 B0 13 \r
+3C DA 3C 40 03 00 3D 40 05 00 0E 43 B0 13 00 C3 \r
+D1 43 02 00 C1 49 03 00 CC 01 2C 53 6D 43 B0 13 \r
+68 D2 3C 40 03 00 3D 42 0E 43 B0 13 00 C3 3C 40 \r
+0A 00 B0 13 30 F3 CC 01 B0 13 F4 DC 0C 93 18 20 \r
+C1 93 00 00 F8 27 B0 13 12 AA 4A 43 5A 92 9E 1D \r
+F2 2F 3C 40 0A 00 B0 13 30 F3 4C 4A B0 13 3A B4 \r
+3C 40 7A 1D 7D 40 13 00 B0 13 68 D2 5A 53 EE 3F \r
+3C 40 03 00 2D 42 0E 43 B0 13 00 C3 B2 40 2B 5A \r
+5C 01 F2 B0 20 00 78 1D B8 27 C2 43 59 1E 21 52 \r
+19 16 10 01 5A 14 C6 0F C7 0E C5 0D C9 0C 18 41 \r
+1C 00 C7 43 00 00 B0 13 2E BB CA 0C 0A 93 02 20 \r
+2C 42 3C 3C 1F 43 2F 99 02 24 09 43 09 3C 5C 49 \r
+02 00 B0 13 42 EB C9 0C 09 93 02 20 2C 43 2E 3C \r
+5E 4A 02 00 7E 80 0B 00 C7 4E 00 00 3D 40 0E 00 \r
+0D 5A 4E 4E CC 05 B0 13 A4 F2 09 93 06 24 D9 4A \r
+21 00 07 00 D9 4A 22 00 08 00 06 93 07 24 3D 40 \r
+07 00 0D 5A CC 06 2E 42 B0 13 A4 F2 08 93 06 24 \r
+3F 40 07 00 5F FA 0C 00 C8 4F 00 00 5D 4A 01 00 \r
+5C 43 B0 13 48 E9 CA 43 00 00 0C 43 55 16 10 01 \r
+4F 43 4C 93 2D 24 5C 93 20 24 6C 93 13 24 7C 90 \r
+03 00 2A 20 A2 D2 22 03 A2 C2 24 03 B2 C2 22 03 \r
+B0 13 1C F5 B0 13 2E C8 1F 42 20 03 6F F2 B2 C2 \r
+22 03 1A 3C A2 D2 24 03 B0 13 1C C8 B0 13 2E C8 \r
+A2 D2 22 03 B0 13 1C F5 0F 3C A2 D2 24 03 B2 C2 \r
+22 03 A2 D2 22 03 B0 13 1C F5 B0 13 12 C8 04 3C \r
+A2 D2 24 03 B0 13 12 C8 4C 43 4F 93 01 20 5C 43 \r
+10 01 B0 13 2E C8 B0 13 1C C8 10 01 A2 C2 22 03 \r
+B0 13 1C F5 B2 C2 22 03 B0 13 1C F5 10 01 B2 D2 \r
+22 03 B0 13 1C F5 10 01 1A 14 CB 0C 7B 90 BD 00 \r
+07 24 4C 43 7B 90 31 00 40 28 7B 90 3D 00 3D 2C \r
+0A 42 32 C2 03 43 B2 F0 BF FF 02 0F B2 B0 10 00 \r
+02 0F FC 27 7B 90 3D 00 26 2C 4C 43 B0 13 B0 F1 \r
+C9 0C 4C 43 7D 40 29 00 B0 13 04 E4 C2 4B 11 0F \r
+A2 B2 30 0F 13 24 7B 90 32 00 10 24 7B 90 39 00 \r
+0D 24 7B 90 38 00 0A 24 A2 B2 30 0F FD 23 0D 14 \r
+3D 40 BF 0C 1D 83 FE 23 0D 16 03 43 4C 43 CD 09 \r
+B0 13 04 E4 03 3C F2 40 BD 00 11 0F 5C 42 21 0F \r
+B2 B0 40 00 02 0F FC 27 02 4A 19 16 10 01 3A 14 \r
+07 4F 07 ED 0A 4F 5A 02 8A 10 4A 4A 0A 93 38 24 \r
+7F D0 80 00 0B 4D 5B 02 8B 10 4B 4B 0B 93 2B 24 \r
+7D D0 80 00 0B 8A 3B 50 7F 00 3A 40 18 00 08 43 \r
+09 43 0C 8E 0D 7F 03 2C 0C 5E 0D 6F 12 C3 08 68 \r
+09 69 5C 02 0D 6D 1A 83 F4 23 49 93 03 30 1A 53 \r
+1B 83 EF 3F 0C 7E 0D 7F 08 63 49 63 0B 63 1B 93 \r
+0C 38 3B 90 FF 00 0C 34 49 59 8B 10 09 DB 57 02 \r
+59 00 0D 49 0C 48 37 16 10 01 0C 43 0D 43 FB 3F \r
+3C 40 FF FE 3D 43 57 02 5D 00 F5 3F 2A 14 21 83 \r
+C9 0C 3F 40 0B 00 0F 59 68 4F 3A 40 3F 00 4A F8 \r
+3C 40 07 00 0C 59 1D 42 C6 1E 2E 42 B0 13 54 ED \r
+0C 93 2D 24 78 B0 40 00 2A 20 4A 93 10 24 7A 90 \r
+07 00 0D 2C 4A 4A 5A 06 00 18 5F 4A 3E FA 2C 43 \r
+0C 59 4F 13 1C 93 1B 20 D9 43 00 00 1A 3C 7A 90 \r
+3F 00 03 24 7A 90 20 00 12 28 2C 43 0C 59 CD 01 \r
+B0 13 E8 C9 4C 93 0B 24 D9 43 00 00 00 18 C2 93 \r
+CA 1E 07 24 6C 41 80 13 CA 1E 4C 93 02 24 C9 43 \r
+00 00 21 53 28 16 10 01 4A 14 C7 0D C8 0C 39 40 \r
+41 1E 3A 40 3F 00 5A F8 09 00 26 43 2F 43 6F 99 \r
+32 20 5A 99 09 00 2F 20 7A 90 3F 00 0B 24 3C 40 \r
+03 00 0C 59 3D 40 05 00 0D 58 2E 42 B0 13 54 ED \r
+0C 93 21 20 D7 49 0B 00 00 00 57 43 7A 90 3F 00 \r
+16 24 3F 40 0A 00 0F 58 6F 4F 7F B0 80 FF 0A 20 \r
+7F B2 0D 24 D9 98 0B 00 02 00 02 20 C9 43 02 00 \r
+47 43 05 3C 5D 49 0A 00 CC 08 B0 13 90 CD B0 13 \r
+A8 F3 CC 07 05 3C 39 50 0C 00 16 83 C7 23 4C 43 \r
+46 16 10 01 4A 14 C9 0F C7 0E C6 0D CA 0C 6C 43 \r
+B0 13 84 CE C8 0C 08 93 02 20 0C 43 36 3C CF 07 \r
+7F 50 0B 00 C8 4F 02 00 3E 40 0B 00 0E 58 3F 40 \r
+80 00 6F FE 4F DA CE 4F 00 00 D8 42 C4 1E 0D 00 \r
+D2 53 C4 1E FD 27 F8 F0 BF 00 0C 00 5F 48 0C 00 \r
+7F F0 F8 00 4F D9 C8 4F 0C 00 F8 F0 7F 00 0C 00 \r
+F8 C2 0C 00 FE F0 7F 00 00 00 3C 40 0E 00 0C 58 \r
+4E 47 CD 06 B0 13 A4 F2 3C 40 07 00 0C 58 1D 42 \r
+C6 1E 2E 42 B0 13 A4 F2 CC 08 46 16 10 01 5C 43 \r
+B0 13 D4 D5 5C 43 6D 42 80 13 8C 1E B0 13 E4 E6 \r
+7C 40 17 00 6D 43 B0 13 08 F0 7C 40 18 00 6D 43 \r
+B0 13 08 F0 7C 40 19 00 6D 43 B0 13 08 F0 B0 13 \r
+FE F2 B2 40 03 00 72 1D B2 40 10 0E 74 1D B0 13 \r
+B2 C3 4C 93 02 24 B0 13 62 C6 82 43 72 1D B0 13 \r
+40 F3 3C 40 00 20 B0 13 3C DA C2 43 1D 02 82 43 \r
+D8 1E 7C 40 17 00 6D 42 B0 13 08 F0 7C 40 18 00 \r
+6D 42 B0 13 08 F0 7C 40 19 00 6D 42 B0 13 08 F0 \r
+92 D3 14 1D 10 01 1F 42 A6 1E CF 43 11 00 1F 42 \r
+A6 1E DF 42 B3 1E 13 00 1F 42 A6 1E 5E 42 38 1F \r
+5E 8F 0C 00 CF 4E 16 00 1F 42 A6 1E 5E 4F 16 00 \r
+8E 11 8F 5E 0A 00 1F 42 A6 1E DF 5F 16 00 15 00 \r
+1F 42 A6 1E DF 42 3A 1F 12 00 1F 42 A6 1E FF 92 \r
+12 00 02 2C FF 42 12 00 1F 42 A6 1E 9F 42 B4 1E \r
+04 00 9F 42 B6 1E 06 00 1F 42 A6 1E DF 42 B8 1E \r
+0E 00 1F 42 A6 1E EF B2 1A 00 03 20 4D 43 B0 13 \r
+2A E1 B0 13 7A D5 D2 C3 36 1F 10 01 0A 14 5F 42 \r
+32 1F 3F 90 07 00 0E 34 3F 90 06 00 31 24 1F 83 \r
+32 24 1F 83 14 24 1F 83 2E 24 1F 83 29 24 1F 83 \r
+2A 24 2C 3C 3F 80 07 00 2F 93 25 28 2F 83 20 24 \r
+1F 83 21 24 1F 83 1C 24 1F 83 1D 24 1F 3C 1A 42 \r
+34 1F 3A B0 03 00 0E 20 CC 0A 3D 40 64 00 B0 13 \r
+DC F1 0E 93 0A 20 CC 0A 3D 40 90 01 B0 13 DC F1 \r
+0E 93 03 24 7C 40 1C 00 0A 3C 7C 40 1D 00 07 3C \r
+7C 40 1E 00 04 3C 7C 40 1F 00 01 3C 4C 43 0A 16 \r
+10 01 3C 40 3D 1E 0D 43 3E 40 1C 00 B0 13 B6 F2 \r
+E2 43 3D 1E F2 40 3D 00 3E 1E F2 40 20 00 3F 1E \r
+D2 43 40 1E B0 13 76 EC B0 13 50 EF B0 13 7E F0 \r
+B0 13 56 F4 B0 13 6A EB B0 13 4C F4 B0 13 A8 E7 \r
+3F 40 41 1E CF 43 00 00 3F 50 0C 00 CF 43 00 00 \r
+C2 93 4D 1E 15 20 E2 43 4D 1E F2 40 03 00 4E 1E \r
+7F 40 3F 00 C2 4F 56 1E C2 4F 57 1E F2 43 58 1E \r
+B0 13 EC F4 CD 0C 3C 40 50 1E 2E 42 B0 13 A4 F2 \r
+0C 43 10 01 1E 42 A6 1E 5F 4E 15 00 8F 11 3F 90 \r
+40 00 0B 34 3F 90 C1 FF 14 34 FE 50 40 00 15 00 \r
+1F 42 A6 1E 9F 83 08 00 07 3C FE 80 40 00 15 00 \r
+1F 42 A6 1E 9F 53 08 00 1F 42 A6 1E 5F 4F 15 00 \r
+8F 11 1E 42 A6 1E CE 5F 14 00 1E 42 A6 1E 5F 4E \r
+14 00 8F 11 3F 90 40 00 0B 34 3F 90 C1 FF 0F 34 \r
+FE 50 40 00 14 00 1F 42 A6 1E 9F 83 0A 00 10 01 \r
+FE 80 40 00 14 00 1F 42 A6 1E 9F 53 0A 00 10 01 \r
+1A 14 31 80 22 00 C9 0D 5A 4C 0B 00 3F 40 CF 00 \r
+5F F1 0A 00 5F D2 C8 1E 7F F0 BF 00 C1 4F 0A 00 \r
+3D 40 05 00 0D 5C CC 01 1C 53 2E 42 B0 13 A4 F2 \r
+CC 01 3C 50 05 00 1D 42 C6 1E 2E 42 B0 13 A4 F2 \r
+3D 40 C0 00 5D F1 09 00 4D D9 F1 40 0B 00 00 00 \r
+C1 4A 0B 00 3F 40 70 00 5F F1 0A 00 7F D0 0B 00 \r
+C1 4F 0A 00 7D F0 3F 00 C1 4D 09 00 CC 01 4D 43 \r
+B0 13 50 BF 31 50 22 00 19 16 10 01 21 82 F2 F0 \r
+BF 00 05 02 F2 F0 BF 00 19 02 B2 D0 0C 00 22 03 \r
+B2 D0 0C 00 24 03 C2 43 FE 1D 3C 40 CC 0C B0 13 \r
+3C DA 7C 40 06 00 5D 43 B0 13 EA D7 C1 4C 00 00 \r
+3C 40 CC 0C B0 13 3C DA 7C 40 07 00 4D 43 B0 13 \r
+DE CF C1 4C 01 00 D1 B3 01 00 12 20 C1 93 01 00 \r
+0F 24 7C 40 7F 00 4D 43 B0 13 DE CF C1 4C 02 00 \r
+D1 93 02 00 03 24 C2 43 FE 1D 02 3C D2 43 FE 1D \r
+21 52 10 01 2A 14 5C 93 03 20 3F 40 00 1C 02 3C \r
+3F 40 46 1C 2D 43 08 43 CB 08 4E 43 79 40 03 00 \r
+CF 93 00 00 06 20 6C 93 02 20 CC 0F 24 3C CB 0F \r
+0C 3C 5C 93 0A 20 5E 53 2A 42 6A 9F 06 24 5A 4F \r
+01 00 4A 99 02 2C C8 0F C9 0A 3F 50 23 00 1D 83 \r
+E7 23 0B 93 0C 20 08 93 02 20 0C 43 0C 3C CB 08 \r
+5D 4B 01 00 B0 13 48 E9 EB 43 01 00 03 3C 5E 53 \r
+CB 4E 01 00 CC 0B 28 16 10 01 1A 14 CF 0E CA 0C \r
+7A 90 1A 00 31 28 7A 90 2A 00 2E 2C 4E 4A 5E 02 \r
+1C 4E 16 1D 4E 4A 5E 4E AC F9 7D 90 30 00 05 2C \r
+7D 90 2D 00 05 20 6B 43 08 3C 7D 90 5B 00 02 28 \r
+4B 43 03 3C 4B 4D 5B 4B 50 F9 7A 90 21 00 11 28 \r
+C9 0B 43 18 49 59 43 19 4B 10 4B D9 7A 90 21 00 \r
+08 20 7D 90 31 00 03 24 7D 90 4C 00 02 20 7B 40 \r
+80 00 CD 0B B0 13 C0 D4 19 16 10 01 0A 14 CE 0C \r
+0B 42 32 C2 03 43 B2 F0 BF FF 02 0F B2 B0 10 00 \r
+02 0F FC 27 7E 90 31 00 23 28 7E 90 3D 00 20 2C \r
+4C 43 B0 13 0E DE CA 0C 4C 43 7D 40 29 00 B0 13 \r
+B4 E5 C2 4E 11 0F A2 B2 30 0F 0D 24 7E 90 32 00 \r
+0A 24 7E 90 38 00 07 24 A2 B2 30 0F FD 23 3C 40 \r
+F8 02 B0 13 06 F1 4C 43 CD 0A B0 13 B4 E5 02 3C \r
+C2 4E 11 0F 5C 42 21 0F 02 4B 0A 16 10 01 0A 14 \r
+CB 0D CA 0C 4C 43 B0 13 A0 C7 7C 40 22 00 B0 13 \r
+40 D0 0C 24 CC 0A B0 13 40 D0 08 24 5C 43 B0 13 \r
+A0 C7 7C 40 23 00 B0 13 40 D0 02 20 0C 43 16 3C \r
+5B 93 05 24 4C 43 B0 13 E0 DA 4D 4C 0B 3C 5C 43 \r
+B0 13 E0 DA 4C 4C 4D 4C 8D 10 4C 43 B0 13 E0 DA \r
+4C 4C 0D DC 6C 43 B0 13 A0 C7 CC 0D 0A 16 10 01 \r
+B0 13 EC DF 7C 40 03 00 B0 13 A0 C7 4C 93 10 01 \r
+7C 40 36 00 B0 13 38 C8 4C 43 3D 40 D6 F9 7E 40 \r
+27 00 B0 13 DE DE 7C 40 2C 00 7D 40 88 00 B0 13 \r
+04 E4 7C 40 2D 00 7D 40 31 00 B0 13 04 E4 7C 40 \r
+2E 00 7D 40 09 00 B0 13 04 E4 7C 40 36 00 B0 13 \r
+38 C8 7C 40 33 00 B0 13 38 C8 7C 40 3D 00 B0 13 \r
+38 C8 7C B0 70 00 F9 23 7C 40 36 00 B0 13 38 C8 \r
+82 43 1E 1F B2 D0 01 02 34 0F 82 43 32 0F 10 01 \r
+7C 40 36 00 B0 13 38 C8 F2 B0 10 00 36 1F 1F 24 \r
+7C 40 0A 00 5D 42 FA 1E B0 13 04 E4 F2 90 7F 00 \r
+FB 1E 03 38 7D 40 0C 00 02 3C 5D 42 FB 1E 7C 40 \r
+0C 00 B0 13 04 E4 F2 B2 36 1F 03 20 7D 40 11 00 \r
+02 3C 7D 40 15 00 7C 40 12 00 B0 13 04 E4 7C 40 \r
+34 00 B0 13 38 C8 B2 F0 FE FD 32 0F B2 F0 FE FD \r
+32 0F B2 D0 01 02 36 0F A2 43 1E 1F 10 01 0A 14 \r
+CA 0D CB 0C 7B 93 02 24 CF 0B 02 3C 4B 43 4F 43 \r
+4E 4B 4F 4F 0F 8E 1F 53 4C 4B 3D 40 1C 00 B0 13 \r
+F2 F1 1C 52 64 FA 4A 93 09 24 8C 43 00 00 8C 43 \r
+02 00 CC 43 1A 00 FC 40 7F 00 10 00 8C 43 18 00 \r
+FC F0 FC 00 1A 00 8C 43 04 00 8C 43 06 00 CC 43 \r
+0E 00 CC 43 12 00 CC 43 0F 00 CC 43 11 00 5B 53 \r
+1F 83 DA 23 0A 16 10 01 B0 13 3A D7 5C 06 3D 40 \r
+29 00 B0 13 DC F1 1F 42 2E 1F 0F 5C 3F 90 69 01 \r
+03 2C 1C 42 2C 1F 03 3C 1C 42 2C 1F CF 0C 5C 06 \r
+0C 5F 5C 02 3D 40 0A 00 B0 13 DC F1 82 4C 2C 1F \r
+3C 90 F0 00 08 28 B2 F0 DF FF 86 1E 7C 42 4D 43 \r
+B0 13 08 F0 07 3C B2 D0 20 00 86 1E 7C 42 5D 43 \r
+B0 13 08 F0 B2 D2 14 1D B2 D0 80 00 14 1D 10 01 \r
+1A 14 21 82 CA 0C 3C 40 05 00 0C 5A 5D 4A 0E 00 \r
+B0 13 18 E3 0C 93 02 20 3F 42 03 3C B0 13 E6 F4 \r
+0F 43 F1 40 82 00 00 00 D1 4A 0D 00 01 00 C1 4F \r
+02 00 6C 43 CD 01 7E 40 03 00 7F 40 03 00 B0 13 \r
+74 CA C9 0C 09 93 0D 24 3C 40 03 00 0C 59 3D 40 \r
+05 00 0D 5A 2E 42 B0 13 A4 F2 CC 09 4D 43 B0 13 \r
+08 E8 21 52 19 16 10 01 2A 14 C8 0D C9 0C 5C 42 \r
+FF 1D B0 13 42 EB CA 0C B0 13 D4 F4 0A 93 24 24 \r
+CC 0A 5D 43 B0 13 50 EC 0C 93 1F 20 09 93 1D 24 \r
+5C 4A 0A 00 5F 4A 01 00 CD 09 CE 08 B0 13 74 CA \r
+C9 0C 09 93 0E 24 3C 40 03 00 0C 59 3D 40 03 00 \r
+0D 5A 2E 42 B0 13 A4 F2 CC 09 5D 43 B0 13 08 E8 \r
+04 3C 3C 40 03 00 01 3C 2C 43 28 16 10 01 0E 42 \r
+32 C2 03 43 4C 93 2C 24 4F 4C 3F 50 00 7E B2 B0 \r
+10 00 02 0F FC 27 82 4F 10 0F B2 B0 10 00 02 0F \r
+FC 27 F2 40 3D 00 11 0F B2 B0 10 00 02 0F FC 27 \r
+F2 40 FE 00 11 0F B2 B0 20 00 02 0F FC 27 C2 43 \r
+10 0F B2 B0 80 00 02 0F FC 27 5D 42 20 0F B2 B0 \r
+10 00 02 0F FC 27 F2 40 3D 00 11 0F 4D 9C D7 23 \r
+02 4E 10 01 0A 14 CA 0D 6A 92 1A 24 B0 13 E4 F3 \r
+4C 93 08 20 7C 40 47 00 3D 40 0A F9 5E 43 B0 13 \r
+E0 BC 0E 3C 5C 42 C2 1E 0D 43 7E 40 03 00 6F 43 \r
+B0 13 DC C0 CD 0C 7C 40 47 00 5E 43 B0 13 E0 BC \r
+B0 13 E4 F3 4C 93 0F 20 5A 93 08 24 6A 92 0B 20 \r
+7C 40 13 00 4D 43 B0 13 08 F0 05 3C 7C 40 13 00 \r
+5D 43 B0 13 08 F0 0A 16 10 01 21 82 81 43 00 00 \r
+81 43 02 00 7C 40 7F 00 4D 43 B0 13 DE CF 81 4C \r
+00 00 81 43 02 00 2C 41 1F 41 02 00 47 18 0C 5C \r
+0D 43 3C F0 00 07 0D F3 B0 13 00 E2 81 4C 00 00 \r
+81 4D 02 00 7C 40 80 00 5D 43 B0 13 DE CF 81 DC \r
+00 00 12 C3 11 10 02 00 11 10 00 00 12 C3 11 10 \r
+02 00 11 10 00 00 2C 41 1D 41 02 00 21 52 10 01 \r
+1F 42 38 0F 1E 42 0E 0F 0E 93 14 20 0F 93 28 24 \r
+3F 90 14 00 0C 20 B2 B0 00 02 36 0F 03 20 32 C2 \r
+03 43 FF 3F B2 F0 FF FD 32 0F 80 00 6C B8 32 C2 \r
+03 43 FF 3F 2E 93 11 20 1F 42 0C 0F 2F 93 0A 24 \r
+2F 92 08 24 3F 90 06 00 05 24 3F 92 03 24 32 C2 \r
+03 43 FF 3F 32 C2 03 43 FF 3F 32 C2 03 43 FF 3F \r
+10 01 B2 F0 FE FD 36 0F B2 F0 FE FD 32 0F B2 F0 \r
+FE FD 32 0F 92 43 1E 1F 7C 40 32 00 B0 13 B0 F1 \r
+C2 4C 20 1F 7C 43 3D 40 B0 1E 7E 40 0A 00 B0 13 \r
+9A DE 7C 43 B0 13 B0 F1 C2 4C 3A 1F 7C B0 80 FF \r
+04 20 F2 80 80 00 3A 1F 03 3C F2 F0 7F 00 3A 1F \r
+1F 42 22 1F 3F 80 10 00 82 4F 38 1F 80 00 EC E0 \r
+5F 93 20 24 4F 93 1B 24 6F 93 12 24 7F 90 03 00 \r
+05 24 6F 92 1C 20 B0 13 10 D5 10 01 4E 4E 3E E3 \r
+CF 0E 6F FC 4D DF CC 4D 00 00 CC FE 20 00 10 01 \r
+B0 13 10 D5 CC DD 00 00 CC DD 20 00 10 01 CC CE \r
+00 00 10 01 6F 4C 4F CE 4D DF CC 4D 00 00 10 01 \r
+4E 4E 3E E3 CC FE 00 00 CC FE 20 00 10 01 92 53 \r
+96 1E 82 63 98 1E 1F 43 5F 52 A2 1E 3F 90 3C 00 \r
+1F 20 C2 43 A2 1E 1F 43 5F 52 A1 1E 3F 90 3C 00 \r
+12 20 C2 43 A1 1E 1F 43 5F 52 A0 1E F2 40 03 00 \r
+9E 1E 3F 90 18 00 03 24 C2 4F A0 1E 10 01 C2 43 \r
+A0 1E 80 00 2E E0 C2 4F A1 1E E2 43 9E 1E 10 01 \r
+C2 4F A2 1E D2 43 9E 1E 10 01 0A 14 1F 42 A6 1E \r
+DF 53 13 00 B0 13 14 CD 1F 42 A6 1E 1E 4F 08 00 \r
+1E 5F 0A 00 8F 4E 0C 00 1F 42 A6 1E 9F 4F 0C 00 \r
+0A 00 1A 42 A6 1E CF 0A 5C 4F 13 00 2D 4F 1E 4F \r
+02 00 3F 40 00 08 B0 13 3C DD 8A 8C 0C 00 1F 42 \r
+A6 1E CF 43 0F 00 1F 42 A6 1E FF F0 FC 00 1A 00 \r
+0A 16 10 01 0A 14 CA 0C 7D 40 46 00 7E 40 5A 00 \r
+B0 13 2C F4 0D 43 4E 43 B0 13 E0 BC 5A 93 0D 24 \r
+7C 40 29 00 B0 13 26 D6 7C 40 27 00 B0 13 26 D6 \r
+7C 40 28 00 B0 13 26 D6 0C 3C 7C 40 1F 00 B0 13 \r
+26 D6 7C 40 20 00 B0 13 26 D6 7C 40 1E 00 B0 13 \r
+26 D6 0A 16 10 01 4D 43 B0 13 08 F0 10 01 0A 14 \r
+0A 43 2C 92 22 24 3C 90 05 00 1C 24 3C 92 17 24 \r
+3C 90 0A 00 12 20 2F 4D 0F 93 0A 24 1F 83 06 24 \r
+1F 83 02 24 2C 43 16 3C 6C 43 03 3C 5C 43 01 3C \r
+4C 43 B0 13 EC F0 0C 43 0D 3C 2A 43 0A 3C B0 13 \r
+F0 EE 07 3C B0 13 06 EE 04 3C B0 13 D0 EE B0 13 \r
+30 ED CC 0A 0A 16 10 01 C2 93 76 1E 29 20 C2 93 \r
+FE 1D 07 20 7C 40 47 00 3D 40 FE F8 5E 43 80 00 \r
+E0 BC F2 F0 BF 00 1D 02 F2 D0 40 00 1B 02 B0 13 \r
+20 F4 D2 43 76 1E 7E 40 0F 00 07 3C 4E 93 0B 24 \r
+3C 40 CC 0C B0 13 3C DA 5E 83 F2 B0 40 00 01 02 \r
+F5 27 4E 93 02 20 C2 43 76 1E 4C 43 80 00 B8 C5 \r
+10 01 1A 14 C9 0C 79 93 02 24 CA 09 02 3C 49 43 \r
+4A 43 4F 49 4A 4A 0A 8F 1A 53 CC 09 B0 13 E8 EC \r
+0C 93 09 20 4C 49 3D 40 1C 00 B0 13 F2 F1 1C 52 \r
+64 FA B0 13 98 D9 59 53 1A 83 EF 23 E2 B3 36 1F \r
+0A 24 B0 13 38 F4 4C 93 06 20 D2 C3 36 1F B0 13 \r
+10 F3 B0 13 C8 F4 19 16 10 01 B2 D0 91 00 B0 01 \r
+B2 40 10 0A 00 07 B2 40 00 02 02 07 F2 40 1B 00 \r
+10 07 92 43 0C 07 2C 43 B0 13 3C DA A2 D3 00 07 \r
+C2 43 46 1F 92 D3 00 07 3C 40 05 00 B0 13 3C DA \r
+C2 93 46 1F FD 27 B2 F0 FC F5 00 07 B2 F0 EF FF \r
+00 07 B2 F0 6E FF B0 01 82 43 0C 07 1C 42 44 1F \r
+10 01 B2 40 44 F8 40 1F B2 40 9E F8 42 1F 00 18 \r
+D2 42 4C F8 8C 1E 00 18 D2 42 A6 F8 90 1E 82 43 \r
+D8 1E 82 43 86 1E 82 43 88 1E 82 43 14 1D 82 43 \r
+8A 1E 92 D3 14 1D B0 13 62 C4 B0 13 9C ED B0 13 \r
+6C F2 B0 13 6A F4 B0 13 22 DF B0 13 C6 F1 B0 13 \r
+F2 F4 B0 13 8E F3 80 00 38 E8 0A 14 21 83 CA 0D \r
+CB 0C 4C 43 B0 13 A0 C7 7C 40 22 00 B0 13 26 D8 \r
+0E 24 CC 0B B0 13 26 D8 0A 24 CC 0A B0 13 34 D8 \r
+C1 4C 00 00 6C 43 B0 13 A0 C7 5C 43 01 3C 4C 43 \r
+21 53 0A 16 10 01 B0 13 34 D8 C1 4C 04 00 C1 93 \r
+04 00 10 01 B0 13 EC DF 7C 40 03 00 B0 13 A0 C7 \r
+10 01 0A 14 09 14 09 43 0A 43 1B 43 0F 93 04 24 \r
+09 4D 0D 4C 0C 43 0D 3C 5C 02 0D 6D 09 69 09 8E \r
+04 28 1C D3 5B 02 F8 2B 03 3C 09 5E 5B 02 F4 2B \r
+1B 43 5C 02 0D 6D 09 69 0A 6A 09 8E 0A 7F 04 28 \r
+1C D3 5B 02 F6 2B 04 3C 09 5E 0A 6F 5B 02 F1 2B \r
+0E 49 0F 4A 09 16 0A 16 10 01 0A 14 7C 40 23 00 \r
+B0 13 B0 F1 CA 0C 7A D0 20 00 CD 0A 7C 40 23 00 \r
+B0 13 04 E4 7C 40 C4 00 B0 13 CE D2 7C 40 33 00 \r
+B0 13 38 C8 7C 40 3D 00 B0 13 38 C8 7C B0 70 00 \r
+F9 23 3D 40 DF 00 4D FA 7C 40 23 00 B0 13 04 E4 \r
+7C 40 36 00 B0 13 38 C8 82 43 1E 1F 0A 16 10 01 \r
+4F 14 1F 42 6E 03 2F 83 1E 24 2F 82 0B 24 2F 83 \r
+1C 20 B2 F0 EF FF 4A 03 92 C3 4A 03 B2 D0 80 00 \r
+86 1E 13 3C B2 F0 EF FF 48 03 92 C3 48 03 1F 42 \r
+50 03 1F 52 1A 1F 82 4F 58 03 B2 D0 10 00 48 03 \r
+80 13 16 1F 02 3C B0 13 DC E2 B1 C0 D0 00 14 00 \r
+4B 16 00 13 B2 B0 20 00 86 1E 25 20 B0 13 E4 F3 \r
+4C 93 21 20 B0 13 FC F3 4C 93 1D 20 D2 53 EB 1E \r
+E2 93 EB 1E 18 20 4C 43 4D 43 B0 13 08 F0 5C 43 \r
+B0 13 D4 D5 7C 40 5A 00 3D 40 E2 F8 5E 43 B0 13 \r
+E0 BC 7C 40 46 00 3D 40 0E F9 5E 43 B0 13 E0 BC \r
+3F 40 00 10 C0 0F 10 01 AC 43 18 00 FC F0 FC 00 \r
+1A 00 CC 43 12 00 5F 42 AC 1E C2 93 AD 1E 06 24 \r
+5E 42 AC 1E 12 C3 4E 10 4E 11 4F 8E CC 4F 13 00 \r
+E2 B3 36 1F 11 20 F2 D0 06 00 36 1F B0 13 9C F3 \r
+82 4C A4 1E C2 93 AD 1E 04 20 B2 50 E0 7F A4 1E \r
+10 01 B2 50 C0 53 A4 1E 10 01 2A 14 1A 41 10 00 \r
+49 4C 1B 42 A6 1E 1B 4B 0C 00 0B 89 3B 80 32 00 \r
+28 4D C9 0B 09 88 09 93 02 38 28 9E 15 20 8D 4B \r
+00 00 1D 42 A6 1E 4C 4C 1C 5D 0C 00 3C 50 10 00 \r
+8E 4C 00 00 1E 42 A6 1E DF 4E 0F 00 00 00 1F 42 \r
+A6 1E DA 4F 10 00 00 00 28 16 10 01 B2 B0 30 00 \r
+40 03 24 24 B2 F0 EF FF 4A 03 B2 F0 7F FF 86 1E \r
+82 93 50 03 02 20 0F 43 05 3C 1F 42 50 03 1F 92 \r
+50 03 FB 23 0F 5C 82 4F 5A 03 92 C3 4A 03 B2 D0 \r
+10 00 4A 03 B0 13 A8 F4 B2 40 2B 5A 5C 01 32 C2 \r
+03 43 B2 B0 80 00 86 1E F5 27 32 D2 10 01 1A 14 \r
+CA 0C 5C 4A 05 00 CF 0C 3F 80 03 00 06 24 2F 83 \r
+2F 93 03 28 7F 40 03 00 01 3C 5F 43 4C 4C 1D 4A \r
+02 00 5E 4A 04 00 B0 13 74 CA C9 0C 09 93 0C 24 \r
+3C 40 03 00 0C 59 2D 4A 2E 42 B0 13 A4 F2 CC 09 \r
+5D 43 B0 13 08 E8 02 3C 3C 40 03 00 19 16 10 01 \r
+A2 D2 22 03 A2 C2 24 03 3E 42 4F 43 B2 C2 22 03 \r
+B0 13 24 DB 4F 5F A2 B2 20 03 01 24 5F D3 1E 83 \r
+F5 23 A2 D2 24 03 B2 C2 22 03 5C 93 03 24 A2 D2 \r
+22 03 02 3C A2 C2 22 03 B0 13 24 DB B2 C2 22 03 \r
+CC 0F 10 01 B0 13 1C F5 B2 D2 22 03 B0 13 1C F5 \r
+10 01 D2 B3 36 1F 1D 24 A2 93 A8 1E 1A 24 1F 42 \r
+A6 1E 2C 4F 1D 4F 02 00 0D 93 08 20 0C 93 06 20 \r
+82 93 A8 1E 0E 20 92 43 A8 1E 0F 3C 1E 42 B0 1E \r
+1F 42 B2 1E 3E F3 3F F0 FF 00 0F 9D 02 20 0E 9C \r
+02 24 4C 43 10 01 A2 43 A8 1E 5C 43 10 01 21 83 \r
+81 43 00 00 7C 40 81 00 5D 43 B0 13 DE CF 81 4C \r
+00 00 B1 B0 00 20 00 00 02 20 4E 43 08 3C B1 D0 \r
+00 C0 00 00 B1 E3 00 00 91 53 00 00 5E 43 2C 41 \r
+5C 03 CF 0C 4E 93 04 24 3C 40 AC 0A 0C 8F 03 3C \r
+3C 40 AC 0A 0C 5F 21 53 10 01 0B 4D 0E 4B 0D 93 \r
+1F 30 3B F0 80 7F 1C 24 5B 02 8B 10 7E D0 80 00 \r
+3B 80 7F 00 15 30 3B 90 20 00 0F 34 3B 80 17 00 \r
+05 30 1B 83 08 30 5C 02 0E 6E FB 3F 5E 01 5C 00 \r
+1B 53 01 24 FB 3F 0D 4E 10 01 3C 43 3D 43 10 01 \r
+0C 43 0D 43 10 01 0B 4D 0B EF 0A 30 0D 93 12 30 \r
+0D 9F 02 24 19 34 16 3C 0C 9E 18 24 13 28 14 3C \r
+3D B0 80 7F 04 20 3F B0 80 7F 01 20 0F 24 0D 9F \r
+0B 34 08 3C 0F 9D 02 24 07 34 04 3C 0E 9C EC 27 \r
+01 28 02 3C 3C 43 10 01 1C 43 10 01 0C 43 10 01 \r
+C2 93 FE 1E 21 20 D2 43 FE 1E B2 40 8F 02 00 1F \r
+B2 40 33 13 02 1F B2 40 14 01 80 03 B2 40 05 00 \r
+92 03 B2 40 80 00 82 03 F2 D0 80 00 0B 02 00 18 \r
+F2 40 AA DC 16 1F 3C 40 8F 02 B0 13 F4 E9 92 42 \r
+02 1F 1A 1F E2 43 04 1F 10 01 E2 93 04 1F 13 24 \r
+B0 13 1C F2 C2 93 04 1F 1C 24 82 43 90 03 B2 D0 \r
+10 00 80 03 F2 D0 80 00 0B 02 E2 43 04 1F 92 42 \r
+02 1F 1A 1F 10 01 B2 F0 CF FF 80 03 F2 F0 7F 00 \r
+03 02 F2 F0 7F 00 0B 02 D2 43 04 1F 92 42 00 1F \r
+1A 1F 10 01 1A 14 31 80 06 00 C9 0C 5A 42 FF 1D \r
+CC 0A B0 13 42 EB 0C 93 02 20 2C 43 13 3C 4D 43 \r
+B0 13 50 EC 0C 93 0E 20 91 43 02 00 C1 4A 04 00 \r
+81 43 00 00 CC 01 2C 53 3D 40 7A 1D CE 09 0F 43 \r
+B0 13 04 C7 31 50 06 00 19 16 10 01 1A 14 CA 0D \r
+CB 0C CC 0A CD 0E B0 13 3E E2 4D 4C CC 0A 49 4B \r
+5C E9 44 F7 47 18 0C 5C 4B ED 5B 4B 44 F7 0B 5C \r
+4A 4A 47 18 0A 5A CC 0E 4C DD 0C 5A 0C EB 0F 9C \r
+06 2C 3E 40 FF 7F 0C FE 5E 03 0F 9C FC 2B 19 16 \r
+10 01 F2 40 A5 00 21 01 4E 4C 4F 4E 8F 10 0E 5F \r
+3E 50 00 44 82 4E 24 01 4F 4C 3F 50 00 44 82 4F \r
+26 01 92 B3 2C 01 FD 27 C2 4C 20 01 B2 F0 F9 FF \r
+2C 01 A2 B3 2C 01 03 24 A2 B2 2C 01 FD 27 82 4E \r
+26 01 C2 43 21 01 10 01 1A 14 3F 40 78 FA 9F 00 \r
+FF FF 12 24 3D 40 78 FA 0C 3C 4F 13 2A 52 12 3C \r
+3C 4D CA 0D CE 09 B0 13 A4 F2 0A 59 CD 0A 1D 53 \r
+1D C3 39 4D 09 93 F4 23 3F 40 FF FF 3F 93 05 24 \r
+3A 40 FF FF 0F 0A DF 03 E8 23 19 16 10 01 7C 90 \r
+3C 00 06 28 7C 90 3E 00 03 24 32 C2 03 43 FF 3F \r
+0F 42 32 C2 03 43 B2 B0 10 00 02 0F FC 27 7C 90 \r
+2F 00 08 28 7C 90 3E 00 05 24 7C D0 C0 00 C2 4C \r
+13 0F 04 3C 7C D0 80 00 C2 4C 13 0F 5C 42 22 0F \r
+02 4F 10 01 0B 4D 0E 4B 3B F0 80 7F 1C 24 5B 02 \r
+8B 10 7E D0 80 00 3B 80 7F 00 15 30 3B 90 10 00 \r
+10 34 5E 01 5C 00 1E 93 01 24 FB 3F 1B 83 03 30 \r
+5C 02 0E 6E FB 3F 0D 93 02 34 3E E3 1E 53 0C 4E \r
+10 01 3C 43 10 01 0C 43 10 01 0A 14 CB 0D 0A 42 \r
+32 C2 03 43 B2 B0 10 00 02 0F FC 27 7C D0 C0 00 \r
+C2 4C 13 0F 4F 4E 1F 83 0A 24 B2 B0 80 00 02 0F \r
+FC 27 1D 53 DD 42 22 0F FF FF 1F 83 F6 23 4D 4E \r
+0D 5B DD 42 20 0F FF FF 02 4A 0A 16 10 01 0B 42 \r
+32 C2 03 43 B2 B0 10 00 02 0F FC 27 4C 4C 47 18 \r
+0C 5C 3C D0 00 40 6F 4D 0F 5C 82 4F 10 0F 6E 93 \r
+0C 28 1D 53 4E 4E 1E 83 E2 4D 10 0F B2 B0 20 00 \r
+02 0F FC 27 1D 53 1E 83 F7 23 5F 42 20 0F 02 4B \r
+10 01 C2 43 76 1E 82 43 82 1E 82 43 7E 1E 82 43 \r
+80 1E C2 93 FE 1D 16 24 B0 13 2A EC B0 13 88 D6 \r
+B0 13 C6 EA 1C 42 84 1E 0C 93 0C 24 1C 52 82 1E \r
+82 4C 82 1E 1D 42 78 1E 1E 42 7A 1E 1F 42 7C 1E \r
+80 00 16 A3 10 01 1A 14 C9 0C 3D 40 0C 00 0D 59 \r
+6E 49 7E 80 0B 00 5C 43 7F 40 03 00 B0 13 74 CA \r
+CA 0C 0A 93 10 24 3C 40 03 00 0C 5A 3D 40 05 00 \r
+0D 59 2E 42 B0 13 A4 F2 FA D0 80 00 0E 00 CC 0A \r
+4D 43 B0 13 08 E8 19 16 10 01 4F 4C 48 18 0F 5F \r
+7C 90 40 00 1A 28 7C 90 4F 00 17 2C 92 B3 44 01 \r
+FD 23 32 C2 03 43 B2 40 00 A5 44 01 B2 40 02 A5 \r
+40 01 8F 43 00 00 B2 40 40 A5 40 01 B2 40 00 A5 \r
+40 01 B2 40 10 A5 44 01 32 D2 10 01 A2 D2 24 03 \r
+7F 40 80 00 3E 42 B2 C2 22 03 CD 0C 4D FF 4D 9F \r
+03 24 A2 C2 22 03 02 3C A2 D2 22 03 12 C3 4F 10 \r
+B0 13 1C F5 B2 D2 22 03 B0 13 1C F5 1E 83 EB 23 \r
+B2 C2 22 03 A2 D2 22 03 A2 C2 24 03 10 01 0A 14 \r
+1A 43 5A 52 31 1F D2 53 31 1F B0 13 0C CC 4C 4C \r
+0C 9A 11 34 1F 43 5F 52 32 1F 7F 90 0D 00 05 2C \r
+D2 53 32 1F D2 43 31 1F 06 3C D2 43 31 1F D2 43 \r
+32 1F 92 53 34 1F 92 D3 14 1D 0A 16 10 01 0A 14 \r
+0A 43 0F 93 05 34 3E E3 3F E3 1E 53 0F 63 1A D3 \r
+0D 93 05 34 3C E3 3D E3 1C 53 0D 63 3A E3 B0 13 \r
+42 D8 1A B3 04 24 3C E3 3D E3 1C 53 0D 63 2A B3 \r
+04 24 3E E3 3F E3 1E 53 0F 63 0A 16 10 01 0A 14 \r
+CA 0D CB 0E 4C 4C 3D 40 1C 00 B0 13 F2 F1 1F 42 \r
+64 FA 0F 5C 8F 93 18 00 0F 20 8F 4A 00 00 8F 4B \r
+02 00 0B 93 06 20 0A 93 04 20 1C 52 64 FA EC C2 \r
+1A 00 FF 40 7F 00 10 00 0A 16 10 01 0A 14 5A 42 \r
+B9 1E 3C 40 B0 1E B0 13 18 E5 4C 4C 0C EA 47 18 \r
+0C 5C 8C 10 4C 4C CA 0C C2 4A B9 1E 3A 90 21 00 \r
+05 20 D2 D3 36 1F B0 13 C8 F4 05 3C F2 F0 EF 00 \r
+36 1F B0 13 C0 D0 0A 16 10 01 4C 93 1C 20 4C 43 \r
+B0 13 E8 EC 0C 93 04 24 1C 83 09 24 1C 83 13 20 \r
+C2 43 3C 1F C2 43 3D 1F 82 43 3E 1F 10 01 1F 42 \r
+64 FA D2 4F 0E 00 3C 1F 1E 4F 06 00 92 4F 04 00 \r
+3E 1F C2 4E 3D 1F 10 01 1A 14 C2 93 2A 1E 16 24 \r
+3C 40 02 1E 29 42 3A 40 68 FA 3B 40 2C 1E 4E 43 \r
+4F 43 7D 4C 7D 9B 01 20 5E 53 7D 9A 01 20 5F 53 \r
+19 83 F7 23 6F 92 02 24 6E 92 02 20 4C 43 01 3C \r
+5C 43 19 16 10 01 D2 B3 36 1F 14 24 1D 42 B0 1E \r
+1E 42 B2 1E 3D F3 3E F0 FF 00 1F 42 A6 1E 1E 9F \r
+02 00 08 20 2D 9F 06 20 DF 92 B3 1E 13 00 04 24 \r
+D2 C3 36 1F 4C 43 10 01 EF C2 1A 00 B0 13 86 CB \r
+5C 43 10 01 5C 02 0D 6D 5C 02 0D 6D 5C 02 0D 6D \r
+5C 02 0D 6D 5C 02 0D 6D 5C 02 0D 6D 5C 02 0D 6D \r
+5C 02 0D 6D 5C 02 0D 6D 5C 02 0D 6D 5C 02 0D 6D \r
+5C 02 0D 6D 5C 02 0D 6D 5C 02 0D 6D 5C 02 0D 6D \r
+10 01 5D 03 5C 00 5D 03 5C 00 5D 03 5C 00 5D 03 \r
+5C 00 5D 03 5C 00 5D 03 5C 00 5D 03 5C 00 5D 03 \r
+5C 00 5D 03 5C 00 5D 03 5C 00 5D 03 5C 00 5D 03 \r
+5C 00 5D 03 5C 00 5D 03 5C 00 5D 03 5C 00 10 01 \r
+0A 14 3F 40 41 1E 2E 43 0C 43 2D 43 6D 9F 05 20 \r
+3F 50 0C 00 1C 53 1E 83 F8 23 6C 93 02 20 0C 43 \r
+0C 3C 4C 4C 3D 40 0C 00 B0 13 F2 F1 3A 40 41 1E \r
+0A 5C CC 0A B0 13 74 E4 CC 0A 0A 16 10 01 82 43 \r
+BA 1E 4C 43 B0 13 C2 F4 B0 13 40 F3 C2 43 C2 1E \r
+92 D3 14 1D 7C 40 13 00 6D 42 B0 13 08 F0 7C 40 \r
+17 00 6D 42 B0 13 08 F0 7C 40 18 00 6D 42 B0 13 \r
+08 F0 7C 40 19 00 6D 42 80 00 08 F0 92 C3 44 03 \r
+82 93 FC 1E 0E 24 B0 13 9A A0 92 93 FC 1E 03 24 \r
+B0 13 1C E6 02 3C B0 13 C0 D0 1C 42 F6 1E 80 00 \r
+EA EF F2 C2 36 1F B0 13 C0 D0 1C 42 F8 1E B0 13 \r
+EA EF 92 43 FC 1E 10 01 3A 14 C8 0D C7 0C 3A 40 \r
+41 1E 29 43 2F 43 6F 9A 0E 20 3D 40 03 00 0D 5A \r
+CC 07 2E 42 B0 13 54 ED 0C 93 05 20 58 9A 0A 00 \r
+02 20 CC 0A 05 3C 3A 50 0C 00 19 83 EB 23 0C 43 \r
+37 16 10 01 3A 14 C8 0D C7 0C 3A 40 41 1E 49 43 \r
+2F 43 6F 9A 0E 20 3C 40 03 00 0C 5A CD 07 2E 42 \r
+B0 13 54 ED 0C 93 05 20 CA 98 0A 00 02 20 CC 0A \r
+05 3C 3A 50 0C 00 59 53 EB 27 0C 43 37 16 10 01 \r
+D2 B3 8D 1C 0A 24 B0 13 E4 F3 4C 93 06 20 B0 13 \r
+EC B1 4C 93 02 20 B0 13 9E E2 F2 B0 06 00 8D 1C \r
+02 24 B0 13 88 D6 7C 40 15 00 7D 40 03 00 B0 13 \r
+08 F0 0C 43 4D 43 5E 43 80 00 6E B6 82 43 AE 1E \r
+B0 13 CE F4 F2 40 21 00 AA 1E F2 40 06 00 AC 1E \r
+C2 43 AB 1E D2 43 AD 1E 7C 43 5D 43 B0 13 2E D1 \r
+B0 13 50 D0 B0 13 9A D8 7C 40 0C 00 5D 42 94 1E \r
+80 00 04 E4 21 83 0F 42 32 C2 03 43 B2 B0 10 00 \r
+02 0F FC 27 4C 4C 47 18 0C 5C 3C D0 00 40 4D 4D \r
+0C 5D 82 4C 10 0F B2 B0 20 00 02 0F FC 27 5E 42 \r
+20 0F 81 4E 00 00 02 4F 21 53 10 01 5F 14 1A 42 \r
+38 0F 4A 4A B0 13 FC F3 4C 93 10 20 7A 90 14 00 \r
+04 24 4A 93 0D 20 03 43 0B 3C 1F 42 BA 1E 1F 93 \r
+02 24 2F 93 05 20 B0 13 92 F2 02 3C B0 13 00 D4 \r
+5A 16 00 13 21 83 CC 43 0A 00 EC 43 00 00 DC 42 \r
+40 1E 0B 00 D2 53 40 1E 02 3C D2 53 40 1E C2 93 \r
+40 1E FB 27 F2 93 40 1E F8 27 5C 42 40 1E CD 01 \r
+B0 13 1A EB 4C 93 F1 23 21 53 10 01 0A 14 CA 0C \r
+5D 42 4A 1F B0 13 78 E7 4C 93 0E 24 B0 13 C8 F2 \r
+CD 0C 1C 43 0C 5A 2E 42 B0 13 54 ED 0C 93 02 20 \r
+0C 43 05 3C 2C 43 03 3C B0 13 A8 F3 1C 43 0A 16 \r
+10 01 0E 4C 0D 4C 0D 93 16 24 03 34 3D E3 1D 53 \r
+0F 30 3B 40 8F 00 1B 83 5D 02 FD 2B 4C 4D 8C 10 \r
+8D 10 4D 4D 8B 10 0D DB 5E 02 5D 00 5C 00 10 01 \r
+3D 40 00 C7 0C 43 10 01 0A 14 3A 40 09 00 0F 43 \r
+6D 4C 3B 42 4E 4D 0E EF 3E 90 80 00 04 38 4F 5F \r
+7F E0 97 00 01 3C 4F 5F 4F 4F 4D 5D 1B 83 F2 23 \r
+1C 53 1A 83 ED 23 CC 0F 0A 16 10 01 1D 42 26 1E \r
+0F 42 32 C2 03 43 D2 43 24 1E 02 4F 0D 93 07 24 \r
+B0 13 CC EF C2 93 23 1E 02 20 1D 83 F9 23 0F 42 \r
+32 C2 03 43 C2 43 23 1E C2 43 24 1E 02 4F 10 01 \r
+B0 13 88 F4 1F 42 A6 1E FF 90 7F 00 10 00 0A 24 \r
+2C 93 05 34 3C 93 0D 34 DF 83 10 00 10 01 DF 53 \r
+10 00 10 01 CF 4C 10 00 1F 42 A6 1E FF 50 0C 00 \r
+10 00 10 01 7C 90 2F 00 06 28 7C 90 3E 00 03 24 \r
+32 C2 03 43 FF 3F 0F 42 32 C2 03 43 B2 B0 10 00 \r
+02 0F FC 27 C2 4C 11 0F B2 B0 20 00 02 0F FC 27 \r
+C2 4D 10 0F 02 4F 10 01 4D 93 03 20 32 C2 03 43 \r
+FF 3F 0F 42 32 C2 03 43 B2 B0 10 00 02 0F FC 27 \r
+F2 40 7F 00 11 0F 4D 4D B2 B0 20 00 02 0F FC 27 \r
+F2 4C 10 0F 1D 83 F8 23 02 4F 10 01 B2 F0 FE FD \r
+36 0F B2 F0 FE FD 32 0F 7C 40 36 00 B0 13 38 C8 \r
+7C 40 3A 00 B0 13 38 C8 7C 40 36 00 B0 13 38 C8 \r
+7C 40 32 00 B0 13 38 C8 82 43 1E 1F 10 01 B0 13 \r
+16 C0 B0 13 92 D7 B0 13 D8 F3 82 93 D8 1E 03 20 \r
+82 93 86 1E 02 24 B0 13 58 B5 82 93 88 1E 02 24 \r
+B0 13 9C EC 82 93 14 1D EE 27 B0 13 D2 AC EB 3F \r
+21 83 7C 40 30 00 B0 13 38 C8 81 43 00 00 02 3C \r
+91 53 00 00 B1 90 64 00 00 00 FA 2B 7C 40 36 00 \r
+B0 13 38 C8 7C B0 70 00 F9 23 82 43 06 0F 21 53 \r
+10 01 0C 93 02 20 0D 93 14 24 3B 40 9F 00 1B 83 \r
+5C 02 0D 6D FC 2B 12 C3 5D 00 5C 00 3E 40 06 00 \r
+5D 01 5C 00 1E 83 FC 37 8B 10 0D DB 12 C3 5D 00 \r
+5C 00 10 01 D2 B3 8D 1C 06 24 B0 13 E4 F3 4C 93 \r
+02 24 B0 13 9E E2 0C 43 4D 43 6E 43 B0 13 6E B6 \r
+F2 B0 06 00 8D 1C 02 24 B0 13 C6 EA 7C 40 15 00 \r
+6D 42 80 00 08 F0 B2 B0 20 00 86 1E 14 20 B0 13 \r
+FC F3 4C 93 10 20 A2 B2 D8 1E 0D 24 1F 42 BA 1E \r
+0F 93 05 20 B0 13 EC B1 4C 93 03 24 10 01 2F 93 \r
+02 20 80 00 9E E2 10 01 4D 93 03 20 32 C2 03 43 \r
+FF 3F 0F 42 32 C2 03 43 4D 4D B2 B0 10 00 02 0F \r
+FC 27 F2 40 BF 00 13 0F 1C 53 DC 42 22 0F FF FF \r
+1D 83 F3 23 02 4F 10 01 CF 0C FF B0 80 FF 0C 00 \r
+02 20 6C 43 10 01 CF 9D 0D 00 0C 20 B0 13 C8 F2 \r
+CD 0C 1C 43 0C 5F 2E 42 B0 13 54 ED 0C 93 02 20 \r
+4C 43 10 01 5C 43 10 01 82 93 D0 1E 09 20 82 93 \r
+CE 1E 06 20 B2 40 04 03 CE 1E B2 40 02 01 D0 1E \r
+B0 13 84 F1 C2 4C D7 1E 4C 93 FA 27 3C 40 D4 1E \r
+0D 43 1E 43 80 00 B6 F2 31 80 06 00 81 43 02 00 \r
+D1 4C 05 00 04 00 CF 0C 3F 50 06 00 81 4F 00 00 \r
+1D 4C 02 00 2E 42 0E 5C 2F 4C CC 01 2C 53 B0 13 \r
+04 C7 31 50 06 00 10 01 0A 14 CA 0C 3F 40 CF 00 \r
+5F FA 0C 00 5F D2 C8 1E CA 4F 0C 00 2C 43 0C 5A \r
+B0 13 50 BF 4C 93 02 20 0C 43 02 3C 3C 40 09 00 \r
+CA 43 00 00 0A 16 10 01 7C 40 40 00 B0 13 AA DF \r
+5C 53 7C 90 4F 00 FA 2B C2 43 8C 1C F2 40 06 00 \r
+8D 1C F2 40 05 00 8E 1C C2 43 8F 1C B2 40 00 80 \r
+90 1C C2 43 92 1C 10 01 7C 90 80 00 09 28 4C 4C \r
+3C 80 00 01 2D 43 B0 13 74 E9 3C 80 4A 00 04 3C \r
+4C 4C 5C 03 3C 80 4A 00 3C 90 80 FF 02 34 3C 40 \r
+80 FF 8C 11 10 01 92 C3 22 03 F2 F0 DF 00 03 02 \r
+F2 F0 1F 00 02 02 A2 C3 22 03 F2 D0 20 00 05 02 \r
+F2 D0 E0 00 04 02 A2 D3 24 03 92 D3 24 03 D2 43 \r
+F5 1E 10 01 B2 F0 FF FD 36 0F 7C 40 36 00 B0 13 \r
+6C CF 7C 40 3D 00 B0 13 6C CF 7C B0 F0 FF F9 23 \r
+7C 40 3A 00 B0 13 6C CF B2 F0 FF FD 32 0F 10 01 \r
+C2 93 59 1E 0E 20 B0 13 7E A8 B0 13 92 CC 0C 93 \r
+0C 20 B0 13 06 EE B0 13 C8 F2 B0 13 0C ED B0 13 \r
+90 EF D2 43 59 1E 80 00 76 B7 10 01 4D 93 13 24 \r
+4D 4D 0E 43 5F 42 92 1C 7F 90 80 00 09 2C CB 0F \r
+5B 53 C2 4B 92 1C CB 0E 0B 5C 4F 4F EF 4B 93 1C \r
+1E 53 1D 83 EF 23 10 01 5C 93 13 20 0C 42 32 C2 \r
+03 43 2E 43 3F 40 00 1C CF 93 00 00 05 24 5D 9F \r
+01 00 02 2C DF 83 01 00 3F 50 23 00 1E 83 F4 23 \r
+02 4C 10 01 0B 43 0D 93 03 34 3D E3 1D 53 1B D3 \r
+0C 93 03 34 3C E3 1C 53 3B E3 B0 13 DC F1 1B B3 \r
+02 24 3C E3 1C 53 2B B3 02 24 3E E3 1E 53 10 01 \r
+4C 4C 3D 40 1C 00 B0 13 F2 F1 CF 0C 1F 52 64 FA \r
+EF B2 1A 00 03 24 0F 43 0D 43 05 3C 1C 52 64 FA \r
+2F 4C 1D 4C 02 00 CC 0F 10 01 C2 93 AC 1E 09 24 \r
+1F 42 A6 1E DF 83 13 00 1F 42 A6 1E CF 93 13 00 \r
+02 24 5C 43 10 01 8F 43 18 00 5D 43 B0 13 2A E1 \r
+4C 43 10 01 82 4C 1A 1F 82 93 50 03 02 20 0F 43 \r
+05 3C 1F 42 50 03 1F 92 50 03 FB 23 0F 5C 82 4F \r
+58 03 92 C3 48 03 B2 D0 10 00 48 03 10 01 31 40 \r
+FC 2B 00 18 F2 40 20 F5 06 1F 00 18 F2 40 20 F5 \r
+0A 1F B0 13 FC F4 0C 93 02 24 B0 13 C8 DD 0C 43 \r
+B0 13 4E E6 B0 13 00 F5 5D 93 12 20 C2 93 EB 1E \r
+0A 24 E2 93 EB 1E 0C 2C 7C 40 5A 00 3D 40 DC F8 \r
+5E 43 80 00 E0 BC 7C 40 5A 00 3D 40 E2 F8 F8 3F \r
+10 01 92 B3 44 01 FD 23 32 C2 03 43 B2 40 00 A5 \r
+44 01 B2 40 40 A5 40 01 8C 4D 00 00 B2 40 00 A5 \r
+40 01 B2 40 10 A5 44 01 32 D2 10 01 B2 D0 06 00 \r
+06 0A B2 40 1D 7B 00 0A B2 40 ED 00 04 0A F2 D0 \r
+E0 00 4A 02 F2 D0 E0 00 44 02 B2 43 0A 0A B2 40 \r
+FF 00 0C 0A 10 01 C2 93 FE 1D 11 24 C2 93 76 1E \r
+0E 24 B0 13 A0 F4 4C 93 0A 20 B0 13 60 F4 C2 43 \r
+76 1E F2 F0 BF 00 1B 02 F2 F0 BF 00 1D 02 10 01 \r
+F2 C2 03 02 F2 C2 05 02 D2 B3 8C 1C 0B 20 E2 B3 \r
+8C 1C 02 20 80 00 90 E3 92 D3 8A 1E B2 D0 00 01 \r
+8A 1E 10 01 80 00 E4 E6 10 01 3F 40 41 1E 0E 43 \r
+2B 43 6B 9F 07 20 CF 9C 0B 00 04 20 CD 4E 00 00 \r
+5C 43 10 01 3F 50 0C 00 1E 53 2E 93 F1 3B 4C 43 \r
+10 01 21 83 CD 01 B0 13 1A EB 4C 93 0B 24 6C 41 \r
+3D 40 0C 00 B0 13 F2 F1 EC 93 41 1E 03 20 3C 50 \r
+41 1E 01 3C 0C 43 21 53 10 01 82 93 EE 1E 09 20 \r
+82 93 EC 1E 06 20 B2 40 08 07 EC 1E B2 40 06 05 \r
+EE 1E 00 18 C2 43 F0 1E B0 13 84 F1 C2 4C F4 1E \r
+10 01 3C 40 03 00 5C F2 20 01 7C 90 03 00 03 2C \r
+5C 53 B0 13 82 DD 6C 92 03 28 5C 83 B0 13 B8 EB \r
+7C 90 03 00 EE 23 10 01 F2 40 A5 00 21 01 4E 4C \r
+4F 4E 8F 10 0E 5F 3E 50 00 44 82 4E 26 01 92 B3 \r
+2C 01 FD 27 C2 4C 20 01 C2 43 21 01 10 01 3F 40 \r
+13 00 6F 9C 09 24 5F 4C 0C 00 1F 83 07 24 1F 83 \r
+07 20 B0 13 00 D2 04 3C DC 43 0C 00 B0 13 70 AF \r
+0C 43 10 01 F2 F0 E0 00 05 02 F2 F0 E0 00 03 02 \r
+F2 D0 1F 00 07 02 F2 F0 E0 00 19 02 F2 F0 E0 00 \r
+1D 02 F2 D0 1F 00 1B 02 10 01 1A 14 39 40 11 00 \r
+3F 40 BA 1D 3A 40 20 FA 3C 4A B0 13 C0 ED 2F 52 \r
+8F 4C FC FF 8F 4D FE FF 19 83 F6 23 19 16 10 01 \r
+4D 93 03 24 5F 4C 0A 00 02 3C 5F 4C 09 00 4F 93 \r
+06 24 CC 93 00 00 03 24 7F 90 20 00 02 2C 2C 43 \r
+10 01 0C 43 10 01 3C 40 E2 1E 0D 43 2E 42 B0 13 \r
+B6 F2 C2 93 EA 1E 09 20 3C 40 E6 1E 3D 40 5A FA \r
+2E 42 B0 13 A4 F2 D2 43 EA 1E 10 01 A2 B3 88 1E \r
+03 24 5C 43 B0 13 B8 C5 B2 B2 88 1E 02 24 B0 13 \r
+5E B9 92 B3 88 1E 02 24 B0 13 98 D1 82 43 88 1E \r
+10 01 B2 B0 20 00 86 1E 0E 20 B0 13 E4 F3 4C 93 \r
+0A 20 F2 C2 03 02 F2 C2 05 02 F2 C2 1B 02 B0 13 \r
+FE CA F2 D2 1B 02 10 01 4C 4C 3D 40 1C 00 B0 13 \r
+F2 F1 CF 0C 1F 52 64 FA EF B2 1A 00 02 24 2C 43 \r
+10 01 1C 52 64 FA 1C 4C 18 00 10 01 CE 0C 6D 4E \r
+5D 92 68 FA 0C 24 7C 40 09 00 B0 13 B4 E5 2D 42 \r
+3F 40 2C 1E 1F 53 FF 4E FF FF 1D 83 FB 23 10 01 \r
+0A 14 0A 42 32 C2 03 43 D2 93 00 1E 08 24 B0 13 \r
+D0 EE 7C 40 32 00 B0 13 6C CF D2 43 00 1E 02 4A \r
+0A 16 10 01 0E 93 02 20 0C 43 10 01 1D 83 1C 83 \r
+1D 53 6B 4D 1C 53 6F 4C 4F 9B 02 20 1E 83 F8 23 \r
+4B 4B 4C 4F 0C 8B 10 01 0A 14 CA 0C 5D 42 95 1E \r
+B0 13 78 E7 4C 93 04 20 B0 13 A8 F3 1C 43 04 3C \r
+CC 0A B0 13 CC F3 0C 43 0A 16 10 01 82 43 96 1E \r
+82 43 98 1E E2 42 A0 1E F2 40 1E 00 A1 1E C2 43 \r
+A2 1E C2 43 9F 1E 82 43 9A 1E 82 43 9C 1E 10 01 \r
+0D 4C 0D 93 0E 24 3B 40 8F 00 1B 83 5D 02 FD 2B \r
+4C 4D 8C 10 8D 10 4D 4D 8B 10 0D DB 12 C3 5D 00 \r
+5C 00 10 01 82 43 90 03 B2 40 C0 00 92 03 B2 D0 \r
+10 00 80 03 92 B3 82 03 FD 27 B2 F0 EF FF 80 03 \r
+92 C3 82 03 10 01 D2 93 00 1E 0D 20 7C 40 36 00 \r
+B0 13 6C CF 7C 40 3D 00 B0 13 6C CF 7C B0 F0 FF \r
+F9 23 E2 43 00 1E 10 01 5F 42 A0 1E 4F 93 09 24 \r
+7F 90 0D 00 02 2C CC 0F 10 01 CC 0F 7C 80 0C 00 \r
+10 01 3C 40 0C 00 4C 5F 10 01 4C 43 B0 13 E8 EC \r
+0C 93 09 24 1C 83 09 20 B0 13 B0 F4 C2 4C C2 1E \r
+92 43 BC 1E 10 01 80 00 9E E2 10 01 0A 14 CA 0C \r
+5D 42 D7 1E B0 13 78 E7 4C 93 04 20 B0 13 A8 F3 \r
+1C 43 03 3C CC 0A B0 13 DE EB 0A 16 10 01 02 12 \r
+32 C2 03 43 82 4C D0 04 82 4D D2 04 82 4E E0 04 \r
+82 4F E2 04 1C 42 E4 04 1D 42 E6 04 32 41 10 01 \r
+0A 14 5C 43 B0 13 84 CE CA 0C 0A 93 07 24 2C 43 \r
+0C 5A B0 13 B4 F3 CC 0A B0 13 5C C9 0A 16 10 01 \r
+D2 93 00 1E 09 24 F2 90 03 00 00 1E 08 20 B0 13 \r
+C4 E8 E2 43 00 1E 10 01 32 C2 03 43 FF 3F 10 01 \r
+D2 93 00 1E 09 24 F2 90 03 00 00 1E 08 24 F2 40 \r
+03 00 00 1E 80 00 9A F1 32 C2 03 43 FF 3F 10 01 \r
+1C 42 82 1E 3C B0 00 80 0D 7D 3D E3 3E 40 52 00 \r
+0F 43 B0 13 8E EE 3E 40 19 00 0F 43 80 00 6E E0 \r
+B0 13 E4 F3 4C 93 0A 24 4C 43 1F 42 54 03 1F 82 \r
+50 03 3F 90 F5 01 03 28 5C 43 10 01 5C 43 10 01 \r
+C2 43 C8 1E 00 18 C2 43 CA 1E B0 13 C8 F2 82 4C \r
+C6 1E B0 13 84 F1 C2 4C C4 1E 4C 93 FA 27 10 01 \r
+B2 F0 CF FF 80 03 F2 F0 7F 00 03 02 F2 F0 7F 00 \r
+0B 02 B2 F0 EF FF 82 03 B0 13 98 F4 80 00 6A F4 \r
+D2 92 68 FA 2C 1E 08 24 D2 43 2A 1E 7C 40 07 00 \r
+7D 40 07 00 80 00 B4 E5 32 C2 03 43 FF 3F B0 13 \r
+C4 E8 7C 40 0A 00 5D 42 6C FA B0 13 B4 E5 F2 90 \r
+03 00 00 1E 02 20 80 00 9A F1 10 01 3F 40 3E 00 \r
+0E 42 32 C2 03 43 B0 13 E4 ED 02 4E C2 93 23 1E \r
+03 20 1F 83 3F 93 F4 23 10 01 CF 0C 82 4F 54 03 \r
+92 C3 44 03 B0 13 9C F3 2F 83 0F 8C 3F 90 00 80 \r
+02 28 92 D3 44 03 10 01 CF 0D 7C 90 2A 00 0A 2C \r
+4E 4C 5D 4E AC F9 4C 4C 5C 02 1C 4C 16 1D CE 0D \r
+80 00 C0 D4 10 01 0C 9D 02 2C 80 00 A4 F2 0C 5E \r
+0D 5E 0E 93 06 24 1D 83 1C 83 EC 4D 00 00 1E 83 \r
+FA 23 10 01 CD 0C C2 93 EA 1E 02 24 4C 43 10 01 \r
+3C 40 E6 1E 2E 42 B0 13 A4 F2 D2 43 EA 1E 5C 43 \r
+10 01 B0 13 80 F3 4C 93 08 20 4C 43 4D 43 B0 13 \r
+08 F0 5C 43 5D 43 80 00 08 F0 4C 43 FB 3F 3C 40 \r
+00 1C 0D 43 3E 40 46 00 B0 13 B6 F2 3C 40 46 1C \r
+0D 43 3E 40 46 00 80 00 B6 F2 0A 14 CF 0C CC 0D \r
+2A 43 0F 93 05 20 B0 13 44 F0 4C 93 01 24 0A 43 \r
+CC 0A 0A 16 10 01 21 82 CF 0C CC 0D A1 4F 00 00 \r
+91 4F 02 00 02 00 CD 01 2E 42 B0 13 26 F0 21 52 \r
+10 01 1F 42 A6 1E 5C 4F 11 00 6C 93 02 2C 3C 42 \r
+10 01 5C 53 4C 5C 4C 5C 4C 4C 10 01 7C 90 03 00 \r
+07 2C 4C 4C 5D 4C 70 FA 7C 40 3E 00 80 00 B4 E5 \r
+32 C2 03 43 FF 3F 0C 93 0A 24 5C 0F 1C 53 0F 42 \r
+32 C2 03 43 B0 13 E4 ED 02 4F 1C 83 F8 23 10 01 \r
+B0 13 84 F1 7C F0 0F 00 5C 53 4E 4C 1C 42 28 1E \r
+B0 13 06 F1 1E 83 FA 23 10 01 B2 90 06 00 0E 07 \r
+08 20 92 42 20 07 44 1F D2 43 46 1F B1 C0 D0 00 \r
+00 00 00 13 1C 42 7E 1E CF 0C 5F 0A 0C 5F 3D 40 \r
+05 00 B0 13 74 E9 3C 50 40 01 10 01 5D 42 F4 1E \r
+B0 13 78 E7 4C 93 02 24 0C 43 10 01 B0 13 A8 F3 \r
+1C 43 10 01 5C 42 22 1E 3D 40 6D 00 B0 13 F2 F1 \r
+7C 50 43 00 C2 4C 22 1E 10 01 B2 F0 FF FD 32 0F \r
+7C 40 34 00 B0 13 6C CF B2 D0 00 02 36 0F 10 01 \r
+0F 42 32 C2 03 43 7C D0 C0 00 C2 4C 13 0F 5C 42 \r
+22 0F 02 4F 10 01 82 43 BA 1E 82 43 BE 1E 82 43 \r
+C0 1E 82 43 BC 1E C2 43 C2 1E 10 01 0E 43 0F 4C \r
+1C 43 5F 02 0E 6E 0E 9D 01 28 0E 8D 0C 6C F9 2B \r
+10 01 02 12 32 C2 03 43 82 4C C0 04 82 4D C8 04 \r
+1C 42 CA 04 32 41 10 01 B2 40 FF 7F 52 03 B2 D0 \r
+10 00 42 03 B2 D0 24 01 40 03 10 01 5F 42 FE 1E \r
+5F 83 D2 83 FE 1E 0F 93 02 20 80 00 70 EF 10 01 \r
+5D 93 07 20 7C 40 5B 00 3D 40 F2 F8 5E 43 80 00 \r
+E0 BC 10 01 5D 93 07 20 7C 40 5A 00 3D 40 EA F8 \r
+5E 43 80 00 E0 BC 10 01 3C 80 05 00 05 24 3C 80 \r
+05 00 02 24 4C 43 10 01 5C 43 10 01 B2 40 D9 07 \r
+34 1F F2 42 32 1F D2 43 31 1F C2 43 30 1F 10 01 \r
+4C ED 4F 4C CC 0D 8C 10 5C EF 44 F7 7C F0 1F 00 \r
+10 01 1F 42 50 03 82 4F 22 1F 1F 92 50 03 F9 23 \r
+80 00 62 D4 CF 0C 0E 93 05 24 1F 53 FF 4D FF FF \r
+1E 83 FB 23 10 01 0E 93 06 24 4D 4D 1C 53 CC 4D \r
+FF FF 1E 83 FB 23 10 01 C2 93 EA 1E 03 24 3C 40 \r
+E6 1E 10 01 3C 40 5A FA 10 01 0D 93 02 20 0C 93 \r
+04 24 82 4C EC 1E 82 4D EE 1E 10 01 0D 93 02 20 \r
+0C 93 04 24 82 4C CE 1E 82 4D D0 1E 10 01 B0 13 \r
+80 E6 B2 F0 EF FF 32 0F B2 D0 10 00 36 0F 10 01 \r
+A2 43 FC 1E 92 C3 44 03 B2 D0 10 00 44 03 10 01 \r
+A2 D2 80 03 82 43 80 03 B2 D0 00 02 80 03 10 01 \r
+CE 0C 3C 40 E8 03 B0 13 06 F1 1E 83 FA 23 10 01 \r
+82 43 32 0F 82 43 36 0F B0 13 80 E6 80 00 50 F3 \r
+7C 40 36 00 B0 13 38 C8 7C 40 39 00 80 00 38 C8 \r
+4F 43 C2 93 30 1F 01 20 5F 43 C2 4F 30 1F 10 01 \r
+4F 43 C2 93 9F 1E 01 20 5F 43 C2 4F 9F 1E 10 01 \r
+4C 43 F2 90 0C 00 A0 1E 01 2C 5C 43 10 01 F2 40 \r
+0F 00 2A 1F B2 40 2C 01 2C 1F 10 01 1C 42 50 03 \r
+1C 92 50 03 FB 23 10 01 C2 93 24 1E 02 24 D2 43 \r
+23 1E 10 01 3D 40 01 1E 3E 40 21 00 80 00 A4 F2 \r
+5C 43 B0 13 D4 D5 6C 43 80 00 D4 D5 DC 93 0C 00 \r
+02 20 80 00 66 DF 10 01 B0 13 A8 F4 B2 40 2B 5A \r
+5C 01 10 01 4C 43 A2 93 BA 1E 01 20 5C 43 10 01 \r
+4C 43 92 93 BA 1E 01 20 5C 43 10 01 4C 43 82 93 \r
+72 1D 01 24 5C 43 10 01 CF 0C CC 0D CD 0F 2E 42 \r
+80 00 26 F0 CD 0C 3C 40 E2 1E 2E 42 80 00 A4 F2 \r
+7C 40 03 00 7D 40 0B 00 80 00 EA D7 5C 93 02 20 \r
+CC 0D 10 01 CC 0E 10 01 1C 42 44 03 7C F0 10 00 \r
+10 01 B2 F0 EF FF 44 03 80 00 1C E6 B0 13 84 F1 \r
+C2 4C 4A 1F 10 01 B0 13 84 F1 C2 4C 95 1E 10 01 \r
+7C 40 03 00 4D 43 80 00 EA D7 C2 43 FE 1E C2 43 \r
+04 1F 10 01 1C 42 14 1D 8C 10 5C F3 10 01 1C 42 \r
+14 1D 5C 0F 5C F3 10 01 5C 42 20 1F 8C 11 10 01 \r
+4C 5C C2 4C AB 1E 10 01 B2 F0 EF FF 48 03 10 01 \r
+1C 43 5C F2 8C 1C 10 01 32 D0 D8 00 03 43 10 01 \r
+5C 42 3C 1F 10 01 C2 4C AA 1E 10 01 C2 4C AC 1E \r
+10 01 4D 43 80 00 2E D1 92 D3 44 03 10 01 92 C3 \r
+44 03 10 01 5C 42 00 1E 10 01 5C 42 76 1E 10 01 \r
+82 43 D8 1E 10 01 CC 43 00 00 10 01 3C 40 68 FA \r
+10 01 82 43 72 1D 10 01 80 00 24 AE 1C 43 10 01 \r
+03 43 FF 3F 2C 43 10 01 2C 43 10 01 4C 43 10 01 \r
+6C 43 10 01 0C 43 10 01 0C 43 10 01 03 43 10 01 \r
+10 01 10 01 30 30 30 30 30 31 30 30 32 30 30 33 \r
+30 30 34 30 30 35 30 30 36 30 30 37 30 30 38 30 \r
+30 39 30 31 30 30 31 31 30 31 32 30 31 33 30 31 \r
+34 30 31 35 30 31 36 30 31 37 30 31 38 30 31 39 \r
+30 32 30 30 32 31 30 32 32 30 32 33 30 32 34 30 \r
+32 35 30 32 36 30 32 37 30 32 38 30 32 39 30 33 \r
+30 30 33 31 30 33 32 30 33 33 30 33 34 30 33 35 \r
+30 33 36 30 33 37 30 33 38 30 33 39 30 34 30 30 \r
+34 31 30 34 32 30 34 33 30 34 34 30 34 35 30 34 \r
+36 30 34 37 30 34 38 30 34 39 30 35 30 30 35 31 \r
+30 35 32 30 35 33 30 35 34 30 35 35 30 35 36 30 \r
+35 37 30 35 38 30 35 39 30 36 30 30 36 31 30 36 \r
+32 30 36 33 30 36 34 30 36 35 30 36 36 30 36 37 \r
+30 36 38 30 36 39 30 37 30 30 37 31 30 37 32 30 \r
+37 33 30 37 34 30 37 35 30 37 36 30 37 37 30 37 \r
+38 30 37 39 30 38 30 30 38 31 30 38 32 30 38 33 \r
+30 38 34 30 38 35 30 38 36 30 38 37 30 38 38 30 \r
+38 39 30 39 30 30 39 31 30 39 32 30 39 33 30 39 \r
+34 30 39 35 30 39 36 30 39 37 30 39 38 30 39 39 \r
+31 30 30 31 30 31 31 30 32 31 30 33 31 30 34 31 \r
+30 35 31 30 36 31 30 37 31 30 38 31 30 39 31 31 \r
+30 31 31 31 31 31 32 31 31 33 31 31 34 31 31 35 \r
+31 31 36 31 31 37 31 31 38 31 31 39 31 32 30 31 \r
+32 31 31 32 32 31 32 33 31 32 34 31 32 35 31 32 \r
+36 31 32 37 31 32 38 31 32 39 31 33 30 31 33 31 \r
+31 33 32 31 33 33 31 33 34 31 33 35 31 33 36 31 \r
+33 37 31 33 38 31 33 39 31 34 30 31 34 31 31 34 \r
+32 31 34 33 31 34 34 31 34 35 31 34 36 31 34 37 \r
+31 34 38 31 34 39 31 35 30 31 35 31 31 35 32 31 \r
+35 33 31 35 34 31 35 35 31 35 36 31 35 37 31 35 \r
+38 31 35 39 31 36 30 31 36 31 31 36 32 31 36 33 \r
+31 36 34 31 36 35 31 36 36 31 36 37 31 36 38 31 \r
+36 39 31 37 30 31 37 31 31 37 32 31 37 33 31 37 \r
+34 31 37 35 31 37 36 31 37 37 31 37 38 31 37 39 \r
+31 38 30 00 01 80 40 20 10 08 84 42 21 90 48 A4 \r
+52 29 14 0A 85 C2 61 B0 58 AC D6 6B 35 9A CD 66 \r
+33 99 4C A6 53 A9 54 2A 95 CA E5 F2 79 3C 9E CF \r
+67 B3 D9 6C B6 5B 2D 16 0B 05 82 41 A0 50 28 94 \r
+4A A5 D2 69 34 1A 8D 46 23 91 C8 E4 72 39 1C 8E \r
+C7 E3 F1 F8 FC FE FF 7F 3F 1F 0F 07 83 C1 E0 70 \r
+38 9C CE E7 F3 F9 7C BE DF 6F 37 9B 4D 26 13 89 \r
+44 22 11 88 C4 62 31 98 CC E6 73 B9 5C AE D7 EB \r
+75 BA DD 6E B7 DB 6D 36 1B 0D 06 03 81 C0 60 30 \r
+18 8C C6 63 B1 D8 EC F6 7B 3D 1E 8F 47 A3 D1 E8 \r
+F4 7A BD 5E AF 57 AB 55 AA D5 EA F5 FA FD 7E BF \r
+5F 2F 17 8B 45 A2 51 A8 D4 6A B5 DA ED 76 3B 1D \r
+0E 87 C3 E1 F0 78 BC DE EF 77 BB 5D 2E 97 CB 65 \r
+B2 59 2C 96 4B 25 92 49 24 12 09 04 02 01 80 40 \r
+20 10 08 84 42 21 90 48 A4 52 29 14 0A 85 C2 61 \r
+B0 58 AC D6 6B 35 9A CD 66 33 99 4C A6 53 A9 54 \r
+2A 95 CA E5 70 F3 00 00 22 F5 00 00 7E AB 00 00 \r
+7E F4 00 00 56 F8 22 F5 00 00 22 F5 00 00 0A BC \r
+00 00 7E F4 00 00 68 F8 22 F5 00 00 22 F5 00 00 \r
+4C BA 00 00 7E F4 00 00 7A F8 16 E7 00 00 E0 F4 \r
+00 00 34 D3 00 00 7E F4 00 00 44 F8 60 F3 00 00 \r
+22 F5 00 00 86 BE 00 00 74 F4 00 00 9E F8 F0 EA \r
+00 00 22 F5 00 00 30 F2 00 00 7E F4 00 00 B0 F8 \r
+C2 EC 00 00 22 F5 00 00 44 F2 00 00 7E F4 00 00 \r
+C2 F8 44 D9 00 00 22 F5 00 00 48 EA 00 00 7E F4 \r
+00 00 8C F8 20 20 44 4F 4E 45 00 00 20 43 4F 4E \r
+46 00 20 52 46 42 53 4C 00 00 20 20 53 59 4E 43 \r
+00 00 20 44 4C 4F 47 00 46 41 49 4C 00 00 45 52 \r
+52 00 30 30 30 30 30 30 30 00 2D 2D 2D 00 20 52 \r
+41 4D 00 00 20 4F 46 46 00 00 20 20 4F 4E 00 00 \r
+20 4E 4F 4D 45 4D 00 00 4C 4F 42 41 54 54 00 00 \r
+20 20 4F 50 45 4E 00 00 20 20 4C 4F 3F 54 00 00 \r
+02 1B 01 1E 17 3C 18 10 06 1E 08 05 03 47 0B 08 \r
+0C 00 0D 22 0E B1 0F 3B 10 7B 11 83 12 13 13 22 \r
+14 F8 15 42 19 1D 1A 1C 1B C7 1C 00 1D B2 21 B6 \r
+22 10 23 EA 24 2A 25 00 26 1F 2C 81 2D 35 2E 09 \r
+F5 60 B6 F2 63 D3 D7 70 F7 F3 00 00 00 00 00 86 \r
+00 77 C7 95 E6 97 17 F3 67 05 F0 87 85 75 46 C6 \r
+37 F5 06 D3 87 C4 C4 02 67 E3 B6 00 03 01 04 08 \r
+10 80 80 80 80 20 40 02 01 80 04 02 10 20 40 08 \r
+08 80 08 08 08 08 F7 F7 F7 F7 20 40 04 80 7F 7F \r
+7F 7F 7F 10 01 80 2F 1E 1B 07 37 B2 0A 04 00 00 \r
+00 0C 00 23 2A D4 4D 3B 15 11 F8 57 07 0C 10 1D \r
+1C C7 10 B0 FF FF F9 B6 10 EA 2A 00 1F 00 67 FF \r
+00 00 6F 00 1C 02 DD 03 B1 05 9D 07 A2 09 C4 0B \r
+07 0E 6E 10 01 13 C6 15 C8 18 11 1C B5 1F CC 23 \r
+07 04 F5 03 E8 03 B6 03 84 03 52 03 20 03 EE 02 \r
+BC 02 8A 02 58 02 26 02 F4 01 C2 01 90 01 5E 01 \r
+2C 01 78 ED 00 00 6C EE 00 00 6C F1 00 00 18 F5 \r
+00 00 14 F5 00 00 AC E4 00 00 79 56 34 12 02 01 \r
+01 01 00 00 5A 1E 5A 1E FF FF FF FF 14 32 50 6E \r
+0F 27 8B 00 02 00 00 \r
+@fa78\r
+01 00 1C 1F 00 00 01 00 E0 1E 00 00 01 00 E1 1E \r
+0A 00 54 00 16 1D 20 0A 20 0A 20 0A 20 0A 24 0A \r
+2A 0A 29 0A 27 0A 26 0A 24 0A 24 0A 26 0A 26 0A \r
+24 0A 26 0A 24 0A 26 0A 26 0A 26 0A 21 0A 22 0A \r
+20 0A 23 0A 24 0A 25 0A 26 0A 21 0A 22 0A 23 0A \r
+25 0A 20 0A 20 0A 24 0A 2B 0A 2B 0A 2A 0A 29 0A \r
+28 0A 27 0A 20 0A 24 0A 28 0A 02 00 40 1F 00 00 \r
+02 00 42 1F 00 00 01 00 59 1E 00 00 01 00 00 1E \r
+00 00 01 00 22 1E 00 00 01 00 23 1E 00 00 01 00 \r
+24 1E 00 00 02 00 26 1E 00 00 02 00 28 1E 00 00 \r
+01 00 2A 1E 00 00 01 00 2C 1E FF 00 04 00 30 1E \r
+00 00 00 00 04 00 34 1E 00 00 00 00 04 00 38 1E \r
+00 00 00 00 01 00 EA 1E 00 00 01 00 C4 1E 00 00 \r
+02 00 C6 1E 00 00 01 00 C8 1E 00 00 04 00 CA 1E \r
+00 00 00 00 01 00 3C 1E 01 00 01 00 95 1E 00 00 \r
+02 00 48 1F 00 00 01 00 4A 1F 00 00 04 00 CE 1E \r
+00 00 00 00 01 00 D2 1E 00 00 01 00 D6 1E 00 00 \r
+01 00 D7 1E 00 00 04 00 EC 1E 00 00 00 00 04 00 \r
+F0 1E 00 00 00 00 01 00 F4 1E 00 00 01 00 AA 1E \r
+00 00 01 00 AB 1E 00 00 01 00 AC 1E 00 00 01 00 \r
+AD 1E 00 00 02 00 F6 1E 00 00 02 00 F8 1E 00 00 \r
+01 00 FA 1E 00 00 01 00 FB 1E 00 00 01 00 20 1F \r
+00 00 02 00 22 1F 00 00 02 00 38 1F 00 00 01 00 \r
+3A 1F 00 00 00 00 \r
+@ffe0\r
+EE A4 \r
+@ffea\r
+3C E4 F0 D8 BC A6 3A F1 \r
+@fffe\r
+1E EA \r
+q\r
diff --git a/chronos-ti/Recovery/Chronos Watch/Wireless Updater/Recovery_eZ430_Chronos_rfbsl_433MHz_1_0.txt b/chronos-ti/Recovery/Chronos Watch/Wireless Updater/Recovery_eZ430_Chronos_rfbsl_433MHz_1_0.txt
new file mode 100755 (executable)
index 0000000..15a747e
--- /dev/null
@@ -0,0 +1,133 @@
+@1000\r
+14 3C 01 3C FF 3F D0 B3 15 F2 03 28 B1 C0 F0 00\r
+00 00 C0 43 09 F2 00 13 0C 43 B2 D0 03 80 82 01\r
+B2 93 FE FF 01 20 2C D3 10 01 31 40 7A 2B 3C 40\r
+0E 1C 3D 40 1A 01 B0 13 3A 17 3C 40 00 1C 3D 40\r
+AC 10 3E 40 0E 00 B0 13 DC 17 B0 13 04 15 B0 13\r
+E0 17 02 1B 01 1E 00 29 16 07 17 3C 18 18 04 D3\r
+05 91 06 FE 07 05 08 45 09 AD 03 07 1E 87 1F 6B\r
+20 F8 0A 00 0B 0C 0C 00 0D 10 0E B0 0F 71 10 2D\r
+11 3B 12 13 13 22 14 F8 15 62 19 1D 1A 1C 1B C7\r
+1C 00 1D B0 21 B6 22 10 23 EA 24 2A 25 00 26 1F\r
+2B 88 2A 7F 29 59 2C 88 2D 31 2E 09 07 00 AD 00\r
+BA 5E BA 11 05 00 AD 00 00 00 1B 15 4A 43 D2 53\r
+26 1D F2 90 05 00 26 1D 05 28 F2 40 20 00 21 1D\r
+4C 43 5F 3C B0 13 66 15 3B 40 1E 1D D2 93 23 1D\r
+07 24 C2 93 27 1D 04 24 2D 4B 3D 53 5C 43 4E 3C\r
+D2 93 23 1D 4D 20 C2 43 23 1D 5F 42 16 1C 5F 4F\r
+18 1C 7F F0 80 00 D2 92 25 1D 18 1C 41 20 5E 42\r
+19 1C C2 93 27 1D 14 20 4F 93 10 24 C2 43 26 1D\r
+5F 42 1A 1C 47 18 0F 5F 0E 5F 82 4E 1C 1D 3D 43\r
+5C 43 B0 13 D2 14 D2 43 27 1D 2A 3C 3D 43 25 3C\r
+4F 93 22 24 5F 42 1A 1C 47 18 0E 5E 0F 5E 2F 9B\r
+CB 23 B0 13 1C 12 5C 93 17 20 C2 43 26 1D 2D 4B\r
+5C 43 B0 13 D2 14 92 53 1E 1D 2C 4B 5C 06 0F 4C\r
+5C 0A 0F 5C 0C 5C 0C 5F 1E 42 1C 1D B0 13 84 16\r
+C2 4C 24 1D 5A 43 04 3C 2D 4B 4C 43 B0 13 D2 14\r
+4C 4A 1A 17 10 01 3B 15 4B 4C 4C 43 7B 90 BD 00\r
+06 24 7B 90 31 00 38 28 7B 90 3D 00 35 2C 08 42\r
+32 C2 03 43 B2 C0 40 00 02 0F B0 13 D2 17 7B 90\r
+31 00 25 28 7B 90 3D 00 22 2C B0 13 C2 15 4A 4C\r
+7D 40 29 00 4C 43 B0 13 40 16 C2 4B 11 0F A2 B2\r
+30 0F 10 28 7B 90 32 00 0D 24 7B 90 39 00 0A 24\r
+7B 90 38 00 07 24 A2 B2 30 0F FD 2F 3F 40 C1 0C\r
+3F 53 FE 2F 4D 4A 4C 43 B0 13 40 16 02 3C C2 4B\r
+11 0F 5C 42 21 0F 02 48 38 17 10 01 2A 15 5C 43\r
+5A 42 16 1C 3A 50 FB FF 7D 40 06 00 D2 93 1B 1C\r
+18 20 5E 42 1C 1C 47 18 0E 5E 5F 42 1D 1C 0E 5F\r
+82 4E 18 1D 2A 83 7D 42 3E 90 FE FF 0A 20 5E 42\r
+1E 1C 5F 42 1F 1C 47 18 0F 5F 0E 5F 82 4E 1A 1D\r
+2A 83 0A 93 19 24 1C 42 18 1D 3C 90 30 1D 08 28\r
+08 4C 09 43 08 5A 09 63 03 20 38 90 FF 2A 02 28\r
+4C 43 0A 3C 4E 4D 3E 50 16 1C 4D 4A B0 13 94 15\r
+5C 93 02 20 82 5A 18 1D 28 17 10 01 1B 15 0B 4C\r
+4A 4D B0 13 E8 16 4E 4A 0D 4B 7C 40 7F 00 B0 13\r
+36 15 6A 42 05 3C 3C 40 0F 00 B0 13 A0 17 7A 53\r
+7C 40 34 00 B0 13 96 11 A2 B3 30 0F FD 2B 92 C3\r
+32 0F 7C 40 35 00 B0 13 96 11 3C 40 19 00 B0 13\r
+A0 17 92 B3 32 0F 0A 28 92 C3 32 0F 92 B3 30 0F\r
+FD 2B 7C 40 3B 00 B0 13 96 11 0D 3C 7C 40 36 00\r
+B0 13 96 11 7C B0 70 00 F9 23 7C 40 3A 00 B0 13\r
+96 11 4A 93 D0 23 1A 17 10 01 3B 15 82 93 38 0F\r
+B2 C0 00 02 32 0F E2 93 22 1D 33 20 3E 40 02 01\r
+0D 43 3C 40 16 1C B0 13 4C 17 7A 40 3B 00 B0 13\r
+D0 16 4C 93 26 24 7C 40 3F 00 B0 13 C2 15 C2 4C\r
+16 1C 39 40 17 1C 4E 4C 6E 53 C2 4E 20 1D 7B 90\r
+41 00 05 28 B0 13 E8 16 B0 13 80 17 12 3C E2 93\r
+20 1D 0B 28 B0 13 D0 16 6B 93 F9 2B B0 13 AE 17\r
+19 53 F2 53 20 1D 7B 53 F7 3F B0 13 AE 17 D2 43\r
+23 1D 38 17 10 01 B0 13 62 16 82 43 34 0F B0 13\r
+EE 15 B0 13 12 17 D2 43 0E 1C D2 43 21 1D B0 13\r
+94 14 5C 93 16 20 E2 43 21 1D 92 92 1C 1D 1E 1D\r
+03 28 C2 93 27 1D 0D 20 B0 13 BA 10 F2 90 20 00\r
+21 1D 07 24 92 92 1C 1D 1E 1D EF 2B C2 93 27 1D\r
+F3 27 C2 43 0E 1C 92 92 1C 1D 1E 1D 05 28 C2 93\r
+27 1D 02 24 10 42 1A 1D 10 01 F2 D0 03 00 4A 02\r
+B2 F0 3E FF 6C 01 B2 D0 0C 00 6C 01 82 43 66 01\r
+B2 40 44 00 68 01 32 D0 40 00 82 43 60 01 B2 40\r
+50 00 62 01 B2 40 6E 11 64 01 32 C0 40 00 3F 40\r
+22 F4 03 43 0E 43 3F 53 3E 63 FD 2F B2 F0 F0 FF\r
+6E 01 A2 C3 02 01 A2 B3 02 01 F8 2F 10 01 4E 43\r
+0F 42 32 C2 03 43 1A 3C B0 13 D2 17 4E 4C 3E 50\r
+00 7E 82 4E 10 0F B0 13 BC 17 B0 13 D2 17 F2 40\r
+FE 00 11 0F B0 13 C8 17 C2 43 10 0F B2 B0 80 00\r
+02 0F FC 2B 5E 42 20 0F B0 13 BC 17 4E 9C E4 23\r
+02 4F 10 01 0A 12 4A 43 7D 42 3C 40 00 1C B0 13\r
+9C 12 B0 13 66 15 D2 93 23 1D 10 20 C2 43 23 1D\r
+D2 93 19 1C 05 20 5F 42 16 1C CF 93 18 1C 02 38\r
+4C 43 05 3C D2 42 18 1C 25 1D 5A 43 4C 4A 3A 41\r
+10 01 4E 4C 3C 40 09 00 B0 13 A0 17 D2 42 25 1D\r
+09 1C C2 4E 0B 1C 0F 4D 47 19 0F 10 7F F0 7F 00\r
+C2 4F 0C 1C C2 4D 0D 1C 7D 40 06 00 3C 40 08 1C\r
+80 00 9C 12 B2 40 80 5A 5C 01 B2 93 FE FF 09 20\r
+B2 40 02 10 E0 2B 92 D3 80 01 B0 13 B6 16 32 D0\r
+F8 00 32 C2 03 43 B0 13 FA 13 B0 13 96 13 B2 40\r
+04 A5 20 01 FA 3F 0A 12 0A 42 B0 13 FE 16 6F 4D\r
+0C 5F 82 4C 10 0F 5F 43 07 3C B0 13 C8 17 0C 4D\r
+0C 5F E2 4C 10 0F 5F 53 4F 9E F7 2B C2 93 20 0F\r
+02 4A 3A 41 10 01 B0 13 80 17 3C 40 00 40 B0 13\r
+9C 16 06 3C B2 B0 00 02 32 0F 02 28 B0 13 1A 13\r
+92 B3 44 03 03 2C D2 93 23 1D F4 23 B0 13 70 17\r
+80 00 E8 16 5B 15 08 4C 4A 4D 06 4E 0C 48 0D 43\r
+04 3C FC 46 00 00 1C 53 0D 63 0E 48 0F 43 0E 5A\r
+0F 63 0D 9F F6 2B 02 20 0C 9E F3 2B 5C 43 56 17\r
+10 01 0F 42 32 C2 03 43 B0 13 D2 17 7C 90 2F 00\r
+03 28 7C 90 3E 00 03 20 7C D0 80 00 02 3C 7C D0\r
+C0 00 C2 4C 13 0F 5C 42 20 0F 02 4F 10 01 21 83\r
+82 43 32 0F 7C 40 30 00 B0 13 96 11 81 43 00 00\r
+02 3C 91 53 00 00 B1 90 64 00 00 00 FA 2B B0 13\r
+90 17 82 43 06 0F 21 53 10 01 3B 15 0B 4C 48 4D\r
+4A 43 0A 3C 4E 4A 0E 5E 0F 4B 0F 5E 5D 4F 01 00\r
+6C 4F B0 13 40 16 5A 53 4A 98 F4 2B 38 17 10 01\r
+21 83 0E 42 B0 13 FE 16 4D 4D 0C 5D 82 4C 10 0F\r
+B0 13 C8 17 5F 42 20 0F 81 4F 00 00 02 4E 21 53\r
+10 01 C2 43 0E 1C C2 43 24 1D 82 43 1E 1D 82 43\r
+1C 1D C2 43 26 1D C2 43 27 1D 82 43 32 0F 10 01\r
+7C F3 7E F3 0F 4E 0D 4C 0E 43 1C 43 0D 5D 0E 6E\r
+0E 9F 01 28 0E 8F 0C 6C F9 2B 10 01 3C 90 00 80\r
+02 28 3C 40 FF 7F 82 4C 54 03 92 C3 44 03 B2 D0\r
+24 01 40 03 10 01 D2 C3 05 02 D2 C3 03 02 D2 D3\r
+07 02 D2 C3 19 02 D2 C3 1D 02 D2 D3 1B 02 10 01\r
+4C 4A B0 13 C2 15 4B 4C 48 4B 4C 4A B0 13 C2 15\r
+4B 4C 48 9C F9 23 10 01 D2 43 22 1D B0 13 90 17\r
+7C 40 3A 00 B0 13 96 11 82 43 32 0F 10 01 32 C2\r
+03 43 B0 13 D2 17 4C 4C 3C D0 40 00 47 18 0C 5C\r
+10 01 7C 40 8D 00 B0 13 4E 14 7D 40 2D 00 3C 40\r
+52 10 80 00 1A 16 0A 12 21 83 0A 4C 81 4A 00 00\r
+0D 41 5C 43 B0 13 E8 17 F9 3F 0F 4C 0F 5D 03 3C\r
+CC 43 00 00 1C 53 0C 9F FB 23 10 01 0F 4C 04 3C\r
+CF 4D 00 00 1F 53 3E 53 0E 93 FA 23 10 01 0F 4C\r
+04 3C FF 4D 00 00 1F 53 3E 53 0E 93 FA 23 10 01\r
+92 C3 44 03 B2 F0 CF FF 40 03 82 43 50 03 10 01\r
+82 43 32 0F E2 43 22 1D 7C 40 34 00 80 00 96 11\r
+7C 40 36 00 B0 13 96 11 7C B0 70 00 F9 23 10 01\r
+B0 13 9C 16 92 B3 44 03 FD 2B 80 00 70 17 7C 40\r
+3F 00 B0 13 C2 15 C9 4C 00 00 10 01 B0 13 D2 17\r
+F2 40 3D 00 11 0F 10 01 B2 B0 20 00 02 0F FC 2B\r
+10 01 B2 B0 10 00 02 0F FC 2B 10 01 80 00 5E 17\r
+80 00 E4 17 80 00 26 17 10 01 \r
+@17F0\r
+FF FF 18 10 A5 3C 5A C3 FF FF 00 10 \r
+@17FC\r
+FF FF FF FF \r
+q\r
diff --git a/chronos-ti/Recovery/Chronos Watch/Wireless Updater/Recovery_eZ430_Chronos_rfbsl_868MHz_1_0.txt b/chronos-ti/Recovery/Chronos Watch/Wireless Updater/Recovery_eZ430_Chronos_rfbsl_868MHz_1_0.txt
new file mode 100755 (executable)
index 0000000..eb14f89
--- /dev/null
@@ -0,0 +1,133 @@
+@1000\r
+14 3C 01 3C FF 3F D0 B3 15 F2 03 28 B1 C0 F0 00\r
+00 00 C0 43 09 F2 00 13 0C 43 B2 D0 03 80 82 01\r
+B2 93 FE FF 01 20 2C D3 10 01 31 40 7A 2B 3C 40\r
+0E 1C 3D 40 1A 01 B0 13 3A 17 3C 40 00 1C 3D 40\r
+AC 10 3E 40 0E 00 B0 13 DC 17 B0 13 04 15 B0 13\r
+E0 17 02 1B 01 1E 00 29 16 07 17 3C 18 18 04 D3\r
+05 91 06 FE 07 05 08 45 09 AD 03 07 1E 87 1F 6B\r
+20 F8 0A 00 0B 0C 0C 00 0D 21 0E 71 0F 7A 10 2D\r
+11 3B 12 13 13 22 14 F8 15 62 19 1D 1A 1C 1B C7\r
+1C 00 1D B0 21 B6 22 10 23 EA 24 2A 25 00 26 1F\r
+2B 88 2A 7F 29 59 2C 88 2D 31 2E 09 07 00 AD 00\r
+BA 5E BA 11 05 00 AD 00 00 00 1B 15 4A 43 D2 53\r
+26 1D F2 90 05 00 26 1D 05 28 F2 40 20 00 21 1D\r
+4C 43 5F 3C B0 13 66 15 3B 40 1E 1D D2 93 23 1D\r
+07 24 C2 93 27 1D 04 24 2D 4B 3D 53 5C 43 4E 3C\r
+D2 93 23 1D 4D 20 C2 43 23 1D 5F 42 16 1C 5F 4F\r
+18 1C 7F F0 80 00 D2 92 25 1D 18 1C 41 20 5E 42\r
+19 1C C2 93 27 1D 14 20 4F 93 10 24 C2 43 26 1D\r
+5F 42 1A 1C 47 18 0F 5F 0E 5F 82 4E 1C 1D 3D 43\r
+5C 43 B0 13 D2 14 D2 43 27 1D 2A 3C 3D 43 25 3C\r
+4F 93 22 24 5F 42 1A 1C 47 18 0E 5E 0F 5E 2F 9B\r
+CB 23 B0 13 1C 12 5C 93 17 20 C2 43 26 1D 2D 4B\r
+5C 43 B0 13 D2 14 92 53 1E 1D 2C 4B 5C 06 0F 4C\r
+5C 0A 0F 5C 0C 5C 0C 5F 1E 42 1C 1D B0 13 84 16\r
+C2 4C 24 1D 5A 43 04 3C 2D 4B 4C 43 B0 13 D2 14\r
+4C 4A 1A 17 10 01 3B 15 4B 4C 4C 43 7B 90 BD 00\r
+06 24 7B 90 31 00 38 28 7B 90 3D 00 35 2C 08 42\r
+32 C2 03 43 B2 C0 40 00 02 0F B0 13 D2 17 7B 90\r
+31 00 25 28 7B 90 3D 00 22 2C B0 13 C2 15 4A 4C\r
+7D 40 29 00 4C 43 B0 13 40 16 C2 4B 11 0F A2 B2\r
+30 0F 10 28 7B 90 32 00 0D 24 7B 90 39 00 0A 24\r
+7B 90 38 00 07 24 A2 B2 30 0F FD 2F 3F 40 C1 0C\r
+3F 53 FE 2F 4D 4A 4C 43 B0 13 40 16 02 3C C2 4B\r
+11 0F 5C 42 21 0F 02 48 38 17 10 01 2A 15 5C 43\r
+5A 42 16 1C 3A 50 FB FF 7D 40 06 00 D2 93 1B 1C\r
+18 20 5E 42 1C 1C 47 18 0E 5E 5F 42 1D 1C 0E 5F\r
+82 4E 18 1D 2A 83 7D 42 3E 90 FE FF 0A 20 5E 42\r
+1E 1C 5F 42 1F 1C 47 18 0F 5F 0E 5F 82 4E 1A 1D\r
+2A 83 0A 93 19 24 1C 42 18 1D 3C 90 30 1D 08 28\r
+08 4C 09 43 08 5A 09 63 03 20 38 90 FF 2A 02 28\r
+4C 43 0A 3C 4E 4D 3E 50 16 1C 4D 4A B0 13 94 15\r
+5C 93 02 20 82 5A 18 1D 28 17 10 01 1B 15 0B 4C\r
+4A 4D B0 13 E8 16 4E 4A 0D 4B 7C 40 7F 00 B0 13\r
+36 15 6A 42 05 3C 3C 40 0F 00 B0 13 A0 17 7A 53\r
+7C 40 34 00 B0 13 96 11 A2 B3 30 0F FD 2B 92 C3\r
+32 0F 7C 40 35 00 B0 13 96 11 3C 40 19 00 B0 13\r
+A0 17 92 B3 32 0F 0A 28 92 C3 32 0F 92 B3 30 0F\r
+FD 2B 7C 40 3B 00 B0 13 96 11 0D 3C 7C 40 36 00\r
+B0 13 96 11 7C B0 70 00 F9 23 7C 40 3A 00 B0 13\r
+96 11 4A 93 D0 23 1A 17 10 01 3B 15 82 93 38 0F\r
+B2 C0 00 02 32 0F E2 93 22 1D 33 20 3E 40 02 01\r
+0D 43 3C 40 16 1C B0 13 4C 17 7A 40 3B 00 B0 13\r
+D0 16 4C 93 26 24 7C 40 3F 00 B0 13 C2 15 C2 4C\r
+16 1C 39 40 17 1C 4E 4C 6E 53 C2 4E 20 1D 7B 90\r
+41 00 05 28 B0 13 E8 16 B0 13 80 17 12 3C E2 93\r
+20 1D 0B 28 B0 13 D0 16 6B 93 F9 2B B0 13 AE 17\r
+19 53 F2 53 20 1D 7B 53 F7 3F B0 13 AE 17 D2 43\r
+23 1D 38 17 10 01 B0 13 62 16 82 43 34 0F B0 13\r
+EE 15 B0 13 12 17 D2 43 0E 1C D2 43 21 1D B0 13\r
+94 14 5C 93 16 20 E2 43 21 1D 92 92 1C 1D 1E 1D\r
+03 28 C2 93 27 1D 0D 20 B0 13 BA 10 F2 90 20 00\r
+21 1D 07 24 92 92 1C 1D 1E 1D EF 2B C2 93 27 1D\r
+F3 27 C2 43 0E 1C 92 92 1C 1D 1E 1D 05 28 C2 93\r
+27 1D 02 24 10 42 1A 1D 10 01 F2 D0 03 00 4A 02\r
+B2 F0 3E FF 6C 01 B2 D0 0C 00 6C 01 82 43 66 01\r
+B2 40 44 00 68 01 32 D0 40 00 82 43 60 01 B2 40\r
+50 00 62 01 B2 40 6E 11 64 01 32 C0 40 00 3F 40\r
+22 F4 03 43 0E 43 3F 53 3E 63 FD 2F B2 F0 F0 FF\r
+6E 01 A2 C3 02 01 A2 B3 02 01 F8 2F 10 01 4E 43\r
+0F 42 32 C2 03 43 1A 3C B0 13 D2 17 4E 4C 3E 50\r
+00 7E 82 4E 10 0F B0 13 BC 17 B0 13 D2 17 F2 40\r
+FE 00 11 0F B0 13 C8 17 C2 43 10 0F B2 B0 80 00\r
+02 0F FC 2B 5E 42 20 0F B0 13 BC 17 4E 9C E4 23\r
+02 4F 10 01 0A 12 4A 43 7D 42 3C 40 00 1C B0 13\r
+9C 12 B0 13 66 15 D2 93 23 1D 10 20 C2 43 23 1D\r
+D2 93 19 1C 05 20 5F 42 16 1C CF 93 18 1C 02 38\r
+4C 43 05 3C D2 42 18 1C 25 1D 5A 43 4C 4A 3A 41\r
+10 01 4E 4C 3C 40 09 00 B0 13 A0 17 D2 42 25 1D\r
+09 1C C2 4E 0B 1C 0F 4D 47 19 0F 10 7F F0 7F 00\r
+C2 4F 0C 1C C2 4D 0D 1C 7D 40 06 00 3C 40 08 1C\r
+80 00 9C 12 B2 40 80 5A 5C 01 B2 93 FE FF 09 20\r
+B2 40 02 10 E0 2B 92 D3 80 01 B0 13 B6 16 32 D0\r
+F8 00 32 C2 03 43 B0 13 FA 13 B0 13 96 13 B2 40\r
+04 A5 20 01 FA 3F 0A 12 0A 42 B0 13 FE 16 6F 4D\r
+0C 5F 82 4C 10 0F 5F 43 07 3C B0 13 C8 17 0C 4D\r
+0C 5F E2 4C 10 0F 5F 53 4F 9E F7 2B C2 93 20 0F\r
+02 4A 3A 41 10 01 B0 13 80 17 3C 40 00 40 B0 13\r
+9C 16 06 3C B2 B0 00 02 32 0F 02 28 B0 13 1A 13\r
+92 B3 44 03 03 2C D2 93 23 1D F4 23 B0 13 70 17\r
+80 00 E8 16 5B 15 08 4C 4A 4D 06 4E 0C 48 0D 43\r
+04 3C FC 46 00 00 1C 53 0D 63 0E 48 0F 43 0E 5A\r
+0F 63 0D 9F F6 2B 02 20 0C 9E F3 2B 5C 43 56 17\r
+10 01 0F 42 32 C2 03 43 B0 13 D2 17 7C 90 2F 00\r
+03 28 7C 90 3E 00 03 20 7C D0 80 00 02 3C 7C D0\r
+C0 00 C2 4C 13 0F 5C 42 20 0F 02 4F 10 01 21 83\r
+82 43 32 0F 7C 40 30 00 B0 13 96 11 81 43 00 00\r
+02 3C 91 53 00 00 B1 90 64 00 00 00 FA 2B B0 13\r
+90 17 82 43 06 0F 21 53 10 01 3B 15 0B 4C 48 4D\r
+4A 43 0A 3C 4E 4A 0E 5E 0F 4B 0F 5E 5D 4F 01 00\r
+6C 4F B0 13 40 16 5A 53 4A 98 F4 2B 38 17 10 01\r
+21 83 0E 42 B0 13 FE 16 4D 4D 0C 5D 82 4C 10 0F\r
+B0 13 C8 17 5F 42 20 0F 81 4F 00 00 02 4E 21 53\r
+10 01 C2 43 0E 1C C2 43 24 1D 82 43 1E 1D 82 43\r
+1C 1D C2 43 26 1D C2 43 27 1D 82 43 32 0F 10 01\r
+7C F3 7E F3 0F 4E 0D 4C 0E 43 1C 43 0D 5D 0E 6E\r
+0E 9F 01 28 0E 8F 0C 6C F9 2B 10 01 3C 90 00 80\r
+02 28 3C 40 FF 7F 82 4C 54 03 92 C3 44 03 B2 D0\r
+24 01 40 03 10 01 D2 C3 05 02 D2 C3 03 02 D2 D3\r
+07 02 D2 C3 19 02 D2 C3 1D 02 D2 D3 1B 02 10 01\r
+4C 4A B0 13 C2 15 4B 4C 48 4B 4C 4A B0 13 C2 15\r
+4B 4C 48 9C F9 23 10 01 D2 43 22 1D B0 13 90 17\r
+7C 40 3A 00 B0 13 96 11 82 43 32 0F 10 01 32 C2\r
+03 43 B0 13 D2 17 4C 4C 3C D0 40 00 47 18 0C 5C\r
+10 01 7C 40 8C 00 B0 13 4E 14 7D 40 2D 00 3C 40\r
+52 10 80 00 1A 16 0A 12 21 83 0A 4C 81 4A 00 00\r
+0D 41 5C 43 B0 13 E8 17 F9 3F 0F 4C 0F 5D 03 3C\r
+CC 43 00 00 1C 53 0C 9F FB 23 10 01 0F 4C 04 3C\r
+CF 4D 00 00 1F 53 3E 53 0E 93 FA 23 10 01 0F 4C\r
+04 3C FF 4D 00 00 1F 53 3E 53 0E 93 FA 23 10 01\r
+92 C3 44 03 B2 F0 CF FF 40 03 82 43 50 03 10 01\r
+82 43 32 0F E2 43 22 1D 7C 40 34 00 80 00 96 11\r
+7C 40 36 00 B0 13 96 11 7C B0 70 00 F9 23 10 01\r
+B0 13 9C 16 92 B3 44 03 FD 2B 80 00 70 17 7C 40\r
+3F 00 B0 13 C2 15 C9 4C 00 00 10 01 B0 13 D2 17\r
+F2 40 3D 00 11 0F 10 01 B2 B0 20 00 02 0F FC 2B\r
+10 01 B2 B0 10 00 02 0F FC 2B 10 01 80 00 5E 17\r
+80 00 E4 17 80 00 26 17 10 01 \r
+@17F0\r
+FF FF 18 10 A5 3C 5A C3 FF FF 00 10 \r
+@17FC\r
+FF FF FF FF \r
+q\r
diff --git a/chronos-ti/Recovery/Chronos Watch/Wireless Updater/Recovery_eZ430_Chronos_rfbsl_915MHz_1_0.txt b/chronos-ti/Recovery/Chronos Watch/Wireless Updater/Recovery_eZ430_Chronos_rfbsl_915MHz_1_0.txt
new file mode 100755 (executable)
index 0000000..5fbac7c
--- /dev/null
@@ -0,0 +1,133 @@
+@1000\r
+14 3C 01 3C FF 3F D0 B3 15 F2 03 28 B1 C0 F0 00\r
+00 00 C0 43 09 F2 00 13 0C 43 B2 D0 03 80 82 01\r
+B2 93 FE FF 01 20 2C D3 10 01 31 40 7A 2B 3C 40\r
+0E 1C 3D 40 1A 01 B0 13 3A 17 3C 40 00 1C 3D 40\r
+AC 10 3E 40 0E 00 B0 13 DC 17 B0 13 04 15 B0 13\r
+E0 17 02 1B 01 1E 00 29 16 07 17 3C 18 18 04 D3\r
+05 91 06 FE 07 05 08 45 09 AD 03 07 1E 87 1F 6B\r
+20 F8 0A 14 0B 0C 0C 00 0D 22 0E B1 0F 3B 10 2D\r
+11 3B 12 13 13 22 14 F8 15 62 19 1D 1A 1C 1B C7\r
+1C 00 1D B0 21 B6 22 10 23 EA 24 2A 25 00 26 1F\r
+2B 88 2A 7F 29 59 2C 88 2D 31 2E 09 07 00 AD 00\r
+BA 5E BA 11 05 00 AD 00 00 00 1B 15 4A 43 D2 53\r
+26 1D F2 90 05 00 26 1D 05 28 F2 40 20 00 21 1D\r
+4C 43 5F 3C B0 13 66 15 3B 40 1E 1D D2 93 23 1D\r
+07 24 C2 93 27 1D 04 24 2D 4B 3D 53 5C 43 4E 3C\r
+D2 93 23 1D 4D 20 C2 43 23 1D 5F 42 16 1C 5F 4F\r
+18 1C 7F F0 80 00 D2 92 25 1D 18 1C 41 20 5E 42\r
+19 1C C2 93 27 1D 14 20 4F 93 10 24 C2 43 26 1D\r
+5F 42 1A 1C 47 18 0F 5F 0E 5F 82 4E 1C 1D 3D 43\r
+5C 43 B0 13 D2 14 D2 43 27 1D 2A 3C 3D 43 25 3C\r
+4F 93 22 24 5F 42 1A 1C 47 18 0E 5E 0F 5E 2F 9B\r
+CB 23 B0 13 1C 12 5C 93 17 20 C2 43 26 1D 2D 4B\r
+5C 43 B0 13 D2 14 92 53 1E 1D 2C 4B 5C 06 0F 4C\r
+5C 0A 0F 5C 0C 5C 0C 5F 1E 42 1C 1D B0 13 84 16\r
+C2 4C 24 1D 5A 43 04 3C 2D 4B 4C 43 B0 13 D2 14\r
+4C 4A 1A 17 10 01 3B 15 4B 4C 4C 43 7B 90 BD 00\r
+06 24 7B 90 31 00 38 28 7B 90 3D 00 35 2C 08 42\r
+32 C2 03 43 B2 C0 40 00 02 0F B0 13 D2 17 7B 90\r
+31 00 25 28 7B 90 3D 00 22 2C B0 13 C2 15 4A 4C\r
+7D 40 29 00 4C 43 B0 13 40 16 C2 4B 11 0F A2 B2\r
+30 0F 10 28 7B 90 32 00 0D 24 7B 90 39 00 0A 24\r
+7B 90 38 00 07 24 A2 B2 30 0F FD 2F 3F 40 C1 0C\r
+3F 53 FE 2F 4D 4A 4C 43 B0 13 40 16 02 3C C2 4B\r
+11 0F 5C 42 21 0F 02 48 38 17 10 01 2A 15 5C 43\r
+5A 42 16 1C 3A 50 FB FF 7D 40 06 00 D2 93 1B 1C\r
+18 20 5E 42 1C 1C 47 18 0E 5E 5F 42 1D 1C 0E 5F\r
+82 4E 18 1D 2A 83 7D 42 3E 90 FE FF 0A 20 5E 42\r
+1E 1C 5F 42 1F 1C 47 18 0F 5F 0E 5F 82 4E 1A 1D\r
+2A 83 0A 93 19 24 1C 42 18 1D 3C 90 30 1D 08 28\r
+08 4C 09 43 08 5A 09 63 03 20 38 90 FF 2A 02 28\r
+4C 43 0A 3C 4E 4D 3E 50 16 1C 4D 4A B0 13 94 15\r
+5C 93 02 20 82 5A 18 1D 28 17 10 01 1B 15 0B 4C\r
+4A 4D B0 13 E8 16 4E 4A 0D 4B 7C 40 7F 00 B0 13\r
+36 15 6A 42 05 3C 3C 40 0F 00 B0 13 A0 17 7A 53\r
+7C 40 34 00 B0 13 96 11 A2 B3 30 0F FD 2B 92 C3\r
+32 0F 7C 40 35 00 B0 13 96 11 3C 40 19 00 B0 13\r
+A0 17 92 B3 32 0F 0A 28 92 C3 32 0F 92 B3 30 0F\r
+FD 2B 7C 40 3B 00 B0 13 96 11 0D 3C 7C 40 36 00\r
+B0 13 96 11 7C B0 70 00 F9 23 7C 40 3A 00 B0 13\r
+96 11 4A 93 D0 23 1A 17 10 01 3B 15 82 93 38 0F\r
+B2 C0 00 02 32 0F E2 93 22 1D 33 20 3E 40 02 01\r
+0D 43 3C 40 16 1C B0 13 4C 17 7A 40 3B 00 B0 13\r
+D0 16 4C 93 26 24 7C 40 3F 00 B0 13 C2 15 C2 4C\r
+16 1C 39 40 17 1C 4E 4C 6E 53 C2 4E 20 1D 7B 90\r
+41 00 05 28 B0 13 E8 16 B0 13 80 17 12 3C E2 93\r
+20 1D 0B 28 B0 13 D0 16 6B 93 F9 2B B0 13 AE 17\r
+19 53 F2 53 20 1D 7B 53 F7 3F B0 13 AE 17 D2 43\r
+23 1D 38 17 10 01 B0 13 62 16 82 43 34 0F B0 13\r
+EE 15 B0 13 12 17 D2 43 0E 1C D2 43 21 1D B0 13\r
+94 14 5C 93 16 20 E2 43 21 1D 92 92 1C 1D 1E 1D\r
+03 28 C2 93 27 1D 0D 20 B0 13 BA 10 F2 90 20 00\r
+21 1D 07 24 92 92 1C 1D 1E 1D EF 2B C2 93 27 1D\r
+F3 27 C2 43 0E 1C 92 92 1C 1D 1E 1D 05 28 C2 93\r
+27 1D 02 24 10 42 1A 1D 10 01 F2 D0 03 00 4A 02\r
+B2 F0 3E FF 6C 01 B2 D0 0C 00 6C 01 82 43 66 01\r
+B2 40 44 00 68 01 32 D0 40 00 82 43 60 01 B2 40\r
+50 00 62 01 B2 40 6E 11 64 01 32 C0 40 00 3F 40\r
+22 F4 03 43 0E 43 3F 53 3E 63 FD 2F B2 F0 F0 FF\r
+6E 01 A2 C3 02 01 A2 B3 02 01 F8 2F 10 01 4E 43\r
+0F 42 32 C2 03 43 1A 3C B0 13 D2 17 4E 4C 3E 50\r
+00 7E 82 4E 10 0F B0 13 BC 17 B0 13 D2 17 F2 40\r
+FE 00 11 0F B0 13 C8 17 C2 43 10 0F B2 B0 80 00\r
+02 0F FC 2B 5E 42 20 0F B0 13 BC 17 4E 9C E4 23\r
+02 4F 10 01 0A 12 4A 43 7D 42 3C 40 00 1C B0 13\r
+9C 12 B0 13 66 15 D2 93 23 1D 10 20 C2 43 23 1D\r
+D2 93 19 1C 05 20 5F 42 16 1C CF 93 18 1C 02 38\r
+4C 43 05 3C D2 42 18 1C 25 1D 5A 43 4C 4A 3A 41\r
+10 01 4E 4C 3C 40 09 00 B0 13 A0 17 D2 42 25 1D\r
+09 1C C2 4E 0B 1C 0F 4D 47 19 0F 10 7F F0 7F 00\r
+C2 4F 0C 1C C2 4D 0D 1C 7D 40 06 00 3C 40 08 1C\r
+80 00 9C 12 B2 40 80 5A 5C 01 B2 93 FE FF 09 20\r
+B2 40 02 10 E0 2B 92 D3 80 01 B0 13 B6 16 32 D0\r
+F8 00 32 C2 03 43 B0 13 FA 13 B0 13 96 13 B2 40\r
+04 A5 20 01 FA 3F 0A 12 0A 42 B0 13 FE 16 6F 4D\r
+0C 5F 82 4C 10 0F 5F 43 07 3C B0 13 C8 17 0C 4D\r
+0C 5F E2 4C 10 0F 5F 53 4F 9E F7 2B C2 93 20 0F\r
+02 4A 3A 41 10 01 B0 13 80 17 3C 40 00 40 B0 13\r
+9C 16 06 3C B2 B0 00 02 32 0F 02 28 B0 13 1A 13\r
+92 B3 44 03 03 2C D2 93 23 1D F4 23 B0 13 70 17\r
+80 00 E8 16 5B 15 08 4C 4A 4D 06 4E 0C 48 0D 43\r
+04 3C FC 46 00 00 1C 53 0D 63 0E 48 0F 43 0E 5A\r
+0F 63 0D 9F F6 2B 02 20 0C 9E F3 2B 5C 43 56 17\r
+10 01 0F 42 32 C2 03 43 B0 13 D2 17 7C 90 2F 00\r
+03 28 7C 90 3E 00 03 20 7C D0 80 00 02 3C 7C D0\r
+C0 00 C2 4C 13 0F 5C 42 20 0F 02 4F 10 01 21 83\r
+82 43 32 0F 7C 40 30 00 B0 13 96 11 81 43 00 00\r
+02 3C 91 53 00 00 B1 90 64 00 00 00 FA 2B B0 13\r
+90 17 82 43 06 0F 21 53 10 01 3B 15 0B 4C 48 4D\r
+4A 43 0A 3C 4E 4A 0E 5E 0F 4B 0F 5E 5D 4F 01 00\r
+6C 4F B0 13 40 16 5A 53 4A 98 F4 2B 38 17 10 01\r
+21 83 0E 42 B0 13 FE 16 4D 4D 0C 5D 82 4C 10 0F\r
+B0 13 C8 17 5F 42 20 0F 81 4F 00 00 02 4E 21 53\r
+10 01 C2 43 0E 1C C2 43 24 1D 82 43 1E 1D 82 43\r
+1C 1D C2 43 26 1D C2 43 27 1D 82 43 32 0F 10 01\r
+7C F3 7E F3 0F 4E 0D 4C 0E 43 1C 43 0D 5D 0E 6E\r
+0E 9F 01 28 0E 8F 0C 6C F9 2B 10 01 3C 90 00 80\r
+02 28 3C 40 FF 7F 82 4C 54 03 92 C3 44 03 B2 D0\r
+24 01 40 03 10 01 D2 C3 05 02 D2 C3 03 02 D2 D3\r
+07 02 D2 C3 19 02 D2 C3 1D 02 D2 D3 1B 02 10 01\r
+4C 4A B0 13 C2 15 4B 4C 48 4B 4C 4A B0 13 C2 15\r
+4B 4C 48 9C F9 23 10 01 D2 43 22 1D B0 13 90 17\r
+7C 40 3A 00 B0 13 96 11 82 43 32 0F 10 01 32 C2\r
+03 43 B0 13 D2 17 4C 4C 3C D0 40 00 47 18 0C 5C\r
+10 01 7C 40 8B 00 B0 13 4E 14 7D 40 2D 00 3C 40\r
+52 10 80 00 1A 16 0A 12 21 83 0A 4C 81 4A 00 00\r
+0D 41 5C 43 B0 13 E8 17 F9 3F 0F 4C 0F 5D 03 3C\r
+CC 43 00 00 1C 53 0C 9F FB 23 10 01 0F 4C 04 3C\r
+CF 4D 00 00 1F 53 3E 53 0E 93 FA 23 10 01 0F 4C\r
+04 3C FF 4D 00 00 1F 53 3E 53 0E 93 FA 23 10 01\r
+92 C3 44 03 B2 F0 CF FF 40 03 82 43 50 03 10 01\r
+82 43 32 0F E2 43 22 1D 7C 40 34 00 80 00 96 11\r
+7C 40 36 00 B0 13 96 11 7C B0 70 00 F9 23 10 01\r
+B0 13 9C 16 92 B3 44 03 FD 2B 80 00 70 17 7C 40\r
+3F 00 B0 13 C2 15 C9 4C 00 00 10 01 B0 13 D2 17\r
+F2 40 3D 00 11 0F 10 01 B2 B0 20 00 02 0F FC 2B\r
+10 01 B2 B0 10 00 02 0F FC 2B 10 01 80 00 5E 17\r
+80 00 E4 17 80 00 26 17 10 01 \r
+@17F0\r
+FF FF 18 10 A5 3C 5A C3 FF FF 00 10 \r
+@17FC\r
+FF FF FF FF \r
+q\r
diff --git a/chronos-ti/Recovery/RF Access Point/Recovery_eZ430-Chronos_AP_433MHz_1_2.hex b/chronos-ti/Recovery/RF Access Point/Recovery_eZ430-Chronos_AP_433MHz_1_2.hex
new file mode 100755 (executable)
index 0000000..44e3e4d
--- /dev/null
@@ -0,0 +1,1714 @@
+:020000040000FA\r
+:060000000200E90211D923\r
+:03000B0002127965\r
+:030013000212884E\r
+:03001B0002129737\r
+:030023000212A620\r
+:03002B000212B509\r
+:0300330002500375\r
+:03003B000212C4EA\r
+:030043000212D3D3\r
+:03004B000211F9A6\r
+:030053000212E2B4\r
+:030063000212275F\r
+:03006B000250A898\r
+:030073000212F185\r
+:03007B000213006D\r
+:030083000211A3C4\r
+:10008B0002130F00000080FB1200F8B900030200FE\r
+:10009B00E3E479217812B800028004F709D8FCE474\r
+:1000AB0090F3FF78AC79068002F0A3D8FCD9FA90D4\r
+:1000BB00F9AAAA82AB839000FB78AA79028015E497\r
+:1000CB0093A3AC82AD838A828B83F0A3AA82AB838A\r
+:1000DB008C828D83D8E9D9E7120A2512008E75D050\r
+:1000EB000075814F7510FF7511F302009379012292\r
+:1000FB0087D6120000C201000000000001000000C2\r
+:10010B00F1490200FFFFFFFF0032506E0E278DFFFB\r
+:10011B0000000001000000000000000000000000D3\r
+:10012B0000000000000000000000000000000000C4\r
+:10013B0000000000000000000000000000000000B4\r
+:10014B00B242873F183B0543FC34B4407856341019\r
+:10015B00020101010008070605040302010055AA6C\r
+:10016B0055AA55AA55AA556CDC0200A402470347B1\r
+:10017B0003470347034F03200700CABA5EBA1109AE\r
+:10018B000300CA000500CA000000010001000000C6\r
+:10019B000000FFFFFFFF0001804020100884422178\r
+:1001AB009048A45229140A85C261B058ACD66B355D\r
+:1001BB009ACD6633994CA653A9542A95CAE5F27980\r
+:1001CB003C9ECF67B3D96CB65B2D160B058241A055\r
+:1001DB005028944AA5D269341A8D462391C8E472EB\r
+:1001EB00391C8EC7E3F1F8FCFEFF7F3F1F0F07831F\r
+:1001FB00C1E070389CCEE7F3F97CBEDF6F379B4DC7\r
+:10020B0026138944221188C4623198CCE673B95CF9\r
+:10021B00AED7EB75BADD6EB7DB6D361B0D06038102\r
+:10022B00C06030188CC663B1D8ECF67B3D1E8F478F\r
+:10023B00A3D1E8F47ABD5EAF57AB55AAD5EAF5FA70\r
+:10024B00FD7EBF5F2F178B45A251A8D46AB5DAED9F\r
+:10025B00763B1D0E87C3E1F078BCDEEF77BB5D2EDE\r
+:10026B0097CB65B2592C964B25924924120904025F\r
+:10027B000180402010088442219048A45229140A7E\r
+:10028B0085C261B058ACD66B359ACD6633994CA606\r
+:10029B0053A9542A95CAE5013C1201100102000032\r
+:1002AB00205104A6160900010203010902430002B2\r
+:1002BB00010080190904000001020201000524005D\r
+:1002CB00100104240202052406000105240100018B\r
+:1002DB000705820340004009040100020A000000E8\r
+:1002EB0007058402400001070504024000010403D6\r
+:1002FB00090424035400650078006100730020009A\r
+:10030B0049006E0073007400720075006D0065008B\r
+:10031B006E00740073001E03430043003100310074\r
+:10032B0031003100200055005300420020004300F3\r
+:10033B00440043000803300030003100BF020000CE\r
+:10034B00E2020000E066701008A3E066700A08A3E2\r
+:10035B00E066700408A3E06622C3E09608A3E0966B\r
+:10036B0008A3E09608A3E09622BB0102E722C08215\r
+:10037B00C08389828A83BB0003E08002E493D0832D\r
+:10038B00D08222BB000EC082C0838A838982F0D0C8\r
+:10039B0083D08222BB0101F722080808EAC0E0EBF8\r
+:1003AB00C0E086F0E7A4FA180986F0E7A42AFA1849\r
+:1003BB000986F0E7A42AFA180986F0E7A42AFA19A5\r
+:1003CB0086F0E7A4FBE5F02AFA190886F0E7A42BE0\r
+:1003DB00FBE5F03AFA190886F0E7A42BFBE5F03AB7\r
+:1003EB00FA18180986F0E7A4C5F02BFBE43AFA19C2\r
+:1003FB0008E7C5F0C6A426F6E5F03BFBE43AFA188D\r
+:10040B0086F0E7A4F6E5F00826F6E43B08F6E43AB6\r
+:10041B0008F6D0E0FBD0E0FA22E4CFC0E0E4CEC097\r
+:10042B00E0E4CDC0E0E4CCC0E075F020C3E633F6E9\r
+:10043B0008E633F608E633F608E633F6181818EC38\r
+:10044B0033FCED33FDEE33FEEF33FFC3EC9709EDD9\r
+:10045B009709EE9709EF97191919400FFFEC97FCC5\r
+:10046B0009ED97FD09EE97FE191906D5F0BEECF7CD\r
+:10047B0009EDF709EEF709EFF7191919D0E0FCD0E0\r
+:10048B00E0FDD0E0FED0E0FF226016080808C6C3EE\r
+:10049B0013C618C613C618C613C618C613C6D5E09E\r
+:1004AB00EA227009080808226016181818C6C33308\r
+:1004BB00C608C633C608C633C608C633C6D5E0EA77\r
+:1004CB0022E627F60809E637F60809E637F60809A3\r
+:1004DB00E637F622E026F608A3E036F608A3E03668\r
+:1004EB00F608A3E036F622E056F608A3E056F60827\r
+:1004FB00A3E056F608A3E056F622E647F60809E60F\r
+:10050B0047F60809E647F60809E647F622E046F003\r
+:10051B0008A3E046F008A3E046F008A3E046F0226B\r
+:10052B00E0F608A3E0F608A3E0F608A3E0F622E65F\r
+:10053B00F008A3E6F008A3E6F008A3E6F022CAC091\r
+:10054B00E0E6F0A308DAFAD0E0FA22CAC0E0E0A3B2\r
+:10055B00C582CCC582C583CDC583F0A3C582CCC56E\r
+:10056B0082C583CDC583DAE6D0E0CA22C3E498F80E\r
+:10057B00E499F91205B88026C3E49AFAE49BFBE9E7\r
+:10058B0020E7E91205B8E498F8E499F922C3E49856\r
+:10059B00F8E499F91205B8E498F8E499F9C3E49AE8\r
+:1005AB00FAE49BFB22EB20E7CFE920E7E0B9001050\r
+:1005BB00BB0008E88AF084F8AAF022E4FBC8FA2210\r
+:1005CB00EB70227B10C833C8C933C9335007C39AA9\r
+:1005DB00C3DBF280069A50012ADBEAC833F4C8C9A0\r
+:1005EB0033F4C9FA2275F008E4C833C8C933C933E8\r
+:1005FB00C99AC99B5004C92AC93BD5F0ECFBC83337\r
+:10060B00F4C8E4C9FA22600C08C6C313C618C61393\r
+:10061B00C6D5E0F422700422600D18C6C333C60899\r
+:10062B00C633C6D5E0F41822251010AF08F51040DC\r
+:10063B000215118008F51040021511D2AF22C0D05F\r
+:10064B00251010AF08F510500205118008F5105059\r
+:10065B00020511D2AFD0D0222510F58210AF08F5CC\r
+:10066B0010400215118008F51040021511D2AF850C\r
+:10067B001183222510F582E43511F58322E47325CD\r
+:10068B0010C582C0E0E51134FFC583C0E0E510C39F\r
+:10069B00958224F9F8E4C5A8858311858210C5A835\r
+:1006AB00E8CEF0A3E520F0A37808E608F0A3DEFA85\r
+:1006BB00EFF0A3E58124FBF8E608F0A3E608F0A32E\r
+:1006CB000808E608F0A3E608F0A315811581D0E031\r
+:1006DB00FED0E0F815811581E8C0E0EEC0E0228580\r
+:1006EB001183851082E0A3FEE0A3F5207808E0A338\r
+:1006FB00F608DFFAE0A3FFE0A3C0E0E0A3C0E0E070\r
+:10070B00A3C0E0E0A3C0E0E4C5A8858210858311F7\r
+:10071B00C5A8D083D08222C0D02510C582C0E0E509\r
+:10072B001134FFC583C0E0E510C3958224F310AFED\r
+:10073B00088583118582108008858311858210D2EC\r
+:10074B00AFC8F0A3E9F0A3EAF0A3EBF0A37908E7B5\r
+:10075B0009F0A3D8FAECF0A3EDF0A3EEF0A3EFF0C1\r
+:10076B00A3D0E0F0A3D0E0F0A3D0E0F0A3E520F01D\r
+:10077B00A3E5F0F0A322851183851082E0C0E0A3EE\r
+:10078B00E0F9A3E0FAA3E0FBA37808E0F608A3DF07\r
+:10079B00FAE0FCA3E0FDA3E0FEA3E0FFA3E0C0E0D2\r
+:1007AB00A3E0C0E0A3E0F5D0A3E0F520A3E0A3F520\r
+:1007BB00F0E4C5A8858311858210C5A8D082D083AB\r
+:1007CB00D0E0F8D0E0327403800474028000C0E003\r
+:1007DB00F404120663D0E0120549227403800474FA\r
+:1007EB00028000CCC0E0EDC0E0E510C39CCCAD11A5\r
+:1007FB0050011D10AF068C108D1180068C108D11C1\r
+:10080B00D2AF120556D0E0FDD0E0FC22D083D082CF\r
+:10081B00C5F0E493A3C5F0C395F0F5F0E493A3C33F\r
+:10082B0095F04005E5F0048001E475F002A4258203\r
+:10083B00F582E5F03583F583E493A3C0E0E493C040\r
+:10084B00E022D083D082CCC0E0E493A360061208F0\r
+:10085B00771470FAE493A360061208961470FAD01A\r
+:10086B00E0FCE493A3C0E0E493C0E022C0E0E49397\r
+:10087B00A3D39C5010E493A3C39C400AD0E0D0E0D8\r
+:10088B00D0E002086AA3A3A3D0E022C0E0E493A3C4\r
+:10089B006C7009D0E0D0E0D0E002086AA3A3D0E0EE\r
+:1008AB002253CBEFC2D843CB0475F00CEAA4F5CDA1\r
+:1008BB0074FC55CB4402F5CB43CB10A2D850FC5360\r
+:1008CB00CBEFC2D822C082C08353A8C0E5A853B8CF\r
+:1008DB00F0E5B8539AC2E59A7422C0E0740755C686\r
+:1008EB00F8D0E0B800028004C313D8FCF5AB7475E4\r
+:1008FB0090FC00F074AE90FC01F0740290FC02F0DE\r
+:10090B00E490FC03F090FC04F0747490FC05F0741C\r
+:10091B00FF90FC06F074F590FC07F074AF90FC08A8\r
+:10092B00F0E490FC09F090FC0AF0747490FC0BF06E\r
+:10093B0074FF90FC0CF074F590FC0DF074AF90FC10\r
+:10094B000EF0E490FC0FF090FC10F074E590FC11AD\r
+:10095B00F074AE90FC12F0745490FC13F074409051\r
+:10096B00FC14F0747090FC15F074FA90FC16F07493\r
+:10097B002290FC17F0740190F3FFF0D083D0822209\r
+:10098B00C082C0838A828B83E493F9D083D0822286\r
+:10099B00C082C0838A828B83E493F9A3E4932400FF\r
+:1009AB00FAE439FBD083D0822274F712068AECFE6C\r
+:1009BB00EDFF740912067EE0FCA3E0FD74326C704F\r
+:1009CB000374576D600479008045C2AFE5AEA2E7B2\r
+:1009DB0040FA8A088B0974097808120611E508F5A4\r
+:1009EB00ADEAFCEBC313EC13F5ACEF90FC06F0EEA9\r
+:1009FB0090FC0CF012FC00D2AFE9601112099B8A3B\r
+:100A0B00088B09EE65087003EF650970B979017FF2\r
+:100A1B00020206EAD2AF22C2AF22750C00750D009E\r
+:100A2B007E0043FE01D29043FE10C29443FD3FE58E\r
+:100A3B00FD43FEE0E5FE43FF19E5FF53BEF8E5BEBF\r
+:100A4B0000746055BE60FA780079008008E82401D4\r
+:100A5B0008E93400F9C3E89420E9944E40EF53C6FB\r
+:100A6B00BF53C6C0E5C643C638E5C6746055BE6005\r
+:100A7B00FA780079008008E8240108E93400F9C30A\r
+:100A8B00E89420E9944E40EF90F9AA780812052BD0\r
+:100A9B00AA08AB09AC0AAD0B12647374FF90F4187F\r
+:100AAB00F07AF07B7F12098BE9700C7AF27B7F1264\r
+:100ABB00098BE990F412F090F412E0C3941F4008F4\r
+:100ACB00E0C394E25002E4F043B933E5B943A92300\r
+:100ADB00E5A990F9AE780812052BAA08AB09AC0A68\r
+:100AEB00AD0B12593B800F125993E50C2401F50CF9\r
+:100AFB00E50D3400F50DC3E50C9420E50D944E4047\r
+:100B0B00E6C29075EC4475ED0475EBDED2BCD2AF4A\r
+:100B1B00800E12115A740590F400F0E490F404F076\r
+:100B2B0090F404E0600C90F401E0700690F403E0A4\r
+:100B3B0060E090F402E0602990F60EE06008EE7041\r
+:100B4B000553EBEF7E0190F608E060D412664FEE92\r
+:100B5B006009E490F60EF0FE43EB10E490F608808B\r
+:100B6B00BE90F405E0603490F403E0702ED290E474\r
+:100B7B0090F405F012111D740390F400F0740190C1\r
+:100B8B00F401F012131E740190F400F0E490F401E0\r
+:100B9B00F074FF90F418F0C290808590F406E0603A\r
+:100BAB003D90F401E07037D290E490F406F0125BC4\r
+:100BBB0019740A90F400F0740190F403F01260D0F1\r
+:100BCB0090F67AE0A2E25004740B8002740C90F45D\r
+:100BDB0000F0E490F403F074FF90F67C80B890F48E\r
+:100BEB000DE07003020B2B90F40FE06003020B2B54\r
+:100BFB0090F40EE01208170102190C0C0C110C16D4\r
+:100C0B000C12434B800812486F80031248957401F5\r
+:100C1B0090F40F020B2A74F112068A90F653E064DB\r
+:100C2B00FF600302111890F654E012084D001900F2\r
+:100C3B00A20C01A80C02BD0C03E10C04460D058DA2\r
+:100C4B000D06DA0C07B10D08D10D09900E0A970DA0\r
+:100C5B0020870C310D0E32480E33580E40990E4141\r
+:100C6B00D20E46C60E47F00E48D80E49E90E705804\r
+:100C7B0010718F1072C01073A8100C11741290F6B3\r
+:100C8B0059F0743490F658F0745690F657F0747817\r
+:100C9B0090F656F002110C90F400E080F3121187DD\r
+:100CAB00E490F402F090F401F090F403F090F4006F\r
+:100CBB0080E190F401E0600790F417E0D2E5F0904A\r
+:100CCB00F402E0600302110C740190F40480C4126E\r
+:100CDB001187740480D790F659E0F50875090075F3\r
+:100CEB000A00750B00741878081204AD90F658E0E2\r
+:100CFB00F50C750D00750E00750F007410780C1245\r
+:100D0B0004AD7808790C1204CC90F657E0F50C750D\r
+:100D1B000E007408780C1204AD7808790C1204CC10\r
+:100D2B0090F656E0F50C750D007808790C1204CC92\r
+:100D3B0090F98A780812053A02110C90F98A780C0E\r
+:100D4B0012052B850C08850D09850E0A850F0B7472\r
+:100D5B00187808120494E50890F659F0850C08856C\r
+:100D6B000D09850E0AF50B74107808120494E5082A\r
+:100D7B0090F658F0850D09E50990F657F0E50C0251\r
+:100D8B000C9B90F656E090FB52020C9E90F656E0B0\r
+:100D9B0090F9A5F090F658E0F990F657E090F9A687\r
+:100DAB00F0A3E9020C9E90F402E06003121187900D\r
+:100DBB00F401E0600302110C740290F400F0740172\r
+:100DCB0090F405020C9E90F417E0A2E4502F90F4DF\r
+:100DDB001BE090F659F090F41AE090F658F090F46E\r
+:100DEB0019E090F657F090F418E090F656F074FF77\r
+:100DFB0090F418F090F417E0C2E4020C9E74FF021A\r
+:100E0B000C9B90F401E0700302110C7A00801F8A96\r
+:100E1B0082A882E82456F582E434F6F583E0C0E03C\r
+:100E2B00E82418F582E434F4F583D0E0F00AEAC341\r
+:100E3B00941340DB90F417E0D2E6020C9E90F4077B\r
+:100E4B00E090F656F0740490F655020C9E90F40761\r
+:100E5B00E0602E7A00801F8A82A882E82418F5822F\r
+:100E6B00E434F4F583E0C0E0E82456F582E434F68C\r
+:100E7B00F583D0E0F00AEAC3941340DBE490F40767\r
+:100E8B00F0741680C290F417E0D2E5020C9E90F439\r
+:100E9B0002E0600312118790F401E0600790F417F1\r
+:100EAB00E0D2E5F090F403E0600302110C740990BA\r
+:100EBB00F400F0740190F406020C9E90F67AE0D2E6\r
+:100ECB00E5F0C29002110C90F977020CA590F40397\r
+:100EDB00E0600690F67B020CA57480020C9B74F705\r
+:100EEB0090F65680A6740290F67BF090F773E06450\r
+:100EFB00016003020FD6E490F40AF090F655E0245B\r
+:100F0B00FB90F409F090F656E090F40BF090F65746\r
+:100F1B00E0F50890F40BE07035E50890F77AF09067\r
+:100F2B00F658E090F77BF0F9E50890F983F0A3E928\r
+:100F3B00F090F983E090FA41F090F984E090FA4256\r
+:100F4B00F0740490F773F0E490F408020C9EE5083B\r
+:100F5B0090F40CF090F40BE06401700474018002C7\r
+:100F6B00740290F779F090F40CE0240590F774F08C\r
+:100F7B007A00801F8A82A882E82458F582E434F62E\r
+:100F8B00F583E0C0E0E8247AF582E434F7F583D00A\r
+:100F9B00E0F00AEAC0E090F409E0FBD0E0C39B402C\r
+:100FAB00D3740290F773F090F409E090F408F0908A\r
+:100FBB00F409E090F40AF0E0C0E090F40CE0FAD011\r
+:100FCB00E0C39A500302110C020F4CE06402600361\r
+:100FDB0002110C90F655E024FD90F409F07A008094\r
+:100FEB002B8A82A882E82456F582E434F6F583E056\r
+:100FFB00C0E090F408E0FCE82CF8E43400F9E824B5\r
+:10100B007AF582E934F7F583D0E0F00AEAC0E09094\r
+:10101B00F409E0FBD0E0C39B40C7E0FA90F408E092\r
+:10102B002AF090F409E0FA90F40AE02AF090F40820\r
+:10103B00E0C394F7509290F40AE0C0E090F40CE017\r
+:10104B00FAD0E0C39A500302110C020FD390F6575B\r
+:10105B00E0F990F656E0F874AB68700374AB697006\r
+:10106B001C740190F40DF0E490F40EF0740190F404\r
+:10107B000FF0E490F402F090F401020C9EE490F473\r
+:10108B000D020C9E90F40DE0607790F410E4F0A349\r
+:10109B00F090F40FF090F40EE004020C9E90F40D1F\r
+:1010AB00E0605E90F410E090F656F090F411E09052\r
+:1010BB00F657020C9E90F40DE0604690F656E0F564\r
+:1010CB000890F657E0FA90F658E0F9EAFEE9FF12BD\r
+:1010DB0008D0EEFAEFFB12098BE964FF7023750A57\r
+:1010EB0032750B57780A1207D57900AB0874FF24B9\r
+:1010FB0000FCE43BFDEEFAEFFB1209B4740212069E\r
+:10110B0049740190F677F0740690F654F07F08025C\r
+:10111B0006EAC082C08375C6B074D390DF00F0744A\r
+:10112B009190DF01F0740490DF03F0E490DF05F0A1\r
+:10113B0090DF06F0740790DF12F0E490DF2FF09051\r
+:10114B00DF30F090DF31F0759100D083D08222C078\r
+:10115B0082C08375C6B8439190E59175E25575E5EC\r
+:10116B004475E402D2B912686390F412E090DF0880\r
+:10117B00F0740190F402F0D083D08222C082C0833D\r
+:10118B0012645EC2B975E40075E255124899E49099\r
+:10119B00F402F0D083D08222C0E074F212072290C6\r
+:1011AB00F402E060051263BD801F90F401E060055E\r
+:1011BB00121793801490F40DE0600512483D8009DE\r
+:1011CB0090F403E06003125C2C7F01020781C0E006\r
+:1011DB0074F212072290F402E0600512636B80092F\r
+:1011EB0090F40DE060031247307F01020781C0E0ED\r
+:1011FB0074F2120722C2C153E40FE5E490F607E044\r
+:10120B00601590F608E0700F1248C3E97003740183\r
+:10121B00F090F60FE004F07F01020781C0E074F25A\r
+:10122B0012072290F403E0603990F873E0F8A3E022\r
+:10123B00F9E87001E9602B90F871E02401F0A3E06C\r
+:10124B003400F090F871E0687003A3E069701390BC\r
+:10125B00F871E4F0A3F090F873F0A3F0740190F838\r
+:10126B0075F0C2DB1259937F010207810022C0E0A7\r
+:10127B0074F21207221212777F01020781C0E07409\r
+:10128B00F21207221212777F01020781C0E074F27B\r
+:10129B001207221212777F01020781C0E074F2124B\r
+:1012AB0007221212777F01020781C0E074F2120746\r
+:1012BB00221212777F01020781C0E074F21207221B\r
+:1012CB001212777F01020781C0E074F2120722121B\r
+:1012DB0012777F01020781C0E074F212072212120B\r
+:1012EB00777F01020781C0E074F212072212127796\r
+:1012FB007F01020781C0E074F21207221212777F7E\r
+:10130B0001020781C0E074F21207221212777F01EB\r
+:10131B0002078174F112068A74FA12063390F9B23D\r
+:10132B00780812052B740190F417F07AFD7B1412D8\r
+:10133B0027B97402C0E0740112067ED0E0F0AC82D3\r
+:10134B00AD837A0A7903122AA0C290805390F414C9\r
+:10135B00E0704D740212067E780812053A74021280\r
+:10136B00067EC082C08390F9B6780812052BD08315\r
+:10137B00D08278081204DF740212067EC082C0830A\r
+:10138B0090F9BA780C12052BD083D082780C12030B\r
+:10139B0064400D639001E59090F9B2780812052B2B\r
+:1013AB0090F416E0603190F414E0702B7A137BF418\r
+:1013BB001227E6E970F6740290F417F0D29090F4CD\r
+:1013CB0014E004F0A2AFE492E0FAC2AF90F416E09E\r
+:1013DB0014F0EAA2E092AF90F415E070030214C887\r
+:1013EB00851082851183AC82AD837A387BF490F4BF\r
+:1013FB0013E0F9122A36E960030214C885108285BE\r
+:10140B001183E064047029639001E590750C0475F9\r
+:10141B000D00780C1207D57C387DF47A187BF4120A\r
+:10142B006958740212064990F417E0D2E40214C70B\r
+:10143B00E064026008E0641360030214C863900167\r
+:10144B00E59090F438E01208170102C8145E14936B\r
+:10145B0014931490F417E0A2E65008E0C2E6F0747F\r
+:10146B0013800E740190F418F0745590F419F07405\r
+:10147B0002851082851183F0E0FC7A187BF490F4DE\r
+:10148B0013E0F912285C803590F407E0702F7A0096\r
+:10149B00801F8A82A882E82438F582E434F4F5832D\r
+:1014AB00E0C0E0E82418F582E434F4F583D0E0F0F2\r
+:1014BB000AEAC3941340DB740190F407F090F4171D\r
+:1014CB00E0A2E54003021358539AFE75910075E9AB\r
+:1014DB0000E490F413F090F414F090F416F090F400\r
+:1014EB0015F090F5A1F0C29074061206497F080220\r
+:1014FB0006EAC082C083E9600590F415800390F47E\r
+:10150B0016E004F07900D083D0822274F712068A99\r
+:10151B0075082175090078081207D57C007D007AC3\r
+:10152B00597BF4126A3F740212064990DF36E0547D\r
+:10153B00EF64016004C2AF80FE90DF37E0C3940319\r
+:10154B005004C2AF80FE53BEFBE5BEA2E650FA5379\r
+:10155B00C6BF43BE0474F4F5D575D480743C90DFDC\r
+:10156B0013F0741490DF14F0741E90DF02F0740506\r
+:10157B0090DF04F0745090DF2EF0740990DF25F0AB\r
+:10158B0090DF07F090F412E090DF08F0741290DF18\r
+:10159B0009F0741490DF0AF0747A90DF0BF0746B1F\r
+:1015AB0090DF0CF074A390DF0DF0741390DF0EF04E\r
+:1015BB00742390DF0FF0741190DF10F0744390DF01\r
+:1015CB0011F0741D90DF15F0741C90DF16F074C7CA\r
+:1015DB0090DF17F0E490DF18F074B090DF19F0741F\r
+:1015EB00B690DF1AF0741090DF1BF074EA90DF1CDA\r
+:1015FB00F0742A90DF1DF0E490DF1EF0741F90DF73\r
+:10160B001FF0748190DF23F0743590DF24F07402A7\r
+:10161B0090F458F07900121B8D7E007F0075E1026B\r
+:10162B0075081475090590DF3CE0545070237A401F\r
+:10163B007B001219A5E50824C0F508E50934FFF570\r
+:10164B0009C3E5089401E5099400A2D265D0335093\r
+:10165B00D57A008013EEC333FEEF33FF90DF3AE011\r
+:10166B00A2E0E492E04EFE0AEAC3941040E77480D5\r
+:10167B004EF5BCEFF5BC12196090F47C7436F0A3F8\r
+:10168B00E4F090F47E74E2F0A37404F0439A01D278\r
+:10169B00AF7F020206EA74F712068AEAFEEBFF89B5\r
+:1016AB000975080090F458E064017004C2AF80FE25\r
+:1016BB00121960EF90F480F0EE90F481F074DF90EB\r
+:1016CB00F482F074D990F483F0742090F484F07465\r
+:1016DB002190F485F0741390F486F0744190F487A4\r
+:1016EB00F0E509701143D60175E103E5E9A2E45079\r
+:1016FB00FA53E9EF8068740165096004C2AF80FE9C\r
+:10170B007509048008121960121ACA150943D6010B\r
+:10171B0075E10290DF3BE0640D70F87E147F05905D\r
+:10172B00DF3CE05450701D7A407B001219A5EE246B\r
+:10173B00C0FEEF34FFFFC3EE9401EF9400A2D2651D\r
+:10174B00D03350DB75E10390DF3BE0640D6008E5BF\r
+:10175B00E9A2E450FA809AE50970AA7508011219FA\r
+:10176B006090F458E0640370031218D7A9087F0245\r
+:10177B000206EAC082C08390F459EAFCEBFD7421A7\r
+:10178B00120556D083D0822274F712068A90F45831\r
+:10179B00E064036004C2AF80FEE5E9A2E45035E5E6\r
+:1017AB00E9A2E6502F53E9EF53E9BF539BFCE59BAE\r
+:1017BB0012196075081F75090078081207D57C008F\r
+:1017CB007D007A597BF4126A3F7402120649121893\r
+:1017DB00D702186A53E9EF539BFCE59B750802751A\r
+:1017EB00090078081207D590F459E0042459FCE459\r
+:1017FB0034F4FD7A787BF41269A07402120649E086\r
+:10180B00FA90F479E0A2E7503B8A0874012508F8B6\r
+:10181B00E43400F9E89420E99400C365D0335024F4\r
+:10182B00EAC3940B401E7A5A7BF4121BF5E9701431\r
+:10183B0090F478E0F9121B38E9F090F479E0C2E704\r
+:10184B00F0122D5E75081F78081207D57C007D00FD\r
+:10185B007A597BF4126A3F740212064943D6017F10\r
+:10186B00020206EA74F812068A90F458E0640160EA\r
+:10187B0013A2AFE492E0FEC2AF1219857401F0EE31\r
+:10188B00A2E092AF7F010206EAC082C083E5C6A246\r
+:10189B00E65004C2AF80FE90F458E06401702274ED\r
+:1018AB00EA90DF1CF0742A90DF1DF0E490DF1EF04D\r
+:1018BB00740290F458F075E10490DF3BE064017022\r
+:1018CB00F8D083D0822243B404A9BC2274F7120649\r
+:1018DB008A74DF90F480F074D990F481F074F490F2\r
+:1018EB00F482F0745990F483F0748090F484F07463\r
+:1018FB002190F485F0741390F486F0741190F487B2\r
+:10190B00F075D68175081F75090078081207D57C0C\r
+:10191B00007D007A597BF4126A3F74021206494328\r
+:10192B00D601539BFCE59B53E9EF75E10243911004\r
+:10193B007F020206EAC082C08390F458E064017013\r
+:10194B0004C2AF80FEE0640360067403F01218D784\r
+:10195B00D083D08222C082C0835391EF75E1049073\r
+:10196B00DF3BE0640170F875D68153D1FE539BFCCD\r
+:10197B00E59B53E9EFD083D08222C082C08390F4E1\r
+:10198B0058E064017004C2AF80FEE064037006127D\r
+:10199B0019607402F0D083D0822274F712068A8AFF\r
+:1019AB00088B0974047808120611AE08AF09EA70A7\r
+:1019BB0001EB6028A2AFE492E0F508C2AF7A107B8E\r
+:1019CB00001208ACE508A2E092AFEEF8EFF974FF55\r
+:1019DB00281E74FF39FFE87001E970D87F020206F8\r
+:1019EB00EA74F712068A8A088B09740478081206BF\r
+:1019FB0011AE08AF09EA7001EB602EA2AFE492E0E2\r
+:101A0B00F508C2AF7A107B001208ACE508A2E09291\r
+:101A1B00AF90F47AE07012EEF8EFF974FF281E74B1\r
+:101A2B00FF39FFE87001E970D27F020206EA74F811\r
+:101A3B0012068AEAFEEB800E7AF47B011219A5EEF0\r
+:101A4B0024FF1EEF34FFFFEE7001EF70EB7F0102FE\r
+:101A5B0006EA74F812068A90F47CE0FEA3E0FFA27B\r
+:101A6B00AFE492E0FAC2AF740190F47BF0EAA2E02B\r
+:101A7B0092AF8008EE24FF1EEF34FFFFEE7001EFF4\r
+:101A8B00600D7AF47B011219EC90F47AE060E5A218\r
+:101A9B00AFE492E0FAC2AFE490F47AF090F47BF00A\r
+:101AAB00EAA2E092AF7F010206EAC082C08390F403\r
+:101ABB007BE06006740190F47AF0D083D0822274BC\r
+:101ACB00F812068A1218D1E9540F04FF7E00800C1D\r
+:101ADB0090F47EE0FAA3E0FB1219A50EEEC39F4033\r
+:101AEB00EF7F010206EA74F812068A90F458E0645C\r
+:101AFB00036004C2AF80FE7E147F0590DF3CE05490\r
+:101B0B0050701D7A407B001219A5EE24C0FEEF34F5\r
+:101B1B00FFFFC3EE9401EF9400A2D265D03350DBEC\r
+:101B2B0090DF3AE0F9121B387F010206EAC008C0C9\r
+:101B3B0009E9C39480E94019F879FF7A027B001216\r
+:101B4B0005B08808890974B72508F874FF35098032\r
+:101B5B000BC313F874B728F874FF3400F9C3E89477\r
+:101B6B0080E994FFA2D265D03350027880E8F9D097\r
+:101B7B0009D00822C082C08390F458E0F9D083D0FA\r
+:101B8B00822274F712068A8908E9C394044004C2BE\r
+:101B9B00AF80FE121960E50824C2F582E434F9F532\r
+:101BAB0083E090DF06F090F458E0640370031218A2\r
+:101BBB00D77F020206EA74F712068A8908E9C394F2\r
+:101BCB00034004C2AF80FE121960E50824C6F582FB\r
+:101BDB00E434F9F583E090DF2EF090F458E06403E1\r
+:101BEB0070031218D77F020206EA74F812068A9065\r
+:101BFB00F488E07004790080487E007D007C0080D2\r
+:101C0B002E8C82A882EA28F582EB3400F583E0FF64\r
+:101C1B00E824C9F582E434F9F583E06F70010EE82E\r
+:101C2B0024BEF582E434F9F583E06F70010D0CEC02\r
+:101C3B00C3940440CC74046D60BB74046E60B679BD\r
+:101C4B00017F010206EA74F712068AEAFEEBFF75C2\r
+:101C5B00082C75090078081207D57C007D007ACE18\r
+:101C6B007BF9126A3F7402120649740290F9CEF0A6\r
+:101C7B00743D90F9CFF0742090F9D0F0740190F985\r
+:101C8B00D1F01234FFEEFAEFFB122C0112244112A9\r
+:101C9B0034FB124232EEFAEFFB1237D512408712A9\r
+:101CAB003B5F12430490F9EEE070347402F074035E\r
+:101CBB0090F9EFF0743F90F9F7F090F9F8F074FFAA\r
+:101CCB0090F9F9F075080478081207D5123599EADE\r
+:101CDB00FCEBFD7AF17BF912695874021206497913\r
+:101CEB00007F020206EAC082C0837B0080010BEBFF\r
+:101CFB00C394025014EB75F00CA424E2F582E5F0CA\r
+:101D0B0034F9F583E0640260E574026B70067A00C7\r
+:101D1B007B00801AEB75F00CA424E2F582E5F0341D\r
+:101D2B00F9F583AA82AB83121D3EAA82AB83D083C3\r
+:101D3B00D08222C082C08374FF120633E48A828B66\r
+:101D4B0083A3A3A3A3A3A3A3A3A3A3F074028A8235\r
+:101D5B008B83F090F9D1E0C0E0EA240BF582EB34F1\r
+:101D6B0000F583D0E0F090F9D1E004F0E0F960F6F3\r
+:101D7B0074FF6960F1851082851183AA82AB83128F\r
+:101D8B002284E970E17401120649D083D08222C00B\r
+:101D9B0082C083E48A828B83F0D083D08222C0827C\r
+:101DAB00C08374FF120633851082851183AA82AB20\r
+:101DBB0083122284E96014E075F00CA424E2F5820E\r
+:101DCB00E5F034F9F583E0640260067582007583F3\r
+:101DDB0000AA82AB837401120649D083D08222748D\r
+:101DEB00F312068A8A088B09890A7EE27FF97A0048\r
+:101DFB00800A7A01EE240CFEEF3400FFEA70478E66\r
+:101E0B00828F83E0640270EA750C04750D00780C08\r
+:101E1B001207D5AC08AD09EE2403FAEF3400FB1220\r
+:101E2B0068FF7402120649EA7001EB70C58E828F4F\r
+:101E3B0083A3A3A3A3A3A3A3A3A3A3E0650A70B245\r
+:101E4B00EEFAEFFB80047A007B007F060206EA7A4B\r
+:101E5B00D27BF92274F312068A8A0A8B0B7508005F\r
+:101E6B007509007EE27FF97A00800E8E088F097A61\r
+:101E7B0001EE240CFEEF3400FFEA703D8E828F835F\r
+:101E8B00E064026005E0640170E1750C04750D00FF\r
+:101E9B00780C1207D5E50A2405FCE50B3400FDEEA2\r
+:101EAB002403FAEF3400FB1268FF7402120649EAAE\r
+:101EBB007001EB70BA7900803AE5087002E50960B1\r
+:101ECB00F47401850882850983F0750C04750D0087\r
+:101EDB00780C1207D5E50A2405FCE50B3400FDE56B\r
+:101EEB00082403FAE5093400FB1269587402120640\r
+:101EFB004979017F060206EA74F512068A8A088B75\r
+:101F0B00097EE27FF97A00800A7A01EE240CFEEF5B\r
+:101F1B003400FFEA70418E828F83E0640170EA75B2\r
+:101F2B000A04750B00780A1207D5E5082405FCE5B1\r
+:101F3B00093400FDEE2403FAEF3400FB1268FF7442\r
+:101F4B0002120649EA7001EB70BFEEFAEFFB121DAD\r
+:101F5B003EEEFAEFFB80047A007B007F040206EA78\r
+:101F6B00C082C083E98A828B836001A3A3A3A3A34E\r
+:101F7B00A3A3A3A3A3E0FCEC60078A828B83E0708E\r
+:101F8B000479028008ECC3942040F67900D083D00A\r
+:101F9B00822274F112068A8A0C8B0D8C0E8D0F7EA9\r
+:101FAB00E27FF98A828B83A3A3A3A3A3A3A3A3A3F7\r
+:101FBB00E0543FF509750800800A0508EE240CFE75\r
+:101FCB00EF3400FFE508C3940240030220998E8290\r
+:101FDB008F83E0640270E3A3A3A3A3A3A3A3A3A390\r
+:101FEB00E0650970D5743F6509602B750A04750BA4\r
+:101FFB0000780A1207D5E50C2405FCE50D3400FD2D\r
+:10200B00EE2403FAEF3400FB1268FF740212064948\r
+:10201B00EA7001EB70A4750801EE240BF582EF3426\r
+:10202B0000F583E0850E82850F83F0743F650960B0\r
+:10203B0056E50C240AF582E50D3400F583E0A2E7A2\r
+:10204B0050198E828F83A3A3A3A3A3A3A3A3A3A39C\r
+:10205B00E0F9AA0CAB0D123115802CE0A2E350274E\r
+:10206B00EE2402F8EF3400F988828983E0FAE50C5C\r
+:10207B00240BF582E50D3400F583E06A7006E488E5\r
+:10208B00828983F0750800121AB5A90880027900BD\r
+:10209B007F080206EA74F112068A74FF120633896E\r
+:1020AB00088A0E8B0F7EE27FF9750A01750B00789B\r
+:1020BB000A1207D57C007D00740212067EAA82AB41\r
+:1020CB0083126A3F74021206497A00805D750C0414\r
+:1020DB00750D00780C1207D5E50E2403FCE50F34C3\r
+:1020EB0000FDEE2403FAEF3400FB1268FF740212BA\r
+:1020FB000649EA7001EB70287401C0E0850A8285FD\r
+:10210B000B83E0F8851082851183E58228F8E5833F\r
+:10211B003400F974E028F58274FF39F583D0E0F0D0\r
+:10212B007A01EE240CFEEF3400FFEA7069E50E6EC7\r
+:10213B007003E50F6F60E98E828F83E0640270E0BD\r
+:10214B00EE2409F50AEF3400F50B850A82F583E0DE\r
+:10215B00C3943E50CB7401650860030220D890F9FC\r
+:10216B00CFE0C0E0850A82850B83E0FAD0E0C39A0A\r
+:10217B0050AE7401C0E0E0F8C3E498F8E49400F9C1\r
+:10218B00851082851183E58228F8E58339F9743D42\r
+:10219B0028F582E4808479007A0080027A01EA7063\r
+:1021AB0015851082851183E070F274026508700446\r
+:1021BB0079208002793D74026508701790F9CFE0A1\r
+:1021CB00C399400B90F9D0E0C399501FE9801B795C\r
+:1021DB00008018E9C0E090F9D0E0FAD0E0C39A4053\r
+:1021EB00EE90F9CFE0697003E014F0E9850E82857B\r
+:1021FB000F83A3A3A3A3A3A3A3A3A3F0740112060A\r
+:10220B00497F080206EA74F512068AEAFEEBFF75AF\r
+:10221B0008028C0AEE250AFAEF3400FB740C2AF53F\r
+:10222B0082E43BF583E0A2E750488D08EE2508FADF\r
+:10223B00EF3400FB740C2AF582E43BF583E0697004\r
+:10224B002E75080475090078081207D5123545EA72\r
+:10225B00FCEBFD8E828F83A3AA82AB831268FF7483\r
+:10226B0002120649EA7001EB7005750800800375D0\r
+:10227B000801A9087F040206EA74F812068A7CE2B8\r
+:10228B007DF97E0080090EEC240CFCED3400FDEE94\r
+:10229B00C3940250218C828D83E0640270E8EC249D\r
+:1022AB000BF582ED3400F583E06970DAEE8A828BF0\r
+:1022BB0083F07901800279007F010206EA74F31240\r
+:1022CB00068A8A0C8B0D89097EE27FF975080080DE\r
+:1022DB000A0508EE240CFEEF3400FFE508C3940258\r
+:1022EB0050478E828F83E0640270E6750A04750B8B\r
+:1022FB0000780A1207D5EE2403FCEF3400FDAA0C7C\r
+:10230B00AB0D1268FF7402120649EA7001EB70C143\r
+:10231B008E828F83A3A3A3A3A3A3A3A3A3A3E065ED\r
+:10232B000970AEEEFAEFFB80047A007B007F0602A9\r
+:10233B0006EAE9FB7900EA6B601FEBC39A500EEAE1\r
+:10234B00C394FD4006EBC39403400E0922EBC394E8\r
+:10235B00FD4006EAC3940340F22274F512068AECA0\r
+:10236B00FEEDFF890A890875090078081207D5EA7E\r
+:10237B00FCEBFDEEFAEFFB1269A07402120649E5C5\r
+:10238B000A1208170202BF239923BF23AD238E82A3\r
+:10239B008F83E0F8A3E0F98E828F83E8F0A3E9F056\r
+:1023AB0080128E828F83780812052B8E828F837812\r
+:1023BB000812053A7F040206EA74F512068A74FACB\r
+:1023CB00120633EAFEEBFFECFAEDFBE912081702FB\r
+:1023DB0002E423EA23E4230624EEFCEFFD80388E8F\r
+:1023EB00828F83E0FCA3E0FD851082851183ECF0E6\r
+:1023FB00A3EDF085108285118380188E828F8378F0\r
+:10240B000812052B740212067E780812053A740224\r
+:10241B0012067EAC82AD8389087509007808120715\r
+:10242B00D51269A0740212064974061206497F047C\r
+:10243B000206EA79022274F712068A7508D2750928\r
+:10244B000078081207D57C007D007A897BF4126A2C\r
+:10245B003F740212064975084678081207D57C00AE\r
+:10246B007D007A5B7BF5126A3F74021206497F028C\r
+:10247B000206EA74F512068A7C007D007E007F005E\r
+:10248B00780074016970097A897BF47509068007F5\r
+:10249B007A5B7BF575090274012509F50A880880BA\r
+:1024AB000EEAFEEBFF0508EA2423FAEB3400FBE50A\r
+:1024BB0008C3950950298A828B83E0601B740169DC\r
+:1024CB0070E308E0640460DDA3E0C3950A50D6EA2C\r
+:1024DB00FCEBFDE0F50A80CD74026970C48031EE2F\r
+:1024EB007001EF701EEC7001ED70067A007B0080BE\r
+:1024FB001FECFEEDFF8E828F83A3E0FA122520E501\r
+:10250B000880087401288E828F83A3F0EEFAEFFB0C\r
+:10251B007F040206EAC082C083740169703A78892D\r
+:10252B0079F4A2AFE492E0FDC2AF7B00801F8882FA\r
+:10253B008983E0600FA3EAC0E0E0FCD0E0C39C50CD\r
+:10254B0003E014F00BE82423F8E93400F9EBC3940F\r
+:10255B000640DBEDA2E092AFD083D0822274F11261\r
+:10256B00068A74F61206338A0C8B0D8C09740412CE\r
+:10257B00067EE4F0A3F0851082851183F0A3F0743E\r
+:10258B000212067EE4F0A3F0740169702E7E897F3F\r
+:10259B00F4750E078A828B83E064017052A3E0F915\r
+:1025AB00121DA9851082851183EAF0A3EBF085102B\r
+:1025BB0082851183E07002A3E070077A007B000232\r
+:1025CB0027A0851082851183E0F8A3E0F58388822C\r
+:1025DB00A3A3A3A3A3A3A3A3A3E0F50885108285BC\r
+:1025EB001183E02403F8A3E03400F974088049E078\r
+:1025FB007006A3E0F5088048E0640270BEA3A882D1\r
+:10260B00A983E0240EFAA3E03400FB8A828B83E0DB\r
+:10261B00F50888828983E02405FAA3E03400FB7473\r
+:10262B000812067EEAF0A3EBF088828983E0240F80\r
+:10263B00F8A3E03400F9740212067EE8F0A3E9F087\r
+:10264B007401650970057509018003750903750F20\r
+:10265B0000800FEAA2E092AF050FEE2423FEEF34C9\r
+:10266B0000FFE50FC394064003022796A2AFE49246\r
+:10267B00E0FAC2AF8E828F83E0650970D67404F0E6\r
+:10268B00EAA2E092AFEE240BF582EF3400F583E083\r
+:10269B00543F6508600302278E850C82850D83E00D\r
+:1026AB0064017019743F6508700E85108285118363\r
+:1026BB00E02403F8A3E0800FEE24078008E0640217\r
+:1026CB007012EE2403F8EF3400F9740612067EE85C\r
+:1026DB00F0A3E9F0750A04750B00780A1207D5749C\r
+:1026EB000A12067EE0FCA3E0FD740812067EE0FAF7\r
+:1026FB00A3E0FB1268FF7402120649850C82850D5C\r
+:10270B0083E06040740212067EE07002A3E0700367\r
+:10271B00EA6031740212067EE07002A3E060647816\r
+:10272B000A1207D5EE2407FCEF3400FD74041206E1\r
+:10273B007EE0FAA3E0FB1268FF7402120649EA700E\r
+:10274B0001EB703F8E828F83A3AA82AB83E0C3958C\r
+:10275B000E5030740412067EE07002A3E060107419\r
+:10276B000412067EE0F8A3E0F5838882E509F08A7F\r
+:10277B00828B83E0F50E740412067EEEF0A3EFF06D\r
+:10278B000226638E828F83E50980F4740412067E21\r
+:10279B00E0FAA3E0FB740A1206497F080206EA740A\r
+:1027AB00016970057A897BF4227A5B7BF52274F8D8\r
+:1027BB0012068AEAFEEBFF90F5A1E07013121516D4\r
+:1027CB00EEFAEFFB121C51E9700C1218941219401F\r
+:1027DB007401F0123A4F7F010206EA74F712068A6F\r
+:1027EB008A828B83121B7FE9F509790012401574DD\r
+:1027FB00036509600C7401650970031218941219B2\r
+:10280B00407E007F00800F7A0A7B00121A39EE247B\r
+:10281B00010EEF3400FFC3EE94F4EF940150091254\r
+:10282B003FBCE9FA8A0860DF74036509600E740126\r
+:10283B006509700512186F8003121985E508700978\r
+:10284B00790112401579018003F079007F020206AD\r
+:10285B00EA74F712068A75080075090078081207E2\r
+:10286B00D512287974021206497F020206EA74F126\r
+:10287B0012068A74FC120633740212067EEAF0A367\r
+:10288B00EBF089088C09741312067EE0FEA3E0FFBF\r
+:10289B00121DA98A0C8B0D750B02121B7FE985107B\r
+:1028AB0082851183F0750A00E50C7002E50D600F4F\r
+:1028BB007901AA0CAB0D121F6BE9FA8A0B600302AC\r
+:1028CB002A2A740212067EE07002A3E060F1E50989\r
+:1028DB00C3941450EAEE7001EF703D850C82850DA8\r
+:1028EB0083A3E0FDAC09740212067EE0FAA3E0FBC1\r
+:1028FB00850C82850D83A3A3A3A3A3A3A3A3A3A347\r
+:10290B00E0F9122C328A088B09AE08AF09EE700180\r
+:10291B00EF70627903022A2CEEA2E0505374FF652C\r
+:10292B0008604DE50C2402F50AE50D3400F50B7833\r
+:10293B000A1207D5850C82850D83A3E0FDAC0974C3\r
+:10294B000412067EE0FAA3E0FB850C82850D83A3BF\r
+:10295B00A3A3A3A3A3A3A3A3A3E0F9122D1D740206\r
+:10296B001206498A088B09AE08AF09750A01809DCA\r
+:10297B007902022A2CEE2403F50EEF3400F50F75C5\r
+:10298B00080475090078081207D5E50C2403FCE54B\r
+:10299B000D3400FDAA0EAB0F1269587402120649D2\r
+:1029AB00740112067EAC82AD83AA0EAB0F123A52A3\r
+:1029BB00EA7001EB600B74038E828F83F0790080D9\r
+:1029CB00607901EEFAEFFB1230B9E9F50B7050E5C7\r
+:1029DB000A604C851082851183E06403600BE06410\r
+:1029EB00017003121894121940121A5DE06403600F\r
+:1029FB000DE06401700512186F8003121985A2AFE8\r
+:102A0B00E492E0FAC2AFE50C2402F582E50D340046\r
+:102A1B00F583E06005E4F0750B0CEAA2E092AFA938\r
+:102A2B000B74041206497F080206EA74F312068A35\r
+:102A3B0074FD120633890AEAFEEBFF8C088D09122E\r
+:102A4B001DA97902EA7001EB60411919121F6BE99C\r
+:102A5B0070397401851082851183F012067EE50AA8\r
+:102A6B00F0750A00750B00780A1207D5780A120761\r
+:102A7B00D578081207D5EEFCEFFD740612067EAA78\r
+:102A8B0082AB83122D927406120649740312064907\r
+:102A9B007F060206EA74F112068A89088A09ECFE9F\r
+:102AAB00EDFF90F5A1E0700B122BE4E970057902B4\r
+:102ABB00022BDFE50812081702080C2B6F2B8D2B4E\r
+:102ACB00982B5A2B4F2B9F2BC82B402BD92A750891\r
+:102ADB00008E828F83E0702FE5097014A3780C129F\r
+:102AEB00052BAA0CAB0DAC0EAD0F123BB8022BDDB8\r
+:102AFB0074016509700BA3AA82AB83123BDC022B1A\r
+:102B0B00DD750802022BDDE0640170F5E509701438\r
+:102B1B00A3780C12052BAA0CAB0DAC0EAD0F123813\r
+:102B2B0030022BDD7401650970D7A3AA82AB831227\r
+:102B3B003854022BDDEEFAEFFBA90912243EE9F51E\r
+:102B4B0008022BDDEEFAEFFBA9091237A780EF7411\r
+:102B5B000165096004E50970A8EEFAEFFBA90912FB\r
+:102B6B00376380DA740365097009EEFAEFFB1235EF\r
+:102B7B009E80CB740265097088EEFAEFFB12362A41\r
+:102B8B0080BCEEFAEFFBA90912369B80B1A90912A2\r
+:102B9B00375280AA740165096003022B0C75080477\r
+:102BAB0075090078081207D512355EEAFCEBFDEECD\r
+:102BBB00FAEFFB1269587402120649801274016510\r
+:102BCB00096003022B0C123563E98E828F83F0753B\r
+:102BDB000800A9087F080206EAC082C083E9120830\r
+:102BEB004D000205F62B0AF62BFA2B7901800279A0\r
+:102BFB0000D083D08222C082C083E490F5A5F0740C\r
+:102C0B002090F5A6F090F5A7EAF0A3EBF01235456E\r
+:102C1B0090F5A3EAF0A3EBF01218D1E990F5A2F02E\r
+:102C2B0060F6D083D0822274F112068A89088A0E4C\r
+:102C3B008B0F8C0A8D09790212247E8A0C8B0DA8BE\r
+:102C4B000CA90DE8FEE9FFE87001E970077A007B3B\r
+:102C5B0000022D18740B250A8E828F83A3A3F0EE2E\r
+:102C6B00240BF8EF3400F988828983E0C2E6F0E0A8\r
+:102C7B0054C04508F090F5A2E0C0E0EE240DF582BB\r
+:102C8B00EF3400F583D0E0F090F5A2E004F0E060C3\r
+:102C9B00F7EE240CFAEF3400FB90F5A5C082C0834D\r
+:102CAB008A828B83E054BFD083D082FCE04C8A8233\r
+:102CBB008B83F0E054F84509F0E0C2E7F0E0C2E3A3\r
+:102CCB00F088828983E0C2E7F0750B00780A12075F\r
+:102CDB00D5AC0EAD0FEE240E0A0AEF3400FB1269D1\r
+:102CEB005874021206497508047509007808120712\r
+:102CFB00D590F5A3E0FCA3E0FDEE2407FAEF34003A\r
+:102D0B00FB1269587402120649EEFAEFFB7F0802B8\r
+:102D1B0006EA74F712068A740912067EE0FEA3E037\r
+:102D2B00FF122C32EA7001EB70067A007B00801EDA\r
+:102D3B00EA240DF582EB3400F583E08E828F83F06D\r
+:102D4B00EA240CF582EB3400F583E0D2E7F07F0246\r
+:102D5B000206EA74F712068A790112247E8A088B1E\r
+:102D6B0009A808A909E8FEE9FFE87001E96013EE7C\r
+:102D7B0024020A0AEF3400FB12177EEEFAEFFB1265\r
+:102D8B002EE77F020206EA74F112068A74FE12061F\r
+:102D9B0033851082851183ECF0A3EDF08A0C8B0D3B\r
+:102DAB00741112067EE0F50AA3E0F50B74151206FA\r
+:102DBB007EE0F50EA3E0F50FE4850A82850B83F028\r
+:102DCB007C0179011225688A088B09AE08AF09EEE0\r
+:102DDB007001EF7003022EDB750800750900850C7E\r
+:102DEB0082850D83E064017015A3E0F9121DA98A99\r
+:102DFB00088B09EA7001EB70057902022EDD8E82D9\r
+:102E0B008F83A3A3E024F5850A82850B83F0E0F57D\r
+:102E1B000A750B00780A1207D5EE240EFCEF34006E\r
+:102E2B00FD740212067EE0FAA3E0FB1269587402ED\r
+:102E3B00120649E5087002E5096033EE2421F5829C\r
+:102E4B00EF3400F583E0850882850983A3A3A3A350\r
+:102E5B00A3A3A3F0EE2422F582EF3400F583E085E3\r
+:102E6B000882850983A3A3A3A3A3A3A3A3F074132D\r
+:102E7B0012067EE07002A3E0602575080475090058\r
+:102E8B0078081207D5EE2407FCEF3400FD741512F9\r
+:102E9B00067EE0FAA3E0FB1269587402120649E5BC\r
+:102EAB000E7002E50F6014EE240CF582EF3400F582\r
+:102EBB0083E05407850E82850F83F08E828F83A368\r
+:102ECB00E0FA7901122520E48E828F83F0F98002DB\r
+:102EDB00790474021206497F080206EA74F312069B\r
+:102EEB008A74FE120633EAFEEBFFEE240BF582EF3B\r
+:102EFB003400F583E0543FF509750A04750B00782F\r
+:102F0B000A1207D590F5A3E0FCA3E0FDEE2407FA27\r
+:102F1B00EF3400FB1268FF7402120649EA7001EBF2\r
+:102F2B007010E48E828F83F074021206497F0602C2\r
+:102F3B0006EAEE240BF582EF3400F583E0A2E640BF\r
+:102F4B00E1E509603EC394075039EE2402FAEF34F1\r
+:102F5B0000FBE509C33324F8F582E434F9F583E08B\r
+:102F6B00F8A3E0F5838882120688E9FA74016A7087\r
+:102F7B0004740180AE74026A70A8EEFAEFFB123192\r
+:102F8B00EC80A5743F6509600EE509C3942040925F\r
+:102F9B00E509C3943F508BEE2403F50AEF3400F59B\r
+:102FAB000B750C04750D00780C1207D5AC0AAD0B24\r
+:102FBB0090F5A3E0FAA3E0FB1268FF740212064936\r
+:102FCB00EA7001EB70057508018003750800E508D0\r
+:102FDB007020743F65097073780C1207D512359900\r
+:102FEB00AD0BAC0A1268FF7402120649EA7001EBD2\r
+:102FFB007059851082851183AC82AD83EE2402FA61\r
+:10300B00EF3400FB121F9DE97003022F2DE50870B2\r
+:10301B0007EEFAEFFB1231EC74018E828F83F09086\r
+:10302B00F5A7E07002A3E07003022F3385108285B1\r
+:10303B001183E0F990F5A7E0F8A3E0F583888212FD\r
+:10304B000688E96003022F2D022F33740112067ECE\r
+:10305B00AC82AD83AA0AAB0B123A52EA7001EB6059\r
+:10306B0036EE2402FAEF3400FB1233DFE960030281\r
+:10307B002F2DEE240BF582EF3400F583E0A2E75001\r
+:10308B0003022F2DEE240CF582EF3400F583E0C202\r
+:10309B00E7F07403022F2EEE240CF582EF3400F5CB\r
+:1030AB0083E0543064206003022F85022F2D74F8C7\r
+:1030BB0012068AEAFEEBFFE9FAEE240CF8EF340075\r
+:1030CB00F990F5A6C082C08388828983E054CFD063\r
+:1030DB0083D082FBE04B88828983F0EAF9EE2402ED\r
+:1030EB00FAEF3400FB1216A1E97004790080027923\r
+:1030FB0009E48E828F83F07F010206EAC082C083CF\r
+:10310B0090F5A5E0F9D083D0822274F712068A7469\r
+:10311B00DF120633E9FEEA240BF582EB3400F5836C\r
+:10312B00E0FF90F5A5C082C08390F5A6C082C08356\r
+:10313B00740A12067EE054CFD083D082FCE04C544C\r
+:10314B00BFD083D082FCE04CC0E0740A12067ED064\r
+:10315B00E0F075080475090078081207D5EA240514\r
+:10316B00FCEB3400FD740312067EAA82AB8312695A\r
+:10317B0058740212064978081207D590F5A3E0FCA3\r
+:10318B00A3E0FD740712067EAA82AB831269587402\r
+:10319B0002120649740912067EE054C04EF0740BFD\r
+:1031AB00851082851183F0EFC0E0740B12067ED080\r
+:1031BB00E0F0740A12067EE05478F0E0440BF074F1\r
+:1031CB000912067EE0543FF0790085108285118349\r
+:1031DB00AA82AB831216A174211206497F02020642\r
+:1031EB00EA74F812068AEAFEEBFFEE240CF582EF86\r
+:1031FB003400F583E05407FA74FF2AFBEA6017E00A\r
+:10320B0054F84BF07A017B00121A397901EEFAEF80\r
+:10321B00FB1230B98006E48E828F83F07F010206A9\r
+:10322B00EA74F312068A74FD1206338A0C8B0D892D\r
+:10323B0008EA2508F8EB3400F9740C28F582E43918\r
+:10324B00F583E0F5097402851082851183F0740112\r
+:10325B0012067EEAF0A3EBF07C02851082851183C7\r
+:10326B00AA82AB8379011225688A0A8B0BA80AA95B\r
+:10327B000BE8FEE9FFE87001E96006EEFAEFFB8070\r
+:10328B006C79021227AA8A0A8B0BAE0AAF0B750850\r
+:10329B0000804F8E828F83E06403703C750A047547\r
+:1032AB000B00780A1207D5E50C2405FCE50D34005C\r
+:1032BB00FDEE2403FAEF3400FB1268FF74021206D2\r
+:1032CB0049EA7001EB7011EE240BF582EF3400F537\r
+:1032DB0083E0543F650960A30508EE2423FEEF3419\r
+:1032EB0000FFE508C3940240AA7A007B0074031226\r
+:1032FB0006497F060206EA74F512068A74DF120687\r
+:10330B0033EAFEEBFFEE240EF582EF3400F583E09B\r
+:10331B00F50890F5A5C082C083740A12067EE054AE\r
+:10332B008FD083D082FAE04A4420C0E0740A1206A0\r
+:10333B007ED0E0F0750A04750B00780A1207D5EE03\r
+:10334B002405FCEF3400FD740312067EAA82AB83C6\r
+:10335B001269587402120649780A1207D5EE240F27\r
+:10336B00FCEF3400FD740712067EAA82AB83126950\r
+:10337B00587402120649740912067EE054C04508BF\r
+:10338B00FAF0740B851082851183F090F5A2E0C0E2\r
+:10339B00E0740B12067ED0E0F090F5A2E004F0741E\r
+:1033AB000A12067EE05471F0E0D2E0F074BF5A448A\r
+:1033BB0080C0E0740912067ED0E0F079008510829F\r
+:1033CB00851183AA82AB831216A174211206497F41\r
+:1033DB00040206EA74F112068A8A0C8B0D8A828B20\r
+:1033EB0083E024F8F50979011227AA8A0A8B0BAE20\r
+:1033FB000AAF0B750800800A0508EE2423FEEF3494\r
+:10340B0000FFE508C3940640030234F48E828F83D9\r
+:10341B00E0640370E385098285820E8E82A3A3E0AC\r
+:10342B00F874F828F874FF3400F9E50E687001E9B8\r
+:10343B0070C6750A04750B00780A1207D5850C82C5\r
+:10344B00850D83A3AC82AD83EE2403FAEF3400FB2E\r
+:10345B001268FF7402120649EA7001EB709A780A3F\r
+:10346B001207D5E50C2405FCE50D3400FDEE240711\r
+:10347B00FAEF3400FB1268FF7402120649EA70017E\r
+:10348B00EB6003023403750A01780A1207D5E50CC9\r
+:10349B002409FCE50D3400FDEE240BFAEF3400FBA0\r
+:1034AB001268FF7402120649EA7001EB60030234E2\r
+:1034BB000374FE250EF50A74FF3400F50B780A121F\r
+:1034CB0007D5E50C240BFCE50D3400FDEE240DFABD\r
+:1034DB00EF3400FB1268FF7402120649EA7001EB2D\r
+:1034EB0060030234037901800279007F080206EA47\r
+:1034FB002279002274F712068A7508047509007880\r
+:10350B00081207D57C007D007AA97BF5126A3F74FF\r
+:10351B000212064990F5B1E0701B78081207D57CB2\r
+:10352B00067DFA7AAD7BF51269587402120649745E\r
+:10353B000190F5B1F07F020206EAC082C08390F5DC\r
+:10354B00B1E060067AAD7BF580047A067BFAD08316\r
+:10355B00D082227A0B7BFA2279022274F712068A26\r
+:10356B00790090F5B1E0702175080489097808128B\r
+:10357B0007D5EAFCEBFD7AAD7BF5126958740212A4\r
+:10358B000649740190F5B1F0F97F020206EA7ABEA2\r
+:10359B007BF92274F512068AEAFEEBFFEE2405F89E\r
+:1035AB00EF3400F988828983E012084D010506C2C9\r
+:1035BB00350103C235C6357D0180027D038E828FB6\r
+:1035CB0083A3A3A3A3E0FC8E828F83A3A3E0FAA320\r
+:1035DB00E0FB88828983E0F9122C328A088B09A9D7\r
+:1035EB0009EA7001E96031750A04750B00780A125B\r
+:1035FB0007D58E828F83E0FCA3E0FDEA24030A0A41\r
+:10360B000AE93400FB12695874021206497901AABF\r
+:10361B0008AB091230B9800279037F040206EA7401\r
+:10362B00F712068A74FD120633E485108285118326\r
+:10363B00F08A828B83A3A3A3A3A3E0C0E07401123F\r
+:10364B00067ED0E0F0EA2406F508EB3400F50978A5\r
+:10365B00081207D58A828B831207EAEA2404F5083D\r
+:10366B00EB3400F50978081207D58A828B83A3A364\r
+:10367B00E0FCA3E0FD740612067EAA82AB83122D3A\r
+:10368B0092740612064974031206497F020206EA77\r
+:10369B0074F512068AEAFEEBFF7508007404697074\r
+:1036AB000912198512186F02374B740569700912CC\r
+:1036BB00189412194002374B74066970398E828F39\r
+:1036CB0083E0F9121DA9EA7001EB70047902807294\r
+:1036DB00750A02750B00780A1207D5EA2407FCEB72\r
+:1036EB003400FD8E828F83A3AA82AB831269587438\r
+:1036FB0002120649804A740769700B121AF1E98E9F\r
+:10370B00828F83F0803A74086960A7740969700529\r
+:10371B00121985802B740A6970238E828F83E012B5\r
+:10372B0008170002D7363F373B3737377902800609\r
+:10373B00790180027900121BC1790080057508029E\r
+:10374B00A9087F040206EA740B69700479018002F0\r
+:10375B007902123AC679002274F712068AEAFEEB56\r
+:10376B00FF750802740169702075080475090078EB\r
+:10377B00081207D5123545EAFCEBFDEEFAEFFB120A\r
+:10378B00695874021206498009E97009123566E915\r
+:10379B006003750800A9087F020206EA74F7120697\r
+:1037AB008AE9FC8A828B83E0F9740E6C60047902DF\r
+:1037BB00801374FF6960F7121DA9EA7001EB60EECC\r
+:1037CB00121D9A79007F020206EA74F512068A909E\r
+:1037DB00F5B2C082C08390F9B2780812052BD08362\r
+:1037EB00D082780812034F701090FA0F78081205E8\r
+:1037FB002B90F5B2780812053A90F5B6EAF0A3EBE8\r
+:10380B00F01218D1E990F5B8F0123875123BB87474\r
+:10381B000190F5BBF0121E5A90F5B9EAF0A3EBF04C\r
+:10382B007F040206EA74F512068A8A088B098C0A51\r
+:10383B008D0B90F9B2780812034F600890F5B278AF\r
+:10384B000812053A7F040206EA74F512068AEA703A\r
+:10385B0001EB601190F5B2780812052B8A828B83ED\r
+:10386B00780812053A7F040206EA7AEF7BBE7CAD3C\r
+:10387B007DDE2274F312068A74F4120633EAFEEB31\r
+:10388B00FF8E828F83E0F874F528F874FF3400F90B\r
+:10389B00C3E89408E99400A2D265D0334018EE2413\r
+:1038AB0013F582EF3400F583E0F508123563E96513\r
+:1038BB00086003023A457904740112067EAC82ADAE\r
+:1038CB0083EE240EFAEF3400FB122365C082C08313\r
+:1038DB0090F5B2780812052BD083D08278081203AA\r
+:1038EB004F6003023A45740112067EAA82AB831223\r
+:1038FB003BDC7904740712067EAC82AD8374011233\r
+:10390B00067EAA82AB831223C4E4C0E0740B1206BA\r
+:10391B007ED0E0F07481C0E0740512067ED0E0F03A\r
+:10392B00EE240DF582EF3400F583E0C0E07406124F\r
+:10393B00067ED0E0F07D017C07740512067EAA821C\r
+:10394B00AB837903122C328A088B09A808A9098842\r
+:10395B000A890BE87001E97003023A45EE2405F57C\r
+:10396B0008EF3400F509750C04750D00780C12077F\r
+:10397B00D5AC08AD09EA24030A0A0AE93400FB12A4\r
+:10398B0069587402120649EE2412F582EF3400F5E1\r
+:10399B0083E06024EEFAEFFB121E5FE9601A90F5EC\r
+:1039AB00B6E07002A3E06010790090F5B6E0F8A3E2\r
+:1039BB00E0F58388821206888E828F83A3A3A3A34C\r
+:1039CB00A3A3A3A3A3A3E0A2E6506685108285114F\r
+:1039DB0083AC82AD83AA08AB09123A52EA7001EBB1\r
+:1039EB00704A90F5B9E0FEA3E0FF8E828F83E0C3AF\r
+:1039FB0094035046780C1207D5AC08AD098E828F14\r
+:103A0B0083E075F005A4F8A9F090F5B9E028FAA3C6\r
+:103A1B00E0398A82F583A3AA82AB831269587402B8\r
+:103A2B001206498E828F83E004F08005E0F9124282\r
+:103A3B00187900AA0AAB0B1230B9740C1206497F25\r
+:103A4B00060206EA79002274F112068A8A0E8B0F9F\r
+:103A5B008C088D0990F5B9E02401FEA3E03400FF3A\r
+:103A6B00750A00800A050AEE2405FEEF3400FF906C\r
+:103A7B00F5B9E0F8A3E0F5838882E0FAE50AC39A8A\r
+:103A8B005030750C04750D00780C1207D5AC0EADCB\r
+:103A9B000FEEFAEFFB1268FF7402120649EA70018F\r
+:103AAB00EB70C2850882850983E50AF0EEFAEFFB1D\r
+:103ABB0080047A007B007F080206EAC082C0837410\r
+:103ACB000169700474018001E490F5BBF0D083D0E0\r
+:103ADB008222C082C083EA240CF8EB3400F98A827C\r
+:103AEB008B83E0FC74F52CFC74FF3400FD74076CC5\r
+:103AFB007001ED7007740188828983F08882898355\r
+:103B0B00E06401700312387ED083D0822274F812E5\r
+:103B1B00068AEAFEEBFF7508007D017C0090F5B884\r
+:103B2B00E0F9122211E9FB7008121AB57508018031\r
+:103B3B001C74016B7005750802801274026B700D9A\r
+:103B4B0090F5BBE06007EEFAEFFB123ADDA9087FB8\r
+:103B5B00010206EA74F512068A90F5BCC082C08396\r
+:103B6B0090F9B2780812052BD083D0827808120313\r
+:103B7B004F701090FA13780812052B90F5BC78084B\r
+:103B8B0012053A1218D1E990F5C3F060F6750801E9\r
+:103B9B0075090078081207D57C007D007AC17BF58A\r
+:103BAB00126A3F74021206497F040206EA74F51288\r
+:103BBB00068A8A088B098C0A8D0B90F9B278081249\r
+:103BCB00034F600890F5BC780812053A7F04020693\r
+:103BDB00EA74F512068AEA7001EB601190F5BC7875\r
+:103BEB000812052B8A828B83780812053A7F040210\r
+:103BFB0006EA74F312068A74FD120633EAFEEBFF33\r
+:103C0B00750A08EE2405F508EF3400F509EE240ECD\r
+:103C1B00F582EF3400F583E0F9AA08AB091222C84C\r
+:103C2B00EA7001EB6006121D9A750A00748285100A\r
+:103C3B0082851183F0EE240DF582EF3400F583E0DD\r
+:103C4B00C0E0740112067ED0E0F0740212067EE52D\r
+:103C5B000AF07D037C03851082851183AA82AB83D6\r
+:103C6B007902122C328A0A8B0BA80AA90BE8FEE9FF\r
+:103C7B00FFE87001E9602A750A04750B00780A12D7\r
+:103C8B0007D5AC08AD09EE24030A0A0AEF3400FB92\r
+:103C9B0012695874021206497900EEFAEFFB1230E2\r
+:103CAB00B974031206497F060206EA74F112068AFA\r
+:103CBB0074F81206338A088B098A828B83E0F874B6\r
+:103CCB00F528F874FF3400F9C3E89409E99400A2CD\r
+:103CDB00D265D033401FEA2414F582EB3400F58310\r
+:103CEB00E0FE123563E96E600C7902740812064926\r
+:103CFB007F080206EA7904E912067EAC82AD83E501\r
+:103D0B0008240EFAE5093400FB122365C082C08338\r
+:103D1B0090F5BC780C12052BD083D082780C120353\r
+:103D2B004F70C6E5082412F582E5093400F583E0EF\r
+:103D3B00F50AE5082405F50EE5093400F50FA90A87\r
+:103D4B00AA0EFB121DEA8A0C8B0DA80CA90DE8FE1E\r
+:103D5B00E9FFE87001E97003023E1174818510825E\r
+:103D6B00851183F0E508240DF582E5093400F58310\r
+:103D7B00E0C0E0740112067ED0E0F08E828F83A348\r
+:103D8B00A3A3A3A3A3A3A3A3E0C0E0740212067E84\r
+:103D9B00D0E0F0123107E9C0E0740312067ED0E0E8\r
+:103DAB00F0850882850983A3A3A3A3A3A3A3A3A33D\r
+:103DBB00A3E05407FA7403C39AFD7C048510828533\r
+:103DCB001183AA82AB837902122C328A088B09A940\r
+:103DDB0009EA7001E9602A750A04750B00780A126A\r
+:103DEB0007D5AC0EAD0FEA24030A0A0AE93400FB2F\r
+:103DFB0012695874021206497900AA08AB091230ED\r
+:103E0B00B97901023CF690F5C0E07003023CF4AACC\r
+:103E1B0008AB09121F038A0C8B0DAE0CAF0DEE70A5\r
+:103E2B0001EF700B121CF18A0C8B0DAE0CAF0DEE6B\r
+:103E3B007001EF60CC750C04750D00780C1207D572\r
+:103E4B00AC0EAD0FEE2403FAEF3400FB126958747D\r
+:103E5B0002120649EEFAEFFB79021220A0E9700973\r
+:103E6B00EEFAEFFB121D9A809890F5C2E0640160A8\r
+:103E7B00EFE0F50C7401250CF0EE240BF582EF341A\r
+:103E8B0000F583E0C0E0E50C24C1F582E434F5F5E0\r
+:103E9B0083D0E0F08E828F83A3A3A3A3A3A3A3A3BA\r
+:103EAB00A3A3E50AF074028E828F83F0A3A882A9E4\r
+:103EBB0083E5082413F582E5093400F583E06440BB\r
+:103ECB00700474018002740388828983F08E828F60\r
+:103EDB0083A3A3A3A3A3A3A3A3A3E0C0E074021291\r
+:103EEB00067ED0E0F0123107E9C0E0740312067EC3\r
+:103EFB00D0E0F07481851082851183F0E508240DE4\r
+:103F0B00F582E5093400F583E0C0E0740112067E0A\r
+:103F1B00D0E0F0850882850983A3A3A3A3A3A3A361\r
+:103F2B00A3A3A3E05407FA7403C39AFD7C04851082\r
+:103F3B0082851183AA82AB837902122C328A088B79\r
+:103F4B0009A909EA7001E96030750A04750B00785C\r
+:103F5B000A1207D5AC0EAD0FEA24030A0A0AE9349C\r
+:103F6B0000FB12695874021206497900AA08AB09C2\r
+:103F7B001230B9E97003023E0C023E6B74F8120664\r
+:103F8B008AEAFEEBFF7D017C0090F5C3E0F912227B\r
+:103F9B0011E9FB7007121AB57901801074016B706F\r
+:103FAB000479028007EEFAEFFB12402C7F01020628\r
+:103FBB00EA74F712068A7900A2AFE492E0FAC2AF74\r
+:103FCB0090F5C2E0603AE014F0EAA2E092AF091279\r
+:103FDB00401590F5C1E0F97C00ECC0E090F5C2E033\r
+:103FEB00FAD0E0C39A501E8C08E50824C1FAE434D9\r
+:103FFB00F5FB8A828B83A3E08A828B83F00C80D9BA\r
+:10400B00EAA2E092AF7F020206EAC082C083E970A7\r
+:10401B00047A0180027A00EA90F5C0F0D083D08256\r
+:10402B002274F812068A7E00EA240CF8EB3400F9AD\r
+:10403B008A828B83E0FC74F52CFC74FF3400FD74D6\r
+:10404B00086C7001ED7007740188828983F0888297\r
+:10405B008983E01208170101804069407D40123CC2\r
+:10406B00B6E9FA90F5C0E0700C74016A60070E0EA9\r
+:10407B008003123BFDEEF97F010206EA74F712068C\r
+:10408B008A1218D1E990F5C7F07508037509007805\r
+:10409B00081207D57C007D007AC47BF5126A3F7449\r
+:1040AB00021206497F020206EA74F712068AEAFE3A\r
+:1040BB00EBFF7D017C0090F5C7E0F9122211E9FBC3\r
+:1040CB007007121AB57901803B74016B7004790289\r
+:1040DB00803275080475090078081207D51235452A\r
+:1040EB00EAFCEBFD8E828F83A3AA82AB831268FF5F\r
+:1040FB007402120649EA7001EB70D3EEFAEFFB1271\r
+:10410B00411479007F020206EAC082C083EA240CC4\r
+:10411B00F582EB3400F583E06401700312412FD07C\r
+:10412B0083D0822274F612068A74FF120633EAFEDB\r
+:10413B00EBFFEE240DF582EF3400F583E0F50A85F5\r
+:10414B001082851183AC82AD83EE2405FAEF340027\r
+:10415B00FB123A52EAF8EBF9EA7001EB70030242F8\r
+:10416B000EE82404F508E93400F509E024C4F582CF\r
+:10417B00E434F5F583E07021850882850983E50A2F\r
+:10418B00F07401C0E0851082851183E024C4F582B0\r
+:10419B00E434F5F583D0E08012AA0A8508828509FC\r
+:1041AB0083E0F912233DE9605AE50AF07902EEFA51\r
+:1041BB00EFFB12322C8A088B09A808A909E87001B9\r
+:1041CB00E9603988828983A3E0FA7901122520E519\r
+:1041DB0008240CF582E5093400F583E054F844011A\r
+:1041EB00F0E508240BF582E5093400F583E0D2E70E\r
+:1041FB00F07900AA08AB091230B98007EEFAEFFB91\r
+:10420B0012330274011206497F030206EA74F71295\r
+:10421B00068AE4C0E0E924C4F582E434F5F583D0E2\r
+:10422B00E0F07F020206EAC082C0831218D1E99047\r
+:10423B00F5C8F0D083D0822274F512068AEAFEEB21\r
+:10424B00FF7D038E828F83E024F5FCEE240CFAEFC6\r
+:10425B003400FB7901122C328A088B09A909EA7008\r
+:10426B0001E9603E750A04750B00780A1207D5EE5A\r
+:10427B002405FCEF3400FDEA24030A0A0AE93400A2\r
+:10428B00FB1269587402120649E508240EF582E503\r
+:10429B00093400F583E0D2E7F07900AA08AB0912E4\r
+:1042AB0030B97F040206EA74F812068AEAFEEBFFC5\r
+:1042BB007D017C0090F5C8E0F9122211E9FA700734\r
+:1042CB00121AB57901801274016A7004790280099F\r
+:1042DB00EEFAEFFB1242E979007F010206EAC08297\r
+:1042EB00C083EA240CF582EB3400F583E0640170A3\r
+:1042FB0003124243D083D0822222790022C082C093\r
+:10430B0083124638E490F5D4F0FB8029EB75F00569\r
+:10431B00A424D5F8E5F034F5F9E488828983F0A379\r
+:10432B00F0A3F088828983A3A3A3F088828983A357\r
+:10433B00A3A3A3F00BEBC3940A40D1D083D082226A\r
+:10434B0074F112068A74FB12063374018510828590\r
+:10435B001183F01243081248997A007BC0124971FD\r
+:10436B0075E54475E402539BFCE59B53E9EF4391E0\r
+:10437B0010D2A8439A01D2B990F410E4F0A3F080C4\r
+:10438B000B90DF3BE06401700375E10290F5D4E024\r
+:10439B00C3940A500690F608E060E675E10490F6C7\r
+:1043AB0008E0700990F5D4E0C39405500B90F4101D\r
+:1043BB00E4F0A374800245857A0080010AEAC39475\r
+:1043CB000A5031EA75F005A424D5F8E5F034F5F977\r
+:1043DB0088828983E060E5A3E0FAA3E0FB74031213\r
+:1043EB00067EEAF0A3EBF088828983A3A3A3E0F512\r
+:1043FB000C750D007A0980011AEA602E75F005A480\r
+:10440B0024D5F8E5F034F5F988828983E060E9A3D7\r
+:10441B00E0FAA3E0FB740112067EEAF0A3EBF0884E\r
+:10442B00828983A3A3A3E0FE7F00750800750900B2\r
+:10443B007C007D007A008015E508250AF508E50962\r
+:10444B003400F509EC24010CED3400FD0AEAC394A9\r
+:10445B000A5033EA75F005A424D5F582E5F034F55E\r
+:10446B00F583E060E7E5822404F582E5833400F50B\r
+:10447B0083E0F50AE0A2E750BFA80AE50828F50893\r
+:10448B00E50934FF80BCA808A909ECFAEDFB12057D\r
+:10449B00B0880EC3E894E7E994FFA2D265D033400D\r
+:1044AB000EC3E8941AE99400A2D265D033400B9066\r
+:1044BB00F410E8F0A37420024585EEC3950CF8EFD9\r
+:1044CB00950DF9E875F0CCA4C8AAF075F00CA42AE8\r
+:1044DB00FA75F0CCE9A42AF9740112067EC082C0E9\r
+:1044EB0083740312067EE0FAA3E0FBD083D082E054\r
+:1044FB00C39AFEA3E09BFFE8C39EFAE99FFBC3EAC6\r
+:10450B009404EB94005036740F5AF990F410E4F0C5\r
+:10451B00A3E9F0C3E5099400A2D265D0335046C39A\r
+:10452B00E49508F8E49509F9ECFAEDFB1205B8E807\r
+:10453B00F404F890F410E048F0A3E08045EEC39843\r
+:10454B00F8EF99F9C3E89404E994005025740F58D7\r
+:10455B00F990F410E4F0A3E9F0C3E5099400A2D2BA\r
+:10456B0065D03340BAA808A909ECFAEDFB1205B8DF\r
+:10457B0080C190F410E4F0A37440F0E485108285C0\r
+:10458B001183F0851082851183E06401600302467C\r
+:10459B001EE490F5D4F0FA8029EA75F005A424D531\r
+:1045AB00F8E5F034F5F9E488828983F0A3F0A3F001\r
+:1045BB0088828983A3A3A3F088828983A3A3A3A35F\r
+:1045CB00F00AEAC3940A40D1E50E90DF08F01248D6\r
+:1045DB00997A007B40124971800B90DF3BE06401BC\r
+:1045EB00700375E10290F5D4E0700690F608E06078\r
+:1045FB00E975E10490F5D4E0601090F5D9E0FAC3C9\r
+:10460B0094FE500FEAC39403400990F410E4F0A316\r
+:10461B007410F0C2A8539AFEC2B975E40075E25546\r
+:10462B0012489974051206497F080206EAC082C037\r
+:10463B008374CA90DF00F074BA90DF01F0740A90B3\r
+:10464B00DF02F0E490DF03F090DF04F090DF05F081\r
+:10465B0090DF06F0741290DF07F0E490DF08F0743F\r
+:10466B001290DF09F0740A90DF0AF074AA90DF0B46\r
+:10467B00F0743D90DF0CF0745590DF0DF0741590D5\r
+:10468B00DF0EF0741290DF0FF0741190DF10F074E6\r
+:10469B006090DF11F0740790DF12F0740290DF135B\r
+:1046AB00F0741890DF14F0741D90DF15F0741C90EB\r
+:1046BB00DF16F074C790DF17F0741090DF18F074EA\r
+:1046CB00B290DF19F074B690DF1AF0741090DF1B04\r
+:1046DB00F074EA90DF1CF0742A90DF1DF0E490DF99\r
+:1046EB001EF0741F90DF1FF0E490DF2FF090DF308F\r
+:1046FB00F090DF31F0743190DF24F090DF1CE04458\r
+:10470B0020F0745A90DF2EF075E10475E10190DF13\r
+:10471B003BE0640170F890DF1CE054CFF075E104CE\r
+:10472B00D083D0822274F112068AE5D990F5C9F0B4\r
+:10473B00740190F5D3F07890F9801DA2895019E59A\r
+:10474B00D9C0E0E024C9F582E434F5F583D0E0F07C\r
+:10475B0090F5D3E004F0C289E0C3940A5012E8FA52\r
+:10476B00E9FB74FF2A1874FF3BF9EA7001EB70CB7D\r
+:10477B00E0640A600302483875E104AAE28A828584\r
+:10478B008208E5E3F8E4C8F50990F60FE0FA75F056\r
+:10479B00BDA4CAACF075F02CA42CFB880A880B7452\r
+:1047AB000F78081204AD90FA21780C12052B7808BB\r
+:1047BB00790C120424E5082AF508E5093BF5097C78\r
+:1047CB00017B0180218B82A882E824C9F582E43425\r
+:1047DB00F5F583E0FAE82417F582E434FAF583E083\r
+:1047EB006A60027C000BEBC3940A40D9EC603E90EC\r
+:1047FB00F5D4E075F005A424D5F8E5F034F5F9749B\r
+:10480B000188828983F0A3E508F0A3E509F090F510\r
+:10481B00C9E088828983A3A3A3F090DF38E0888264\r
+:10482B008983A3A3A3A3F090F5D4E004F07F08023F\r
+:10483B0006EAC082C083E5E9FA539BFCE59BEAA23A\r
+:10484B00E7500575E1048014A2E6501075E1049061\r
+:10485B00DF3BE0640170F8E490F5D3F075E900D02C\r
+:10486B0083D08222C082C083C2A8539AFE74FF9069\r
+:10487B00DF06F074C090DF2EF0740190DF02F0754C\r
+:10488B00D95575E103D083D0822275E10422C08211\r
+:10489B00C083E490F607F090F608F090F609F0A3C9\r
+:1048AB00F090F60BF090F60CF0A3F090F60EF09063\r
+:1048BB00F60FF0D083D0822274F712068A7C009018\r
+:1048CB00F60BE0603E53E5BF75DBFF75DAFFE5DB0A\r
+:1048DB00F9E5DAF874FF68700374FF69601375DB30\r
+:1048EB00FF75DAFFE5DBF9E5DAF8EC0CC3940B4066\r
+:1048FB00E3E014F053E40FE5E443E54079017F0274\r
+:10490B000206EA90F60CC3E09406A3E09400405232\r
+:10491B0053E5BF90F60CE024FFA3E034FFF5DB90EA\r
+:10492B00F60CE014F5DAE5DBF9E5DAF8E024FFFA4A\r
+:10493B00A3E034FFFBEA687002EB696017EBF5DB71\r
+:10494B0090F60CE014F5DAE5DBF9E5DAF8EC0CC3DC\r
+:10495B00940B40D890F60CE4F0A3F0740190F60E93\r
+:10496B0080917900809874F112068A53E5BFE49028\r
+:10497B00F607F090F60B800AEA2443FAEB34D3FBEC\r
+:10498B00E004F0C3EA94BDEB942C50EC8A088B093D\r
+:10499B00750A00750B0090FA21780C12052B78081C\r
+:1049AB00790C1203A4740F780812049490F60CE59A\r
+:1049BB0008F0A3E509F01248C353E40FE5E443E51F\r
+:1049CB0040740190F607F07F080206EAC082C083AC\r
+:1049DB0090F609E0F8A3E0F9C3E89AE99B5009EADD\r
+:1049EB00C398F8EB99F9800CE86A7002E96B70EFE9\r
+:1049FB0078FF79FF90F609EAF0A3EBF0E8FAE9FB10\r
+:104A0B00124971D083D08222C082C083740190F688\r
+:104A1B0007F0D083D08222C082C083E490F607F0E7\r
+:104A2B00D083D08222C082C083E490F608F0D0837A\r
+:104A3B00D08222C082C08390F62CE0FA74226A7076\r
+:104A4B001A90F619E0703390F62DE0F8A3E0F99088\r
+:104A5B00F650E8F0A3E9F07402801B74206A70141E\r
+:104A6B0090F619E0701490F6267449F0A374F6F0E2\r
+:104A7B00A3E480E2740490F619F0D083D08222C0B4\r
+:104A8B0082C08390F62CE06421702090F619E070C0\r
+:104A9B002090F6267449F0A374F6F0A3E4F090F698\r
+:104AAB00297407F0A3E4F074018002740490F619E2\r
+:104ABB00F0D083D08222C082C083740490F619F0A8\r
+:104ACB00D083D08222C082C083740490F619F0D0B8\r
+:104ADB0083D08222C082C083740490F619F0D083F5\r
+:104AEB00D08222C082C083740490F619F0D083D098\r
+:104AFB0082222222C082C08390FA25E0F8A3E0F93B\r
+:104B0B0090F610E8F0A3E9F0D083D0822274F8126B\r
+:104B1B00068AE9FCEAFD7A007B00802190F610E022\r
+:104B2B00F8A3E0F5838882E493F890F610E028F878\r
+:104B3B00A3E03400F990F610E8F0A3E9F090F6103A\r
+:104B4B00E0F8A3E0F990FA27E0687003A3E069604E\r
+:104B5B004890F610E02401F8A3E03400F98882892C\r
+:104B6B0083E4936C702B90F610E0FAA3E0FB90F6C5\r
+:104B7B0010E0F8A3E0F5838882E493F890F610E058\r
+:104B8B0028F8A3E03400F990F610E8F0A3E9F080E0\r
+:104B9B0008E4936D7086ED60837F010206EA124A8A\r
+:104BAB00FF7A007901124B182274F712068AE9FE7C\r
+:104BBB00EAFF124AFF800E8A828B83A3A3A3A3A3CF\r
+:104BCB00E4936E60147A007902124B18EA7001EBD1\r
+:104BDB006007EE70E2EF1F70EC7F020206EA74F7DB\r
+:104BEB0012068AEAFEEBFF7A00124BB47A027904C2\r
+:104BFB00124B18EA7001EB60178A828B83A3A3E434\r
+:104C0B00936E70E88A828B83A3A3A3E4936F70DC0B\r
+:104C1B007F020206EA74F712068AE9FE124AFF7A4D\r
+:104C2B00007903124B18EE1E70F57F020206EAC0E4\r
+:104C3B0082C0837A007901124BB48A828B83A3A33F\r
+:104C4B00A3A3A3A3A3E493A2E6500474018001E4FD\r
+:104C5B0090F625F0E490F624F043BE80D2BDD083CD\r
+:104C6B00D08222C082C083740290F612F0E490F6D8\r
+:104C7B0013F090F619F07903124EF9752100752295\r
+:104C8B0000D083D0822274F512068A90DE0EE0FEED\r
+:104C9B00E4F090DE11E0FFA2E4501F7480F0740783\r
+:104CAB0090F619F0E5217002E522600985218285D5\r
+:104CBB002283120688E490F619F0EFA2E25009E481\r
+:104CCB0090DE11F090F619F090F619E0FA74026A82\r
+:104CDB006003024D6790DE16E0F50A90F626120788\r
+:104CEB00E6A90A7A207BDE124F3F74031206498530\r
+:104CFB000A0890F629C3E09508F0A3E09400F09021\r
+:104D0B00F626E0F9A3E0FAA3E0FBE9250AF9EA3479\r
+:104D1B0000FA90F626E9F0A3EAF0A3EBF090F6295F\r
+:104D2B00E07002A3E060047A4080027A48EA90DEE9\r
+:104D3B0011F090F629E07002A3E07016E5217002E5\r
+:104D4B00E5226009852182852283120688E490F68C\r
+:104D5B0019F0EE90DE0EF07F040206EA74066A701C\r
+:104D6B000985218285228312068890F619E060035B\r
+:104D7B00024E6AEFA2E04003024E6A75082B7509DA\r
+:104D8B00F6750A0078081207D179087A207BDE12B3\r
+:104D9B004F3F740312064975210075220090F62BC4\r
+:104DAB00E054E012084D000600C74D20434E402D45\r
+:104DBB004E80024EA04E4EC0384EFA4D90F62CE06F\r
+:104DCB0012084D000501EB4D03E64D05E14D09F0D1\r
+:104DDB004D0BF54DFA4D1252CC80711252C0806CB6\r
+:104DEB001252B480671256CF80621257F7805D74EF\r
+:104DFB000490F619F0805590F62CE012084D000443\r
+:104E0B0000194E061E4E08234E0A284EFA4D12501C\r
+:104E1B00CA80391253258034125686802F12579927\r
+:104E2B00802A7521C175224A124AC1801F7521D073\r
+:104E3B0075224A124AD0801475213E75224A124AB5\r
+:104E4B003E800975218A75224A124A8A90F619E02A\r
+:104E5B00640470047A6080027A40EA90DE11F0906C\r
+:104E6B00F619E0FA74016A70717F0290F629E0F886\r
+:104E7B00A3E0F9C3E89420E994005007E8F50A7F12\r
+:104E8B000A8003750A2090F6261207E6A90A7A20F3\r
+:104E9B007BDE124F797403120649850A0890F626B9\r
+:104EAB00E0F9A3E0FAA3E0FBE92508F9EA3400FAFC\r
+:104EBB0090F626E9F0A3EAF0A3EBF090F629C3E015\r
+:104ECB009508F0A3E09400F0EF90DE11F0E50AC333\r
+:104EDB0094204003024D5D024D4774056A60030246\r
+:104EEB004D5D852182852283120688024D5D74F704\r
+:104EFB0012068A7A008014E9C0E08A08E508241AB1\r
+:104F0B00F582E434F6F583D0E0F00AEAC394054069\r
+:104F1B00E67A008014E9C0E08A08E508241FF582D0\r
+:104F2B00E434F6F583D0E0F00AEAC3940540E67F5B\r
+:104F3B00020206EA74F612068AEAFCEBFDE9FE743D\r
+:104F4B000A12067EE0F508A3E0F509A3E0A908AA7A\r
+:104F5B0009FBEE60148C828D83E012038EE9240131\r
+:104F6B0009EA3400FA1EEE70EC7F030206EA74F6CF\r
+:104F7B0012068AEAFCEBFDE9FE740A12067EE0F5E6\r
+:104F8B0008A3E0F509A3E0A908AA09FBEE60141237\r
+:104F9B0003748C828D83F0E9240109EA3400FA1E34\r
+:104FAB00EE70EC7F030206EA74F712068A75230093\r
+:104FBB007524007525008A268B27EA90DE0BF08A74\r
+:104FCB00088B0974047808120611E50890DE07F0C7\r
+:104FDB008A088B0974097808120611E508543E906B\r
+:104FEB00DE09F0438C10758900C2C5758B00C2E8D1\r
+:104FFB00439A027F020206EAC0E074F1120722E52F\r
+:10500B00BEA2E650FA90DE06E0FAA2E25036A826DF\r
+:10501B00E890DE0BF08526088527097404780812C2\r
+:10502B000611E50890DE07F0852608852709740927\r
+:10503B007808120611E508543E90DE09F090DE0167\r
+:10504B00E0D2E0F07823EA46F608E6F690DE02E0DE\r
+:10505B00F508750900740478081206207823E50812\r
+:10506B0046F608E50946F690DE04E0F508750900FA\r
+:10507B00740978081206207823E6F608E50946F647\r
+:10508B00EAA2E0500375250174065A6003752500EA\r
+:10509B00124AFE758B00C2E87F02020781C0E074E2\r
+:1050AB00F2120722E5BEA2E650FAE589A2E7500507\r
+:1050BB00C2BD125921758900C2C57F0102078174D7\r
+:1050CB00F712068A90F62DE07002A3E0701E90F6A0\r
+:1050DB002FE0F8A3E0F974FF59FBE47001EB700CBF\r
+:1050EB0090F631E064027002A3E060057404025193\r
+:1050FB00BC90F62BE0120817800210510D513D5158\r
+:10510B004D51E86008740490F61902519B90F625F6\r
+:10511B00E0600478018002780090F633E8F0A3E4B5\r
+:10512B00F090F624E0606A90F633E04402F0A3E0DE\r
+:10513B00805E90F612E0640470CB90F633E4F0A33B\r
+:10514B00804EE8547FF50890F612E0640470B6E5E3\r
+:10515B0008C3940650AFE5082412F582E434F6F543\r
+:10516B0083E854806010A3A3A3A3A3A3A3E06403C9\r
+:10517B00701578018013E582240CF582E5833400E9\r
+:10518B00F583E0640360EB780090F633E8F0A3E47A\r
+:10519B00F090F619E06404601C90F6267433F0A3CB\r
+:1051AB0074F6F0A3E4F090F6297402F0A3E4F07423\r
+:1051BB000190F619F07F020206EA74F712068A9044\r
+:1051CB00F631E07002A3E0701290F612E064046016\r
+:1051DB001290F62FE07002A3E06008740490F619A9\r
+:1051EB000252AC90F62BE0541F1208170002E65146\r
+:1051FB0001520952235290F62DE0640160057900AB\r
+:10520B000252AFE990F624F060047905800279062A\r
+:10521B007A00124AFD0252AD90F62FE0547FFA90BD\r
+:10522B00F62DE070D9EAC3940650B0EA90DE0EF08A\r
+:10523B0090F62FE054806032E960047B1080027B93\r
+:10524B0040EB90DE11F0E960047B0380027B00EB06\r
+:10525B00C0E0EA2419F582E434F6F583D0E0F0E9F6\r
+:10526B0060047908803479078030E960047B208002\r
+:10527B00027B80EB90DE14F0E960047B0380027B01\r
+:10528B0000EBC0E0EA241EF582E434F6F583D0E0AF\r
+:10529B00F0E96004790A80027909124AFDE490DE94\r
+:1052AB000EF079017F020206EA79001251C5E9700E\r
+:1052BB0003124ADF2279011251C5E97003124AEE3B\r
+:1052CB0022C082C08390F62FE07002A3E070209082\r
+:1052DB00F631E07002A3E0701690F62DE0F8A3E033\r
+:1052EB00F9748058FA74FF59FBEA7001EB6007748C\r
+:1052FB000490F619801EE890DE00F090F62DE090F9\r
+:10530B00F6126009E06402700C74038007E064031A\r
+:10531B0070037402F0D083D0822274F512068A9047\r
+:10532B00F62DE0FAA3E01208170102D9533E53659C\r
+:10533B0053B053124BA990F626EAF0A3EBF0A374EB\r
+:10534B0080F090F626E0F9A3E0FAA3E0FB120374D9\r
+:10535B0090F629F0A3E4F00254AB7900124BB49011\r
+:10536B00F626EAF0A3EBF0A37480F090F626E0F9B2\r
+:10537B00A3E0FAA3E0FBE924020909EA3400FA12DC\r
+:10538B000374FC90F626E0F9A3E0FAA3E0FBE92412\r
+:10539B0003090909EA3400FA120374F9EC90F629AF\r
+:1053AB00F0A3E980B1EAF9124C2090F626EAF0A3BB\r
+:1053BB00EBF0A37480F090F626E0F9A3E0FAA3E0FB\r
+:1053CB00FB12037490F629F0A3E4F00254AB90F6B1\r
+:1053DB0026E4F0A3F0A3F0FC02547C7509007403DF\r
+:1053EB007808120620AE08AF09EA2EF8EB3FF990C9\r
+:1053FB00F62DE0F508A3E0F50988828983E493AAEA\r
+:10540B00096A706CA3E4936508706590F62FE0F55C\r
+:10541B0008A3E0F50988828983A3A3E493AA096A08\r
+:10542B00704E88828983A3A3A3E493650870418897\r
+:10543B00828983A3A3A3A3E493F508740193F509CD\r
+:10544B0090F626E508F0A3E509F0A37480F090FA36\r
+:10545B0029E02EFAA3E03F8A82F583A3A3A3A3A39B\r
+:10546B00A3E493F8740193F990F629E8F0A3E9F01B\r
+:10547B000C90FA29E0FAA3E0FB8C0890FA2BE0F8E9\r
+:10548B00A3E0F9E8C39AF50AE99BF50B7403780AD4\r
+:10549B00120611C3E508950AE4950B50030253E677\r
+:1054AB0090F626E0FCA3E0FDA3E0FEEC4D4E70066B\r
+:1054BB00740490F619F090F619E06404602590F6E8\r
+:1054CB0031E0FAA3E0FB90F629E0F8A3E0F9C3EA98\r
+:1054DB0098EB99500890F629EAF0A3EBF074019041\r
+:1054EB00F619F07F040206EA74F112068A74FE12B2\r
+:1054FB000633851082851183EAF0A3EBF0851082C9\r
+:10550B00851183E0F8A3E0F5838882A3A3A3A3E42A\r
+:10551B0093602B90FA2DE0FEA3E08007EE2404FEAF\r
+:10552B00EF3400FF8E828F83E493F8740193F98537\r
+:10553B001082851183E0687003A3E06970DE750843\r
+:10554B0000805A749090DE14F07410F08882898376\r
+:10555B00E493540364017003750940750A01750BDC\r
+:10556B0000E50C780A1206208E828F83A3A3A393E7\r
+:10557B00550A6006E509D2E0F509E50990DE15F05C\r
+:10558B00EA90DE13F0E4C0E0E50C241EF582E4346F\r
+:10559B00F6F583D0E0F0E490DE0EF005088510827E\r
+:1055AB00851183E0F8A3E0F5838882A3A3A3A3E48A\r
+:1055BB0093FAE508C39A400302567C7A00790512E8\r
+:1055CB004B188A0A8B0BAC0AAD0BEC7001ED60CB60\r
+:1055DB00EC2402F50EED3400F50F850E82F583E415\r
+:1055EB0093540FF50C90DE0EF07509008C828D83B1\r
+:1055FB00A3A3A3A3E4932407F50AA3E4933400F530\r
+:10560B000B7403780A120611AA0AEC2403F8ED3482\r
+:10561B0000F9850E82850F83E493A2E740030255C0\r
+:10562B004E744890DE11F07408F088828983E493FD\r
+:10563B00540364017003750940750A01750B00E58D\r
+:10564B000C780A1206208E828F83A3A393550A60CF\r
+:10565B0006E509D2E0F509E50990DE12F0EA90DEE5\r
+:10566B0010F0E4C0E0E50C2419F582E434F60255A1\r
+:10567B009C74021206497F080206EAC082C083901E\r
+:10568B00F62DE07002A3E0701690F62FE07002A3E7\r
+:10569B00E0700C90F631E064017002A3E0600474DA\r
+:1056AB0004801890F6267413F0A374F6F0A3E4F0BC\r
+:1056BB0090F6297401F0A3E4F0740190F619F0D080\r
+:1056CB0083D0822274F312068A90F612E064026091\r
+:1056DB001F90F62FE07002A3E0701590F631E0708A\r
+:1056EB0002A3E0700B90F62EE0F9E47001E960097B\r
+:1056FB00740490F619F00257947A007901124AFD5E\r
+:10570B0090F62DE0606E7A00F9124BB48A088B0983\r
+:10571B00EA7001EB6056740490F612F090F62DE0EF\r
+:10572B0090F613F0750A00850882850983A3A3A35D\r
+:10573B00A3E493FAE50AC39A5048850A0CE50C24B6\r
+:10574B0014FEE434F6FFE48E828F83F07A00790442\r
+:10575B00124B188A828B83A3A3A3E493FC8E828FB4\r
+:10576B0083E06C70E71254F3050A80BB740490F667\r
+:10577B0019F0800E90F613F0740390F612F0F912F4\r
+:10578B004EF97A007902124AFD7F060206EA74F698\r
+:10579B0012068A90F612E06404701E90F62BE064F9\r
+:1057AB0081701690F62DE07002A3E0700C90F6312C\r
+:1057BB00E064017002A3E060047404802690F62F6D\r
+:1057CB00E02414F508A3E034F6F50990F626E50875\r
+:1057DB00F0A3E509F0A3E4F090F6297401F0A3E43B\r
+:1057EB00F0740190F619F07F030206EA74F71206C3\r
+:1057FB008A90F612E06404701290F62BE06401704C\r
+:10580B000A90F631E07002A3E06008740490F61978\r
+:10581B00F0805890F62DE0FB90F62FE0FA90F613FF\r
+:10582B00E0F9124BE98A088B09A808A909E8FEE9F7\r
+:10583B00FFE87001E960D490F62FE0FA7903124A81\r
+:10584B00FD90F62DE0C0E090F62FE02414F8A3E0D5\r
+:10585B0034F6F988828983D0E0F0EEFAEFFB12542C\r
+:10586B00F390F62FE0FA7904124AFD7F020206EA62\r
+:10587B00C082C08390F645E07002A3E0600E90F604\r
+:10588B0045E0F8A3E0F5838882120688745390F6FE\r
+:10589B0035F074BE90F636F074FC90F637F0744326\r
+:1058AB0090F638F074BE90F639F0740190F63AF039\r
+:1058BB00747590F63BF0748790F63CF0740190F69B\r
+:1058CB003DF074E590F63EF0742590F63FF0747061\r
+:1058DB0090F640F074F390F641F0742290F642F09B\r
+:1058EB00758900C2C5D2BD90F6437435F0A374F62A\r
+:1058FB00F0758235F58312068890F647E07002A3A7\r
+:10590B00E0600E90F647E0F8A3E0F583888212067C\r
+:10591B0088D083D08222C082C083E490F63AF09084\r
+:10592B00F63BF090F63CF090F63DF0D083D082221F\r
+:10593B0074F512068A8A088B098C0A8D0BE490F693\r
+:10594B0075F090F676F090F677F090F649780812AD\r
+:10595B00053AE490F64DF090F64EF0740890F64F41\r
+:10596B00F090F650E4F0A3F0740190F652F0124C64\r
+:10597B003A7AFF7BFF124FB353F4FDD29143FE02F1\r
+:10598B00120A1F7F040206EAC082C0831259AB9031\r
+:10599B00F652E06006125A5A1259F6D083D0822280\r
+:1059AB00A823E85404600E782374FB56F60874FFA2\r
+:1059BB0056F6124C6EA823E85410600E782374EF41\r
+:1059CB0056F60874FF56F6124C91A823E8A2E05045\r
+:1059DB0019782374FE56F60874FF56F612587B7826\r
+:1059EB002374FD56F60874FF56F62274F612068AD7\r
+:1059FB00120A2290DE0EE090F678F0740490DE0E20\r
+:105A0B00F090DE11E0A2E0403690F677E060307562\r
+:105A1B0008537509F6750A0078081207D190F655E8\r
+:105A2B00E0F97A287BDE124F797403120649E49071\r
+:105A3B00F677F0740490DE0EF0740190DE11F090A6\r
+:105A4B00F678E090DE0EF0120A1F7F030206EA746E\r
+:105A5B00F612068A7E00120A2290DE0EE090F6788D\r
+:105A6B00F0740490DE0EF090DE14E0A2E04003022E\r
+:105A7B005B0990DE16E0FF90DE17E0742090FA31A0\r
+:105A8B00F090F675E0F8EF28F8E43400F9E894218B\r
+:105A9B00E994004002E4F0E02453F508E434F6F511\r
+:105AAB00098E0A78081207D1EFF97A287BDE124F9C\r
+:105ABB003F740312064990F675E02FF0740490DEE4\r
+:105ACB000EF0E490DE14F090F675E0C394024005FE\r
+:105ADB0090F655E0FE8E0874FF2508F874FF34002D\r
+:105AEB00F990F675E0FAC3E89AE99400A2D265D072\r
+:105AFB0033500BEEC394034005120C21E4F090F6E7\r
+:105B0B0078E090DE0EF0120A1F7F030206EAC082D5\r
+:105B1B00C08375910075E90075C6B874D390DF002A\r
+:105B2B00F0749190DF01F0741290DF07F0E490DFD6\r
+:105B3B0008F0741290DF09F0741490DF0AF0747A95\r
+:105B4B0090DF0BF0E490DF06F0748D90DF2EF07495\r
+:105B5B001D90DF0CF0745590DF0DF0741390DF0E79\r
+:105B6B00F0742390DF0FF0741190DF10F0746390DA\r
+:105B7B00DF11F074B690DF1AF0741090DF1BF07425\r
+:105B8B001890DF14F0743C90DF13F0740790DF1261\r
+:105B9B00F075A48775A36B75A2F8741D90DF15F0D3\r
+:105BAB00741C90DF16F074C790DF17F0E490DF18C9\r
+:105BBB00F074B090DF19F074EA90DF1CF0742A9047\r
+:105BCB00DF1DF0E490DF1EF0741F90DF1FF074599F\r
+:105BDB0090DF20F0748890DF23F0743190DF24F095\r
+:105BEB00740990DF25F0747F90DF21F0748890DFCB\r
+:105BFB0022F0742990DF2FF0741E90DF30F0741BAD\r
+:105C0B0090DF31F0740690DF03F0744590DF04F001\r
+:105C1B0074CA90DF05F074FE90DF02F0D083D0825F\r
+:105C2B002274F712068AE5E9FA90F979E0640260CA\r
+:105C3B000575E900804574505A6450702E53E9EF96\r
+:105C4B0053E9BF539BFCE59B125D3D7508FF75093E\r
+:105C5B000078081207D57C007D007A787BF8126AF1\r
+:105C6B003F7402120649125CC7801053E910E5E934\r
+:105C7B00539BFCE59B740190F876F07F020206EAD9\r
+:105C8B00C082C083E9701190F871E4F0A3F090F832\r
+:105C9B0073F0A3F090F875F0D083D08222C082C04D\r
+:105CAB0083E9701390F871E4F0A3F090F875F0901D\r
+:105CBB00F873EAF0A3EBF0D083D0822274F71206CC\r
+:105CCB008A74F890F97DF0747890F97EF074DF9017\r
+:105CDB00F97BF074D990F97CF090F97FE054E044B3\r
+:105CEB0001F0E490F980F0748190F97FF0741290D8\r
+:105CFB00F982F0741390F981F075D6817508FF75F0\r
+:105D0B00090078081207D57C007D007A787BF812A1\r
+:105D1B006A3F740212064943D601539BFCE59B5321\r
+:105D2B00E9EF740290F979F075E102439110FF02EB\r
+:105D3B0006EAC082C0835391EF740190F979F07534\r
+:105D4B00E10490DF3BE0640170F875D68153D1FE1E\r
+:105D5B00539BFCE59B53E9EFD083D0822274F8125E\r
+:105D6B00068AEAFEEBFF125D3D74DF90F97DF0745D\r
+:105D7B00D990F97EF0EF90F97BF0EE90F97CF090F2\r
+:105D8B00F97FE054E04401F0E490F980F074219045\r
+:105D9B00F97FF0744290F982F0741390F981F0431B\r
+:105DAB00D601740490F979F075E103E5E9A2E450AA\r
+:105DBB00FA53E9EF125D3D79017F010206EA74F8AF\r
+:105DCB0012068A790090F876E064016003025E5E49\r
+:105DDB00E4F090F879E0707B90F878E0247AF58223\r
+:105DEB00E434F8F583E0A2E750697E017D00802161\r
+:105DFB008D82AA82EA247CF582E434F8F583E0FCF8\r
+:105E0B00EA2435F582E434FAF583E06C60027E0017\r
+:105E1B000DEDC3940440D9EE603990F87AE090F917\r
+:105E2B007AF0E090FA3BF0740190FA3DF0FA7B00C7\r
+:105E3B00125CA890F875E060FA7900125C8BD29036\r
+:105E4B0079047A3A7BFA125D68C2907901740290F8\r
+:105E5B00F67AF07F010206EAC082C08390F97AE0FD\r
+:105E6B0090FA3FF090F877E090FA43F07AB87B0124\r
+:105E7B007900125CA890F773E06404600690F875E3\r
+:105E8B00E060F290F773E06404600990F67AE0D278\r
+:105E9B00E5025F247900125C8BD29079067A3E7B07\r
+:105EAB00FA125D68C290125CC77AB87B0179001256\r
+:105EBB005CA890F875E0700890F876E0640170F2D9\r
+:105ECB007900125C8B125D3D90F876E06401704AAC\r
+:105EDB0090F878E0247AF582E434F8F583E0548086\r
+:105EEB00FBE490F876F090F879E064CA702C90F8A7\r
+:105EFB007AE0FA90F97AE06A702090F87BE064011E\r
+:105F0B007018EB6015E490F877F0740190F987F056\r
+:105F1B0090F773F0740890F67BF0D083D08222C098\r
+:105F2B0082C08390F986E090F777F090F985E09046\r
+:105F3B00F778F090F97AE090F775F07AB87B017901\r
+:105F4B0000125CA890F773E06404600690F875E0AB\r
+:105F5B0060F290F773E06404600990F67AE0D2E5A2\r
+:105F6B000260477900125C8BD29090F774E004F9D1\r
+:105F7B007A747BF7125D68C290125CC77AB87B01AA\r
+:105F8B007900125CA890F875E0700890F876E064E0\r
+:105F9B000170F2125D3D7900125C8B90F876E06433\r
+:105FAB0001600302604890F878E0247AF582E434CB\r
+:105FBB00F8F583E05480FBE490F876F090F879E004\r
+:105FCB0064CA707990F87AE0FA90F97AE06A706DA9\r
+:105FDB0090F87BE06401706590F87CE0FA90F986AC\r
+:105FEB00E0547F6A705790F87DE0C0E090F985E04F\r
+:105FFB00F8D0E0687047EB6044E490F877F090F9E4\r
+:10600B0085E02401F0A3E03400F090F985E0F8A3DB\r
+:10601B00E0F9E875F064A4F8AAF075F064E9A42A35\r
+:10602B00F990F983E0FAA3E0FB1205B8E890F97751\r
+:10603B00F0740890F67BF0740190F773F0D083D076\r
+:10604B008222C082C08390F877E004F0E0C394060C\r
+:10605B00400D90F67AE0D2E5F0E0D2E2F0802990A4\r
+:10606B00F987E07005125E63801E90F985C082C0CF\r
+:10607B008390F983E0F8A3E0F9D083D082C3E09852\r
+:10608B00A3E0995003125F2AD083D08222C082C032\r
+:10609B0083E490F877F090F977F0740190F67AF04A\r
+:1060AB0090F67BF090F985E4F0A3F090F983F0A3E0\r
+:1060BB00F0740190F773F0E490F987F090F876F0B4\r
+:1060CB00D083D08222C082C08374F9F5D575D47B7E\r
+:1060DB0012609874FC90F774F074CA90F776F074B1\r
+:1060EB000190F67AF0C2A8439A01C290E490F67937\r
+:1060FB00F090F977F0125D3D806090F985C082C019\r
+:10610B008390F983E0F8A3E0F9D083D082C3E098C1\r
+:10611B00A3E099400690F987E0701712604D7A0161\r
+:10612B007B007900125CA890F875E060FA79001298\r
+:10613B005C8B90F978E0701B90F985C082C08390DE\r
+:10614B00F983E0F8A3E0F9D083D082C3E098A3E011\r
+:10615B0099400790F67AE0D2E5F090F679E0702A54\r
+:10616B00125CC7125DC9E964017017740290F67A6C\r
+:10617B00F090F679E004F0740490F67BF0125D3D3C\r
+:10618B00800890F67AE0A2E550D990F67AE0A2E585\r
+:10619B004003026105C2A8539AFE5391EF75E900C3\r
+:1061AB00125D3DE490F679F07A2C7B01F9125CA834\r
+:1061BB0090F875E060FA7900125C8BD083D0822264\r
+:1061CB00C082C08374B290DF01F0743790DF00F0AF\r
+:1061DB00740A90DF02F0740090DF03F0740090DF1C\r
+:1061EB0004F0740090DF05F0740090DF06F0741279\r
+:1061FB0090DF07F0740090DF08F0741290DF09F065\r
+:10620B00740D90DF0AF074DD90DF0BF0743D90DFBE\r
+:10621B000CF0745590DF0DF0741590DF0EF07412C6\r
+:10622B0090DF0FF0741190DF10F0746090DF11F0BD\r
+:10623B00740790DF12F0740090DF13F0741890DF86\r
+:10624B0014F0741D90DF15F0741C90DF16F074C7FA\r
+:10625B0090DF17F0741090DF18F074B290DF19F024\r
+:10626B0074B690DF1AF0741090DF1BF074EA90DFB5\r
+:10627B001CF0742A90DF1DF0740090DF1EF0741F69\r
+:10628B0090DF1FF0740090DF2FF0740090DF30F080\r
+:10629B00740090DF31F0743190DF24F075E10475F8\r
+:1062AB00E10190DF3BE0640170F8D083D08222C023\r
+:1062BB0082C08390DF1CE0442090DF1CF074C690FA\r
+:1062CB00DF2EF075E10475E10190DF3BE0640170B6\r
+:1062DB00F890DF1CE054CFF075E104D083D082221C\r
+:1062EB0074F712068AE990DF06F07A00EAC3940A83\r
+:1062FB00501E8A08750900E508249BF582E50934D0\r
+:10630B00F9F583E0C0E074282AF8D0E0F60A80DCC7\r
+:10631B00753200D29074FE559AFA8A9AC2A8C28935\r
+:10632B00539BFCE59B75E900D2A87401459AFC8C44\r
+:10633B009A740090FA44F075E1037F020206EAC0FA\r
+:10634B0082C083C290C2A874FE559AFA8A9A7401CD\r
+:10635B0090FA44F075E104D083D0822212634A2272\r
+:10636B007A007B0075320074282532F8E6F5D905E2\r
+:10637B0032E532C3940A502BEAF8EBF9740128FA90\r
+:10638B00740039FBC3E89488E994135016A2895022\r
+:10639B00E074282532F8E6F5D90532C2897A007BFC\r
+:1063AB000080CEC3EA9488EB94134005C28975E94B\r
+:1063BB00002274F812068AE5E9FEEEA2E750027E8F\r
+:1063CB0000EEA2E45009740190FA44F01263677571\r
+:1063DB00E9007F010206EA74F512068A1261CB12FC\r
+:1063EB0062BA90F9B2780812052B90F98E780812E0\r
+:1063FB00053A740090F992F07F040206EA74F712E2\r
+:10640B00068A740090F99AF0740090F999F0740070\r
+:10641B0090F998F0E5E3F8E4C8F990F995E8F0A362\r
+:10642B00E9F085E20875090090F995E04508F0A3BD\r
+:10643B00E04509F090F995E024A4F0A3E03400F0D6\r
+:10644B0090F995E0FAA3E0FB1249D7124A137F02A9\r
+:10645B000206EAC082C083124A2212634A74009079\r
+:10646B00F99AF0D083D0822274F512068A8A088BAF\r
+:10647B00098C0A8D0B90F98A780812053A7F040271\r
+:10648B0006EA74F512068AC0A8C2AF8A088B098C7B\r
+:10649B000A8D0B90F98E780812053AE990F992F073\r
+:1064AB00D0A87F040206EA74F512068A90F999E0E7\r
+:1064BB001208170102C8647465CC65246690F993C1\r
+:1064CB00E02400F0A3E03470F012687490F99AE0C5\r
+:1064DB00D2E1F090FB51E0C39401A2D265D03350CE\r
+:1064EB002890FA45780812052B90F98E780812053A\r
+:1064FB001890FB51E06488700990F99AE0D2E0F0B3\r
+:10650B00800790F99AE0C2E0F012666E740790F97A\r
+:10651B0097F075080075090878081207D590F98A65\r
+:10652B00780812052BAA08AB09AC0AAD0B90F998A9\r
+:10653B00E0F912676A74021206498A088B09A808E7\r
+:10654B00A90990F993E0C398F8A3E099F990F98819\r
+:10655B00E8F0A3E9F090F988E0FAA3E0FB1249D741\r
+:10656B00740190F999F002664A740090F997F075EE\r
+:10657B00080075090278081207D590F98A78081275\r
+:10658B00052BAA08AB09AC0AAD0B90F998E0FE7489\r
+:10659B0080C39EF912676A74021206498A088B0936\r
+:1065AB00A808A90990F988E028F8A3E039F9740044\r
+:1065BB0028FA740239FB1249D7740290F999F080CA\r
+:1065CB007E740190F997F075088075091C78081294\r
+:1065DB0007D590F98A780812052BAA08AB09AC0AE3\r
+:1065EB00AD0B90F998E0FE7440C39EF912676A7484\r
+:1065FB00021206498A088B09A808A90990F993E0A9\r
+:10660B0028F8A3E039F9740028FA740639FB12490B\r
+:10661B00D7740390F999F0802612687390F99AE079\r
+:10662B00C2E1F090F998E02401F090F993E024B8DE\r
+:10663B00FAA3E03466FB1249D7740090F999F07F06\r
+:10664B00040206EAC082C08390F99AE0A2E15008E6\r
+:10665B0090F997E0F91262EB1264B2124A30D083D0\r
+:10666B00D0822274F112068A90F99BC082C083906B\r
+:10667B00FA49780812052BD083D08278081204F2DD\r
+:10668B0090F98AC082C08390FA4D780C12052BD0FA\r
+:10669B0083D082780C1204F27808790C12050590DD\r
+:1066AB00F99B780812053A90F99BC082C08390FA47\r
+:1066BB004D780C12052BD083D082780C1204F290FB\r
+:1066CB00F998E0F508E4F509F50AF50B7418780864\r
+:1066DB001204AD780C790812050590F99B780C1211\r
+:1066EB00053A90F99F780812052B90F98E780C12C9\r
+:1066FB00052B90F99F780C12053A90F992E090F9DE\r
+:10670B00A3F07A9B7BF9126722E9FA74216A90F95C\r
+:10671B00A4F07F080206EA74F812068A79007D005D\r
+:10672B00EDC3940950348A828B83E0FE7C00ECC36A\r
+:10673B009408501AE96EC394804008E9C3336497F8\r
+:10674B00F98004E9C333F9EEC333FE0C80E08A828F\r
+:10675B008B83A3AA82AB830D80C67F010206EA74EA\r
+:10676B00F112068A74FE120633E9FF8A0C8B0D8C2C\r
+:10677B000E8D0F7CFF7D7F851082851183E50CF0DC\r
+:10678B00AE0D850C08850D09850E0A850F0B74104F\r
+:10679B007808120494740112067EE508F08F0875D0\r
+:1067AB000900E5082451F582E50934FAF583E0F890\r
+:1067BB00851082851183E0F508E50868F8E4C8F9CF\r
+:1067CB008F0A750B008E08750900E508650AF50838\r
+:1067DB00E509650BF509E5082451F582E50934FA5D\r
+:1067EB00F583E0F508750900E50828F8E50939F99E\r
+:1067FB00851082851183E0F50AE4C50AF50B8E0836\r
+:10680B00750900740112067EE0F582758300E5823E\r
+:10681B004508F508E5834509F509E508250AF50856\r
+:10682B00E509350BF509E50868F8E50969F9E8FAB2\r
+:10683B00E9FB741112067EC3E09AA3E09B500FECA8\r
+:10684B005AFAED5BFBEDC313FDEC13FC80E4740211\r
+:10685B001206497F080206EA43FE01C29012686CD9\r
+:10686B00221263E2126408222274F112068A74FC6B\r
+:10687B0012063390F9A8E02400F0A3E03470F090F6\r
+:10688B00F9A8C3E09400A3E09480400C90F9A8E031\r
+:10689B002400F0A3E03480F090FB52E0FE90F9A5C9\r
+:1068AB00E0F50CE4F50DF50EF50F7410780C1204F1\r
+:1068BB00AD90F9A6E0F508A3E0F509E4F50AF50BB0\r
+:1068CB00780C79081204CC851082851183780C1210\r
+:1068DB00053AEEF9851082851183780812052BAAEB\r
+:1068EB0008AB09AC0AAD0B12648D74041206497F18\r
+:1068FB00080206EA74F812068A740812067EE0F89B\r
+:10690B00A3E08015A3AA82AB838C828D83A3AC8278\r
+:10691B00AD83E824FF18E934FFF9E87001E960243E\r
+:10692B008A828B83E0FE8C828D83E06E8A828B83DE\r
+:10693B0060D2E0F88C828D83E0FAE8C39AFAE49493\r
+:10694B0000FB80047A007B007F010206EA74F712D9\r
+:10695B00068A740912067EE0FEA3E0FFEAF8EBF963\r
+:10696B0080188C828D83E088828983F0A3A882A90A\r
+:10697B00838C828D83A3AC82AD838E088F0974FFC9\r
+:10698B0025081E74FF3509FFE5087002E50970D272\r
+:10699B007F020206EA74F712068A740912067EE079\r
+:1069AB00F8A3E0F9EAFEEBFF8A088B09C3EA9CEB3C\r
+:1069BB009D405EEC28F582ED39F583C3E5829508A1\r
+:1069CB00E5839509404BEA28FAEB39FBAC82AD83A2\r
+:1069DB00126A2E7002E5096041EC24FF1CED34FFB6\r
+:1069EB00FDEA24FF1AEB34FFFB8C828D83E08A8255\r
+:1069FB008B83F080DB8C828D83E08A828B83F08C9F\r
+:106A0B00828D83A3AC82AD838A828B83A3AA82AB54\r
+:106A1B0083126A2E7002E50970DBEEFAEFFB7F0240\r
+:106A2B000206EA8808890974FF25081874FF3509DE\r
+:106A3B00F9E5082274F812068A740812067EE0F84B\r
+:106A4B00A3E0F98A828B838003ECF0A3E8FEE9FFD5\r
+:106A5B0074FF2E1874FF3FF9EE7001EF70EB7F019E\r
+:036A6B000206EA36\r
+:04000005000000E90E\r
+:00000001FF\r
diff --git a/chronos-ti/Recovery/RF Access Point/Recovery_eZ430-Chronos_AP_868MHz_1_2.hex b/chronos-ti/Recovery/RF Access Point/Recovery_eZ430-Chronos_AP_868MHz_1_2.hex
new file mode 100755 (executable)
index 0000000..205853d
--- /dev/null
@@ -0,0 +1,1714 @@
+:020000040000FA\r
+:060000000200E90211D923\r
+:03000B0002127965\r
+:030013000212884E\r
+:03001B0002129737\r
+:030023000212A620\r
+:03002B000212B509\r
+:0300330002500375\r
+:03003B000212C4EA\r
+:030043000212D3D3\r
+:03004B000211F9A6\r
+:030053000212E2B4\r
+:030063000212275F\r
+:03006B000250A898\r
+:030073000212F185\r
+:03007B000213006D\r
+:030083000211A3C4\r
+:10008B0002130F00000080FB1200F8B900030200FE\r
+:10009B00E3E479217812B800028004F709D8FCE474\r
+:1000AB0090F3FF78AC79068002F0A3D8FCD9FA90D4\r
+:1000BB00F9AAAA82AB839000FB78AA79028015E497\r
+:1000CB0093A3AC82AD838A828B83F0A3AA82AB838A\r
+:1000DB008C828D83D8E9D9E7120A2512008E75D050\r
+:1000EB000075814F7510FF7511F302009379012292\r
+:1000FB0087D6120000C201000000000001000000C2\r
+:10010B00F1490200FFFFFFFF0032506E0E278CFFFC\r
+:10011B0000000001000000000000000000000000D3\r
+:10012B0000000000000000000000000000000000C4\r
+:10013B0000000000000000000000000000000000B4\r
+:10014B00B242873F183B0543FC34B4407856341019\r
+:10015B00020101010008070605040302010055AA6C\r
+:10016B0055AA55AA55AA556CDC0200A402470347B1\r
+:10017B0003470347034F03200700CABA5EBA1109AE\r
+:10018B000300CA000500CA000000010001000000C6\r
+:10019B000000FFFFFFFF0001804020100884422178\r
+:1001AB009048A45229140A85C261B058ACD66B355D\r
+:1001BB009ACD6633994CA653A9542A95CAE5F27980\r
+:1001CB003C9ECF67B3D96CB65B2D160B058241A055\r
+:1001DB005028944AA5D269341A8D462391C8E472EB\r
+:1001EB00391C8EC7E3F1F8FCFEFF7F3F1F0F07831F\r
+:1001FB00C1E070389CCEE7F3F97CBEDF6F379B4DC7\r
+:10020B0026138944221188C4623198CCE673B95CF9\r
+:10021B00AED7EB75BADD6EB7DB6D361B0D06038102\r
+:10022B00C06030188CC663B1D8ECF67B3D1E8F478F\r
+:10023B00A3D1E8F47ABD5EAF57AB55AAD5EAF5FA70\r
+:10024B00FD7EBF5F2F178B45A251A8D46AB5DAED9F\r
+:10025B00763B1D0E87C3E1F078BCDEEF77BB5D2EDE\r
+:10026B0097CB65B2592C964B25924924120904025F\r
+:10027B000180402010088442219048A45229140A7E\r
+:10028B0085C261B058ACD66B359ACD6633994CA606\r
+:10029B0053A9542A95CAE5013C1201100102000032\r
+:1002AB00205104A6160900010203010902430002B2\r
+:1002BB00010080190904000001020201000524005D\r
+:1002CB00100104240202052406000105240100018B\r
+:1002DB000705820340004009040100020A000000E8\r
+:1002EB0007058402400001070504024000010403D6\r
+:1002FB00090424035400650078006100730020009A\r
+:10030B0049006E0073007400720075006D0065008B\r
+:10031B006E00740073001E03430043003100310074\r
+:10032B0031003100200055005300420020004300F3\r
+:10033B00440043000803300030003100BF020000CE\r
+:10034B00E2020000E066701008A3E066700A08A3E2\r
+:10035B00E066700408A3E06622C3E09608A3E0966B\r
+:10036B0008A3E09608A3E09622BB0102E722C08215\r
+:10037B00C08389828A83BB0003E08002E493D0832D\r
+:10038B00D08222BB000EC082C0838A838982F0D0C8\r
+:10039B0083D08222BB0101F722080808EAC0E0EBF8\r
+:1003AB00C0E086F0E7A4FA180986F0E7A42AFA1849\r
+:1003BB000986F0E7A42AFA180986F0E7A42AFA19A5\r
+:1003CB0086F0E7A4FBE5F02AFA190886F0E7A42BE0\r
+:1003DB00FBE5F03AFA190886F0E7A42BFBE5F03AB7\r
+:1003EB00FA18180986F0E7A4C5F02BFBE43AFA19C2\r
+:1003FB0008E7C5F0C6A426F6E5F03BFBE43AFA188D\r
+:10040B0086F0E7A4F6E5F00826F6E43B08F6E43AB6\r
+:10041B0008F6D0E0FBD0E0FA22E4CFC0E0E4CEC097\r
+:10042B00E0E4CDC0E0E4CCC0E075F020C3E633F6E9\r
+:10043B0008E633F608E633F608E633F6181818EC38\r
+:10044B0033FCED33FDEE33FEEF33FFC3EC9709EDD9\r
+:10045B009709EE9709EF97191919400FFFEC97FCC5\r
+:10046B0009ED97FD09EE97FE191906D5F0BEECF7CD\r
+:10047B0009EDF709EEF709EFF7191919D0E0FCD0E0\r
+:10048B00E0FDD0E0FED0E0FF226016080808C6C3EE\r
+:10049B0013C618C613C618C613C618C613C6D5E09E\r
+:1004AB00EA227009080808226016181818C6C33308\r
+:1004BB00C608C633C608C633C608C633C6D5E0EA77\r
+:1004CB0022E627F60809E637F60809E637F60809A3\r
+:1004DB00E637F622E026F608A3E036F608A3E03668\r
+:1004EB00F608A3E036F622E056F608A3E056F60827\r
+:1004FB00A3E056F608A3E056F622E647F60809E60F\r
+:10050B0047F60809E647F60809E647F622E046F003\r
+:10051B0008A3E046F008A3E046F008A3E046F0226B\r
+:10052B00E0F608A3E0F608A3E0F608A3E0F622E65F\r
+:10053B00F008A3E6F008A3E6F008A3E6F022CAC091\r
+:10054B00E0E6F0A308DAFAD0E0FA22CAC0E0E0A3B2\r
+:10055B00C582CCC582C583CDC583F0A3C582CCC56E\r
+:10056B0082C583CDC583DAE6D0E0CA22C3E498F80E\r
+:10057B00E499F91205B88026C3E49AFAE49BFBE9E7\r
+:10058B0020E7E91205B8E498F8E499F922C3E49856\r
+:10059B00F8E499F91205B8E498F8E499F9C3E49AE8\r
+:1005AB00FAE49BFB22EB20E7CFE920E7E0B9001050\r
+:1005BB00BB0008E88AF084F8AAF022E4FBC8FA2210\r
+:1005CB00EB70227B10C833C8C933C9335007C39AA9\r
+:1005DB00C3DBF280069A50012ADBEAC833F4C8C9A0\r
+:1005EB0033F4C9FA2275F008E4C833C8C933C933E8\r
+:1005FB00C99AC99B5004C92AC93BD5F0ECFBC83337\r
+:10060B00F4C8E4C9FA22600C08C6C313C618C61393\r
+:10061B00C6D5E0F422700422600D18C6C333C60899\r
+:10062B00C633C6D5E0F41822251010AF08F51040DC\r
+:10063B000215118008F51040021511D2AF22C0D05F\r
+:10064B00251010AF08F510500205118008F5105059\r
+:10065B00020511D2AFD0D0222510F58210AF08F5CC\r
+:10066B0010400215118008F51040021511D2AF850C\r
+:10067B001183222510F582E43511F58322E47325CD\r
+:10068B0010C582C0E0E51134FFC583C0E0E510C39F\r
+:10069B00958224F9F8E4C5A8858311858210C5A835\r
+:1006AB00E8CEF0A3E520F0A37808E608F0A3DEFA85\r
+:1006BB00EFF0A3E58124FBF8E608F0A3E608F0A32E\r
+:1006CB000808E608F0A3E608F0A315811581D0E031\r
+:1006DB00FED0E0F815811581E8C0E0EEC0E0228580\r
+:1006EB001183851082E0A3FEE0A3F5207808E0A338\r
+:1006FB00F608DFFAE0A3FFE0A3C0E0E0A3C0E0E070\r
+:10070B00A3C0E0E0A3C0E0E4C5A8858210858311F7\r
+:10071B00C5A8D083D08222C0D02510C582C0E0E509\r
+:10072B001134FFC583C0E0E510C3958224F310AFED\r
+:10073B00088583118582108008858311858210D2EC\r
+:10074B00AFC8F0A3E9F0A3EAF0A3EBF0A37908E7B5\r
+:10075B0009F0A3D8FAECF0A3EDF0A3EEF0A3EFF0C1\r
+:10076B00A3D0E0F0A3D0E0F0A3D0E0F0A3E520F01D\r
+:10077B00A3E5F0F0A322851183851082E0C0E0A3EE\r
+:10078B00E0F9A3E0FAA3E0FBA37808E0F608A3DF07\r
+:10079B00FAE0FCA3E0FDA3E0FEA3E0FFA3E0C0E0D2\r
+:1007AB00A3E0C0E0A3E0F5D0A3E0F520A3E0A3F520\r
+:1007BB00F0E4C5A8858311858210C5A8D082D083AB\r
+:1007CB00D0E0F8D0E0327403800474028000C0E003\r
+:1007DB00F404120663D0E0120549227403800474FA\r
+:1007EB00028000CCC0E0EDC0E0E510C39CCCAD11A5\r
+:1007FB0050011D10AF068C108D1180068C108D11C1\r
+:10080B00D2AF120556D0E0FDD0E0FC22D083D082CF\r
+:10081B00C5F0E493A3C5F0C395F0F5F0E493A3C33F\r
+:10082B0095F04005E5F0048001E475F002A4258203\r
+:10083B00F582E5F03583F583E493A3C0E0E493C040\r
+:10084B00E022D083D082CCC0E0E493A360061208F0\r
+:10085B00771470FAE493A360061208961470FAD01A\r
+:10086B00E0FCE493A3C0E0E493C0E022C0E0E49397\r
+:10087B00A3D39C5010E493A3C39C400AD0E0D0E0D8\r
+:10088B00D0E002086AA3A3A3D0E022C0E0E493A3C4\r
+:10089B006C7009D0E0D0E0D0E002086AA3A3D0E0EE\r
+:1008AB002253CBEFC2D843CB0475F00CEAA4F5CDA1\r
+:1008BB0074FC55CB4402F5CB43CB10A2D850FC5360\r
+:1008CB00CBEFC2D822C082C08353A8C0E5A853B8CF\r
+:1008DB00F0E5B8539AC2E59A7422C0E0740755C686\r
+:1008EB00F8D0E0B800028004C313D8FCF5AB7475E4\r
+:1008FB0090FC00F074AE90FC01F0740290FC02F0DE\r
+:10090B00E490FC03F090FC04F0747490FC05F0741C\r
+:10091B00FF90FC06F074F590FC07F074AF90FC08A8\r
+:10092B00F0E490FC09F090FC0AF0747490FC0BF06E\r
+:10093B0074FF90FC0CF074F590FC0DF074AF90FC10\r
+:10094B000EF0E490FC0FF090FC10F074E590FC11AD\r
+:10095B00F074AE90FC12F0745490FC13F074409051\r
+:10096B00FC14F0747090FC15F074FA90FC16F07493\r
+:10097B002290FC17F0740190F3FFF0D083D0822209\r
+:10098B00C082C0838A828B83E493F9D083D0822286\r
+:10099B00C082C0838A828B83E493F9A3E4932400FF\r
+:1009AB00FAE439FBD083D0822274F712068AECFE6C\r
+:1009BB00EDFF740912067EE0FCA3E0FD74326C704F\r
+:1009CB000374576D600479008045C2AFE5AEA2E7B2\r
+:1009DB0040FA8A088B0974097808120611E508F5A4\r
+:1009EB00ADEAFCEBC313EC13F5ACEF90FC06F0EEA9\r
+:1009FB0090FC0CF012FC00D2AFE9601112099B8A3B\r
+:100A0B00088B09EE65087003EF650970B979017FF2\r
+:100A1B00020206EAD2AF22C2AF22750C00750D009E\r
+:100A2B007E0043FE01D29043FE10C29443FD3FE58E\r
+:100A3B00FD43FEE0E5FE43FF19E5FF53BEF8E5BEBF\r
+:100A4B0000746055BE60FA780079008008E82401D4\r
+:100A5B0008E93400F9C3E89420E9944E40EF53C6FB\r
+:100A6B00BF53C6C0E5C643C638E5C6746055BE6005\r
+:100A7B00FA780079008008E8240108E93400F9C30A\r
+:100A8B00E89420E9944E40EF90F9AA780812052BD0\r
+:100A9B00AA08AB09AC0AAD0B12647374FF90F4187F\r
+:100AAB00F07AF07B7F12098BE9700C7AF27B7F1264\r
+:100ABB00098BE990F412F090F412E0C3941F4008F4\r
+:100ACB00E0C394E25002E4F043B933E5B943A92300\r
+:100ADB00E5A990F9AE780812052BAA08AB09AC0A68\r
+:100AEB00AD0B12593B800F125993E50C2401F50CF9\r
+:100AFB00E50D3400F50DC3E50C9420E50D944E4047\r
+:100B0B00E6C29075EC4475ED0475EBDED2BCD2AF4A\r
+:100B1B00800E12115A740590F400F0E490F404F076\r
+:100B2B0090F404E0600C90F401E0700690F403E0A4\r
+:100B3B0060E090F402E0602990F60EE06008EE7041\r
+:100B4B000553EBEF7E0190F608E060D412664FEE92\r
+:100B5B006009E490F60EF0FE43EB10E490F608808B\r
+:100B6B00BE90F405E0603490F403E0702ED290E474\r
+:100B7B0090F405F012111D740390F400F0740190C1\r
+:100B8B00F401F012131E740190F400F0E490F401E0\r
+:100B9B00F074FF90F418F0C290808590F406E0603A\r
+:100BAB003D90F401E07037D290E490F406F0125BC4\r
+:100BBB0019740A90F400F0740190F403F01260D0F1\r
+:100BCB0090F67AE0A2E25004740B8002740C90F45D\r
+:100BDB0000F0E490F403F074FF90F67C80B890F48E\r
+:100BEB000DE07003020B2B90F40FE06003020B2B54\r
+:100BFB0090F40EE01208170102190C0C0C110C16D4\r
+:100C0B000C12434B800812486F80031248957401F5\r
+:100C1B0090F40F020B2A74F112068A90F653E064DB\r
+:100C2B00FF600302111890F654E012084D001900F2\r
+:100C3B00A20C01A80C02BD0C03E10C04460D058DA2\r
+:100C4B000D06DA0C07B10D08D10D09900E0A970DA0\r
+:100C5B0020870C310D0E32480E33580E40990E4141\r
+:100C6B00D20E46C60E47F00E48D80E49E90E705804\r
+:100C7B0010718F1072C01073A8100C11741290F6B3\r
+:100C8B0059F0743490F658F0745690F657F0747817\r
+:100C9B0090F656F002110C90F400E080F3121187DD\r
+:100CAB00E490F402F090F401F090F403F090F4006F\r
+:100CBB0080E190F401E0600790F417E0D2E5F0904A\r
+:100CCB00F402E0600302110C740190F40480C4126E\r
+:100CDB001187740480D790F659E0F50875090075F3\r
+:100CEB000A00750B00741878081204AD90F658E0E2\r
+:100CFB00F50C750D00750E00750F007410780C1245\r
+:100D0B0004AD7808790C1204CC90F657E0F50C750D\r
+:100D1B000E007408780C1204AD7808790C1204CC10\r
+:100D2B0090F656E0F50C750D007808790C1204CC92\r
+:100D3B0090F98A780812053A02110C90F98A780C0E\r
+:100D4B0012052B850C08850D09850E0A850F0B7472\r
+:100D5B00187808120494E50890F659F0850C08856C\r
+:100D6B000D09850E0AF50B74107808120494E5082A\r
+:100D7B0090F658F0850D09E50990F657F0E50C0251\r
+:100D8B000C9B90F656E090FB52020C9E90F656E0B0\r
+:100D9B0090F9A5F090F658E0F990F657E090F9A687\r
+:100DAB00F0A3E9020C9E90F402E06003121187900D\r
+:100DBB00F401E0600302110C740290F400F0740172\r
+:100DCB0090F405020C9E90F417E0A2E4502F90F4DF\r
+:100DDB001BE090F659F090F41AE090F658F090F46E\r
+:100DEB0019E090F657F090F418E090F656F074FF77\r
+:100DFB0090F418F090F417E0C2E4020C9E74FF021A\r
+:100E0B000C9B90F401E0700302110C7A00801F8A96\r
+:100E1B0082A882E82456F582E434F6F583E0C0E03C\r
+:100E2B00E82418F582E434F4F583D0E0F00AEAC341\r
+:100E3B00941340DB90F417E0D2E6020C9E90F4077B\r
+:100E4B00E090F656F0740490F655020C9E90F40761\r
+:100E5B00E0602E7A00801F8A82A882E82418F5822F\r
+:100E6B00E434F4F583E0C0E0E82456F582E434F68C\r
+:100E7B00F583D0E0F00AEAC3941340DBE490F40767\r
+:100E8B00F0741680C290F417E0D2E5020C9E90F439\r
+:100E9B0002E0600312118790F401E0600790F417F1\r
+:100EAB00E0D2E5F090F403E0600302110C740990BA\r
+:100EBB00F400F0740190F406020C9E90F67AE0D2E6\r
+:100ECB00E5F0C29002110C90F977020CA590F40397\r
+:100EDB00E0600690F67B020CA57480020C9B74F705\r
+:100EEB0090F65680A6740290F67BF090F773E06450\r
+:100EFB00016003020FD6E490F40AF090F655E0245B\r
+:100F0B00FB90F409F090F656E090F40BF090F65746\r
+:100F1B00E0F50890F40BE07035E50890F77AF09067\r
+:100F2B00F658E090F77BF0F9E50890F983F0A3E928\r
+:100F3B00F090F983E090FA41F090F984E090FA4256\r
+:100F4B00F0740490F773F0E490F408020C9EE5083B\r
+:100F5B0090F40CF090F40BE06401700474018002C7\r
+:100F6B00740290F779F090F40CE0240590F774F08C\r
+:100F7B007A00801F8A82A882E82458F582E434F62E\r
+:100F8B00F583E0C0E0E8247AF582E434F7F583D00A\r
+:100F9B00E0F00AEAC0E090F409E0FBD0E0C39B402C\r
+:100FAB00D3740290F773F090F409E090F408F0908A\r
+:100FBB00F409E090F40AF0E0C0E090F40CE0FAD011\r
+:100FCB00E0C39A500302110C020F4CE06402600361\r
+:100FDB0002110C90F655E024FD90F409F07A008094\r
+:100FEB002B8A82A882E82456F582E434F6F583E056\r
+:100FFB00C0E090F408E0FCE82CF8E43400F9E824B5\r
+:10100B007AF582E934F7F583D0E0F00AEAC0E09094\r
+:10101B00F409E0FBD0E0C39B40C7E0FA90F408E092\r
+:10102B002AF090F409E0FA90F40AE02AF090F40820\r
+:10103B00E0C394F7509290F40AE0C0E090F40CE017\r
+:10104B00FAD0E0C39A500302110C020FD390F6575B\r
+:10105B00E0F990F656E0F874AB68700374AB697006\r
+:10106B001C740190F40DF0E490F40EF0740190F404\r
+:10107B000FF0E490F402F090F401020C9EE490F473\r
+:10108B000D020C9E90F40DE0607790F410E4F0A349\r
+:10109B00F090F40FF090F40EE004020C9E90F40D1F\r
+:1010AB00E0605E90F410E090F656F090F411E09052\r
+:1010BB00F657020C9E90F40DE0604690F656E0F564\r
+:1010CB000890F657E0FA90F658E0F9EAFEE9FF12BD\r
+:1010DB0008D0EEFAEFFB12098BE964FF7023750A57\r
+:1010EB0032750B57780A1207D57900AB0874FF24B9\r
+:1010FB0000FCE43BFDEEFAEFFB1209B4740212069E\r
+:10110B0049740190F677F0740690F654F07F08025C\r
+:10111B0006EAC082C08375C6B074D390DF00F0744A\r
+:10112B009190DF01F0740490DF03F0E490DF05F0A1\r
+:10113B0090DF06F0740790DF12F0E490DF2FF09051\r
+:10114B00DF30F090DF31F0759100D083D08222C078\r
+:10115B0082C08375C6B8439190E59175E25575E5EC\r
+:10116B004475E402D2B912686390F412E090DF0880\r
+:10117B00F0740190F402F0D083D08222C082C0833D\r
+:10118B0012645EC2B975E40075E255124899E49099\r
+:10119B00F402F0D083D08222C0E074F212072290C6\r
+:1011AB00F402E060051263BD801F90F401E060055E\r
+:1011BB00121793801490F40DE0600512483D8009DE\r
+:1011CB0090F403E06003125C2C7F01020781C0E006\r
+:1011DB0074F212072290F402E0600512636B80092F\r
+:1011EB0090F40DE060031247307F01020781C0E0ED\r
+:1011FB0074F2120722C2C153E40FE5E490F607E044\r
+:10120B00601590F608E0700F1248C3E97003740183\r
+:10121B00F090F60FE004F07F01020781C0E074F25A\r
+:10122B0012072290F403E0603990F873E0F8A3E022\r
+:10123B00F9E87001E9602B90F871E02401F0A3E06C\r
+:10124B003400F090F871E0687003A3E069701390BC\r
+:10125B00F871E4F0A3F090F873F0A3F0740190F838\r
+:10126B0075F0C2DB1259937F010207810022C0E0A7\r
+:10127B0074F21207221212777F01020781C0E07409\r
+:10128B00F21207221212777F01020781C0E074F27B\r
+:10129B001207221212777F01020781C0E074F2124B\r
+:1012AB0007221212777F01020781C0E074F2120746\r
+:1012BB00221212777F01020781C0E074F21207221B\r
+:1012CB001212777F01020781C0E074F2120722121B\r
+:1012DB0012777F01020781C0E074F212072212120B\r
+:1012EB00777F01020781C0E074F212072212127796\r
+:1012FB007F01020781C0E074F21207221212777F7E\r
+:10130B0001020781C0E074F21207221212777F01EB\r
+:10131B0002078174F112068A74FA12063390F9B23D\r
+:10132B00780812052B740190F417F07AFD7B1412D8\r
+:10133B0027B97402C0E0740112067ED0E0F0AC82D3\r
+:10134B00AD837A0A7903122AA0C290805390F414C9\r
+:10135B00E0704D740212067E780812053A74021280\r
+:10136B00067EC082C08390F9B6780812052BD08315\r
+:10137B00D08278081204DF740212067EC082C0830A\r
+:10138B0090F9BA780C12052BD083D082780C12030B\r
+:10139B0064400D639001E59090F9B2780812052B2B\r
+:1013AB0090F416E0603190F414E0702B7A137BF418\r
+:1013BB001227E6E970F6740290F417F0D29090F4CD\r
+:1013CB0014E004F0A2AFE492E0FAC2AF90F416E09E\r
+:1013DB0014F0EAA2E092AF90F415E070030214C887\r
+:1013EB00851082851183AC82AD837A387BF490F4BF\r
+:1013FB0013E0F9122A36E960030214C885108285BE\r
+:10140B001183E064047029639001E590750C0475F9\r
+:10141B000D00780C1207D57C387DF47A187BF4120A\r
+:10142B006958740212064990F417E0D2E40214C70B\r
+:10143B00E064026008E0641360030214C863900167\r
+:10144B00E59090F438E01208170102C8145E14936B\r
+:10145B0014931490F417E0A2E65008E0C2E6F0747F\r
+:10146B0013800E740190F418F0745590F419F07405\r
+:10147B0002851082851183F0E0FC7A187BF490F4DE\r
+:10148B0013E0F912285C803590F407E0702F7A0096\r
+:10149B00801F8A82A882E82438F582E434F4F5832D\r
+:1014AB00E0C0E0E82418F582E434F4F583D0E0F0F2\r
+:1014BB000AEAC3941340DB740190F407F090F4171D\r
+:1014CB00E0A2E54003021358539AFE75910075E9AB\r
+:1014DB0000E490F413F090F414F090F416F090F400\r
+:1014EB0015F090F5A1F0C29074061206497F080220\r
+:1014FB0006EAC082C083E9600590F415800390F47E\r
+:10150B0016E004F07900D083D0822274F712068A99\r
+:10151B0075082175090078081207D57C007D007AC3\r
+:10152B00597BF4126A3F740212064990DF36E0547D\r
+:10153B00EF64016004C2AF80FE90DF37E0C3940319\r
+:10154B005004C2AF80FE53BEFBE5BEA2E650FA5379\r
+:10155B00C6BF43BE0474F4F5D575D480743C90DFDC\r
+:10156B0013F0741490DF14F0741E90DF02F0740506\r
+:10157B0090DF04F0745090DF2EF0740990DF25F0AB\r
+:10158B0090DF07F090F412E090DF08F0742490DF06\r
+:10159B0009F0743A90DF0AF074EE90DF0BF0746B85\r
+:1015AB0090DF0CF074A390DF0DF0741390DF0EF04E\r
+:1015BB00742390DF0FF0741190DF10F0744390DF01\r
+:1015CB0011F0741D90DF15F0741C90DF16F074C7CA\r
+:1015DB0090DF17F0E490DF18F074B090DF19F0741F\r
+:1015EB00B690DF1AF0741090DF1BF074EA90DF1CDA\r
+:1015FB00F0742A90DF1DF0E490DF1EF0741F90DF73\r
+:10160B001FF0748190DF23F0743590DF24F07402A7\r
+:10161B0090F458F07900121B8D7E007F0075E1026B\r
+:10162B0075081475090590DF3CE0545070237A401F\r
+:10163B007B001219A5E50824C0F508E50934FFF570\r
+:10164B0009C3E5089401E5099400A2D265D0335093\r
+:10165B00D57A008013EEC333FEEF33FF90DF3AE011\r
+:10166B00A2E0E492E04EFE0AEAC3941040E77480D5\r
+:10167B004EF5BCEFF5BC12196090F47C7436F0A3F8\r
+:10168B00E4F090F47E74E2F0A37404F0439A01D278\r
+:10169B00AF7F020206EA74F712068AEAFEEBFF89B5\r
+:1016AB000975080090F458E064017004C2AF80FE25\r
+:1016BB00121960EF90F480F0EE90F481F074DF90EB\r
+:1016CB00F482F074D990F483F0742090F484F07465\r
+:1016DB002190F485F0741390F486F0744190F487A4\r
+:1016EB00F0E509701143D60175E103E5E9A2E45079\r
+:1016FB00FA53E9EF8068740165096004C2AF80FE9C\r
+:10170B007509048008121960121ACA150943D6010B\r
+:10171B0075E10290DF3BE0640D70F87E147F05905D\r
+:10172B00DF3CE05450701D7A407B001219A5EE246B\r
+:10173B00C0FEEF34FFFFC3EE9401EF9400A2D2651D\r
+:10174B00D03350DB75E10390DF3BE0640D6008E5BF\r
+:10175B00E9A2E450FA809AE50970AA7508011219FA\r
+:10176B006090F458E0640370031218D7A9087F0245\r
+:10177B000206EAC082C08390F459EAFCEBFD7421A7\r
+:10178B00120556D083D0822274F712068A90F45831\r
+:10179B00E064036004C2AF80FEE5E9A2E45035E5E6\r
+:1017AB00E9A2E6502F53E9EF53E9BF539BFCE59BAE\r
+:1017BB0012196075081F75090078081207D57C008F\r
+:1017CB007D007A597BF4126A3F7402120649121893\r
+:1017DB00D702186A53E9EF539BFCE59B750802751A\r
+:1017EB00090078081207D590F459E0042459FCE459\r
+:1017FB0034F4FD7A787BF41269A07402120649E086\r
+:10180B00FA90F479E0A2E7503B8A0874012508F8B6\r
+:10181B00E43400F9E89420E99400C365D0335024F4\r
+:10182B00EAC3940B401E7A5A7BF4121BF5E9701431\r
+:10183B0090F478E0F9121B38E9F090F479E0C2E704\r
+:10184B00F0122D5E75081F78081207D57C007D00FD\r
+:10185B007A597BF4126A3F740212064943D6017F10\r
+:10186B00020206EA74F812068A90F458E0640160EA\r
+:10187B0013A2AFE492E0FEC2AF1219857401F0EE31\r
+:10188B00A2E092AF7F010206EAC082C083E5C6A246\r
+:10189B00E65004C2AF80FE90F458E06401702274ED\r
+:1018AB00EA90DF1CF0742A90DF1DF0E490DF1EF04D\r
+:1018BB00740290F458F075E10490DF3BE064017022\r
+:1018CB00F8D083D0822243B404A9BC2274F7120649\r
+:1018DB008A74DF90F480F074D990F481F074F490F2\r
+:1018EB00F482F0745990F483F0748090F484F07463\r
+:1018FB002190F485F0741390F486F0741190F487B2\r
+:10190B00F075D68175081F75090078081207D57C0C\r
+:10191B00007D007A597BF4126A3F74021206494328\r
+:10192B00D601539BFCE59B53E9EF75E10243911004\r
+:10193B007F020206EAC082C08390F458E064017013\r
+:10194B0004C2AF80FEE0640360067403F01218D784\r
+:10195B00D083D08222C082C0835391EF75E1049073\r
+:10196B00DF3BE0640170F875D68153D1FE539BFCCD\r
+:10197B00E59B53E9EFD083D08222C082C08390F4E1\r
+:10198B0058E064017004C2AF80FEE064037006127D\r
+:10199B0019607402F0D083D0822274F712068A8AFF\r
+:1019AB00088B0974047808120611AE08AF09EA70A7\r
+:1019BB0001EB6028A2AFE492E0F508C2AF7A107B8E\r
+:1019CB00001208ACE508A2E092AFEEF8EFF974FF55\r
+:1019DB00281E74FF39FFE87001E970D87F020206F8\r
+:1019EB00EA74F712068A8A088B09740478081206BF\r
+:1019FB0011AE08AF09EA7001EB602EA2AFE492E0E2\r
+:101A0B00F508C2AF7A107B001208ACE508A2E09291\r
+:101A1B00AF90F47AE07012EEF8EFF974FF281E74B1\r
+:101A2B00FF39FFE87001E970D27F020206EA74F811\r
+:101A3B0012068AEAFEEB800E7AF47B011219A5EEF0\r
+:101A4B0024FF1EEF34FFFFEE7001EF70EB7F0102FE\r
+:101A5B0006EA74F812068A90F47CE0FEA3E0FFA27B\r
+:101A6B00AFE492E0FAC2AF740190F47BF0EAA2E02B\r
+:101A7B0092AF8008EE24FF1EEF34FFFFEE7001EFF4\r
+:101A8B00600D7AF47B011219EC90F47AE060E5A218\r
+:101A9B00AFE492E0FAC2AFE490F47AF090F47BF00A\r
+:101AAB00EAA2E092AF7F010206EAC082C08390F403\r
+:101ABB007BE06006740190F47AF0D083D0822274BC\r
+:101ACB00F812068A1218D1E9540F04FF7E00800C1D\r
+:101ADB0090F47EE0FAA3E0FB1219A50EEEC39F4033\r
+:101AEB00EF7F010206EA74F812068A90F458E0645C\r
+:101AFB00036004C2AF80FE7E147F0590DF3CE05490\r
+:101B0B0050701D7A407B001219A5EE24C0FEEF34F5\r
+:101B1B00FFFFC3EE9401EF9400A2D265D03350DBEC\r
+:101B2B0090DF3AE0F9121B387F010206EAC008C0C9\r
+:101B3B0009E9C39480E94019F879FF7A027B001216\r
+:101B4B0005B08808890974B72508F874FF35098032\r
+:101B5B000BC313F874B728F874FF3400F9C3E89477\r
+:101B6B0080E994FFA2D265D03350027880E8F9D097\r
+:101B7B0009D00822C082C08390F458E0F9D083D0FA\r
+:101B8B00822274F712068A8908E9C394044004C2BE\r
+:101B9B00AF80FE121960E50824C2F582E434F9F532\r
+:101BAB0083E090DF06F090F458E0640370031218A2\r
+:101BBB00D77F020206EA74F712068A8908E9C394F2\r
+:101BCB00034004C2AF80FE121960E50824C6F582FB\r
+:101BDB00E434F9F583E090DF2EF090F458E06403E1\r
+:101BEB0070031218D77F020206EA74F812068A9065\r
+:101BFB00F488E07004790080487E007D007C0080D2\r
+:101C0B002E8C82A882EA28F582EB3400F583E0FF64\r
+:101C1B00E824C9F582E434F9F583E06F70010EE82E\r
+:101C2B0024BEF582E434F9F583E06F70010D0CEC02\r
+:101C3B00C3940440CC74046D60BB74046E60B679BD\r
+:101C4B00017F010206EA74F712068AEAFEEBFF75C2\r
+:101C5B00082C75090078081207D57C007D007ACE18\r
+:101C6B007BF9126A3F7402120649740290F9CEF0A6\r
+:101C7B00743D90F9CFF0742090F9D0F0740190F985\r
+:101C8B00D1F01234FFEEFAEFFB122C0112244112A9\r
+:101C9B0034FB124232EEFAEFFB1237D512408712A9\r
+:101CAB003B5F12430490F9EEE070347402F074035E\r
+:101CBB0090F9EFF0743F90F9F7F090F9F8F074FFAA\r
+:101CCB0090F9F9F075080478081207D5123599EADE\r
+:101CDB00FCEBFD7AF17BF912695874021206497913\r
+:101CEB00007F020206EAC082C0837B0080010BEBFF\r
+:101CFB00C394025014EB75F00CA424E2F582E5F0CA\r
+:101D0B0034F9F583E0640260E574026B70067A00C7\r
+:101D1B007B00801AEB75F00CA424E2F582E5F0341D\r
+:101D2B00F9F583AA82AB83121D3EAA82AB83D083C3\r
+:101D3B00D08222C082C08374FF120633E48A828B66\r
+:101D4B0083A3A3A3A3A3A3A3A3A3A3F074028A8235\r
+:101D5B008B83F090F9D1E0C0E0EA240BF582EB34F1\r
+:101D6B0000F583D0E0F090F9D1E004F0E0F960F6F3\r
+:101D7B0074FF6960F1851082851183AA82AB83128F\r
+:101D8B002284E970E17401120649D083D08222C00B\r
+:101D9B0082C083E48A828B83F0D083D08222C0827C\r
+:101DAB00C08374FF120633851082851183AA82AB20\r
+:101DBB0083122284E96014E075F00CA424E2F5820E\r
+:101DCB00E5F034F9F583E0640260067582007583F3\r
+:101DDB0000AA82AB837401120649D083D08222748D\r
+:101DEB00F312068A8A088B09890A7EE27FF97A0048\r
+:101DFB00800A7A01EE240CFEEF3400FFEA70478E66\r
+:101E0B00828F83E0640270EA750C04750D00780C08\r
+:101E1B001207D5AC08AD09EE2403FAEF3400FB1220\r
+:101E2B0068FF7402120649EA7001EB70C58E828F4F\r
+:101E3B0083A3A3A3A3A3A3A3A3A3A3E0650A70B245\r
+:101E4B00EEFAEFFB80047A007B007F060206EA7A4B\r
+:101E5B00D27BF92274F312068A8A0A8B0B7508005F\r
+:101E6B007509007EE27FF97A00800E8E088F097A61\r
+:101E7B0001EE240CFEEF3400FFEA703D8E828F835F\r
+:101E8B00E064026005E0640170E1750C04750D00FF\r
+:101E9B00780C1207D5E50A2405FCE50B3400FDEEA2\r
+:101EAB002403FAEF3400FB1268FF7402120649EAAE\r
+:101EBB007001EB70BA7900803AE5087002E50960B1\r
+:101ECB00F47401850882850983F0750C04750D0087\r
+:101EDB00780C1207D5E50A2405FCE50B3400FDE56B\r
+:101EEB00082403FAE5093400FB1269587402120640\r
+:101EFB004979017F060206EA74F512068A8A088B75\r
+:101F0B00097EE27FF97A00800A7A01EE240CFEEF5B\r
+:101F1B003400FFEA70418E828F83E0640170EA75B2\r
+:101F2B000A04750B00780A1207D5E5082405FCE5B1\r
+:101F3B00093400FDEE2403FAEF3400FB1268FF7442\r
+:101F4B0002120649EA7001EB70BFEEFAEFFB121DAD\r
+:101F5B003EEEFAEFFB80047A007B007F040206EA78\r
+:101F6B00C082C083E98A828B836001A3A3A3A3A34E\r
+:101F7B00A3A3A3A3A3E0FCEC60078A828B83E0708E\r
+:101F8B000479028008ECC3942040F67900D083D00A\r
+:101F9B00822274F112068A8A0C8B0D8C0E8D0F7EA9\r
+:101FAB00E27FF98A828B83A3A3A3A3A3A3A3A3A3F7\r
+:101FBB00E0543FF509750800800A0508EE240CFE75\r
+:101FCB00EF3400FFE508C3940240030220998E8290\r
+:101FDB008F83E0640270E3A3A3A3A3A3A3A3A3A390\r
+:101FEB00E0650970D5743F6509602B750A04750BA4\r
+:101FFB0000780A1207D5E50C2405FCE50D3400FD2D\r
+:10200B00EE2403FAEF3400FB1268FF740212064948\r
+:10201B00EA7001EB70A4750801EE240BF582EF3426\r
+:10202B0000F583E0850E82850F83F0743F650960B0\r
+:10203B0056E50C240AF582E50D3400F583E0A2E7A2\r
+:10204B0050198E828F83A3A3A3A3A3A3A3A3A3A39C\r
+:10205B00E0F9AA0CAB0D123115802CE0A2E350274E\r
+:10206B00EE2402F8EF3400F988828983E0FAE50C5C\r
+:10207B00240BF582E50D3400F583E06A7006E488E5\r
+:10208B00828983F0750800121AB5A90880027900BD\r
+:10209B007F080206EA74F112068A74FF120633896E\r
+:1020AB00088A0E8B0F7EE27FF9750A01750B00789B\r
+:1020BB000A1207D57C007D00740212067EAA82AB41\r
+:1020CB0083126A3F74021206497A00805D750C0414\r
+:1020DB00750D00780C1207D5E50E2403FCE50F34C3\r
+:1020EB0000FDEE2403FAEF3400FB1268FF740212BA\r
+:1020FB000649EA7001EB70287401C0E0850A8285FD\r
+:10210B000B83E0F8851082851183E58228F8E5833F\r
+:10211B003400F974E028F58274FF39F583D0E0F0D0\r
+:10212B007A01EE240CFEEF3400FFEA7069E50E6EC7\r
+:10213B007003E50F6F60E98E828F83E0640270E0BD\r
+:10214B00EE2409F50AEF3400F50B850A82F583E0DE\r
+:10215B00C3943E50CB7401650860030220D890F9FC\r
+:10216B00CFE0C0E0850A82850B83E0FAD0E0C39A0A\r
+:10217B0050AE7401C0E0E0F8C3E498F8E49400F9C1\r
+:10218B00851082851183E58228F8E58339F9743D42\r
+:10219B0028F582E4808479007A0080027A01EA7063\r
+:1021AB0015851082851183E070F274026508700446\r
+:1021BB0079208002793D74026508701790F9CFE0A1\r
+:1021CB00C399400B90F9D0E0C399501FE9801B795C\r
+:1021DB00008018E9C0E090F9D0E0FAD0E0C39A4053\r
+:1021EB00EE90F9CFE0697003E014F0E9850E82857B\r
+:1021FB000F83A3A3A3A3A3A3A3A3A3F0740112060A\r
+:10220B00497F080206EA74F512068AEAFEEBFF75AF\r
+:10221B0008028C0AEE250AFAEF3400FB740C2AF53F\r
+:10222B0082E43BF583E0A2E750488D08EE2508FADF\r
+:10223B00EF3400FB740C2AF582E43BF583E0697004\r
+:10224B002E75080475090078081207D5123545EA72\r
+:10225B00FCEBFD8E828F83A3AA82AB831268FF7483\r
+:10226B0002120649EA7001EB7005750800800375D0\r
+:10227B000801A9087F040206EA74F812068A7CE2B8\r
+:10228B007DF97E0080090EEC240CFCED3400FDEE94\r
+:10229B00C3940250218C828D83E0640270E8EC249D\r
+:1022AB000BF582ED3400F583E06970DAEE8A828BF0\r
+:1022BB0083F07901800279007F010206EA74F31240\r
+:1022CB00068A8A0C8B0D89097EE27FF975080080DE\r
+:1022DB000A0508EE240CFEEF3400FFE508C3940258\r
+:1022EB0050478E828F83E0640270E6750A04750B8B\r
+:1022FB0000780A1207D5EE2403FCEF3400FDAA0C7C\r
+:10230B00AB0D1268FF7402120649EA7001EB70C143\r
+:10231B008E828F83A3A3A3A3A3A3A3A3A3A3E065ED\r
+:10232B000970AEEEFAEFFB80047A007B007F0602A9\r
+:10233B0006EAE9FB7900EA6B601FEBC39A500EEAE1\r
+:10234B00C394FD4006EBC39403400E0922EBC394E8\r
+:10235B00FD4006EAC3940340F22274F512068AECA0\r
+:10236B00FEEDFF890A890875090078081207D5EA7E\r
+:10237B00FCEBFDEEFAEFFB1269A07402120649E5C5\r
+:10238B000A1208170202BF239923BF23AD238E82A3\r
+:10239B008F83E0F8A3E0F98E828F83E8F0A3E9F056\r
+:1023AB0080128E828F83780812052B8E828F837812\r
+:1023BB000812053A7F040206EA74F512068A74FACB\r
+:1023CB00120633EAFEEBFFECFAEDFBE912081702FB\r
+:1023DB0002E423EA23E4230624EEFCEFFD80388E8F\r
+:1023EB00828F83E0FCA3E0FD851082851183ECF0E6\r
+:1023FB00A3EDF085108285118380188E828F8378F0\r
+:10240B000812052B740212067E780812053A740224\r
+:10241B0012067EAC82AD8389087509007808120715\r
+:10242B00D51269A0740212064974061206497F047C\r
+:10243B000206EA79022274F712068A7508D2750928\r
+:10244B000078081207D57C007D007A897BF4126A2C\r
+:10245B003F740212064975084678081207D57C00AE\r
+:10246B007D007A5B7BF5126A3F74021206497F028C\r
+:10247B000206EA74F512068A7C007D007E007F005E\r
+:10248B00780074016970097A897BF47509068007F5\r
+:10249B007A5B7BF575090274012509F50A880880BA\r
+:1024AB000EEAFEEBFF0508EA2423FAEB3400FBE50A\r
+:1024BB0008C3950950298A828B83E0601B740169DC\r
+:1024CB0070E308E0640460DDA3E0C3950A50D6EA2C\r
+:1024DB00FCEBFDE0F50A80CD74026970C48031EE2F\r
+:1024EB007001EF701EEC7001ED70067A007B0080BE\r
+:1024FB001FECFEEDFF8E828F83A3E0FA122520E501\r
+:10250B000880087401288E828F83A3F0EEFAEFFB0C\r
+:10251B007F040206EAC082C083740169703A78892D\r
+:10252B0079F4A2AFE492E0FDC2AF7B00801F8882FA\r
+:10253B008983E0600FA3EAC0E0E0FCD0E0C39C50CD\r
+:10254B0003E014F00BE82423F8E93400F9EBC3940F\r
+:10255B000640DBEDA2E092AFD083D0822274F11261\r
+:10256B00068A74F61206338A0C8B0D8C09740412CE\r
+:10257B00067EE4F0A3F0851082851183F0A3F0743E\r
+:10258B000212067EE4F0A3F0740169702E7E897F3F\r
+:10259B00F4750E078A828B83E064017052A3E0F915\r
+:1025AB00121DA9851082851183EAF0A3EBF085102B\r
+:1025BB0082851183E07002A3E070077A007B000232\r
+:1025CB0027A0851082851183E0F8A3E0F58388822C\r
+:1025DB00A3A3A3A3A3A3A3A3A3E0F50885108285BC\r
+:1025EB001183E02403F8A3E03400F974088049E078\r
+:1025FB007006A3E0F5088048E0640270BEA3A882D1\r
+:10260B00A983E0240EFAA3E03400FB8A828B83E0DB\r
+:10261B00F50888828983E02405FAA3E03400FB7473\r
+:10262B000812067EEAF0A3EBF088828983E0240F80\r
+:10263B00F8A3E03400F9740212067EE8F0A3E9F087\r
+:10264B007401650970057509018003750903750F20\r
+:10265B0000800FEAA2E092AF050FEE2423FEEF34C9\r
+:10266B0000FFE50FC394064003022796A2AFE49246\r
+:10267B00E0FAC2AF8E828F83E0650970D67404F0E6\r
+:10268B00EAA2E092AFEE240BF582EF3400F583E083\r
+:10269B00543F6508600302278E850C82850D83E00D\r
+:1026AB0064017019743F6508700E85108285118363\r
+:1026BB00E02403F8A3E0800FEE24078008E0640217\r
+:1026CB007012EE2403F8EF3400F9740612067EE85C\r
+:1026DB00F0A3E9F0750A04750B00780A1207D5749C\r
+:1026EB000A12067EE0FCA3E0FD740812067EE0FAF7\r
+:1026FB00A3E0FB1268FF7402120649850C82850D5C\r
+:10270B0083E06040740212067EE07002A3E0700367\r
+:10271B00EA6031740212067EE07002A3E060647816\r
+:10272B000A1207D5EE2407FCEF3400FD74041206E1\r
+:10273B007EE0FAA3E0FB1268FF7402120649EA700E\r
+:10274B0001EB703F8E828F83A3AA82AB83E0C3958C\r
+:10275B000E5030740412067EE07002A3E060107419\r
+:10276B000412067EE0F8A3E0F5838882E509F08A7F\r
+:10277B00828B83E0F50E740412067EEEF0A3EFF06D\r
+:10278B000226638E828F83E50980F4740412067E21\r
+:10279B00E0FAA3E0FB740A1206497F080206EA740A\r
+:1027AB00016970057A897BF4227A5B7BF52274F8D8\r
+:1027BB0012068AEAFEEBFF90F5A1E07013121516D4\r
+:1027CB00EEFAEFFB121C51E9700C1218941219401F\r
+:1027DB007401F0123A4F7F010206EA74F712068A6F\r
+:1027EB008A828B83121B7FE9F509790012401574DD\r
+:1027FB00036509600C7401650970031218941219B2\r
+:10280B00407E007F00800F7A0A7B00121A39EE247B\r
+:10281B00010EEF3400FFC3EE94F4EF940150091254\r
+:10282B003FBCE9FA8A0860DF74036509600E740126\r
+:10283B006509700512186F8003121985E508700978\r
+:10284B00790112401579018003F079007F020206AD\r
+:10285B00EA74F712068A75080075090078081207E2\r
+:10286B00D512287974021206497F020206EA74F126\r
+:10287B0012068A74FC120633740212067EEAF0A367\r
+:10288B00EBF089088C09741312067EE0FEA3E0FFBF\r
+:10289B00121DA98A0C8B0D750B02121B7FE985107B\r
+:1028AB0082851183F0750A00E50C7002E50D600F4F\r
+:1028BB007901AA0CAB0D121F6BE9FA8A0B600302AC\r
+:1028CB002A2A740212067EE07002A3E060F1E50989\r
+:1028DB00C3941450EAEE7001EF703D850C82850DA8\r
+:1028EB0083A3E0FDAC09740212067EE0FAA3E0FBC1\r
+:1028FB00850C82850D83A3A3A3A3A3A3A3A3A3A347\r
+:10290B00E0F9122C328A088B09AE08AF09EE700180\r
+:10291B00EF70627903022A2CEEA2E0505374FF652C\r
+:10292B0008604DE50C2402F50AE50D3400F50B7833\r
+:10293B000A1207D5850C82850D83A3E0FDAC0974C3\r
+:10294B000412067EE0FAA3E0FB850C82850D83A3BF\r
+:10295B00A3A3A3A3A3A3A3A3A3E0F9122D1D740206\r
+:10296B001206498A088B09AE08AF09750A01809DCA\r
+:10297B007902022A2CEE2403F50EEF3400F50F75C5\r
+:10298B00080475090078081207D5E50C2403FCE54B\r
+:10299B000D3400FDAA0EAB0F1269587402120649D2\r
+:1029AB00740112067EAC82AD83AA0EAB0F123A52A3\r
+:1029BB00EA7001EB600B74038E828F83F0790080D9\r
+:1029CB00607901EEFAEFFB1230B9E9F50B7050E5C7\r
+:1029DB000A604C851082851183E06403600BE06410\r
+:1029EB00017003121894121940121A5DE06403600F\r
+:1029FB000DE06401700512186F8003121985A2AFE8\r
+:102A0B00E492E0FAC2AFE50C2402F582E50D340046\r
+:102A1B00F583E06005E4F0750B0CEAA2E092AFA938\r
+:102A2B000B74041206497F080206EA74F312068A35\r
+:102A3B0074FD120633890AEAFEEBFF8C088D09122E\r
+:102A4B001DA97902EA7001EB60411919121F6BE99C\r
+:102A5B0070397401851082851183F012067EE50AA8\r
+:102A6B00F0750A00750B00780A1207D5780A120761\r
+:102A7B00D578081207D5EEFCEFFD740612067EAA78\r
+:102A8B0082AB83122D927406120649740312064907\r
+:102A9B007F060206EA74F112068A89088A09ECFE9F\r
+:102AAB00EDFF90F5A1E0700B122BE4E970057902B4\r
+:102ABB00022BDFE50812081702080C2B6F2B8D2B4E\r
+:102ACB00982B5A2B4F2B9F2BC82B402BD92A750891\r
+:102ADB00008E828F83E0702FE5097014A3780C129F\r
+:102AEB00052BAA0CAB0DAC0EAD0F123BB8022BDDB8\r
+:102AFB0074016509700BA3AA82AB83123BDC022B1A\r
+:102B0B00DD750802022BDDE0640170F5E509701438\r
+:102B1B00A3780C12052BAA0CAB0DAC0EAD0F123813\r
+:102B2B0030022BDD7401650970D7A3AA82AB831227\r
+:102B3B003854022BDDEEFAEFFBA90912243EE9F51E\r
+:102B4B0008022BDDEEFAEFFBA9091237A780EF7411\r
+:102B5B000165096004E50970A8EEFAEFFBA90912FB\r
+:102B6B00376380DA740365097009EEFAEFFB1235EF\r
+:102B7B009E80CB740265097088EEFAEFFB12362A41\r
+:102B8B0080BCEEFAEFFBA90912369B80B1A90912A2\r
+:102B9B00375280AA740165096003022B0C75080477\r
+:102BAB0075090078081207D512355EEAFCEBFDEECD\r
+:102BBB00FAEFFB1269587402120649801274016510\r
+:102BCB00096003022B0C123563E98E828F83F0753B\r
+:102BDB000800A9087F080206EAC082C083E9120830\r
+:102BEB004D000205F62B0AF62BFA2B7901800279A0\r
+:102BFB0000D083D08222C082C083E490F5A5F0740C\r
+:102C0B002090F5A6F090F5A7EAF0A3EBF01235456E\r
+:102C1B0090F5A3EAF0A3EBF01218D1E990F5A2F02E\r
+:102C2B0060F6D083D0822274F112068A89088A0E4C\r
+:102C3B008B0F8C0A8D09790212247E8A0C8B0DA8BE\r
+:102C4B000CA90DE8FEE9FFE87001E970077A007B3B\r
+:102C5B0000022D18740B250A8E828F83A3A3F0EE2E\r
+:102C6B00240BF8EF3400F988828983E0C2E6F0E0A8\r
+:102C7B0054C04508F090F5A2E0C0E0EE240DF582BB\r
+:102C8B00EF3400F583D0E0F090F5A2E004F0E060C3\r
+:102C9B00F7EE240CFAEF3400FB90F5A5C082C0834D\r
+:102CAB008A828B83E054BFD083D082FCE04C8A8233\r
+:102CBB008B83F0E054F84509F0E0C2E7F0E0C2E3A3\r
+:102CCB00F088828983E0C2E7F0750B00780A12075F\r
+:102CDB00D5AC0EAD0FEE240E0A0AEF3400FB1269D1\r
+:102CEB005874021206497508047509007808120712\r
+:102CFB00D590F5A3E0FCA3E0FDEE2407FAEF34003A\r
+:102D0B00FB1269587402120649EEFAEFFB7F0802B8\r
+:102D1B0006EA74F712068A740912067EE0FEA3E037\r
+:102D2B00FF122C32EA7001EB70067A007B00801EDA\r
+:102D3B00EA240DF582EB3400F583E08E828F83F06D\r
+:102D4B00EA240CF582EB3400F583E0D2E7F07F0246\r
+:102D5B000206EA74F712068A790112247E8A088B1E\r
+:102D6B0009A808A909E8FEE9FFE87001E96013EE7C\r
+:102D7B0024020A0AEF3400FB12177EEEFAEFFB1265\r
+:102D8B002EE77F020206EA74F112068A74FE12061F\r
+:102D9B0033851082851183ECF0A3EDF08A0C8B0D3B\r
+:102DAB00741112067EE0F50AA3E0F50B74151206FA\r
+:102DBB007EE0F50EA3E0F50FE4850A82850B83F028\r
+:102DCB007C0179011225688A088B09AE08AF09EEE0\r
+:102DDB007001EF7003022EDB750800750900850C7E\r
+:102DEB0082850D83E064017015A3E0F9121DA98A99\r
+:102DFB00088B09EA7001EB70057902022EDD8E82D9\r
+:102E0B008F83A3A3E024F5850A82850B83F0E0F57D\r
+:102E1B000A750B00780A1207D5EE240EFCEF34006E\r
+:102E2B00FD740212067EE0FAA3E0FB1269587402ED\r
+:102E3B00120649E5087002E5096033EE2421F5829C\r
+:102E4B00EF3400F583E0850882850983A3A3A3A350\r
+:102E5B00A3A3A3F0EE2422F582EF3400F583E085E3\r
+:102E6B000882850983A3A3A3A3A3A3A3A3F074132D\r
+:102E7B0012067EE07002A3E0602575080475090058\r
+:102E8B0078081207D5EE2407FCEF3400FD741512F9\r
+:102E9B00067EE0FAA3E0FB1269587402120649E5BC\r
+:102EAB000E7002E50F6014EE240CF582EF3400F582\r
+:102EBB0083E05407850E82850F83F08E828F83A368\r
+:102ECB00E0FA7901122520E48E828F83F0F98002DB\r
+:102EDB00790474021206497F080206EA74F312069B\r
+:102EEB008A74FE120633EAFEEBFFEE240BF582EF3B\r
+:102EFB003400F583E0543FF509750A04750B00782F\r
+:102F0B000A1207D590F5A3E0FCA3E0FDEE2407FA27\r
+:102F1B00EF3400FB1268FF7402120649EA7001EBF2\r
+:102F2B007010E48E828F83F074021206497F0602C2\r
+:102F3B0006EAEE240BF582EF3400F583E0A2E640BF\r
+:102F4B00E1E509603EC394075039EE2402FAEF34F1\r
+:102F5B0000FBE509C33324F8F582E434F9F583E08B\r
+:102F6B00F8A3E0F5838882120688E9FA74016A7087\r
+:102F7B0004740180AE74026A70A8EEFAEFFB123192\r
+:102F8B00EC80A5743F6509600EE509C3942040925F\r
+:102F9B00E509C3943F508BEE2403F50AEF3400F59B\r
+:102FAB000B750C04750D00780C1207D5AC0AAD0B24\r
+:102FBB0090F5A3E0FAA3E0FB1268FF740212064936\r
+:102FCB00EA7001EB70057508018003750800E508D0\r
+:102FDB007020743F65097073780C1207D512359900\r
+:102FEB00AD0BAC0A1268FF7402120649EA7001EBD2\r
+:102FFB007059851082851183AC82AD83EE2402FA61\r
+:10300B00EF3400FB121F9DE97003022F2DE50870B2\r
+:10301B0007EEFAEFFB1231EC74018E828F83F09086\r
+:10302B00F5A7E07002A3E07003022F3385108285B1\r
+:10303B001183E0F990F5A7E0F8A3E0F583888212FD\r
+:10304B000688E96003022F2D022F33740112067ECE\r
+:10305B00AC82AD83AA0AAB0B123A52EA7001EB6059\r
+:10306B0036EE2402FAEF3400FB1233DFE960030281\r
+:10307B002F2DEE240BF582EF3400F583E0A2E75001\r
+:10308B0003022F2DEE240CF582EF3400F583E0C202\r
+:10309B00E7F07403022F2EEE240CF582EF3400F5CB\r
+:1030AB0083E0543064206003022F85022F2D74F8C7\r
+:1030BB0012068AEAFEEBFFE9FAEE240CF8EF340075\r
+:1030CB00F990F5A6C082C08388828983E054CFD063\r
+:1030DB0083D082FBE04B88828983F0EAF9EE2402ED\r
+:1030EB00FAEF3400FB1216A1E97004790080027923\r
+:1030FB0009E48E828F83F07F010206EAC082C083CF\r
+:10310B0090F5A5E0F9D083D0822274F712068A7469\r
+:10311B00DF120633E9FEEA240BF582EB3400F5836C\r
+:10312B00E0FF90F5A5C082C08390F5A6C082C08356\r
+:10313B00740A12067EE054CFD083D082FCE04C544C\r
+:10314B00BFD083D082FCE04CC0E0740A12067ED064\r
+:10315B00E0F075080475090078081207D5EA240514\r
+:10316B00FCEB3400FD740312067EAA82AB8312695A\r
+:10317B0058740212064978081207D590F5A3E0FCA3\r
+:10318B00A3E0FD740712067EAA82AB831269587402\r
+:10319B0002120649740912067EE054C04EF0740BFD\r
+:1031AB00851082851183F0EFC0E0740B12067ED080\r
+:1031BB00E0F0740A12067EE05478F0E0440BF074F1\r
+:1031CB000912067EE0543FF0790085108285118349\r
+:1031DB00AA82AB831216A174211206497F02020642\r
+:1031EB00EA74F812068AEAFEEBFFEE240CF582EF86\r
+:1031FB003400F583E05407FA74FF2AFBEA6017E00A\r
+:10320B0054F84BF07A017B00121A397901EEFAEF80\r
+:10321B00FB1230B98006E48E828F83F07F010206A9\r
+:10322B00EA74F312068A74FD1206338A0C8B0D892D\r
+:10323B0008EA2508F8EB3400F9740C28F582E43918\r
+:10324B00F583E0F5097402851082851183F0740112\r
+:10325B0012067EEAF0A3EBF07C02851082851183C7\r
+:10326B00AA82AB8379011225688A0A8B0BA80AA95B\r
+:10327B000BE8FEE9FFE87001E96006EEFAEFFB8070\r
+:10328B006C79021227AA8A0A8B0BAE0AAF0B750850\r
+:10329B0000804F8E828F83E06403703C750A047547\r
+:1032AB000B00780A1207D5E50C2405FCE50D34005C\r
+:1032BB00FDEE2403FAEF3400FB1268FF74021206D2\r
+:1032CB0049EA7001EB7011EE240BF582EF3400F537\r
+:1032DB0083E0543F650960A30508EE2423FEEF3419\r
+:1032EB0000FFE508C3940240AA7A007B0074031226\r
+:1032FB0006497F060206EA74F512068A74DF120687\r
+:10330B0033EAFEEBFFEE240EF582EF3400F583E09B\r
+:10331B00F50890F5A5C082C083740A12067EE054AE\r
+:10332B008FD083D082FAE04A4420C0E0740A1206A0\r
+:10333B007ED0E0F0750A04750B00780A1207D5EE03\r
+:10334B002405FCEF3400FD740312067EAA82AB83C6\r
+:10335B001269587402120649780A1207D5EE240F27\r
+:10336B00FCEF3400FD740712067EAA82AB83126950\r
+:10337B00587402120649740912067EE054C04508BF\r
+:10338B00FAF0740B851082851183F090F5A2E0C0E2\r
+:10339B00E0740B12067ED0E0F090F5A2E004F0741E\r
+:1033AB000A12067EE05471F0E0D2E0F074BF5A448A\r
+:1033BB0080C0E0740912067ED0E0F079008510829F\r
+:1033CB00851183AA82AB831216A174211206497F41\r
+:1033DB00040206EA74F112068A8A0C8B0D8A828B20\r
+:1033EB0083E024F8F50979011227AA8A0A8B0BAE20\r
+:1033FB000AAF0B750800800A0508EE2423FEEF3494\r
+:10340B0000FFE508C3940640030234F48E828F83D9\r
+:10341B00E0640370E385098285820E8E82A3A3E0AC\r
+:10342B00F874F828F874FF3400F9E50E687001E9B8\r
+:10343B0070C6750A04750B00780A1207D5850C82C5\r
+:10344B00850D83A3AC82AD83EE2403FAEF3400FB2E\r
+:10345B001268FF7402120649EA7001EB709A780A3F\r
+:10346B001207D5E50C2405FCE50D3400FDEE240711\r
+:10347B00FAEF3400FB1268FF7402120649EA70017E\r
+:10348B00EB6003023403750A01780A1207D5E50CC9\r
+:10349B002409FCE50D3400FDEE240BFAEF3400FBA0\r
+:1034AB001268FF7402120649EA7001EB60030234E2\r
+:1034BB000374FE250EF50A74FF3400F50B780A121F\r
+:1034CB0007D5E50C240BFCE50D3400FDEE240DFABD\r
+:1034DB00EF3400FB1268FF7402120649EA7001EB2D\r
+:1034EB0060030234037901800279007F080206EA47\r
+:1034FB002279002274F712068A7508047509007880\r
+:10350B00081207D57C007D007AA97BF5126A3F74FF\r
+:10351B000212064990F5B1E0701B78081207D57CB2\r
+:10352B00067DFA7AAD7BF51269587402120649745E\r
+:10353B000190F5B1F07F020206EAC082C08390F5DC\r
+:10354B00B1E060067AAD7BF580047A067BFAD08316\r
+:10355B00D082227A0B7BFA2279022274F712068A26\r
+:10356B00790090F5B1E0702175080489097808128B\r
+:10357B0007D5EAFCEBFD7AAD7BF5126958740212A4\r
+:10358B000649740190F5B1F0F97F020206EA7ABEA2\r
+:10359B007BF92274F512068AEAFEEBFFEE2405F89E\r
+:1035AB00EF3400F988828983E012084D010506C2C9\r
+:1035BB00350103C235C6357D0180027D038E828FB6\r
+:1035CB0083A3A3A3A3E0FC8E828F83A3A3E0FAA320\r
+:1035DB00E0FB88828983E0F9122C328A088B09A9D7\r
+:1035EB0009EA7001E96031750A04750B00780A125B\r
+:1035FB0007D58E828F83E0FCA3E0FDEA24030A0A41\r
+:10360B000AE93400FB12695874021206497901AABF\r
+:10361B0008AB091230B9800279037F040206EA7401\r
+:10362B00F712068A74FD120633E485108285118326\r
+:10363B00F08A828B83A3A3A3A3A3E0C0E07401123F\r
+:10364B00067ED0E0F0EA2406F508EB3400F50978A5\r
+:10365B00081207D58A828B831207EAEA2404F5083D\r
+:10366B00EB3400F50978081207D58A828B83A3A364\r
+:10367B00E0FCA3E0FD740612067EAA82AB83122D3A\r
+:10368B0092740612064974031206497F020206EA77\r
+:10369B0074F512068AEAFEEBFF7508007404697074\r
+:1036AB000912198512186F02374B740569700912CC\r
+:1036BB00189412194002374B74066970398E828F39\r
+:1036CB0083E0F9121DA9EA7001EB70047902807294\r
+:1036DB00750A02750B00780A1207D5EA2407FCEB72\r
+:1036EB003400FD8E828F83A3AA82AB831269587438\r
+:1036FB0002120649804A740769700B121AF1E98E9F\r
+:10370B00828F83F0803A74086960A7740969700529\r
+:10371B00121985802B740A6970238E828F83E012B5\r
+:10372B0008170002D7363F373B3737377902800609\r
+:10373B00790180027900121BC1790080057508029E\r
+:10374B00A9087F040206EA740B69700479018002F0\r
+:10375B007902123AC679002274F712068AEAFEEB56\r
+:10376B00FF750802740169702075080475090078EB\r
+:10377B00081207D5123545EAFCEBFDEEFAEFFB120A\r
+:10378B00695874021206498009E97009123566E915\r
+:10379B006003750800A9087F020206EA74F7120697\r
+:1037AB008AE9FC8A828B83E0F9740E6C60047902DF\r
+:1037BB00801374FF6960F7121DA9EA7001EB60EECC\r
+:1037CB00121D9A79007F020206EA74F512068A909E\r
+:1037DB00F5B2C082C08390F9B2780812052BD08362\r
+:1037EB00D082780812034F701090FA0F78081205E8\r
+:1037FB002B90F5B2780812053A90F5B6EAF0A3EBE8\r
+:10380B00F01218D1E990F5B8F0123875123BB87474\r
+:10381B000190F5BBF0121E5A90F5B9EAF0A3EBF04C\r
+:10382B007F040206EA74F512068A8A088B098C0A51\r
+:10383B008D0B90F9B2780812034F600890F5B278AF\r
+:10384B000812053A7F040206EA74F512068AEA703A\r
+:10385B0001EB601190F5B2780812052B8A828B83ED\r
+:10386B00780812053A7F040206EA7AEF7BBE7CAD3C\r
+:10387B007DDE2274F312068A74F4120633EAFEEB31\r
+:10388B00FF8E828F83E0F874F528F874FF3400F90B\r
+:10389B00C3E89408E99400A2D265D0334018EE2413\r
+:1038AB0013F582EF3400F583E0F508123563E96513\r
+:1038BB00086003023A457904740112067EAC82ADAE\r
+:1038CB0083EE240EFAEF3400FB122365C082C08313\r
+:1038DB0090F5B2780812052BD083D08278081203AA\r
+:1038EB004F6003023A45740112067EAA82AB831223\r
+:1038FB003BDC7904740712067EAC82AD8374011233\r
+:10390B00067EAA82AB831223C4E4C0E0740B1206BA\r
+:10391B007ED0E0F07481C0E0740512067ED0E0F03A\r
+:10392B00EE240DF582EF3400F583E0C0E07406124F\r
+:10393B00067ED0E0F07D017C07740512067EAA821C\r
+:10394B00AB837903122C328A088B09A808A9098842\r
+:10395B000A890BE87001E97003023A45EE2405F57C\r
+:10396B0008EF3400F509750C04750D00780C12077F\r
+:10397B00D5AC08AD09EA24030A0A0AE93400FB12A4\r
+:10398B0069587402120649EE2412F582EF3400F5E1\r
+:10399B0083E06024EEFAEFFB121E5FE9601A90F5EC\r
+:1039AB00B6E07002A3E06010790090F5B6E0F8A3E2\r
+:1039BB00E0F58388821206888E828F83A3A3A3A34C\r
+:1039CB00A3A3A3A3A3A3E0A2E6506685108285114F\r
+:1039DB0083AC82AD83AA08AB09123A52EA7001EBB1\r
+:1039EB00704A90F5B9E0FEA3E0FF8E828F83E0C3AF\r
+:1039FB0094035046780C1207D5AC08AD098E828F14\r
+:103A0B0083E075F005A4F8A9F090F5B9E028FAA3C6\r
+:103A1B00E0398A82F583A3AA82AB831269587402B8\r
+:103A2B001206498E828F83E004F08005E0F9124282\r
+:103A3B00187900AA0AAB0B1230B9740C1206497F25\r
+:103A4B00060206EA79002274F112068A8A0E8B0F9F\r
+:103A5B008C088D0990F5B9E02401FEA3E03400FF3A\r
+:103A6B00750A00800A050AEE2405FEEF3400FF906C\r
+:103A7B00F5B9E0F8A3E0F5838882E0FAE50AC39A8A\r
+:103A8B005030750C04750D00780C1207D5AC0EADCB\r
+:103A9B000FEEFAEFFB1268FF7402120649EA70018F\r
+:103AAB00EB70C2850882850983E50AF0EEFAEFFB1D\r
+:103ABB0080047A007B007F080206EAC082C0837410\r
+:103ACB000169700474018001E490F5BBF0D083D0E0\r
+:103ADB008222C082C083EA240CF8EB3400F98A827C\r
+:103AEB008B83E0FC74F52CFC74FF3400FD74076CC5\r
+:103AFB007001ED7007740188828983F08882898355\r
+:103B0B00E06401700312387ED083D0822274F812E5\r
+:103B1B00068AEAFEEBFF7508007D017C0090F5B884\r
+:103B2B00E0F9122211E9FB7008121AB57508018031\r
+:103B3B001C74016B7005750802801274026B700D9A\r
+:103B4B0090F5BBE06007EEFAEFFB123ADDA9087FB8\r
+:103B5B00010206EA74F512068A90F5BCC082C08396\r
+:103B6B0090F9B2780812052BD083D0827808120313\r
+:103B7B004F701090FA13780812052B90F5BC78084B\r
+:103B8B0012053A1218D1E990F5C3F060F6750801E9\r
+:103B9B0075090078081207D57C007D007AC17BF58A\r
+:103BAB00126A3F74021206497F040206EA74F51288\r
+:103BBB00068A8A088B098C0A8D0B90F9B278081249\r
+:103BCB00034F600890F5BC780812053A7F04020693\r
+:103BDB00EA74F512068AEA7001EB601190F5BC7875\r
+:103BEB000812052B8A828B83780812053A7F040210\r
+:103BFB0006EA74F312068A74FD120633EAFEEBFF33\r
+:103C0B00750A08EE2405F508EF3400F509EE240ECD\r
+:103C1B00F582EF3400F583E0F9AA08AB091222C84C\r
+:103C2B00EA7001EB6006121D9A750A00748285100A\r
+:103C3B0082851183F0EE240DF582EF3400F583E0DD\r
+:103C4B00C0E0740112067ED0E0F0740212067EE52D\r
+:103C5B000AF07D037C03851082851183AA82AB83D6\r
+:103C6B007902122C328A0A8B0BA80AA90BE8FEE9FF\r
+:103C7B00FFE87001E9602A750A04750B00780A12D7\r
+:103C8B0007D5AC08AD09EE24030A0A0AEF3400FB92\r
+:103C9B0012695874021206497900EEFAEFFB1230E2\r
+:103CAB00B974031206497F060206EA74F112068AFA\r
+:103CBB0074F81206338A088B098A828B83E0F874B6\r
+:103CCB00F528F874FF3400F9C3E89409E99400A2CD\r
+:103CDB00D265D033401FEA2414F582EB3400F58310\r
+:103CEB00E0FE123563E96E600C7902740812064926\r
+:103CFB007F080206EA7904E912067EAC82AD83E501\r
+:103D0B0008240EFAE5093400FB122365C082C08338\r
+:103D1B0090F5BC780C12052BD083D082780C120353\r
+:103D2B004F70C6E5082412F582E5093400F583E0EF\r
+:103D3B00F50AE5082405F50EE5093400F50FA90A87\r
+:103D4B00AA0EFB121DEA8A0C8B0DA80CA90DE8FE1E\r
+:103D5B00E9FFE87001E97003023E1174818510825E\r
+:103D6B00851183F0E508240DF582E5093400F58310\r
+:103D7B00E0C0E0740112067ED0E0F08E828F83A348\r
+:103D8B00A3A3A3A3A3A3A3A3E0C0E0740212067E84\r
+:103D9B00D0E0F0123107E9C0E0740312067ED0E0E8\r
+:103DAB00F0850882850983A3A3A3A3A3A3A3A3A33D\r
+:103DBB00A3E05407FA7403C39AFD7C048510828533\r
+:103DCB001183AA82AB837902122C328A088B09A940\r
+:103DDB0009EA7001E9602A750A04750B00780A126A\r
+:103DEB0007D5AC0EAD0FEA24030A0A0AE93400FB2F\r
+:103DFB0012695874021206497900AA08AB091230ED\r
+:103E0B00B97901023CF690F5C0E07003023CF4AACC\r
+:103E1B0008AB09121F038A0C8B0DAE0CAF0DEE70A5\r
+:103E2B0001EF700B121CF18A0C8B0DAE0CAF0DEE6B\r
+:103E3B007001EF60CC750C04750D00780C1207D572\r
+:103E4B00AC0EAD0FEE2403FAEF3400FB126958747D\r
+:103E5B0002120649EEFAEFFB79021220A0E9700973\r
+:103E6B00EEFAEFFB121D9A809890F5C2E0640160A8\r
+:103E7B00EFE0F50C7401250CF0EE240BF582EF341A\r
+:103E8B0000F583E0C0E0E50C24C1F582E434F5F5E0\r
+:103E9B0083D0E0F08E828F83A3A3A3A3A3A3A3A3BA\r
+:103EAB00A3A3E50AF074028E828F83F0A3A882A9E4\r
+:103EBB0083E5082413F582E5093400F583E06440BB\r
+:103ECB00700474018002740388828983F08E828F60\r
+:103EDB0083A3A3A3A3A3A3A3A3A3E0C0E074021291\r
+:103EEB00067ED0E0F0123107E9C0E0740312067EC3\r
+:103EFB00D0E0F07481851082851183F0E508240DE4\r
+:103F0B00F582E5093400F583E0C0E0740112067E0A\r
+:103F1B00D0E0F0850882850983A3A3A3A3A3A3A361\r
+:103F2B00A3A3A3E05407FA7403C39AFD7C04851082\r
+:103F3B0082851183AA82AB837902122C328A088B79\r
+:103F4B0009A909EA7001E96030750A04750B00785C\r
+:103F5B000A1207D5AC0EAD0FEA24030A0A0AE9349C\r
+:103F6B0000FB12695874021206497900AA08AB09C2\r
+:103F7B001230B9E97003023E0C023E6B74F8120664\r
+:103F8B008AEAFEEBFF7D017C0090F5C3E0F912227B\r
+:103F9B0011E9FB7007121AB57901801074016B706F\r
+:103FAB000479028007EEFAEFFB12402C7F01020628\r
+:103FBB00EA74F712068A7900A2AFE492E0FAC2AF74\r
+:103FCB0090F5C2E0603AE014F0EAA2E092AF091279\r
+:103FDB00401590F5C1E0F97C00ECC0E090F5C2E033\r
+:103FEB00FAD0E0C39A501E8C08E50824C1FAE434D9\r
+:103FFB00F5FB8A828B83A3E08A828B83F00C80D9BA\r
+:10400B00EAA2E092AF7F020206EAC082C083E970A7\r
+:10401B00047A0180027A00EA90F5C0F0D083D08256\r
+:10402B002274F812068A7E00EA240CF8EB3400F9AD\r
+:10403B008A828B83E0FC74F52CFC74FF3400FD74D6\r
+:10404B00086C7001ED7007740188828983F0888297\r
+:10405B008983E01208170101804069407D40123CC2\r
+:10406B00B6E9FA90F5C0E0700C74016A60070E0EA9\r
+:10407B008003123BFDEEF97F010206EA74F712068C\r
+:10408B008A1218D1E990F5C7F07508037509007805\r
+:10409B00081207D57C007D007AC47BF5126A3F7449\r
+:1040AB00021206497F020206EA74F712068AEAFE3A\r
+:1040BB00EBFF7D017C0090F5C7E0F9122211E9FBC3\r
+:1040CB007007121AB57901803B74016B7004790289\r
+:1040DB00803275080475090078081207D51235452A\r
+:1040EB00EAFCEBFD8E828F83A3AA82AB831268FF5F\r
+:1040FB007402120649EA7001EB70D3EEFAEFFB1271\r
+:10410B00411479007F020206EAC082C083EA240CC4\r
+:10411B00F582EB3400F583E06401700312412FD07C\r
+:10412B0083D0822274F612068A74FF120633EAFEDB\r
+:10413B00EBFFEE240DF582EF3400F583E0F50A85F5\r
+:10414B001082851183AC82AD83EE2405FAEF340027\r
+:10415B00FB123A52EAF8EBF9EA7001EB70030242F8\r
+:10416B000EE82404F508E93400F509E024C4F582CF\r
+:10417B00E434F5F583E07021850882850983E50A2F\r
+:10418B00F07401C0E0851082851183E024C4F582B0\r
+:10419B00E434F5F583D0E08012AA0A8508828509FC\r
+:1041AB0083E0F912233DE9605AE50AF07902EEFA51\r
+:1041BB00EFFB12322C8A088B09A808A909E87001B9\r
+:1041CB00E9603988828983A3E0FA7901122520E519\r
+:1041DB0008240CF582E5093400F583E054F844011A\r
+:1041EB00F0E508240BF582E5093400F583E0D2E70E\r
+:1041FB00F07900AA08AB091230B98007EEFAEFFB91\r
+:10420B0012330274011206497F030206EA74F71295\r
+:10421B00068AE4C0E0E924C4F582E434F5F583D0E2\r
+:10422B00E0F07F020206EAC082C0831218D1E99047\r
+:10423B00F5C8F0D083D0822274F512068AEAFEEB21\r
+:10424B00FF7D038E828F83E024F5FCEE240CFAEFC6\r
+:10425B003400FB7901122C328A088B09A909EA7008\r
+:10426B0001E9603E750A04750B00780A1207D5EE5A\r
+:10427B002405FCEF3400FDEA24030A0A0AE93400A2\r
+:10428B00FB1269587402120649E508240EF582E503\r
+:10429B00093400F583E0D2E7F07900AA08AB0912E4\r
+:1042AB0030B97F040206EA74F812068AEAFEEBFFC5\r
+:1042BB007D017C0090F5C8E0F9122211E9FA700734\r
+:1042CB00121AB57901801274016A7004790280099F\r
+:1042DB00EEFAEFFB1242E979007F010206EAC08297\r
+:1042EB00C083EA240CF582EB3400F583E0640170A3\r
+:1042FB0003124243D083D0822222790022C082C093\r
+:10430B0083124638E490F5D4F0FB8029EB75F00569\r
+:10431B00A424D5F8E5F034F5F9E488828983F0A379\r
+:10432B00F0A3F088828983A3A3A3F088828983A357\r
+:10433B00A3A3A3F00BEBC3940A40D1D083D082226A\r
+:10434B0074F112068A74FB12063374018510828590\r
+:10435B001183F01243081248997A007BC0124971FD\r
+:10436B0075E54475E402539BFCE59B53E9EF4391E0\r
+:10437B0010D2A8439A01D2B990F410E4F0A3F080C4\r
+:10438B000B90DF3BE06401700375E10290F5D4E024\r
+:10439B00C3940A500690F608E060E675E10490F6C7\r
+:1043AB0008E0700990F5D4E0C39405500B90F4101D\r
+:1043BB00E4F0A374800245857A0080010AEAC39475\r
+:1043CB000A5031EA75F005A424D5F8E5F034F5F977\r
+:1043DB0088828983E060E5A3E0FAA3E0FB74031213\r
+:1043EB00067EEAF0A3EBF088828983A3A3A3E0F512\r
+:1043FB000C750D007A0980011AEA602E75F005A480\r
+:10440B0024D5F8E5F034F5F988828983E060E9A3D7\r
+:10441B00E0FAA3E0FB740112067EEAF0A3EBF0884E\r
+:10442B00828983A3A3A3E0FE7F00750800750900B2\r
+:10443B007C007D007A008015E508250AF508E50962\r
+:10444B003400F509EC24010CED3400FD0AEAC394A9\r
+:10445B000A5033EA75F005A424D5F582E5F034F55E\r
+:10446B00F583E060E7E5822404F582E5833400F50B\r
+:10447B0083E0F50AE0A2E750BFA80AE50828F50893\r
+:10448B00E50934FF80BCA808A909ECFAEDFB12057D\r
+:10449B00B0880EC3E894E7E994FFA2D265D033400D\r
+:1044AB000EC3E8941AE99400A2D265D033400B9066\r
+:1044BB00F410E8F0A37420024585EEC3950CF8EFD9\r
+:1044CB00950DF9E875F0CCA4C8AAF075F00CA42AE8\r
+:1044DB00FA75F0CCE9A42AF9740112067EC082C0E9\r
+:1044EB0083740312067EE0FAA3E0FBD083D082E054\r
+:1044FB00C39AFEA3E09BFFE8C39EFAE99FFBC3EAC6\r
+:10450B009404EB94005036740F5AF990F410E4F0C5\r
+:10451B00A3E9F0C3E5099400A2D265D0335046C39A\r
+:10452B00E49508F8E49509F9ECFAEDFB1205B8E807\r
+:10453B00F404F890F410E048F0A3E08045EEC39843\r
+:10454B00F8EF99F9C3E89404E994005025740F58D7\r
+:10455B00F990F410E4F0A3E9F0C3E5099400A2D2BA\r
+:10456B0065D03340BAA808A909ECFAEDFB1205B8DF\r
+:10457B0080C190F410E4F0A37440F0E485108285C0\r
+:10458B001183F0851082851183E06401600302467C\r
+:10459B001EE490F5D4F0FA8029EA75F005A424D531\r
+:1045AB00F8E5F034F5F9E488828983F0A3F0A3F001\r
+:1045BB0088828983A3A3A3F088828983A3A3A3A35F\r
+:1045CB00F00AEAC3940A40D1E50E90DF08F01248D6\r
+:1045DB00997A007B40124971800B90DF3BE06401BC\r
+:1045EB00700375E10290F5D4E0700690F608E06078\r
+:1045FB00E975E10490F5D4E0601090F5D9E0FAC3C9\r
+:10460B0094FE500FEAC39403400990F410E4F0A316\r
+:10461B007410F0C2A8539AFEC2B975E40075E25546\r
+:10462B0012489974051206497F080206EAC082C037\r
+:10463B008374CA90DF00F074BA90DF01F0740A90B3\r
+:10464B00DF02F0E490DF03F090DF04F090DF05F081\r
+:10465B0090DF06F0741290DF07F0E490DF08F0743F\r
+:10466B002490DF09F0742D90DF0AF0745590DF0B66\r
+:10467B00F0743D90DF0CF0745590DF0DF0741590D5\r
+:10468B00DF0EF0741290DF0FF0741190DF10F074E6\r
+:10469B006090DF11F0740790DF12F0740290DF135B\r
+:1046AB00F0741890DF14F0741D90DF15F0741C90EB\r
+:1046BB00DF16F074C790DF17F0741090DF18F074EA\r
+:1046CB00B290DF19F074B690DF1AF0741090DF1B04\r
+:1046DB00F074EA90DF1CF0742A90DF1DF0E490DF99\r
+:1046EB001EF0741F90DF1FF0E490DF2FF090DF308F\r
+:1046FB00F090DF31F0743190DF24F090DF1CE04458\r
+:10470B0020F0745A90DF2EF075E10475E10190DF13\r
+:10471B003BE0640170F890DF1CE054CFF075E104CE\r
+:10472B00D083D0822274F112068AE5D990F5C9F0B4\r
+:10473B00740190F5D3F07890F9801DA2895019E59A\r
+:10474B00D9C0E0E024C9F582E434F5F583D0E0F07C\r
+:10475B0090F5D3E004F0C289E0C3940A5012E8FA52\r
+:10476B00E9FB74FF2A1874FF3BF9EA7001EB70CB7D\r
+:10477B00E0640A600302483875E104AAE28A828584\r
+:10478B008208E5E3F8E4C8F50990F60FE0FA75F056\r
+:10479B00BDA4CAACF075F02CA42CFB880A880B7452\r
+:1047AB000F78081204AD90FA21780C12052B7808BB\r
+:1047BB00790C120424E5082AF508E5093BF5097C78\r
+:1047CB00017B0180218B82A882E824C9F582E43425\r
+:1047DB00F5F583E0FAE82417F582E434FAF583E083\r
+:1047EB006A60027C000BEBC3940A40D9EC603E90EC\r
+:1047FB00F5D4E075F005A424D5F8E5F034F5F9749B\r
+:10480B000188828983F0A3E508F0A3E509F090F510\r
+:10481B00C9E088828983A3A3A3F090DF38E0888264\r
+:10482B008983A3A3A3A3F090F5D4E004F07F08023F\r
+:10483B0006EAC082C083E5E9FA539BFCE59BEAA23A\r
+:10484B00E7500575E1048014A2E6501075E1049061\r
+:10485B00DF3BE0640170F8E490F5D3F075E900D02C\r
+:10486B0083D08222C082C083C2A8539AFE74FF9069\r
+:10487B00DF06F074C090DF2EF0740190DF02F0754C\r
+:10488B00D95575E103D083D0822275E10422C08211\r
+:10489B00C083E490F607F090F608F090F609F0A3C9\r
+:1048AB00F090F60BF090F60CF0A3F090F60EF09063\r
+:1048BB00F60FF0D083D0822274F712068A7C009018\r
+:1048CB00F60BE0603E53E5BF75DBFF75DAFFE5DB0A\r
+:1048DB00F9E5DAF874FF68700374FF69601375DB30\r
+:1048EB00FF75DAFFE5DBF9E5DAF8EC0CC3940B4066\r
+:1048FB00E3E014F053E40FE5E443E54079017F0274\r
+:10490B000206EA90F60CC3E09406A3E09400405232\r
+:10491B0053E5BF90F60CE024FFA3E034FFF5DB90EA\r
+:10492B00F60CE014F5DAE5DBF9E5DAF8E024FFFA4A\r
+:10493B00A3E034FFFBEA687002EB696017EBF5DB71\r
+:10494B0090F60CE014F5DAE5DBF9E5DAF8EC0CC3DC\r
+:10495B00940B40D890F60CE4F0A3F0740190F60E93\r
+:10496B0080917900809874F112068A53E5BFE49028\r
+:10497B00F607F090F60B800AEA2443FAEB34D3FBEC\r
+:10498B00E004F0C3EA94BDEB942C50EC8A088B093D\r
+:10499B00750A00750B0090FA21780C12052B78081C\r
+:1049AB00790C1203A4740F780812049490F60CE59A\r
+:1049BB0008F0A3E509F01248C353E40FE5E443E51F\r
+:1049CB0040740190F607F07F080206EAC082C083AC\r
+:1049DB0090F609E0F8A3E0F9C3E89AE99B5009EADD\r
+:1049EB00C398F8EB99F9800CE86A7002E96B70EFE9\r
+:1049FB0078FF79FF90F609EAF0A3EBF0E8FAE9FB10\r
+:104A0B00124971D083D08222C082C083740190F688\r
+:104A1B0007F0D083D08222C082C083E490F607F0E7\r
+:104A2B00D083D08222C082C083E490F608F0D0837A\r
+:104A3B00D08222C082C08390F62CE0FA74226A7076\r
+:104A4B001A90F619E0703390F62DE0F8A3E0F99088\r
+:104A5B00F650E8F0A3E9F07402801B74206A70141E\r
+:104A6B0090F619E0701490F6267449F0A374F6F0E2\r
+:104A7B00A3E480E2740490F619F0D083D08222C0B4\r
+:104A8B0082C08390F62CE06421702090F619E070C0\r
+:104A9B002090F6267449F0A374F6F0A3E4F090F698\r
+:104AAB00297407F0A3E4F074018002740490F619E2\r
+:104ABB00F0D083D08222C082C083740490F619F0A8\r
+:104ACB00D083D08222C082C083740490F619F0D0B8\r
+:104ADB0083D08222C082C083740490F619F0D083F5\r
+:104AEB00D08222C082C083740490F619F0D083D098\r
+:104AFB0082222222C082C08390FA25E0F8A3E0F93B\r
+:104B0B0090F610E8F0A3E9F0D083D0822274F8126B\r
+:104B1B00068AE9FCEAFD7A007B00802190F610E022\r
+:104B2B00F8A3E0F5838882E493F890F610E028F878\r
+:104B3B00A3E03400F990F610E8F0A3E9F090F6103A\r
+:104B4B00E0F8A3E0F990FA27E0687003A3E069604E\r
+:104B5B004890F610E02401F8A3E03400F98882892C\r
+:104B6B0083E4936C702B90F610E0FAA3E0FB90F6C5\r
+:104B7B0010E0F8A3E0F5838882E493F890F610E058\r
+:104B8B0028F8A3E03400F990F610E8F0A3E9F080E0\r
+:104B9B0008E4936D7086ED60837F010206EA124A8A\r
+:104BAB00FF7A007901124B182274F712068AE9FE7C\r
+:104BBB00EAFF124AFF800E8A828B83A3A3A3A3A3CF\r
+:104BCB00E4936E60147A007902124B18EA7001EBD1\r
+:104BDB006007EE70E2EF1F70EC7F020206EA74F7DB\r
+:104BEB0012068AEAFEEBFF7A00124BB47A027904C2\r
+:104BFB00124B18EA7001EB60178A828B83A3A3E434\r
+:104C0B00936E70E88A828B83A3A3A3E4936F70DC0B\r
+:104C1B007F020206EA74F712068AE9FE124AFF7A4D\r
+:104C2B00007903124B18EE1E70F57F020206EAC0E4\r
+:104C3B0082C0837A007901124BB48A828B83A3A33F\r
+:104C4B00A3A3A3A3A3E493A2E6500474018001E4FD\r
+:104C5B0090F625F0E490F624F043BE80D2BDD083CD\r
+:104C6B00D08222C082C083740290F612F0E490F6D8\r
+:104C7B0013F090F619F07903124EF9752100752295\r
+:104C8B0000D083D0822274F512068A90DE0EE0FEED\r
+:104C9B00E4F090DE11E0FFA2E4501F7480F0740783\r
+:104CAB0090F619F0E5217002E522600985218285D5\r
+:104CBB002283120688E490F619F0EFA2E25009E481\r
+:104CCB0090DE11F090F619F090F619E0FA74026A82\r
+:104CDB006003024D6790DE16E0F50A90F626120788\r
+:104CEB00E6A90A7A207BDE124F3F74031206498530\r
+:104CFB000A0890F629C3E09508F0A3E09400F09021\r
+:104D0B00F626E0F9A3E0FAA3E0FBE9250AF9EA3479\r
+:104D1B0000FA90F626E9F0A3EAF0A3EBF090F6295F\r
+:104D2B00E07002A3E060047A4080027A48EA90DEE9\r
+:104D3B0011F090F629E07002A3E07016E5217002E5\r
+:104D4B00E5226009852182852283120688E490F68C\r
+:104D5B0019F0EE90DE0EF07F040206EA74066A701C\r
+:104D6B000985218285228312068890F619E060035B\r
+:104D7B00024E6AEFA2E04003024E6A75082B7509DA\r
+:104D8B00F6750A0078081207D179087A207BDE12B3\r
+:104D9B004F3F740312064975210075220090F62BC4\r
+:104DAB00E054E012084D000600C74D20434E402D45\r
+:104DBB004E80024EA04E4EC0384EFA4D90F62CE06F\r
+:104DCB0012084D000501EB4D03E64D05E14D09F0D1\r
+:104DDB004D0BF54DFA4D1252CC80711252C0806CB6\r
+:104DEB001252B480671256CF80621257F7805D74EF\r
+:104DFB000490F619F0805590F62CE012084D000443\r
+:104E0B0000194E061E4E08234E0A284EFA4D12501C\r
+:104E1B00CA80391253258034125686802F12579927\r
+:104E2B00802A7521C175224A124AC1801F7521D073\r
+:104E3B0075224A124AD0801475213E75224A124AB5\r
+:104E4B003E800975218A75224A124A8A90F619E02A\r
+:104E5B00640470047A6080027A40EA90DE11F0906C\r
+:104E6B00F619E0FA74016A70717F0290F629E0F886\r
+:104E7B00A3E0F9C3E89420E994005007E8F50A7F12\r
+:104E8B000A8003750A2090F6261207E6A90A7A20F3\r
+:104E9B007BDE124F797403120649850A0890F626B9\r
+:104EAB00E0F9A3E0FAA3E0FBE92508F9EA3400FAFC\r
+:104EBB0090F626E9F0A3EAF0A3EBF090F629C3E015\r
+:104ECB009508F0A3E09400F0EF90DE11F0E50AC333\r
+:104EDB0094204003024D5D024D4774056A60030246\r
+:104EEB004D5D852182852283120688024D5D74F704\r
+:104EFB0012068A7A008014E9C0E08A08E508241AB1\r
+:104F0B00F582E434F6F583D0E0F00AEAC394054069\r
+:104F1B00E67A008014E9C0E08A08E508241FF582D0\r
+:104F2B00E434F6F583D0E0F00AEAC3940540E67F5B\r
+:104F3B00020206EA74F612068AEAFCEBFDE9FE743D\r
+:104F4B000A12067EE0F508A3E0F509A3E0A908AA7A\r
+:104F5B0009FBEE60148C828D83E012038EE9240131\r
+:104F6B0009EA3400FA1EEE70EC7F030206EA74F6CF\r
+:104F7B0012068AEAFCEBFDE9FE740A12067EE0F5E6\r
+:104F8B0008A3E0F509A3E0A908AA09FBEE60141237\r
+:104F9B0003748C828D83F0E9240109EA3400FA1E34\r
+:104FAB00EE70EC7F030206EA74F712068A75230093\r
+:104FBB007524007525008A268B27EA90DE0BF08A74\r
+:104FCB00088B0974047808120611E50890DE07F0C7\r
+:104FDB008A088B0974097808120611E508543E906B\r
+:104FEB00DE09F0438C10758900C2C5758B00C2E8D1\r
+:104FFB00439A027F020206EAC0E074F1120722E52F\r
+:10500B00BEA2E650FA90DE06E0FAA2E25036A826DF\r
+:10501B00E890DE0BF08526088527097404780812C2\r
+:10502B000611E50890DE07F0852608852709740927\r
+:10503B007808120611E508543E90DE09F090DE0167\r
+:10504B00E0D2E0F07823EA46F608E6F690DE02E0DE\r
+:10505B00F508750900740478081206207823E50812\r
+:10506B0046F608E50946F690DE04E0F508750900FA\r
+:10507B00740978081206207823E6F608E50946F647\r
+:10508B00EAA2E0500375250174065A6003752500EA\r
+:10509B00124AFE758B00C2E87F02020781C0E074E2\r
+:1050AB00F2120722E5BEA2E650FAE589A2E7500507\r
+:1050BB00C2BD125921758900C2C57F0102078174D7\r
+:1050CB00F712068A90F62DE07002A3E0701E90F6A0\r
+:1050DB002FE0F8A3E0F974FF59FBE47001EB700CBF\r
+:1050EB0090F631E064027002A3E060057404025193\r
+:1050FB00BC90F62BE0120817800210510D513D5158\r
+:10510B004D51E86008740490F61902519B90F625F6\r
+:10511B00E0600478018002780090F633E8F0A3E4B5\r
+:10512B00F090F624E0606A90F633E04402F0A3E0DE\r
+:10513B00805E90F612E0640470CB90F633E4F0A33B\r
+:10514B00804EE8547FF50890F612E0640470B6E5E3\r
+:10515B0008C3940650AFE5082412F582E434F6F543\r
+:10516B0083E854806010A3A3A3A3A3A3A3E06403C9\r
+:10517B00701578018013E582240CF582E5833400E9\r
+:10518B00F583E0640360EB780090F633E8F0A3E47A\r
+:10519B00F090F619E06404601C90F6267433F0A3CB\r
+:1051AB0074F6F0A3E4F090F6297402F0A3E4F07423\r
+:1051BB000190F619F07F020206EA74F712068A9044\r
+:1051CB00F631E07002A3E0701290F612E064046016\r
+:1051DB001290F62FE07002A3E06008740490F619A9\r
+:1051EB000252AC90F62BE0541F1208170002E65146\r
+:1051FB0001520952235290F62DE0640160057900AB\r
+:10520B000252AFE990F624F060047905800279062A\r
+:10521B007A00124AFD0252AD90F62FE0547FFA90BD\r
+:10522B00F62DE070D9EAC3940650B0EA90DE0EF08A\r
+:10523B0090F62FE054806032E960047B1080027B93\r
+:10524B0040EB90DE11F0E960047B0380027B00EB06\r
+:10525B00C0E0EA2419F582E434F6F583D0E0F0E9F6\r
+:10526B0060047908803479078030E960047B208002\r
+:10527B00027B80EB90DE14F0E960047B0380027B01\r
+:10528B0000EBC0E0EA241EF582E434F6F583D0E0AF\r
+:10529B00F0E96004790A80027909124AFDE490DE94\r
+:1052AB000EF079017F020206EA79001251C5E9700E\r
+:1052BB0003124ADF2279011251C5E97003124AEE3B\r
+:1052CB0022C082C08390F62FE07002A3E070209082\r
+:1052DB00F631E07002A3E0701690F62DE0F8A3E033\r
+:1052EB00F9748058FA74FF59FBEA7001EB6007748C\r
+:1052FB000490F619801EE890DE00F090F62DE090F9\r
+:10530B00F6126009E06402700C74038007E064031A\r
+:10531B0070037402F0D083D0822274F512068A9047\r
+:10532B00F62DE0FAA3E01208170102D9533E53659C\r
+:10533B0053B053124BA990F626EAF0A3EBF0A374EB\r
+:10534B0080F090F626E0F9A3E0FAA3E0FB120374D9\r
+:10535B0090F629F0A3E4F00254AB7900124BB49011\r
+:10536B00F626EAF0A3EBF0A37480F090F626E0F9B2\r
+:10537B00A3E0FAA3E0FBE924020909EA3400FA12DC\r
+:10538B000374FC90F626E0F9A3E0FAA3E0FBE92412\r
+:10539B0003090909EA3400FA120374F9EC90F629AF\r
+:1053AB00F0A3E980B1EAF9124C2090F626EAF0A3BB\r
+:1053BB00EBF0A37480F090F626E0F9A3E0FAA3E0FB\r
+:1053CB00FB12037490F629F0A3E4F00254AB90F6B1\r
+:1053DB0026E4F0A3F0A3F0FC02547C7509007403DF\r
+:1053EB007808120620AE08AF09EA2EF8EB3FF990C9\r
+:1053FB00F62DE0F508A3E0F50988828983E493AAEA\r
+:10540B00096A706CA3E4936508706590F62FE0F55C\r
+:10541B0008A3E0F50988828983A3A3E493AA096A08\r
+:10542B00704E88828983A3A3A3E493650870418897\r
+:10543B00828983A3A3A3A3E493F508740193F509CD\r
+:10544B0090F626E508F0A3E509F0A37480F090FA36\r
+:10545B0029E02EFAA3E03F8A82F583A3A3A3A3A39B\r
+:10546B00A3E493F8740193F990F629E8F0A3E9F01B\r
+:10547B000C90FA29E0FAA3E0FB8C0890FA2BE0F8E9\r
+:10548B00A3E0F9E8C39AF50AE99BF50B7403780AD4\r
+:10549B00120611C3E508950AE4950B50030253E677\r
+:1054AB0090F626E0FCA3E0FDA3E0FEEC4D4E70066B\r
+:1054BB00740490F619F090F619E06404602590F6E8\r
+:1054CB0031E0FAA3E0FB90F629E0F8A3E0F9C3EA98\r
+:1054DB0098EB99500890F629EAF0A3EBF074019041\r
+:1054EB00F619F07F040206EA74F112068A74FE12B2\r
+:1054FB000633851082851183EAF0A3EBF0851082C9\r
+:10550B00851183E0F8A3E0F5838882A3A3A3A3E42A\r
+:10551B0093602B90FA2DE0FEA3E08007EE2404FEAF\r
+:10552B00EF3400FF8E828F83E493F8740193F98537\r
+:10553B001082851183E0687003A3E06970DE750843\r
+:10554B0000805A749090DE14F07410F08882898376\r
+:10555B00E493540364017003750940750A01750BDC\r
+:10556B0000E50C780A1206208E828F83A3A3A393E7\r
+:10557B00550A6006E509D2E0F509E50990DE15F05C\r
+:10558B00EA90DE13F0E4C0E0E50C241EF582E4346F\r
+:10559B00F6F583D0E0F0E490DE0EF005088510827E\r
+:1055AB00851183E0F8A3E0F5838882A3A3A3A3E48A\r
+:1055BB0093FAE508C39A400302567C7A00790512E8\r
+:1055CB004B188A0A8B0BAC0AAD0BEC7001ED60CB60\r
+:1055DB00EC2402F50EED3400F50F850E82F583E415\r
+:1055EB0093540FF50C90DE0EF07509008C828D83B1\r
+:1055FB00A3A3A3A3E4932407F50AA3E4933400F530\r
+:10560B000B7403780A120611AA0AEC2403F8ED3482\r
+:10561B0000F9850E82850F83E493A2E740030255C0\r
+:10562B004E744890DE11F07408F088828983E493FD\r
+:10563B00540364017003750940750A01750B00E58D\r
+:10564B000C780A1206208E828F83A3A393550A60CF\r
+:10565B0006E509D2E0F509E50990DE12F0EA90DEE5\r
+:10566B0010F0E4C0E0E50C2419F582E434F60255A1\r
+:10567B009C74021206497F080206EAC082C083901E\r
+:10568B00F62DE07002A3E0701690F62FE07002A3E7\r
+:10569B00E0700C90F631E064017002A3E0600474DA\r
+:1056AB0004801890F6267413F0A374F6F0A3E4F0BC\r
+:1056BB0090F6297401F0A3E4F0740190F619F0D080\r
+:1056CB0083D0822274F312068A90F612E064026091\r
+:1056DB001F90F62FE07002A3E0701590F631E0708A\r
+:1056EB0002A3E0700B90F62EE0F9E47001E960097B\r
+:1056FB00740490F619F00257947A007901124AFD5E\r
+:10570B0090F62DE0606E7A00F9124BB48A088B0983\r
+:10571B00EA7001EB6056740490F612F090F62DE0EF\r
+:10572B0090F613F0750A00850882850983A3A3A35D\r
+:10573B00A3E493FAE50AC39A5048850A0CE50C24B6\r
+:10574B0014FEE434F6FFE48E828F83F07A00790442\r
+:10575B00124B188A828B83A3A3A3E493FC8E828FB4\r
+:10576B0083E06C70E71254F3050A80BB740490F667\r
+:10577B0019F0800E90F613F0740390F612F0F912F4\r
+:10578B004EF97A007902124AFD7F060206EA74F698\r
+:10579B0012068A90F612E06404701E90F62BE064F9\r
+:1057AB0081701690F62DE07002A3E0700C90F6312C\r
+:1057BB00E064017002A3E060047404802690F62F6D\r
+:1057CB00E02414F508A3E034F6F50990F626E50875\r
+:1057DB00F0A3E509F0A3E4F090F6297401F0A3E43B\r
+:1057EB00F0740190F619F07F030206EA74F71206C3\r
+:1057FB008A90F612E06404701290F62BE06401704C\r
+:10580B000A90F631E07002A3E06008740490F61978\r
+:10581B00F0805890F62DE0FB90F62FE0FA90F613FF\r
+:10582B00E0F9124BE98A088B09A808A909E8FEE9F7\r
+:10583B00FFE87001E960D490F62FE0FA7903124A81\r
+:10584B00FD90F62DE0C0E090F62FE02414F8A3E0D5\r
+:10585B0034F6F988828983D0E0F0EEFAEFFB12542C\r
+:10586B00F390F62FE0FA7904124AFD7F020206EA62\r
+:10587B00C082C08390F645E07002A3E0600E90F604\r
+:10588B0045E0F8A3E0F5838882120688745390F6FE\r
+:10589B0035F074BE90F636F074FC90F637F0744326\r
+:1058AB0090F638F074BE90F639F0740190F63AF039\r
+:1058BB00747590F63BF0748790F63CF0740190F69B\r
+:1058CB003DF074E590F63EF0742590F63FF0747061\r
+:1058DB0090F640F074F390F641F0742290F642F09B\r
+:1058EB00758900C2C5D2BD90F6437435F0A374F62A\r
+:1058FB00F0758235F58312068890F647E07002A3A7\r
+:10590B00E0600E90F647E0F8A3E0F583888212067C\r
+:10591B0088D083D08222C082C083E490F63AF09084\r
+:10592B00F63BF090F63CF090F63DF0D083D082221F\r
+:10593B0074F512068A8A088B098C0A8D0BE490F693\r
+:10594B0075F090F676F090F677F090F649780812AD\r
+:10595B00053AE490F64DF090F64EF0740890F64F41\r
+:10596B00F090F650E4F0A3F0740190F652F0124C64\r
+:10597B003A7AFF7BFF124FB353F4FDD29143FE02F1\r
+:10598B00120A1F7F040206EAC082C0831259AB9031\r
+:10599B00F652E06006125A5A1259F6D083D0822280\r
+:1059AB00A823E85404600E782374FB56F60874FFA2\r
+:1059BB0056F6124C6EA823E85410600E782374EF41\r
+:1059CB0056F60874FF56F6124C91A823E8A2E05045\r
+:1059DB0019782374FE56F60874FF56F612587B7826\r
+:1059EB002374FD56F60874FF56F62274F612068AD7\r
+:1059FB00120A2290DE0EE090F678F0740490DE0E20\r
+:105A0B00F090DE11E0A2E0403690F677E060307562\r
+:105A1B0008537509F6750A0078081207D190F655E8\r
+:105A2B00E0F97A287BDE124F797403120649E49071\r
+:105A3B00F677F0740490DE0EF0740190DE11F090A6\r
+:105A4B00F678E090DE0EF0120A1F7F030206EA746E\r
+:105A5B00F612068A7E00120A2290DE0EE090F6788D\r
+:105A6B00F0740490DE0EF090DE14E0A2E04003022E\r
+:105A7B005B0990DE16E0FF90DE17E0742090FA31A0\r
+:105A8B00F090F675E0F8EF28F8E43400F9E894218B\r
+:105A9B00E994004002E4F0E02453F508E434F6F511\r
+:105AAB00098E0A78081207D1EFF97A287BDE124F9C\r
+:105ABB003F740312064990F675E02FF0740490DEE4\r
+:105ACB000EF0E490DE14F090F675E0C394024005FE\r
+:105ADB0090F655E0FE8E0874FF2508F874FF34002D\r
+:105AEB00F990F675E0FAC3E89AE99400A2D265D072\r
+:105AFB0033500BEEC394034005120C21E4F090F6E7\r
+:105B0B0078E090DE0EF0120A1F7F030206EAC082D5\r
+:105B1B00C08375910075E90075C6B874D390DF002A\r
+:105B2B00F0749190DF01F0741290DF07F0E490DFD6\r
+:105B3B0008F0742490DF09F0743A90DF0AF074EEE9\r
+:105B4B0090DF0BF0E490DF06F0748C90DF2EF07496\r
+:105B5B001D90DF0CF0745590DF0DF0741390DF0E79\r
+:105B6B00F0742390DF0FF0741190DF10F0746390DA\r
+:105B7B00DF11F074B690DF1AF0741090DF1BF07425\r
+:105B8B001890DF14F0743C90DF13F0740790DF1261\r
+:105B9B00F075A48775A36B75A2F8741D90DF15F0D3\r
+:105BAB00741C90DF16F074C790DF17F0E490DF18C9\r
+:105BBB00F074B090DF19F074EA90DF1CF0742A9047\r
+:105BCB00DF1DF0E490DF1EF0741F90DF1FF074599F\r
+:105BDB0090DF20F0748890DF23F0743190DF24F095\r
+:105BEB00740990DF25F0747F90DF21F0748890DFCB\r
+:105BFB0022F0742990DF2FF0741E90DF30F0741BAD\r
+:105C0B0090DF31F0740690DF03F0744590DF04F001\r
+:105C1B0074CA90DF05F074FE90DF02F0D083D0825F\r
+:105C2B002274F712068AE5E9FA90F979E0640260CA\r
+:105C3B000575E900804574505A6450702E53E9EF96\r
+:105C4B0053E9BF539BFCE59B125D3D7508FF75093E\r
+:105C5B000078081207D57C007D007A787BF8126AF1\r
+:105C6B003F7402120649125CC7801053E910E5E934\r
+:105C7B00539BFCE59B740190F876F07F020206EAD9\r
+:105C8B00C082C083E9701190F871E4F0A3F090F832\r
+:105C9B0073F0A3F090F875F0D083D08222C082C04D\r
+:105CAB0083E9701390F871E4F0A3F090F875F0901D\r
+:105CBB00F873EAF0A3EBF0D083D0822274F71206CC\r
+:105CCB008A74F890F97DF0747890F97EF074DF9017\r
+:105CDB00F97BF074D990F97CF090F97FE054E044B3\r
+:105CEB0001F0E490F980F0748190F97FF0741290D8\r
+:105CFB00F982F0741390F981F075D6817508FF75F0\r
+:105D0B00090078081207D57C007D007A787BF812A1\r
+:105D1B006A3F740212064943D601539BFCE59B5321\r
+:105D2B00E9EF740290F979F075E102439110FF02EB\r
+:105D3B0006EAC082C0835391EF740190F979F07534\r
+:105D4B00E10490DF3BE0640170F875D68153D1FE1E\r
+:105D5B00539BFCE59B53E9EFD083D0822274F8125E\r
+:105D6B00068AEAFEEBFF125D3D74DF90F97DF0745D\r
+:105D7B00D990F97EF0EF90F97BF0EE90F97CF090F2\r
+:105D8B00F97FE054E04401F0E490F980F074219045\r
+:105D9B00F97FF0744290F982F0741390F981F0431B\r
+:105DAB00D601740490F979F075E103E5E9A2E450AA\r
+:105DBB00FA53E9EF125D3D79017F010206EA74F8AF\r
+:105DCB0012068A790090F876E064016003025E5E49\r
+:105DDB00E4F090F879E0707B90F878E0247AF58223\r
+:105DEB00E434F8F583E0A2E750697E017D00802161\r
+:105DFB008D82AA82EA247CF582E434F8F583E0FCF8\r
+:105E0B00EA2435F582E434FAF583E06C60027E0017\r
+:105E1B000DEDC3940440D9EE603990F87AE090F917\r
+:105E2B007AF0E090FA3BF0740190FA3DF0FA7B00C7\r
+:105E3B00125CA890F875E060FA7900125C8BD29036\r
+:105E4B0079047A3A7BFA125D68C2907901740290F8\r
+:105E5B00F67AF07F010206EAC082C08390F97AE0FD\r
+:105E6B0090FA3FF090F877E090FA43F07AB87B0124\r
+:105E7B007900125CA890F773E06404600690F875E3\r
+:105E8B00E060F290F773E06404600990F67AE0D278\r
+:105E9B00E5025F247900125C8BD29079067A3E7B07\r
+:105EAB00FA125D68C290125CC77AB87B0179001256\r
+:105EBB005CA890F875E0700890F876E0640170F2D9\r
+:105ECB007900125C8B125D3D90F876E06401704AAC\r
+:105EDB0090F878E0247AF582E434F8F583E0548086\r
+:105EEB00FBE490F876F090F879E064CA702C90F8A7\r
+:105EFB007AE0FA90F97AE06A702090F87BE064011E\r
+:105F0B007018EB6015E490F877F0740190F987F056\r
+:105F1B0090F773F0740890F67BF0D083D08222C098\r
+:105F2B0082C08390F986E090F777F090F985E09046\r
+:105F3B00F778F090F97AE090F775F07AB87B017901\r
+:105F4B0000125CA890F773E06404600690F875E0AB\r
+:105F5B0060F290F773E06404600990F67AE0D2E5A2\r
+:105F6B000260477900125C8BD29090F774E004F9D1\r
+:105F7B007A747BF7125D68C290125CC77AB87B01AA\r
+:105F8B007900125CA890F875E0700890F876E064E0\r
+:105F9B000170F2125D3D7900125C8B90F876E06433\r
+:105FAB0001600302604890F878E0247AF582E434CB\r
+:105FBB00F8F583E05480FBE490F876F090F879E004\r
+:105FCB0064CA707990F87AE0FA90F97AE06A706DA9\r
+:105FDB0090F87BE06401706590F87CE0FA90F986AC\r
+:105FEB00E0547F6A705790F87DE0C0E090F985E04F\r
+:105FFB00F8D0E0687047EB6044E490F877F090F9E4\r
+:10600B0085E02401F0A3E03400F090F985E0F8A3DB\r
+:10601B00E0F9E875F064A4F8AAF075F064E9A42A35\r
+:10602B00F990F983E0FAA3E0FB1205B8E890F97751\r
+:10603B00F0740890F67BF0740190F773F0D083D076\r
+:10604B008222C082C08390F877E004F0E0C394060C\r
+:10605B00400D90F67AE0D2E5F0E0D2E2F0802990A4\r
+:10606B00F987E07005125E63801E90F985C082C0CF\r
+:10607B008390F983E0F8A3E0F9D083D082C3E09852\r
+:10608B00A3E0995003125F2AD083D08222C082C032\r
+:10609B0083E490F877F090F977F0740190F67AF04A\r
+:1060AB0090F67BF090F985E4F0A3F090F983F0A3E0\r
+:1060BB00F0740190F773F0E490F987F090F876F0B4\r
+:1060CB00D083D08222C082C08374F9F5D575D47B7E\r
+:1060DB0012609874FC90F774F074CA90F776F074B1\r
+:1060EB000190F67AF0C2A8439A01C290E490F67937\r
+:1060FB00F090F977F0125D3D806090F985C082C019\r
+:10610B008390F983E0F8A3E0F9D083D082C3E098C1\r
+:10611B00A3E099400690F987E0701712604D7A0161\r
+:10612B007B007900125CA890F875E060FA79001298\r
+:10613B005C8B90F978E0701B90F985C082C08390DE\r
+:10614B00F983E0F8A3E0F9D083D082C3E098A3E011\r
+:10615B0099400790F67AE0D2E5F090F679E0702A54\r
+:10616B00125CC7125DC9E964017017740290F67A6C\r
+:10617B00F090F679E004F0740490F67BF0125D3D3C\r
+:10618B00800890F67AE0A2E550D990F67AE0A2E585\r
+:10619B004003026105C2A8539AFE5391EF75E900C3\r
+:1061AB00125D3DE490F679F07A2C7B01F9125CA834\r
+:1061BB0090F875E060FA7900125C8BD083D0822264\r
+:1061CB00C082C08374B290DF01F0743790DF00F0AF\r
+:1061DB00740A90DF02F0740090DF03F0740090DF1C\r
+:1061EB0004F0740090DF05F0740090DF06F0741279\r
+:1061FB0090DF07F0740090DF08F0742490DF09F053\r
+:10620B00742D90DF0AF0745590DF0BF0743D90DF26\r
+:10621B000CF0745590DF0DF0741590DF0EF07412C6\r
+:10622B0090DF0FF0741190DF10F0746090DF11F0BD\r
+:10623B00740790DF12F0740090DF13F0741890DF86\r
+:10624B0014F0741D90DF15F0741C90DF16F074C7FA\r
+:10625B0090DF17F0741090DF18F074B290DF19F024\r
+:10626B0074B690DF1AF0741090DF1BF074EA90DFB5\r
+:10627B001CF0742A90DF1DF0740090DF1EF0741F69\r
+:10628B0090DF1FF0740090DF2FF0740090DF30F080\r
+:10629B00740090DF31F0743190DF24F075E10475F8\r
+:1062AB00E10190DF3BE0640170F8D083D08222C023\r
+:1062BB0082C08390DF1CE0442090DF1CF074C690FA\r
+:1062CB00DF2EF075E10475E10190DF3BE0640170B6\r
+:1062DB00F890DF1CE054CFF075E104D083D082221C\r
+:1062EB0074F712068AE990DF06F07A00EAC3940A83\r
+:1062FB00501E8A08750900E508249BF582E50934D0\r
+:10630B00F9F583E0C0E074282AF8D0E0F60A80DCC7\r
+:10631B00753200D29074FE559AFA8A9AC2A8C28935\r
+:10632B00539BFCE59B75E900D2A87401459AFC8C44\r
+:10633B009A740090FA44F075E1037F020206EAC0FA\r
+:10634B0082C083C290C2A874FE559AFA8A9A7401CD\r
+:10635B0090FA44F075E104D083D0822212634A2272\r
+:10636B007A007B0075320074282532F8E6F5D905E2\r
+:10637B0032E532C3940A502BEAF8EBF9740128FA90\r
+:10638B00740039FBC3E89488E994135016A2895022\r
+:10639B00E074282532F8E6F5D90532C2897A007BFC\r
+:1063AB000080CEC3EA9488EB94134005C28975E94B\r
+:1063BB00002274F812068AE5E9FEEEA2E750027E8F\r
+:1063CB0000EEA2E45009740190FA44F01263677571\r
+:1063DB00E9007F010206EA74F512068A1261CB12FC\r
+:1063EB0062BA90F9B2780812052B90F98E780812E0\r
+:1063FB00053A740090F992F07F040206EA74F712E2\r
+:10640B00068A740090F99AF0740090F999F0740070\r
+:10641B0090F998F0E5E3F8E4C8F990F995E8F0A362\r
+:10642B00E9F085E20875090090F995E04508F0A3BD\r
+:10643B00E04509F090F995E024A4F0A3E03400F0D6\r
+:10644B0090F995E0FAA3E0FB1249D7124A137F02A9\r
+:10645B000206EAC082C083124A2212634A74009079\r
+:10646B00F99AF0D083D0822274F512068A8A088BAF\r
+:10647B00098C0A8D0B90F98A780812053A7F040271\r
+:10648B0006EA74F512068AC0A8C2AF8A088B098C7B\r
+:10649B000A8D0B90F98E780812053AE990F992F073\r
+:1064AB00D0A87F040206EA74F512068A90F999E0E7\r
+:1064BB001208170102C8647465CC65246690F993C1\r
+:1064CB00E02400F0A3E03470F012687490F99AE0C5\r
+:1064DB00D2E1F090FB51E0C39401A2D265D03350CE\r
+:1064EB002890FA45780812052B90F98E780812053A\r
+:1064FB001890FB51E06488700990F99AE0D2E0F0B3\r
+:10650B00800790F99AE0C2E0F012666E740790F97A\r
+:10651B0097F075080075090878081207D590F98A65\r
+:10652B00780812052BAA08AB09AC0AAD0B90F998A9\r
+:10653B00E0F912676A74021206498A088B09A808E7\r
+:10654B00A90990F993E0C398F8A3E099F990F98819\r
+:10655B00E8F0A3E9F090F988E0FAA3E0FB1249D741\r
+:10656B00740190F999F002664A740090F997F075EE\r
+:10657B00080075090278081207D590F98A78081275\r
+:10658B00052BAA08AB09AC0AAD0B90F998E0FE7489\r
+:10659B0080C39EF912676A74021206498A088B0936\r
+:1065AB00A808A90990F988E028F8A3E039F9740044\r
+:1065BB0028FA740239FB1249D7740290F999F080CA\r
+:1065CB007E740190F997F075088075091C78081294\r
+:1065DB0007D590F98A780812052BAA08AB09AC0AE3\r
+:1065EB00AD0B90F998E0FE7440C39EF912676A7484\r
+:1065FB00021206498A088B09A808A90990F993E0A9\r
+:10660B0028F8A3E039F9740028FA740639FB12490B\r
+:10661B00D7740390F999F0802612687390F99AE079\r
+:10662B00C2E1F090F998E02401F090F993E024B8DE\r
+:10663B00FAA3E03466FB1249D7740090F999F07F06\r
+:10664B00040206EAC082C08390F99AE0A2E15008E6\r
+:10665B0090F997E0F91262EB1264B2124A30D083D0\r
+:10666B00D0822274F112068A90F99BC082C083906B\r
+:10667B00FA49780812052BD083D08278081204F2DD\r
+:10668B0090F98AC082C08390FA4D780C12052BD0FA\r
+:10669B0083D082780C1204F27808790C12050590DD\r
+:1066AB00F99B780812053A90F99BC082C08390FA47\r
+:1066BB004D780C12052BD083D082780C1204F290FB\r
+:1066CB00F998E0F508E4F509F50AF50B7418780864\r
+:1066DB001204AD780C790812050590F99B780C1211\r
+:1066EB00053A90F99F780812052B90F98E780C12C9\r
+:1066FB00052B90F99F780C12053A90F992E090F9DE\r
+:10670B00A3F07A9B7BF9126722E9FA74216A90F95C\r
+:10671B00A4F07F080206EA74F812068A79007D005D\r
+:10672B00EDC3940950348A828B83E0FE7C00ECC36A\r
+:10673B009408501AE96EC394804008E9C3336497F8\r
+:10674B00F98004E9C333F9EEC333FE0C80E08A828F\r
+:10675B008B83A3AA82AB830D80C67F010206EA74EA\r
+:10676B00F112068A74FE120633E9FF8A0C8B0D8C2C\r
+:10677B000E8D0F7CFF7D7F851082851183E50CF0DC\r
+:10678B00AE0D850C08850D09850E0A850F0B74104F\r
+:10679B007808120494740112067EE508F08F0875D0\r
+:1067AB000900E5082451F582E50934FAF583E0F890\r
+:1067BB00851082851183E0F508E50868F8E4C8F9CF\r
+:1067CB008F0A750B008E08750900E508650AF50838\r
+:1067DB00E509650BF509E5082451F582E50934FA5D\r
+:1067EB00F583E0F508750900E50828F8E50939F99E\r
+:1067FB00851082851183E0F50AE4C50AF50B8E0836\r
+:10680B00750900740112067EE0F582758300E5823E\r
+:10681B004508F508E5834509F509E508250AF50856\r
+:10682B00E509350BF509E50868F8E50969F9E8FAB2\r
+:10683B00E9FB741112067EC3E09AA3E09B500FECA8\r
+:10684B005AFAED5BFBEDC313FDEC13FC80E4740211\r
+:10685B001206497F080206EA43FE01C29012686CD9\r
+:10686B00221263E2126408222274F112068A74FC6B\r
+:10687B0012063390F9A8E02400F0A3E03470F090F6\r
+:10688B00F9A8C3E09400A3E09480400C90F9A8E031\r
+:10689B002400F0A3E03480F090FB52E0FE90F9A5C9\r
+:1068AB00E0F50CE4F50DF50EF50F7410780C1204F1\r
+:1068BB00AD90F9A6E0F508A3E0F509E4F50AF50BB0\r
+:1068CB00780C79081204CC851082851183780C1210\r
+:1068DB00053AEEF9851082851183780812052BAAEB\r
+:1068EB0008AB09AC0AAD0B12648D74041206497F18\r
+:1068FB00080206EA74F812068A740812067EE0F89B\r
+:10690B00A3E08015A3AA82AB838C828D83A3AC8278\r
+:10691B00AD83E824FF18E934FFF9E87001E960243E\r
+:10692B008A828B83E0FE8C828D83E06E8A828B83DE\r
+:10693B0060D2E0F88C828D83E0FAE8C39AFAE49493\r
+:10694B0000FB80047A007B007F010206EA74F712D9\r
+:10695B00068A740912067EE0FEA3E0FFEAF8EBF963\r
+:10696B0080188C828D83E088828983F0A3A882A90A\r
+:10697B00838C828D83A3AC82AD838E088F0974FFC9\r
+:10698B0025081E74FF3509FFE5087002E50970D272\r
+:10699B007F020206EA74F712068A740912067EE079\r
+:1069AB00F8A3E0F9EAFEEBFF8A088B09C3EA9CEB3C\r
+:1069BB009D405EEC28F582ED39F583C3E5829508A1\r
+:1069CB00E5839509404BEA28FAEB39FBAC82AD83A2\r
+:1069DB00126A2E7002E5096041EC24FF1CED34FFB6\r
+:1069EB00FDEA24FF1AEB34FFFB8C828D83E08A8255\r
+:1069FB008B83F080DB8C828D83E08A828B83F08C9F\r
+:106A0B00828D83A3AC82AD838A828B83A3AA82AB54\r
+:106A1B0083126A2E7002E50970DBEEFAEFFB7F0240\r
+:106A2B000206EA8808890974FF25081874FF3509DE\r
+:106A3B00F9E5082274F812068A740812067EE0F84B\r
+:106A4B00A3E0F98A828B838003ECF0A3E8FEE9FFD5\r
+:106A5B0074FF2E1874FF3FF9EE7001EF70EB7F019E\r
+:036A6B000206EA36\r
+:04000005000000E90E\r
+:00000001FF\r
diff --git a/chronos-ti/Recovery/RF Access Point/Recovery_eZ430-Chronos_AP_915MHz_1_2.hex b/chronos-ti/Recovery/RF Access Point/Recovery_eZ430-Chronos_AP_915MHz_1_2.hex
new file mode 100755 (executable)
index 0000000..5ec2614
--- /dev/null
@@ -0,0 +1,1718 @@
+:020000040000FA\r
+:060000000200E90211D923\r
+:03000B0002127965\r
+:030013000212884E\r
+:03001B0002129737\r
+:030023000212A620\r
+:03002B000212B509\r
+:0300330002500375\r
+:03003B000212C4EA\r
+:030043000212D3D3\r
+:03004B000211F9A6\r
+:030053000212E2B4\r
+:030063000212275F\r
+:03006B000250A898\r
+:030073000212F185\r
+:03007B000213006D\r
+:030083000211A3C4\r
+:10008B0002130F00000080FB1200F8B900030200FE\r
+:10009B00E3E479217812B800028004F709D8FCE474\r
+:1000AB0090F3FF78AC79068002F0A3D8FCD9FA90D4\r
+:1000BB00F9AAAA82AB839000FB78AA79028015E497\r
+:1000CB0093A3AC82AD838A828B83F0A3AA82AB838A\r
+:1000DB008C828D83D8E9D9E7120A2512008E75D050\r
+:1000EB000075814F7510FF7511F302009379012292\r
+:1000FB0087D6120000C201000000000001000000C2\r
+:10010B00F1490200FFFFFFFF1432506E0E278BFFE9\r
+:10011B0000000001000000000000000000000000D3\r
+:10012B0000000000000000000000000000000000C4\r
+:10013B0000000000000000000000000000000000B4\r
+:10014B00B242873F183B0543FC34B4407856341019\r
+:10015B00020101010008070605040302010055AA6C\r
+:10016B0055AA55AA55AA556CDC0200A402470347B1\r
+:10017B0003470347034F03200700CABA5EBA1109AE\r
+:10018B000300CA000500CA000000010001000000C6\r
+:10019B000000FFFFFFFF0001804020100884422178\r
+:1001AB009048A45229140A85C261B058ACD66B355D\r
+:1001BB009ACD6633994CA653A9542A95CAE5F27980\r
+:1001CB003C9ECF67B3D96CB65B2D160B058241A055\r
+:1001DB005028944AA5D269341A8D462391C8E472EB\r
+:1001EB00391C8EC7E3F1F8FCFEFF7F3F1F0F07831F\r
+:1001FB00C1E070389CCEE7F3F97CBEDF6F379B4DC7\r
+:10020B0026138944221188C4623198CCE673B95CF9\r
+:10021B00AED7EB75BADD6EB7DB6D361B0D06038102\r
+:10022B00C06030188CC663B1D8ECF67B3D1E8F478F\r
+:10023B00A3D1E8F47ABD5EAF57AB55AAD5EAF5FA70\r
+:10024B00FD7EBF5F2F178B45A251A8D46AB5DAED9F\r
+:10025B00763B1D0E87C3E1F078BCDEEF77BB5D2EDE\r
+:10026B0097CB65B2592C964B25924924120904025F\r
+:10027B000180402010088442219048A45229140A7E\r
+:10028B0085C261B058ACD66B359ACD6633994CA606\r
+:10029B0053A9542A95CAE5013C1201100102000032\r
+:1002AB00205104A6160900010203010902430002B2\r
+:1002BB00010080190904000001020201000524005D\r
+:1002CB00100104240202052406000105240100018B\r
+:1002DB000705820340004009040100020A000000E8\r
+:1002EB0007058402400001070504024000010403D6\r
+:1002FB00090424035400650078006100730020009A\r
+:10030B0049006E0073007400720075006D0065008B\r
+:10031B006E00740073001E03430043003100310074\r
+:10032B0031003100200055005300420020004300F3\r
+:10033B00440043000803300030003100BF020000CE\r
+:10034B00E2020000E066701008A3E066700A08A3E2\r
+:10035B00E066700408A3E06622C3E09608A3E0966B\r
+:10036B0008A3E09608A3E09622BB0102E722C08215\r
+:10037B00C08389828A83BB0003E08002E493D0832D\r
+:10038B00D08222BB000EC082C0838A838982F0D0C8\r
+:10039B0083D08222BB0101F722080808EAC0E0EBF8\r
+:1003AB00C0E086F0E7A4FA180986F0E7A42AFA1849\r
+:1003BB000986F0E7A42AFA180986F0E7A42AFA19A5\r
+:1003CB0086F0E7A4FBE5F02AFA190886F0E7A42BE0\r
+:1003DB00FBE5F03AFA190886F0E7A42BFBE5F03AB7\r
+:1003EB00FA18180986F0E7A4C5F02BFBE43AFA19C2\r
+:1003FB0008E7C5F0C6A426F6E5F03BFBE43AFA188D\r
+:10040B0086F0E7A4F6E5F00826F6E43B08F6E43AB6\r
+:10041B0008F6D0E0FBD0E0FA22E4CFC0E0E4CEC097\r
+:10042B00E0E4CDC0E0E4CCC0E075F020C3E633F6E9\r
+:10043B0008E633F608E633F608E633F6181818EC38\r
+:10044B0033FCED33FDEE33FEEF33FFC3EC9709EDD9\r
+:10045B009709EE9709EF97191919400FFFEC97FCC5\r
+:10046B0009ED97FD09EE97FE191906D5F0BEECF7CD\r
+:10047B0009EDF709EEF709EFF7191919D0E0FCD0E0\r
+:10048B00E0FDD0E0FED0E0FF226016080808C6C3EE\r
+:10049B0013C618C613C618C613C618C613C6D5E09E\r
+:1004AB00EA227009080808226016181818C6C33308\r
+:1004BB00C608C633C608C633C608C633C6D5E0EA77\r
+:1004CB0022E627F60809E637F60809E637F60809A3\r
+:1004DB00E637F622E026F608A3E036F608A3E03668\r
+:1004EB00F608A3E036F622E056F608A3E056F60827\r
+:1004FB00A3E056F608A3E056F622E647F60809E60F\r
+:10050B0047F60809E647F60809E647F622E046F003\r
+:10051B0008A3E046F008A3E046F008A3E046F0226B\r
+:10052B00E0F608A3E0F608A3E0F608A3E0F622E65F\r
+:10053B00F008A3E6F008A3E6F008A3E6F022CAC091\r
+:10054B00E0E6F0A308DAFAD0E0FA22CAC0E0E0A3B2\r
+:10055B00C582CCC582C583CDC583F0A3C582CCC56E\r
+:10056B0082C583CDC583DAE6D0E0CA22C3E498F80E\r
+:10057B00E499F91205B88026C3E49AFAE49BFBE9E7\r
+:10058B0020E7E91205B8E498F8E499F922C3E49856\r
+:10059B00F8E499F91205B8E498F8E499F9C3E49AE8\r
+:1005AB00FAE49BFB22EB20E7CFE920E7E0B9001050\r
+:1005BB00BB0008E88AF084F8AAF022E4FBC8FA2210\r
+:1005CB00EB70227B10C833C8C933C9335007C39AA9\r
+:1005DB00C3DBF280069A50012ADBEAC833F4C8C9A0\r
+:1005EB0033F4C9FA2275F008E4C833C8C933C933E8\r
+:1005FB00C99AC99B5004C92AC93BD5F0ECFBC83337\r
+:10060B00F4C8E4C9FA22600C08C6C313C618C61393\r
+:10061B00C6D5E0F422700422600D18C6C333C60899\r
+:10062B00C633C6D5E0F41822251010AF08F51040DC\r
+:10063B000215118008F51040021511D2AF22C0D05F\r
+:10064B00251010AF08F510500205118008F5105059\r
+:10065B00020511D2AFD0D0222510F58210AF08F5CC\r
+:10066B0010400215118008F51040021511D2AF850C\r
+:10067B001183222510F582E43511F58322E47325CD\r
+:10068B0010C582C0E0E51134FFC583C0E0E510C39F\r
+:10069B00958224F9F8E4C5A8858311858210C5A835\r
+:1006AB00E8CEF0A3E520F0A37808E608F0A3DEFA85\r
+:1006BB00EFF0A3E58124FBF8E608F0A3E608F0A32E\r
+:1006CB000808E608F0A3E608F0A315811581D0E031\r
+:1006DB00FED0E0F815811581E8C0E0EEC0E0228580\r
+:1006EB001183851082E0A3FEE0A3F5207808E0A338\r
+:1006FB00F608DFFAE0A3FFE0A3C0E0E0A3C0E0E070\r
+:10070B00A3C0E0E0A3C0E0E4C5A8858210858311F7\r
+:10071B00C5A8D083D08222C0D02510C582C0E0E509\r
+:10072B001134FFC583C0E0E510C3958224F310AFED\r
+:10073B00088583118582108008858311858210D2EC\r
+:10074B00AFC8F0A3E9F0A3EAF0A3EBF0A37908E7B5\r
+:10075B0009F0A3D8FAECF0A3EDF0A3EEF0A3EFF0C1\r
+:10076B00A3D0E0F0A3D0E0F0A3D0E0F0A3E520F01D\r
+:10077B00A3E5F0F0A322851183851082E0C0E0A3EE\r
+:10078B00E0F9A3E0FAA3E0FBA37808E0F608A3DF07\r
+:10079B00FAE0FCA3E0FDA3E0FEA3E0FFA3E0C0E0D2\r
+:1007AB00A3E0C0E0A3E0F5D0A3E0F520A3E0A3F520\r
+:1007BB00F0E4C5A8858311858210C5A8D082D083AB\r
+:1007CB00D0E0F8D0E0327403800474028000C0E003\r
+:1007DB00F404120663D0E0120549227403800474FA\r
+:1007EB00028000CCC0E0EDC0E0E510C39CCCAD11A5\r
+:1007FB0050011D10AF068C108D1180068C108D11C1\r
+:10080B00D2AF120556D0E0FDD0E0FC22D083D082CF\r
+:10081B00C5F0E493A3C5F0C395F0F5F0E493A3C33F\r
+:10082B0095F04005E5F0048001E475F002A4258203\r
+:10083B00F582E5F03583F583E493A3C0E0E493C040\r
+:10084B00E022D083D082CCC0E0E493A360061208F0\r
+:10085B00771470FAE493A360061208961470FAD01A\r
+:10086B00E0FCE493A3C0E0E493C0E022C0E0E49397\r
+:10087B00A3D39C5010E493A3C39C400AD0E0D0E0D8\r
+:10088B00D0E002086AA3A3A3D0E022C0E0E493A3C4\r
+:10089B006C7009D0E0D0E0D0E002086AA3A3D0E0EE\r
+:1008AB002253CBEFC2D843CB0475F00CEAA4F5CDA1\r
+:1008BB0074FC55CB4402F5CB43CB10A2D850FC5360\r
+:1008CB00CBEFC2D822C082C08353A8C0E5A853B8CF\r
+:1008DB00F0E5B8539AC2E59A7422C0E0740755C686\r
+:1008EB00F8D0E0B800028004C313D8FCF5AB7475E4\r
+:1008FB0090FC00F074AE90FC01F0740290FC02F0DE\r
+:10090B00E490FC03F090FC04F0747490FC05F0741C\r
+:10091B00FF90FC06F074F590FC07F074AF90FC08A8\r
+:10092B00F0E490FC09F090FC0AF0747490FC0BF06E\r
+:10093B0074FF90FC0CF074F590FC0DF074AF90FC10\r
+:10094B000EF0E490FC0FF090FC10F074E590FC11AD\r
+:10095B00F074AE90FC12F0745490FC13F074409051\r
+:10096B00FC14F0747090FC15F074FA90FC16F07493\r
+:10097B002290FC17F0740190F3FFF0D083D0822209\r
+:10098B00C082C0838A828B83E493F9D083D0822286\r
+:10099B00C082C0838A828B83E493F9A3E4932400FF\r
+:1009AB00FAE439FBD083D0822274F712068AECFE6C\r
+:1009BB00EDFF740912067EE0FCA3E0FD74326C704F\r
+:1009CB000374576D600479008045C2AFE5AEA2E7B2\r
+:1009DB0040FA8A088B0974097808120611E508F5A4\r
+:1009EB00ADEAFCEBC313EC13F5ACEF90FC06F0EEA9\r
+:1009FB0090FC0CF012FC00D2AFE9601112099B8A3B\r
+:100A0B00088B09EE65087003EF650970B979017FF2\r
+:100A1B00020206EAD2AF22C2AF22750C00750D009E\r
+:100A2B007E0043FE01D29043FE10C29443FD3FE58E\r
+:100A3B00FD43FEE0E5FE43FF19E5FF53BEF8E5BEBF\r
+:100A4B0000746055BE60FA780079008008E82401D4\r
+:100A5B0008E93400F9C3E89420E9944E40EF53C6FB\r
+:100A6B00BF53C6C0E5C643C638E5C6746055BE6005\r
+:100A7B00FA780079008008E8240108E93400F9C30A\r
+:100A8B00E89420E9944E40EF90F9AA780812052BD0\r
+:100A9B00AA08AB09AC0AAD0B12647474FF90F4187E\r
+:100AAB00F07AF07B7F12098BE9700C7AF27B7F1264\r
+:100ABB00098BE990F412F090F412E0C3941F4008F4\r
+:100ACB00E0C394E25002E4F043B933E5B943A92300\r
+:100ADB00E5A990F9AE780812052BAA08AB09AC0A68\r
+:100AEB00AD0B12593B800F125993E50C2401F50CF9\r
+:100AFB00E50D3400F50DC3E50C9420E50D944E4047\r
+:100B0B00E6C29075EC4475ED0475EBDED2BCD2AF4A\r
+:100B1B00800E12115A740590F400F0E490F404F076\r
+:100B2B0090F404E0600C90F401E0700690F403E0A4\r
+:100B3B0060E090F402E0602990F60EE06008EE7041\r
+:100B4B000553EBEF7E0190F608E060D412666DEE74\r
+:100B5B006009E490F60EF0FE43EB10E490F608808B\r
+:100B6B00BE90F405E0603490F403E0702ED290E474\r
+:100B7B0090F405F012111D740390F400F0740190C1\r
+:100B8B00F401F012131E740190F400F0E490F401E0\r
+:100B9B00F074FF90F418F0C290808590F406E0603A\r
+:100BAB003D90F401E07037D290E490F406F0125BC4\r
+:100BBB0019740A90F400F0740190F403F01260D1F0\r
+:100BCB0090F67AE0A2E25004740B8002740C90F45D\r
+:100BDB0000F0E490F403F074FF90F67C80B890F48E\r
+:100BEB000DE07003020B2B90F40FE06003020B2B54\r
+:100BFB0090F40EE01208170102190C0C0C110C16D4\r
+:100C0B000C12434B800812486F80031248957401F5\r
+:100C1B0090F40F020B2A74F112068A90F653E064DB\r
+:100C2B00FF600302111890F654E012084D001900F2\r
+:100C3B00A20C01A80C02BD0C03E10C04460D058DA2\r
+:100C4B000D06DA0C07B10D08D10D09900E0A970DA0\r
+:100C5B0020870C310D0E32480E33580E40990E4141\r
+:100C6B00D20E46C60E47F00E48D80E49E90E705804\r
+:100C7B0010718F1072C01073A8100C11741290F6B3\r
+:100C8B0059F0743490F658F0745690F657F0747817\r
+:100C9B0090F656F002110C90F400E080F3121187DD\r
+:100CAB00E490F402F090F401F090F403F090F4006F\r
+:100CBB0080E190F401E0600790F417E0D2E5F0904A\r
+:100CCB00F402E0600302110C740190F40480C4126E\r
+:100CDB001187740480D790F659E0F50875090075F3\r
+:100CEB000A00750B00741878081204AD90F658E0E2\r
+:100CFB00F50C750D00750E00750F007410780C1245\r
+:100D0B0004AD7808790C1204CC90F657E0F50C750D\r
+:100D1B000E007408780C1204AD7808790C1204CC10\r
+:100D2B0090F656E0F50C750D007808790C1204CC92\r
+:100D3B0090F98A780812053A02110C90F98A780C0E\r
+:100D4B0012052B850C08850D09850E0A850F0B7472\r
+:100D5B00187808120494E50890F659F0850C08856C\r
+:100D6B000D09850E0AF50B74107808120494E5082A\r
+:100D7B0090F658F0850D09E50990F657F0E50C0251\r
+:100D8B000C9B90F656E090FB52020C9E90F656E0B0\r
+:100D9B0090F9A5F090F658E0F990F657E090F9A687\r
+:100DAB00F0A3E9020C9E90F402E06003121187900D\r
+:100DBB00F401E0600302110C740290F400F0740172\r
+:100DCB0090F405020C9E90F417E0A2E4502F90F4DF\r
+:100DDB001BE090F659F090F41AE090F658F090F46E\r
+:100DEB0019E090F657F090F418E090F656F074FF77\r
+:100DFB0090F418F090F417E0C2E4020C9E74FF021A\r
+:100E0B000C9B90F401E0700302110C7A00801F8A96\r
+:100E1B0082A882E82456F582E434F6F583E0C0E03C\r
+:100E2B00E82418F582E434F4F583D0E0F00AEAC341\r
+:100E3B00941340DB90F417E0D2E6020C9E90F4077B\r
+:100E4B00E090F656F0740490F655020C9E90F40761\r
+:100E5B00E0602E7A00801F8A82A882E82418F5822F\r
+:100E6B00E434F4F583E0C0E0E82456F582E434F68C\r
+:100E7B00F583D0E0F00AEAC3941340DBE490F40767\r
+:100E8B00F0741680C290F417E0D2E5020C9E90F439\r
+:100E9B0002E0600312118790F401E0600790F417F1\r
+:100EAB00E0D2E5F090F403E0600302110C740990BA\r
+:100EBB00F400F0740190F406020C9E90F67AE0D2E6\r
+:100ECB00E5F0C29002110C90F977020CA590F40397\r
+:100EDB00E0600690F67B020CA57480020C9B74F705\r
+:100EEB0090F65680A6740290F67BF090F773E06450\r
+:100EFB00016003020FD6E490F40AF090F655E0245B\r
+:100F0B00FB90F409F090F656E090F40BF090F65746\r
+:100F1B00E0F50890F40BE07035E50890F77AF09067\r
+:100F2B00F658E090F77BF0F9E50890F983F0A3E928\r
+:100F3B00F090F983E090FA41F090F984E090FA4256\r
+:100F4B00F0740490F773F0E490F408020C9EE5083B\r
+:100F5B0090F40CF090F40BE06401700474018002C7\r
+:100F6B00740290F779F090F40CE0240590F774F08C\r
+:100F7B007A00801F8A82A882E82458F582E434F62E\r
+:100F8B00F583E0C0E0E8247AF582E434F7F583D00A\r
+:100F9B00E0F00AEAC0E090F409E0FBD0E0C39B402C\r
+:100FAB00D3740290F773F090F409E090F408F0908A\r
+:100FBB00F409E090F40AF0E0C0E090F40CE0FAD011\r
+:100FCB00E0C39A500302110C020F4CE06402600361\r
+:100FDB0002110C90F655E024FD90F409F07A008094\r
+:100FEB002B8A82A882E82456F582E434F6F583E056\r
+:100FFB00C0E090F408E0FCE82CF8E43400F9E824B5\r
+:10100B007AF582E934F7F583D0E0F00AEAC0E09094\r
+:10101B00F409E0FBD0E0C39B40C7E0FA90F408E092\r
+:10102B002AF090F409E0FA90F40AE02AF090F40820\r
+:10103B00E0C394F7509290F40AE0C0E090F40CE017\r
+:10104B00FAD0E0C39A500302110C020FD390F6575B\r
+:10105B00E0F990F656E0F874AB68700374AB697006\r
+:10106B001C740190F40DF0E490F40EF0740190F404\r
+:10107B000FF0E490F402F090F401020C9EE490F473\r
+:10108B000D020C9E90F40DE0607790F410E4F0A349\r
+:10109B00F090F40FF090F40EE004020C9E90F40D1F\r
+:1010AB00E0605E90F410E090F656F090F411E09052\r
+:1010BB00F657020C9E90F40DE0604690F656E0F564\r
+:1010CB000890F657E0FA90F658E0F9EAFEE9FF12BD\r
+:1010DB0008D0EEFAEFFB12098BE964FF7023750A57\r
+:1010EB0032750B57780A1207D57900AB0874FF24B9\r
+:1010FB0000FCE43BFDEEFAEFFB1209B4740212069E\r
+:10110B0049740190F677F0740690F654F07F08025C\r
+:10111B0006EAC082C08375C6B074D390DF00F0744A\r
+:10112B009190DF01F0740490DF03F0E490DF05F0A1\r
+:10113B0090DF06F0740790DF12F0E490DF2FF09051\r
+:10114B00DF30F090DF31F0759100D083D08222C078\r
+:10115B0082C08375C6B8439190E59175E25575E5EC\r
+:10116B004475E402D2B91268AB90F412E090DF0838\r
+:10117B00F0740190F402F0D083D08222C082C0833D\r
+:10118B0012645FC2B975E40075E255124899E49098\r
+:10119B00F402F0D083D08222C0E074F212072290C6\r
+:1011AB00F402E060051263BE801F90F401E060055D\r
+:1011BB00121793801490F40DE0600512483D8009DE\r
+:1011CB0090F403E06003125C2D7F01020781C0E005\r
+:1011DB0074F212072290F402E0600512636C80092E\r
+:1011EB0090F40DE060031247307F01020781C0E0ED\r
+:1011FB0074F2120722C2C153E40FE5E490F607E044\r
+:10120B00601590F608E0700F1248C3E97003740183\r
+:10121B00F090F60FE004F07F01020781C0E074F25A\r
+:10122B0012072290F403E0603990F873E0F8A3E022\r
+:10123B00F9E87001E9602B90F871E02401F0A3E06C\r
+:10124B003400F090F871E0687003A3E069701390BC\r
+:10125B00F871E4F0A3F090F873F0A3F0740190F838\r
+:10126B0075F0C2DB1259937F010207810022C0E0A7\r
+:10127B0074F21207221212777F01020781C0E07409\r
+:10128B00F21207221212777F01020781C0E074F27B\r
+:10129B001207221212777F01020781C0E074F2124B\r
+:1012AB0007221212777F01020781C0E074F2120746\r
+:1012BB00221212777F01020781C0E074F21207221B\r
+:1012CB001212777F01020781C0E074F2120722121B\r
+:1012DB0012777F01020781C0E074F212072212120B\r
+:1012EB00777F01020781C0E074F212072212127796\r
+:1012FB007F01020781C0E074F21207221212777F7E\r
+:10130B0001020781C0E074F21207221212777F01EB\r
+:10131B0002078174F112068A74FA12063390F9B23D\r
+:10132B00780812052B740190F417F07AFD7B1412D8\r
+:10133B0027B97402C0E0740112067ED0E0F0AC82D3\r
+:10134B00AD837A0A7903122AA0C290805390F414C9\r
+:10135B00E0704D740212067E780812053A74021280\r
+:10136B00067EC082C08390F9B6780812052BD08315\r
+:10137B00D08278081204DF740212067EC082C0830A\r
+:10138B0090F9BA780C12052BD083D082780C12030B\r
+:10139B0064400D639001E59090F9B2780812052B2B\r
+:1013AB0090F416E0603190F414E0702B7A137BF418\r
+:1013BB001227E6E970F6740290F417F0D29090F4CD\r
+:1013CB0014E004F0A2AFE492E0FAC2AF90F416E09E\r
+:1013DB0014F0EAA2E092AF90F415E070030214C887\r
+:1013EB00851082851183AC82AD837A387BF490F4BF\r
+:1013FB0013E0F9122A36E960030214C885108285BE\r
+:10140B001183E064047029639001E590750C0475F9\r
+:10141B000D00780C1207D57C387DF47A187BF4120A\r
+:10142B0069A0740212064990F417E0D2E40214C7C3\r
+:10143B00E064026008E0641360030214C863900167\r
+:10144B00E59090F438E01208170102C8145E14936B\r
+:10145B0014931490F417E0A2E65008E0C2E6F0747F\r
+:10146B0013800E740190F418F0745590F419F07405\r
+:10147B0002851082851183F0E0FC7A187BF490F4DE\r
+:10148B0013E0F912285C803590F407E0702F7A0096\r
+:10149B00801F8A82A882E82438F582E434F4F5832D\r
+:1014AB00E0C0E0E82418F582E434F4F583D0E0F0F2\r
+:1014BB000AEAC3941340DB740190F407F090F4171D\r
+:1014CB00E0A2E54003021358539AFE75910075E9AB\r
+:1014DB0000E490F413F090F414F090F416F090F400\r
+:1014EB0015F090F5A1F0C29074061206497F080220\r
+:1014FB0006EAC082C083E9600590F415800390F47E\r
+:10150B0016E004F07900D083D0822274F712068A99\r
+:10151B0075082175090078081207D57C007D007AC3\r
+:10152B00597BF4126A87740212064990DF36E05435\r
+:10153B00EF64016004C2AF80FE90DF37E0C3940319\r
+:10154B005004C2AF80FE53BEFBE5BEA2E650FA5379\r
+:10155B00C6BF43BE0474F4F5D575D480743C90DFDC\r
+:10156B0013F0741490DF14F0741E90DF02F0740506\r
+:10157B0090DF04F0745090DF2EF0740990DF25F0AB\r
+:10158B0090DF07F090F412E090DF08F0742590DF05\r
+:10159B0009F0749590DF0AF0745590DF0BF0746BC3\r
+:1015AB0090DF0CF074A390DF0DF0741390DF0EF04E\r
+:1015BB00742390DF0FF0741190DF10F0744390DF01\r
+:1015CB0011F0741D90DF15F0741C90DF16F074C7CA\r
+:1015DB0090DF17F0E490DF18F074B090DF19F0741F\r
+:1015EB00B690DF1AF0741090DF1BF074EA90DF1CDA\r
+:1015FB00F0742A90DF1DF0E490DF1EF0741F90DF73\r
+:10160B001FF0748190DF23F0743590DF24F07402A7\r
+:10161B0090F458F07900121B8D7E007F0075E1026B\r
+:10162B0075081475090590DF3CE0545070237A401F\r
+:10163B007B001219A5E50824C0F508E50934FFF570\r
+:10164B0009C3E5089401E5099400A2D265D0335093\r
+:10165B00D57A008013EEC333FEEF33FF90DF3AE011\r
+:10166B00A2E0E492E04EFE0AEAC3941040E77480D5\r
+:10167B004EF5BCEFF5BC12196090F47C7436F0A3F8\r
+:10168B00E4F090F47E74E2F0A37404F0439A01D278\r
+:10169B00AF7F020206EA74F712068AEAFEEBFF89B5\r
+:1016AB000975080090F458E064017004C2AF80FE25\r
+:1016BB00121960EF90F480F0EE90F481F074DF90EB\r
+:1016CB00F482F074D990F483F0742090F484F07465\r
+:1016DB002190F485F0741390F486F0744190F487A4\r
+:1016EB00F0E509701143D60175E103E5E9A2E45079\r
+:1016FB00FA53E9EF8068740165096004C2AF80FE9C\r
+:10170B007509048008121960121ACA150943D6010B\r
+:10171B0075E10290DF3BE0640D70F87E147F05905D\r
+:10172B00DF3CE05450701D7A407B001219A5EE246B\r
+:10173B00C0FEEF34FFFFC3EE9401EF9400A2D2651D\r
+:10174B00D03350DB75E10390DF3BE0640D6008E5BF\r
+:10175B00E9A2E450FA809AE50970AA7508011219FA\r
+:10176B006090F458E0640370031218D7A9087F0245\r
+:10177B000206EAC082C08390F459EAFCEBFD7421A7\r
+:10178B00120556D083D0822274F712068A90F45831\r
+:10179B00E064036004C2AF80FEE5E9A2E45035E5E6\r
+:1017AB00E9A2E6502F53E9EF53E9BF539BFCE59BAE\r
+:1017BB0012196075081F75090078081207D57C008F\r
+:1017CB007D007A597BF4126A87740212064912184B\r
+:1017DB00D702186A53E9EF539BFCE59B750802751A\r
+:1017EB00090078081207D590F459E0042459FCE459\r
+:1017FB0034F4FD7A787BF41269E87402120649E03E\r
+:10180B00FA90F479E0A2E7503B8A0874012508F8B6\r
+:10181B00E43400F9E89420E99400C365D0335024F4\r
+:10182B00EAC3940B401E7A5A7BF4121BF5E9701431\r
+:10183B0090F478E0F9121B38E9F090F479E0C2E704\r
+:10184B00F0122D5E75081F78081207D57C007D00FD\r
+:10185B007A597BF4126A87740212064943D6017FC8\r
+:10186B00020206EA74F812068A90F458E0640160EA\r
+:10187B0013A2AFE492E0FEC2AF1219857401F0EE31\r
+:10188B00A2E092AF7F010206EAC082C083E5C6A246\r
+:10189B00E65004C2AF80FE90F458E06401702274ED\r
+:1018AB00EA90DF1CF0742A90DF1DF0E490DF1EF04D\r
+:1018BB00740290F458F075E10490DF3BE064017022\r
+:1018CB00F8D083D0822243B404A9BC2274F7120649\r
+:1018DB008A74DF90F480F074D990F481F074F490F2\r
+:1018EB00F482F0745990F483F0748090F484F07463\r
+:1018FB002190F485F0741390F486F0741190F487B2\r
+:10190B00F075D68175081F75090078081207D57C0C\r
+:10191B00007D007A597BF4126A87740212064943E0\r
+:10192B00D601539BFCE59B53E9EF75E10243911004\r
+:10193B007F020206EAC082C08390F458E064017013\r
+:10194B0004C2AF80FEE0640360067403F01218D784\r
+:10195B00D083D08222C082C0835391EF75E1049073\r
+:10196B00DF3BE0640170F875D68153D1FE539BFCCD\r
+:10197B00E59B53E9EFD083D08222C082C08390F4E1\r
+:10198B0058E064017004C2AF80FEE064037006127D\r
+:10199B0019607402F0D083D0822274F712068A8AFF\r
+:1019AB00088B0974047808120611AE08AF09EA70A7\r
+:1019BB0001EB6028A2AFE492E0F508C2AF7A107B8E\r
+:1019CB00001208ACE508A2E092AFEEF8EFF974FF55\r
+:1019DB00281E74FF39FFE87001E970D87F020206F8\r
+:1019EB00EA74F712068A8A088B09740478081206BF\r
+:1019FB0011AE08AF09EA7001EB602EA2AFE492E0E2\r
+:101A0B00F508C2AF7A107B001208ACE508A2E09291\r
+:101A1B00AF90F47AE07012EEF8EFF974FF281E74B1\r
+:101A2B00FF39FFE87001E970D27F020206EA74F811\r
+:101A3B0012068AEAFEEB800E7AF47B011219A5EEF0\r
+:101A4B0024FF1EEF34FFFFEE7001EF70EB7F0102FE\r
+:101A5B0006EA74F812068A90F47CE0FEA3E0FFA27B\r
+:101A6B00AFE492E0FAC2AF740190F47BF0EAA2E02B\r
+:101A7B0092AF8008EE24FF1EEF34FFFFEE7001EFF4\r
+:101A8B00600D7AF47B011219EC90F47AE060E5A218\r
+:101A9B00AFE492E0FAC2AFE490F47AF090F47BF00A\r
+:101AAB00EAA2E092AF7F010206EAC082C08390F403\r
+:101ABB007BE06006740190F47AF0D083D0822274BC\r
+:101ACB00F812068A1218D1E9540F04FF7E00800C1D\r
+:101ADB0090F47EE0FAA3E0FB1219A50EEEC39F4033\r
+:101AEB00EF7F010206EA74F812068A90F458E0645C\r
+:101AFB00036004C2AF80FE7E147F0590DF3CE05490\r
+:101B0B0050701D7A407B001219A5EE24C0FEEF34F5\r
+:101B1B00FFFFC3EE9401EF9400A2D265D03350DBEC\r
+:101B2B0090DF3AE0F9121B387F010206EAC008C0C9\r
+:101B3B0009E9C39480E94019F879FF7A027B001216\r
+:101B4B0005B08808890974B72508F874FF35098032\r
+:101B5B000BC313F874B728F874FF3400F9C3E89477\r
+:101B6B0080E994FFA2D265D03350027880E8F9D097\r
+:101B7B0009D00822C082C08390F458E0F9D083D0FA\r
+:101B8B00822274F712068A8908E9C394044004C2BE\r
+:101B9B00AF80FE121960E50824C2F582E434F9F532\r
+:101BAB0083E090DF06F090F458E0640370031218A2\r
+:101BBB00D77F020206EA74F712068A8908E9C394F2\r
+:101BCB00034004C2AF80FE121960E50824C6F582FB\r
+:101BDB00E434F9F583E090DF2EF090F458E06403E1\r
+:101BEB0070031218D77F020206EA74F812068A9065\r
+:101BFB00F488E07004790080487E007D007C0080D2\r
+:101C0B002E8C82A882EA28F582EB3400F583E0FF64\r
+:101C1B00E824C9F582E434F9F583E06F70010EE82E\r
+:101C2B0024BEF582E434F9F583E06F70010D0CEC02\r
+:101C3B00C3940440CC74046D60BB74046E60B679BD\r
+:101C4B00017F010206EA74F712068AEAFEEBFF75C2\r
+:101C5B00082C75090078081207D57C007D007ACE18\r
+:101C6B007BF9126A877402120649740290F9CEF05E\r
+:101C7B00743D90F9CFF0742090F9D0F0740190F985\r
+:101C8B00D1F01234FFEEFAEFFB122C0112244112A9\r
+:101C9B0034FB124232EEFAEFFB1237D512408712A9\r
+:101CAB003B5F12430490F9EEE070347402F074035E\r
+:101CBB0090F9EFF0743F90F9F7F090F9F8F074FFAA\r
+:101CCB0090F9F9F075080478081207D5123599EADE\r
+:101CDB00FCEBFD7AF17BF91269A0740212064979CB\r
+:101CEB00007F020206EAC082C0837B0080010BEBFF\r
+:101CFB00C394025014EB75F00CA424E2F582E5F0CA\r
+:101D0B0034F9F583E0640260E574026B70067A00C7\r
+:101D1B007B00801AEB75F00CA424E2F582E5F0341D\r
+:101D2B00F9F583AA82AB83121D3EAA82AB83D083C3\r
+:101D3B00D08222C082C08374FF120633E48A828B66\r
+:101D4B0083A3A3A3A3A3A3A3A3A3A3F074028A8235\r
+:101D5B008B83F090F9D1E0C0E0EA240BF582EB34F1\r
+:101D6B0000F583D0E0F090F9D1E004F0E0F960F6F3\r
+:101D7B0074FF6960F1851082851183AA82AB83128F\r
+:101D8B002284E970E17401120649D083D08222C00B\r
+:101D9B0082C083E48A828B83F0D083D08222C0827C\r
+:101DAB00C08374FF120633851082851183AA82AB20\r
+:101DBB0083122284E96014E075F00CA424E2F5820E\r
+:101DCB00E5F034F9F583E0640260067582007583F3\r
+:101DDB0000AA82AB837401120649D083D08222748D\r
+:101DEB00F312068A8A088B09890A7EE27FF97A0048\r
+:101DFB00800A7A01EE240CFEEF3400FFEA70478E66\r
+:101E0B00828F83E0640270EA750C04750D00780C08\r
+:101E1B001207D5AC08AD09EE2403FAEF3400FB1220\r
+:101E2B0069477402120649EA7001EB70C58E828F06\r
+:101E3B0083A3A3A3A3A3A3A3A3A3A3E0650A70B245\r
+:101E4B00EEFAEFFB80047A007B007F060206EA7A4B\r
+:101E5B00D27BF92274F312068A8A0A8B0B7508005F\r
+:101E6B007509007EE27FF97A00800E8E088F097A61\r
+:101E7B0001EE240CFEEF3400FFEA703D8E828F835F\r
+:101E8B00E064026005E0640170E1750C04750D00FF\r
+:101E9B00780C1207D5E50A2405FCE50B3400FDEEA2\r
+:101EAB002403FAEF3400FB1269477402120649EA65\r
+:101EBB007001EB70BA7900803AE5087002E50960B1\r
+:101ECB00F47401850882850983F0750C04750D0087\r
+:101EDB00780C1207D5E50A2405FCE50B3400FDE56B\r
+:101EEB00082403FAE5093400FB1269A074021206F8\r
+:101EFB004979017F060206EA74F512068A8A088B75\r
+:101F0B00097EE27FF97A00800A7A01EE240CFEEF5B\r
+:101F1B003400FFEA70418E828F83E0640170EA75B2\r
+:101F2B000A04750B00780A1207D5E5082405FCE5B1\r
+:101F3B00093400FDEE2403FAEF3400FB12694774F9\r
+:101F4B0002120649EA7001EB70BFEEFAEFFB121DAD\r
+:101F5B003EEEFAEFFB80047A007B007F040206EA78\r
+:101F6B00C082C083E98A828B836001A3A3A3A3A34E\r
+:101F7B00A3A3A3A3A3E0FCEC60078A828B83E0708E\r
+:101F8B000479028008ECC3942040F67900D083D00A\r
+:101F9B00822274F112068A8A0C8B0D8C0E8D0F7EA9\r
+:101FAB00E27FF98A828B83A3A3A3A3A3A3A3A3A3F7\r
+:101FBB00E0543FF509750800800A0508EE240CFE75\r
+:101FCB00EF3400FFE508C3940240030220998E8290\r
+:101FDB008F83E0640270E3A3A3A3A3A3A3A3A3A390\r
+:101FEB00E0650970D5743F6509602B750A04750BA4\r
+:101FFB0000780A1207D5E50C2405FCE50D3400FD2D\r
+:10200B00EE2403FAEF3400FB1269477402120649FF\r
+:10201B00EA7001EB70A4750801EE240BF582EF3426\r
+:10202B0000F583E0850E82850F83F0743F650960B0\r
+:10203B0056E50C240AF582E50D3400F583E0A2E7A2\r
+:10204B0050198E828F83A3A3A3A3A3A3A3A3A3A39C\r
+:10205B00E0F9AA0CAB0D123115802CE0A2E350274E\r
+:10206B00EE2402F8EF3400F988828983E0FAE50C5C\r
+:10207B00240BF582E50D3400F583E06A7006E488E5\r
+:10208B00828983F0750800121AB5A90880027900BD\r
+:10209B007F080206EA74F112068A74FF120633896E\r
+:1020AB00088A0E8B0F7EE27FF9750A01750B00789B\r
+:1020BB000A1207D57C007D00740212067EAA82AB41\r
+:1020CB0083126A8774021206497A00805D750C04CC\r
+:1020DB00750D00780C1207D5E50E2403FCE50F34C3\r
+:1020EB0000FDEE2403FAEF3400FB12694774021271\r
+:1020FB000649EA7001EB70287401C0E0850A8285FD\r
+:10210B000B83E0F8851082851183E58228F8E5833F\r
+:10211B003400F974E028F58274FF39F583D0E0F0D0\r
+:10212B007A01EE240CFEEF3400FFEA7069E50E6EC7\r
+:10213B007003E50F6F60E98E828F83E0640270E0BD\r
+:10214B00EE2409F50AEF3400F50B850A82F583E0DE\r
+:10215B00C3943E50CB7401650860030220D890F9FC\r
+:10216B00CFE0C0E0850A82850B83E0FAD0E0C39A0A\r
+:10217B0050AE7401C0E0E0F8C3E498F8E49400F9C1\r
+:10218B00851082851183E58228F8E58339F9743D42\r
+:10219B0028F582E4808479007A0080027A01EA7063\r
+:1021AB0015851082851183E070F274026508700446\r
+:1021BB0079208002793D74026508701790F9CFE0A1\r
+:1021CB00C399400B90F9D0E0C399501FE9801B795C\r
+:1021DB00008018E9C0E090F9D0E0FAD0E0C39A4053\r
+:1021EB00EE90F9CFE0697003E014F0E9850E82857B\r
+:1021FB000F83A3A3A3A3A3A3A3A3A3F0740112060A\r
+:10220B00497F080206EA74F512068AEAFEEBFF75AF\r
+:10221B0008028C0AEE250AFAEF3400FB740C2AF53F\r
+:10222B0082E43BF583E0A2E750488D08EE2508FADF\r
+:10223B00EF3400FB740C2AF582E43BF583E0697004\r
+:10224B002E75080475090078081207D5123545EA72\r
+:10225B00FCEBFD8E828F83A3AA82AB83126947743A\r
+:10226B0002120649EA7001EB7005750800800375D0\r
+:10227B000801A9087F040206EA74F812068A7CE2B8\r
+:10228B007DF97E0080090EEC240CFCED3400FDEE94\r
+:10229B00C3940250218C828D83E0640270E8EC249D\r
+:1022AB000BF582ED3400F583E06970DAEE8A828BF0\r
+:1022BB0083F07901800279007F010206EA74F31240\r
+:1022CB00068A8A0C8B0D89097EE27FF975080080DE\r
+:1022DB000A0508EE240CFEEF3400FFE508C3940258\r
+:1022EB0050478E828F83E0640270E6750A04750B8B\r
+:1022FB0000780A1207D5EE2403FCEF3400FDAA0C7C\r
+:10230B00AB0D1269477402120649EA7001EB70C1FA\r
+:10231B008E828F83A3A3A3A3A3A3A3A3A3A3E065ED\r
+:10232B000970AEEEFAEFFB80047A007B007F0602A9\r
+:10233B0006EAE9FB7900EA6B601FEBC39A500EEAE1\r
+:10234B00C394FD4006EBC39403400E0922EBC394E8\r
+:10235B00FD4006EAC3940340F22274F512068AECA0\r
+:10236B00FEEDFF890A890875090078081207D5EA7E\r
+:10237B00FCEBFDEEFAEFFB1269E87402120649E57D\r
+:10238B000A1208170202BF239923BF23AD238E82A3\r
+:10239B008F83E0F8A3E0F98E828F83E8F0A3E9F056\r
+:1023AB0080128E828F83780812052B8E828F837812\r
+:1023BB000812053A7F040206EA74F512068A74FACB\r
+:1023CB00120633EAFEEBFFECFAEDFBE912081702FB\r
+:1023DB0002E423EA23E4230624EEFCEFFD80388E8F\r
+:1023EB00828F83E0FCA3E0FD851082851183ECF0E6\r
+:1023FB00A3EDF085108285118380188E828F8378F0\r
+:10240B000812052B740212067E780812053A740224\r
+:10241B0012067EAC82AD8389087509007808120715\r
+:10242B00D51269E8740212064974061206497F0434\r
+:10243B000206EA79022274F712068A7508D2750928\r
+:10244B000078081207D57C007D007A897BF4126A2C\r
+:10245B0087740212064975084678081207D57C0066\r
+:10246B007D007A5B7BF5126A8774021206497F0244\r
+:10247B000206EA74F512068A7C007D007E007F005E\r
+:10248B00780074016970097A897BF47509068007F5\r
+:10249B007A5B7BF575090274012509F50A880880BA\r
+:1024AB000EEAFEEBFF0508EA2423FAEB3400FBE50A\r
+:1024BB0008C3950950298A828B83E0601B740169DC\r
+:1024CB0070E308E0640460DDA3E0C3950A50D6EA2C\r
+:1024DB00FCEBFDE0F50A80CD74026970C48031EE2F\r
+:1024EB007001EF701EEC7001ED70067A007B0080BE\r
+:1024FB001FECFEEDFF8E828F83A3E0FA122520E501\r
+:10250B000880087401288E828F83A3F0EEFAEFFB0C\r
+:10251B007F040206EAC082C083740169703A78892D\r
+:10252B0079F4A2AFE492E0FDC2AF7B00801F8882FA\r
+:10253B008983E0600FA3EAC0E0E0FCD0E0C39C50CD\r
+:10254B0003E014F00BE82423F8E93400F9EBC3940F\r
+:10255B000640DBEDA2E092AFD083D0822274F11261\r
+:10256B00068A74F61206338A0C8B0D8C09740412CE\r
+:10257B00067EE4F0A3F0851082851183F0A3F0743E\r
+:10258B000212067EE4F0A3F0740169702E7E897F3F\r
+:10259B00F4750E078A828B83E064017052A3E0F915\r
+:1025AB00121DA9851082851183EAF0A3EBF085102B\r
+:1025BB0082851183E07002A3E070077A007B000232\r
+:1025CB0027A0851082851183E0F8A3E0F58388822C\r
+:1025DB00A3A3A3A3A3A3A3A3A3E0F50885108285BC\r
+:1025EB001183E02403F8A3E03400F974088049E078\r
+:1025FB007006A3E0F5088048E0640270BEA3A882D1\r
+:10260B00A983E0240EFAA3E03400FB8A828B83E0DB\r
+:10261B00F50888828983E02405FAA3E03400FB7473\r
+:10262B000812067EEAF0A3EBF088828983E0240F80\r
+:10263B00F8A3E03400F9740212067EE8F0A3E9F087\r
+:10264B007401650970057509018003750903750F20\r
+:10265B0000800FEAA2E092AF050FEE2423FEEF34C9\r
+:10266B0000FFE50FC394064003022796A2AFE49246\r
+:10267B00E0FAC2AF8E828F83E0650970D67404F0E6\r
+:10268B00EAA2E092AFEE240BF582EF3400F583E083\r
+:10269B00543F6508600302278E850C82850D83E00D\r
+:1026AB0064017019743F6508700E85108285118363\r
+:1026BB00E02403F8A3E0800FEE24078008E0640217\r
+:1026CB007012EE2403F8EF3400F9740612067EE85C\r
+:1026DB00F0A3E9F0750A04750B00780A1207D5749C\r
+:1026EB000A12067EE0FCA3E0FD740812067EE0FAF7\r
+:1026FB00A3E0FB1269477402120649850C82850D13\r
+:10270B0083E06040740212067EE07002A3E0700367\r
+:10271B00EA6031740212067EE07002A3E060647816\r
+:10272B000A1207D5EE2407FCEF3400FD74041206E1\r
+:10273B007EE0FAA3E0FB1269477402120649EA70C5\r
+:10274B0001EB703F8E828F83A3AA82AB83E0C3958C\r
+:10275B000E5030740412067EE07002A3E060107419\r
+:10276B000412067EE0F8A3E0F5838882E509F08A7F\r
+:10277B00828B83E0F50E740412067EEEF0A3EFF06D\r
+:10278B000226638E828F83E50980F4740412067E21\r
+:10279B00E0FAA3E0FB740A1206497F080206EA740A\r
+:1027AB00016970057A897BF4227A5B7BF52274F8D8\r
+:1027BB0012068AEAFEEBFF90F5A1E07013121516D4\r
+:1027CB00EEFAEFFB121C51E9700C1218941219401F\r
+:1027DB007401F0123A4F7F010206EA74F712068A6F\r
+:1027EB008A828B83121B7FE9F509790012401574DD\r
+:1027FB00036509600C7401650970031218941219B2\r
+:10280B00407E007F00800F7A0A7B00121A39EE247B\r
+:10281B00010EEF3400FFC3EE94F4EF940150091254\r
+:10282B003FBCE9FA8A0860DF74036509600E740126\r
+:10283B006509700512186F8003121985E508700978\r
+:10284B00790112401579018003F079007F020206AD\r
+:10285B00EA74F712068A75080075090078081207E2\r
+:10286B00D512287974021206497F020206EA74F126\r
+:10287B0012068A74FC120633740212067EEAF0A367\r
+:10288B00EBF089088C09741312067EE0FEA3E0FFBF\r
+:10289B00121DA98A0C8B0D750B02121B7FE985107B\r
+:1028AB0082851183F0750A00E50C7002E50D600F4F\r
+:1028BB007901AA0CAB0D121F6BE9FA8A0B600302AC\r
+:1028CB002A2A740212067EE07002A3E060F1E50989\r
+:1028DB00C3941450EAEE7001EF703D850C82850DA8\r
+:1028EB0083A3E0FDAC09740212067EE0FAA3E0FBC1\r
+:1028FB00850C82850D83A3A3A3A3A3A3A3A3A3A347\r
+:10290B00E0F9122C328A088B09AE08AF09EE700180\r
+:10291B00EF70627903022A2CEEA2E0505374FF652C\r
+:10292B0008604DE50C2402F50AE50D3400F50B7833\r
+:10293B000A1207D5850C82850D83A3E0FDAC0974C3\r
+:10294B000412067EE0FAA3E0FB850C82850D83A3BF\r
+:10295B00A3A3A3A3A3A3A3A3A3E0F9122D1D740206\r
+:10296B001206498A088B09AE08AF09750A01809DCA\r
+:10297B007902022A2CEE2403F50EEF3400F50F75C5\r
+:10298B00080475090078081207D5E50C2403FCE54B\r
+:10299B000D3400FDAA0EAB0F1269A074021206498A\r
+:1029AB00740112067EAC82AD83AA0EAB0F123A52A3\r
+:1029BB00EA7001EB600B74038E828F83F0790080D9\r
+:1029CB00607901EEFAEFFB1230B9E9F50B7050E5C7\r
+:1029DB000A604C851082851183E06403600BE06410\r
+:1029EB00017003121894121940121A5DE06403600F\r
+:1029FB000DE06401700512186F8003121985A2AFE8\r
+:102A0B00E492E0FAC2AFE50C2402F582E50D340046\r
+:102A1B00F583E06005E4F0750B0CEAA2E092AFA938\r
+:102A2B000B74041206497F080206EA74F312068A35\r
+:102A3B0074FD120633890AEAFEEBFF8C088D09122E\r
+:102A4B001DA97902EA7001EB60411919121F6BE99C\r
+:102A5B0070397401851082851183F012067EE50AA8\r
+:102A6B00F0750A00750B00780A1207D5780A120761\r
+:102A7B00D578081207D5EEFCEFFD740612067EAA78\r
+:102A8B0082AB83122D927406120649740312064907\r
+:102A9B007F060206EA74F112068A89088A09ECFE9F\r
+:102AAB00EDFF90F5A1E0700B122BE4E970057902B4\r
+:102ABB00022BDFE50812081702080C2B6F2B8D2B4E\r
+:102ACB00982B5A2B4F2B9F2BC82B402BD92A750891\r
+:102ADB00008E828F83E0702FE5097014A3780C129F\r
+:102AEB00052BAA0CAB0DAC0EAD0F123BB8022BDDB8\r
+:102AFB0074016509700BA3AA82AB83123BDC022B1A\r
+:102B0B00DD750802022BDDE0640170F5E509701438\r
+:102B1B00A3780C12052BAA0CAB0DAC0EAD0F123813\r
+:102B2B0030022BDD7401650970D7A3AA82AB831227\r
+:102B3B003854022BDDEEFAEFFBA90912243EE9F51E\r
+:102B4B0008022BDDEEFAEFFBA9091237A780EF7411\r
+:102B5B000165096004E50970A8EEFAEFFBA90912FB\r
+:102B6B00376380DA740365097009EEFAEFFB1235EF\r
+:102B7B009E80CB740265097088EEFAEFFB12362A41\r
+:102B8B0080BCEEFAEFFBA90912369B80B1A90912A2\r
+:102B9B00375280AA740165096003022B0C75080477\r
+:102BAB0075090078081207D512355EEAFCEBFDEECD\r
+:102BBB00FAEFFB1269A074021206498012740165C8\r
+:102BCB00096003022B0C123563E98E828F83F0753B\r
+:102BDB000800A9087F080206EAC082C083E9120830\r
+:102BEB004D000205F62B0AF62BFA2B7901800279A0\r
+:102BFB0000D083D08222C082C083E490F5A5F0740C\r
+:102C0B002090F5A6F090F5A7EAF0A3EBF01235456E\r
+:102C1B0090F5A3EAF0A3EBF01218D1E990F5A2F02E\r
+:102C2B0060F6D083D0822274F112068A89088A0E4C\r
+:102C3B008B0F8C0A8D09790212247E8A0C8B0DA8BE\r
+:102C4B000CA90DE8FEE9FFE87001E970077A007B3B\r
+:102C5B0000022D18740B250A8E828F83A3A3F0EE2E\r
+:102C6B00240BF8EF3400F988828983E0C2E6F0E0A8\r
+:102C7B0054C04508F090F5A2E0C0E0EE240DF582BB\r
+:102C8B00EF3400F583D0E0F090F5A2E004F0E060C3\r
+:102C9B00F7EE240CFAEF3400FB90F5A5C082C0834D\r
+:102CAB008A828B83E054BFD083D082FCE04C8A8233\r
+:102CBB008B83F0E054F84509F0E0C2E7F0E0C2E3A3\r
+:102CCB00F088828983E0C2E7F0750B00780A12075F\r
+:102CDB00D5AC0EAD0FEE240E0A0AEF3400FB1269D1\r
+:102CEB00A0740212064975080475090078081207CA\r
+:102CFB00D590F5A3E0FCA3E0FDEE2407FAEF34003A\r
+:102D0B00FB1269A07402120649EEFAEFFB7F080270\r
+:102D1B0006EA74F712068A740912067EE0FEA3E037\r
+:102D2B00FF122C32EA7001EB70067A007B00801EDA\r
+:102D3B00EA240DF582EB3400F583E08E828F83F06D\r
+:102D4B00EA240CF582EB3400F583E0D2E7F07F0246\r
+:102D5B000206EA74F712068A790112247E8A088B1E\r
+:102D6B0009A808A909E8FEE9FFE87001E96013EE7C\r
+:102D7B0024020A0AEF3400FB12177EEEFAEFFB1265\r
+:102D8B002EE77F020206EA74F112068A74FE12061F\r
+:102D9B0033851082851183ECF0A3EDF08A0C8B0D3B\r
+:102DAB00741112067EE0F50AA3E0F50B74151206FA\r
+:102DBB007EE0F50EA3E0F50FE4850A82850B83F028\r
+:102DCB007C0179011225688A088B09AE08AF09EEE0\r
+:102DDB007001EF7003022EDB750800750900850C7E\r
+:102DEB0082850D83E064017015A3E0F9121DA98A99\r
+:102DFB00088B09EA7001EB70057902022EDD8E82D9\r
+:102E0B008F83A3A3E024F5850A82850B83F0E0F57D\r
+:102E1B000A750B00780A1207D5EE240EFCEF34006E\r
+:102E2B00FD740212067EE0FAA3E0FB1269A07402A5\r
+:102E3B00120649E5087002E5096033EE2421F5829C\r
+:102E4B00EF3400F583E0850882850983A3A3A3A350\r
+:102E5B00A3A3A3F0EE2422F582EF3400F583E085E3\r
+:102E6B000882850983A3A3A3A3A3A3A3A3F074132D\r
+:102E7B0012067EE07002A3E0602575080475090058\r
+:102E8B0078081207D5EE2407FCEF3400FD741512F9\r
+:102E9B00067EE0FAA3E0FB1269A07402120649E574\r
+:102EAB000E7002E50F6014EE240CF582EF3400F582\r
+:102EBB0083E05407850E82850F83F08E828F83A368\r
+:102ECB00E0FA7901122520E48E828F83F0F98002DB\r
+:102EDB00790474021206497F080206EA74F312069B\r
+:102EEB008A74FE120633EAFEEBFFEE240BF582EF3B\r
+:102EFB003400F583E0543FF509750A04750B00782F\r
+:102F0B000A1207D590F5A3E0FCA3E0FDEE2407FA27\r
+:102F1B00EF3400FB1269477402120649EA7001EBA9\r
+:102F2B007010E48E828F83F074021206497F0602C2\r
+:102F3B0006EAEE240BF582EF3400F583E0A2E640BF\r
+:102F4B00E1E509603EC394075039EE2402FAEF34F1\r
+:102F5B0000FBE509C33324F8F582E434F9F583E08B\r
+:102F6B00F8A3E0F5838882120688E9FA74016A7087\r
+:102F7B0004740180AE74026A70A8EEFAEFFB123192\r
+:102F8B00EC80A5743F6509600EE509C3942040925F\r
+:102F9B00E509C3943F508BEE2403F50AEF3400F59B\r
+:102FAB000B750C04750D00780C1207D5AC0AAD0B24\r
+:102FBB0090F5A3E0FAA3E0FB1269477402120649ED\r
+:102FCB00EA7001EB70057508018003750800E508D0\r
+:102FDB007020743F65097073780C1207D512359900\r
+:102FEB00AD0BAC0A1269477402120649EA7001EB89\r
+:102FFB007059851082851183AC82AD83EE2402FA61\r
+:10300B00EF3400FB121F9DE97003022F2DE50870B2\r
+:10301B0007EEFAEFFB1231EC74018E828F83F09086\r
+:10302B00F5A7E07002A3E07003022F3385108285B1\r
+:10303B001183E0F990F5A7E0F8A3E0F583888212FD\r
+:10304B000688E96003022F2D022F33740112067ECE\r
+:10305B00AC82AD83AA0AAB0B123A52EA7001EB6059\r
+:10306B0036EE2402FAEF3400FB1233DFE960030281\r
+:10307B002F2DEE240BF582EF3400F583E0A2E75001\r
+:10308B0003022F2DEE240CF582EF3400F583E0C202\r
+:10309B00E7F07403022F2EEE240CF582EF3400F5CB\r
+:1030AB0083E0543064206003022F85022F2D74F8C7\r
+:1030BB0012068AEAFEEBFFE9FAEE240CF8EF340075\r
+:1030CB00F990F5A6C082C08388828983E054CFD063\r
+:1030DB0083D082FBE04B88828983F0EAF9EE2402ED\r
+:1030EB00FAEF3400FB1216A1E97004790080027923\r
+:1030FB0009E48E828F83F07F010206EAC082C083CF\r
+:10310B0090F5A5E0F9D083D0822274F712068A7469\r
+:10311B00DF120633E9FEEA240BF582EB3400F5836C\r
+:10312B00E0FF90F5A5C082C08390F5A6C082C08356\r
+:10313B00740A12067EE054CFD083D082FCE04C544C\r
+:10314B00BFD083D082FCE04CC0E0740A12067ED064\r
+:10315B00E0F075080475090078081207D5EA240514\r
+:10316B00FCEB3400FD740312067EAA82AB8312695A\r
+:10317B00A0740212064978081207D590F5A3E0FC5B\r
+:10318B00A3E0FD740712067EAA82AB831269A074BA\r
+:10319B0002120649740912067EE054C04EF0740BFD\r
+:1031AB00851082851183F0EFC0E0740B12067ED080\r
+:1031BB00E0F0740A12067EE05478F0E0440BF074F1\r
+:1031CB000912067EE0543FF0790085108285118349\r
+:1031DB00AA82AB831216A174211206497F02020642\r
+:1031EB00EA74F812068AEAFEEBFFEE240CF582EF86\r
+:1031FB003400F583E05407FA74FF2AFBEA6017E00A\r
+:10320B0054F84BF07A017B00121A397901EEFAEF80\r
+:10321B00FB1230B98006E48E828F83F07F010206A9\r
+:10322B00EA74F312068A74FD1206338A0C8B0D892D\r
+:10323B0008EA2508F8EB3400F9740C28F582E43918\r
+:10324B00F583E0F5097402851082851183F0740112\r
+:10325B0012067EEAF0A3EBF07C02851082851183C7\r
+:10326B00AA82AB8379011225688A0A8B0BA80AA95B\r
+:10327B000BE8FEE9FFE87001E96006EEFAEFFB8070\r
+:10328B006C79021227AA8A0A8B0BAE0AAF0B750850\r
+:10329B0000804F8E828F83E06403703C750A047547\r
+:1032AB000B00780A1207D5E50C2405FCE50D34005C\r
+:1032BB00FDEE2403FAEF3400FB1269477402120689\r
+:1032CB0049EA7001EB7011EE240BF582EF3400F537\r
+:1032DB0083E0543F650960A30508EE2423FEEF3419\r
+:1032EB0000FFE508C3940240AA7A007B0074031226\r
+:1032FB0006497F060206EA74F512068A74DF120687\r
+:10330B0033EAFEEBFFEE240EF582EF3400F583E09B\r
+:10331B00F50890F5A5C082C083740A12067EE054AE\r
+:10332B008FD083D082FAE04A4420C0E0740A1206A0\r
+:10333B007ED0E0F0750A04750B00780A1207D5EE03\r
+:10334B002405FCEF3400FD740312067EAA82AB83C6\r
+:10335B001269A07402120649780A1207D5EE240FDF\r
+:10336B00FCEF3400FD740712067EAA82AB83126950\r
+:10337B00A07402120649740912067EE054C0450877\r
+:10338B00FAF0740B851082851183F090F5A2E0C0E2\r
+:10339B00E0740B12067ED0E0F090F5A2E004F0741E\r
+:1033AB000A12067EE05471F0E0D2E0F074BF5A448A\r
+:1033BB0080C0E0740912067ED0E0F079008510829F\r
+:1033CB00851183AA82AB831216A174211206497F41\r
+:1033DB00040206EA74F112068A8A0C8B0D8A828B20\r
+:1033EB0083E024F8F50979011227AA8A0A8B0BAE20\r
+:1033FB000AAF0B750800800A0508EE2423FEEF3494\r
+:10340B0000FFE508C3940640030234F48E828F83D9\r
+:10341B00E0640370E385098285820E8E82A3A3E0AC\r
+:10342B00F874F828F874FF3400F9E50E687001E9B8\r
+:10343B0070C6750A04750B00780A1207D5850C82C5\r
+:10344B00850D83A3AC82AD83EE2403FAEF3400FB2E\r
+:10345B001269477402120649EA7001EB709A780AF6\r
+:10346B001207D5E50C2405FCE50D3400FDEE240711\r
+:10347B00FAEF3400FB1269477402120649EA700135\r
+:10348B00EB6003023403750A01780A1207D5E50CC9\r
+:10349B002409FCE50D3400FDEE240BFAEF3400FBA0\r
+:1034AB001269477402120649EA7001EB6003023499\r
+:1034BB000374FE250EF50A74FF3400F50B780A121F\r
+:1034CB0007D5E50C240BFCE50D3400FDEE240DFABD\r
+:1034DB00EF3400FB1269477402120649EA7001EBE4\r
+:1034EB0060030234037901800279007F080206EA47\r
+:1034FB002279002274F712068A7508047509007880\r
+:10350B00081207D57C007D007AA97BF5126A8774B7\r
+:10351B000212064990F5B1E0701B78081207D57CB2\r
+:10352B00067DFA7AAD7BF51269A074021206497416\r
+:10353B000190F5B1F07F020206EAC082C08390F5DC\r
+:10354B00B1E060067AAD7BF580047A067BFAD08316\r
+:10355B00D082227A0B7BFA2279022274F712068A26\r
+:10356B00790090F5B1E0702175080489097808128B\r
+:10357B0007D5EAFCEBFD7AAD7BF51269A07402125C\r
+:10358B000649740190F5B1F0F97F020206EA7ABEA2\r
+:10359B007BF92274F512068AEAFEEBFFEE2405F89E\r
+:1035AB00EF3400F988828983E012084D010506C2C9\r
+:1035BB00350103C235C6357D0180027D038E828FB6\r
+:1035CB0083A3A3A3A3E0FC8E828F83A3A3E0FAA320\r
+:1035DB00E0FB88828983E0F9122C328A088B09A9D7\r
+:1035EB0009EA7001E96031750A04750B00780A125B\r
+:1035FB0007D58E828F83E0FCA3E0FDEA24030A0A41\r
+:10360B000AE93400FB1269A074021206497901AA77\r
+:10361B0008AB091230B9800279037F040206EA7401\r
+:10362B00F712068A74FD120633E485108285118326\r
+:10363B00F08A828B83A3A3A3A3A3E0C0E07401123F\r
+:10364B00067ED0E0F0EA2406F508EB3400F50978A5\r
+:10365B00081207D58A828B831207EAEA2404F5083D\r
+:10366B00EB3400F50978081207D58A828B83A3A364\r
+:10367B00E0FCA3E0FD740612067EAA82AB83122D3A\r
+:10368B0092740612064974031206497F020206EA77\r
+:10369B0074F512068AEAFEEBFF7508007404697074\r
+:1036AB000912198512186F02374B740569700912CC\r
+:1036BB00189412194002374B74066970398E828F39\r
+:1036CB0083E0F9121DA9EA7001EB70047902807294\r
+:1036DB00750A02750B00780A1207D5EA2407FCEB72\r
+:1036EB003400FD8E828F83A3AA82AB831269A074F0\r
+:1036FB0002120649804A740769700B121AF1E98E9F\r
+:10370B00828F83F0803A74086960A7740969700529\r
+:10371B00121985802B740A6970238E828F83E012B5\r
+:10372B0008170002D7363F373B3737377902800609\r
+:10373B00790180027900121BC1790080057508029E\r
+:10374B00A9087F040206EA740B69700479018002F0\r
+:10375B007902123AC679002274F712068AEAFEEB56\r
+:10376B00FF750802740169702075080475090078EB\r
+:10377B00081207D5123545EAFCEBFDEEFAEFFB120A\r
+:10378B0069A074021206498009E97009123566E9CD\r
+:10379B006003750800A9087F020206EA74F7120697\r
+:1037AB008AE9FC8A828B83E0F9740E6C60047902DF\r
+:1037BB00801374FF6960F7121DA9EA7001EB60EECC\r
+:1037CB00121D9A79007F020206EA74F512068A909E\r
+:1037DB00F5B2C082C08390F9B2780812052BD08362\r
+:1037EB00D082780812034F701090FA0F78081205E8\r
+:1037FB002B90F5B2780812053A90F5B6EAF0A3EBE8\r
+:10380B00F01218D1E990F5B8F0123875123BB87474\r
+:10381B000190F5BBF0121E5A90F5B9EAF0A3EBF04C\r
+:10382B007F040206EA74F512068A8A088B098C0A51\r
+:10383B008D0B90F9B2780812034F600890F5B278AF\r
+:10384B000812053A7F040206EA74F512068AEA703A\r
+:10385B0001EB601190F5B2780812052B8A828B83ED\r
+:10386B00780812053A7F040206EA7AEF7BBE7CAD3C\r
+:10387B007DDE2274F312068A74F4120633EAFEEB31\r
+:10388B00FF8E828F83E0F874F528F874FF3400F90B\r
+:10389B00C3E89408E99400A2D265D0334018EE2413\r
+:1038AB0013F582EF3400F583E0F508123563E96513\r
+:1038BB00086003023A457904740112067EAC82ADAE\r
+:1038CB0083EE240EFAEF3400FB122365C082C08313\r
+:1038DB0090F5B2780812052BD083D08278081203AA\r
+:1038EB004F6003023A45740112067EAA82AB831223\r
+:1038FB003BDC7904740712067EAC82AD8374011233\r
+:10390B00067EAA82AB831223C4E4C0E0740B1206BA\r
+:10391B007ED0E0F07481C0E0740512067ED0E0F03A\r
+:10392B00EE240DF582EF3400F583E0C0E07406124F\r
+:10393B00067ED0E0F07D017C07740512067EAA821C\r
+:10394B00AB837903122C328A088B09A808A9098842\r
+:10395B000A890BE87001E97003023A45EE2405F57C\r
+:10396B0008EF3400F509750C04750D00780C12077F\r
+:10397B00D5AC08AD09EA24030A0A0AE93400FB12A4\r
+:10398B0069A07402120649EE2412F582EF3400F599\r
+:10399B0083E06024EEFAEFFB121E5FE9601A90F5EC\r
+:1039AB00B6E07002A3E06010790090F5B6E0F8A3E2\r
+:1039BB00E0F58388821206888E828F83A3A3A3A34C\r
+:1039CB00A3A3A3A3A3A3E0A2E6506685108285114F\r
+:1039DB0083AC82AD83AA08AB09123A52EA7001EBB1\r
+:1039EB00704A90F5B9E0FEA3E0FF8E828F83E0C3AF\r
+:1039FB0094035046780C1207D5AC08AD098E828F14\r
+:103A0B0083E075F005A4F8A9F090F5B9E028FAA3C6\r
+:103A1B00E0398A82F583A3AA82AB831269A0740270\r
+:103A2B001206498E828F83E004F08005E0F9124282\r
+:103A3B00187900AA0AAB0B1230B9740C1206497F25\r
+:103A4B00060206EA79002274F112068A8A0E8B0F9F\r
+:103A5B008C088D0990F5B9E02401FEA3E03400FF3A\r
+:103A6B00750A00800A050AEE2405FEEF3400FF906C\r
+:103A7B00F5B9E0F8A3E0F5838882E0FAE50AC39A8A\r
+:103A8B005030750C04750D00780C1207D5AC0EADCB\r
+:103A9B000FEEFAEFFB1269477402120649EA700146\r
+:103AAB00EB70C2850882850983E50AF0EEFAEFFB1D\r
+:103ABB0080047A007B007F080206EAC082C0837410\r
+:103ACB000169700474018001E490F5BBF0D083D0E0\r
+:103ADB008222C082C083EA240CF8EB3400F98A827C\r
+:103AEB008B83E0FC74F52CFC74FF3400FD74076CC5\r
+:103AFB007001ED7007740188828983F08882898355\r
+:103B0B00E06401700312387ED083D0822274F812E5\r
+:103B1B00068AEAFEEBFF7508007D017C0090F5B884\r
+:103B2B00E0F9122211E9FB7008121AB57508018031\r
+:103B3B001C74016B7005750802801274026B700D9A\r
+:103B4B0090F5BBE06007EEFAEFFB123ADDA9087FB8\r
+:103B5B00010206EA74F512068A90F5BCC082C08396\r
+:103B6B0090F9B2780812052BD083D0827808120313\r
+:103B7B004F701090FA13780812052B90F5BC78084B\r
+:103B8B0012053A1218D1E990F5C3F060F6750801E9\r
+:103B9B0075090078081207D57C007D007AC17BF58A\r
+:103BAB00126A8774021206497F040206EA74F51240\r
+:103BBB00068A8A088B098C0A8D0B90F9B278081249\r
+:103BCB00034F600890F5BC780812053A7F04020693\r
+:103BDB00EA74F512068AEA7001EB601190F5BC7875\r
+:103BEB000812052B8A828B83780812053A7F040210\r
+:103BFB0006EA74F312068A74FD120633EAFEEBFF33\r
+:103C0B00750A08EE2405F508EF3400F509EE240ECD\r
+:103C1B00F582EF3400F583E0F9AA08AB091222C84C\r
+:103C2B00EA7001EB6006121D9A750A00748285100A\r
+:103C3B0082851183F0EE240DF582EF3400F583E0DD\r
+:103C4B00C0E0740112067ED0E0F0740212067EE52D\r
+:103C5B000AF07D037C03851082851183AA82AB83D6\r
+:103C6B007902122C328A0A8B0BA80AA90BE8FEE9FF\r
+:103C7B00FFE87001E9602A750A04750B00780A12D7\r
+:103C8B0007D5AC08AD09EE24030A0A0AEF3400FB92\r
+:103C9B001269A074021206497900EEFAEFFB12309A\r
+:103CAB00B974031206497F060206EA74F112068AFA\r
+:103CBB0074F81206338A088B098A828B83E0F874B6\r
+:103CCB00F528F874FF3400F9C3E89409E99400A2CD\r
+:103CDB00D265D033401FEA2414F582EB3400F58310\r
+:103CEB00E0FE123563E96E600C7902740812064926\r
+:103CFB007F080206EA7904E912067EAC82AD83E501\r
+:103D0B0008240EFAE5093400FB122365C082C08338\r
+:103D1B0090F5BC780C12052BD083D082780C120353\r
+:103D2B004F70C6E5082412F582E5093400F583E0EF\r
+:103D3B00F50AE5082405F50EE5093400F50FA90A87\r
+:103D4B00AA0EFB121DEA8A0C8B0DA80CA90DE8FE1E\r
+:103D5B00E9FFE87001E97003023E1174818510825E\r
+:103D6B00851183F0E508240DF582E5093400F58310\r
+:103D7B00E0C0E0740112067ED0E0F08E828F83A348\r
+:103D8B00A3A3A3A3A3A3A3A3E0C0E0740212067E84\r
+:103D9B00D0E0F0123107E9C0E0740312067ED0E0E8\r
+:103DAB00F0850882850983A3A3A3A3A3A3A3A3A33D\r
+:103DBB00A3E05407FA7403C39AFD7C048510828533\r
+:103DCB001183AA82AB837902122C328A088B09A940\r
+:103DDB0009EA7001E9602A750A04750B00780A126A\r
+:103DEB0007D5AC0EAD0FEA24030A0A0AE93400FB2F\r
+:103DFB001269A074021206497900AA08AB091230A5\r
+:103E0B00B97901023CF690F5C0E07003023CF4AACC\r
+:103E1B0008AB09121F038A0C8B0DAE0CAF0DEE70A5\r
+:103E2B0001EF700B121CF18A0C8B0DAE0CAF0DEE6B\r
+:103E3B007001EF60CC750C04750D00780C1207D572\r
+:103E4B00AC0EAD0FEE2403FAEF3400FB1269A07435\r
+:103E5B0002120649EEFAEFFB79021220A0E9700973\r
+:103E6B00EEFAEFFB121D9A809890F5C2E0640160A8\r
+:103E7B00EFE0F50C7401250CF0EE240BF582EF341A\r
+:103E8B0000F583E0C0E0E50C24C1F582E434F5F5E0\r
+:103E9B0083D0E0F08E828F83A3A3A3A3A3A3A3A3BA\r
+:103EAB00A3A3E50AF074028E828F83F0A3A882A9E4\r
+:103EBB0083E5082413F582E5093400F583E06440BB\r
+:103ECB00700474018002740388828983F08E828F60\r
+:103EDB0083A3A3A3A3A3A3A3A3A3E0C0E074021291\r
+:103EEB00067ED0E0F0123107E9C0E0740312067EC3\r
+:103EFB00D0E0F07481851082851183F0E508240DE4\r
+:103F0B00F582E5093400F583E0C0E0740112067E0A\r
+:103F1B00D0E0F0850882850983A3A3A3A3A3A3A361\r
+:103F2B00A3A3A3E05407FA7403C39AFD7C04851082\r
+:103F3B0082851183AA82AB837902122C328A088B79\r
+:103F4B0009A909EA7001E96030750A04750B00785C\r
+:103F5B000A1207D5AC0EAD0FEA24030A0A0AE9349C\r
+:103F6B0000FB1269A074021206497900AA08AB097A\r
+:103F7B001230B9E97003023E0C023E6B74F8120664\r
+:103F8B008AEAFEEBFF7D017C0090F5C3E0F912227B\r
+:103F9B0011E9FB7007121AB57901801074016B706F\r
+:103FAB000479028007EEFAEFFB12402C7F01020628\r
+:103FBB00EA74F712068A7900A2AFE492E0FAC2AF74\r
+:103FCB0090F5C2E0603AE014F0EAA2E092AF091279\r
+:103FDB00401590F5C1E0F97C00ECC0E090F5C2E033\r
+:103FEB00FAD0E0C39A501E8C08E50824C1FAE434D9\r
+:103FFB00F5FB8A828B83A3E08A828B83F00C80D9BA\r
+:10400B00EAA2E092AF7F020206EAC082C083E970A7\r
+:10401B00047A0180027A00EA90F5C0F0D083D08256\r
+:10402B002274F812068A7E00EA240CF8EB3400F9AD\r
+:10403B008A828B83E0FC74F52CFC74FF3400FD74D6\r
+:10404B00086C7001ED7007740188828983F0888297\r
+:10405B008983E01208170101804069407D40123CC2\r
+:10406B00B6E9FA90F5C0E0700C74016A60070E0EA9\r
+:10407B008003123BFDEEF97F010206EA74F712068C\r
+:10408B008A1218D1E990F5C7F07508037509007805\r
+:10409B00081207D57C007D007AC47BF5126A877401\r
+:1040AB00021206497F020206EA74F712068AEAFE3A\r
+:1040BB00EBFF7D017C0090F5C7E0F9122211E9FBC3\r
+:1040CB007007121AB57901803B74016B7004790289\r
+:1040DB00803275080475090078081207D51235452A\r
+:1040EB00EAFCEBFD8E828F83A3AA82AB8312694716\r
+:1040FB007402120649EA7001EB70D3EEFAEFFB1271\r
+:10410B00411479007F020206EAC082C083EA240CC4\r
+:10411B00F582EB3400F583E06401700312412FD07C\r
+:10412B0083D0822274F612068A74FF120633EAFEDB\r
+:10413B00EBFFEE240DF582EF3400F583E0F50A85F5\r
+:10414B001082851183AC82AD83EE2405FAEF340027\r
+:10415B00FB123A52EAF8EBF9EA7001EB70030242F8\r
+:10416B000EE82404F508E93400F509E024C4F582CF\r
+:10417B00E434F5F583E07021850882850983E50A2F\r
+:10418B00F07401C0E0851082851183E024C4F582B0\r
+:10419B00E434F5F583D0E08012AA0A8508828509FC\r
+:1041AB0083E0F912233DE9605AE50AF07902EEFA51\r
+:1041BB00EFFB12322C8A088B09A808A909E87001B9\r
+:1041CB00E9603988828983A3E0FA7901122520E519\r
+:1041DB0008240CF582E5093400F583E054F844011A\r
+:1041EB00F0E508240BF582E5093400F583E0D2E70E\r
+:1041FB00F07900AA08AB091230B98007EEFAEFFB91\r
+:10420B0012330274011206497F030206EA74F71295\r
+:10421B00068AE4C0E0E924C4F582E434F5F583D0E2\r
+:10422B00E0F07F020206EAC082C0831218D1E99047\r
+:10423B00F5C8F0D083D0822274F512068AEAFEEB21\r
+:10424B00FF7D038E828F83E024F5FCEE240CFAEFC6\r
+:10425B003400FB7901122C328A088B09A909EA7008\r
+:10426B0001E9603E750A04750B00780A1207D5EE5A\r
+:10427B002405FCEF3400FDEA24030A0A0AE93400A2\r
+:10428B00FB1269A07402120649E508240EF582E5BB\r
+:10429B00093400F583E0D2E7F07900AA08AB0912E4\r
+:1042AB0030B97F040206EA74F812068AEAFEEBFFC5\r
+:1042BB007D017C0090F5C8E0F9122211E9FA700734\r
+:1042CB00121AB57901801274016A7004790280099F\r
+:1042DB00EEFAEFFB1242E979007F010206EAC08297\r
+:1042EB00C083EA240CF582EB3400F583E0640170A3\r
+:1042FB0003124243D083D0822222790022C082C093\r
+:10430B0083124638E490F5D4F0FB8029EB75F00569\r
+:10431B00A424D5F8E5F034F5F9E488828983F0A379\r
+:10432B00F0A3F088828983A3A3A3F088828983A357\r
+:10433B00A3A3A3F00BEBC3940A40D1D083D082226A\r
+:10434B0074F112068A74FB12063374018510828590\r
+:10435B001183F01243081248997A007BC0124971FD\r
+:10436B0075E54475E402539BFCE59B53E9EF4391E0\r
+:10437B0010D2A8439A01D2B990F410E4F0A3F080C4\r
+:10438B000B90DF3BE06401700375E10290F5D4E024\r
+:10439B00C3940A500690F608E060E675E10490F6C7\r
+:1043AB0008E0700990F5D4E0C39405500B90F4101D\r
+:1043BB00E4F0A374800245857A0080010AEAC39475\r
+:1043CB000A5031EA75F005A424D5F8E5F034F5F977\r
+:1043DB0088828983E060E5A3E0FAA3E0FB74031213\r
+:1043EB00067EEAF0A3EBF088828983A3A3A3E0F512\r
+:1043FB000C750D007A0980011AEA602E75F005A480\r
+:10440B0024D5F8E5F034F5F988828983E060E9A3D7\r
+:10441B00E0FAA3E0FB740112067EEAF0A3EBF0884E\r
+:10442B00828983A3A3A3E0FE7F00750800750900B2\r
+:10443B007C007D007A008015E508250AF508E50962\r
+:10444B003400F509EC24010CED3400FD0AEAC394A9\r
+:10445B000A5033EA75F005A424D5F582E5F034F55E\r
+:10446B00F583E060E7E5822404F582E5833400F50B\r
+:10447B0083E0F50AE0A2E750BFA80AE50828F50893\r
+:10448B00E50934FF80BCA808A909ECFAEDFB12057D\r
+:10449B00B0880EC3E894E7E994FFA2D265D033400D\r
+:1044AB000EC3E8941AE99400A2D265D033400B9066\r
+:1044BB00F410E8F0A37420024585EEC3950CF8EFD9\r
+:1044CB00950DF9E875F0CCA4C8AAF075F00CA42AE8\r
+:1044DB00FA75F0CCE9A42AF9740112067EC082C0E9\r
+:1044EB0083740312067EE0FAA3E0FBD083D082E054\r
+:1044FB00C39AFEA3E09BFFE8C39EFAE99FFBC3EAC6\r
+:10450B009404EB94005036740F5AF990F410E4F0C5\r
+:10451B00A3E9F0C3E5099400A2D265D0335046C39A\r
+:10452B00E49508F8E49509F9ECFAEDFB1205B8E807\r
+:10453B00F404F890F410E048F0A3E08045EEC39843\r
+:10454B00F8EF99F9C3E89404E994005025740F58D7\r
+:10455B00F990F410E4F0A3E9F0C3E5099400A2D2BA\r
+:10456B0065D03340BAA808A909ECFAEDFB1205B8DF\r
+:10457B0080C190F410E4F0A37440F0E485108285C0\r
+:10458B001183F0851082851183E06401600302467C\r
+:10459B001EE490F5D4F0FA8029EA75F005A424D531\r
+:1045AB00F8E5F034F5F9E488828983F0A3F0A3F001\r
+:1045BB0088828983A3A3A3F088828983A3A3A3A35F\r
+:1045CB00F00AEAC3940A40D1E50E90DF08F01248D6\r
+:1045DB00997A007B40124971800B90DF3BE06401BC\r
+:1045EB00700375E10290F5D4E0700690F608E06078\r
+:1045FB00E975E10490F5D4E0601090F5D9E0FAC3C9\r
+:10460B0094FE500FEAC39403400990F410E4F0A316\r
+:10461B007410F0C2A8539AFEC2B975E40075E25546\r
+:10462B0012489974051206497F080206EAC082C037\r
+:10463B008374CA90DF00F074BA90DF01F0740A90B3\r
+:10464B00DF02F0E490DF03F090DF04F090DF05F081\r
+:10465B0090DF06F0741290DF07F0E490DF08F0743F\r
+:10466B002690DF09F0741990DF0AF0741190DF0BBC\r
+:10467B00F0743D90DF0CF0745590DF0DF0741590D5\r
+:10468B00DF0EF0741290DF0FF0741190DF10F074E6\r
+:10469B006090DF11F0740790DF12F0740290DF135B\r
+:1046AB00F0741890DF14F0741D90DF15F0741C90EB\r
+:1046BB00DF16F074C790DF17F0741090DF18F074EA\r
+:1046CB00B290DF19F074B690DF1AF0741090DF1B04\r
+:1046DB00F074EA90DF1CF0742A90DF1DF0E490DF99\r
+:1046EB001EF0741F90DF1FF0E490DF2FF090DF308F\r
+:1046FB00F090DF31F0743190DF24F090DF1CE04458\r
+:10470B0020F0745A90DF2EF075E10475E10190DF13\r
+:10471B003BE0640170F890DF1CE054CFF075E104CE\r
+:10472B00D083D0822274F112068AE5D990F5C9F0B4\r
+:10473B00740190F5D3F07890F9801DA2895019E59A\r
+:10474B00D9C0E0E024C9F582E434F5F583D0E0F07C\r
+:10475B0090F5D3E004F0C289E0C3940A5012E8FA52\r
+:10476B00E9FB74FF2A1874FF3BF9EA7001EB70CB7D\r
+:10477B00E0640A600302483875E104AAE28A828584\r
+:10478B008208E5E3F8E4C8F50990F60FE0FA75F056\r
+:10479B00BDA4CAACF075F02CA42CFB880A880B7452\r
+:1047AB000F78081204AD90FA21780C12052B7808BB\r
+:1047BB00790C120424E5082AF508E5093BF5097C78\r
+:1047CB00017B0180218B82A882E824C9F582E43425\r
+:1047DB00F5F583E0FAE82417F582E434FAF583E083\r
+:1047EB006A60027C000BEBC3940A40D9EC603E90EC\r
+:1047FB00F5D4E075F005A424D5F8E5F034F5F9749B\r
+:10480B000188828983F0A3E508F0A3E509F090F510\r
+:10481B00C9E088828983A3A3A3F090DF38E0888264\r
+:10482B008983A3A3A3A3F090F5D4E004F07F08023F\r
+:10483B0006EAC082C083E5E9FA539BFCE59BEAA23A\r
+:10484B00E7500575E1048014A2E6501075E1049061\r
+:10485B00DF3BE0640170F8E490F5D3F075E900D02C\r
+:10486B0083D08222C082C083C2A8539AFE74FF9069\r
+:10487B00DF06F074C090DF2EF0740190DF02F0754C\r
+:10488B00D95575E103D083D0822275E10422C08211\r
+:10489B00C083E490F607F090F608F090F609F0A3C9\r
+:1048AB00F090F60BF090F60CF0A3F090F60EF09063\r
+:1048BB00F60FF0D083D0822274F712068A7C009018\r
+:1048CB00F60BE0603E53E5BF75DBFF75DAFFE5DB0A\r
+:1048DB00F9E5DAF874FF68700374FF69601375DB30\r
+:1048EB00FF75DAFFE5DBF9E5DAF8EC0CC3940B4066\r
+:1048FB00E3E014F053E40FE5E443E54079017F0274\r
+:10490B000206EA90F60CC3E09406A3E09400405232\r
+:10491B0053E5BF90F60CE024FFA3E034FFF5DB90EA\r
+:10492B00F60CE014F5DAE5DBF9E5DAF8E024FFFA4A\r
+:10493B00A3E034FFFBEA687002EB696017EBF5DB71\r
+:10494B0090F60CE014F5DAE5DBF9E5DAF8EC0CC3DC\r
+:10495B00940B40D890F60CE4F0A3F0740190F60E93\r
+:10496B0080917900809874F112068A53E5BFE49028\r
+:10497B00F607F090F60B800AEA2443FAEB34D3FBEC\r
+:10498B00E004F0C3EA94BDEB942C50EC8A088B093D\r
+:10499B00750A00750B0090FA21780C12052B78081C\r
+:1049AB00790C1203A4740F780812049490F60CE59A\r
+:1049BB0008F0A3E509F01248C353E40FE5E443E51F\r
+:1049CB0040740190F607F07F080206EAC082C083AC\r
+:1049DB0090F609E0F8A3E0F9C3E89AE99B5009EADD\r
+:1049EB00C398F8EB99F9800CE86A7002E96B70EFE9\r
+:1049FB0078FF79FF90F609EAF0A3EBF0E8FAE9FB10\r
+:104A0B00124971D083D08222C082C083740190F688\r
+:104A1B0007F0D083D08222C082C083E490F607F0E7\r
+:104A2B00D083D08222C082C083E490F608F0D0837A\r
+:104A3B00D08222C082C08390F62CE0FA74226A7076\r
+:104A4B001A90F619E0703390F62DE0F8A3E0F99088\r
+:104A5B00F650E8F0A3E9F07402801B74206A70141E\r
+:104A6B0090F619E0701490F6267449F0A374F6F0E2\r
+:104A7B00A3E480E2740490F619F0D083D08222C0B4\r
+:104A8B0082C08390F62CE06421702090F619E070C0\r
+:104A9B002090F6267449F0A374F6F0A3E4F090F698\r
+:104AAB00297407F0A3E4F074018002740490F619E2\r
+:104ABB00F0D083D08222C082C083740490F619F0A8\r
+:104ACB00D083D08222C082C083740490F619F0D0B8\r
+:104ADB0083D08222C082C083740490F619F0D083F5\r
+:104AEB00D08222C082C083740490F619F0D083D098\r
+:104AFB0082222222C082C08390FA25E0F8A3E0F93B\r
+:104B0B0090F610E8F0A3E9F0D083D0822274F8126B\r
+:104B1B00068AE9FCEAFD7A007B00802190F610E022\r
+:104B2B00F8A3E0F5838882E493F890F610E028F878\r
+:104B3B00A3E03400F990F610E8F0A3E9F090F6103A\r
+:104B4B00E0F8A3E0F990FA27E0687003A3E069604E\r
+:104B5B004890F610E02401F8A3E03400F98882892C\r
+:104B6B0083E4936C702B90F610E0FAA3E0FB90F6C5\r
+:104B7B0010E0F8A3E0F5838882E493F890F610E058\r
+:104B8B0028F8A3E03400F990F610E8F0A3E9F080E0\r
+:104B9B0008E4936D7086ED60837F010206EA124A8A\r
+:104BAB00FF7A007901124B182274F712068AE9FE7C\r
+:104BBB00EAFF124AFF800E8A828B83A3A3A3A3A3CF\r
+:104BCB00E4936E60147A007902124B18EA7001EBD1\r
+:104BDB006007EE70E2EF1F70EC7F020206EA74F7DB\r
+:104BEB0012068AEAFEEBFF7A00124BB47A027904C2\r
+:104BFB00124B18EA7001EB60178A828B83A3A3E434\r
+:104C0B00936E70E88A828B83A3A3A3E4936F70DC0B\r
+:104C1B007F020206EA74F712068AE9FE124AFF7A4D\r
+:104C2B00007903124B18EE1E70F57F020206EAC0E4\r
+:104C3B0082C0837A007901124BB48A828B83A3A33F\r
+:104C4B00A3A3A3A3A3E493A2E6500474018001E4FD\r
+:104C5B0090F625F0E490F624F043BE80D2BDD083CD\r
+:104C6B00D08222C082C083740290F612F0E490F6D8\r
+:104C7B0013F090F619F07903124EF9752100752295\r
+:104C8B0000D083D0822274F512068A90DE0EE0FEED\r
+:104C9B00E4F090DE11E0FFA2E4501F7480F0740783\r
+:104CAB0090F619F0E5217002E522600985218285D5\r
+:104CBB002283120688E490F619F0EFA2E25009E481\r
+:104CCB0090DE11F090F619F090F619E0FA74026A82\r
+:104CDB006003024D6790DE16E0F50A90F626120788\r
+:104CEB00E6A90A7A207BDE124F3F74031206498530\r
+:104CFB000A0890F629C3E09508F0A3E09400F09021\r
+:104D0B00F626E0F9A3E0FAA3E0FBE9250AF9EA3479\r
+:104D1B0000FA90F626E9F0A3EAF0A3EBF090F6295F\r
+:104D2B00E07002A3E060047A4080027A48EA90DEE9\r
+:104D3B0011F090F629E07002A3E07016E5217002E5\r
+:104D4B00E5226009852182852283120688E490F68C\r
+:104D5B0019F0EE90DE0EF07F040206EA74066A701C\r
+:104D6B000985218285228312068890F619E060035B\r
+:104D7B00024E6AEFA2E04003024E6A75082B7509DA\r
+:104D8B00F6750A0078081207D179087A207BDE12B3\r
+:104D9B004F3F740312064975210075220090F62BC4\r
+:104DAB00E054E012084D000600C74D20434E402D45\r
+:104DBB004E80024EA04E4EC0384EFA4D90F62CE06F\r
+:104DCB0012084D000501EB4D03E64D05E14D09F0D1\r
+:104DDB004D0BF54DFA4D1252CC80711252C0806CB6\r
+:104DEB001252B480671256CF80621257F7805D74EF\r
+:104DFB000490F619F0805590F62CE012084D000443\r
+:104E0B0000194E061E4E08234E0A284EFA4D12501C\r
+:104E1B00CA80391253258034125686802F12579927\r
+:104E2B00802A7521C175224A124AC1801F7521D073\r
+:104E3B0075224A124AD0801475213E75224A124AB5\r
+:104E4B003E800975218A75224A124A8A90F619E02A\r
+:104E5B00640470047A6080027A40EA90DE11F0906C\r
+:104E6B00F619E0FA74016A70717F0290F629E0F886\r
+:104E7B00A3E0F9C3E89420E994005007E8F50A7F12\r
+:104E8B000A8003750A2090F6261207E6A90A7A20F3\r
+:104E9B007BDE124F797403120649850A0890F626B9\r
+:104EAB00E0F9A3E0FAA3E0FBE92508F9EA3400FAFC\r
+:104EBB0090F626E9F0A3EAF0A3EBF090F629C3E015\r
+:104ECB009508F0A3E09400F0EF90DE11F0E50AC333\r
+:104EDB0094204003024D5D024D4774056A60030246\r
+:104EEB004D5D852182852283120688024D5D74F704\r
+:104EFB0012068A7A008014E9C0E08A08E508241AB1\r
+:104F0B00F582E434F6F583D0E0F00AEAC394054069\r
+:104F1B00E67A008014E9C0E08A08E508241FF582D0\r
+:104F2B00E434F6F583D0E0F00AEAC3940540E67F5B\r
+:104F3B00020206EA74F612068AEAFCEBFDE9FE743D\r
+:104F4B000A12067EE0F508A3E0F509A3E0A908AA7A\r
+:104F5B0009FBEE60148C828D83E012038EE9240131\r
+:104F6B0009EA3400FA1EEE70EC7F030206EA74F6CF\r
+:104F7B0012068AEAFCEBFDE9FE740A12067EE0F5E6\r
+:104F8B0008A3E0F509A3E0A908AA09FBEE60141237\r
+:104F9B0003748C828D83F0E9240109EA3400FA1E34\r
+:104FAB00EE70EC7F030206EA74F712068A75230093\r
+:104FBB007524007525008A268B27EA90DE0BF08A74\r
+:104FCB00088B0974047808120611E50890DE07F0C7\r
+:104FDB008A088B0974097808120611E508543E906B\r
+:104FEB00DE09F0438C10758900C2C5758B00C2E8D1\r
+:104FFB00439A027F020206EAC0E074F1120722E52F\r
+:10500B00BEA2E650FA90DE06E0FAA2E25036A826DF\r
+:10501B00E890DE0BF08526088527097404780812C2\r
+:10502B000611E50890DE07F0852608852709740927\r
+:10503B007808120611E508543E90DE09F090DE0167\r
+:10504B00E0D2E0F07823EA46F608E6F690DE02E0DE\r
+:10505B00F508750900740478081206207823E50812\r
+:10506B0046F608E50946F690DE04E0F508750900FA\r
+:10507B00740978081206207823E6F608E50946F647\r
+:10508B00EAA2E0500375250174065A6003752500EA\r
+:10509B00124AFE758B00C2E87F02020781C0E074E2\r
+:1050AB00F2120722E5BEA2E650FAE589A2E7500507\r
+:1050BB00C2BD125921758900C2C57F0102078174D7\r
+:1050CB00F712068A90F62DE07002A3E0701E90F6A0\r
+:1050DB002FE0F8A3E0F974FF59FBE47001EB700CBF\r
+:1050EB0090F631E064027002A3E060057404025193\r
+:1050FB00BC90F62BE0120817800210510D513D5158\r
+:10510B004D51E86008740490F61902519B90F625F6\r
+:10511B00E0600478018002780090F633E8F0A3E4B5\r
+:10512B00F090F624E0606A90F633E04402F0A3E0DE\r
+:10513B00805E90F612E0640470CB90F633E4F0A33B\r
+:10514B00804EE8547FF50890F612E0640470B6E5E3\r
+:10515B0008C3940650AFE5082412F582E434F6F543\r
+:10516B0083E854806010A3A3A3A3A3A3A3E06403C9\r
+:10517B00701578018013E582240CF582E5833400E9\r
+:10518B00F583E0640360EB780090F633E8F0A3E47A\r
+:10519B00F090F619E06404601C90F6267433F0A3CB\r
+:1051AB0074F6F0A3E4F090F6297402F0A3E4F07423\r
+:1051BB000190F619F07F020206EA74F712068A9044\r
+:1051CB00F631E07002A3E0701290F612E064046016\r
+:1051DB001290F62FE07002A3E06008740490F619A9\r
+:1051EB000252AC90F62BE0541F1208170002E65146\r
+:1051FB0001520952235290F62DE0640160057900AB\r
+:10520B000252AFE990F624F060047905800279062A\r
+:10521B007A00124AFD0252AD90F62FE0547FFA90BD\r
+:10522B00F62DE070D9EAC3940650B0EA90DE0EF08A\r
+:10523B0090F62FE054806032E960047B1080027B93\r
+:10524B0040EB90DE11F0E960047B0380027B00EB06\r
+:10525B00C0E0EA2419F582E434F6F583D0E0F0E9F6\r
+:10526B0060047908803479078030E960047B208002\r
+:10527B00027B80EB90DE14F0E960047B0380027B01\r
+:10528B0000EBC0E0EA241EF582E434F6F583D0E0AF\r
+:10529B00F0E96004790A80027909124AFDE490DE94\r
+:1052AB000EF079017F020206EA79001251C5E9700E\r
+:1052BB0003124ADF2279011251C5E97003124AEE3B\r
+:1052CB0022C082C08390F62FE07002A3E070209082\r
+:1052DB00F631E07002A3E0701690F62DE0F8A3E033\r
+:1052EB00F9748058FA74FF59FBEA7001EB6007748C\r
+:1052FB000490F619801EE890DE00F090F62DE090F9\r
+:10530B00F6126009E06402700C74038007E064031A\r
+:10531B0070037402F0D083D0822274F512068A9047\r
+:10532B00F62DE0FAA3E01208170102D9533E53659C\r
+:10533B0053B053124BA990F626EAF0A3EBF0A374EB\r
+:10534B0080F090F626E0F9A3E0FAA3E0FB120374D9\r
+:10535B0090F629F0A3E4F00254AB7900124BB49011\r
+:10536B00F626EAF0A3EBF0A37480F090F626E0F9B2\r
+:10537B00A3E0FAA3E0FBE924020909EA3400FA12DC\r
+:10538B000374FC90F626E0F9A3E0FAA3E0FBE92412\r
+:10539B0003090909EA3400FA120374F9EC90F629AF\r
+:1053AB00F0A3E980B1EAF9124C2090F626EAF0A3BB\r
+:1053BB00EBF0A37480F090F626E0F9A3E0FAA3E0FB\r
+:1053CB00FB12037490F629F0A3E4F00254AB90F6B1\r
+:1053DB0026E4F0A3F0A3F0FC02547C7509007403DF\r
+:1053EB007808120620AE08AF09EA2EF8EB3FF990C9\r
+:1053FB00F62DE0F508A3E0F50988828983E493AAEA\r
+:10540B00096A706CA3E4936508706590F62FE0F55C\r
+:10541B0008A3E0F50988828983A3A3E493AA096A08\r
+:10542B00704E88828983A3A3A3E493650870418897\r
+:10543B00828983A3A3A3A3E493F508740193F509CD\r
+:10544B0090F626E508F0A3E509F0A37480F090FA36\r
+:10545B0029E02EFAA3E03F8A82F583A3A3A3A3A39B\r
+:10546B00A3E493F8740193F990F629E8F0A3E9F01B\r
+:10547B000C90FA29E0FAA3E0FB8C0890FA2BE0F8E9\r
+:10548B00A3E0F9E8C39AF50AE99BF50B7403780AD4\r
+:10549B00120611C3E508950AE4950B50030253E677\r
+:1054AB0090F626E0FCA3E0FDA3E0FEEC4D4E70066B\r
+:1054BB00740490F619F090F619E06404602590F6E8\r
+:1054CB0031E0FAA3E0FB90F629E0F8A3E0F9C3EA98\r
+:1054DB0098EB99500890F629EAF0A3EBF074019041\r
+:1054EB00F619F07F040206EA74F112068A74FE12B2\r
+:1054FB000633851082851183EAF0A3EBF0851082C9\r
+:10550B00851183E0F8A3E0F5838882A3A3A3A3E42A\r
+:10551B0093602B90FA2DE0FEA3E08007EE2404FEAF\r
+:10552B00EF3400FF8E828F83E493F8740193F98537\r
+:10553B001082851183E0687003A3E06970DE750843\r
+:10554B0000805A749090DE14F07410F08882898376\r
+:10555B00E493540364017003750940750A01750BDC\r
+:10556B0000E50C780A1206208E828F83A3A3A393E7\r
+:10557B00550A6006E509D2E0F509E50990DE15F05C\r
+:10558B00EA90DE13F0E4C0E0E50C241EF582E4346F\r
+:10559B00F6F583D0E0F0E490DE0EF005088510827E\r
+:1055AB00851183E0F8A3E0F5838882A3A3A3A3E48A\r
+:1055BB0093FAE508C39A400302567C7A00790512E8\r
+:1055CB004B188A0A8B0BAC0AAD0BEC7001ED60CB60\r
+:1055DB00EC2402F50EED3400F50F850E82F583E415\r
+:1055EB0093540FF50C90DE0EF07509008C828D83B1\r
+:1055FB00A3A3A3A3E4932407F50AA3E4933400F530\r
+:10560B000B7403780A120611AA0AEC2403F8ED3482\r
+:10561B0000F9850E82850F83E493A2E740030255C0\r
+:10562B004E744890DE11F07408F088828983E493FD\r
+:10563B00540364017003750940750A01750B00E58D\r
+:10564B000C780A1206208E828F83A3A393550A60CF\r
+:10565B0006E509D2E0F509E50990DE12F0EA90DEE5\r
+:10566B0010F0E4C0E0E50C2419F582E434F60255A1\r
+:10567B009C74021206497F080206EAC082C083901E\r
+:10568B00F62DE07002A3E0701690F62FE07002A3E7\r
+:10569B00E0700C90F631E064017002A3E0600474DA\r
+:1056AB0004801890F6267413F0A374F6F0A3E4F0BC\r
+:1056BB0090F6297401F0A3E4F0740190F619F0D080\r
+:1056CB0083D0822274F312068A90F612E064026091\r
+:1056DB001F90F62FE07002A3E0701590F631E0708A\r
+:1056EB0002A3E0700B90F62EE0F9E47001E960097B\r
+:1056FB00740490F619F00257947A007901124AFD5E\r
+:10570B0090F62DE0606E7A00F9124BB48A088B0983\r
+:10571B00EA7001EB6056740490F612F090F62DE0EF\r
+:10572B0090F613F0750A00850882850983A3A3A35D\r
+:10573B00A3E493FAE50AC39A5048850A0CE50C24B6\r
+:10574B0014FEE434F6FFE48E828F83F07A00790442\r
+:10575B00124B188A828B83A3A3A3E493FC8E828FB4\r
+:10576B0083E06C70E71254F3050A80BB740490F667\r
+:10577B0019F0800E90F613F0740390F612F0F912F4\r
+:10578B004EF97A007902124AFD7F060206EA74F698\r
+:10579B0012068A90F612E06404701E90F62BE064F9\r
+:1057AB0081701690F62DE07002A3E0700C90F6312C\r
+:1057BB00E064017002A3E060047404802690F62F6D\r
+:1057CB00E02414F508A3E034F6F50990F626E50875\r
+:1057DB00F0A3E509F0A3E4F090F6297401F0A3E43B\r
+:1057EB00F0740190F619F07F030206EA74F71206C3\r
+:1057FB008A90F612E06404701290F62BE06401704C\r
+:10580B000A90F631E07002A3E06008740490F61978\r
+:10581B00F0805890F62DE0FB90F62FE0FA90F613FF\r
+:10582B00E0F9124BE98A088B09A808A909E8FEE9F7\r
+:10583B00FFE87001E960D490F62FE0FA7903124A81\r
+:10584B00FD90F62DE0C0E090F62FE02414F8A3E0D5\r
+:10585B0034F6F988828983D0E0F0EEFAEFFB12542C\r
+:10586B00F390F62FE0FA7904124AFD7F020206EA62\r
+:10587B00C082C08390F645E07002A3E0600E90F604\r
+:10588B0045E0F8A3E0F5838882120688745390F6FE\r
+:10589B0035F074BE90F636F074FC90F637F0744326\r
+:1058AB0090F638F074BE90F639F0740190F63AF039\r
+:1058BB00747590F63BF0748790F63CF0740190F69B\r
+:1058CB003DF074E590F63EF0742590F63FF0747061\r
+:1058DB0090F640F074F390F641F0742290F642F09B\r
+:1058EB00758900C2C5D2BD90F6437435F0A374F62A\r
+:1058FB00F0758235F58312068890F647E07002A3A7\r
+:10590B00E0600E90F647E0F8A3E0F583888212067C\r
+:10591B0088D083D08222C082C083E490F63AF09084\r
+:10592B00F63BF090F63CF090F63DF0D083D082221F\r
+:10593B0074F512068A8A088B098C0A8D0BE490F693\r
+:10594B0075F090F676F090F677F090F649780812AD\r
+:10595B00053AE490F64DF090F64EF0740890F64F41\r
+:10596B00F090F650E4F0A3F0740190F652F0124C64\r
+:10597B003A7AFF7BFF124FB353F4FDD29143FE02F1\r
+:10598B00120A1F7F040206EAC082C0831259AB9031\r
+:10599B00F652E06006125A5A1259F6D083D0822280\r
+:1059AB00A823E85404600E782374FB56F60874FFA2\r
+:1059BB0056F6124C6EA823E85410600E782374EF41\r
+:1059CB0056F60874FF56F6124C91A823E8A2E05045\r
+:1059DB0019782374FE56F60874FF56F612587B7826\r
+:1059EB002374FD56F60874FF56F62274F612068AD7\r
+:1059FB00120A2290DE0EE090F678F0740490DE0E20\r
+:105A0B00F090DE11E0A2E0403690F677E060307562\r
+:105A1B0008537509F6750A0078081207D190F655E8\r
+:105A2B00E0F97A287BDE124F797403120649E49071\r
+:105A3B00F677F0740490DE0EF0740190DE11F090A6\r
+:105A4B00F678E090DE0EF0120A1F7F030206EA746E\r
+:105A5B00F612068A7E00120A2290DE0EE090F6788D\r
+:105A6B00F0740490DE0EF090DE14E0A2E04003022E\r
+:105A7B005B0990DE16E0FF90DE17E0742090FA31A0\r
+:105A8B00F090F675E0F8EF28F8E43400F9E894218B\r
+:105A9B00E994004002E4F0E02453F508E434F6F511\r
+:105AAB00098E0A78081207D1EFF97A287BDE124F9C\r
+:105ABB003F740312064990F675E02FF0740490DEE4\r
+:105ACB000EF0E490DE14F090F675E0C394024005FE\r
+:105ADB0090F655E0FE8E0874FF2508F874FF34002D\r
+:105AEB00F990F675E0FAC3E89AE99400A2D265D072\r
+:105AFB0033500BEEC394034005120C21E4F090F6E7\r
+:105B0B0078E090DE0EF0120A1F7F030206EAC082D5\r
+:105B1B00C08375910075E90075C6B874D390DF002A\r
+:105B2B00F0749190DF01F0741290DF07F0E490DFD6\r
+:105B3B0008F0742590DF09F0749590DF0AF0745526\r
+:105B4B0090DF0BF0741490DF06F0748B90DF2EF067\r
+:105B5B00741D90DF0CF0745590DF0DF0741390DF13\r
+:105B6B000EF0742390DF0FF0741190DF10F074635C\r
+:105B7B0090DF11F074B690DF1AF0741090DF1BF009\r
+:105B8B00741890DF14F0743C90DF13F0740790DFFF\r
+:105B9B0012F075A48775A36B75A2F8741D90DF15B1\r
+:105BAB00F0741C90DF16F074C790DF17F0E490DFF1\r
+:105BBB0018F074B090DF19F074EA90DF1CF0742ABF\r
+:105BCB0090DF1DF0E490DF1EF0741F90DF1FF07468\r
+:105BDB005990DF20F0748890DF23F0743190DF242C\r
+:105BEB00F0740990DF25F0747F90DF21F0748890BA\r
+:105BFB00DF22F0742990DF2FF0741E90DF30F074E9\r
+:105C0B001B90DF31F0740690DF03F0744590DF04D6\r
+:105C1B00F074CA90DF05F074FE90DF02F0D083D0F1\r
+:105C2B00822274F712068AE5E9FA90F979E06402A8\r
+:105C3B00600575E900804574505A6450702E53E925\r
+:105C4B00EF53E9BF539BFCE59B125D3E7508FF7557\r
+:105C5B00090078081207D57C007D007A787BF81252\r
+:105C6B006A877402120649125CC8801053E910E56A\r
+:105C7B00E9539BFCE59B740190F876F07F020206DA\r
+:105C8B00EAC082C083E9701190F871E4F0A3F09040\r
+:105C9B00F873F0A3F090F875F0D083D08222C08215\r
+:105CAB00C083E9701390F871E4F0A3F090F875F0ED\r
+:105CBB0090F873EAF0A3EBF0D083D0822274F71242\r
+:105CCB00068A74F890F97DF0747890F97EF074DFA1\r
+:105CDB0090F97BF074D990F97CF090F97FE054E067\r
+:105CEB004401F0E490F980F0748190F97FF0741224\r
+:105CFB0090F982F0741390F981F075D6817508FFD5\r
+:105D0B0075090078081207D57C007D007A787BF83E\r
+:105D1B00126A87740212064943D601539BFCE59B1A\r
+:105D2B0053E9EF740290F979F075E102439110FF9A\r
+:105D3B000206EAC082C0835391EF740190F979F0A7\r
+:105D4B0075E10490DF3BE0640170F875D68153D1A7\r
+:105D5B00FE539BFCE59B53E9EFD083D0822274F872\r
+:105D6B0012068AEAFEEBFF125D3E74DF90F97DF0BE\r
+:105D7B0074D990F97EF0EF90F97BF0EE90F97CF00E\r
+:105D8B0090F97FE054E04401F0E490F980F0742145\r
+:105D9B0090F97FF0744290F982F0741390F981F0CE\r
+:105DAB0043D601740490F979F075E103E5E9A2E4B7\r
+:105DBB0050FA53E9EF125D3E79017F010206EA7456\r
+:105DCB00F812068A790090F876E064016003025EAF\r
+:105DDB005FE4F090F879E0707B90F878E0247AF546\r
+:105DEB0082E434F8F583E0A2E750697E017D008000\r
+:105DFB00218D82AA82EA247CF582E434F8F583E0D3\r
+:105E0B00FCEA2435F582E434FAF583E06C60027E1B\r
+:105E1B00000DEDC3940440D9EE603990F87AE09010\r
+:105E2B00F97AF0E090FA3BF0740190FA3DF0FA7BCE\r
+:105E3B0000125CA990F875E060FA7900125C8CD2C4\r
+:105E4B009079047A3A7BFA125D69C29079017402F7\r
+:105E5B0090F67AF07F010206EAC082C08390F97A4D\r
+:105E6B00E090FA3FF090F877E090FA43F07AB87B45\r
+:105E7B00017900125CA990F773E06404600690F856\r
+:105E8B0075E060F290F773E06404600990F67AE0D5\r
+:105E9B00D2E5025F257900125C8CD29079067A3EAE\r
+:105EAB007BFA125D69C290125CC87AB87B017900EB\r
+:105EBB00125CA990F875E0700890F876E0640170B8\r
+:105ECB00F27900125C8C125D3E90F876E064017002\r
+:105EDB004A90F878E0247AF582E434F8F583E054BC\r
+:105EEB0080FBE490F876F090F879E064CA702C901F\r
+:105EFB00F87AE0FA90F97AE06A702090F87BE06427\r
+:105F0B00017018EB6015E490F877F0740190F98745\r
+:105F1B00F090F773F0740890F67BF0D083D0822268\r
+:105F2B00C082C08390F986E090F777F090F985E016\r
+:105F3B0090F778F090F97AE090F775F07AB87B01EA\r
+:105F4B007900125CA990F773E06404600690F87511\r
+:105F5B00E060F290F773E06404600990F67AE0D2A7\r
+:105F6B00E50260487900125C8CD29090F774E004E3\r
+:105F7B00F97A747BF7125D69C290125CC87AB87BB0\r
+:105F8B00017900125CA990F875E0700890F876E042\r
+:105F9B00640170F2125D3E7900125C8C90F876E031\r
+:105FAB006401600302604990F878E0247AF582E49A\r
+:105FBB0034F8F583E05480FBE490F876F090F879B0\r
+:105FCB00E064CA707990F87AE0FA90F97AE06A7036\r
+:105FDB006D90F87BE06401706590F87CE0FA90F9C5\r
+:105FEB0086E0547F6A705790F87DE0C0E090F985A9\r
+:105FFB00E0F8D0E0687047EB6044E490F877F090FD\r
+:10600B00F985E02401F0A3E03400F090F985E0F885\r
+:10601B00A3E0F9E875F064A4F8AAF075F064E9A4BC\r
+:10602B002AF990F983E0FAA3E0FB1205B8E890F99E\r
+:10603B0077F0740890F67BF0740190F773F0D083CF\r
+:10604B00D08222C082C08390F877E004F0E0C39442\r
+:10605B0006400D90F67AE0D2E5F0E0D2E2F080292E\r
+:10606B0090F987E07005125E64801E90F985C082FE\r
+:10607B00C08390F983E0F8A3E0F9D083D082C3E02A\r
+:10608B0098A3E0995003125F2BD083D08222C08259\r
+:10609B00C083E490F877F090F977F0740190F67A7A\r
+:1060AB00F090F67BF090F985E4F0A3F090F983F093\r
+:1060BB00A3F0740190F773F0E490F987F090F87601\r
+:1060CB00F0D083D08222C082C08374F9F5D575D409\r
+:1060DB007B12609974FC90F774F074CA90F776F0A9\r
+:1060EB00740190F67AF0C2A8439A01C290E490F63C\r
+:1060FB0079F090F977F0125D3E806090F985C0825F\r
+:10610B00C08390F983E0F8A3E0F9D083D082C3E099\r
+:10611B0098A3E099400690F987E0701712604E7AC9\r
+:10612B00017B007900125CA990F875E060FA7900A8\r
+:10613B00125C8C90F978E0701B90F985C082C0835B\r
+:10614B0090F983E0F8A3E0F9D083D082C3E098A361\r
+:10615B00E099400790F67AE0D2E5F090F679E0709E\r
+:10616B002A125CC8125DCAE964017017740290F6BA\r
+:10617B007AF090F679E004F0740490F67BF0125DFF\r
+:10618B003E800890F67AE0A2E550D990F67AE0A22C\r
+:10619B00E54003026106C2A8539AFE5391EF75E9DD\r
+:1061AB0000125D3EE490F679F07A2C7B01F9125CDB\r
+:1061BB00A990F875E060FA7900125C8CD083D082DC\r
+:1061CB0022C082C08374B290DF01F0743790DF007D\r
+:1061DB00F0740A90DF02F0740090DF03F07400900B\r
+:1061EB00DF04F0740090DF05F0740090DF06F074AC\r
+:1061FB001290DF07F0740090DF08F0742690DF092F\r
+:10620B00F0741990DF0AF0741190DF0BF0743D906D\r
+:10621B00DF0CF0745590DF0DF0741590DF0EF074F9\r
+:10622B001290DF0FF0741190DF10F0746090DF119B\r
+:10623B00F0740790DF12F0740090DF13F074189075\r
+:10624B00DF14F0741D90DF15F0741C90DF16F074E2\r
+:10625B00C790DF17F0741090DF18F074B290DF194D\r
+:10626B00F074B690DF1AF0741090DF1BF074EA90A4\r
+:10627B00DF1CF0742A90DF1DF0740090DF1EF074A9\r
+:10628B001F90DF1FF0740090DF2FF0740090DF3051\r
+:10629B00F0740090DF31F0743190DF24F075E1047D\r
+:1062AB0075E10190DF3BE0640170F8D083D082226E\r
+:1062BB00C082C08390DF1CE0442090DF1CF074C6CA\r
+:1062CB0090DF2EF075E10475E10190DF3BE0640196\r
+:1062DB0070F890DF1CE054CFF075E104D083D082CE\r
+:1062EB002274F712068AE990DF06F07A00EAC3946B\r
+:1062FB000A501E8A08750900E508249BF582E509FA\r
+:10630B0034F9F583E0C0E074282AF8D0E0F60A806F\r
+:10631B00DC753200D29074FE559AFA8A9AC2A8C2E2\r
+:10632B0089539BFCE59B75E900D2A87401459AFC47\r
+:10633B008C9A740090FA44F075E1037F020206EA2E\r
+:10634B00C082C083C290C2A874FE559AFA8A9A740E\r
+:10635B000190FA44F075E104D083D0822212634B92\r
+:10636B00227A007B0075320074282532F8E6F5D9C5\r
+:10637B000532E532C3940A502BEAF8EBF974012885\r
+:10638B00FA740039FBC3E89488E994135016A28978\r
+:10639B0050E074282532F8E6F5D90532C2897A0027\r
+:1063AB007B0080CEC3EA9488EB94134005C28975B9\r
+:1063BB00E9002274F812068AE5E9FEEEA2E7500224\r
+:1063CB007E00EEA2E45009740190FA44F012636867\r
+:1063DB0075E9007F010206EA74F512068A1261CC98\r
+:1063EB001262BB90F9B2780812052B90F98E7808DF\r
+:1063FB0012053A740090F992F07F040206EA74F7E2\r
+:10640B0012068A740090F99AF0740090F999F0745E\r
+:10641B000090F998F0E5E3F8E4C8F990F995E8F005\r
+:10642B00A3E9F085E20875090090F995E04508F0BD\r
+:10643B00A3E04509F090F995E024A4F0A3E0340023\r
+:10644B00F090F995E0FAA3E0FB1249D7124A137FBB\r
+:10645B00020206EAC082C083124A2212634B740006\r
+:10646B0090F99AF0D083D0822274F512068A8A08AA\r
+:10647B008B098C0A8D0B90F98A780812053A7F04E8\r
+:10648B000206EA74F512068AC0A8C2AF8A088B0905\r
+:10649B008C0A8D0B90F98E780812053AE990F992D7\r
+:1064AB00F0D0A87F040206EA74F512068A90F999D7\r
+:1064BB00E01208170102C9647565CE65426690F952\r
+:1064CB0093E02400F0A3E03470F01268BC90F99ACA\r
+:1064DB00E0D2E1F090FB51E0C39401A2D265D0333E\r
+:1064EB00502890FA45780812052B90F98E780812EF\r
+:1064FB00051890FB51E06488700990F99AE0D2E09E\r
+:10650B00F0800790F99AE0C2E0F012668C7400906C\r
+:10651B00F997F075080075090878081207D590F9F6\r
+:10652B008A780812052BAA08AB09AC0AAD0B90F9B7\r
+:10653B0098E0F912678874021206498A088B09A839\r
+:10654B0008A90990F993E0C398F8A3E099F990F999\r
+:10655B0088E8F0A3E9F090F988E0FAA3E0FB124990\r
+:10656B00D7740190F999F0026668742290F997F04C\r
+:10657B0075080075090278081207D590F98A780812\r
+:10658B0012052BAA08AB09AC0AAD0B90F998E0FEEB\r
+:10659B007480C39EF912678874021206498A088BAD\r
+:1065AB0009A808A90990F988E028F8A3E039F9743B\r
+:1065BB000028FA740239FB1249D7740290F999F04A\r
+:1065CB00026668740190F997F090F98A78081205C1\r
+:1065DB002BAA08AB0990F998E0F9126881E9FA90B7\r
+:1065EB00F997E02AF075088075091C78081207D511\r
+:1065FB0090F98A780812052BAA08AB09AC0AAD0BE7\r
+:10660B0090F998E0FE7440C39EF9126788740212E9\r
+:10661B0006498A088B09A808A90990F993E028F87C\r
+:10662B00A3E039F9740028FA740639FB1249D774C0\r
+:10663B000390F999F080261268BB90F99AE0C2E1B9\r
+:10664B00F090F998E02401F090F993E024B8FAA3C4\r
+:10665B00E03466FB1249D7740090F999F07F04027D\r
+:10666B0006EAC082C08390F99AE0A2E1500890F943\r
+:10667B0097E0F91262EC1264B3124A30D083D082E5\r
+:10668B002274F112068A90F99BC082C08390FA495A\r
+:10669B00780812052BD083D08278081204F290F977\r
+:1066AB008AC082C08390FA4D780C12052BD083D010\r
+:1066BB0082780C1204F27808790C12050590F99B7C\r
+:1066CB00780812053A90F99BC082C08390FA4D78F6\r
+:1066DB000C12052BD083D082780C1204F290F9980F\r
+:1066EB00E0F508E4F509F50AF50B741878081204BF\r
+:1066FB00AD780C790812050590F99B780C12053AC8\r
+:10670B0090F99F780812052B90F98E780C12052BB7\r
+:10671B0090F99F780C12053A90F992E090F9A3F05A\r
+:10672B007A9B7BF9126740E9FA74216A90F9A4F01D\r
+:10673B007F080206EA74F812068A79007D00EDC321\r
+:10674B00940950348A828B83E0FE7C00ECC394085E\r
+:10675B00501AE96EC394804008E9C3336497F980FB\r
+:10676B0004E9C333F9EEC333FE0C80E08A828B83DA\r
+:10677B00A3AA82AB830D80C67F010206EA74F112D5\r
+:10678B00068A74FE120633E9FF8A0C8B0D8C0E8D74\r
+:10679B000F7CFF7D7F851082851183E50CF0AE0D9C\r
+:1067AB00850C08850D09850E0A850F0B741078086A\r
+:1067BB00120494740112067EE508F08F0875090027\r
+:1067CB00E5082451F582E50934FAF583E0F88510E4\r
+:1067DB0082851183E0F508E50868F8E4C8F98F0AAB\r
+:1067EB00750B008E08750900E508650AF508E509C3\r
+:1067FB00650BF509E5082451F582E50934FAF583B3\r
+:10680B00E0F508750900E50828F8E50939F9851060\r
+:10681B0082851183E0F50AE4C50AF50B8E0875092C\r
+:10682B0000740112067EE0F582758300E58245084F\r
+:10683B00F508E5834509F509E508250AF508E50995\r
+:10684B00350BF509E50868F8E50969F9E8FAE9FB9C\r
+:10685B00741112067EC3E09AA3E09B500FEC5AFA18\r
+:10686B00ED5BFBEDC313FDEC13FC80E4740212062D\r
+:10687B00497F080206EA74F712068A89087509002F\r
+:10688B00EA79006508F8E96509F9E82451F582E928\r
+:10689B0034FAF583E0F8EB68541FF97F020206EA3D\r
+:1068AB0043FE01C2901268B4221263E31264092200\r
+:1068BB002274F112068A74FC12063390F9A8E024B4\r
+:1068CB0000F0A3E03470F090F9A8C3E09400A3E0CB\r
+:1068DB009480400C90F9A8E02400F0A3E03480F001\r
+:1068EB0090FB52E0FE90F9A5E0F50CE4F50DF50EEA\r
+:1068FB00F50F7410780C1204AD90F9A6E0F508A30F\r
+:10690B00E0F509E4F50AF50B780C79081204CC854F\r
+:10691B001082851183780C12053AEEF98510828569\r
+:10692B001183780812052BAA08AB09AC0AAD0B1220\r
+:10693B00648E74041206497F080206EA74F8120684\r
+:10694B008A740812067EE0F8A3E08015A3AA82AB36\r
+:10695B00838C828D83A3AC82AD83E824FF18E9344A\r
+:10696B00FFF9E87001E960248A828B83E0FE8C8258\r
+:10697B008D83E06E8A828B8360D2E0F88C828D836C\r
+:10698B00E0FAE8C39AFAE49400FB80047A007B00F7\r
+:10699B007F010206EA74F712068A740912067EE07A\r
+:1069AB00FEA3E0FFEAF8EBF980188C828D83E08878\r
+:1069BB00828983F0A3A882A9838C828D83A3AC8266\r
+:1069CB00AD838E088F0974FF25081E74FF3509FFF0\r
+:1069DB00E5087002E50970D27F020206EA74F7122D\r
+:1069EB00068A740912067EE0F8A3E0F9EAFEEBFFD3\r
+:1069FB008A088B09C3EA9CEB9D405EEC28F582ED7F\r
+:106A0B0039F583C3E5829508E5839509404BEA2860\r
+:106A1B00FAEB39FBAC82AD83126A767002E5096042\r
+:106A2B0041EC24FF1CED34FFFDEA24FF1AEB34FF8D\r
+:106A3B00FB8C828D83E08A828B83F080DB8C828D52\r
+:106A4B0083E08A828B83F08C828D83A3AC82AD83AF\r
+:106A5B008A828B83A3AA82AB83126A767002E509C2\r
+:106A6B0070DBEEFAEFFB7F020206EA8808890974F5\r
+:106A7B00FF25081874FF3509F9E5082274F812068A\r
+:106A8B008A740812067EE0F8A3E0F98A828B838071\r
+:106A9B0003ECF0A3E8FEE9FF74FF2E1874FF3FF937\r
+:0B6AAB00EE7001EF70EB7F010206EAC5\r
+:04000005000000E90E\r
+:00000001FF\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/.ccsproject b/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/.ccsproject
new file mode 100755 (executable)
index 0000000..fb1bc89
--- /dev/null
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>\r
+<?ccsproject version="1.0"?>\r
+\r
+<projectOptions>\r
+<deviceVariant value="CC430F6137"/>\r
+<deviceEndianness value="little"/>\r
+<codegenToolVersion value="3.2.1"/>\r
+<linkerCommandFile value="lnk_cc430f6137.cmd"/>\r
+<rts value="rts430x.lib"/>\r
+<defaultAssemblyOnly value="false"/>\r
+</projectOptions>\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/.cdtbuild b/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/.cdtbuild
new file mode 100755 (executable)
index 0000000..fcd4a32
--- /dev/null
@@ -0,0 +1,896 @@
+<?xml version="1.0" encoding="UTF-8"?>\r
+<?fileVersion 3.1.0?>\r
+\r
+<ManagedProjectBuildInfo>\r
+<project id="ez430_chronos_datalogger.com.ti.ccstudio.buildDefinitions.MSP430.ProjectType.504020644" name="MSP430" projectType="com.ti.ccstudio.buildDefinitions.MSP430.ProjectType">\r
+<configuration artifactExtension="out" artifactName="ez430_chronos_datalogger_433MHz" description="Other regions" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.513051802" name="433MHz - Limited CCS Core Edition" parent="com.ti.ccstudio.buildDefinitions.MSP430.Debug" postannouncebuildStep="Create flash image: TI-TXT" postbuildStep="&quot;${CG_TOOL_ROOT}/bin/hex${CG_TOOL_SUFFIX}.exe&quot; --ti_txt &quot;${BuildArtifactFileName}&quot; -o &quot;${BuildArtifactFileBaseName}.txt&quot; -order MS -romwidth 16">\r
+<toolChain id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.DebugToolchain.1192384239" name="TI Code Generation Tools" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.DebugToolchain" targetTool="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.799332705">\r
+<option id="com.ti.ccstudio.buildDefinitions.core.OPT_TAGS.886381890" superClass="com.ti.ccstudio.buildDefinitions.core.OPT_TAGS" valueType="stringList">\r
+<listOptionValue builtIn="false" value="DEVICE_CONFIGURATION_ID=CC430F6137"/>\r
+<listOptionValue builtIn="false" value="DEVICE_ENDIANNESS=little"/>\r
+<listOptionValue builtIn="false" value="OUTPUT_FORMAT=COFF"/>\r
+<listOptionValue builtIn="false" value="CCS_MBS_VERSION=4.2.0"/>\r
+<listOptionValue builtIn="false" value="LINKER_COMMAND_FILE=lnk_cc430f6137.cmd"/>\r
+<listOptionValue builtIn="false" value="RUNTIME_SUPPORT_LIBRARY=rts430x.lib"/>\r
+<listOptionValue builtIn="false" value="PROJECT_KIND=com.ti.ccstudio.managedbuild.core.ProjectKind_Executable"/>\r
+<listOptionValue builtIn="false" value="IS_ASSEMBLY_ONLY=false"/>\r
+<listOptionValue builtIn="false" value="OUTPUT_TYPE=executable"/>\r
+</option>\r
+<option id="com.ti.ccstudio.buildDefinitions.core.OPT_CODEGEN_VERSION.1810618931" superClass="com.ti.ccstudio.buildDefinitions.core.OPT_CODEGEN_VERSION" value="3.3.1" valueType="string"/>\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1297873105" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug">\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.DIAG_WARNING.813307786" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.DIAG_WARNING" valueType="stringList">\r
+<listOptionValue builtIn="false" value="225"/>\r
+</option>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.PRINTF_SUPPORT.2081359329" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.PRINTF_SUPPORT" value="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.PRINTF_SUPPORT.minimal" valueType="enumerated"/>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.SILICON_VERSION.1620747460" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.SILICON_VERSION" value="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.SILICON_VERSION.mspx" valueType="enumerated"/>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.OPT_LEVEL.1211385693" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.OPT_LEVEL" value="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.OPT_LEVEL.4" valueType="enumerated"/>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.OPT_FOR_SPEED.899322200" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.OPT_FOR_SPEED" value="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.OPT_FOR_SPEED.0" valueType="enumerated"/>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.DEFINE.1560769907" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.DEFINE" valueType="definedSymbols">\r
+<listOptionValue builtIn="false" value="__CCE__"/>\r
+<listOptionValue builtIn="false" value="ISM_LF"/>\r
+</option>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.INCLUDE_PATH.1947945126" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.INCLUDE_PATH" valueType="includePath">\r
+<listOptionValue builtIn="false" value="&quot;${CCS_INSTALL_ROOT}/msp430/include&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${CG_TOOL_ROOT}/include&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${CCE_INSTALL_ROOT}/msp430/include&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${workspace_loc:/ez430_chronos_datalogger}&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${workspace_loc:/ez430_chronos_datalogger/driver}&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${workspace_loc:/ez430_chronos_datalogger/include}&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${workspace_loc:/ez430_chronos_datalogger/logic}&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${workspace_loc:/ez430_chronos_datalogger/bluerobin}&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${workspace_loc:/ez430_chronos_datalogger/simpliciti}&quot;"/>\r
+</option>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.CALL_ASSUMPTIONS.1766085191" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.CALL_ASSUMPTIONS" value="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.CALL_ASSUMPTIONS.0" valueType="enumerated"/>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.AUTO_INLINE.1224769112" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.AUTO_INLINE" value="0" valueType="string"/>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.GEN_OPT_INFO.1575691689" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.GEN_OPT_INFO" value="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.GEN_OPT_INFO.2" valueType="enumerated"/>\r
+</tool>\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.799332705" name="MSP430 Linker" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug">\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.HEAP_SIZE.1531593839" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.HEAP_SIZE" value="80" valueType="string"/>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.STACK_SIZE.190437353" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.STACK_SIZE" value="80" valueType="string"/>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.USE_HW_MPY.1175846828" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.USE_HW_MPY" value="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.USE_HW_MPY.F5" valueType="enumerated"/>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.OUTPUT_FILE.1507467515" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.OUTPUT_FILE" value="&quot;ez430_chronos_datalogger_433MHz.out&quot;" valueType="string"/>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.MAP_FILE.885664508" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.MAP_FILE" value="&quot;ez430_chronos_datalogger_433MHz.map&quot;" valueType="string"/>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.generatedLinkerCommandFiles.228844973" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.generatedLinkerCommandFiles" valueType="libs">\r
+<listOptionValue builtIn="false" value="&quot;$(GEN_CMDS_QUOTED)&quot;"/>\r
+</option>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.SEARCH_PATH.1040715101" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.SEARCH_PATH" valueType="stringList">\r
+<listOptionValue builtIn="false" value="&quot;${CCS_INSTALL_ROOT}/msp430/include&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${CG_TOOL_ROOT}/lib&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${CG_TOOL_ROOT}/include&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${CCE_INSTALL_ROOT}/msp430/include&quot;"/>\r
+</option>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.LIBRARY.1246728560" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.LIBRARY" valueType="libs">\r
+<listOptionValue builtIn="false" value="&quot;rts430x.lib&quot;"/>\r
+</option>\r
+</tool>\r
+<macros expandEnvironmentMacros="true"/>\r
+</toolChain>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.513051802./ez430_chronos_datalogger/driver/adc12.c" name="adc12.c" rcbsApplicability="disable" resourcePath="/ez430_chronos_datalogger/driver/adc12.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1297873105./ez430_chronos_datalogger/driver/adc12.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1297873105./ez430_chronos_datalogger/driver/adc12.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1297873105"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.513051802./ez430_chronos_datalogger/driver/buzzer.c" name="buzzer.c" rcbsApplicability="disable" resourcePath="/ez430_chronos_datalogger/driver/buzzer.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1297873105./ez430_chronos_datalogger/driver/buzzer.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1297873105./ez430_chronos_datalogger/driver/buzzer.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1297873105"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.513051802./ez430_chronos_datalogger/driver/display.c" name="display.c" rcbsApplicability="disable" resourcePath="/ez430_chronos_datalogger/driver/display.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1297873105./ez430_chronos_datalogger/driver/display.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1297873105./ez430_chronos_datalogger/driver/display.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1297873105"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.513051802./ez430_chronos_datalogger/driver/flash.c" name="flash.c" rcbsApplicability="disable" resourcePath="/ez430_chronos_datalogger/driver/flash.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1297873105./ez430_chronos_datalogger/driver/flash.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1297873105./ez430_chronos_datalogger/driver/flash.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1297873105"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.513051802./ez430_chronos_datalogger/driver/pmm.c" name="pmm.c" rcbsApplicability="disable" resourcePath="/ez430_chronos_datalogger/driver/pmm.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1297873105./ez430_chronos_datalogger/driver/pmm.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1297873105./ez430_chronos_datalogger/driver/pmm.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1297873105"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="false" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.513051802./ez430_chronos_datalogger/driver/ports.c" name="ports.c" rcbsApplicability="disable" resourcePath="/ez430_chronos_datalogger/driver/ports.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1297873105./ez430_chronos_datalogger/driver/ports.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1297873105./ez430_chronos_datalogger/driver/ports.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1297873105"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="false" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.513051802./ez430_chronos_datalogger/driver/radio.c" name="radio.c" rcbsApplicability="disable" resourcePath="/ez430_chronos_datalogger/driver/radio.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1297873105./ez430_chronos_datalogger/driver/radio.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1297873105./ez430_chronos_datalogger/driver/radio.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1297873105"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="false" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.513051802./ez430_chronos_datalogger/driver/rf1a.c" name="rf1a.c" rcbsApplicability="disable" resourcePath="/ez430_chronos_datalogger/driver/rf1a.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1297873105./ez430_chronos_datalogger/driver/rf1a.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1297873105./ez430_chronos_datalogger/driver/rf1a.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1297873105"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.513051802./ez430_chronos_datalogger/driver/timer.c" name="timer.c" rcbsApplicability="disable" resourcePath="/ez430_chronos_datalogger/driver/timer.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1297873105./ez430_chronos_datalogger/driver/timer.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1297873105./ez430_chronos_datalogger/driver/timer.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1297873105"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.513051802./ez430_chronos_datalogger/driver/vti_as.c" name="vti_as.c" rcbsApplicability="disable" resourcePath="/ez430_chronos_datalogger/driver/vti_as.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1297873105./ez430_chronos_datalogger/driver/vti_as.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1297873105./ez430_chronos_datalogger/driver/vti_as.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1297873105"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.513051802./ez430_chronos_datalogger/driver/vti_ps.c" name="vti_ps.c" rcbsApplicability="disable" resourcePath="/ez430_chronos_datalogger/driver/vti_ps.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1297873105./ez430_chronos_datalogger/driver/vti_ps.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1297873105./ez430_chronos_datalogger/driver/vti_ps.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1297873105"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.513051802./ez430_chronos_datalogger/simpliciti/Components/bsp/boards/CC430EM/bsp_board.c" name="bsp_board.c" rcbsApplicability="disable" resourcePath="/ez430_chronos_datalogger/simpliciti/Components/bsp/boards/CC430EM/bsp_board.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1297873105./ez430_chronos_datalogger/simpliciti/Components/bsp/boards/CC430EM/bsp_board.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1297873105./ez430_chronos_datalogger/simpliciti/Components/bsp/boards/CC430EM/bsp_board.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1297873105"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.513051802./ez430_chronos_datalogger/simpliciti/Components/bsp/boards/CC430EM/bsp_drivers.c" name="bsp_drivers.c" rcbsApplicability="disable" resourcePath="/ez430_chronos_datalogger/simpliciti/Components/bsp/boards/CC430EM/bsp_drivers.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1297873105./ez430_chronos_datalogger/simpliciti/Components/bsp/boards/CC430EM/bsp_drivers.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1297873105./ez430_chronos_datalogger/simpliciti/Components/bsp/boards/CC430EM/bsp_drivers.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1297873105"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.513051802./ez430_chronos_datalogger/simpliciti/Components/bsp/drivers/code/bsp_buttons.c" name="bsp_buttons.c" rcbsApplicability="disable" resourcePath="/ez430_chronos_datalogger/simpliciti/Components/bsp/drivers/code/bsp_buttons.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1297873105./ez430_chronos_datalogger/simpliciti/Components/bsp/drivers/code/bsp_buttons.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1297873105./ez430_chronos_datalogger/simpliciti/Components/bsp/drivers/code/bsp_buttons.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1297873105"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.513051802./ez430_chronos_datalogger/simpliciti/Components/bsp/drivers/code/bsp_leds.c" name="bsp_leds.c" rcbsApplicability="disable" resourcePath="/ez430_chronos_datalogger/simpliciti/Components/bsp/drivers/code/bsp_leds.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1297873105./ez430_chronos_datalogger/simpliciti/Components/bsp/drivers/code/bsp_leds.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1297873105./ez430_chronos_datalogger/simpliciti/Components/bsp/drivers/code/bsp_leds.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1297873105"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.513051802./ez430_chronos_datalogger/simpliciti/Components/bsp/bsp.c" name="bsp.c" rcbsApplicability="disable" resourcePath="/ez430_chronos_datalogger/simpliciti/Components/bsp/bsp.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1297873105./ez430_chronos_datalogger/simpliciti/Components/bsp/bsp.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1297873105./ez430_chronos_datalogger/simpliciti/Components/bsp/bsp.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1297873105"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.513051802./ez430_chronos_datalogger/simpliciti/Components/mrfi/mrfi.c" name="mrfi.c" rcbsApplicability="disable" resourcePath="/ez430_chronos_datalogger/simpliciti/Components/mrfi/mrfi.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1297873105./ez430_chronos_datalogger/simpliciti/Components/mrfi/mrfi.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1297873105./ez430_chronos_datalogger/simpliciti/Components/mrfi/mrfi.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1297873105"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.513051802./ez430_chronos_datalogger/simpliciti/Components/mrfi/radios/family5/mrfi_radio_interface.c" name="mrfi_radio_interface.c" rcbsApplicability="disable" resourcePath="/ez430_chronos_datalogger/simpliciti/Components/mrfi/radios/family5/mrfi_radio_interface.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1297873105./ez430_chronos_datalogger/simpliciti/Components/mrfi/radios/family5/mrfi_radio_interface.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1297873105./ez430_chronos_datalogger/simpliciti/Components/mrfi/radios/family5/mrfi_radio_interface.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1297873105"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.513051802./ez430_chronos_datalogger/simpliciti/Components/mrfi/radios/family5/mrfi_radio.c" name="mrfi_radio.c" rcbsApplicability="disable" resourcePath="/ez430_chronos_datalogger/simpliciti/Components/mrfi/radios/family5/mrfi_radio.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1297873105./ez430_chronos_datalogger/simpliciti/Components/mrfi/radios/family5/mrfi_radio.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1297873105./ez430_chronos_datalogger/simpliciti/Components/mrfi/radios/family5/mrfi_radio.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1297873105"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.513051802./ez430_chronos_datalogger/simpliciti/Components/nwk/nwk_api.c" name="nwk_api.c" rcbsApplicability="disable" resourcePath="/ez430_chronos_datalogger/simpliciti/Components/nwk/nwk_api.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1297873105./ez430_chronos_datalogger/simpliciti/Components/nwk/nwk_api.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1297873105./ez430_chronos_datalogger/simpliciti/Components/nwk/nwk_api.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1297873105"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.513051802./ez430_chronos_datalogger/simpliciti/Components/nwk/nwk_frame.c" name="nwk_frame.c" rcbsApplicability="disable" resourcePath="/ez430_chronos_datalogger/simpliciti/Components/nwk/nwk_frame.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1297873105./ez430_chronos_datalogger/simpliciti/Components/nwk/nwk_frame.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1297873105./ez430_chronos_datalogger/simpliciti/Components/nwk/nwk_frame.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1297873105"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.513051802./ez430_chronos_datalogger/simpliciti/Components/nwk/nwk_globals.c" name="nwk_globals.c" rcbsApplicability="disable" resourcePath="/ez430_chronos_datalogger/simpliciti/Components/nwk/nwk_globals.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1297873105./ez430_chronos_datalogger/simpliciti/Components/nwk/nwk_globals.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1297873105./ez430_chronos_datalogger/simpliciti/Components/nwk/nwk_globals.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1297873105"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.513051802./ez430_chronos_datalogger/simpliciti/Components/nwk/nwk_QMgmt.c" name="nwk_QMgmt.c" rcbsApplicability="disable" resourcePath="/ez430_chronos_datalogger/simpliciti/Components/nwk/nwk_QMgmt.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1297873105./ez430_chronos_datalogger/simpliciti/Components/nwk/nwk_QMgmt.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1297873105./ez430_chronos_datalogger/simpliciti/Components/nwk/nwk_QMgmt.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1297873105"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.513051802./ez430_chronos_datalogger/simpliciti/Components/nwk/nwk.c" name="nwk.c" rcbsApplicability="disable" resourcePath="/ez430_chronos_datalogger/simpliciti/Components/nwk/nwk.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1297873105./ez430_chronos_datalogger/simpliciti/Components/nwk/nwk.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1297873105./ez430_chronos_datalogger/simpliciti/Components/nwk/nwk.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1297873105"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.513051802./ez430_chronos_datalogger/simpliciti/Components/nwk_applications/nwk_freq.c" name="nwk_freq.c" rcbsApplicability="disable" resourcePath="/ez430_chronos_datalogger/simpliciti/Components/nwk_applications/nwk_freq.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1297873105./ez430_chronos_datalogger/simpliciti/Components/nwk_applications/nwk_freq.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1297873105./ez430_chronos_datalogger/simpliciti/Components/nwk_applications/nwk_freq.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1297873105"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.513051802./ez430_chronos_datalogger/simpliciti/Components/nwk_applications/nwk_ioctl.c" name="nwk_ioctl.c" rcbsApplicability="disable" resourcePath="/ez430_chronos_datalogger/simpliciti/Components/nwk_applications/nwk_ioctl.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1297873105./ez430_chronos_datalogger/simpliciti/Components/nwk_applications/nwk_ioctl.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1297873105./ez430_chronos_datalogger/simpliciti/Components/nwk_applications/nwk_ioctl.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1297873105"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.513051802./ez430_chronos_datalogger/simpliciti/Components/nwk_applications/nwk_join.c" name="nwk_join.c" rcbsApplicability="disable" resourcePath="/ez430_chronos_datalogger/simpliciti/Components/nwk_applications/nwk_join.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1297873105./ez430_chronos_datalogger/simpliciti/Components/nwk_applications/nwk_join.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1297873105./ez430_chronos_datalogger/simpliciti/Components/nwk_applications/nwk_join.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1297873105"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.513051802./ez430_chronos_datalogger/simpliciti/Components/nwk_applications/nwk_link.c" name="nwk_link.c" rcbsApplicability="disable" resourcePath="/ez430_chronos_datalogger/simpliciti/Components/nwk_applications/nwk_link.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1297873105./ez430_chronos_datalogger/simpliciti/Components/nwk_applications/nwk_link.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1297873105./ez430_chronos_datalogger/simpliciti/Components/nwk_applications/nwk_link.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1297873105"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.513051802./ez430_chronos_datalogger/simpliciti/Components/nwk_applications/nwk_mgmt.c" name="nwk_mgmt.c" rcbsApplicability="disable" resourcePath="/ez430_chronos_datalogger/simpliciti/Components/nwk_applications/nwk_mgmt.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1297873105./ez430_chronos_datalogger/simpliciti/Components/nwk_applications/nwk_mgmt.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1297873105./ez430_chronos_datalogger/simpliciti/Components/nwk_applications/nwk_mgmt.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1297873105"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.513051802./ez430_chronos_datalogger/simpliciti/Components/nwk_applications/nwk_ping.c" name="nwk_ping.c" rcbsApplicability="disable" resourcePath="/ez430_chronos_datalogger/simpliciti/Components/nwk_applications/nwk_ping.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1297873105./ez430_chronos_datalogger/simpliciti/Components/nwk_applications/nwk_ping.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1297873105./ez430_chronos_datalogger/simpliciti/Components/nwk_applications/nwk_ping.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1297873105"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.513051802./ez430_chronos_datalogger/simpliciti/Components/nwk_applications/nwk_security.c" name="nwk_security.c" rcbsApplicability="disable" resourcePath="/ez430_chronos_datalogger/simpliciti/Components/nwk_applications/nwk_security.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1297873105./ez430_chronos_datalogger/simpliciti/Components/nwk_applications/nwk_security.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1297873105./ez430_chronos_datalogger/simpliciti/Components/nwk_applications/nwk_security.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1297873105"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.513051802./ez430_chronos_datalogger/simpliciti/Applications/application/End Device/main_ED_BM.c" name="main_ED_BM.c" rcbsApplicability="disable" resourcePath="/ez430_chronos_datalogger/simpliciti/Applications/application/End Device/main_ED_BM.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1297873105./ez430_chronos_datalogger/simpliciti/Applications/application/End Device/main_ED_BM.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1297873105./ez430_chronos_datalogger/simpliciti/Applications/application/End Device/main_ED_BM.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1297873105"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.513051802./ez430_chronos_datalogger/bluerobin/BlueRobin_RX_868MHz.lib" name="BlueRobin_RX_868MHz.lib" rcbsApplicability="disable" resourcePath="/ez430_chronos_datalogger/bluerobin/BlueRobin_RX_868MHz.lib" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.799332705./ez430_chronos_datalogger/bluerobin/BlueRobin_RX_868MHz.lib">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.799332705./ez430_chronos_datalogger/bluerobin/BlueRobin_RX_868MHz.lib" name="MSP430 Linker" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.799332705"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.513051802./ez430_chronos_datalogger/bluerobin/BlueRobin_RX_915MHz.lib" name="BlueRobin_RX_915MHz.lib" rcbsApplicability="disable" resourcePath="/ez430_chronos_datalogger/bluerobin/BlueRobin_RX_915MHz.lib" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.799332705./ez430_chronos_datalogger/bluerobin/BlueRobin_RX_915MHz.lib">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.799332705./ez430_chronos_datalogger/bluerobin/BlueRobin_RX_915MHz.lib" name="MSP430 Linker" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.799332705"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.513051802./ez430_chronos_datalogger/simpliciti/CC430_End_Device_868MHz.lib" name="CC430_End_Device_868MHz.lib" rcbsApplicability="disable" resourcePath="/ez430_chronos_datalogger/simpliciti/CC430_End_Device_868MHz.lib" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.799332705./ez430_chronos_datalogger/simpliciti/CC430_End_Device_868MHz.lib">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.799332705./ez430_chronos_datalogger/simpliciti/CC430_End_Device_868MHz.lib" name="MSP430 Linker" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.799332705"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.513051802./ez430_chronos_datalogger/simpliciti/CC430_End_Device_915MHz.lib" name="CC430_End_Device_915MHz.lib" rcbsApplicability="disable" resourcePath="/ez430_chronos_datalogger/simpliciti/CC430_End_Device_915MHz.lib" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.799332705./ez430_chronos_datalogger/simpliciti/CC430_End_Device_915MHz.lib">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.799332705./ez430_chronos_datalogger/simpliciti/CC430_End_Device_915MHz.lib" name="MSP430 Linker" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.799332705"/>\r
+</resourceConfiguration>\r
+</configuration>\r
+<configuration artifactExtension="out" artifactName="ez430_chronos_datalogger_433MHz" description="Other regions" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.434572269" name="433MHz - Unrestricted CCS Platinum" parent="com.ti.ccstudio.buildDefinitions.MSP430.Debug" postannouncebuildStep="Create flash image: TI-TXT" postbuildStep="&quot;${CG_TOOL_ROOT}/bin/hex${CG_TOOL_SUFFIX}.exe&quot; --ti_txt &quot;${BuildArtifactFileName}&quot; -o &quot;${BuildArtifactFileBaseName}.txt&quot; -order MS -romwidth 16">\r
+<toolChain id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.DebugToolchain.1246382473" name="TI Code Generation Tools" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.DebugToolchain" targetTool="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.1913351909">\r
+<option id="com.ti.ccstudio.buildDefinitions.core.OPT_TAGS.748306443" superClass="com.ti.ccstudio.buildDefinitions.core.OPT_TAGS" valueType="stringList">\r
+<listOptionValue builtIn="false" value="DEVICE_CONFIGURATION_ID=CC430F6137"/>\r
+<listOptionValue builtIn="false" value="DEVICE_ENDIANNESS=little"/>\r
+<listOptionValue builtIn="false" value="OUTPUT_FORMAT=COFF"/>\r
+<listOptionValue builtIn="false" value="CCS_MBS_VERSION=4.2.0"/>\r
+<listOptionValue builtIn="false" value="LINKER_COMMAND_FILE=lnk_cc430f6137.cmd"/>\r
+<listOptionValue builtIn="false" value="RUNTIME_SUPPORT_LIBRARY=rts430x.lib"/>\r
+<listOptionValue builtIn="false" value="PROJECT_KIND=com.ti.ccstudio.managedbuild.core.ProjectKind_Executable"/>\r
+<listOptionValue builtIn="false" value="IS_ASSEMBLY_ONLY=false"/>\r
+<listOptionValue builtIn="false" value="OUTPUT_TYPE=executable"/>\r
+</option>\r
+<option id="com.ti.ccstudio.buildDefinitions.core.OPT_CODEGEN_VERSION.1382935483" superClass="com.ti.ccstudio.buildDefinitions.core.OPT_CODEGEN_VERSION" value="3.3.1" valueType="string"/>\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.284641150" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug">\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.DIAG_WARNING.1736997496" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.DIAG_WARNING" valueType="stringList">\r
+<listOptionValue builtIn="false" value="225"/>\r
+</option>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.PRINTF_SUPPORT.1859848465" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.PRINTF_SUPPORT" value="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.PRINTF_SUPPORT.minimal" valueType="enumerated"/>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.SILICON_VERSION.660757785" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.SILICON_VERSION" value="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.SILICON_VERSION.mspx" valueType="enumerated"/>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.OPT_LEVEL.1305011996" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.OPT_LEVEL" value="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.OPT_LEVEL.4" valueType="enumerated"/>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.DEFINE.1946676974" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.DEFINE" valueType="definedSymbols">\r
+<listOptionValue builtIn="false" value="__CCE__"/>\r
+<listOptionValue builtIn="false" value="ISM_LF"/>\r
+<listOptionValue builtIn="false" value="MRFI_CC430"/>\r
+<listOptionValue builtIn="false" value="__CC430F6137__"/>\r
+</option>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.INCLUDE_PATH.654403382" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.INCLUDE_PATH" valueType="includePath">\r
+<listOptionValue builtIn="false" value="&quot;${CCS_INSTALL_ROOT}/msp430/include&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${CG_TOOL_ROOT}/include&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${CCE_INSTALL_ROOT}/msp430/include&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${workspace_loc:/ez430_chronos_datalogger}&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${workspace_loc:/ez430_chronos_datalogger/driver}&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${workspace_loc:/ez430_chronos_datalogger/include}&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${workspace_loc:/ez430_chronos_datalogger/logic}&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${workspace_loc:/ez430_chronos_datalogger/bluerobin}&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${workspace_loc:/ez430_chronos_datalogger/simpliciti}&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${workspace_loc:/ez430_chronos_datalogger/simpliciti/Applications/application/End Device}&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${workspace_loc:/ez430_chronos_datalogger/simpliciti/Components/bsp}&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${workspace_loc:/ez430_chronos_datalogger/simpliciti/Components/bsp/boards}&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${workspace_loc:/ez430_chronos_datalogger/simpliciti/Components/bsp/boards/CC430EM}&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${workspace_loc:/ez430_chronos_datalogger/simpliciti/Components/bsp/boards/CC430EM/bsp_external}&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${workspace_loc:/ez430_chronos_datalogger/simpliciti/Components/bsp/drivers}&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${workspace_loc:/ez430_chronos_datalogger/simpliciti/Components/bsp/drivers/code}&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${workspace_loc:/ez430_chronos_datalogger/simpliciti/Components/bsp/mcus}&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${workspace_loc:/ez430_chronos_datalogger/simpliciti/Components/mrfi}&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${workspace_loc:/ez430_chronos_datalogger/simpliciti/Components/mrfi/radios}&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${workspace_loc:/ez430_chronos_datalogger/simpliciti/Components/mrfi/radios/family5}&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${workspace_loc:/ez430_chronos_datalogger/simpliciti/Components/mrfi/smartrf}&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${workspace_loc:/ez430_chronos_datalogger/simpliciti/Components/nwk}&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${workspace_loc:/ez430_chronos_datalogger/simpliciti/Components/nwk_applications}&quot;"/>\r
+</option>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.CMD_FILE.979344750" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.CMD_FILE" valueType="stringList">\r
+<listOptionValue builtIn="false" value="&quot;${workspace_loc:/ez430_chronos_datalogger/simpliciti/Applications/configuration/smpl_nwk_config.dat}&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${workspace_loc:/ez430_chronos_datalogger/simpliciti/Applications/configuration/End Device/smpl_config.dat}&quot;"/>\r
+</option>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.OPT_FOR_SPEED.799316142" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.OPT_FOR_SPEED" value="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.OPT_FOR_SPEED.0" valueType="enumerated"/>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.CALL_ASSUMPTIONS.1083684682" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.CALL_ASSUMPTIONS" value="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.CALL_ASSUMPTIONS.0" valueType="enumerated"/>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.AUTO_INLINE.957081365" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.AUTO_INLINE" value="0" valueType="string"/>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.GEN_OPT_INFO.1782721314" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.GEN_OPT_INFO" value="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.GEN_OPT_INFO.2" valueType="enumerated"/>\r
+</tool>\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.1913351909" name="MSP430 Linker" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug">\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.HEAP_SIZE.1171359684" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.HEAP_SIZE" value="80" valueType="string"/>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.STACK_SIZE.1251951955" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.STACK_SIZE" value="80" valueType="string"/>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.USE_HW_MPY.1208958659" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.USE_HW_MPY" value="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.USE_HW_MPY.F5" valueType="enumerated"/>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.OUTPUT_FILE.1214215992" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.OUTPUT_FILE" value="&quot;ez430_chronos_datalogger_433MHz.out&quot;" valueType="string"/>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.MAP_FILE.2023171914" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.MAP_FILE" value="&quot;ez430_chronos_datalogger_433MHz.map&quot;" valueType="string"/>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.generatedLinkerCommandFiles.775637533" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.generatedLinkerCommandFiles" valueType="libs">\r
+<listOptionValue builtIn="false" value="&quot;$(GEN_CMDS_QUOTED)&quot;"/>\r
+</option>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.SEARCH_PATH.1295788403" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.SEARCH_PATH" valueType="stringList">\r
+<listOptionValue builtIn="false" value="&quot;${CCS_INSTALL_ROOT}/msp430/include&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${CG_TOOL_ROOT}/lib&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${CG_TOOL_ROOT}/include&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${CCE_INSTALL_ROOT}/msp430/include&quot;"/>\r
+</option>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.LIBRARY.1835619230" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.LIBRARY" valueType="libs">\r
+<listOptionValue builtIn="false" value="&quot;rts430x.lib&quot;"/>\r
+</option>\r
+</tool>\r
+<macros expandEnvironmentMacros="true"/>\r
+</toolChain>\r
+<resourceConfiguration exclude="false" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.434572269./ez430_chronos_datalogger/simpliciti/Components/bsp/boards/CC430EM/bsp_board.c" name="bsp_board.c" rcbsApplicability="disable" resourcePath="/ez430_chronos_datalogger/simpliciti/Components/bsp/boards/CC430EM/bsp_board.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.284641150./ez430_chronos_datalogger/simpliciti/Components/bsp/boards/CC430EM/bsp_board.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.284641150./ez430_chronos_datalogger/simpliciti/Components/bsp/boards/CC430EM/bsp_board.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.284641150"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.434572269./ez430_chronos_datalogger/simpliciti/Components/bsp/boards/CC430EM/bsp_drivers.c" name="bsp_drivers.c" rcbsApplicability="disable" resourcePath="/ez430_chronos_datalogger/simpliciti/Components/bsp/boards/CC430EM/bsp_drivers.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.284641150./ez430_chronos_datalogger/simpliciti/Components/bsp/boards/CC430EM/bsp_drivers.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.284641150./ez430_chronos_datalogger/simpliciti/Components/bsp/boards/CC430EM/bsp_drivers.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.284641150"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.434572269./ez430_chronos_datalogger/simpliciti/Components/bsp/drivers/code/bsp_buttons.c" name="bsp_buttons.c" rcbsApplicability="disable" resourcePath="/ez430_chronos_datalogger/simpliciti/Components/bsp/drivers/code/bsp_buttons.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.284641150./ez430_chronos_datalogger/simpliciti/Components/bsp/drivers/code/bsp_buttons.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.284641150./ez430_chronos_datalogger/simpliciti/Components/bsp/drivers/code/bsp_buttons.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.284641150"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.434572269./ez430_chronos_datalogger/simpliciti/Components/bsp/drivers/code/bsp_leds.c" name="bsp_leds.c" rcbsApplicability="disable" resourcePath="/ez430_chronos_datalogger/simpliciti/Components/bsp/drivers/code/bsp_leds.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.284641150./ez430_chronos_datalogger/simpliciti/Components/bsp/drivers/code/bsp_leds.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.284641150./ez430_chronos_datalogger/simpliciti/Components/bsp/drivers/code/bsp_leds.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.284641150"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.434572269./ez430_chronos_datalogger/simpliciti/Components/bsp/bsp.c" name="bsp.c" rcbsApplicability="disable" resourcePath="/ez430_chronos_datalogger/simpliciti/Components/bsp/bsp.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.284641150./ez430_chronos_datalogger/simpliciti/Components/bsp/bsp.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.284641150./ez430_chronos_datalogger/simpliciti/Components/bsp/bsp.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.284641150"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.434572269./ez430_chronos_datalogger/simpliciti/Components/mrfi/radios/family5/mrfi_radio_interface.c" name="mrfi_radio_interface.c" rcbsApplicability="disable" resourcePath="/ez430_chronos_datalogger/simpliciti/Components/mrfi/radios/family5/mrfi_radio_interface.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.284641150./ez430_chronos_datalogger/simpliciti/Components/mrfi/radios/family5/mrfi_radio_interface.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.284641150./ez430_chronos_datalogger/simpliciti/Components/mrfi/radios/family5/mrfi_radio_interface.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.284641150"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.434572269./ez430_chronos_datalogger/simpliciti/Components/mrfi/radios/family5/mrfi_radio.c" name="mrfi_radio.c" rcbsApplicability="disable" resourcePath="/ez430_chronos_datalogger/simpliciti/Components/mrfi/radios/family5/mrfi_radio.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.284641150./ez430_chronos_datalogger/simpliciti/Components/mrfi/radios/family5/mrfi_radio.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.284641150./ez430_chronos_datalogger/simpliciti/Components/mrfi/radios/family5/mrfi_radio.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.284641150"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.434572269./ez430_chronos_datalogger/bluerobin/BlueRobin_RX_868MHz.lib" name="BlueRobin_RX_868MHz.lib" rcbsApplicability="disable" resourcePath="/ez430_chronos_datalogger/bluerobin/BlueRobin_RX_868MHz.lib" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.1913351909./ez430_chronos_datalogger/bluerobin/BlueRobin_RX_868MHz.lib">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.1913351909./ez430_chronos_datalogger/bluerobin/BlueRobin_RX_868MHz.lib" name="MSP430 Linker" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.1913351909"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.434572269./ez430_chronos_datalogger/bluerobin/BlueRobin_RX_915MHz.lib" name="BlueRobin_RX_915MHz.lib" rcbsApplicability="disable" resourcePath="/ez430_chronos_datalogger/bluerobin/BlueRobin_RX_915MHz.lib" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.1913351909./ez430_chronos_datalogger/bluerobin/BlueRobin_RX_915MHz.lib">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.1913351909./ez430_chronos_datalogger/bluerobin/BlueRobin_RX_915MHz.lib" name="MSP430 Linker" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.1913351909"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.434572269./ez430_chronos_datalogger/simpliciti/CC430_End_Device_868MHz.lib" name="CC430_End_Device_868MHz.lib" rcbsApplicability="disable" resourcePath="/ez430_chronos_datalogger/simpliciti/CC430_End_Device_868MHz.lib" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.1913351909./ez430_chronos_datalogger/simpliciti/CC430_End_Device_868MHz.lib">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.1913351909./ez430_chronos_datalogger/simpliciti/CC430_End_Device_868MHz.lib" name="MSP430 Linker" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.1913351909"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.434572269./ez430_chronos_datalogger/simpliciti/CC430_End_Device_433MHz.lib" name="CC430_End_Device_433MHz.lib" rcbsApplicability="disable" resourcePath="/ez430_chronos_datalogger/simpliciti/CC430_End_Device_433MHz.lib" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.1913351909./ez430_chronos_datalogger/simpliciti/CC430_End_Device_433MHz.lib">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.1913351909./ez430_chronos_datalogger/simpliciti/CC430_End_Device_433MHz.lib" name="MSP430 Linker" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.1913351909"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.434572269./ez430_chronos_datalogger/simpliciti/CC430_End_Device_915MHz.lib" name="CC430_End_Device_915MHz.lib" rcbsApplicability="disable" resourcePath="/ez430_chronos_datalogger/simpliciti/CC430_End_Device_915MHz.lib" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.1913351909./ez430_chronos_datalogger/simpliciti/CC430_End_Device_915MHz.lib">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.1913351909./ez430_chronos_datalogger/simpliciti/CC430_End_Device_915MHz.lib" name="MSP430 Linker" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.1913351909"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.434572269./ez430_chronos_datalogger/driver/ez430_chronos_datalogger_drivers.lib" name="ez430_chronos_datalogger_drivers.lib" rcbsApplicability="disable" resourcePath="/ez430_chronos_datalogger/driver/ez430_chronos_datalogger_drivers.lib" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.1913351909./ez430_chronos_datalogger/driver/ez430_chronos_datalogger_drivers.lib">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.1913351909./ez430_chronos_datalogger/driver/ez430_chronos_datalogger_drivers.lib" name="MSP430 Linker" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.1913351909"/>\r
+</resourceConfiguration>\r
+</configuration>\r
+<configuration artifactExtension="out" artifactName="ez430_chronos_datalogger_868MHz" description="Europe" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.1976430675" name="868MHz - Unrestricted CCS Platinum" parent="com.ti.ccstudio.buildDefinitions.MSP430.Debug" postannouncebuildStep="Create flash image: TI-TXT" postbuildStep="&quot;${CG_TOOL_ROOT}/bin/hex${CG_TOOL_SUFFIX}.exe&quot; --ti_txt &quot;${BuildArtifactFileName}&quot; -o &quot;${BuildArtifactFileBaseName}.txt&quot; -order MS -romwidth 16">\r
+<toolChain id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.DebugToolchain.443792374" name="TI Code Generation Tools" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.DebugToolchain" targetTool="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.1274991031">\r
+<option id="com.ti.ccstudio.buildDefinitions.core.OPT_TAGS.393029308" superClass="com.ti.ccstudio.buildDefinitions.core.OPT_TAGS" valueType="stringList">\r
+<listOptionValue builtIn="false" value="DEVICE_CONFIGURATION_ID=CC430F6137"/>\r
+<listOptionValue builtIn="false" value="DEVICE_ENDIANNESS=little"/>\r
+<listOptionValue builtIn="false" value="OUTPUT_FORMAT=COFF"/>\r
+<listOptionValue builtIn="false" value="CCS_MBS_VERSION=4.2.0"/>\r
+<listOptionValue builtIn="false" value="LINKER_COMMAND_FILE=lnk_cc430f6137.cmd"/>\r
+<listOptionValue builtIn="false" value="RUNTIME_SUPPORT_LIBRARY=rts430x.lib"/>\r
+<listOptionValue builtIn="false" value="PROJECT_KIND=com.ti.ccstudio.managedbuild.core.ProjectKind_Executable"/>\r
+<listOptionValue builtIn="false" value="IS_ASSEMBLY_ONLY=false"/>\r
+<listOptionValue builtIn="false" value="OUTPUT_TYPE=executable"/>\r
+</option>\r
+<option id="com.ti.ccstudio.buildDefinitions.core.OPT_CODEGEN_VERSION.1099928950" superClass="com.ti.ccstudio.buildDefinitions.core.OPT_CODEGEN_VERSION" value="3.3.1" valueType="string"/>\r
+<tool command="&quot;${MSP430_CG_ROOT}/bin/cl430&quot;" id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1465636210" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug">\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.DIAG_WARNING.829625115" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.DIAG_WARNING" valueType="stringList">\r
+<listOptionValue builtIn="false" value="225"/>\r
+</option>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.PRINTF_SUPPORT.740548134" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.PRINTF_SUPPORT" value="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.PRINTF_SUPPORT.minimal" valueType="enumerated"/>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.SILICON_VERSION.637932400" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.SILICON_VERSION" value="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.SILICON_VERSION.mspx" valueType="enumerated"/>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.OPT_LEVEL.1430059682" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.OPT_LEVEL" value="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.OPT_LEVEL.4" valueType="enumerated"/>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.OPT_FOR_SPEED.312203804" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.OPT_FOR_SPEED" value="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.OPT_FOR_SPEED.0" valueType="enumerated"/>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.DEFINE.2027760431" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.DEFINE" valueType="definedSymbols">\r
+<listOptionValue builtIn="false" value="__CCE__"/>\r
+<listOptionValue builtIn="false" value="ISM_EU"/>\r
+<listOptionValue builtIn="false" value="MRFI_CC430"/>\r
+<listOptionValue builtIn="false" value="__CC430F6137__"/>\r
+</option>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.INCLUDE_PATH.793545393" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.INCLUDE_PATH" valueType="includePath">\r
+<listOptionValue builtIn="false" value="&quot;${CCS_INSTALL_ROOT}/msp430/include&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${CG_TOOL_ROOT}/include&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${CCE_INSTALL_ROOT}/msp430/include&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${workspace_loc:/ez430_chronos_datalogger}&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${workspace_loc:/ez430_chronos_datalogger/driver}&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${workspace_loc:/ez430_chronos_datalogger/include}&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${workspace_loc:/ez430_chronos_datalogger/logic}&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${workspace_loc:/ez430_chronos_datalogger/bluerobin}&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${workspace_loc:/ez430_chronos_datalogger/simpliciti}&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${workspace_loc:/ez430_chronos_datalogger/simpliciti/Applications/application/End Device}&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${workspace_loc:/ez430_chronos_datalogger/simpliciti/Components/bsp}&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${workspace_loc:/ez430_chronos_datalogger/simpliciti/Components/bsp/boards}&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${workspace_loc:/ez430_chronos_datalogger/simpliciti/Components/bsp/boards/CC430EM}&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${workspace_loc:/ez430_chronos_datalogger/simpliciti/Components/bsp/boards/CC430EM/bsp_external}&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${workspace_loc:/ez430_chronos_datalogger/simpliciti/Components/bsp/drivers}&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${workspace_loc:/ez430_chronos_datalogger/simpliciti/Components/bsp/drivers/code}&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${workspace_loc:/ez430_chronos_datalogger/simpliciti/Components/bsp/mcus}&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${workspace_loc:/ez430_chronos_datalogger/simpliciti/Components/mrfi}&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${workspace_loc:/ez430_chronos_datalogger/simpliciti/Components/mrfi/radios}&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${workspace_loc:/ez430_chronos_datalogger/simpliciti/Components/mrfi/radios/family5}&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${workspace_loc:/ez430_chronos_datalogger/simpliciti/Components/mrfi/smartrf}&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${workspace_loc:/ez430_chronos_datalogger/simpliciti/Components/nwk}&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${workspace_loc:/ez430_chronos_datalogger/simpliciti/Components/nwk_applications}&quot;"/>\r
+</option>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.AUTO_INLINE.75960874" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.AUTO_INLINE" value="0" valueType="string"/>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.CMD_FILE.857171654" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.CMD_FILE" valueType="stringList">\r
+<listOptionValue builtIn="false" value="&quot;${workspace_loc:/ez430_chronos_datalogger/simpliciti/Applications/configuration/smpl_nwk_config.dat}&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${workspace_loc:/ez430_chronos_datalogger/simpliciti/Applications/configuration/End Device/smpl_config.dat}&quot;"/>\r
+</option>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.CALL_ASSUMPTIONS.1230190561" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.CALL_ASSUMPTIONS" value="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.CALL_ASSUMPTIONS.0" valueType="enumerated"/>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.GEN_OPT_INFO.290872257" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.GEN_OPT_INFO" value="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.GEN_OPT_INFO.2" valueType="enumerated"/>\r
+</tool>\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.1274991031" name="MSP430 Linker" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug">\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.HEAP_SIZE.1677000183" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.HEAP_SIZE" value="80" valueType="string"/>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.STACK_SIZE.604006409" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.STACK_SIZE" value="80" valueType="string"/>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.USE_HW_MPY.2029721339" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.USE_HW_MPY" value="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.USE_HW_MPY.F5" valueType="enumerated"/>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.OUTPUT_FILE.2055937617" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.OUTPUT_FILE" value="&quot;ez430_chronos_datalogger_868MHz.out&quot;" valueType="string"/>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.MAP_FILE.1744358994" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.MAP_FILE" value="&quot;ez430_chronos_datalogger_868MHz.map&quot;" valueType="string"/>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.generatedLinkerCommandFiles.1396739390" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.generatedLinkerCommandFiles" valueType="libs">\r
+<listOptionValue builtIn="false" value="&quot;$(GEN_CMDS_QUOTED)&quot;"/>\r
+</option>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.SEARCH_PATH.890510496" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.SEARCH_PATH" valueType="stringList">\r
+<listOptionValue builtIn="false" value="&quot;${CCS_INSTALL_ROOT}/msp430/include&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${CG_TOOL_ROOT}/lib&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${CG_TOOL_ROOT}/include&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${CCE_INSTALL_ROOT}/msp430/include&quot;"/>\r
+</option>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.LIBRARY.1462390018" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.LIBRARY" valueType="libs">\r
+<listOptionValue builtIn="false" value="&quot;rts430x.lib&quot;"/>\r
+</option>\r
+</tool>\r
+<macros expandEnvironmentMacros="true"/>\r
+</toolChain>\r
+<resourceConfiguration exclude="false" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.1976430675./ez430_chronos_datalogger/simpliciti/Components/bsp/boards/CC430EM/bsp_board.c" name="bsp_board.c" rcbsApplicability="disable" resourcePath="/ez430_chronos_datalogger/simpliciti/Components/bsp/boards/CC430EM/bsp_board.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1465636210./ez430_chronos_datalogger/simpliciti/Components/bsp/boards/CC430EM/bsp_board.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1465636210./ez430_chronos_datalogger/simpliciti/Components/bsp/boards/CC430EM/bsp_board.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1465636210"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.1976430675./ez430_chronos_datalogger/simpliciti/Components/bsp/boards/CC430EM/bsp_drivers.c" name="bsp_drivers.c" rcbsApplicability="disable" resourcePath="/ez430_chronos_datalogger/simpliciti/Components/bsp/boards/CC430EM/bsp_drivers.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1465636210./ez430_chronos_datalogger/simpliciti/Components/bsp/boards/CC430EM/bsp_drivers.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1465636210./ez430_chronos_datalogger/simpliciti/Components/bsp/boards/CC430EM/bsp_drivers.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1465636210"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.1976430675./ez430_chronos_datalogger/simpliciti/Components/bsp/drivers/code/bsp_buttons.c" name="bsp_buttons.c" rcbsApplicability="disable" resourcePath="/ez430_chronos_datalogger/simpliciti/Components/bsp/drivers/code/bsp_buttons.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1465636210./ez430_chronos_datalogger/simpliciti/Components/bsp/drivers/code/bsp_buttons.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1465636210./ez430_chronos_datalogger/simpliciti/Components/bsp/drivers/code/bsp_buttons.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1465636210"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.1976430675./ez430_chronos_datalogger/simpliciti/Components/bsp/drivers/code/bsp_leds.c" name="bsp_leds.c" rcbsApplicability="disable" resourcePath="/ez430_chronos_datalogger/simpliciti/Components/bsp/drivers/code/bsp_leds.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1465636210./ez430_chronos_datalogger/simpliciti/Components/bsp/drivers/code/bsp_leds.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1465636210./ez430_chronos_datalogger/simpliciti/Components/bsp/drivers/code/bsp_leds.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1465636210"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.1976430675./ez430_chronos_datalogger/simpliciti/Components/bsp/bsp.c" name="bsp.c" rcbsApplicability="disable" resourcePath="/ez430_chronos_datalogger/simpliciti/Components/bsp/bsp.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1465636210./ez430_chronos_datalogger/simpliciti/Components/bsp/bsp.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1465636210./ez430_chronos_datalogger/simpliciti/Components/bsp/bsp.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1465636210"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.1976430675./ez430_chronos_datalogger/simpliciti/Components/mrfi/radios/family5/mrfi_radio_interface.c" name="mrfi_radio_interface.c" rcbsApplicability="disable" resourcePath="/ez430_chronos_datalogger/simpliciti/Components/mrfi/radios/family5/mrfi_radio_interface.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1465636210./ez430_chronos_datalogger/simpliciti/Components/mrfi/radios/family5/mrfi_radio_interface.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1465636210./ez430_chronos_datalogger/simpliciti/Components/mrfi/radios/family5/mrfi_radio_interface.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1465636210"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.1976430675./ez430_chronos_datalogger/simpliciti/Components/mrfi/radios/family5/mrfi_radio.c" name="mrfi_radio.c" rcbsApplicability="disable" resourcePath="/ez430_chronos_datalogger/simpliciti/Components/mrfi/radios/family5/mrfi_radio.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1465636210./ez430_chronos_datalogger/simpliciti/Components/mrfi/radios/family5/mrfi_radio.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1465636210./ez430_chronos_datalogger/simpliciti/Components/mrfi/radios/family5/mrfi_radio.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1465636210"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.1976430675./ez430_chronos_datalogger/bluerobin/BlueRobin_RX_433MHz.lib" name="BlueRobin_RX_433MHz.lib" rcbsApplicability="disable" resourcePath="/ez430_chronos_datalogger/bluerobin/BlueRobin_RX_433MHz.lib" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.1274991031./ez430_chronos_datalogger/bluerobin/BlueRobin_RX_433MHz.lib">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.1274991031./ez430_chronos_datalogger/bluerobin/BlueRobin_RX_433MHz.lib" name="MSP430 Linker" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.1274991031"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.1976430675./ez430_chronos_datalogger/bluerobin/BlueRobin_RX_915MHz.lib" name="BlueRobin_RX_915MHz.lib" rcbsApplicability="disable" resourcePath="/ez430_chronos_datalogger/bluerobin/BlueRobin_RX_915MHz.lib" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.1274991031./ez430_chronos_datalogger/bluerobin/BlueRobin_RX_915MHz.lib">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.1274991031./ez430_chronos_datalogger/bluerobin/BlueRobin_RX_915MHz.lib" name="MSP430 Linker" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.1274991031"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.1976430675./ez430_chronos_datalogger/simpliciti/CC430_End_Device_868MHz.lib" name="CC430_End_Device_868MHz.lib" rcbsApplicability="disable" resourcePath="/ez430_chronos_datalogger/simpliciti/CC430_End_Device_868MHz.lib" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.1274991031./ez430_chronos_datalogger/simpliciti/CC430_End_Device_868MHz.lib">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.1274991031./ez430_chronos_datalogger/simpliciti/CC430_End_Device_868MHz.lib" name="MSP430 Linker" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.1274991031"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.1976430675./ez430_chronos_datalogger/simpliciti/CC430_End_Device_433MHz.lib" name="CC430_End_Device_433MHz.lib" rcbsApplicability="disable" resourcePath="/ez430_chronos_datalogger/simpliciti/CC430_End_Device_433MHz.lib" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.1274991031./ez430_chronos_datalogger/simpliciti/CC430_End_Device_433MHz.lib">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.1274991031./ez430_chronos_datalogger/simpliciti/CC430_End_Device_433MHz.lib" name="MSP430 Linker" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.1274991031"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.1976430675./ez430_chronos_datalogger/simpliciti/CC430_End_Device_915MHz.lib" name="CC430_End_Device_915MHz.lib" rcbsApplicability="disable" resourcePath="/ez430_chronos_datalogger/simpliciti/CC430_End_Device_915MHz.lib" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.1274991031./ez430_chronos_datalogger/simpliciti/CC430_End_Device_915MHz.lib">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.1274991031./ez430_chronos_datalogger/simpliciti/CC430_End_Device_915MHz.lib" name="MSP430 Linker" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.1274991031"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.1976430675./ez430_chronos_datalogger/driver/ez430_chronos_datalogger_drivers.lib" name="ez430_chronos_datalogger_drivers.lib" rcbsApplicability="disable" resourcePath="/ez430_chronos_datalogger/driver/ez430_chronos_datalogger_drivers.lib" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.1274991031./ez430_chronos_datalogger/driver/ez430_chronos_datalogger_drivers.lib">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.1274991031./ez430_chronos_datalogger/driver/ez430_chronos_datalogger_drivers.lib" name="MSP430 Linker" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.1274991031"/>\r
+</resourceConfiguration>\r
+</configuration>\r
+<configuration artifactExtension="out" artifactName="ez430_chronos_datalogger_915MHz" description="USA" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.1079752688" name="915MHz - Unrestricted CCS Platinum" parent="com.ti.ccstudio.buildDefinitions.MSP430.Debug" postannouncebuildStep="Create flash image: TI-TXT" postbuildStep="&quot;${CG_TOOL_ROOT}/bin/hex${CG_TOOL_SUFFIX}.exe&quot; --ti_txt &quot;${BuildArtifactFileName}&quot; -o &quot;${BuildArtifactFileBaseName}.txt&quot; -order MS -romwidth 16">\r
+<toolChain id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.DebugToolchain.1486047326" name="TI Code Generation Tools" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.DebugToolchain" targetTool="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.819223922">\r
+<option id="com.ti.ccstudio.buildDefinitions.core.OPT_TAGS.1977902208" superClass="com.ti.ccstudio.buildDefinitions.core.OPT_TAGS" valueType="stringList">\r
+<listOptionValue builtIn="false" value="DEVICE_CONFIGURATION_ID=CC430F6137"/>\r
+<listOptionValue builtIn="false" value="DEVICE_ENDIANNESS=little"/>\r
+<listOptionValue builtIn="false" value="OUTPUT_FORMAT=COFF"/>\r
+<listOptionValue builtIn="false" value="CCS_MBS_VERSION=4.2.0"/>\r
+<listOptionValue builtIn="false" value="LINKER_COMMAND_FILE=lnk_cc430f6137.cmd"/>\r
+<listOptionValue builtIn="false" value="RUNTIME_SUPPORT_LIBRARY=rts430x.lib"/>\r
+<listOptionValue builtIn="false" value="PROJECT_KIND=com.ti.ccstudio.managedbuild.core.ProjectKind_Executable"/>\r
+<listOptionValue builtIn="false" value="IS_ASSEMBLY_ONLY=false"/>\r
+<listOptionValue builtIn="false" value="OUTPUT_TYPE=executable"/>\r
+</option>\r
+<option id="com.ti.ccstudio.buildDefinitions.core.OPT_CODEGEN_VERSION.1510767541" superClass="com.ti.ccstudio.buildDefinitions.core.OPT_CODEGEN_VERSION" value="3.3.1" valueType="string"/>\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.485349075" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug">\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.DIAG_WARNING.1462417051" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.DIAG_WARNING" valueType="stringList">\r
+<listOptionValue builtIn="false" value="225"/>\r
+</option>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.PRINTF_SUPPORT.401551293" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.PRINTF_SUPPORT" value="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.PRINTF_SUPPORT.minimal" valueType="enumerated"/>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.SILICON_VERSION.1430035225" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.SILICON_VERSION" value="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.SILICON_VERSION.mspx" valueType="enumerated"/>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.OPT_LEVEL.1400432698" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.OPT_LEVEL" value="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.OPT_LEVEL.4" valueType="enumerated"/>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.DEFINE.788971395" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.DEFINE" valueType="definedSymbols">\r
+<listOptionValue builtIn="false" value="__CCE__"/>\r
+<listOptionValue builtIn="false" value="ISM_US"/>\r
+<listOptionValue builtIn="false" value="MRFI_CC430"/>\r
+<listOptionValue builtIn="false" value="__CC430F6137__"/>\r
+</option>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.INCLUDE_PATH.684842621" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.INCLUDE_PATH" valueType="includePath">\r
+<listOptionValue builtIn="false" value="&quot;${CCS_INSTALL_ROOT}/msp430/include&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${CG_TOOL_ROOT}/include&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${CCE_INSTALL_ROOT}/msp430/include&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${workspace_loc:/ez430_chronos_datalogger}&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${workspace_loc:/ez430_chronos_datalogger/driver}&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${workspace_loc:/ez430_chronos_datalogger/include}&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${workspace_loc:/ez430_chronos_datalogger/logic}&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${workspace_loc:/ez430_chronos_datalogger/bluerobin}&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${workspace_loc:/ez430_chronos_datalogger/simpliciti}&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${workspace_loc:/ez430_chronos_datalogger/simpliciti/Applications/application/End Device}&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${workspace_loc:/ez430_chronos_datalogger/simpliciti/Components/bsp}&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${workspace_loc:/ez430_chronos_datalogger/simpliciti/Components/bsp/boards}&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${workspace_loc:/ez430_chronos_datalogger/simpliciti/Components/bsp/boards/CC430EM}&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${workspace_loc:/ez430_chronos_datalogger/simpliciti/Components/bsp/boards/CC430EM/bsp_external}&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${workspace_loc:/ez430_chronos_datalogger/simpliciti/Components/bsp/drivers}&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${workspace_loc:/ez430_chronos_datalogger/simpliciti/Components/bsp/drivers/code}&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${workspace_loc:/ez430_chronos_datalogger/simpliciti/Components/bsp/mcus}&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${workspace_loc:/ez430_chronos_datalogger/simpliciti/Components/mrfi}&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${workspace_loc:/ez430_chronos_datalogger/simpliciti/Components/mrfi/radios}&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${workspace_loc:/ez430_chronos_datalogger/simpliciti/Components/mrfi/radios/family5}&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${workspace_loc:/ez430_chronos_datalogger/simpliciti/Components/mrfi/smartrf}&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${workspace_loc:/ez430_chronos_datalogger/simpliciti/Components/nwk}&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${workspace_loc:/ez430_chronos_datalogger/simpliciti/Components/nwk_applications}&quot;"/>\r
+</option>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.CMD_FILE.1328184866" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.CMD_FILE" valueType="stringList">\r
+<listOptionValue builtIn="false" value="&quot;${workspace_loc:/ez430_chronos_datalogger/simpliciti/Applications/configuration/smpl_nwk_config.dat}&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${workspace_loc:/ez430_chronos_datalogger/simpliciti/Applications/configuration/End Device/smpl_config.dat}&quot;"/>\r
+</option>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.OPT_FOR_SPEED.381435002" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.OPT_FOR_SPEED" value="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.OPT_FOR_SPEED.0" valueType="enumerated"/>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.CALL_ASSUMPTIONS.1322033113" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.CALL_ASSUMPTIONS" value="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.CALL_ASSUMPTIONS.0" valueType="enumerated"/>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.AUTO_INLINE.282490373" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.AUTO_INLINE" value="0" valueType="string"/>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.GEN_OPT_INFO.1278281987" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.GEN_OPT_INFO" value="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.GEN_OPT_INFO.2" valueType="enumerated"/>\r
+</tool>\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.819223922" name="MSP430 Linker" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug">\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.HEAP_SIZE.364173622" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.HEAP_SIZE" value="80" valueType="string"/>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.STACK_SIZE.797171465" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.STACK_SIZE" value="80" valueType="string"/>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.USE_HW_MPY.11455634" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.USE_HW_MPY" value="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.USE_HW_MPY.F5" valueType="enumerated"/>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.OUTPUT_FILE.1549716517" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.OUTPUT_FILE" value="&quot;ez430_chronos_datalogger_915MHz.out&quot;" valueType="string"/>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.MAP_FILE.781423945" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.MAP_FILE" value="&quot;ez430_chronos_datalogger_915MHz.map&quot;" valueType="string"/>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.generatedLinkerCommandFiles.1042341227" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.generatedLinkerCommandFiles" valueType="libs">\r
+<listOptionValue builtIn="false" value="&quot;$(GEN_CMDS_QUOTED)&quot;"/>\r
+</option>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.SEARCH_PATH.1331679242" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.SEARCH_PATH" valueType="stringList">\r
+<listOptionValue builtIn="false" value="&quot;${CCS_INSTALL_ROOT}/msp430/include&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${CG_TOOL_ROOT}/lib&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${CG_TOOL_ROOT}/include&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${CCE_INSTALL_ROOT}/msp430/include&quot;"/>\r
+</option>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.LIBRARY.2059180716" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.LIBRARY" valueType="libs">\r
+<listOptionValue builtIn="false" value="&quot;rts430x.lib&quot;"/>\r
+</option>\r
+</tool>\r
+<macros expandEnvironmentMacros="true"/>\r
+</toolChain>\r
+<resourceConfiguration exclude="false" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.1079752688./ez430_chronos_datalogger/simpliciti/Components/bsp/boards/CC430EM/bsp_board.c" name="bsp_board.c" rcbsApplicability="disable" resourcePath="/ez430_chronos_datalogger/simpliciti/Components/bsp/boards/CC430EM/bsp_board.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.485349075./ez430_chronos_datalogger/simpliciti/Components/bsp/boards/CC430EM/bsp_board.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.485349075./ez430_chronos_datalogger/simpliciti/Components/bsp/boards/CC430EM/bsp_board.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.485349075"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.1079752688./ez430_chronos_datalogger/simpliciti/Components/bsp/boards/CC430EM/bsp_drivers.c" name="bsp_drivers.c" rcbsApplicability="disable" resourcePath="/ez430_chronos_datalogger/simpliciti/Components/bsp/boards/CC430EM/bsp_drivers.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.485349075./ez430_chronos_datalogger/simpliciti/Components/bsp/boards/CC430EM/bsp_drivers.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.485349075./ez430_chronos_datalogger/simpliciti/Components/bsp/boards/CC430EM/bsp_drivers.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.485349075"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.1079752688./ez430_chronos_datalogger/simpliciti/Components/bsp/drivers/code/bsp_buttons.c" name="bsp_buttons.c" rcbsApplicability="disable" resourcePath="/ez430_chronos_datalogger/simpliciti/Components/bsp/drivers/code/bsp_buttons.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.485349075./ez430_chronos_datalogger/simpliciti/Components/bsp/drivers/code/bsp_buttons.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.485349075./ez430_chronos_datalogger/simpliciti/Components/bsp/drivers/code/bsp_buttons.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.485349075"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.1079752688./ez430_chronos_datalogger/simpliciti/Components/bsp/drivers/code/bsp_leds.c" name="bsp_leds.c" rcbsApplicability="disable" resourcePath="/ez430_chronos_datalogger/simpliciti/Components/bsp/drivers/code/bsp_leds.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.485349075./ez430_chronos_datalogger/simpliciti/Components/bsp/drivers/code/bsp_leds.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.485349075./ez430_chronos_datalogger/simpliciti/Components/bsp/drivers/code/bsp_leds.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.485349075"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.1079752688./ez430_chronos_datalogger/simpliciti/Components/bsp/bsp.c" name="bsp.c" rcbsApplicability="disable" resourcePath="/ez430_chronos_datalogger/simpliciti/Components/bsp/bsp.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.485349075./ez430_chronos_datalogger/simpliciti/Components/bsp/bsp.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.485349075./ez430_chronos_datalogger/simpliciti/Components/bsp/bsp.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.485349075"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.1079752688./ez430_chronos_datalogger/simpliciti/Components/mrfi/radios/family5/mrfi_radio_interface.c" name="mrfi_radio_interface.c" rcbsApplicability="disable" resourcePath="/ez430_chronos_datalogger/simpliciti/Components/mrfi/radios/family5/mrfi_radio_interface.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.485349075./ez430_chronos_datalogger/simpliciti/Components/mrfi/radios/family5/mrfi_radio_interface.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.485349075./ez430_chronos_datalogger/simpliciti/Components/mrfi/radios/family5/mrfi_radio_interface.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.485349075"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.1079752688./ez430_chronos_datalogger/simpliciti/Components/mrfi/radios/family5/mrfi_radio.c" name="mrfi_radio.c" rcbsApplicability="disable" resourcePath="/ez430_chronos_datalogger/simpliciti/Components/mrfi/radios/family5/mrfi_radio.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.485349075./ez430_chronos_datalogger/simpliciti/Components/mrfi/radios/family5/mrfi_radio.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.485349075./ez430_chronos_datalogger/simpliciti/Components/mrfi/radios/family5/mrfi_radio.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.485349075"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.1079752688./ez430_chronos_datalogger/bluerobin/BlueRobin_RX_868MHz.lib" name="BlueRobin_RX_868MHz.lib" rcbsApplicability="disable" resourcePath="/ez430_chronos_datalogger/bluerobin/BlueRobin_RX_868MHz.lib" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.819223922./ez430_chronos_datalogger/bluerobin/BlueRobin_RX_868MHz.lib">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.819223922./ez430_chronos_datalogger/bluerobin/BlueRobin_RX_868MHz.lib" name="MSP430 Linker" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.819223922"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.1079752688./ez430_chronos_datalogger/bluerobin/BlueRobin_RX_433MHz.lib" name="BlueRobin_RX_433MHz.lib" rcbsApplicability="disable" resourcePath="/ez430_chronos_datalogger/bluerobin/BlueRobin_RX_433MHz.lib" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.819223922./ez430_chronos_datalogger/bluerobin/BlueRobin_RX_433MHz.lib">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.819223922./ez430_chronos_datalogger/bluerobin/BlueRobin_RX_433MHz.lib" name="MSP430 Linker" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.819223922"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="false" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.1079752688./ez430_chronos_datalogger/bluerobin/BlueRobin_RX_915MHz.lib" name="BlueRobin_RX_915MHz.lib" rcbsApplicability="disable" resourcePath="/ez430_chronos_datalogger/bluerobin/BlueRobin_RX_915MHz.lib" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.819223922./ez430_chronos_datalogger/bluerobin/BlueRobin_RX_915MHz.lib">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.819223922./ez430_chronos_datalogger/bluerobin/BlueRobin_RX_915MHz.lib" name="MSP430 Linker" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.819223922"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.1079752688./ez430_chronos_datalogger/simpliciti/CC430_End_Device_868MHz.lib" name="CC430_End_Device_868MHz.lib" rcbsApplicability="disable" resourcePath="/ez430_chronos_datalogger/simpliciti/CC430_End_Device_868MHz.lib" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.819223922./ez430_chronos_datalogger/simpliciti/CC430_End_Device_868MHz.lib">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.819223922./ez430_chronos_datalogger/simpliciti/CC430_End_Device_868MHz.lib" name="MSP430 Linker" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.819223922"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.1079752688./ez430_chronos_datalogger/simpliciti/CC430_End_Device_433MHz.lib" name="CC430_End_Device_433MHz.lib" rcbsApplicability="disable" resourcePath="/ez430_chronos_datalogger/simpliciti/CC430_End_Device_433MHz.lib" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.819223922./ez430_chronos_datalogger/simpliciti/CC430_End_Device_433MHz.lib">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.819223922./ez430_chronos_datalogger/simpliciti/CC430_End_Device_433MHz.lib" name="MSP430 Linker" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.819223922"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.1079752688./ez430_chronos_datalogger/simpliciti/CC430_End_Device_915MHz.lib" name="CC430_End_Device_915MHz.lib" rcbsApplicability="disable" resourcePath="/ez430_chronos_datalogger/simpliciti/CC430_End_Device_915MHz.lib" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.819223922./ez430_chronos_datalogger/simpliciti/CC430_End_Device_915MHz.lib">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.819223922./ez430_chronos_datalogger/simpliciti/CC430_End_Device_915MHz.lib" name="MSP430 Linker" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.819223922"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.1079752688./ez430_chronos_datalogger/driver/ez430_chronos_datalogger_drivers.lib" name="ez430_chronos_datalogger_drivers.lib" rcbsApplicability="disable" resourcePath="/ez430_chronos_datalogger/driver/ez430_chronos_datalogger_drivers.lib" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.819223922./ez430_chronos_datalogger/driver/ez430_chronos_datalogger_drivers.lib">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.819223922./ez430_chronos_datalogger/driver/ez430_chronos_datalogger_drivers.lib" name="MSP430 Linker" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.819223922"/>\r
+</resourceConfiguration>\r
+</configuration>\r
+<configuration artifactExtension="out" artifactName="ez430_chronos_datalogger_868MHz" description="Europe" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.2073861884" name="868MHz - Limited CCS Core Edition" parent="com.ti.ccstudio.buildDefinitions.MSP430.Debug" postannouncebuildStep="Create flash image: TI-TXT" postbuildStep="&quot;${CG_TOOL_ROOT}/bin/hex${CG_TOOL_SUFFIX}.exe&quot; --ti_txt &quot;${BuildArtifactFileName}&quot; -o &quot;${BuildArtifactFileBaseName}.txt&quot; -order MS -romwidth 16">\r
+<toolChain id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.DebugToolchain.1753722964" name="TI Code Generation Tools" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.DebugToolchain" targetTool="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.2074750593">\r
+<option id="com.ti.ccstudio.buildDefinitions.core.OPT_TAGS.1996615066" superClass="com.ti.ccstudio.buildDefinitions.core.OPT_TAGS" valueType="stringList">\r
+<listOptionValue builtIn="false" value="DEVICE_CONFIGURATION_ID=CC430F6137"/>\r
+<listOptionValue builtIn="false" value="DEVICE_ENDIANNESS=little"/>\r
+<listOptionValue builtIn="false" value="OUTPUT_FORMAT=COFF"/>\r
+<listOptionValue builtIn="false" value="CCS_MBS_VERSION=4.2.0"/>\r
+<listOptionValue builtIn="false" value="LINKER_COMMAND_FILE=lnk_cc430f6137.cmd"/>\r
+<listOptionValue builtIn="false" value="RUNTIME_SUPPORT_LIBRARY=rts430x.lib"/>\r
+<listOptionValue builtIn="false" value="PROJECT_KIND=com.ti.ccstudio.managedbuild.core.ProjectKind_Executable"/>\r
+<listOptionValue builtIn="false" value="IS_ASSEMBLY_ONLY=false"/>\r
+<listOptionValue builtIn="false" value="OUTPUT_TYPE=executable"/>\r
+</option>\r
+<option id="com.ti.ccstudio.buildDefinitions.core.OPT_CODEGEN_VERSION.1117185400" superClass="com.ti.ccstudio.buildDefinitions.core.OPT_CODEGEN_VERSION" value="3.3.1" valueType="string"/>\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.815890816" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug">\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.DIAG_WARNING.1581625577" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.DIAG_WARNING" valueType="stringList">\r
+<listOptionValue builtIn="false" value="225"/>\r
+</option>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.PRINTF_SUPPORT.208362036" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.PRINTF_SUPPORT" value="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.PRINTF_SUPPORT.minimal" valueType="enumerated"/>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.SILICON_VERSION.283654748" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.SILICON_VERSION" value="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.SILICON_VERSION.mspx" valueType="enumerated"/>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.OPT_LEVEL.2004470042" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.OPT_LEVEL" value="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.OPT_LEVEL.4" valueType="enumerated"/>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.DEFINE.1662361251" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.DEFINE" valueType="definedSymbols">\r
+<listOptionValue builtIn="false" value="__CCE__"/>\r
+<listOptionValue builtIn="false" value="ISM_EU"/>\r
+</option>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.INCLUDE_PATH.1662410239" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.INCLUDE_PATH" valueType="includePath">\r
+<listOptionValue builtIn="false" value="&quot;${CCS_INSTALL_ROOT}/msp430/include&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${CG_TOOL_ROOT}/include&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${CCE_INSTALL_ROOT}/msp430/include&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${workspace_loc:/ez430_chronos_datalogger}&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${workspace_loc:/ez430_chronos_datalogger/driver}&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${workspace_loc:/ez430_chronos_datalogger/include}&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${workspace_loc:/ez430_chronos_datalogger/logic}&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${workspace_loc:/ez430_chronos_datalogger/bluerobin}&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${workspace_loc:/ez430_chronos_datalogger/simpliciti}&quot;"/>\r
+</option>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.OPT_FOR_SPEED.2137973262" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.OPT_FOR_SPEED" value="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.OPT_FOR_SPEED.0" valueType="enumerated"/>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.CALL_ASSUMPTIONS.2051361113" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.CALL_ASSUMPTIONS" value="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.CALL_ASSUMPTIONS.0" valueType="enumerated"/>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.AUTO_INLINE.1888579749" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.AUTO_INLINE" value="0" valueType="string"/>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.GEN_OPT_INFO.1117735875" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.GEN_OPT_INFO" value="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.GEN_OPT_INFO.2" valueType="enumerated"/>\r
+</tool>\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.2074750593" name="MSP430 Linker" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug">\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.HEAP_SIZE.1133602069" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.HEAP_SIZE" value="80" valueType="string"/>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.STACK_SIZE.358318039" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.STACK_SIZE" value="80" valueType="string"/>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.USE_HW_MPY.672831866" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.USE_HW_MPY" value="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.USE_HW_MPY.F5" valueType="enumerated"/>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.OUTPUT_FILE.10394802" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.OUTPUT_FILE" value="&quot;ez430_chronos_datalogger_868MHz.out&quot;" valueType="string"/>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.MAP_FILE.403856809" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.MAP_FILE" value="&quot;ez430_chronos_datalogger_868MHz.map&quot;" valueType="string"/>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.generatedLinkerCommandFiles.598121295" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.generatedLinkerCommandFiles" valueType="libs">\r
+<listOptionValue builtIn="false" value="&quot;$(GEN_CMDS_QUOTED)&quot;"/>\r
+</option>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.SEARCH_PATH.1188996487" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.SEARCH_PATH" valueType="stringList">\r
+<listOptionValue builtIn="false" value="&quot;${CCS_INSTALL_ROOT}/msp430/include&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${CG_TOOL_ROOT}/lib&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${CG_TOOL_ROOT}/include&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${CCE_INSTALL_ROOT}/msp430/include&quot;"/>\r
+</option>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.LIBRARY.309883262" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.LIBRARY" valueType="libs">\r
+<listOptionValue builtIn="false" value="&quot;rts430x.lib&quot;"/>\r
+</option>\r
+</tool>\r
+<macros expandEnvironmentMacros="true"/>\r
+</toolChain>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.2073861884./ez430_chronos_datalogger/driver/adc12.c" name="adc12.c" rcbsApplicability="disable" resourcePath="/ez430_chronos_datalogger/driver/adc12.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.815890816./ez430_chronos_datalogger/driver/adc12.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.815890816./ez430_chronos_datalogger/driver/adc12.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.815890816"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.2073861884./ez430_chronos_datalogger/driver/buzzer.c" name="buzzer.c" rcbsApplicability="disable" resourcePath="/ez430_chronos_datalogger/driver/buzzer.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.815890816./ez430_chronos_datalogger/driver/buzzer.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.815890816./ez430_chronos_datalogger/driver/buzzer.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.815890816"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.2073861884./ez430_chronos_datalogger/driver/display.c" name="display.c" rcbsApplicability="disable" resourcePath="/ez430_chronos_datalogger/driver/display.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.815890816./ez430_chronos_datalogger/driver/display.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.815890816./ez430_chronos_datalogger/driver/display.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.815890816"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.2073861884./ez430_chronos_datalogger/driver/flash.c" name="flash.c" rcbsApplicability="disable" resourcePath="/ez430_chronos_datalogger/driver/flash.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.815890816./ez430_chronos_datalogger/driver/flash.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.815890816./ez430_chronos_datalogger/driver/flash.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.815890816"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.2073861884./ez430_chronos_datalogger/driver/pmm.c" name="pmm.c" rcbsApplicability="disable" resourcePath="/ez430_chronos_datalogger/driver/pmm.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.815890816./ez430_chronos_datalogger/driver/pmm.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.815890816./ez430_chronos_datalogger/driver/pmm.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.815890816"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="false" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.2073861884./ez430_chronos_datalogger/driver/ports.c" name="ports.c" rcbsApplicability="disable" resourcePath="/ez430_chronos_datalogger/driver/ports.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.815890816./ez430_chronos_datalogger/driver/ports.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.815890816./ez430_chronos_datalogger/driver/ports.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.815890816"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="false" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.2073861884./ez430_chronos_datalogger/driver/radio.c" name="radio.c" rcbsApplicability="disable" resourcePath="/ez430_chronos_datalogger/driver/radio.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.815890816./ez430_chronos_datalogger/driver/radio.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.815890816./ez430_chronos_datalogger/driver/radio.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.815890816"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="false" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.2073861884./ez430_chronos_datalogger/driver/rf1a.c" name="rf1a.c" rcbsApplicability="disable" resourcePath="/ez430_chronos_datalogger/driver/rf1a.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.815890816./ez430_chronos_datalogger/driver/rf1a.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.815890816./ez430_chronos_datalogger/driver/rf1a.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.815890816"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.2073861884./ez430_chronos_datalogger/driver/timer.c" name="timer.c" rcbsApplicability="disable" resourcePath="/ez430_chronos_datalogger/driver/timer.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.815890816./ez430_chronos_datalogger/driver/timer.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.815890816./ez430_chronos_datalogger/driver/timer.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.815890816"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.2073861884./ez430_chronos_datalogger/driver/vti_as.c" name="vti_as.c" rcbsApplicability="disable" resourcePath="/ez430_chronos_datalogger/driver/vti_as.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.815890816./ez430_chronos_datalogger/driver/vti_as.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.815890816./ez430_chronos_datalogger/driver/vti_as.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.815890816"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.2073861884./ez430_chronos_datalogger/driver/vti_ps.c" name="vti_ps.c" rcbsApplicability="disable" resourcePath="/ez430_chronos_datalogger/driver/vti_ps.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.815890816./ez430_chronos_datalogger/driver/vti_ps.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.815890816./ez430_chronos_datalogger/driver/vti_ps.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.815890816"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.2073861884./ez430_chronos_datalogger/simpliciti/Components/bsp/boards/CC430EM/bsp_board.c" name="bsp_board.c" rcbsApplicability="disable" resourcePath="/ez430_chronos_datalogger/simpliciti/Components/bsp/boards/CC430EM/bsp_board.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.815890816./ez430_chronos_datalogger/simpliciti/Components/bsp/boards/CC430EM/bsp_board.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.815890816./ez430_chronos_datalogger/simpliciti/Components/bsp/boards/CC430EM/bsp_board.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.815890816"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.2073861884./ez430_chronos_datalogger/simpliciti/Components/bsp/boards/CC430EM/bsp_drivers.c" name="bsp_drivers.c" rcbsApplicability="disable" resourcePath="/ez430_chronos_datalogger/simpliciti/Components/bsp/boards/CC430EM/bsp_drivers.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.815890816./ez430_chronos_datalogger/simpliciti/Components/bsp/boards/CC430EM/bsp_drivers.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.815890816./ez430_chronos_datalogger/simpliciti/Components/bsp/boards/CC430EM/bsp_drivers.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.815890816"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.2073861884./ez430_chronos_datalogger/simpliciti/Components/bsp/drivers/code/bsp_buttons.c" name="bsp_buttons.c" rcbsApplicability="disable" resourcePath="/ez430_chronos_datalogger/simpliciti/Components/bsp/drivers/code/bsp_buttons.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.815890816./ez430_chronos_datalogger/simpliciti/Components/bsp/drivers/code/bsp_buttons.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.815890816./ez430_chronos_datalogger/simpliciti/Components/bsp/drivers/code/bsp_buttons.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.815890816"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.2073861884./ez430_chronos_datalogger/simpliciti/Components/bsp/drivers/code/bsp_leds.c" name="bsp_leds.c" rcbsApplicability="disable" resourcePath="/ez430_chronos_datalogger/simpliciti/Components/bsp/drivers/code/bsp_leds.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.815890816./ez430_chronos_datalogger/simpliciti/Components/bsp/drivers/code/bsp_leds.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.815890816./ez430_chronos_datalogger/simpliciti/Components/bsp/drivers/code/bsp_leds.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.815890816"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.2073861884./ez430_chronos_datalogger/simpliciti/Components/bsp/bsp.c" name="bsp.c" rcbsApplicability="disable" resourcePath="/ez430_chronos_datalogger/simpliciti/Components/bsp/bsp.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.815890816./ez430_chronos_datalogger/simpliciti/Components/bsp/bsp.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.815890816./ez430_chronos_datalogger/simpliciti/Components/bsp/bsp.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.815890816"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.2073861884./ez430_chronos_datalogger/simpliciti/Components/mrfi/mrfi.c" name="mrfi.c" rcbsApplicability="disable" resourcePath="/ez430_chronos_datalogger/simpliciti/Components/mrfi/mrfi.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.815890816./ez430_chronos_datalogger/simpliciti/Components/mrfi/mrfi.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.815890816./ez430_chronos_datalogger/simpliciti/Components/mrfi/mrfi.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.815890816"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.2073861884./ez430_chronos_datalogger/simpliciti/Components/mrfi/radios/family5/mrfi_radio_interface.c" name="mrfi_radio_interface.c" rcbsApplicability="disable" resourcePath="/ez430_chronos_datalogger/simpliciti/Components/mrfi/radios/family5/mrfi_radio_interface.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.815890816./ez430_chronos_datalogger/simpliciti/Components/mrfi/radios/family5/mrfi_radio_interface.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.815890816./ez430_chronos_datalogger/simpliciti/Components/mrfi/radios/family5/mrfi_radio_interface.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.815890816"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.2073861884./ez430_chronos_datalogger/simpliciti/Components/mrfi/radios/family5/mrfi_radio.c" name="mrfi_radio.c" rcbsApplicability="disable" resourcePath="/ez430_chronos_datalogger/simpliciti/Components/mrfi/radios/family5/mrfi_radio.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.815890816./ez430_chronos_datalogger/simpliciti/Components/mrfi/radios/family5/mrfi_radio.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.815890816./ez430_chronos_datalogger/simpliciti/Components/mrfi/radios/family5/mrfi_radio.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.815890816"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.2073861884./ez430_chronos_datalogger/simpliciti/Components/nwk/nwk_api.c" name="nwk_api.c" rcbsApplicability="disable" resourcePath="/ez430_chronos_datalogger/simpliciti/Components/nwk/nwk_api.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.815890816./ez430_chronos_datalogger/simpliciti/Components/nwk/nwk_api.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.815890816./ez430_chronos_datalogger/simpliciti/Components/nwk/nwk_api.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.815890816"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.2073861884./ez430_chronos_datalogger/simpliciti/Components/nwk/nwk_frame.c" name="nwk_frame.c" rcbsApplicability="disable" resourcePath="/ez430_chronos_datalogger/simpliciti/Components/nwk/nwk_frame.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.815890816./ez430_chronos_datalogger/simpliciti/Components/nwk/nwk_frame.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.815890816./ez430_chronos_datalogger/simpliciti/Components/nwk/nwk_frame.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.815890816"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.2073861884./ez430_chronos_datalogger/simpliciti/Components/nwk/nwk_globals.c" name="nwk_globals.c" rcbsApplicability="disable" resourcePath="/ez430_chronos_datalogger/simpliciti/Components/nwk/nwk_globals.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.815890816./ez430_chronos_datalogger/simpliciti/Components/nwk/nwk_globals.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.815890816./ez430_chronos_datalogger/simpliciti/Components/nwk/nwk_globals.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.815890816"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.2073861884./ez430_chronos_datalogger/simpliciti/Components/nwk/nwk_QMgmt.c" name="nwk_QMgmt.c" rcbsApplicability="disable" resourcePath="/ez430_chronos_datalogger/simpliciti/Components/nwk/nwk_QMgmt.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.815890816./ez430_chronos_datalogger/simpliciti/Components/nwk/nwk_QMgmt.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.815890816./ez430_chronos_datalogger/simpliciti/Components/nwk/nwk_QMgmt.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.815890816"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.2073861884./ez430_chronos_datalogger/simpliciti/Components/nwk/nwk.c" name="nwk.c" rcbsApplicability="disable" resourcePath="/ez430_chronos_datalogger/simpliciti/Components/nwk/nwk.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.815890816./ez430_chronos_datalogger/simpliciti/Components/nwk/nwk.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.815890816./ez430_chronos_datalogger/simpliciti/Components/nwk/nwk.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.815890816"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.2073861884./ez430_chronos_datalogger/simpliciti/Components/nwk_applications/nwk_freq.c" name="nwk_freq.c" rcbsApplicability="disable" resourcePath="/ez430_chronos_datalogger/simpliciti/Components/nwk_applications/nwk_freq.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.815890816./ez430_chronos_datalogger/simpliciti/Components/nwk_applications/nwk_freq.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.815890816./ez430_chronos_datalogger/simpliciti/Components/nwk_applications/nwk_freq.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.815890816"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.2073861884./ez430_chronos_datalogger/simpliciti/Components/nwk_applications/nwk_ioctl.c" name="nwk_ioctl.c" rcbsApplicability="disable" resourcePath="/ez430_chronos_datalogger/simpliciti/Components/nwk_applications/nwk_ioctl.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.815890816./ez430_chronos_datalogger/simpliciti/Components/nwk_applications/nwk_ioctl.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.815890816./ez430_chronos_datalogger/simpliciti/Components/nwk_applications/nwk_ioctl.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.815890816"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.2073861884./ez430_chronos_datalogger/simpliciti/Components/nwk_applications/nwk_join.c" name="nwk_join.c" rcbsApplicability="disable" resourcePath="/ez430_chronos_datalogger/simpliciti/Components/nwk_applications/nwk_join.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.815890816./ez430_chronos_datalogger/simpliciti/Components/nwk_applications/nwk_join.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.815890816./ez430_chronos_datalogger/simpliciti/Components/nwk_applications/nwk_join.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.815890816"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.2073861884./ez430_chronos_datalogger/simpliciti/Components/nwk_applications/nwk_link.c" name="nwk_link.c" rcbsApplicability="disable" resourcePath="/ez430_chronos_datalogger/simpliciti/Components/nwk_applications/nwk_link.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.815890816./ez430_chronos_datalogger/simpliciti/Components/nwk_applications/nwk_link.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.815890816./ez430_chronos_datalogger/simpliciti/Components/nwk_applications/nwk_link.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.815890816"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.2073861884./ez430_chronos_datalogger/simpliciti/Components/nwk_applications/nwk_mgmt.c" name="nwk_mgmt.c" rcbsApplicability="disable" resourcePath="/ez430_chronos_datalogger/simpliciti/Components/nwk_applications/nwk_mgmt.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.815890816./ez430_chronos_datalogger/simpliciti/Components/nwk_applications/nwk_mgmt.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.815890816./ez430_chronos_datalogger/simpliciti/Components/nwk_applications/nwk_mgmt.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.815890816"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.2073861884./ez430_chronos_datalogger/simpliciti/Components/nwk_applications/nwk_ping.c" name="nwk_ping.c" rcbsApplicability="disable" resourcePath="/ez430_chronos_datalogger/simpliciti/Components/nwk_applications/nwk_ping.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.815890816./ez430_chronos_datalogger/simpliciti/Components/nwk_applications/nwk_ping.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.815890816./ez430_chronos_datalogger/simpliciti/Components/nwk_applications/nwk_ping.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.815890816"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.2073861884./ez430_chronos_datalogger/simpliciti/Components/nwk_applications/nwk_security.c" name="nwk_security.c" rcbsApplicability="disable" resourcePath="/ez430_chronos_datalogger/simpliciti/Components/nwk_applications/nwk_security.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.815890816./ez430_chronos_datalogger/simpliciti/Components/nwk_applications/nwk_security.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.815890816./ez430_chronos_datalogger/simpliciti/Components/nwk_applications/nwk_security.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.815890816"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.2073861884./ez430_chronos_datalogger/simpliciti/Applications/application/End Device/main_ED_BM.c" name="main_ED_BM.c" rcbsApplicability="disable" resourcePath="/ez430_chronos_datalogger/simpliciti/Applications/application/End Device/main_ED_BM.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.815890816./ez430_chronos_datalogger/simpliciti/Applications/application/End Device/main_ED_BM.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.815890816./ez430_chronos_datalogger/simpliciti/Applications/application/End Device/main_ED_BM.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.815890816"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.2073861884./ez430_chronos_datalogger/bluerobin/BlueRobin_RX_433MHz.lib" name="BlueRobin_RX_433MHz.lib" rcbsApplicability="disable" resourcePath="/ez430_chronos_datalogger/bluerobin/BlueRobin_RX_433MHz.lib" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.2074750593./ez430_chronos_datalogger/bluerobin/BlueRobin_RX_433MHz.lib">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.2074750593./ez430_chronos_datalogger/bluerobin/BlueRobin_RX_433MHz.lib" name="MSP430 Linker" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.2074750593"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.2073861884./ez430_chronos_datalogger/bluerobin/BlueRobin_RX_915MHz.lib" name="BlueRobin_RX_915MHz.lib" rcbsApplicability="disable" resourcePath="/ez430_chronos_datalogger/bluerobin/BlueRobin_RX_915MHz.lib" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.2074750593./ez430_chronos_datalogger/bluerobin/BlueRobin_RX_915MHz.lib">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.2074750593./ez430_chronos_datalogger/bluerobin/BlueRobin_RX_915MHz.lib" name="MSP430 Linker" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.2074750593"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.2073861884./ez430_chronos_datalogger/simpliciti/CC430_End_Device_433MHz.lib" name="CC430_End_Device_433MHz.lib" rcbsApplicability="disable" resourcePath="/ez430_chronos_datalogger/simpliciti/CC430_End_Device_433MHz.lib" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.2074750593./ez430_chronos_datalogger/simpliciti/CC430_End_Device_433MHz.lib">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.2074750593./ez430_chronos_datalogger/simpliciti/CC430_End_Device_433MHz.lib" name="MSP430 Linker" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.2074750593"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.2073861884./ez430_chronos_datalogger/simpliciti/CC430_End_Device_915MHz.lib" name="CC430_End_Device_915MHz.lib" rcbsApplicability="disable" resourcePath="/ez430_chronos_datalogger/simpliciti/CC430_End_Device_915MHz.lib" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.2074750593./ez430_chronos_datalogger/simpliciti/CC430_End_Device_915MHz.lib">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.2074750593./ez430_chronos_datalogger/simpliciti/CC430_End_Device_915MHz.lib" name="MSP430 Linker" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.2074750593"/>\r
+</resourceConfiguration>\r
+</configuration>\r
+<configuration artifactExtension="out" artifactName="ez430_chronos_datalogger_915MHz" description="USA" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.1934951040" name="915MHz - Limited CCS Core Edition" parent="com.ti.ccstudio.buildDefinitions.MSP430.Debug" postannouncebuildStep="Create flash image: TI-TXT" postbuildStep="&quot;${CG_TOOL_ROOT}/bin/hex${CG_TOOL_SUFFIX}.exe&quot; --ti_txt &quot;${BuildArtifactFileName}&quot; -o &quot;${BuildArtifactFileBaseName}.txt&quot; -order MS -romwidth 16">\r
+<toolChain id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.DebugToolchain.253687392" name="TI Code Generation Tools" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.DebugToolchain" targetTool="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.1667707234">\r
+<option id="com.ti.ccstudio.buildDefinitions.core.OPT_TAGS.1241018784" superClass="com.ti.ccstudio.buildDefinitions.core.OPT_TAGS" valueType="stringList">\r
+<listOptionValue builtIn="false" value="DEVICE_CONFIGURATION_ID=CC430F6137"/>\r
+<listOptionValue builtIn="false" value="DEVICE_ENDIANNESS=little"/>\r
+<listOptionValue builtIn="false" value="OUTPUT_FORMAT=COFF"/>\r
+<listOptionValue builtIn="false" value="CCS_MBS_VERSION=4.2.0"/>\r
+<listOptionValue builtIn="false" value="LINKER_COMMAND_FILE=lnk_cc430f6137.cmd"/>\r
+<listOptionValue builtIn="false" value="RUNTIME_SUPPORT_LIBRARY=rts430x.lib"/>\r
+<listOptionValue builtIn="false" value="PROJECT_KIND=com.ti.ccstudio.managedbuild.core.ProjectKind_Executable"/>\r
+<listOptionValue builtIn="false" value="IS_ASSEMBLY_ONLY=false"/>\r
+<listOptionValue builtIn="false" value="OUTPUT_TYPE=executable"/>\r
+</option>\r
+<option id="com.ti.ccstudio.buildDefinitions.core.OPT_CODEGEN_VERSION.513857463" superClass="com.ti.ccstudio.buildDefinitions.core.OPT_CODEGEN_VERSION" value="3.3.1" valueType="string"/>\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1726020326" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug">\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.DIAG_WARNING.463041610" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.DIAG_WARNING" valueType="stringList">\r
+<listOptionValue builtIn="false" value="225"/>\r
+</option>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.PRINTF_SUPPORT.2079626518" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.PRINTF_SUPPORT" value="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.PRINTF_SUPPORT.minimal" valueType="enumerated"/>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.SILICON_VERSION.127099195" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.SILICON_VERSION" value="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.SILICON_VERSION.mspx" valueType="enumerated"/>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.OPT_LEVEL.584169225" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.OPT_LEVEL" value="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.OPT_LEVEL.4" valueType="enumerated"/>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.OPT_FOR_SPEED.14120639" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.OPT_FOR_SPEED" value="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.OPT_FOR_SPEED.0" valueType="enumerated"/>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.DEFINE.1971875324" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.DEFINE" valueType="definedSymbols">\r
+<listOptionValue builtIn="false" value="__CCE__"/>\r
+<listOptionValue builtIn="false" value="ISM_US"/>\r
+</option>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.INCLUDE_PATH.948015393" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.INCLUDE_PATH" valueType="includePath">\r
+<listOptionValue builtIn="false" value="&quot;${CCS_INSTALL_ROOT}/msp430/include&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${CG_TOOL_ROOT}/include&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${CCE_INSTALL_ROOT}/msp430/include&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${workspace_loc:/ez430_chronos_datalogger}&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${workspace_loc:/ez430_chronos_datalogger/driver}&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${workspace_loc:/ez430_chronos_datalogger/include}&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${workspace_loc:/ez430_chronos_datalogger/logic}&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${workspace_loc:/ez430_chronos_datalogger/bluerobin}&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${workspace_loc:/ez430_chronos_datalogger/simpliciti}&quot;"/>\r
+</option>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.CALL_ASSUMPTIONS.2024674434" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.CALL_ASSUMPTIONS" value="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.CALL_ASSUMPTIONS.0" valueType="enumerated"/>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.AUTO_INLINE.250918402" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.AUTO_INLINE" value="0" valueType="string"/>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.GEN_OPT_INFO.1715226775" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.GEN_OPT_INFO" value="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.GEN_OPT_INFO.2" valueType="enumerated"/>\r
+</tool>\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.1667707234" name="MSP430 Linker" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug">\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.HEAP_SIZE.1552687705" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.HEAP_SIZE" value="80" valueType="string"/>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.STACK_SIZE.1019901224" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.STACK_SIZE" value="80" valueType="string"/>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.USE_HW_MPY.1604469710" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.USE_HW_MPY" value="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.USE_HW_MPY.F5" valueType="enumerated"/>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.OUTPUT_FILE.117196199" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.OUTPUT_FILE" value="&quot;ez430_chronos_datalogger_915MHz.out&quot;" valueType="string"/>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.MAP_FILE.1332842864" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.MAP_FILE" value="&quot;ez430_chronos_datalogger_915MHz.map&quot;" valueType="string"/>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.generatedLinkerCommandFiles.698437727" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.generatedLinkerCommandFiles" valueType="libs">\r
+<listOptionValue builtIn="false" value="&quot;$(GEN_CMDS_QUOTED)&quot;"/>\r
+</option>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.SEARCH_PATH.1977117764" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.SEARCH_PATH" valueType="stringList">\r
+<listOptionValue builtIn="false" value="&quot;${CCS_INSTALL_ROOT}/msp430/include&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${CG_TOOL_ROOT}/lib&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${CG_TOOL_ROOT}/include&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${CCE_INSTALL_ROOT}/msp430/include&quot;"/>\r
+</option>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.LIBRARY.1825664638" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.LIBRARY" valueType="libs">\r
+<listOptionValue builtIn="false" value="&quot;rts430x.lib&quot;"/>\r
+</option>\r
+</tool>\r
+<macros expandEnvironmentMacros="true"/>\r
+</toolChain>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.1934951040./ez430_chronos_datalogger/driver/adc12.c" name="adc12.c" rcbsApplicability="disable" resourcePath="/ez430_chronos_datalogger/driver/adc12.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1726020326./ez430_chronos_datalogger/driver/adc12.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1726020326./ez430_chronos_datalogger/driver/adc12.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1726020326"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.1934951040./ez430_chronos_datalogger/driver/buzzer.c" name="buzzer.c" rcbsApplicability="disable" resourcePath="/ez430_chronos_datalogger/driver/buzzer.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1726020326./ez430_chronos_datalogger/driver/buzzer.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1726020326./ez430_chronos_datalogger/driver/buzzer.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1726020326"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.1934951040./ez430_chronos_datalogger/driver/display.c" name="display.c" rcbsApplicability="disable" resourcePath="/ez430_chronos_datalogger/driver/display.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1726020326./ez430_chronos_datalogger/driver/display.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1726020326./ez430_chronos_datalogger/driver/display.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1726020326"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.1934951040./ez430_chronos_datalogger/driver/flash.c" name="flash.c" rcbsApplicability="disable" resourcePath="/ez430_chronos_datalogger/driver/flash.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1726020326./ez430_chronos_datalogger/driver/flash.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1726020326./ez430_chronos_datalogger/driver/flash.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1726020326"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.1934951040./ez430_chronos_datalogger/driver/pmm.c" name="pmm.c" rcbsApplicability="disable" resourcePath="/ez430_chronos_datalogger/driver/pmm.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1726020326./ez430_chronos_datalogger/driver/pmm.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1726020326./ez430_chronos_datalogger/driver/pmm.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1726020326"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="false" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.1934951040./ez430_chronos_datalogger/driver/ports.c" name="ports.c" rcbsApplicability="disable" resourcePath="/ez430_chronos_datalogger/driver/ports.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1726020326./ez430_chronos_datalogger/driver/ports.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1726020326./ez430_chronos_datalogger/driver/ports.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1726020326"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="false" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.1934951040./ez430_chronos_datalogger/driver/radio.c" name="radio.c" rcbsApplicability="disable" resourcePath="/ez430_chronos_datalogger/driver/radio.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1726020326./ez430_chronos_datalogger/driver/radio.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1726020326./ez430_chronos_datalogger/driver/radio.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1726020326"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="false" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.1934951040./ez430_chronos_datalogger/driver/rf1a.c" name="rf1a.c" rcbsApplicability="disable" resourcePath="/ez430_chronos_datalogger/driver/rf1a.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1726020326./ez430_chronos_datalogger/driver/rf1a.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1726020326./ez430_chronos_datalogger/driver/rf1a.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1726020326"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.1934951040./ez430_chronos_datalogger/driver/timer.c" name="timer.c" rcbsApplicability="disable" resourcePath="/ez430_chronos_datalogger/driver/timer.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1726020326./ez430_chronos_datalogger/driver/timer.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1726020326./ez430_chronos_datalogger/driver/timer.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1726020326"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.1934951040./ez430_chronos_datalogger/driver/vti_as.c" name="vti_as.c" rcbsApplicability="disable" resourcePath="/ez430_chronos_datalogger/driver/vti_as.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1726020326./ez430_chronos_datalogger/driver/vti_as.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1726020326./ez430_chronos_datalogger/driver/vti_as.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1726020326"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.1934951040./ez430_chronos_datalogger/driver/vti_ps.c" name="vti_ps.c" rcbsApplicability="disable" resourcePath="/ez430_chronos_datalogger/driver/vti_ps.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1726020326./ez430_chronos_datalogger/driver/vti_ps.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1726020326./ez430_chronos_datalogger/driver/vti_ps.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1726020326"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.1934951040./ez430_chronos_datalogger/simpliciti/Components/bsp/boards/CC430EM/bsp_board.c" name="bsp_board.c" rcbsApplicability="disable" resourcePath="/ez430_chronos_datalogger/simpliciti/Components/bsp/boards/CC430EM/bsp_board.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1726020326./ez430_chronos_datalogger/simpliciti/Components/bsp/boards/CC430EM/bsp_board.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1726020326./ez430_chronos_datalogger/simpliciti/Components/bsp/boards/CC430EM/bsp_board.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1726020326"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.1934951040./ez430_chronos_datalogger/simpliciti/Components/bsp/boards/CC430EM/bsp_drivers.c" name="bsp_drivers.c" rcbsApplicability="disable" resourcePath="/ez430_chronos_datalogger/simpliciti/Components/bsp/boards/CC430EM/bsp_drivers.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1726020326./ez430_chronos_datalogger/simpliciti/Components/bsp/boards/CC430EM/bsp_drivers.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1726020326./ez430_chronos_datalogger/simpliciti/Components/bsp/boards/CC430EM/bsp_drivers.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1726020326"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.1934951040./ez430_chronos_datalogger/simpliciti/Components/bsp/drivers/code/bsp_buttons.c" name="bsp_buttons.c" rcbsApplicability="disable" resourcePath="/ez430_chronos_datalogger/simpliciti/Components/bsp/drivers/code/bsp_buttons.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1726020326./ez430_chronos_datalogger/simpliciti/Components/bsp/drivers/code/bsp_buttons.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1726020326./ez430_chronos_datalogger/simpliciti/Components/bsp/drivers/code/bsp_buttons.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1726020326"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.1934951040./ez430_chronos_datalogger/simpliciti/Components/bsp/drivers/code/bsp_leds.c" name="bsp_leds.c" rcbsApplicability="disable" resourcePath="/ez430_chronos_datalogger/simpliciti/Components/bsp/drivers/code/bsp_leds.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1726020326./ez430_chronos_datalogger/simpliciti/Components/bsp/drivers/code/bsp_leds.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1726020326./ez430_chronos_datalogger/simpliciti/Components/bsp/drivers/code/bsp_leds.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1726020326"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.1934951040./ez430_chronos_datalogger/simpliciti/Components/bsp/bsp.c" name="bsp.c" rcbsApplicability="disable" resourcePath="/ez430_chronos_datalogger/simpliciti/Components/bsp/bsp.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1726020326./ez430_chronos_datalogger/simpliciti/Components/bsp/bsp.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1726020326./ez430_chronos_datalogger/simpliciti/Components/bsp/bsp.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1726020326"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.1934951040./ez430_chronos_datalogger/simpliciti/Components/mrfi/mrfi.c" name="mrfi.c" rcbsApplicability="disable" resourcePath="/ez430_chronos_datalogger/simpliciti/Components/mrfi/mrfi.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1726020326./ez430_chronos_datalogger/simpliciti/Components/mrfi/mrfi.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1726020326./ez430_chronos_datalogger/simpliciti/Components/mrfi/mrfi.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1726020326"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.1934951040./ez430_chronos_datalogger/simpliciti/Components/mrfi/radios/family5/mrfi_radio_interface.c" name="mrfi_radio_interface.c" rcbsApplicability="disable" resourcePath="/ez430_chronos_datalogger/simpliciti/Components/mrfi/radios/family5/mrfi_radio_interface.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1726020326./ez430_chronos_datalogger/simpliciti/Components/mrfi/radios/family5/mrfi_radio_interface.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1726020326./ez430_chronos_datalogger/simpliciti/Components/mrfi/radios/family5/mrfi_radio_interface.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1726020326"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.1934951040./ez430_chronos_datalogger/simpliciti/Components/mrfi/radios/family5/mrfi_radio.c" name="mrfi_radio.c" rcbsApplicability="disable" resourcePath="/ez430_chronos_datalogger/simpliciti/Components/mrfi/radios/family5/mrfi_radio.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1726020326./ez430_chronos_datalogger/simpliciti/Components/mrfi/radios/family5/mrfi_radio.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1726020326./ez430_chronos_datalogger/simpliciti/Components/mrfi/radios/family5/mrfi_radio.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1726020326"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.1934951040./ez430_chronos_datalogger/simpliciti/Components/nwk/nwk_api.c" name="nwk_api.c" rcbsApplicability="disable" resourcePath="/ez430_chronos_datalogger/simpliciti/Components/nwk/nwk_api.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1726020326./ez430_chronos_datalogger/simpliciti/Components/nwk/nwk_api.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1726020326./ez430_chronos_datalogger/simpliciti/Components/nwk/nwk_api.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1726020326"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.1934951040./ez430_chronos_datalogger/simpliciti/Components/nwk/nwk_frame.c" name="nwk_frame.c" rcbsApplicability="disable" resourcePath="/ez430_chronos_datalogger/simpliciti/Components/nwk/nwk_frame.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1726020326./ez430_chronos_datalogger/simpliciti/Components/nwk/nwk_frame.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1726020326./ez430_chronos_datalogger/simpliciti/Components/nwk/nwk_frame.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1726020326"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.1934951040./ez430_chronos_datalogger/simpliciti/Components/nwk/nwk_globals.c" name="nwk_globals.c" rcbsApplicability="disable" resourcePath="/ez430_chronos_datalogger/simpliciti/Components/nwk/nwk_globals.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1726020326./ez430_chronos_datalogger/simpliciti/Components/nwk/nwk_globals.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1726020326./ez430_chronos_datalogger/simpliciti/Components/nwk/nwk_globals.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1726020326"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.1934951040./ez430_chronos_datalogger/simpliciti/Components/nwk/nwk_QMgmt.c" name="nwk_QMgmt.c" rcbsApplicability="disable" resourcePath="/ez430_chronos_datalogger/simpliciti/Components/nwk/nwk_QMgmt.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1726020326./ez430_chronos_datalogger/simpliciti/Components/nwk/nwk_QMgmt.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1726020326./ez430_chronos_datalogger/simpliciti/Components/nwk/nwk_QMgmt.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1726020326"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.1934951040./ez430_chronos_datalogger/simpliciti/Components/nwk/nwk.c" name="nwk.c" rcbsApplicability="disable" resourcePath="/ez430_chronos_datalogger/simpliciti/Components/nwk/nwk.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1726020326./ez430_chronos_datalogger/simpliciti/Components/nwk/nwk.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1726020326./ez430_chronos_datalogger/simpliciti/Components/nwk/nwk.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1726020326"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.1934951040./ez430_chronos_datalogger/simpliciti/Components/nwk_applications/nwk_freq.c" name="nwk_freq.c" rcbsApplicability="disable" resourcePath="/ez430_chronos_datalogger/simpliciti/Components/nwk_applications/nwk_freq.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1726020326./ez430_chronos_datalogger/simpliciti/Components/nwk_applications/nwk_freq.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1726020326./ez430_chronos_datalogger/simpliciti/Components/nwk_applications/nwk_freq.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1726020326"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.1934951040./ez430_chronos_datalogger/simpliciti/Components/nwk_applications/nwk_ioctl.c" name="nwk_ioctl.c" rcbsApplicability="disable" resourcePath="/ez430_chronos_datalogger/simpliciti/Components/nwk_applications/nwk_ioctl.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1726020326./ez430_chronos_datalogger/simpliciti/Components/nwk_applications/nwk_ioctl.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1726020326./ez430_chronos_datalogger/simpliciti/Components/nwk_applications/nwk_ioctl.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1726020326"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.1934951040./ez430_chronos_datalogger/simpliciti/Components/nwk_applications/nwk_join.c" name="nwk_join.c" rcbsApplicability="disable" resourcePath="/ez430_chronos_datalogger/simpliciti/Components/nwk_applications/nwk_join.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1726020326./ez430_chronos_datalogger/simpliciti/Components/nwk_applications/nwk_join.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1726020326./ez430_chronos_datalogger/simpliciti/Components/nwk_applications/nwk_join.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1726020326"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.1934951040./ez430_chronos_datalogger/simpliciti/Components/nwk_applications/nwk_link.c" name="nwk_link.c" rcbsApplicability="disable" resourcePath="/ez430_chronos_datalogger/simpliciti/Components/nwk_applications/nwk_link.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1726020326./ez430_chronos_datalogger/simpliciti/Components/nwk_applications/nwk_link.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1726020326./ez430_chronos_datalogger/simpliciti/Components/nwk_applications/nwk_link.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1726020326"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.1934951040./ez430_chronos_datalogger/simpliciti/Components/nwk_applications/nwk_mgmt.c" name="nwk_mgmt.c" rcbsApplicability="disable" resourcePath="/ez430_chronos_datalogger/simpliciti/Components/nwk_applications/nwk_mgmt.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1726020326./ez430_chronos_datalogger/simpliciti/Components/nwk_applications/nwk_mgmt.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1726020326./ez430_chronos_datalogger/simpliciti/Components/nwk_applications/nwk_mgmt.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1726020326"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.1934951040./ez430_chronos_datalogger/simpliciti/Components/nwk_applications/nwk_ping.c" name="nwk_ping.c" rcbsApplicability="disable" resourcePath="/ez430_chronos_datalogger/simpliciti/Components/nwk_applications/nwk_ping.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1726020326./ez430_chronos_datalogger/simpliciti/Components/nwk_applications/nwk_ping.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1726020326./ez430_chronos_datalogger/simpliciti/Components/nwk_applications/nwk_ping.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1726020326"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.1934951040./ez430_chronos_datalogger/simpliciti/Components/nwk_applications/nwk_security.c" name="nwk_security.c" rcbsApplicability="disable" resourcePath="/ez430_chronos_datalogger/simpliciti/Components/nwk_applications/nwk_security.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1726020326./ez430_chronos_datalogger/simpliciti/Components/nwk_applications/nwk_security.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1726020326./ez430_chronos_datalogger/simpliciti/Components/nwk_applications/nwk_security.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1726020326"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.1934951040./ez430_chronos_datalogger/simpliciti/Applications/application/End Device/main_ED_BM.c" name="main_ED_BM.c" rcbsApplicability="disable" resourcePath="/ez430_chronos_datalogger/simpliciti/Applications/application/End Device/main_ED_BM.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1726020326./ez430_chronos_datalogger/simpliciti/Applications/application/End Device/main_ED_BM.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1726020326./ez430_chronos_datalogger/simpliciti/Applications/application/End Device/main_ED_BM.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1726020326"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.1934951040./ez430_chronos_datalogger/bluerobin/BlueRobin_RX_868MHz.lib" name="BlueRobin_RX_868MHz.lib" rcbsApplicability="disable" resourcePath="/ez430_chronos_datalogger/bluerobin/BlueRobin_RX_868MHz.lib" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.1667707234./ez430_chronos_datalogger/bluerobin/BlueRobin_RX_868MHz.lib">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.1667707234./ez430_chronos_datalogger/bluerobin/BlueRobin_RX_868MHz.lib" name="MSP430 Linker" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.1667707234"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.1934951040./ez430_chronos_datalogger/bluerobin/BlueRobin_RX_433MHz.lib" name="BlueRobin_RX_433MHz.lib" rcbsApplicability="disable" resourcePath="/ez430_chronos_datalogger/bluerobin/BlueRobin_RX_433MHz.lib" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.1667707234./ez430_chronos_datalogger/bluerobin/BlueRobin_RX_433MHz.lib">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.1667707234./ez430_chronos_datalogger/bluerobin/BlueRobin_RX_433MHz.lib" name="MSP430 Linker" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.1667707234"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="false" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.1934951040./ez430_chronos_datalogger/bluerobin/BlueRobin_RX_915MHz.lib" name="BlueRobin_RX_915MHz.lib" rcbsApplicability="disable" resourcePath="/ez430_chronos_datalogger/bluerobin/BlueRobin_RX_915MHz.lib" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.1667707234./ez430_chronos_datalogger/bluerobin/BlueRobin_RX_915MHz.lib">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.1667707234./ez430_chronos_datalogger/bluerobin/BlueRobin_RX_915MHz.lib" name="MSP430 Linker" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.1667707234"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.1934951040./ez430_chronos_datalogger/simpliciti/CC430_End_Device_868MHz.lib" name="CC430_End_Device_868MHz.lib" rcbsApplicability="disable" resourcePath="/ez430_chronos_datalogger/simpliciti/CC430_End_Device_868MHz.lib" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.1667707234./ez430_chronos_datalogger/simpliciti/CC430_End_Device_868MHz.lib">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.1667707234./ez430_chronos_datalogger/simpliciti/CC430_End_Device_868MHz.lib" name="MSP430 Linker" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.1667707234"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.1934951040./ez430_chronos_datalogger/simpliciti/CC430_End_Device_433MHz.lib" name="CC430_End_Device_433MHz.lib" rcbsApplicability="disable" resourcePath="/ez430_chronos_datalogger/simpliciti/CC430_End_Device_433MHz.lib" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.1667707234./ez430_chronos_datalogger/simpliciti/CC430_End_Device_433MHz.lib">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.1667707234./ez430_chronos_datalogger/simpliciti/CC430_End_Device_433MHz.lib" name="MSP430 Linker" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.1667707234"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="false" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.1934951040./ez430_chronos_datalogger/driver/ez430_chronos_datalogger_drivers.lib" name="ez430_chronos_datalogger_drivers.lib" rcbsApplicability="disable" resourcePath="/ez430_chronos_datalogger/driver/ez430_chronos_datalogger_drivers.lib" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.1667707234./ez430_chronos_datalogger/driver/ez430_chronos_datalogger_drivers.lib">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.1667707234./ez430_chronos_datalogger/driver/ez430_chronos_datalogger_drivers.lib" name="MSP430 Linker" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.1667707234"/>\r
+</resourceConfiguration>\r
+</configuration>\r
+<macros/>\r
+</project>\r
+</ManagedProjectBuildInfo>\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/.cdtproject b/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/.cdtproject
new file mode 100755 (executable)
index 0000000..fa82503
--- /dev/null
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>\r
+<?eclipse-cdt version="2.0"?>\r
+\r
+<cdtproject id="org.eclipse.cdt.managedbuilder.core.managedMake">\r
+<extension id="org.eclipse.cdt.managedbuilder.core.ManagedBuildManager" point="org.eclipse.cdt.core.ScannerInfoProvider"/>\r
+<extension id="com.ti.ccstudio.binaryparser.CoffParser" point="org.eclipse.cdt.core.BinaryParser"/>\r
+<data>\r
+<item id="org.eclipse.cdt.core.pathentry">\r
+<pathentry kind="src" path=""/>\r
+<pathentry kind="out" path=""/>\r
+<pathentry kind="con" path="org.eclipse.cdt.managedbuilder.MANAGED_CONTAINER"/>\r
+<pathentry kind="con" path="com.ti.ccstudio.managedbuild.core.CCS_CONTAINER"/>\r
+</item>\r
+</data>\r
+</cdtproject>\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/.project b/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/.project
new file mode 100755 (executable)
index 0000000..28ab14c
--- /dev/null
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>\r
+<projectDescription>\r
+       <name>ez430_chronos_datalogger</name>\r
+       <comment></comment>\r
+       <projects>\r
+       </projects>\r
+       <buildSpec>\r
+               <buildCommand>\r
+                       <name>org.eclipse.cdt.managedbuilder.core.genmakebuilder</name>\r
+                       <arguments>\r
+                       </arguments>\r
+               </buildCommand>\r
+       </buildSpec>\r
+       <natures>\r
+               <nature>org.eclipse.cdt.core.cnature</nature>\r
+               <nature>org.eclipse.cdt.managedbuilder.core.managedBuildNature</nature>\r
+               <nature>org.eclipse.cdt.core.ccnature</nature>\r
+               <nature>com.ti.ccstudio.managedbuild.core.ccsNature</nature>\r
+       </natures>\r
+</projectDescription>\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/.settings/org.eclipse.cdt.managedbuilder.core.prefs b/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/.settings/org.eclipse.cdt.managedbuilder.core.prefs
new file mode 100755 (executable)
index 0000000..ad18ca8
--- /dev/null
@@ -0,0 +1,35 @@
+#Wed Nov 03 14:36:44 CET 2010\r
+com.ti.ccstudio.buildDefinitions.MSP430.Debug.1031097535/internalBuilder/enabled=false\r
+com.ti.ccstudio.buildDefinitions.MSP430.Debug.1031097535/internalBuilder/ignoreErr=true\r
+com.ti.ccstudio.buildDefinitions.MSP430.Debug.1079752688/internalBuilder/enabled=false\r
+com.ti.ccstudio.buildDefinitions.MSP430.Debug.1079752688/internalBuilder/ignoreErr=true\r
+com.ti.ccstudio.buildDefinitions.MSP430.Debug.1516359669/internalBuilder/enabled=false\r
+com.ti.ccstudio.buildDefinitions.MSP430.Debug.1516359669/internalBuilder/ignoreErr=true\r
+com.ti.ccstudio.buildDefinitions.MSP430.Debug.16580540/internalBuilder/enabled=false\r
+com.ti.ccstudio.buildDefinitions.MSP430.Debug.16580540/internalBuilder/ignoreErr=true\r
+com.ti.ccstudio.buildDefinitions.MSP430.Debug.193329876/internalBuilder/enabled=false\r
+com.ti.ccstudio.buildDefinitions.MSP430.Debug.193329876/internalBuilder/ignoreErr=true\r
+com.ti.ccstudio.buildDefinitions.MSP430.Debug.1934951040/internalBuilder/enabled=false\r
+com.ti.ccstudio.buildDefinitions.MSP430.Debug.1934951040/internalBuilder/ignoreErr=true\r
+com.ti.ccstudio.buildDefinitions.MSP430.Debug.1976430675/internalBuilder/enabled=false\r
+com.ti.ccstudio.buildDefinitions.MSP430.Debug.1976430675/internalBuilder/ignoreErr=true\r
+com.ti.ccstudio.buildDefinitions.MSP430.Debug.2073861884/internalBuilder/enabled=false\r
+com.ti.ccstudio.buildDefinitions.MSP430.Debug.2073861884/internalBuilder/ignoreErr=true\r
+com.ti.ccstudio.buildDefinitions.MSP430.Debug.347057253/internalBuilder/enabled=false\r
+com.ti.ccstudio.buildDefinitions.MSP430.Debug.347057253/internalBuilder/ignoreErr=true\r
+com.ti.ccstudio.buildDefinitions.MSP430.Debug.434572269/internalBuilder/enabled=false\r
+com.ti.ccstudio.buildDefinitions.MSP430.Debug.434572269/internalBuilder/ignoreErr=true\r
+com.ti.ccstudio.buildDefinitions.MSP430.Debug.513051802/internalBuilder/enabled=false\r
+com.ti.ccstudio.buildDefinitions.MSP430.Debug.513051802/internalBuilder/ignoreErr=true\r
+com.ti.ccstudio.buildDefinitions.MSP430.Debug.743520591/internalBuilder/enabled=false\r
+com.ti.ccstudio.buildDefinitions.MSP430.Debug.743520591/internalBuilder/ignoreErr=true\r
+com.ti.ccstudio.buildDefinitions.MSP430.Debug.916524374/internalBuilder/enabled=false\r
+com.ti.ccstudio.buildDefinitions.MSP430.Debug.916524374/internalBuilder/ignoreErr=true\r
+eclipse.preferences.version=1\r
+environment/project=<?xml version\="1.0" encoding\="UTF-8"?>\r\n<environment/>\r\n\r
+environment/project/com.ti.ccstudio.buildDefinitions.MSP430.Debug.1079752688=<?xml version\="1.0" encoding\="UTF-8"?>\r\n<environment/>\r\n\r
+environment/project/com.ti.ccstudio.buildDefinitions.MSP430.Debug.1934951040=<?xml version\="1.0" encoding\="UTF-8"?>\r\n<environment/>\r\n\r
+environment/project/com.ti.ccstudio.buildDefinitions.MSP430.Debug.1976430675=<?xml version\="1.0" encoding\="UTF-8"?>\r\n<environment/>\r\n\r
+environment/project/com.ti.ccstudio.buildDefinitions.MSP430.Debug.2073861884=<?xml version\="1.0" encoding\="UTF-8"?>\r\n<environment/>\r\n\r
+environment/project/com.ti.ccstudio.buildDefinitions.MSP430.Debug.434572269=<?xml version\="1.0" encoding\="UTF-8"?>\r\n<environment/>\r\n\r
+environment/project/com.ti.ccstudio.buildDefinitions.MSP430.Debug.513051802=<?xml version\="1.0" encoding\="UTF-8"?>\r\n<environment/>\r\n\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/CC430F6137.ccxml b/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/CC430F6137.ccxml
new file mode 100755 (executable)
index 0000000..f2be62d
--- /dev/null
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>\r
+<configurations XML_version="1.2" id="configurations_0">\r
+    <configuration XML_version="1.2" id="configuration_0">\r
+        <instance XML_version="1.2" desc="TI MSP430 USB1" href="connections\TIMSP430-USB.xml" id="TI MSP430 USB1" xml="TIMSP430-USB.xml" xmlpath="connections"/>\r
+        <connection XML_version="1.2" id="TI MSP430 USB1">\r
+            <instance XML_version="1.2" href="drivers\msp430_emu.xml" id="drivers" xml="msp430_emu.xml" xmlpath="drivers"/>\r
+            <platform XML_version="1.2" id="platform_0">\r
+                <instance XML_version="1.2" desc="CC430F6137" href="Devices\CC430F6137.xml" id="CC430F6137" xml="CC430F6137.xml" xmlpath="Devices"/>\r
+            </platform>\r
+        </connection>\r
+    </configuration>\r
+</configurations>\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/bluerobin/BlueRobin_RX_433MHz.lib b/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/bluerobin/BlueRobin_RX_433MHz.lib
new file mode 100755 (executable)
index 0000000..5c81259
Binary files /dev/null and b/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/bluerobin/BlueRobin_RX_433MHz.lib differ
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/bluerobin/BlueRobin_RX_868MHz.lib b/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/bluerobin/BlueRobin_RX_868MHz.lib
new file mode 100755 (executable)
index 0000000..d14e7de
Binary files /dev/null and b/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/bluerobin/BlueRobin_RX_868MHz.lib differ
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/bluerobin/BlueRobin_RX_915MHz.lib b/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/bluerobin/BlueRobin_RX_915MHz.lib
new file mode 100755 (executable)
index 0000000..3057022
Binary files /dev/null and b/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/bluerobin/BlueRobin_RX_915MHz.lib differ
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/bluerobin/BlueRobin_RX_API.h b/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/bluerobin/BlueRobin_RX_API.h
new file mode 100755 (executable)
index 0000000..049c99f
--- /dev/null
@@ -0,0 +1,157 @@
+// *************************************************************************************************\r
+//\r
+// Copyright 2009 BM innovations GmbH (www.bm-innovations.com), all rights reserved.\r
+//\r
+// This trial version of the "BlueRobin(TM) receiver library for the Texas Instruments\r
+// CC430 SoC" may be used for non-profit non-commercial purposes only. If you want to use\r
+// BlueRobin(TM) in a commercial project, please contact the copyright holder for a\r
+// separate license agreement.\r
+//\r
+// By using this trial version of the "BlueRobin(TM) receiver library for the Texas Instruments\r
+// CC430 SoC", you implicitly agree that you will not modify, adapt, disassemble, decompile,\r
+// reverse engineer, translate or otherwise attempt to discover the source code of the\r
+// "BlueRobin(TM) receiver library for the Texas Instruments CC430 SoC".\r
+//\r
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY\r
+// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\r
+// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\r
+//\r
+// IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\r
+// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\r
+// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\r
+// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\r
+// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\r
+// THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+//\r
+// Public header for eZ430-Chronos specific BlueRobin(TM) receiver library.\r
+//\r
+// The following BlueRobin(TM) profiles are supported by this build\r
+//   - heart rate (HR) transmitter\r
+//\r
+// The following number of channels is supported: 1\r
+//\r
+// *************************************************************************************************\r
+//\r
+// BlueRobin(TM) packet size\r
+// -------------------------\r
+//\r
+//              * average packet rate   1 packet/875 msec = ~1.14 packets/second\r
+//              * payload per packet    5 bytes\r
+//\r
+// BlueRobin(TM) frequency overview\r
+// (Please note: Settings apply for the transmitter side, i.e. the USB dongle)\r
+// ----------------------------------------------------------------------\r
+//\r
+// Bluerobin_RX_433MHz.lib (433MHz ISM band)\r
+//\r
+//              * frequency                             433.30 MHz - 434.00 MHz\r
+//              * deviation                             95 kHz\r
+//              * channels                              3\r
+//              * data rate                             250 kBaud\r
+//\r
+// Bluerobin_RX_868MHz.lib (868MHz ISM band)\r
+//\r
+//              * frequency                             868.25 MHz - 868.95 MHz\r
+//              * deviation                             95 kHz\r
+//              * channels                              3\r
+//              * data rate                             250 kBaud\r
+//\r
+//\r
+// Bluerobin_RX_915MHz.lib (915MHz ISM band)\r
+//\r
+//              * frequency                             914.35 MHz - 917.75 MHz\r
+//              * deviation                             95 kHz\r
+//              * channels                              34\r
+//              * data rate                             250 kBaud\r
+//\r
+// *************************************************************************************************\r
+\r
+#ifndef BRRX_API_H_\r
+#define BRRX_API_H_\r
+\r
+// *************************************************************************************************\r
+// Include section\r
+\r
+// *************************************************************************************************\r
+// Defines section\r
+\r
+// List of all possible channel states\r
+typedef enum\r
+{\r
+    TX_OFF = 0,                 // Powerdown mode\r
+    TX_ACTIVE,                  // Active mode\r
+    TX_SEARCH                   // Search mode\r
+} brtx_state_t;\r
+\r
+// Transmitter to channel assignment\r
+#define HR_CHANNEL           (0)\r
+\r
+// *************************************************************************************************\r
+// API section\r
+\r
+// ----------------------------------------------------------\r
+// Functions for initializing and controlling the library\r
+\r
+// Initialize several global variables.\r
+void BRRX_Init_v(void);\r
+\r
+// Set delay after which a channel will be switched off if no new data can be received.\r
+// Param1: Powerdown delay in packet intervals (875 ms)\r
+void BRRX_SetPowerdownDelay_v(u8 Delay_u8);\r
+\r
+// Set timeout when searching for a transmitter\r
+// Param1: Search timeout in seconds\r
+void BRRX_SetSearchTimeout_v(u8 Timeout_u8);\r
+\r
+// Set reduction of valid signal level in learn mode.\r
+// Param1: Reduction of signal level\r
+void BRRX_SetSignalLevelReduction_v(u8 Reduction_u8);\r
+\r
+// Set ID for a channel. To search for an unknown transmitter the ID has to be set to 0.\r
+// Can be only executed on channels currently in powerdown mode.\r
+// Param1: Channel index\r
+// Param2: New ID\r
+void BRRX_SetID_v(u8 Index_u8, u32 ID_u32);\r
+\r
+// Get current ID of channel.\r
+// Return: Current ID of channel\r
+// Param1: Channel index\r
+u32 BRRX_GetID_u32(u8 Index_u8);\r
+\r
+// Start reception on one or all channels.\r
+// Param1: Channel index (use 0xFF to start all channels)\r
+void BRRX_Start_v(u8 Index_u8);\r
+\r
+// Stop reception on one or all channels.\r
+// Param1: Channel index (0xFF for all channels)\r
+void BRRX_Stop_v(u8 Index_u8);\r
+\r
+// Get current state of a channel\r
+// Param1: Channel index\r
+brtx_state_t BRRX_GetState_t(u8 Index_u8);\r
+\r
+// ----------------------------------------------------------\r
+// eZ430-Chronos specific functions\r
+\r
+// Get current heart rate.\r
+// Return: Heart rate in bpm\r
+u8 BRRX_GetHeartRate_u8(void);\r
+\r
+// Get current distance.\r
+// Return: Distance in 10m steps.\r
+u16 BRRX_GetDistance_u16(void);\r
+\r
+// Get current speed.\r
+// Return: Speed in 0.1km/h steps. Trial version is limited to 25.5km/h.\r
+u8 BRRX_GetSpeed_u8(void);\r
+\r
+// ----------------------------------------------------------\r
+// Radio-related functions\r
+\r
+// RX packet end service function\r
+// Must be called by CC1101_VECTOR ISR\r
+void BlueRobin_RadioISR_v(void);\r
+\r
+#endif                          /*BRRX_API_H_ */\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/bluerobin/bm.h b/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/bluerobin/bm.h
new file mode 100755 (executable)
index 0000000..781b1e1
--- /dev/null
@@ -0,0 +1,480 @@
+// *************************************************************************************************\r
+//\r
+// Copyright 2009 BM innovations GmbH (www.bm-innovations.com), all rights reserved.\r
+//\r
+// This trial version of the "BlueRobin(TM) receiver library for the Texas Instruments\r
+// CC430 SoC" may be used for non-profit non-commercial purposes only. If you want to use\r
+// BlueRobin(TM) in a commercial project, please contact the copyright holder for a\r
+// separate license agreement.\r
+//\r
+// By using this trial version of the "BlueRobin(TM) receiver library for the Texas Instruments\r
+// CC430 SoC", you implicitly agree that you will not modify, adapt, disassemble, decompile,\r
+// reverse engineer, translate or otherwise attempt to discover the source code of the\r
+// "BlueRobin(TM) receiver library for the Texas Instruments CC430 SoC".\r
+//\r
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY\r
+// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\r
+// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\r
+//\r
+// IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\r
+// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\r
+// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\r
+// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\r
+// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\r
+// THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+// Standard definitions, have to be included in every source and header file.\r
+// *************************************************************************************************\r
+\r
+#ifndef __BM_H\r
+#define __BM_H\r
+\r
+#if (defined __IAR_SYSTEMS_ASM) || (defined __IAR_SYSTEMS_ASM__)\r
+#    define _ASSEMBLER_USED_\r
+#endif\r
+\r
+#ifndef _ASSEMBLER_USED_\r
+#    include <stddef.h>\r
+#endif\r
+\r
+#ifndef FALSE\r
+// the classic false\r
+#    define FALSE (0 == 1)\r
+#endif\r
+\r
+#ifndef TRUE\r
+// the classic true\r
+#    define TRUE  (1 == 1)\r
+#endif\r
+\r
+#ifndef USE_RAW_ATTR\r
+// per default this feature is disabled\r
+#    define USE_RAW_ATTR FALSE\r
+#endif\r
+\r
+// *************************************************************************************************\r
+// First Section: Basic Data Types\r
+// *************************************************************************************************\r
+\r
+// Fundamental #definitions\r
+// CPU target idents are used for target dependent compilations\r
+\r
+// Texas Instruments MSP430\r
+#define _TI_MSP430_  (16)\r
+\r
+// Find the currently running compiler\r
+// and make the related #define's\r
+\r
+// _IAR_TID_                target ID from IAR compilers\r
+// _CPU_TID_                remap to enum of processor target numbers\r
+// _CPU_8BIT_INT_           type for 8 bit int\r
+// _CPU_16BIT_INT_          type for 16 bit int\r
+// _CPU_32BIT_INT_          type for 32 bit int\r
+// _CPU_32BIT_FLOAT_        type for 32 bit float\r
+// _CPU_64BIT_FLOAT_        type for 64 bit float\r
+// INTERRUPT                declares an interrupt service routine without an entry in the vector\r
+// table\r
+// ISR(vector)              declares an interrupt service routine which is added in vector table at\r
+// offset vector\r
+// MONITOR                  declares a function atomic\r
+// INTERRUPTS_ENABLE        remap to the intrinsic for enable interrupts\r
+// INTERRUPTS_DISABLE       remap to the intrinsic for disable interrupts\r
+// NO_OPERATION             remap to the intrinsic for no operation\r
+// _CPU_DIRECTION_OUT_1_    if TRUE the direction register indicates with an 1: direction is output\r
+// _CPU_EDGE_HIGH_LOW_1_    if TRUE the edge select register indicates with an 1: trigger on high\r
+// low\r
+// NO_INIT                  declare a variable as not initialized\r
+// INLINE_FUNC              declare a function as inline for release builds\r
+\r
+#if ((defined __IAR_SYSTEMS_ICC) || (defined __IAR_SYSTEMS_ASM)) && (__IAR_SYSTEMS_ICC__ < 2)\r
+// Found IAR Compiler with classic IAR frontend\r
+#    ifndef _IAR_TID_\r
+#        define _IAR_TID_ ((__TID__ >> 8) & 0x7f)\r
+#    endif\r
+\r
+#    define INTERRUPT   interrupt\r
+#    define ISR(vector) interrupt[(vector)]\r
+#    define MONITOR     monitor\r
+\r
+#    if ((_IAR_TID_) == 43)\r
+// Found Texas Instruments MSP430 CPU\r
+#        define _CPU_TID_             _TI_MSP430_\r
+#        define _CPU_DIRECTION_OUT_1_ TRUE\r
+#        define _CPU_EDGE_HIGH_LOW_1_ TRUE\r
+#        define INTERRUPTS_ENABLE()   _EINT()\r
+// WA for HW bug, add a NOP\r
+#        define INTERRUPTS_DISABLE()  { _DINT(); _NOP(); }\r
+#        define NO_OPERATION()        _NOP()\r
+\r
+#    else\r
+#        error "Unknown IAR Compiler, the file bm.h has to be expanded !"\r
+#    endif\r
+\r
+#elif defined __IAR_SYSTEMS_ICC__\r
+// Found IAR Compiler with EDG frontend\r
+#    define _IAR_TID_ ((__TID__ >> 8) & 0x7f)\r
+\r
+#    if USE_RAW_ATTR == TRUE\r
+// Use the raw attribute in ISR's\r
+#        define _RAW __raw\r
+#    else\r
+// Empty define RAW as it is not used\r
+#        define _RAW\r
+#    endif\r
+#    define INTERRUPT   _RAW __interrupt\r
+#    define MONITOR     __monitor\r
+#    define NO_INIT     __no_init\r
+#    define INTERRUPTS_ENABLE()   __enable_interrupt()\r
+#    define INTERRUPTS_DISABLE()  __disable_interrupt()\r
+#    define NO_OPERATION()        __no_operation()\r
+\r
+#    ifndef DEBUG\r
+// Force inlining of function in release builds\r
+#        define INLINE_FUNC PRAGMA(inline = forced)\r
+#    else\r
+// Do not force inlining of function in debug builds\r
+#        define INLINE_FUNC\r
+#    endif\r
+\r
+#    if (!defined CODECHECK) && (!defined __DA_C__)\r
+// Define to a new way of using #pragmas in preprocessor\r
+#        define PRAGMA(x) _Pragma(# x)\r
+#        define ISR(x) PRAGMA(vector = (x)) INTERRUPT\r
+#    endif\r
+\r
+#    if ((_IAR_TID_) == 43)\r
+// Found Texas Instruments MSP430 CPU  (V2)\r
+#        define _CPU_TID_             _TI_MSP430_\r
+#        define _CPU_DIRECTION_OUT_1_ TRUE\r
+#        define _CPU_EDGE_HIGH_LOW_1_ TRUE\r
+#        define _CPU_64BIT_INT_       long long\r
+#        if __VER__ < 220\r
+// WA for HW bug, add a nop after DINT, Compiler has a bugfix since version 2.20\r
+#            undef  INTERRUPTS_DISABLE\r
+#            define INTERRUPTS_DISABLE()  { __disable_interrupt(); __no_operation(); }\r
+#        endif\r
+\r
+#    else\r
+#        error "Unknown new IAR Compiler, the file bm.h has to be expanded !"\r
+#    endif\r
+\r
+#elif defined __CCE__\r
+// Found CCE Compiler\r
+#    define INTERRUPT   __interrupt\r
+#    define MONITOR             // __monitor\r
+#    define NO_INIT     __no_init\r
+#    define INTERRUPTS_ENABLE()   __enable_interrupt()\r
+#    define INTERRUPTS_DISABLE()  __disable_interrupt()\r
+#    define NO_OPERATION()        __no_operation()\r
+\r
+#    ifndef DEBUG\r
+// Force inlining of function in release builds\r
+#        define INLINE_FUNC PRAGMA(inline = forced)\r
+#    else\r
+// Do not force inlining of function in debug builds\r
+#        define INLINE_FUNC\r
+#    endif\r
+\r
+// Found Texas Instruments MSP430 CPU  (V2)\r
+#    define _CPU_TID_             _TI_MSP430_\r
+#    define _CPU_DIRECTION_OUT_1_ TRUE\r
+#    define _CPU_EDGE_HIGH_LOW_1_ TRUE\r
+//#define _CPU_64BIT_INT_       long long\r
+\r
+//  #endif\r
+\r
+#else\r
+#    error "Unknown Compiler, the file bm.h has to be expanded !"\r
+#endif\r
+\r
+#ifndef _ASSEMBLER_USED_\r
+// Get the limits to autodetect the size of integral types\r
+#    include <limits.h>\r
+// Get floats to autodetect the size of float types\r
+#    include <float.h>\r
+\r
+// ***********************************************************************************************\r
+//\r
+// Common basic data types\r
+//\r
+// ***********************************************************************************************\r
+#    if UCHAR_MAX == 0xFFu\r
+#        define _CPU_8BIT_INT_ char\r
+#    else\r
+#        error "unable to get size of u8 automatically"\r
+#    endif\r
+\r
+#    if USHRT_MAX == 0xFFFFu\r
+#        define _CPU_16BIT_INT_ short\r
+#    elif UINT_MAX == 0xFFFFu\r
+#        define _CPU_16BIT_INT_ int\r
+#    else\r
+#        error "unable to get size of u16 automatically"\r
+#    endif\r
+\r
+#    if USHRT_MAX == 0xFFFFFFFFu\r
+#        define _CPU_32BIT_INT_ short\r
+#    elif UINT_MAX == 0xFFFFFFFFu\r
+#        define _CPU_32BIT_INT_ int\r
+#    elif ULONG_MAX == 0xFFFFFFFFu\r
+#        define _CPU_32BIT_INT_ long\r
+#    else\r
+#        error "unable to get size of u32 automatically"\r
+#    endif\r
+\r
+#    ifdef __IAR_SYSTEMS_ICC__\r
+#        if __IAR_SYSTEMS_ICC__ > 1\r
+#            define _CPU_32BIT_FLOAT_ float\r
+#            if __DOUBLE_SIZE__ == 8\r
+#                define _CPU_64BIT_FLOAT_ double\r
+#            endif\r
+#        endif\r
+#    endif\r
+\r
+#    ifndef _CPU_32BIT_FLOAT_\r
+#        if FLT_MANT_DIG == 24\r
+#            define _CPU_32BIT_FLOAT_ float\r
+#        elif DBL_MANT_DIG == 24\r
+#            define _CPU_32BIT_FLOAT_ double\r
+#        else\r
+#            error "unable to get size of f32 automatically"\r
+#        endif\r
+\r
+#        if DBL_MANT_DIG == 53\r
+#            define _CPU_64BIT_FLOAT_ double\r
+#        endif\r
+#    endif\r
+\r
+// ***********************************************************************************************\r
+//\r
+// Following lines #typedef the basic data types in a compiler independent way.\r
+//\r
+// ***********************************************************************************************\r
+\r
+#    ifdef _CPU_8BIT_INT_\r
+// unsigned 8 bit\r
+typedef unsigned _CPU_8BIT_INT_ u8;\r
+// unsigned 8 bit max value\r
+#        define U8_MAX (0xFFU)\r
+// signed 8 bit max value\r
+typedef signed _CPU_8BIT_INT_ s8;\r
+// signed 8 bit min value\r
+#        define S8_MIN (-127 - 1)\r
+// signed 8 bit max value\r
+#        define S8_MAX (127)\r
+#    endif\r
+\r
+#    ifdef _CPU_16BIT_INT_\r
+// unsigned 16 bit\r
+typedef unsigned _CPU_16BIT_INT_ u16;\r
+// unsigned 16 bit max value\r
+#        define U16_MAX (0xFFFFU)\r
+// signed 16 bit\r
+typedef signed _CPU_16BIT_INT_ s16;\r
+// signed 16 bit min value\r
+#        define S16_MIN (-32767 - 1)\r
+// signed 16 bit max value\r
+#        define S16_MAX (32767)\r
+#    endif\r
+\r
+#    ifdef _CPU_32BIT_INT_\r
+// unsigned 32 bit\r
+typedef unsigned _CPU_32BIT_INT_ u32;\r
+// unsigned 32 bit max value\r
+#        define U32_MAX (0xFFFFFFFFUL)\r
+// signed 32 bit\r
+typedef signed _CPU_32BIT_INT_ s32;\r
+// signed 32 bit min value\r
+#        define S32_MIN (-2147483647L - 1L)\r
+// signed 32 bit max value\r
+#        define S32_MAX (2147483647L)\r
+#    endif\r
+\r
+#    ifdef _CPU_64BIT_INT_\r
+// unsigned 64 bit\r
+typedef unsigned _CPU_64BIT_INT_ u64;\r
+// signed 64 bit\r
+typedef signed _CPU_64BIT_INT_ s64;\r
+#    endif\r
+\r
+#    ifdef _CPU_32BIT_FLOAT_\r
+// float 32 bit\r
+typedef _CPU_32BIT_FLOAT_ f32;\r
+// number of digits in mantissa of f32\r
+#        define F32_MANT_DIG   (24)\r
+// epsilon for f32\r
+#        define F32_EPSILON    (1.192092896e-07)\r
+// number of digits of precision of f32\r
+#        define F32_DIG        (6)\r
+// exponent min of f32\r
+#        define F32_MIN_EXP    (-125)\r
+// min positive value of f32\r
+#        define F32_MIN        (1.175494351e-38)\r
+// decimal exponent min of f32\r
+#        define F32_MIN_10_EXP (-37)\r
+// exponent max of f32\r
+#        define F32_MAX_EXP    (128)\r
+// max value of f32\r
+#        define F32_MAX        (3.402823466e+38)\r
+// decimal exponent max of f32\r
+#        define F32_MAX_10_EXP (38)\r
+#    endif\r
+\r
+#    ifdef _CPU_64BIT_FLOAT_\r
+// float 64 bit\r
+typedef _CPU_64BIT_FLOAT_ f64;\r
+// number of digits in mantissa of f64\r
+#        define F64_MANT_DIG   (53)\r
+// epsilon for f64\r
+#        define F64_EPSILON    (2.2204460492503131e-016)\r
+// number of digits of precision of f64\r
+#        define F64_DIG        (15)\r
+// exponent min of f64\r
+#        define F64_MIN_EXP    (-1021)\r
+// min positive value of f64\r
+#        define F64_MIN        (2.2250738585072014e-308)\r
+// decimal exponent min of f64\r
+#        define F64_MIN_10_EXP (-307)\r
+// exponent max of f64\r
+#        define F64_MAX_EXP    (1024)\r
+// max value of f64\r
+#        define F64_MAX        (1.7976931348623158e+308)\r
+// decimal exponent max of f64\r
+#        define F64_MAX_10_EXP (308)\r
+#    endif\r
+\r
+typedef unsigned char BYTE;\r
+typedef unsigned int WORD;\r
+typedef unsigned long DWORD;\r
+\r
+#endif                          // _ASSMEBLER_USED_\r
+\r
+// A macro that calculates the number of bits of a given type\r
+#ifndef BITSIZEOF\r
+#    define BITSIZEOF(type) (sizeof(type) * CHAR_BIT)\r
+#endif\r
+\r
+/* A macro that generates a bit mask according to a given bit number.\r
+ * Example:\r
+ * - BIT(0) expands to 1 (== 0x01)\r
+ * - BIT(3) expands to 8 (== 0x08)\r
+ */\r
+#define BIT(x) (1uL << (x))\r
+\r
+/* A macro that generates a bit mask according to a given bit number with a cast to type.\r
+ * The difference to BIT(X) is the additional type argument T that is used to cast the type of the\r
+ * constant 1 and the type of the result as well.\r
+ * Example:\r
+ * - BIT_T(u8,0)  expands to (u8)1  (== 0x01)\r
+ * - BIT_T(u32,3) expands to (u32)8 (== 0x08L)\r
+ */\r
+#define BIT_T(t, x) ((t)((t)1 << (x)))\r
+\r
+/* A macro to calculate the position of the highest bit.\r
+ * The result is same as LOG2 in case only one bit is set. Use with constant values only because\r
+ * of code size.\r
+ */\r
+#define BIT_HIGHEST(Input_u32) (     \\r
+        ((Input_u32) & BIT(31)) ? 31 : ( \\r
+            ((Input_u32) & BIT(30)) ? 30 : ( \\r
+                ((Input_u32) & BIT(29)) ? 29 : ( \\r
+                    ((Input_u32) & BIT(28)) ? 28 : ( \\r
+                        ((Input_u32) & BIT(27)) ? 27 : ( \\r
+                            ((Input_u32) & BIT(26)) ? 26 : ( \\r
+                                ((Input_u32) & BIT(25)) ? 25 : ( \\r
+                                    ((Input_u32) & BIT(24)) ? 24 : ( \\r
+                                        ((Input_u32) & BIT(23)) ? 23 : ( \\r
+                                            ((Input_u32) & BIT(22)) ? 22 : ( \\r
+                                                ((Input_u32) & BIT(21)) ? 21 : ( \\r
+                                                    ((Input_u32) & BIT(20)) ? 20 : ( \\r
+                                                        ((Input_u32) & BIT(19)) ? 19 : ( \\r
+                                                            ((Input_u32) & BIT(18)) ? 18 : ( \\r
+                                                                ((Input_u32) & BIT(17)) ? 17 : ( \\r
+                                                                    ((Input_u32) & BIT(16)) ? 16 : ( \\r
+                                                                        ((Input_u32) & \\r
+                                                                         BIT(15)) ? 15 : ( \\r
+                                                                            ((Input_u32) & \\r
+                                                                             BIT(14)) ? 14 : ( \\r
+                                                                                ((Input_u32) & \\r
+                                                                                 BIT(13)) ? 13 : ( \\r
+                                                                                    ((Input_u32) & \\r
+                                                                                     BIT(12)) ? 12 \\r
+                                                                                    : ( \\r
+                                                                                        ((Input_u32) \\r
+                                                                                         & BIT(11)) \\r
+                                                                                        ? 11 : ( \\r
+                                                                                            (( \\r
+                                                                                                 Input_u32) \\r
+                                                                                             & BIT( \\r
+                                                                                                 10)) ? 10 : ( \\r
+                                                                                                (( \\r
+                                                                                                     Input_u32) \\r
+                                                                                                 & \\r
+                                                                                                 BIT(9)) ?  9 : ( \\r
+                                                                                                    (( \\r
+                                                                                                         Input_u32) \\r
+                                                                                                     & \\r
+                                                                                                     BIT(8)) ?  8 : ( \\r
+                                                                                                        (( \\r
+                                                                                                             Input_u32) \\r
+                                                                                                         & \\r
+                                                                                                         BIT(7)) ?  7 : ( \\r
+                                                                                                            (( \\r
+                                                                                                                 Input_u32) \\r
+                                                                                                             & \\r
+                                                                                                             BIT(6)) ?  6 : ( \\r
+                                                                                                                (( \\r
+                                                                                                                     Input_u32) \\r
+                                                                                                                 & \\r
+                                                                                                                 BIT(5)) ?  5 : ( \\r
+                                                                                                                    (( \\r
+                                                                                                                         Input_u32) \\r
+                                                                                                                     & \\r
+                                                                                                                     BIT(4)) ?  4 : ( \\r
+                                                                                                                        (( \\r
+                                                                                                                             Input_u32) \\r
+                                                                                                                         & \\r
+                                                                                                                         BIT(3)) ?  3 : ( \\r
+                                                                                                                            (( \\r
+                                                                                                                                 Input_u32) \\r
+                                                                                                                             & \\r
+                                                                                                                             BIT(2)) ?  2 : ( \\r
+                                                                                                                                (( \\r
+                                                                                                                                     Input_u32) \\r
+                                                                                                                                 & \\r
+                                                                                                                                 BIT(1)) ?  1 : ( \\r
+                                                                                                                                    (( \\r
+                                                                                                                                         Input_u32) \\r
+                                                                                                                                     & \\r
+                                                                                                                                     BIT(0)) ?  0 :  -1uL))))))))))))))))))))))))))))))))\r
+\r
+#ifndef MONITOR\r
+#    define MONITOR\r
+#endif\r
+\r
+#ifndef NO_INIT\r
+#    define NO_INIT\r
+#endif\r
+\r
+#ifndef INTERRUPT\r
+#    define INTERRUPT\r
+#endif\r
+\r
+#ifndef ISR\r
+#    define ISR(ignore)\r
+#endif\r
+\r
+#ifndef INLINE_FUNC\r
+#    define INLINE_FUNC\r
+#endif\r
+\r
+#ifndef INTERRUPTS_ENABLE\r
+#    define INTERRUPTS_ENABLE()\r
+#endif\r
+\r
+#ifndef INTERRUPTS_DISABLE\r
+#    define INTERRUPTS_DISABLE()\r
+#endif\r
+\r
+#endif                          // __BM_H\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/change_record.txt b/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/change_record.txt
new file mode 100755 (executable)
index 0000000..d1dccb2
--- /dev/null
@@ -0,0 +1,35 @@
+V1.6 (21.11.2010)\r
+Fixed following bugs\r
+- rfsimpliciti.c/simpliciti_sync_decode_ap_cmd_callback(),\r
+- timer.c/TIMER0_A0_ISR()                                                      LCD shows "done" after successfully received data                                                       \r
+- main.c/wakeup_event(),       \r
+- rfbsl.c/sx_rfbsl()                                                           rfBSL requires two button presses in order to update watch \r
+- timer.c/Timer0_A3_Start()                                                    Fixed register read (Asynchronous)\r
+- timer.c/Timer0_A4_Delay()                                                    Fixed register read (Asynchronous)\r
+                                                                                               Avoid unwanted flag changes caused by interrupt methods\r
+- port.c/PORT2_ISR() and timer.c/TIMER0_A0_ISR()       Changes the menu if the pressed time from STAR or NUM button are between "short(50ms)" and "long(3s)" \r
+                                                                                                       The backlight stays 3 seconds on\r
+- display.c                                                                            Removed file display1.c. The content is now in display.c \r
+- display.h                                                                            Fixed LCD_UNIT_L1_PER_S_MASK bit                \r
+                                                                                       \r
+Other changes:\r
+- DCO settling time                                                                    Set to 375000 cycles\r
\r
+__________________________________________________________________________________________________________________________________________________\r
+V1.5 (16.03.2010)\r
+Fixed following bugs\r
+- main.c/init_application()                                                    Changed XT1 drive level to highest to avoid ACLK noise when turning on backlight.\r
+- main.c/wakeup_event(), timer.c/TIMER0_A0_ISR()       Modified key lock procedure.\r
+- vti_ps.c/ps_get_temp()                                                       Negative °C are now converted correctly to Kelvin\r
+\r
+Other changes\r
+- main.c/read_calibration_values()                                     Added range check for rf_frequoffset variable\r
+                                                                                                       Added bytes for altitude offset correction and s/w version\r
+- altitude.h, altitude.c                                                       Added initial altitude offset correction \r
+- SimpliciTI                                                                           Added SimpliciTI sources to project. Upgraded to Version 1.1.1.\r
+- RFBSL                                                                                                Added wireless update support\r
+- Button names                                                                         Changed button names from M1/M2/S1/S2/BL to STAR/NUM/UP/DOWN/BACKLIGHT\r
+\r
+__________________________________________________________________________________________________________________________________________________                                                                                                     \r
+V1.4 (22.11.2009)\r
+First version released to manufacturing.
\ No newline at end of file
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/driver/adc12.c b/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/driver/adc12.c
new file mode 100755 (executable)
index 0000000..07f13cc
--- /dev/null
@@ -0,0 +1,164 @@
+// *************************************************************************************************\r
+//\r
+//      Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//        Redistribution and use in source and binary forms, with or without\r
+//        modification, are permitted provided that the following conditions\r
+//        are met:\r
+//\r
+//          Redistributions of source code must retain the above copyright\r
+//          notice, this list of conditions and the following disclaimer.\r
+//\r
+//          Redistributions in binary form must reproduce the above copyright\r
+//          notice, this list of conditions and the following disclaimer in the\r
+//          documentation and/or other materials provided with the\r
+//          distribution.\r
+//\r
+//          Neither the name of Texas Instruments Incorporated nor the names of\r
+//          its contributors may be used to endorse or promote products derived\r
+//          from this software without specific prior written permission.\r
+//\r
+//        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+// ADC12 functions.\r
+// *************************************************************************************************\r
+\r
+// *************************************************************************************************\r
+// Include section\r
+\r
+// system\r
+#include <project.h>\r
+\r
+// driver\r
+#include "adc12.h"\r
+#include "timer.h"\r
+\r
+// *************************************************************************************************\r
+// Prototypes section\r
+\r
+// *************************************************************************************************\r
+// Defines section\r
+\r
+// *************************************************************************************************\r
+// Global Variable section\r
+u16 adc12_result;\r
+u8 adc12_data_ready;\r
+\r
+// *************************************************************************************************\r
+// Extern section\r
+\r
+// *************************************************************************************************\r
+// @fn          adc12_single_conversion\r
+// @brief       Init ADC12.      Do single conversion. Turn off ADC12.\r
+// @param       u16 ref                  Select reference\r
+//                              u16 sht          Sample-and-hold time\r
+//                              u16 channel      Channel of the conversion\r
+// @return      u16 adc12_result Return ADC result\r
+// *************************************************************************************************\r
+u16 adc12_single_conversion(u16 ref, u16 sht, u16 channel)\r
+{\r
+    // Initialize the shared reference module\r
+    REFCTL0 |= REFMSTR + ref + REFON;   // Enable internal reference (1.5V or 2.5V)\r
+\r
+    // Initialize ADC12_A\r
+    ADC12CTL0 = sht + ADC12ON;          // Set sample time\r
+    ADC12CTL1 = ADC12SHP;               // Enable sample timer\r
+    ADC12MCTL0 = ADC12SREF_1 + channel; // ADC input channel\r
+    ADC12IE = 0x001;                    // ADC_IFG upon conv result-ADCMEMO\r
+\r
+    // Wait 2 ticks (66us) to allow internal reference to settle\r
+    Timer0_A4_Delay(2);\r
+\r
+    // Start ADC12\r
+    ADC12CTL0 |= ADC12ENC;\r
+\r
+    // Clear data ready flag\r
+    adc12_data_ready = 0;\r
+\r
+    // Sampling and conversion start\r
+    ADC12CTL0 |= ADC12SC;\r
+\r
+    // Delay to get next ADC value\r
+    Timer0_A4_Delay(5);\r
+    while (!adc12_data_ready) ;\r
+\r
+    // Shut down ADC12\r
+    ADC12CTL0 &= ~(ADC12ENC | ADC12SC | sht);\r
+    ADC12CTL0 &= ~ADC12ON;\r
+\r
+    // Shut down reference voltage\r
+    REFCTL0 &= ~(REFMSTR + ref + REFON);\r
+\r
+    ADC12IE = 0;\r
+\r
+    // Return ADC result\r
+    return (adc12_result);\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          ADC12ISR\r
+// @brief       Store ADC12 conversion result. Set flag to indicate data ready.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+#pragma vector=ADC12_VECTOR\r
+__interrupt void ADC12ISR(void)\r
+{\r
+    switch (__even_in_range(ADC12IV, 34))\r
+    {\r
+        case 0:\r
+            break;                    // Vector  0:  No interrupt\r
+        case 2:\r
+            break;                    // Vector  2:  ADC overflow\r
+        case 4:\r
+            break;                    // Vector  4:  ADC timing overflow\r
+        case 6:                       // Vector  6:  ADC12IFG0\r
+            adc12_result = ADC12MEM0; // Move results, IFG is cleared\r
+            adc12_data_ready = 1;\r
+            _BIC_SR_IRQ(LPM3_bits);   // Exit active CPU\r
+            break;\r
+        case 8:\r
+            break;                    // Vector  8:  ADC12IFG1\r
+        case 10:\r
+            break;                    // Vector 10:  ADC12IFG2\r
+        case 12:\r
+            break;                    // Vector 12:  ADC12IFG3\r
+        case 14:\r
+            break;                    // Vector 14:  ADC12IFG4\r
+        case 16:\r
+            break;                    // Vector 16:  ADC12IFG5\r
+        case 18:\r
+            break;                    // Vector 18:  ADC12IFG6\r
+        case 20:\r
+            break;                    // Vector 20:  ADC12IFG7\r
+        case 22:\r
+            break;                    // Vector 22:  ADC12IFG8\r
+        case 24:\r
+            break;                    // Vector 24:  ADC12IFG9\r
+        case 26:\r
+            break;                    // Vector 26:  ADC12IFG10\r
+        case 28:\r
+            break;                    // Vector 28:  ADC12IFG11\r
+        case 30:\r
+            break;                    // Vector 30:  ADC12IFG12\r
+        case 32:\r
+            break;                    // Vector 32:  ADC12IFG13\r
+        case 34:\r
+            break;                    // Vector 34:  ADC12IFG14\r
+        default:\r
+            break;\r
+    }\r
+}\r
+\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/driver/adc12.h b/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/driver/adc12.h
new file mode 100755 (executable)
index 0000000..90fc327
--- /dev/null
@@ -0,0 +1,57 @@
+// *************************************************************************************************\r
+//\r
+//      Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//        Redistribution and use in source and binary forms, with or without\r
+//        modification, are permitted provided that the following conditions\r
+//        are met:\r
+//\r
+//          Redistributions of source code must retain the above copyright\r
+//          notice, this list of conditions and the following disclaimer.\r
+//\r
+//          Redistributions in binary form must reproduce the above copyright\r
+//          notice, this list of conditions and the following disclaimer in the\r
+//          documentation and/or other materials provided with the\r
+//          distribution.\r
+//\r
+//          Neither the name of Texas Instruments Incorporated nor the names of\r
+//          its contributors may be used to endorse or promote products derived\r
+//          from this software without specific prior written permission.\r
+//\r
+//        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+\r
+#ifndef ADC12_H_\r
+#define ADC12_H_\r
+\r
+// *************************************************************************************************\r
+// Include section\r
+\r
+// *************************************************************************************************\r
+// Prototypes section\r
+extern u16 adc12_single_conversion(u16 ref, u16 sht, u16 channel);\r
+\r
+// *************************************************************************************************\r
+// Defines section\r
+\r
+// *************************************************************************************************\r
+// Global Variable section\r
+extern u16 adc12_result;\r
+extern u8 adc12_data_ready;\r
+\r
+// *************************************************************************************************\r
+// Extern section\r
+\r
+#endif                          /*ADC12_H_ */\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/driver/buzzer.c b/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/driver/buzzer.c
new file mode 100755 (executable)
index 0000000..ec5df8b
--- /dev/null
@@ -0,0 +1,220 @@
+// *************************************************************************************************\r
+//\r
+//      Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//        Redistribution and use in source and binary forms, with or without\r
+//        modification, are permitted provided that the following conditions\r
+//        are met:\r
+//\r
+//          Redistributions of source code must retain the above copyright\r
+//          notice, this list of conditions and the following disclaimer.\r
+//\r
+//          Redistributions in binary form must reproduce the above copyright\r
+//          notice, this list of conditions and the following disclaimer in the\r
+//          documentation and/or other materials provided with the\r
+//          distribution.\r
+//\r
+//          Neither the name of Texas Instruments Incorporated nor the names of\r
+//          its contributors may be used to endorse or promote products derived\r
+//          from this software without specific prior written permission.\r
+//\r
+//        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+// Buzzer functions.\r
+// *************************************************************************************************\r
+\r
+// *************************************************************************************************\r
+// Include section\r
+\r
+// system\r
+#include "project.h"\r
+\r
+// driver\r
+#include "buzzer.h"\r
+#include "timer.h"\r
+#include "display.h"\r
+\r
+// logic\r
+\r
+// *************************************************************************************************\r
+// Prototypes section\r
+void toggle_buzzer(void);\r
+void countdown_buzzer(void);\r
+\r
+// *************************************************************************************************\r
+// Defines section\r
+\r
+// *************************************************************************************************\r
+// Global Variable section\r
+struct buzzer sBuzzer;\r
+\r
+// *************************************************************************************************\r
+// Extern section\r
+//extern u16 timer0_A3_ticks_g;\r
+\r
+// *************************************************************************************************\r
+// @fn          reset_buzzer\r
+// @brief       Init buzzer variables\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void reset_buzzer(void)\r
+{\r
+    sBuzzer.time = 0;\r
+    sBuzzer.state = BUZZER_OFF;\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          start_buzzer\r
+// @brief       Start buzzer output for a number of cylces\r
+// @param       u8 cycles               Keep buzzer output for number of cycles\r
+//                              u16 on_time     Output buzzer for "on_time" ACLK ticks\r
+//                              u16 off_time    Do not output buzzer for "off_time" ACLK ticks\r
+// @return      none\r
+// *************************************************************************************************\r
+void start_buzzer(u8 cycles, u16 on_time, u16 off_time)\r
+{\r
+    // Store new buzzer duration while buzzer is off\r
+    if (sBuzzer.time == 0)\r
+    {\r
+        sBuzzer.time = cycles;\r
+        sBuzzer.on_time = on_time;\r
+        sBuzzer.off_time = off_time;\r
+\r
+        // Need to init every time, because SimpliciTI claims same timer\r
+\r
+        // Reset TA1R, set up mode, TA1 runs from 32768Hz ACLK\r
+        TA1CTL = TACLR | MC_1 | TASSEL__ACLK;\r
+\r
+        // Set PWM frequency\r
+        TA1CCR0 = BUZZER_TIMER_STEPS;\r
+\r
+        // Enable IRQ, set output mode "toggle"\r
+        TA1CCTL0 = OUTMOD_4;\r
+\r
+        // Allow buzzer PWM output on P2.7\r
+        P2SEL |= BIT7;\r
+\r
+        // Activate Timer0_A3 periodic interrupts\r
+        fptr_Timer0_A3_function = toggle_buzzer;\r
+        Timer0_A3_Start(sBuzzer.on_time);\r
+\r
+        // Preload timer advance variable\r
+        sTimer.timer0_A3_ticks = sBuzzer.off_time;\r
+\r
+        // Start with buzzer output on\r
+        sBuzzer.state = BUZZER_ON_OUTPUT_ENABLED;\r
+    }\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          toggle_buzzer\r
+// @brief       Keeps track of buzzer on/off duty cycle\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void toggle_buzzer(void)\r
+{\r
+    // Turn off buzzer\r
+    if (sBuzzer.state == BUZZER_ON_OUTPUT_ENABLED)\r
+    {\r
+        // Stop PWM timer\r
+        TA1CTL &= ~(BIT4 | BIT5);\r
+\r
+        // Reset and disable buzzer PWM output\r
+        P2OUT &= ~BIT7;\r
+        P2SEL &= ~BIT7;\r
+\r
+        // Update buzzer state\r
+        sBuzzer.state = BUZZER_ON_OUTPUT_DISABLED;\r
+\r
+        // Reload Timer0_A4 IRQ to restart output\r
+        sTimer.timer0_A3_ticks = sBuzzer.on_time;\r
+    }\r
+    else                        // Turn on buzzer\r
+    {\r
+        // Decrement buzzer total cycles\r
+        countdown_buzzer();\r
+\r
+        // Reload Timer0_A4 to stop output if sBuzzer.time > 0\r
+        if (sBuzzer.state != BUZZER_OFF)\r
+        {\r
+            // Reset timer TA1\r
+            TA1R = 0;\r
+            TA1CTL |= MC_1;\r
+\r
+            // Enable buzzer PWM output\r
+            P2SEL |= BIT7;\r
+\r
+            // Update buzzer state\r
+            sBuzzer.state = BUZZER_ON_OUTPUT_ENABLED;\r
+\r
+            // Reload Timer0_A4 IRQ to turn off output\r
+            sTimer.timer0_A3_ticks = sBuzzer.off_time;\r
+        }\r
+    }\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          stop_buzzer\r
+// @brief       Stop buzzer output\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void stop_buzzer(void)\r
+{\r
+    // Stop PWM timer\r
+    TA1CTL &= ~(BIT4 | BIT5);\r
+\r
+    // Disable buzzer PWM output\r
+    P2OUT &= ~BIT7;\r
+    P2SEL &= ~BIT7;\r
+\r
+    // Clear PWM timer interrupt\r
+    TA1CCTL0 &= ~CCIE;\r
+\r
+    // Disable periodic start/stop interrupts\r
+    Timer0_A3_Stop();\r
+\r
+    // Clear variables\r
+    reset_buzzer();\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          is_buzzer\r
+// @brief       Check if buzzer is operating\r
+// @param       none\r
+// @return      u8              1 = Buzzer is operating, 0 = Buzzer is off\r
+// *************************************************************************************************\r
+u8 is_buzzer(void)\r
+{\r
+    return (sBuzzer.state != BUZZER_OFF);\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          countdown_buzzer\r
+// @brief       Decrement active buzzer time. Turn off buzzer if cycle end reached.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void countdown_buzzer(void)\r
+{\r
+    // Stop buzzer when reaching 0 cycles\r
+    if (--sBuzzer.time == 0)\r
+    {\r
+        stop_buzzer();\r
+    }\r
+}\r
+\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/driver/buzzer.h b/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/driver/buzzer.h
new file mode 100755 (executable)
index 0000000..59fbba9
--- /dev/null
@@ -0,0 +1,87 @@
+// *************************************************************************************************\r
+//\r
+//      Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//        Redistribution and use in source and binary forms, with or without\r
+//        modification, are permitted provided that the following conditions\r
+//        are met:\r
+//\r
+//          Redistributions of source code must retain the above copyright\r
+//          notice, this list of conditions and the following disclaimer.\r
+//\r
+//          Redistributions in binary form must reproduce the above copyright\r
+//          notice, this list of conditions and the following disclaimer in the\r
+//          documentation and/or other materials provided with the\r
+//          distribution.\r
+//\r
+//          Neither the name of Texas Instruments Incorporated nor the names of\r
+//          its contributors may be used to endorse or promote products derived\r
+//          from this software without specific prior written permission.\r
+//\r
+//        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+\r
+#ifndef BUZZER_H_\r
+#define BUZZER_H_\r
+\r
+// *************************************************************************************************\r
+// Include section\r
+\r
+// *************************************************************************************************\r
+// Prototypes section\r
+extern void reset_buzzer(void);\r
+extern void start_buzzer(u8 cycles, u16 on_time, u16 off_time);\r
+extern void stop_buzzer(void);\r
+extern void toggle_buzzer(void);\r
+extern u8 is_buzzer(void);\r
+extern void countdown_buzzer(void);\r
+\r
+// *************************************************************************************************\r
+// Defines section\r
+\r
+// Buzzer states\r
+#define BUZZER_OFF                                                      (0u)\r
+#define BUZZER_ON_OUTPUT_DISABLED                       (1u)\r
+#define BUZZER_ON_OUTPUT_ENABLED                        (2u)\r
+\r
+// Buzzer output signal frequency = 32,768kHz/(BUZZER_TIMER_STEPS+1)/2 = 2.7kHz\r
+#define BUZZER_TIMER_STEPS                                      (5u)\r
+\r
+// Buzzer on time\r
+#define BUZZER_ON_TICKS                                         (CONV_MS_TO_TICKS(20))\r
+\r
+// Buzzer off time\r
+#define BUZZER_OFF_TICKS                                        (CONV_MS_TO_TICKS(200))\r
+\r
+// *************************************************************************************************\r
+// Global Variable section\r
+struct buzzer\r
+{\r
+    // Keep output for "time" seconds\r
+    u8 time;\r
+\r
+    // On/off duty\r
+    u16 on_time;\r
+    u16 off_time;\r
+\r
+    // Current buzzer output state\r
+    u8 state;\r
+};\r
+extern struct buzzer sBuzzer;\r
+\r
+// *************************************************************************************************\r
+// Extern section\r
+\r
+#endif                          /*BUZZER_H_ */\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/driver/display.c b/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/driver/display.c
new file mode 100755 (executable)
index 0000000..c249f04
--- /dev/null
@@ -0,0 +1,759 @@
+// *************************************************************************************************\r
+//\r
+//      Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//        Redistribution and use in source and binary forms, with or without\r
+//        modification, are permitted provided that the following conditions\r
+//        are met:\r
+//\r
+//          Redistributions of source code must retain the above copyright\r
+//          notice, this list of conditions and the following disclaimer.\r
+//\r
+//          Redistributions in binary form must reproduce the above copyright\r
+//          notice, this list of conditions and the following disclaimer in the\r
+//          documentation and/or other materials provided with the\r
+//          distribution.\r
+//\r
+//          Neither the name of Texas Instruments Incorporated nor the names of\r
+//          its contributors may be used to endorse or promote products derived\r
+//          from this software without specific prior written permission.\r
+//\r
+//        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+// Display functions.\r
+// *************************************************************************************************\r
+\r
+// *************************************************************************************************\r
+// Include section\r
+\r
+// system\r
+#include <project.h>\r
+#include <string.h>\r
+\r
+// driver\r
+#include "display.h"\r
+\r
+// logic\r
+#include "clock.h"\r
+#include "user.h"\r
+#include "date.h"\r
+#include "temperature.h"\r
+\r
+// *************************************************************************************************\r
+// Prototypes section\r
+void write_lcd_mem(u8 * lcdmem, u8 bits, u8 bitmask, u8 state);\r
+void clear_line(u8 line);\r
+void display_symbol(u8 symbol, u8 mode);\r
+void display_char(u8 segment, u8 chr, u8 mode);\r
+void display_chars(u8 segments, u8 * str, u8 mode);\r
+\r
+// *************************************************************************************************\r
+// Defines section\r
+\r
+// *************************************************************************************************\r
+// Global Variable section\r
+\r
+// Table with memory bit assignment for digits "0" to "9" and characters "A" to "Z"\r
+const u8 lcd_font[] = {\r
+    SEG_A + SEG_B + SEG_C + SEG_D + SEG_E + SEG_F,         // Displays "0"\r
+    SEG_B + SEG_C,                                         // Displays "1"\r
+    SEG_A + SEG_B + SEG_D + SEG_E + SEG_G,                 // Displays "2"\r
+    SEG_A + SEG_B + SEG_C + SEG_D + SEG_G,                 // Displays "3"\r
+    SEG_B + SEG_C + SEG_F + SEG_G,                         // Displays "4"\r
+    SEG_A + SEG_C + SEG_D + SEG_F + SEG_G,                 // Displays "5"\r
+    SEG_A + SEG_C + SEG_D + SEG_E + SEG_F + SEG_G,         // Displays "6"\r
+    SEG_A + SEG_B + SEG_C,                                 // Displays "7"\r
+    SEG_A + SEG_B + SEG_C + SEG_D + SEG_E + SEG_F + SEG_G, // Displays "8"\r
+    SEG_A + SEG_B + SEG_C + SEG_D + SEG_F + SEG_G,         // Displays "9"\r
+    0,                                                     // Displays " "\r
+    0,                                                     // Displays " "\r
+    0,                                                     // Displays " "\r
+    0,                                                     // Displays " "\r
+    0,                                                     // Displays " "\r
+    SEG_D + SEG_E + SEG_G,                                 // Displays "c"\r
+    0,                                                     // Displays " "\r
+    SEG_A + SEG_B + SEG_C + SEG_E + SEG_F + SEG_G,         // Displays "A"\r
+    SEG_C + SEG_D + SEG_E + SEG_F + SEG_G,                 // Displays "b"\r
+    SEG_A + SEG_D + SEG_E + SEG_F,                         // Displays "C"\r
+    SEG_B + SEG_C + SEG_D + SEG_E + SEG_G,                 // Displays "d"\r
+    SEG_A + +SEG_D + SEG_E + SEG_F + SEG_G,                // Displays "E"\r
+    SEG_A + SEG_E + SEG_F + SEG_G,                         // Displays "F"\r
+    //  SEG_A+      SEG_C+SEG_D+SEG_E+SEG_F+SEG_G,       // Displays "G"\r
+    SEG_A + SEG_B + SEG_C + SEG_D + SEG_F + SEG_G,         // Displays "g"\r
+    SEG_B + SEG_C + SEG_E + SEG_F + SEG_G,                 // Displays "H"\r
+    SEG_E + SEG_F,                                         // Displays "I"\r
+    SEG_A + SEG_B + SEG_C + SEG_D,                         // Displays "J"\r
+    //              SEG_B+SEG_C+      SEG_E+SEG_F+SEG_G, // Displays "k"\r
+    SEG_D + SEG_E + SEG_F + SEG_G,                         // Displays "k"\r
+    SEG_D + SEG_E + SEG_F,                                 // Displays "L"\r
+    SEG_A + SEG_B + SEG_C + SEG_E + SEG_F,                 // Displays "M"\r
+    SEG_C + SEG_E + SEG_G,                                 // Displays "n"\r
+    SEG_C + SEG_D + SEG_E + SEG_G,                         // Displays "o"\r
+    SEG_A + SEG_B + SEG_E + SEG_F + SEG_G,                 // Displays "P"\r
+    SEG_A + SEG_B + SEG_C + SEG_D + SEG_E + SEG_F,         // Displays "Q"\r
+    SEG_E + SEG_G,                                         // Displays "r"\r
+    SEG_A + SEG_C + SEG_D + SEG_F + SEG_G,                 // Displays "S"\r
+    SEG_D + SEG_E + SEG_F + SEG_G,                         // Displays "t"\r
+    SEG_C + SEG_D + SEG_E,                                 // Displays "u"\r
+    SEG_C + SEG_D + SEG_E,                                 // Displays "u"\r
+    SEG_G,                                                 // Displays "-"\r
+    SEG_B + SEG_C + +SEG_E + SEG_F + SEG_G,                // Displays "X"\r
+    SEG_B + SEG_C + SEG_D + SEG_F + SEG_G,                 // Displays "Y"\r
+    SEG_A + SEG_B + SEG_D + SEG_E + SEG_G,                 // Displays "Z"\r
+};\r
+\r
+// Table with memory address for each display element\r
+const u8 *segments_lcdmem[] = {\r
+    LCD_SYMB_AM_MEM,\r
+    LCD_SYMB_PM_MEM,\r
+    LCD_SYMB_ARROW_UP_MEM,\r
+    LCD_SYMB_ARROW_DOWN_MEM,\r
+    LCD_SYMB_PERCENT_MEM,\r
+    LCD_SYMB_TOTAL_MEM,\r
+    LCD_SYMB_AVERAGE_MEM,\r
+    LCD_SYMB_MAX_MEM,\r
+    LCD_SYMB_BATTERY_MEM,\r
+    LCD_UNIT_L1_FT_MEM,\r
+    LCD_UNIT_L1_K_MEM,\r
+    LCD_UNIT_L1_M_MEM,\r
+    LCD_UNIT_L1_I_MEM,\r
+    LCD_UNIT_L1_PER_S_MEM,\r
+    LCD_UNIT_L1_PER_H_MEM,\r
+    LCD_UNIT_L1_DEGREE_MEM,\r
+    LCD_UNIT_L2_KCAL_MEM,\r
+    LCD_UNIT_L2_KM_MEM,\r
+    LCD_UNIT_L2_MI_MEM,\r
+    LCD_ICON_HEART_MEM,\r
+    LCD_ICON_STOPWATCH_MEM,\r
+    LCD_ICON_RECORD_MEM,\r
+    LCD_ICON_ALARM_MEM,\r
+    LCD_ICON_BEEPER1_MEM,\r
+    LCD_ICON_BEEPER2_MEM,\r
+    LCD_ICON_BEEPER3_MEM,\r
+    LCD_SEG_L1_3_MEM,\r
+    LCD_SEG_L1_2_MEM,\r
+    LCD_SEG_L1_1_MEM,\r
+    LCD_SEG_L1_0_MEM,\r
+    LCD_SEG_L1_COL_MEM,\r
+    LCD_SEG_L1_DP1_MEM,\r
+    LCD_SEG_L1_DP0_MEM,\r
+    LCD_SEG_L2_5_MEM,\r
+    LCD_SEG_L2_4_MEM,\r
+    LCD_SEG_L2_3_MEM,\r
+    LCD_SEG_L2_2_MEM,\r
+    LCD_SEG_L2_1_MEM,\r
+    LCD_SEG_L2_0_MEM,\r
+    LCD_SEG_L2_COL1_MEM,\r
+    LCD_SEG_L2_COL0_MEM,\r
+    LCD_SEG_L2_DP_MEM,\r
+};\r
+\r
+// Table with bit mask for each display element\r
+const u8 segments_bitmask[] = {\r
+    LCD_SYMB_AM_MASK,\r
+    LCD_SYMB_PM_MASK,\r
+    LCD_SYMB_ARROW_UP_MASK,\r
+    LCD_SYMB_ARROW_DOWN_MASK,\r
+    LCD_SYMB_PERCENT_MASK,\r
+    LCD_SYMB_TOTAL_MASK,\r
+    LCD_SYMB_AVERAGE_MASK,\r
+    LCD_SYMB_MAX_MASK,\r
+    LCD_SYMB_BATTERY_MASK,\r
+    LCD_UNIT_L1_FT_MASK,\r
+    LCD_UNIT_L1_K_MASK,\r
+    LCD_UNIT_L1_M_MASK,\r
+    LCD_UNIT_L1_I_MASK,\r
+    LCD_UNIT_L1_PER_S_MASK,\r
+    LCD_UNIT_L1_PER_H_MASK,\r
+    LCD_UNIT_L1_DEGREE_MASK,\r
+    LCD_UNIT_L2_KCAL_MASK,\r
+    LCD_UNIT_L2_KM_MASK,\r
+    LCD_UNIT_L2_MI_MASK,\r
+    LCD_ICON_HEART_MASK,\r
+    LCD_ICON_STOPWATCH_MASK,\r
+    LCD_ICON_RECORD_MASK,\r
+    LCD_ICON_ALARM_MASK,\r
+    LCD_ICON_BEEPER1_MASK,\r
+    LCD_ICON_BEEPER2_MASK,\r
+    LCD_ICON_BEEPER3_MASK,\r
+    LCD_SEG_L1_3_MASK,\r
+    LCD_SEG_L1_2_MASK,\r
+    LCD_SEG_L1_1_MASK,\r
+    LCD_SEG_L1_0_MASK,\r
+    LCD_SEG_L1_COL_MASK,\r
+    LCD_SEG_L1_DP1_MASK,\r
+    LCD_SEG_L1_DP0_MASK,\r
+    LCD_SEG_L2_5_MASK,\r
+    LCD_SEG_L2_4_MASK,\r
+    LCD_SEG_L2_3_MASK,\r
+    LCD_SEG_L2_2_MASK,\r
+    LCD_SEG_L2_1_MASK,\r
+    LCD_SEG_L2_0_MASK,\r
+    LCD_SEG_L2_COL1_MASK,\r
+    LCD_SEG_L2_COL0_MASK,\r
+    LCD_SEG_L2_DP_MASK,\r
+};\r
+\r
+// Quick integer to array conversion table for most common integer values\r
+const u8 int_to_array_conversion_table[][3] = {\r
+    "000", "001", "002", "003", "004", "005", "006", "007", "008", "009", "010", "011", "012",\r
+    "013", "014", "015",\r
+    "016", "017", "018", "019", "020", "021", "022", "023", "024", "025", "026", "027", "028",\r
+    "029", "030", "031",\r
+    "032", "033", "034", "035", "036", "037", "038", "039", "040", "041", "042", "043", "044",\r
+    "045", "046", "047",\r
+    "048", "049", "050", "051", "052", "053", "054", "055", "056", "057", "058", "059", "060",\r
+    "061", "062", "063",\r
+    "064", "065", "066", "067", "068", "069", "070", "071", "072", "073", "074", "075", "076",\r
+    "077", "078", "079",\r
+    "080", "081", "082", "083", "084", "085", "086", "087", "088", "089", "090", "091", "092",\r
+    "093", "094", "095",\r
+    "096", "097", "098", "099", "100", "101", "102", "103", "104", "105", "106", "107", "108",\r
+    "109", "110", "111",\r
+    "112", "113", "114", "115", "116", "117", "118", "119", "120", "121", "122", "123", "124",\r
+    "125", "126", "127",\r
+    "128", "129", "130", "131", "132", "133", "134", "135", "136", "137", "138", "139", "140",\r
+    "141", "142", "143",\r
+    "144", "145", "146", "147", "148", "149", "150", "151", "152", "153", "154", "155", "156",\r
+    "157", "158", "159",\r
+    "160", "161", "162", "163", "164", "165", "166", "167", "168", "169", "170", "171", "172",\r
+    "173", "174", "175",\r
+    "176", "177", "178", "179", "180",\r
+};\r
+\r
+// Display flags\r
+volatile s_display_flags display;\r
+\r
+// Global return string for int_to_array function\r
+u8 int_to_array_str[8];\r
+\r
+// *************************************************************************************************\r
+// Extern section\r
+extern void (*fptr_lcd_function_line1)(u8 line, u8 update);\r
+extern void (*fptr_lcd_function_line2)(u8 line, u8 update);\r
+\r
+// *************************************************************************************************\r
+// @fn          lcd_init\r
+// @brief       Erase LCD memory. Init LCD peripheral.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void lcd_init(void)\r
+{\r
+    // Clear entire display memory\r
+    LCDBMEMCTL |= LCDCLRBM + LCDCLRM;\r
+\r
+    // LCD_FREQ = ACLK/16/8 = 256Hz\r
+    // Frame frequency = 256Hz/4 = 64Hz, LCD mux 4, LCD on\r
+    LCDBCTL0 = (LCDDIV0 + LCDDIV1 + LCDDIV2 + LCDDIV3) | (LCDPRE0 + LCDPRE1) | LCD4MUX | LCDON;\r
+\r
+    // LCB_BLK_FREQ = ACLK/8/4096 = 1Hz\r
+    LCDBBLKCTL = LCDBLKPRE0 | LCDBLKPRE1 | LCDBLKDIV0 | LCDBLKDIV1 | LCDBLKDIV2 | LCDBLKMOD0;\r
+\r
+    // I/O to COM outputs\r
+    P5SEL |= (BIT5 | BIT6 | BIT7);\r
+    P5DIR |= (BIT5 | BIT6 | BIT7);\r
+\r
+    // Activate LCD output\r
+    LCDBPCTL0 = 0xFFFF;         // Select LCD segments S0-S15\r
+    LCDBPCTL1 = 0x00FF;         // Select LCD segments S16-S22\r
+\r
+#ifdef USE_LCD_CHARGE_PUMP\r
+    // Charge pump voltage generated internally, internal bias (V2-V4) generation\r
+    LCDBVCTL = LCDCPEN | VLCD_2_72;\r
+#endif\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          clear_display_all\r
+// @brief       Erase LINE1 and LINE2 segments. Clear also function-specific content.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void clear_display_all(void)\r
+{\r
+    // Clear generic content\r
+    clear_line(LINE1);\r
+    clear_line(LINE2);\r
+\r
+    // Clean up function-specific content\r
+    fptr_lcd_function_line1(LINE1, DISPLAY_LINE_CLEAR);\r
+    fptr_lcd_function_line2(LINE2, DISPLAY_LINE_CLEAR);\r
+\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          clear_display\r
+// @brief       Erase LINE1 and LINE2 segments. Keep icons.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void clear_display(void)\r
+{\r
+    clear_line(LINE1);\r
+    clear_line(LINE2);\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          clear_line\r
+// @brief       Erase segments of a given line.\r
+// @param       u8 line LINE1, LINE2\r
+// @return      none\r
+// *************************************************************************************************\r
+void clear_line(u8 line)\r
+{\r
+    display_chars(switch_seg(line, LCD_SEG_L1_3_0, LCD_SEG_L2_5_0), NULL, SEG_OFF);\r
+    if (line == LINE1)\r
+    {\r
+        display_symbol(LCD_SEG_L1_DP1, SEG_OFF);\r
+        display_symbol(LCD_SEG_L1_DP0, SEG_OFF);\r
+        display_symbol(LCD_SEG_L1_COL, SEG_OFF);\r
+    }\r
+    else                        // line == LINE2\r
+    {\r
+        display_symbol(LCD_SEG_L2_DP, SEG_OFF);\r
+        display_symbol(LCD_SEG_L2_COL1, SEG_OFF);\r
+        display_symbol(LCD_SEG_L2_COL0, SEG_OFF);\r
+    }\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          write_segment\r
+// @brief       Write to one or multiple LCD segments\r
+// @param       lcdmem          Pointer to LCD byte memory\r
+//                              bits            Segments to address\r
+//                              bitmask         Bitmask for particular display item\r
+//                              mode            On, off or blink segments\r
+// @return\r
+// *************************************************************************************************\r
+void write_lcd_mem(u8 * lcdmem, u8 bits, u8 bitmask, u8 state)\r
+{\r
+    if (state == SEG_ON)\r
+    {\r
+        // Clear segments before writing\r
+        *lcdmem = (u8) (*lcdmem & ~bitmask);\r
+\r
+        // Set visible segments\r
+        *lcdmem = (u8) (*lcdmem | bits);\r
+    }\r
+    else if (state == SEG_OFF)\r
+    {\r
+        // Clear segments\r
+        *lcdmem = (u8) (*lcdmem & ~bitmask);\r
+    }\r
+    else if (state == SEG_ON_BLINK_ON)\r
+    {\r
+        // Clear visible / blink segments before writing\r
+        *lcdmem = (u8) (*lcdmem & ~bitmask);\r
+        *(lcdmem + 0x20) = (u8) (*(lcdmem + 0x20) & ~bitmask);\r
+\r
+        // Set visible / blink segments\r
+        *lcdmem = (u8) (*lcdmem | bits);\r
+        *(lcdmem + 0x20) = (u8) (*(lcdmem + 0x20) | bits);\r
+    }\r
+    else if (state == SEG_ON_BLINK_OFF)\r
+    {\r
+        // Clear visible segments before writing\r
+        *lcdmem = (u8) (*lcdmem & ~bitmask);\r
+\r
+        // Set visible segments\r
+        *lcdmem = (u8) (*lcdmem | bits);\r
+\r
+        // Clear blink segments\r
+        *(lcdmem + 0x20) = (u8) (*(lcdmem + 0x20) & ~bitmask);\r
+    }\r
+    else if (state == SEG_OFF_BLINK_OFF)\r
+    {\r
+        // Clear segments\r
+        *lcdmem = (u8) (*lcdmem & ~bitmask);\r
+\r
+        // Clear blink segments\r
+        *(lcdmem + 0x20) = (u8) (*(lcdmem + 0x20) & ~bitmask);\r
+    }\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          int_to_array\r
+// @brief       Generic integer to array routine. Converts integer n to string.\r
+//                              Default conversion result has leading zeros, e.g. "00123"\r
+//                              Option to convert leading '0' into whitespace (blanks)\r
+// @param       u32 n                   integer to convert\r
+//                              u8 digits               number of digits\r
+//                              u8 blanks               fill up result string with number of\r
+// whitespaces instead of leading zeros\r
+// @return      u8                              string\r
+// *************************************************************************************************\r
+u8 *int_to_array(u32 n, u8 digits, u8 blanks)\r
+{\r
+    u8 i;\r
+    u8 digits1 = digits;\r
+\r
+    // Preset result string\r
+    memcpy(int_to_array_str, "0000000", 7);\r
+\r
+    // Return empty string if number of digits is invalid (valid range for digits: 1-7)\r
+    if ((digits == 0) || (digits > 7))\r
+        return (int_to_array_str);\r
+\r
+    // Numbers 0 .. 180 can be copied from int_to_array_conversion_table without conversion\r
+    if (n <= 180)\r
+    {\r
+        if (digits >= 3)\r
+        {\r
+            memcpy(int_to_array_str + (digits - 3), int_to_array_conversion_table[n], 3);\r
+        }\r
+        else                    // digits == 1 || 2\r
+        {\r
+            memcpy(int_to_array_str, int_to_array_conversion_table[n] + (3 - digits), digits);\r
+        }\r
+    }\r
+    else                        // For n > 180 need to calculate string content\r
+    {\r
+        // Calculate digits from least to most significant number\r
+        do\r
+        {\r
+            int_to_array_str[digits - 1] = n % 10 + '0';\r
+            n /= 10;\r
+        }\r
+        while (--digits > 0);\r
+    }\r
+\r
+    // Remove specified number of leading '0', always keep last one\r
+    i = 0;\r
+    while ((int_to_array_str[i] == '0') && (i < digits1 - 1))\r
+    {\r
+        if (blanks > 0)\r
+        {\r
+            // Convert only specified number of leading '0'\r
+            int_to_array_str[i] = ' ';\r
+            blanks--;\r
+        }\r
+        i++;\r
+    }\r
+\r
+    return (int_to_array_str);\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          display_value\r
+// @brief       Generic decimal display routine. Used exclusively by set_value function.\r
+// @param       u8 segments             LCD segments where value is displayed\r
+//                              u32 value                       Integer value to be displayed\r
+//                              u8 digits                       Number of digits to convert\r
+//                              u8 blanks                       Number of leadings blanks in\r
+// int_to_array result string\r
+// @return      none\r
+// *************************************************************************************************\r
+void display_value(u8 segments, u32 value, u8 digits, u8 blanks)\r
+{\r
+    u8 *str;\r
+\r
+    str = int_to_array(value, digits, blanks);\r
+\r
+    // Display string in blink mode\r
+    display_chars(segments, str, SEG_ON_BLINK_ON);\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          display_hours\r
+// @brief       Display hours in 24H / 12H time format.\r
+// @param       u8 segments     Segments where to display hour data\r
+//                              u32 value               Hour data\r
+//                              u8 digits               Must be "2"\r
+//                              u8 blanks               Must be "0"\r
+// @return      none\r
+// *************************************************************************************************\r
+void display_hours(u8 segments, u32 value, u8 digits, u8 blanks)\r
+{\r
+    u8 hours;\r
+\r
+    if (sys.flag.use_metric_units)\r
+    {\r
+        // Display hours in 24H time format\r
+        display_value(segments, (u16) value, digits, blanks);\r
+    }\r
+    else\r
+    {\r
+        // convert internal 24H time format to 12H time format\r
+        hours = convert_hour_to_12H_format(value);\r
+\r
+        // display hours in 12H time format\r
+        display_value(segments, hours, digits, blanks);\r
+        display_am_pm_symbol(value);\r
+    }\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          display_am_pm_symbol\r
+// @brief       Display AM or PM symbol.\r
+// @param       u8 hour         24H internal time format\r
+// @return      none\r
+// *************************************************************************************************\r
+void display_am_pm_symbol(u8 hour)\r
+{\r
+    // Display AM/PM symbol\r
+    if (is_hour_am(hour))\r
+    {\r
+        display_symbol(LCD_SYMB_AM, SEG_ON);\r
+    }\r
+    else\r
+    {\r
+        // Clear AM segments first - required when changing from AM to PM\r
+        display_symbol(LCD_SYMB_AM, SEG_OFF);\r
+        display_symbol(LCD_SYMB_PM, SEG_ON);\r
+    }\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          display_symbol\r
+// @brief       Switch symbol on or off on LCD.\r
+// @param       u8 symbol               A valid LCD symbol (index 0..42)\r
+//                              u8 state                SEG_ON, SEG_OFF, SEG_BLINK\r
+// @return      none\r
+// *************************************************************************************************\r
+void display_symbol(u8 symbol, u8 mode)\r
+{\r
+    u8 *lcdmem;\r
+    u8 bits;\r
+    u8 bitmask;\r
+\r
+    if (symbol <= LCD_SEG_L2_DP)\r
+    {\r
+        // Get LCD memory address for symbol from table\r
+        lcdmem = (u8 *) segments_lcdmem[symbol];\r
+\r
+        // Get bits for symbol from table\r
+        bits = segments_bitmask[symbol];\r
+\r
+        // Bitmask for symbols equals bits\r
+        bitmask = bits;\r
+\r
+        // Write LCD memory\r
+        write_lcd_mem(lcdmem, bits, bitmask, mode);\r
+    }\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          display_char\r
+// @brief       Write to 7-segment characters.\r
+// @param       u8 segment              A valid LCD segment\r
+//                              u8 chr                  Character to display\r
+//                              u8 mode             SEG_ON, SEG_OFF, SEG_BLINK\r
+// @return      none\r
+// *************************************************************************************************\r
+void display_char(u8 segment, u8 chr, u8 mode)\r
+{\r
+    u8 *lcdmem;                 // Pointer to LCD memory\r
+    u8 bitmask;                 // Bitmask for character\r
+    u8 bits, bits1;             // Bits to write\r
+\r
+    // Write to single 7-segment character\r
+    if ((segment >= LCD_SEG_L1_3) && (segment <= LCD_SEG_L2_DP))\r
+    {\r
+        // Get LCD memory address for segment from table\r
+        lcdmem = (u8 *) segments_lcdmem[segment];\r
+\r
+        // Get bitmask for character from table\r
+        bitmask = segments_bitmask[segment];\r
+\r
+        // Get bits from font set\r
+        if ((chr >= 0x30) && (chr <= 0x5A))\r
+        {\r
+            // Use font set\r
+            bits = lcd_font[chr - 0x30];\r
+        }\r
+        else if (chr == 0x2D)\r
+        {\r
+            // '-' not in font set\r
+            bits = BIT1;\r
+        }\r
+        else\r
+        {\r
+            // Other characters map to ' ' (blank)\r
+            bits = 0;\r
+        }\r
+\r
+        // When addressing LINE2 7-segment characters need to swap high- and low-nibble,\r
+        // because LCD COM/SEG assignment is mirrored against LINE1\r
+        if (segment >= LCD_SEG_L2_5)\r
+        {\r
+            bits1 = ((bits << 4) & 0xF0) | ((bits >> 4) & 0x0F);\r
+            bits = bits1;\r
+\r
+            // When addressing LCD_SEG_L2_5, need to convert ASCII '1' and 'L' to 1 bit,\r
+            // because LCD COM/SEG assignment is special for this incomplete character\r
+            if (segment == LCD_SEG_L2_5)\r
+            {\r
+                if ((chr == '1') || (chr == 'L'))\r
+                    bits = BIT7;\r
+            }\r
+        }\r
+\r
+        // Physically write to LCD memory\r
+        write_lcd_mem(lcdmem, bits, bitmask, mode);\r
+    }\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          display_chars\r
+// @brief       Write to consecutive 7-segment characters.\r
+// @param       u8 segments     LCD segment array\r
+//                              u8 * str                Pointer to a string\r
+//                              u8 mode             SEG_ON, SEG_OFF, SEG_BLINK\r
+// @return      none\r
+// *************************************************************************************************\r
+void display_chars(u8 segments, u8 * str, u8 mode)\r
+{\r
+    u8 i;\r
+    u8 length = 0;              // Write length\r
+    u8 char_start;              // Starting point for consecutive write\r
+\r
+    switch (segments)\r
+    {\r
+        // LINE1\r
+        case LCD_SEG_L1_3_0:\r
+            length = 4;\r
+            char_start = LCD_SEG_L1_3;\r
+            break;\r
+        case LCD_SEG_L1_2_0:\r
+            length = 3;\r
+            char_start = LCD_SEG_L1_2;\r
+            break;\r
+        case LCD_SEG_L1_1_0:\r
+            length = 2;\r
+            char_start = LCD_SEG_L1_1;\r
+            break;\r
+        case LCD_SEG_L1_3_1:\r
+            length = 3;\r
+            char_start = LCD_SEG_L1_3;\r
+            break;\r
+        case LCD_SEG_L1_3_2:\r
+            length = 2;\r
+            char_start = LCD_SEG_L1_3;\r
+            break;\r
+\r
+        // LINE2\r
+        case LCD_SEG_L2_5_0:\r
+            length = 6;\r
+            char_start = LCD_SEG_L2_5;\r
+            break;\r
+        case LCD_SEG_L2_4_0:\r
+            length = 5;\r
+            char_start = LCD_SEG_L2_4;\r
+            break;\r
+        case LCD_SEG_L2_3_0:\r
+            length = 4;\r
+            char_start = LCD_SEG_L2_3;\r
+            break;\r
+        case LCD_SEG_L2_2_0:\r
+            length = 3;\r
+            char_start = LCD_SEG_L2_2;\r
+            break;\r
+        case LCD_SEG_L2_1_0:\r
+            length = 2;\r
+            char_start = LCD_SEG_L2_1;\r
+            break;\r
+        case LCD_SEG_L2_5_4:\r
+            length = 2;\r
+            char_start = LCD_SEG_L2_5;\r
+            break;\r
+        case LCD_SEG_L2_5_2:\r
+            length = 4;\r
+            char_start = LCD_SEG_L2_5;\r
+            break;\r
+        case LCD_SEG_L2_3_2:\r
+            length = 2;\r
+            char_start = LCD_SEG_L2_3;\r
+            break;\r
+        case LCD_SEG_L2_4_2:\r
+            length = 3;\r
+            char_start = LCD_SEG_L2_4;\r
+            break;\r
+    }\r
+\r
+    // Write to consecutive digits\r
+    for (i = 0; i < length; i++)\r
+    {\r
+        // Use single character routine to write display memory\r
+        display_char(char_start + i, *(str + i), mode);\r
+    }\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          switch_seg\r
+// @brief       Returns index of 7-segment character. Required for display routines that can draw\r
+//                              information on both lines.\r
+// @param       u8 line             LINE1 or LINE2\r
+//                              u8 index1               Index of LINE1\r
+//                              u8 index2               Index of LINE2\r
+// @return      uint8\r
+// *************************************************************************************************\r
+u8 switch_seg(u8 line, u8 index1, u8 index2)\r
+{\r
+    if (line == LINE1)\r
+    {\r
+        return index1;\r
+    }\r
+    else                        // line == LINE2\r
+    {\r
+        return index2;\r
+    }\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          start_blink\r
+// @brief       Start blinking.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void start_blink(void)\r
+{\r
+    LCDBBLKCTL |= LCDBLKMOD0;\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          stop_blink\r
+// @brief       Stop blinking.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void stop_blink(void)\r
+{\r
+    LCDBBLKCTL &= ~LCDBLKMOD0;\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          stop_blink\r
+// @brief       Clear blinking memory.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void clear_blink_mem(void)\r
+{\r
+    LCDBMEMCTL |= LCDCLRBM;\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          set_blink_rate\r
+// @brief       Set blink rate register bits.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void set_blink_rate(u8 bits)\r
+{\r
+    LCDBBLKCTL &= ~(BIT7 | BIT6 | BIT5);\r
+    LCDBBLKCTL |= bits;\r
+}\r
+\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/driver/display.h b/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/driver/display.h
new file mode 100755 (executable)
index 0000000..044c3bd
--- /dev/null
@@ -0,0 +1,338 @@
+// *************************************************************************************************\r
+//\r
+//      Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//        Redistribution and use in source and binary forms, with or without\r
+//        modification, are permitted provided that the following conditions\r
+//        are met:\r
+//\r
+//          Redistributions of source code must retain the above copyright\r
+//          notice, this list of conditions and the following disclaimer.\r
+//\r
+//          Redistributions in binary form must reproduce the above copyright\r
+//          notice, this list of conditions and the following disclaimer in the\r
+//          documentation and/or other materials provided with the\r
+//          distribution.\r
+//\r
+//          Neither the name of Texas Instruments Incorporated nor the names of\r
+//          its contributors may be used to endorse or promote products derived\r
+//          from this software without specific prior written permission.\r
+//\r
+//        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+\r
+#ifndef __DISPLAY_H\r
+#define __DISPLAY_H\r
+\r
+// *************************************************************************************************\r
+// Include section\r
+\r
+#include <project.h>\r
+\r
+// *************************************************************************************************\r
+// Extern section\r
+\r
+// Constants defined in library\r
+extern const u8 lcd_font[];\r
+extern const u8 *segments_lcdmem[];\r
+extern const u8 segments_bitmask[];\r
+extern const u8 int_to_array_conversion_table[][3];\r
+\r
+// *************************************************************************************************\r
+// Global Variable section\r
+\r
+// Set of display flags\r
+typedef union\r
+{\r
+    struct\r
+    {\r
+        // Line1 + Line2 + Icons\r
+        u16 full_update            : 1;   // 1 = Redraw all content\r
+        u16 partial_update         : 1;   // 1 = Update changes\r
+\r
+        // Line only\r
+        u16 line1_full_update       : 1;  // 1 = Redraw Line1 content\r
+        u16 line2_full_update       : 1;  // 1 = Redraw Line2 content\r
+\r
+        // Logic module data update flags\r
+        u16 update_time              : 1; // 1 = Time was updated\r
+        u16 update_stopwatch         : 1; // 1 = Stopwatch was updated\r
+        u16 update_temperature       : 1; // 1 = Temperature was updated\r
+        u16 update_battery_voltage   : 1; // 1 = Battery voltage was updated\r
+        u16 update_date              : 1; // 1 = Date was updated\r
+        u16 update_alarm             : 1; // 1 = Alarm time was updated\r
+        u16 update_acceleration      : 1; // 1 = Acceleration data was updated\r
+    } flag;\r
+    u16 all_flags;                        // Shortcut to all display flags (for reset)\r
+} s_display_flags;\r
+extern volatile s_display_flags display;\r
+\r
+// *************************************************************************************************\r
+// Defines section\r
+\r
+// Display function modes\r
+#define DISPLAY_LINE_UPDATE_FULL                (BIT0)\r
+#define DISPLAY_LINE_UPDATE_PARTIAL             (BIT1)\r
+#define DISPLAY_LINE_CLEAR                              (BIT2)\r
+\r
+// Definitions for line view style\r
+#define DISPLAY_DEFAULT_VIEW                    (0u)\r
+#define DISPLAY_ALTERNATIVE_VIEW                (1u)\r
+\r
+// Definitions for line access\r
+#define LINE1                                                   (1u)\r
+#define LINE2                                                   (2u)\r
+\r
+// LCD display modes\r
+#define SEG_OFF                                 (0u)\r
+#define SEG_ON                                  (1u)\r
+#define SEG_ON_BLINK_ON                 (2u)\r
+#define SEG_ON_BLINK_OFF                (3u)\r
+#define SEG_OFF_BLINK_OFF               (4u)\r
+\r
+// 7-segment character bit assignments\r
+#define SEG_A                   (BIT4)\r
+#define SEG_B                   (BIT5)\r
+#define SEG_C                   (BIT6)\r
+#define SEG_D                   (BIT7)\r
+#define SEG_E                   (BIT2)\r
+#define SEG_F                   (BIT0)\r
+#define SEG_G                   (BIT1)\r
+\r
+// ------------------------------------------\r
+// LCD symbols for easier access\r
+//\r
+// xxx_SEG_xxx          = Seven-segment character (sequence 5-4-3-2-1-0)\r
+// xxx_SYMB_xxx         = Display symbol, e.g. "AM" for ante meridiem\r
+// xxx_UNIT_xxx         = Display unit, e.g. "km/h" for kilometers per hour\r
+// xxx_ICON_xxx         = Display icon, e.g. heart to indicate reception of heart rate data\r
+// xxx_L1_xxx           = Item is part of Line1 information\r
+// xxx_L2_xxx           = Item is part of Line2 information\r
+\r
+// Symbols for Line1\r
+#define LCD_SYMB_AM                                     0\r
+#define LCD_SYMB_PM                                     1\r
+#define LCD_SYMB_ARROW_UP                       2\r
+#define LCD_SYMB_ARROW_DOWN                     3\r
+#define LCD_SYMB_PERCENT                        4\r
+\r
+// Symbols for Line2\r
+#define LCD_SYMB_TOTAL                          5\r
+#define LCD_SYMB_AVERAGE                        6\r
+#define LCD_SYMB_MAX                            7\r
+#define LCD_SYMB_BATTERY                        8\r
+\r
+// Units for Line1\r
+#define LCD_UNIT_L1_FT                          9\r
+#define LCD_UNIT_L1_K                           10\r
+#define LCD_UNIT_L1_M                           11\r
+#define LCD_UNIT_L1_I                           12\r
+#define LCD_UNIT_L1_PER_S                       13\r
+#define LCD_UNIT_L1_PER_H                       14\r
+#define LCD_UNIT_L1_DEGREE                      15\r
+\r
+// Units for Line2\r
+#define LCD_UNIT_L2_KCAL                        16\r
+#define LCD_UNIT_L2_KM                          17\r
+#define LCD_UNIT_L2_MI                          18\r
+\r
+// Icons\r
+#define LCD_ICON_HEART                          19\r
+#define LCD_ICON_STOPWATCH                      20\r
+#define LCD_ICON_RECORD                         21\r
+#define LCD_ICON_ALARM                          22\r
+#define LCD_ICON_BEEPER1                        23\r
+#define LCD_ICON_BEEPER2                        24\r
+#define LCD_ICON_BEEPER3                        25\r
+\r
+// Line1 7-segments\r
+#define LCD_SEG_L1_3                            26\r
+#define LCD_SEG_L1_2                            27\r
+#define LCD_SEG_L1_1                            28\r
+#define LCD_SEG_L1_0                            29\r
+#define LCD_SEG_L1_COL                          30\r
+#define LCD_SEG_L1_DP1                          31\r
+#define LCD_SEG_L1_DP0                          32\r
+\r
+// Line2 7-segments\r
+#define LCD_SEG_L2_5                            33\r
+#define LCD_SEG_L2_4                            34\r
+#define LCD_SEG_L2_3                            35\r
+#define LCD_SEG_L2_2                            36\r
+#define LCD_SEG_L2_1                            37\r
+#define LCD_SEG_L2_0                            38\r
+#define LCD_SEG_L2_COL1                         39\r
+#define LCD_SEG_L2_COL0                         40\r
+#define LCD_SEG_L2_DP                           41\r
+\r
+// Line1 7-segment arrays\r
+#define LCD_SEG_L1_3_0                          70\r
+#define LCD_SEG_L1_2_0                          71\r
+#define LCD_SEG_L1_1_0                          72\r
+#define LCD_SEG_L1_3_1                          73\r
+#define LCD_SEG_L1_3_2                          74\r
+\r
+// Line2 7-segment arrays\r
+#define LCD_SEG_L2_5_0                          90\r
+#define LCD_SEG_L2_4_0                          91\r
+#define LCD_SEG_L2_3_0                          92\r
+#define LCD_SEG_L2_2_0                          93\r
+#define LCD_SEG_L2_1_0                          94\r
+#define LCD_SEG_L2_5_2                          95\r
+#define LCD_SEG_L2_3_2                          96\r
+#define LCD_SEG_L2_5_4                          97\r
+#define LCD_SEG_L2_4_2                          98\r
+\r
+// LCD controller memory map\r
+#define LCD_MEM_1                               ((u8*)0x0A20)\r
+#define LCD_MEM_2                               ((u8*)0x0A21)\r
+#define LCD_MEM_3                               ((u8*)0x0A22)\r
+#define LCD_MEM_4                               ((u8*)0x0A23)\r
+#define LCD_MEM_5                               ((u8*)0x0A24)\r
+#define LCD_MEM_6                               ((u8*)0x0A25)\r
+#define LCD_MEM_7                               ((u8*)0x0A26)\r
+#define LCD_MEM_8                               ((u8*)0x0A27)\r
+#define LCD_MEM_9                               ((u8*)0x0A28)\r
+#define LCD_MEM_10                              ((u8*)0x0A29)\r
+#define LCD_MEM_11                              ((u8*)0x0A2A)\r
+#define LCD_MEM_12                              ((u8*)0x0A2B)\r
+\r
+// Memory assignment\r
+#define LCD_SEG_L1_0_MEM                        (LCD_MEM_6)\r
+#define LCD_SEG_L1_1_MEM                        (LCD_MEM_4)\r
+#define LCD_SEG_L1_2_MEM                        (LCD_MEM_3)\r
+#define LCD_SEG_L1_3_MEM                        (LCD_MEM_2)\r
+#define LCD_SEG_L1_COL_MEM                      (LCD_MEM_1)\r
+#define LCD_SEG_L1_DP1_MEM                      (LCD_MEM_1)\r
+#define LCD_SEG_L1_DP0_MEM                      (LCD_MEM_5)\r
+#define LCD_SEG_L2_0_MEM                        (LCD_MEM_8)\r
+#define LCD_SEG_L2_1_MEM                        (LCD_MEM_9)\r
+#define LCD_SEG_L2_2_MEM                        (LCD_MEM_10)\r
+#define LCD_SEG_L2_3_MEM                        (LCD_MEM_11)\r
+#define LCD_SEG_L2_4_MEM                        (LCD_MEM_12)\r
+#define LCD_SEG_L2_5_MEM                        (LCD_MEM_12)\r
+#define LCD_SEG_L2_COL1_MEM                     (LCD_MEM_1)\r
+#define LCD_SEG_L2_COL0_MEM                     (LCD_MEM_5)\r
+#define LCD_SEG_L2_DP_MEM                       (LCD_MEM_9)\r
+#define LCD_SYMB_AM_MEM                         (LCD_MEM_1)\r
+#define LCD_SYMB_PM_MEM                         (LCD_MEM_1)\r
+#define LCD_SYMB_ARROW_UP_MEM           (LCD_MEM_1)\r
+#define LCD_SYMB_ARROW_DOWN_MEM         (LCD_MEM_1)\r
+#define LCD_SYMB_PERCENT_MEM            (LCD_MEM_5)\r
+#define LCD_SYMB_TOTAL_MEM                      (LCD_MEM_11)\r
+#define LCD_SYMB_AVERAGE_MEM            (LCD_MEM_10)\r
+#define LCD_SYMB_MAX_MEM                        (LCD_MEM_8)\r
+#define LCD_SYMB_BATTERY_MEM            (LCD_MEM_7)\r
+#define LCD_UNIT_L1_FT_MEM                      (LCD_MEM_5)\r
+#define LCD_UNIT_L1_K_MEM                       (LCD_MEM_5)\r
+#define LCD_UNIT_L1_M_MEM                       (LCD_MEM_7)\r
+#define LCD_UNIT_L1_I_MEM                       (LCD_MEM_7)\r
+#define LCD_UNIT_L1_PER_S_MEM           (LCD_MEM_5)\r
+#define LCD_UNIT_L1_PER_H_MEM           (LCD_MEM_7)\r
+#define LCD_UNIT_L1_DEGREE_MEM          (LCD_MEM_5)\r
+#define LCD_UNIT_L2_KCAL_MEM            (LCD_MEM_7)\r
+#define LCD_UNIT_L2_KM_MEM                      (LCD_MEM_7)\r
+#define LCD_UNIT_L2_MI_MEM                      (LCD_MEM_7)\r
+#define LCD_ICON_HEART_MEM                      (LCD_MEM_2)\r
+#define LCD_ICON_STOPWATCH_MEM          (LCD_MEM_3)\r
+#define LCD_ICON_RECORD_MEM                     (LCD_MEM_1)\r
+#define LCD_ICON_ALARM_MEM                      (LCD_MEM_4)\r
+#define LCD_ICON_BEEPER1_MEM            (LCD_MEM_5)\r
+#define LCD_ICON_BEEPER2_MEM            (LCD_MEM_6)\r
+#define LCD_ICON_BEEPER3_MEM            (LCD_MEM_7)\r
+\r
+// Bit masks for write access\r
+#define LCD_SEG_L1_0_MASK                       (BIT2 + BIT1 + BIT0 + BIT7 + BIT6 + BIT5 + BIT4)\r
+#define LCD_SEG_L1_1_MASK                       (BIT2 + BIT1 + BIT0 + BIT7 + BIT6 + BIT5 + BIT4)\r
+#define LCD_SEG_L1_2_MASK                       (BIT2 + BIT1 + BIT0 + BIT7 + BIT6 + BIT5 + BIT4)\r
+#define LCD_SEG_L1_3_MASK                       (BIT2 + BIT1 + BIT0 + BIT7 + BIT6 + BIT5 + BIT4)\r
+#define LCD_SEG_L1_COL_MASK                     (BIT5)\r
+#define LCD_SEG_L1_DP1_MASK                     (BIT6)\r
+#define LCD_SEG_L1_DP0_MASK                     (BIT2)\r
+#define LCD_SEG_L2_0_MASK                       (BIT3 + BIT2 + BIT1 + BIT0 + BIT6 + BIT5 + BIT4)\r
+#define LCD_SEG_L2_1_MASK                       (BIT3 + BIT2 + BIT1 + BIT0 + BIT6 + BIT5 + BIT4)\r
+#define LCD_SEG_L2_2_MASK                       (BIT3 + BIT2 + BIT1 + BIT0 + BIT6 + BIT5 + BIT4)\r
+#define LCD_SEG_L2_3_MASK                       (BIT3 + BIT2 + BIT1 + BIT0 + BIT6 + BIT5 + BIT4)\r
+#define LCD_SEG_L2_4_MASK                       (BIT3 + BIT2 + BIT1 + BIT0 + BIT6 + BIT5 + BIT4)\r
+#define LCD_SEG_L2_5_MASK                       (BIT7)\r
+#define LCD_SEG_L2_COL1_MASK            (BIT4)\r
+#define LCD_SEG_L2_COL0_MASK            (BIT0)\r
+#define LCD_SEG_L2_DP_MASK                      (BIT7)\r
+#define LCD_SYMB_AM_MASK                        (BIT1 + BIT0)\r
+#define LCD_SYMB_PM_MASK                        (BIT0)\r
+#define LCD_SYMB_ARROW_UP_MASK          (BIT2)\r
+#define LCD_SYMB_ARROW_DOWN_MASK        (BIT3)\r
+#define LCD_SYMB_PERCENT_MASK           (BIT4)\r
+#define LCD_SYMB_TOTAL_MASK                     (BIT7)\r
+#define LCD_SYMB_AVERAGE_MASK           (BIT7)\r
+#define LCD_SYMB_MAX_MASK                       (BIT7)\r
+#define LCD_SYMB_BATTERY_MASK           (BIT7)\r
+#define LCD_UNIT_L1_FT_MASK                     (BIT5)\r
+#define LCD_UNIT_L1_K_MASK                      (BIT6)\r
+#define LCD_UNIT_L1_M_MASK                      (BIT1)\r
+#define LCD_UNIT_L1_I_MASK                      (BIT0)\r
+#define LCD_UNIT_L1_PER_S_MASK          (BIT7)\r
+#define LCD_UNIT_L1_PER_H_MASK          (BIT2)\r
+#define LCD_UNIT_L1_DEGREE_MASK         (BIT1)\r
+#define LCD_UNIT_L2_KCAL_MASK           (BIT4)\r
+#define LCD_UNIT_L2_KM_MASK                     (BIT5)\r
+#define LCD_UNIT_L2_MI_MASK                     (BIT6)\r
+#define LCD_ICON_HEART_MASK                     (BIT3)\r
+#define LCD_ICON_STOPWATCH_MASK         (BIT3)\r
+#define LCD_ICON_RECORD_MASK            (BIT7)\r
+#define LCD_ICON_ALARM_MASK                     (BIT3)\r
+#define LCD_ICON_BEEPER1_MASK           (BIT3)\r
+#define LCD_ICON_BEEPER2_MASK           (BIT3)\r
+#define LCD_ICON_BEEPER3_MASK           (BIT3)\r
+\r
+// *************************************************************************************************\r
+// API section\r
+\r
+// Physical LCD memory write\r
+extern void write_lcd_mem(u8 * lcdmem, u8 bits, u8 bitmask, u8 state);\r
+\r
+// Display init / clear\r
+extern void lcd_init(void);\r
+extern void clear_display(void);\r
+extern void clear_display_all(void);\r
+extern void clear_line(u8 line);\r
+\r
+// Blinking function\r
+extern void start_blink(void);\r
+extern void stop_blink(void);\r
+extern void clear_blink_mem(void);\r
+extern void set_blink_rate(u8 bits);\r
+\r
+// Character / symbol draw functions\r
+extern void display_char(u8 segment, u8 chr, u8 mode);\r
+extern void display_chars(u8 segments, u8 * str, u8 mode);\r
+extern void display_symbol(u8 symbol, u8 mode);\r
+\r
+// Time display function\r
+extern void DisplayTime(u8 updateMode);\r
+extern void display_am_pm_symbol(u8 timeAM);\r
+\r
+// Set_value display functions\r
+extern void display_value(u8 segments, u32 value, u8 digits, u8 blanks);\r
+extern void display_hours(u8 segments, u32 value, u8 digits, u8 blanks);\r
+\r
+// Integer to string conversion\r
+extern u8 *int_to_array(u32 n, u8 digits, u8 blanks);\r
+\r
+// Segment index helper function\r
+extern u8 switch_seg(u8 line, u8 index1, u8 index2);\r
+\r
+#endif   /*__DISPLAY_H*/\r
+\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/driver/ez430_chronos_datalogger_drivers.lib b/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/driver/ez430_chronos_datalogger_drivers.lib
new file mode 100755 (executable)
index 0000000..b100e40
Binary files /dev/null and b/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/driver/ez430_chronos_datalogger_drivers.lib differ
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/driver/flash.c b/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/driver/flash.c
new file mode 100755 (executable)
index 0000000..2247f4c
--- /dev/null
@@ -0,0 +1,95 @@
+// *************************************************************************************************\r
+//\r
+//      Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//        Redistribution and use in source and binary forms, with or without\r
+//        modification, are permitted provided that the following conditions\r
+//        are met:\r
+//\r
+//          Redistributions of source code must retain the above copyright\r
+//          notice, this list of conditions and the following disclaimer.\r
+//\r
+//          Redistributions in binary form must reproduce the above copyright\r
+//          notice, this list of conditions and the following disclaimer in the\r
+//          documentation and/or other materials provided with the\r
+//          distribution.\r
+//\r
+//          Neither the name of Texas Instruments Incorporated nor the names of\r
+//          its contributors may be used to endorse or promote products derived\r
+//          from this software without specific prior written permission.\r
+//\r
+//        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+// Data logger routines.\r
+// *************************************************************************************************\r
+\r
+// *************************************************************************************************\r
+// Include section\r
+\r
+// system\r
+#include "project.h"\r
+\r
+// logic\r
+#include "datalog.h"\r
+\r
+// *************************************************************************************************\r
+// Prototypes section\r
+\r
+// *************************************************************************************************\r
+// Defines section\r
+\r
+// *************************************************************************************************\r
+// Implementation\r
+\r
+void flash_erase_page(u8 page)\r
+{\r
+    // Convert page index to memory address\r
+    u16 *wptr = (u16 *) (page * 512);\r
+\r
+    // Range check\r
+    if ((page < DATALOG_PAGE_START) || (page > DATALOG_PAGE_END))\r
+        return;\r
+\r
+    // Wait until not busy\r
+    while ((FCTL3 & BUSY) != 0) ;\r
+\r
+    __disable_interrupt();\r
+    FCTL3 = FWKEY;              // Clear Lock bit\r
+    FCTL1 = FWKEY + ERASE;      // Set Erase bit\r
+    *wptr = 0;                  // Dummy write to erase Flash seg\r
+    FCTL1 = FWKEY + WRT;        // Set WRT bit for write operation\r
+    FCTL1 = FWKEY;              // Clear WRT bit\r
+    FCTL3 = FWKEY + LOCK;       // Set LOCK bit\r
+    __enable_interrupt();\r
+}\r
+\r
+void flash_write(u16 * wptr, u16 data)\r
+{\r
+    // Range check\r
+    //if ((page < DATALOG_MEMORY_START) || (page > DATALOG_MEMORY_END)) return;\r
+\r
+    // Wait until not busy\r
+    while ((FCTL3 & BUSY) != 0) ;\r
+\r
+    __disable_interrupt();\r
+    FCTL3 = FWKEY;              // Clear Lock bit\r
+    *wptr = 0;                  // Dummy write to erase Flash seg\r
+    FCTL1 = FWKEY + WRT;        // Set WRT bit for write operation\r
+    *wptr = data;\r
+    FCTL1 = FWKEY;              // Clear WRT bit\r
+    FCTL3 = FWKEY + LOCK;       // Set LOCK bit\r
+    __enable_interrupt();\r
+}\r
+\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/driver/flash.h b/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/driver/flash.h
new file mode 100755 (executable)
index 0000000..b9cafa9
--- /dev/null
@@ -0,0 +1,44 @@
+// *************************************************************************************************\r
+//\r
+//      Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//        Redistribution and use in source and binary forms, with or without\r
+//        modification, are permitted provided that the following conditions\r
+//        are met:\r
+//\r
+//          Redistributions of source code must retain the above copyright\r
+//          notice, this list of conditions and the following disclaimer.\r
+//\r
+//          Redistributions in binary form must reproduce the above copyright\r
+//          notice, this list of conditions and the following disclaimer in the\r
+//          documentation and/or other materials provided with the\r
+//          distribution.\r
+//\r
+//          Neither the name of Texas Instruments Incorporated nor the names of\r
+//          its contributors may be used to endorse or promote products derived\r
+//          from this software without specific prior written permission.\r
+//\r
+//        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+\r
+#ifndef FLASH_H_\r
+#define FLASH_H_\r
+\r
+// *************************************************************************************************\r
+// Extern section\r
+extern void flash_erase_page(u8 page);\r
+extern void flash_write(u16 * wptr, u16 data);\r
+\r
+#endif\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/driver/pmm.c b/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/driver/pmm.c
new file mode 100755 (executable)
index 0000000..3257e7a
--- /dev/null
@@ -0,0 +1,78 @@
+//****************************************************************************//\r
+// Function Library for setting the PMM\r
+//\r
+//  This file is used in conjunction with PMM.c to set the core\r
+//  voltage level of a device. To set a core voltage level, call\r
+//  SetVCore(level). See RF project(s) for example usage.\r
+//\r
+//  Original programm                                           Stefan Schauer\r
+//  Rev 1.1: changed VCoreUp to fit with recommended flow (09/04/2008)\r
+//\r
+//****************************************************************************//\r
+#include "cc430x613x.h"\r
+#include "pmm.h"\r
+\r
+//****************************************************************************//\r
+// Set VCore level\r
+// SetVCore level is called from the user API\r
+//****************************************************************************//\r
+void SetVCore(unsigned char level)                                   // Note: change level by one\r
+                                                                     // step only\r
+{\r
+    unsigned char actLevel;\r
+\r
+    do\r
+    {\r
+        actLevel = PMMCTL0_L & PMMCOREV_3;\r
+        if (actLevel < level)\r
+            SetVCoreUp(++actLevel);                                  // Set VCore (step by step)\r
+        if (actLevel > level)\r
+            SetVCoreDown(--actLevel);                                // Set VCore (step by step)\r
+    }\r
+    while (actLevel != level);\r
+}\r
+\r
+//****************************************************************************//\r
+// Set VCore up\r
+//****************************************************************************//\r
+void SetVCoreUp(unsigned char level)                                 // Note: change level by one\r
+                                                                     // step only\r
+{\r
+    PMMCTL0_H = 0xA5;                                                // Open PMM module registers\r
+                                                                     // for write access\r
+\r
+    SVSMHCTL = SVSHE + SVSHRVL0 * level + SVMHE + SVSMHRRL0 * level; // Set SVS/M high side to new\r
+                                                                     // level\r
+\r
+    SVSMLCTL = SVSLE + SVMLE + SVSMLRRL0 * level;                    // Set SVM new Level\r
+    while ((PMMIFG & SVSMLDLYIFG) == 0) ;                            // Wait till SVM is settled\r
+                                                                     // (Delay)\r
+    PMMCTL0_L = PMMCOREV0 * level;                                   // Set VCore to x\r
+    PMMIFG &= ~(SVMLVLRIFG + SVMLIFG);                               // Clear already set flags\r
+    if ((PMMIFG & SVMLIFG))\r
+        while ((PMMIFG & SVMLVLRIFG) == 0) ;                         // Wait till level is reached\r
+\r
+    SVSMLCTL = SVSLE + SVSLRVL0 * level + SVMLE + SVSMLRRL0 * level; // Set SVS/M Low side to new\r
+                                                                     // level\r
+    PMMCTL0_H = 0x00;                                                // Lock PMM module registers\r
+                                                                     // for write access\r
+}\r
+\r
+//****************************************************************************//\r
+// Set VCore down\r
+//****************************************************************************//\r
+void SetVCoreDown(unsigned char level)\r
+{\r
+    PMMCTL0_H = 0xA5;                                                // Open PMM module registers\r
+                                                                     // for write access\r
+    SVSMLCTL = SVSLE + SVSLRVL0 * level + SVMLE + SVSMLRRL0 * level; // Set SVS/M Low side to new\r
+                                                                     // level\r
+    while ((PMMIFG & SVSMLDLYIFG) == 0) ;                            // Wait till SVM is settled\r
+                                                                     // (Delay)\r
+    PMMCTL0_L = (level * PMMCOREV0);                                 // Set VCore to 1.85 V for Max\r
+                                                                     // Speed.\r
+    PMMCTL0_H = 0x00;                                                // Lock PMM module registers\r
+                                                                     // for write access\r
+}\r
+\r
+//****************************************************************************//\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/driver/pmm.h b/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/driver/pmm.h
new file mode 100755 (executable)
index 0000000..170008f
--- /dev/null
@@ -0,0 +1,43 @@
+//====================================================================\r
+//    File: PMM.h\r
+//\r
+//    This file is used in conjunction with PMM.c to set the core\r
+//    voltage level of a device. To set a core voltage level, call\r
+//    SetVCore(level). See RF project(s) for example usage.\r
+//\r
+//    Version 1.0 first\r
+//    07/14/07\r
+//\r
+//====================================================================\r
+\r
+#ifndef __PMM\r
+#define __PMM\r
+\r
+//====================================================================\r
+\r
+/**\r
+ * Set the VCore to a new level\r
+ *\r
+ * \param level       PMM level ID\r
+ */\r
+void SetVCore(unsigned char level);\r
+\r
+//====================================================================\r
+\r
+/**\r
+ * Set the VCore to a new higher level\r
+ *\r
+ * \param level       PMM level ID\r
+ */\r
+void SetVCoreUp(unsigned char level);\r
+\r
+//====================================================================\r
+\r
+/**\r
+ * Set the VCore to a new Lower level\r
+ *\r
+ * \param level       PMM level ID\r
+ */\r
+void SetVCoreDown(unsigned char level);\r
+\r
+#endif                          /* __PMM */\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/driver/ports.c b/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/driver/ports.c
new file mode 100755 (executable)
index 0000000..5a83a11
--- /dev/null
@@ -0,0 +1,440 @@
+// *************************************************************************************************\r
+//\r
+//      Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//        Redistribution and use in source and binary forms, with or without\r
+//        modification, are permitted provided that the following conditions\r
+//        are met:\r
+//\r
+//          Redistributions of source code must retain the above copyright\r
+//          notice, this list of conditions and the following disclaimer.\r
+//\r
+//          Redistributions in binary form must reproduce the above copyright\r
+//          notice, this list of conditions and the following disclaimer in the\r
+//          documentation and/or other materials provided with the\r
+//          distribution.\r
+//\r
+//          Neither the name of Texas Instruments Incorporated nor the names of\r
+//          its contributors may be used to endorse or promote products derived\r
+//          from this software without specific prior written permission.\r
+//\r
+//        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+// Button entry functions.\r
+// *************************************************************************************************\r
+\r
+// *************************************************************************************************\r
+// Include section\r
+\r
+// system\r
+#include "project.h"\r
+\r
+// driver\r
+#include "ports.h"\r
+#include "buzzer.h"\r
+#include "vti_as.h"\r
+#include "vti_ps.h"\r
+#include "timer.h"\r
+#include "display.h"\r
+\r
+// logic\r
+#include "clock.h"\r
+#include "rfsimpliciti.h"\r
+#include "simpliciti.h"\r
+#include "altitude.h"\r
+\r
+// *************************************************************************************************\r
+// Prototypes section\r
+void button_repeat_on(u16 msec);\r
+void button_repeat_off(void);\r
+void button_repeat_function(void);\r
+\r
+// *************************************************************************************************\r
+// Defines section\r
+\r
+// Macro for button IRQ\r
+#define IRQ_TRIGGERED(flags, bit)               ((flags & bit) == bit)\r
+\r
+// *************************************************************************************************\r
+// Global Variable section\r
+volatile s_button_flags button;\r
+volatile struct struct_button sButton;\r
+\r
+// *************************************************************************************************\r
+// Extern section\r
+extern void (*fptr_Timer0_A3_function)(void);\r
+\r
+// *************************************************************************************************\r
+// @fn          init_buttons\r
+// @brief       Init and enable button interrupts.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void init_buttons(void)\r
+{\r
+    // Set button ports to input\r
+    BUTTONS_DIR &= ~ALL_BUTTONS;\r
+\r
+    // Enable internal pull-downs\r
+    BUTTONS_OUT &= ~ALL_BUTTONS;\r
+    BUTTONS_REN |= ALL_BUTTONS;\r
+\r
+    // IRQ triggers on rising edge\r
+    BUTTONS_IES &= ~ALL_BUTTONS;\r
+\r
+    // Reset IRQ flags\r
+    BUTTONS_IFG &= ~ALL_BUTTONS;\r
+\r
+    // Enable button interrupts\r
+    BUTTONS_IE |= ALL_BUTTONS;\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          PORT2_ISR\r
+// @brief       Interrupt service routine for\r
+//                                      - buttons\r
+//                                      - acceleration sensor CMA_INT\r
+//                                      - pressure sensor DRDY\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+#pragma vector=PORT2_VECTOR\r
+__interrupt void PORT2_ISR(void)\r
+{\r
+    // Clear flags\r
+    u8 int_flag, int_enable;\r
+    u8 buzzer = 0;\r
+    u8 simpliciti_button_event = 0;\r
+    static u8 simpliciti_button_repeat = 0;\r
+\r
+    // Remember interrupt enable bits\r
+    int_enable = BUTTONS_IE;\r
+\r
+    if ((!button.flag.star_long) && (!button.flag.num_long))\r
+    {\r
+        // Clear button flags\r
+        button.all_flags = 0;\r
+\r
+        // Store valid button interrupt flag\r
+        int_flag = BUTTONS_IFG & int_enable;\r
+\r
+        // ---------------------------------------------------\r
+        // While SimpliciTI stack is active, buttons behave differently:\r
+        //  - Store button events in SimpliciTI packet data\r
+        //  - Exit SimpliciTI when button DOWN was pressed\r
+        if (is_rf())\r
+        {\r
+            // Erase previous button press after a number of resends (increase number if link\r
+            // quality is low)\r
+            // This will create a series of packets containing the same button press\r
+            // Necessary because we have no acknowledge\r
+            // Filtering (edge detection) will be done by receiver software\r
+            if (simpliciti_button_repeat++ > 6)\r
+            {\r
+                simpliciti_data[0] &= ~0xF0;\r
+                simpliciti_button_repeat = 0;\r
+            }\r
+\r
+            if ((int_flag & BUTTON_STAR_PIN) == BUTTON_STAR_PIN)\r
+            {\r
+                simpliciti_data[0] |= SIMPLICITI_BUTTON_STAR;\r
+                simpliciti_button_event = 1;\r
+            }\r
+            else if ((int_flag & BUTTON_NUM_PIN) == BUTTON_NUM_PIN)\r
+            {\r
+                simpliciti_data[0] |= SIMPLICITI_BUTTON_NUM;\r
+                simpliciti_button_event = 1;\r
+            }\r
+            else if ((int_flag & BUTTON_UP_PIN) == BUTTON_UP_PIN)\r
+            {\r
+                simpliciti_data[0] |= SIMPLICITI_BUTTON_UP;\r
+                simpliciti_button_event = 1;\r
+            }\r
+            else if ((int_flag & BUTTON_DOWN_PIN) == BUTTON_DOWN_PIN)\r
+            {\r
+                simpliciti_flag |= SIMPLICITI_TRIGGER_STOP;\r
+            }\r
+\r
+            // Trigger packet sending inside SimpliciTI stack\r
+            if (simpliciti_button_event)\r
+                simpliciti_flag |= SIMPLICITI_TRIGGER_SEND_DATA;\r
+        }\r
+        else                    // Normal operation\r
+        {\r
+            // Debounce buttons\r
+            if ((int_flag & ALL_BUTTONS) != 0)\r
+            {\r
+                // Disable PORT2 IRQ\r
+                __disable_interrupt();\r
+                BUTTONS_IE = 0x00;\r
+                __enable_interrupt();\r
+\r
+                // Debounce delay 1\r
+                Timer0_A4_Delay(CONV_MS_TO_TICKS(BUTTONS_DEBOUNCE_TIME_IN));\r
+\r
+                // Reset inactivity detection\r
+                sTime.last_activity = sTime.system_time;\r
+            }\r
+\r
+            // ---------------------------------------------------\r
+            // STAR button IRQ\r
+            if (IRQ_TRIGGERED(int_flag, BUTTON_STAR_PIN))\r
+            {\r
+                // Filter bouncing noise\r
+                if (BUTTON_STAR_IS_PRESSED)\r
+                {\r
+                    button.flag.star = 1;\r
+                    button.flag.star_not_long = 0;\r
+                    // Generate button click\r
+                    buzzer = 1;\r
+                }\r
+                else if ((BUTTONS_IES & BUTTON_STAR_PIN) == BUTTON_STAR_PIN)\r
+                {\r
+                    button.flag.star = 1;\r
+                    button.flag.star_not_long = 0;\r
+                    BUTTONS_IES &= ~BUTTON_STAR_PIN;\r
+                }\r
+            }\r
+            // ---------------------------------------------------\r
+            // NUM button IRQ\r
+            else if (IRQ_TRIGGERED(int_flag, BUTTON_NUM_PIN))\r
+            {\r
+                // Filter bouncing noise\r
+                if (BUTTON_NUM_IS_PRESSED)\r
+                {\r
+                    button.flag.num = 1;\r
+                    button.flag.num_not_long = 0;\r
+                    // Generate button click\r
+                    buzzer = 1;\r
+                }\r
+                else if ((BUTTONS_IES & BUTTON_NUM_PIN) == BUTTON_NUM_PIN)\r
+                {\r
+                    button.flag.num = 1;\r
+                    button.flag.num_not_long = 0;\r
+                    BUTTONS_IES &= ~BUTTON_NUM_PIN;\r
+                }\r
+            }\r
+            // ---------------------------------------------------\r
+            // UP button IRQ\r
+            else if (IRQ_TRIGGERED(int_flag, BUTTON_UP_PIN))\r
+            {\r
+                // Filter bouncing noise\r
+                if (BUTTON_UP_IS_PRESSED)\r
+                {\r
+                    button.flag.up = 1;\r
+\r
+                    // Generate button click\r
+                    buzzer = 1;\r
+                }\r
+            }\r
+            // ---------------------------------------------------\r
+            // DOWN button IRQ\r
+            else if (IRQ_TRIGGERED(int_flag, BUTTON_DOWN_PIN))\r
+            {\r
+                // Filter bouncing noise\r
+                if (BUTTON_DOWN_IS_PRESSED)\r
+                {\r
+                    button.flag.down = 1;\r
+\r
+                    // Generate button click\r
+                    buzzer = 1;\r
+                }\r
+            }\r
+            // ---------------------------------------------------\r
+            // B/L button IRQ\r
+            else if (IRQ_TRIGGERED(int_flag, BUTTON_BACKLIGHT_PIN))\r
+            {\r
+                // Filter bouncing noise\r
+                if (BUTTON_BACKLIGHT_IS_PRESSED)\r
+                {\r
+                    sButton.backlight_status = 1;\r
+                    sButton.backlight_timeout = 0;\r
+                    P2OUT |= BUTTON_BACKLIGHT_PIN;\r
+                    P2DIR |= BUTTON_BACKLIGHT_PIN;\r
+                }\r
+            }\r
+        }\r
+\r
+        // Trying to lock/unlock buttons?\r
+        if (button.flag.num && button.flag.down)\r
+        {\r
+            // No buzzer output\r
+            buzzer = 0;\r
+            button.all_flags = 0;\r
+        }\r
+\r
+        // Generate button click when button was activated\r
+        if (buzzer)\r
+        {\r
+\r
+            if (!sys.flag.up_down_repeat_enabled)\r
+            {\r
+                start_buzzer(1, CONV_MS_TO_TICKS(20), CONV_MS_TO_TICKS(150));\r
+            }\r
+\r
+            // Debounce delay 2\r
+            Timer0_A4_Delay(CONV_MS_TO_TICKS(BUTTONS_DEBOUNCE_TIME_OUT));\r
+        }\r
+\r
+        // ---------------------------------------------------\r
+        // Acceleration sensor IRQ\r
+        if (IRQ_TRIGGERED(int_flag, AS_INT_PIN))\r
+        {\r
+            // Get data from sensor\r
+            request.flag.acceleration_measurement = 1;\r
+        }\r
+\r
+        // ---------------------------------------------------\r
+        // Pressure sensor IRQ\r
+        if (IRQ_TRIGGERED(int_flag, PS_INT_PIN))\r
+        {\r
+            // Get data from sensor\r
+            request.flag.altitude_measurement = 1;\r
+        }\r
+\r
+        // ---------------------------------------------------\r
+        // Safe long button event detection\r
+        if (button.flag.star || button.flag.num)\r
+        {\r
+            // Additional debounce delay to enable safe high detection - 50ms\r
+            Timer0_A4_Delay(CONV_MS_TO_TICKS(BUTTONS_DEBOUNCE_TIME_LEFT));\r
+\r
+            // Check if this button event is short enough\r
+            if (BUTTON_STAR_IS_PRESSED)\r
+            {\r
+                // Change interrupt edge to detect button release\r
+                BUTTONS_IES |= BUTTON_STAR_PIN;\r
+                button.flag.star = 0;\r
+                // This flag is used to detect if the user released the button before the\r
+                // time for a long button press (3s)\r
+                button.flag.star_not_long = 1;\r
+            }\r
+            if (BUTTON_NUM_IS_PRESSED)\r
+            {\r
+                // Change interrupt edge to detect button release\r
+                BUTTONS_IES |= BUTTON_NUM_PIN;\r
+                button.flag.num = 0;\r
+                // This flag is used to detect if the user released the button before the\r
+                // time for a long button press (3s)\r
+                button.flag.num_not_long = 1;\r
+            }\r
+        }\r
+    }\r
+    // Reenable PORT2 IRQ\r
+    __disable_interrupt();\r
+    BUTTONS_IFG = 0x00;\r
+    BUTTONS_IE = int_enable;\r
+    __enable_interrupt();\r
+\r
+    // Exit from LPM3/LPM4 on RETI\r
+    __bic_SR_register_on_exit(LPM4_bits);\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          button_repeat_on\r
+// @brief       Start button auto repeat timer.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void button_repeat_on(u16 msec)\r
+{\r
+    // Set button repeat flag\r
+    sys.flag.up_down_repeat_enabled = 1;\r
+\r
+    // Set Timer0_A3 function pointer to button repeat function\r
+    fptr_Timer0_A3_function = button_repeat_function;\r
+\r
+    // Timer0_A3 IRQ triggers every 200ms\r
+    Timer0_A3_Start(CONV_MS_TO_TICKS(msec));\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          button_repeat_off\r
+// @brief       Stop button auto repeat timer.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void button_repeat_off(void)\r
+{\r
+    // Clear button repeat flag\r
+    sys.flag.up_down_repeat_enabled = 0;\r
+\r
+    // Timer0_A3 IRQ repeats with 4Hz\r
+    Timer0_A3_Stop();\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          button_repeat_function\r
+// @brief       Check at regular intervals if button is pushed continuously\r
+//                              and trigger virtual button event.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void button_repeat_function(void)\r
+{\r
+    static u8 start_delay = 10; // Wait for 2 seconds before starting auto up/down\r
+    u8 repeat = 0;\r
+\r
+    // If buttons UP or DOWN are continuously high, repeatedly set button flag\r
+    if (BUTTON_UP_IS_PRESSED)\r
+    {\r
+        if (start_delay == 0)\r
+        {\r
+            // Generate a virtual button event\r
+            button.flag.up = 1;\r
+            repeat = 1;\r
+        }\r
+        else\r
+        {\r
+            start_delay--;\r
+        }\r
+    }\r
+    else if (BUTTON_DOWN_IS_PRESSED)\r
+    {\r
+        if (start_delay == 0)\r
+        {\r
+            // Generate a virtual button event\r
+            button.flag.down = 1;\r
+            repeat = 1;\r
+        }\r
+        else\r
+        {\r
+            start_delay--;\r
+        }\r
+    }\r
+    else\r
+    {\r
+        // Reset repeat counter\r
+        sButton.repeats = 0;\r
+        start_delay = 10;\r
+\r
+        // Enable blinking\r
+        start_blink();\r
+    }\r
+\r
+    // If virtual button event is generated, stop blinking and reset timeout counter\r
+    if (repeat)\r
+    {\r
+        // Increase repeat counter\r
+        sButton.repeats++;\r
+\r
+        // Reset inactivity detection counter\r
+        sTime.last_activity = sTime.system_time;\r
+\r
+        // Disable blinking\r
+        stop_blink();\r
+    }\r
+}\r
+\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/driver/ports.h b/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/driver/ports.h
new file mode 100755 (executable)
index 0000000..96c3fc2
--- /dev/null
@@ -0,0 +1,130 @@
+// *************************************************************************************************\r
+//\r
+//      Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//        Redistribution and use in source and binary forms, with or without\r
+//        modification, are permitted provided that the following conditions\r
+//        are met:\r
+//\r
+//          Redistributions of source code must retain the above copyright\r
+//          notice, this list of conditions and the following disclaimer.\r
+//\r
+//          Redistributions in binary form must reproduce the above copyright\r
+//          notice, this list of conditions and the following disclaimer in the\r
+//          documentation and/or other materials provided with the\r
+//          distribution.\r
+//\r
+//          Neither the name of Texas Instruments Incorporated nor the names of\r
+//          its contributors may be used to endorse or promote products derived\r
+//          from this software without specific prior written permission.\r
+//\r
+//        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+\r
+#ifndef PORTS_H_\r
+#define PORTS_H_\r
+\r
+// *************************************************************************************************\r
+// Defines section\r
+\r
+// Port, pins and interrupt resources for buttons\r
+#define BUTTONS_IN              (P2IN)\r
+#define BUTTONS_OUT                             (P2OUT)\r
+#define BUTTONS_DIR             (P2DIR)\r
+#define BUTTONS_REN                             (P2REN)\r
+#define BUTTONS_IE              (P2IE)\r
+#define BUTTONS_IES             (P2IES)\r
+#define BUTTONS_IFG             (P2IFG)\r
+#define BUTTONS_IRQ_VECT2       (PORT2_VECTOR)\r
+\r
+// Button ports\r
+#define BUTTON_STAR_PIN         (BIT2)\r
+#define BUTTON_NUM_PIN          (BIT1)\r
+#define BUTTON_UP_PIN           (BIT4)\r
+#define BUTTON_DOWN_PIN         (BIT0)\r
+#define BUTTON_BACKLIGHT_PIN    (BIT3)\r
+#define ALL_BUTTONS                             (BUTTON_STAR_PIN + BUTTON_NUM_PIN + BUTTON_UP_PIN + \\r
+                                                 BUTTON_DOWN_PIN + BUTTON_BACKLIGHT_PIN)\r
+\r
+// Macros for button press detection\r
+#define BUTTON_STAR_IS_PRESSED          ((BUTTONS_IN & BUTTON_STAR_PIN) == BUTTON_STAR_PIN)\r
+#define BUTTON_NUM_IS_PRESSED           ((BUTTONS_IN & BUTTON_NUM_PIN) == BUTTON_NUM_PIN)\r
+#define BUTTON_UP_IS_PRESSED            ((BUTTONS_IN & BUTTON_UP_PIN) == BUTTON_UP_PIN)\r
+#define BUTTON_DOWN_IS_PRESSED          ((BUTTONS_IN & BUTTON_DOWN_PIN) == BUTTON_DOWN_PIN)\r
+#define BUTTON_BACKLIGHT_IS_PRESSED     ((BUTTONS_IN & BUTTON_BACKLIGHT_PIN) == \\r
+                                         BUTTON_BACKLIGHT_PIN)\r
+#define NO_BUTTON_IS_PRESSED            ((BUTTONS_IN & ALL_BUTTONS) == 0)\r
+\r
+// Macros for button release detection\r
+#define BUTTON_STAR_IS_RELEASED                 ((BUTTONS_IN & BUTTON_STAR_PIN) == 0)\r
+#define BUTTON_NUM_IS_RELEASED                  ((BUTTONS_IN & BUTTON_NUM_PIN) == 0)\r
+#define BUTTON_UP_IS_RELEASED                   (BUTTONS_IN & BUTTON_UP_PIN) == 0)\r
+#define BUTTON_DOWN_IS_RELEASED                 ((BUTTONS_IN & BUTTON_DOWN_PIN) == 0)\r
+#define BUTTON_BACKLIGHT_IS_RELEASED    ((BUTTONS_IN & BUTTON_BACKLIGHT_PIN) == 0)\r
+\r
+// Button debounce time (msec)\r
+#define BUTTONS_DEBOUNCE_TIME_IN        (5u)\r
+#define BUTTONS_DEBOUNCE_TIME_OUT       (250u)\r
+#define BUTTONS_DEBOUNCE_TIME_LEFT      (50u)\r
+\r
+// Detect if STAR / NUM button is held low continuously\r
+#define LEFT_BUTTON_LONG_TIME           (2u)\r
+\r
+// Backlight time (sec)\r
+#define BACKLIGHT_TIME_ON                       (3u)\r
+\r
+// Leave set_value() function after some seconds of user inactivity\r
+#define INACTIVITY_TIME                 (30u)\r
+\r
+// Set of button flags\r
+typedef union\r
+{\r
+    struct\r
+    {\r
+        // Manual button events\r
+        u16 star              : 1; // Short STAR button press\r
+        u16 num               : 1; // Short NUM button press\r
+        u16 up                : 1; // Short UP button press\r
+        u16 down              : 1; // Short DOWN button press\r
+        u16 backlight         : 1; // Short BACKLIGHT button press\r
+        u16 star_long         : 1; // Long STAR button press\r
+        u16 num_long          : 1; // Long NUM button press\r
+        u16 star_not_long     : 1; // Between short and long STAR button press\r
+        u16 num_not_long      : 1; // Between short and long NUM button press\r
+    } flag;\r
+    u16 all_flags;                 // Shortcut to all display flags (for reset)\r
+} s_button_flags;\r
+extern volatile s_button_flags button;\r
+\r
+struct struct_button\r
+{\r
+    u8 star_timeout;               // This variable is incremented once per second if STAR button is\r
+                                   // still pressed\r
+    u8 num_timeout;                // This variable is incremented once per second if NUM button is\r
+                                   // still pressed\r
+    u8 backlight_timeout;          // controls the timeout for the backlight\r
+    u8 backlight_status;           // 1 case backlight is on\r
+    s16 repeats;\r
+};\r
+extern volatile struct struct_button sButton;\r
+\r
+// *************************************************************************************************\r
+// Extern section\r
+extern void button_repeat_on(u16 msec);\r
+extern void button_repeat_off(void);\r
+extern void button_repeat_function(void);\r
+extern void init_buttons(void);\r
+\r
+#endif                             /*PORTS_H_ */\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/driver/radio.c b/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/driver/radio.c
new file mode 100755 (executable)
index 0000000..8e5a36b
--- /dev/null
@@ -0,0 +1,187 @@
+// *************************************************************************************************\r
+//\r
+//      Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//        Redistribution and use in source and binary forms, with or without\r
+//        modification, are permitted provided that the following conditions\r
+//        are met:\r
+//\r
+//          Redistributions of source code must retain the above copyright\r
+//          notice, this list of conditions and the following disclaimer.\r
+//\r
+//          Redistributions in binary form must reproduce the above copyright\r
+//          notice, this list of conditions and the following disclaimer in the\r
+//          documentation and/or other materials provided with the\r
+//          distribution.\r
+//\r
+//          Neither the name of Texas Instruments Incorporated nor the names of\r
+//          its contributors may be used to endorse or promote products derived\r
+//          from this software without specific prior written permission.\r
+//\r
+//        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+// Radio core access functions. Taken from TI reference code for CC430.\r
+// *************************************************************************************************\r
+\r
+// system\r
+#include "project.h"\r
+\r
+// driver\r
+#include "rf1a.h"\r
+#include "timer.h"\r
+\r
+// logic\r
+#include "rfsimpliciti.h"\r
+#include "bluerobin.h"\r
+\r
+// *************************************************************************************************\r
+// Extern section\r
+\r
+// SimpliciTI CC430 radio ISR - located in SimpliciTi library\r
+extern void MRFI_RadioIsr(void);\r
+\r
+// BlueRobin CC430 radio ISR - located in BlueRobin library\r
+extern void BlueRobin_RadioISR_v(void);\r
+\r
+// *************************************************************************************************\r
+// @fn          radio_reset\r
+// @brief       Reset radio core.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void radio_reset(void)\r
+{\r
+    volatile u16 i;\r
+    u8 x;\r
+\r
+    // Reset radio core\r
+    Strobe(RF_SRES);\r
+    // Wait before checking IDLE\r
+    for (i = 0; i < 100; i++) ;\r
+    do\r
+    {\r
+        x = Strobe(RF_SIDLE);\r
+    }\r
+    while ((x & 0x70) != 0x00);\r
+\r
+    // Clear radio error register\r
+    RF1AIFERR = 0;\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          radio_powerdown\r
+// @brief       Put radio to SLEEP mode.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void radio_powerdown(void)\r
+{\r
+    /* Chip bug: Radio does not come out of this SLEEP when put to sleep\r
+     * using the SPWD cmd. However, it does wakes up if SXOFF was used to\r
+     * put it to sleep.\r
+     */\r
+    // Powerdown radio\r
+    Strobe(RF_SIDLE);\r
+    Strobe(RF_SPWD);\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          radio_sxoff\r
+// @brief       Put radio to SLEEP mode (XTAL off only).\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void radio_sxoff(void)\r
+{\r
+    /* Chip bug: Radio does not come out of this SLEEP when put to sleep\r
+     * using the SPWD cmd. However, it does wakes up if SXOFF was used to\r
+     * put it to sleep.\r
+     */\r
+    // Powerdown radio\r
+    Strobe(RF_SIDLE);\r
+    Strobe(RF_SXOFF);\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          open_radio\r
+// @brief       Prepare radio for RF communication.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void open_radio(void)\r
+{\r
+    // Reset radio core\r
+    radio_reset();\r
+\r
+    // Enable radio IRQ\r
+    RF1AIFG &= ~BIT4;           // Clear a pending interrupt\r
+    RF1AIE |= BIT4;             // Enable the interrupt\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          close_radio\r
+// @brief       Shutdown radio for RF communication.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void close_radio(void)\r
+{\r
+    // Disable radio IRQ\r
+    RF1AIFG = 0;\r
+    RF1AIE = 0;\r
+\r
+    // Reset radio core\r
+    radio_reset();\r
+\r
+    // Put radio to sleep\r
+    radio_powerdown();\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          GDOx_ISR\r
+// @brief       GDO0/2 ISR to detect received packet.\r
+//                              In BlueRobin mode:  capture packet end time and decode received\r
+// packet\r
+//                              In SimpliciTI mode: go to SimpliciTI handler\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+#pragma vector=CC1101_VECTOR\r
+__interrupt void radio_ISR(void)\r
+{\r
+    u8 rf1aivec = RF1AIV;\r
+\r
+    // Forward to SimpliciTI interrupt service routine\r
+    if (is_rf())\r
+    {\r
+        MRFI_RadioIsr();\r
+    }\r
+    else                                  // BlueRobin packet end interrupt service routine\r
+    {\r
+        if (rf1aivec == RF1AIV_RFIFG9)\r
+        {\r
+            if ((sBlueRobin.state == BLUEROBIN_SEARCHING) ||\r
+                (sBlueRobin.state == BLUEROBIN_CONNECTED))\r
+            {\r
+                BlueRobin_RadioISR_v();\r
+            }\r
+        }\r
+        else if (rf1aivec == RF1AIV_NONE) // RF1A interface interrupt (error etc.)\r
+        {\r
+            asm ("     nop"); // break here\r
+        }\r
+    }\r
+}\r
+\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/driver/radio.h b/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/driver/radio.h
new file mode 100755 (executable)
index 0000000..f4c1bb9
--- /dev/null
@@ -0,0 +1,48 @@
+// *************************************************************************************************\r
+//\r
+//      Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//        Redistribution and use in source and binary forms, with or without\r
+//        modification, are permitted provided that the following conditions\r
+//        are met:\r
+//\r
+//          Redistributions of source code must retain the above copyright\r
+//          notice, this list of conditions and the following disclaimer.\r
+//\r
+//          Redistributions in binary form must reproduce the above copyright\r
+//          notice, this list of conditions and the following disclaimer in the\r
+//          documentation and/or other materials provided with the\r
+//          distribution.\r
+//\r
+//          Neither the name of Texas Instruments Incorporated nor the names of\r
+//          its contributors may be used to endorse or promote products derived\r
+//          from this software without specific prior written permission.\r
+//\r
+//        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+\r
+#ifndef RADIO_H_\r
+#define RADIO_H_\r
+\r
+extern void radio_reset(void);\r
+extern void radio_powerdown(void);\r
+extern void radio_sxoff(void);\r
+extern void radio_idle(void);\r
+extern void open_radio(void);\r
+extern void close_radio(void);\r
+extern void pmm_set_high_current_mode(void);\r
+extern void pmm_set_low_current_mode(void);\r
+\r
+#endif                          /*RADIO_H_ */\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/driver/rf1a.c b/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/driver/rf1a.c
new file mode 100755 (executable)
index 0000000..9f3b5be
--- /dev/null
@@ -0,0 +1,233 @@
+// *************************************************************************************************\r
+//\r
+// Actual revision: $Revision: $\r
+// Revision label:  $Name: $\r
+// Revision state:  $State: $\r
+//\r
+// *************************************************************************************************\r
+// Radio core access functions. Taken from TI reference code for CC430.\r
+// *************************************************************************************************\r
+\r
+// *************************************************************************************************\r
+// Include section\r
+\r
+// system\r
+#include <project.h>\r
+\r
+// driver\r
+#include "rf1a.h"\r
+\r
+// *************************************************************************************************\r
+// Global section\r
+\r
+// *************************************************************************************************\r
+// Define section\r
+#define st(x)                                           do { x } while (__LINE__ == -1)\r
+#define ENTER_CRITICAL_SECTION(x)       st(x = __get_interrupt_state(); __disable_interrupt(); )\r
+#define EXIT_CRITICAL_SECTION(x)    __set_interrupt_state(x)\r
+\r
+// *************************************************************************************************\r
+// @fn          Strobe\r
+// @brief       Send command to radio.\r
+// @param       unsigned char strobe    Command to radio\r
+// @return      statusByte                              Radio core status\r
+// *************************************************************************************************\r
+unsigned char Strobe(unsigned char strobe)\r
+{\r
+    u8 statusByte = 0;\r
+    u16 int_state, gdo_state;\r
+\r
+    // Check for valid strobe command\r
+    if ((strobe == 0xBD) || ((strobe > RF_SRES) && (strobe < RF_SNOP)))\r
+    {\r
+        ENTER_CRITICAL_SECTION(int_state);\r
+\r
+        // Clear the Status read flag\r
+        RF1AIFCTL1 &= ~(RFSTATIFG);\r
+\r
+        // Wait for radio to be ready for next instruction\r
+        while (!(RF1AIFCTL1 & RFINSTRIFG)) ;\r
+\r
+        // Write the strobe instruction\r
+        if ((strobe > RF_SRES) && (strobe < RF_SNOP))\r
+        {\r
+\r
+            gdo_state = ReadSingleReg(IOCFG2);         // buffer IOCFG2 state\r
+            WriteSingleReg(IOCFG2, 0x29);              // c-ready to GDO2\r
+\r
+            RF1AINSTRB = strobe;\r
+            if ((RF1AIN & 0x04) == 0x04)               // chip at sleep mode\r
+            {\r
+                if ((strobe == RF_SXOFF) || (strobe == RF_SPWD) || (strobe == RF_SWOR))\r
+                {\r
+                }\r
+                else\r
+                {\r
+                    while ((RF1AIN & 0x04) == 0x04) ;  // c-ready ?\r
+                    __delay_cycles(9800);              // Delay for ~810usec at 12MHz CPU clock\r
+                }\r
+            }\r
+            WriteSingleReg(IOCFG2, gdo_state);         // restore IOCFG2 setting\r
+        }\r
+        else                                           // chip active mode\r
+        {\r
+            RF1AINSTRB = strobe;\r
+        }\r
+        statusByte = RF1ASTATB;\r
+        while (!(RF1AIFCTL1 & RFSTATIFG)) ;\r
+        EXIT_CRITICAL_SECTION(int_state);\r
+    }\r
+    return statusByte;\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          ResetRadioCore\r
+// @brief       Software reset radio core.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void ResetRadioCore(void)\r
+{\r
+    Strobe(RF_SRES);            // Reset the Radio Core\r
+    Strobe(RF_SNOP);            // Reset Radio Pointer\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          ReadSingleReg\r
+// @brief       Read byte from register.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+unsigned char ReadSingleReg(unsigned char addr)\r
+{\r
+    unsigned char x;\r
+    u16 int_state;\r
+\r
+    ENTER_CRITICAL_SECTION(int_state);\r
+\r
+    RF1AINSTR1B = (addr | RF_REGRD);\r
+    x = RF1ADOUT1B;\r
+\r
+    EXIT_CRITICAL_SECTION(int_state);\r
+\r
+    return x;\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          WriteSingleReg\r
+// @brief       Write byte to register.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void WriteSingleReg(unsigned char addr, unsigned char value)\r
+{\r
+    volatile unsigned int i;\r
+    u16 int_state;\r
+\r
+    ENTER_CRITICAL_SECTION(int_state);\r
+\r
+    while (!(RF1AIFCTL1 & RFINSTRIFG)) ;           // Wait for the Radio to be ready for the next\r
+                                                   // instruction\r
+\r
+    RF1AINSTRW = ((addr | RF_REGWR) << 8) + value; // Send address + Instruction\r
+    while (!(RFDINIFG & RF1AIFCTL1)) ;\r
+\r
+    i = RF1ADOUTB;                                 // Reset RFDOUTIFG flag which contains status\r
+                                                   // byte\r
+\r
+    EXIT_CRITICAL_SECTION(int_state);\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          ReadBurstReg\r
+// @brief       Read sequence of bytes from register.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void ReadBurstReg(unsigned char addr, unsigned char *buffer, unsigned char count)\r
+{\r
+    unsigned int i;\r
+    u16 int_state;\r
+\r
+    ENTER_CRITICAL_SECTION(int_state);\r
+\r
+    while (!(RF1AIFCTL1 & RFINSTRIFG)) ;     // Wait for the Radio to be ready for next instruction\r
+    RF1AINSTR1B = (addr | RF_REGRD);         // Send address + Instruction\r
+\r
+    for (i = 0; i < (count - 1); i++)\r
+    {\r
+        while (!(RFDOUTIFG & RF1AIFCTL1)) ;  // Wait for the Radio Core to update the RF1ADOUTB reg\r
+        buffer[i] = RF1ADOUT1B;              // Read DOUT from Radio Core + clears RFDOUTIFG\r
+        // Also initiates auo-read for next DOUT byte\r
+    }\r
+    buffer[count - 1] = RF1ADOUT0B;          // Store the last DOUT from Radio Core\r
+\r
+    EXIT_CRITICAL_SECTION(int_state);\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          WriteBurstReg\r
+// @brief       Write sequence of bytes to register.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void WriteBurstReg(unsigned char addr, unsigned char *buffer, unsigned char count)\r
+{\r
+    // Write Burst works wordwise not bytewise - bug known already\r
+    unsigned char i;\r
+    u16 int_state;\r
+\r
+    ENTER_CRITICAL_SECTION(int_state);\r
+\r
+    while (!(RF1AIFCTL1 & RFINSTRIFG)) ;               // Wait for the Radio to be ready for next\r
+                                                       // instruction\r
+    RF1AINSTRW = ((addr | RF_REGWR) << 8) + buffer[0]; // Send address + Instruction\r
+\r
+    for (i = 1; i < count; i++)\r
+    {\r
+        RF1ADINB = buffer[i];                          // Send data\r
+        while (!(RFDINIFG & RF1AIFCTL1)) ;             // Wait for TX to finish\r
+    }\r
+    i = RF1ADOUTB;                                     // Reset RFDOUTIFG flag which contains status\r
+                                                       // byte\r
+\r
+    EXIT_CRITICAL_SECTION(int_state);\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          WritePATable\r
+// @brief       Write data to power table\r
+// @param       unsigned char value             Value to write\r
+// @return      none\r
+// *************************************************************************************************\r
+void WritePATable(unsigned char value)\r
+{\r
+    unsigned char readbackPATableValue = 0;\r
+    u16 int_state;\r
+\r
+    ENTER_CRITICAL_SECTION(int_state);\r
+\r
+    while (readbackPATableValue != value)\r
+    {\r
+        while (!(RF1AIFCTL1 & RFINSTRIFG)) ;\r
+        RF1AINSTRW = 0x7E00 + value; // PA Table write (burst)\r
+\r
+        while (!(RF1AIFCTL1 & RFINSTRIFG)) ;\r
+        RF1AINSTRB = RF_SNOP;        // reset pointer\r
+\r
+        while (!(RF1AIFCTL1 & RFINSTRIFG)) ;\r
+        RF1AINSTRB = 0xFE;           // PA Table read (burst)\r
+\r
+        while (!(RF1AIFCTL1 & RFDINIFG)) ;\r
+        RF1ADINB = 0x00;             //dummy write\r
+\r
+        while (!(RF1AIFCTL1 & RFDOUTIFG)) ;\r
+        readbackPATableValue = RF1ADOUT0B;\r
+\r
+        while (!(RF1AIFCTL1 & RFINSTRIFG)) ;\r
+        RF1AINSTRB = RF_SNOP;\r
+    }\r
+\r
+    EXIT_CRITICAL_SECTION(int_state);\r
+}\r
+\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/driver/rf1a.h b/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/driver/rf1a.h
new file mode 100755 (executable)
index 0000000..f1acd1c
--- /dev/null
@@ -0,0 +1,20 @@
+// *************************************************************************************************\r
+//\r
+// Actual revision: $Revision: $\r
+// Revision label:  $Name: $\r
+// Revision state:  $State: $\r
+//\r
+// *************************************************************************************************\r
+// Radio core access functions. Taken from TI reference code for CC430.\r
+// *************************************************************************************************\r
+\r
+// *************************************************************************************************\r
+// Prototype section\r
+unsigned char Strobe(unsigned char strobe);\r
+unsigned char ReadSingleReg(unsigned char addr);\r
+void WriteSingleReg(unsigned char addr, unsigned char value);\r
+void ReadBurstReg(unsigned char addr, unsigned char *buffer, unsigned char count);\r
+void WriteBurstReg(unsigned char addr, unsigned char *buffer, unsigned char count);\r
+void ResetRadioCore(void);\r
+void WritePATable(unsigned char value);\r
+void WaitForXT2(void);\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/driver/timer.c b/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/driver/timer.c
new file mode 100755 (executable)
index 0000000..428bb68
--- /dev/null
@@ -0,0 +1,485 @@
+// *************************************************************************************************\r
+//\r
+//      Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//        Redistribution and use in source and binary forms, with or without\r
+//        modification, are permitted provided that the following conditions\r
+//        are met:\r
+//\r
+//          Redistributions of source code must retain the above copyright\r
+//          notice, this list of conditions and the following disclaimer.\r
+//\r
+//          Redistributions in binary form must reproduce the above copyright\r
+//          notice, this list of conditions and the following disclaimer in the\r
+//          documentation and/or other materials provided with the\r
+//          distribution.\r
+//\r
+//          Neither the name of Texas Instruments Incorporated nor the names of\r
+//          its contributors may be used to endorse or promote products derived\r
+//          from this software without specific prior written permission.\r
+//\r
+//        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+// Timer service routines.\r
+// *************************************************************************************************\r
+\r
+// *************************************************************************************************\r
+// Include section\r
+\r
+// system\r
+#include "project.h"\r
+\r
+// driver\r
+#include "timer.h"\r
+#include "ports.h"\r
+#include "buzzer.h"\r
+#include "vti_ps.h"\r
+#include "vti_as.h"\r
+\r
+// logic\r
+#include "clock.h"\r
+#include "battery.h"\r
+#include "altitude.h"\r
+#include "display.h"\r
+#include "rfsimpliciti.h"\r
+#include "simpliciti.h"\r
+#include "acceleration.h"\r
+#include "bluerobin.h"\r
+#include "temperature.h"\r
+#include "datalog.h"\r
+\r
+// *************************************************************************************************\r
+// Prototypes section\r
+void Timer0_Init(void);\r
+void Timer0_Stop(void);\r
+void Timer0_A1_Start(void);\r
+void Timer0_A1_Stop(void);\r
+void Timer0_A3_Start(u16 ticks);\r
+void Timer0_A3_Stop(void);\r
+void Timer0_A4_Delay(u16 ticks);\r
+\r
+void (*fptr_Timer0_A3_function)(void);\r
+\r
+// *************************************************************************************************\r
+// Defines section\r
+\r
+// *************************************************************************************************\r
+// Global Variable section\r
+struct timer sTimer;\r
+\r
+// *************************************************************************************************\r
+// Extern section\r
+extern void BRRX_TimerTask_v(void);\r
+extern void to_lpm(void);\r
+\r
+// *************************************************************************************************\r
+// @fn          Timer0_Init\r
+// @brief       Set Timer0 to a period of 1 or 2 sec. IRQ TACCR0 is asserted when timer overflows.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void Timer0_Init(void)\r
+{\r
+    // Set interrupt frequency to 1Hz\r
+    TA0CCR0 = 32768 - 1;\r
+\r
+    // Enable timer interrupt\r
+    TA0CCTL0 |= CCIE;\r
+\r
+    // Clear and start timer now\r
+    // Continuous mode: Count to 0xFFFF and restart from 0 again - 1sec timing will be generated by\r
+    // ISR\r
+    TA0CTL |= TASSEL0 + MC1 + TACLR;\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          Timer0_Start\r
+// @brief       Start Timer0.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void Timer0_Start(void)\r
+{\r
+    // Start Timer0 in continuous mode\r
+    TA0CTL |= MC_2;\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          Timer0_Stop\r
+// @brief       Stop and reset Timer0.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void Timer0_Stop(void)\r
+{\r
+    // Stop Timer0\r
+    TA0CTL &= ~MC_2;\r
+\r
+    // Set Timer0 count register to 0x0000\r
+    TA0R = 0;\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          Timer0_A3_Start\r
+// @brief       Trigger IRQ every "ticks" microseconds\r
+// @param       ticks (1 tick = 1/32768 sec)\r
+// @return      none\r
+// *************************************************************************************************\r
+void Timer0_A3_Start(u16 ticks)\r
+{\r
+    u16 value = 0;\r
+\r
+    // Store timer ticks in global variable\r
+    sTimer.timer0_A3_ticks = ticks;\r
+\r
+    // Delay based on current counter value\r
+    // To make sure this value is correctly read\r
+    while (value != TA0R)\r
+        value = TA0R;\r
+    value += ticks;\r
+\r
+    // Update CCR\r
+    TA0CCR3 = value;\r
+\r
+    // Reset IRQ flag\r
+    TA0CCTL3 &= ~CCIFG;\r
+\r
+    // Enable timer interrupt\r
+    TA0CCTL3 |= CCIE;\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          Timer0_A3_Stop\r
+// @brief       Stop Timer0_A3.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void Timer0_A3_Stop(void)\r
+{\r
+    // Clear timer interrupt\r
+    TA0CCTL3 &= ~CCIE;\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          Timer0_A4_Delay\r
+// @brief       Wait for some microseconds\r
+// @param       ticks (1 tick = 1/32768 sec)\r
+// @return      none\r
+// *************************************************************************************************\r
+void Timer0_A4_Delay(u16 ticks)\r
+{\r
+    u16 value = 0;\r
+\r
+    // Exit immediately if Timer0 not running - otherwise we'll get stuck here\r
+    if ((TA0CTL & (BIT4 | BIT5)) == 0)\r
+        return;\r
+\r
+    // Disable timer interrupt\r
+    TA0CCTL4 &= ~CCIE;\r
+\r
+    // Clear delay_over flag\r
+    sys.flag.delay_over = 0;\r
+\r
+    // Add delay to current timer value\r
+    // To make sure this value is correctly read\r
+    while (value != TA0R)\r
+        value = TA0R;\r
+    value += ticks;\r
+\r
+    // Update CCR\r
+    TA0CCR4 = value;\r
+\r
+    // Reset IRQ flag\r
+    TA0CCTL4 &= ~CCIFG;\r
+\r
+    // Enable timer interrupt\r
+    TA0CCTL4 |= CCIE;\r
+\r
+    // Wait for timer IRQ\r
+    while (1)\r
+    {\r
+        // Delay in LPM\r
+        to_lpm();               // will also set GIE again\r
+\r
+#ifdef USE_WATCHDOG\r
+        // Service watchdog\r
+        WDTCTL = WDTPW + WDTIS__512K + WDTSSEL__ACLK + WDTCNTCL;\r
+#endif\r
+\r
+        // Check stop condition\r
+        // disable interrupt to prevent flag's change caused by interrupt methods\r
+        __disable_interrupt();\r
+        if (sys.flag.delay_over)\r
+            break;\r
+    }\r
+    __enable_interrupt();\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          TIMER0_A0_ISR\r
+// @brief       IRQ handler for TIMER0_A0 IRQ\r
+//                              Timer0_A0       1/1sec clock tick                       (serviced by\r
+// function TIMER0_A0_ISR)\r
+//                              Timer0_A1\r
+//                                                               (serviced by function\r
+// TIMER0_A1_5_ISR)\r
+//                              Timer0_A2       1/100 sec Stopwatch                     (serviced by\r
+// function TIMER0_A1_5_ISR)\r
+//                              Timer0_A3       Configurable periodic IRQ       (serviced by\r
+// function TIMER0_A1_5_ISR)\r
+//                              Timer0_A4       One-time delay                          (serviced by\r
+// function TIMER0_A1_5_ISR)\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+#pragma vector = TIMER0_A0_VECTOR\r
+__interrupt void TIMER0_A0_ISR(void)\r
+{\r
+    static u8 button_lock_counter = 0;\r
+\r
+    // Disable IE\r
+    TA0CCTL0 &= ~CCIE;\r
+    // Reset IRQ flag\r
+    TA0CCTL0 &= ~CCIFG;\r
+    // Add 1 sec to TACCR0 register (IRQ will be asserted at 0x7FFF and 0xFFFF = 1 sec intervals)\r
+    TA0CCR0 += 32768;\r
+    // Enable IE\r
+    TA0CCTL0 |= CCIE;\r
+\r
+    // Add 1 second to global time\r
+    clock_tick();\r
+\r
+    // Set clock update flag\r
+    display.flag.update_time = 1;\r
+\r
+    // While BlueRobin searches freeze system state\r
+    if (is_bluerobin_searching())\r
+    {\r
+        // Exit from LPM3 on RETI\r
+        _BIC_SR_IRQ(LPM3_bits);\r
+        return;\r
+    }\r
+\r
+    if ((is_rf()) && (sRFsmpl.mode == SIMPLICITI_SYNC))\r
+    {\r
+        if (sRFsmpl.display_sync_done == 0)\r
+        {\r
+            display_chars(LCD_SEG_L2_5_0, (u8 *) "  SYNC", SEG_ON);\r
+        }\r
+        else\r
+        {\r
+            sRFsmpl.display_sync_done--;\r
+        }\r
+    }\r
+\r
+    // -------------------------------------------------------------------\r
+    // Service modules that require 1/min processing\r
+    if (sTime.drawFlag >= 2)\r
+    {\r
+        // Measure battery voltage\r
+        request.flag.voltage_measurement = 1;\r
+    }\r
+\r
+    // -------------------------------------------------------------------\r
+    // Service active modules that require 1/s processing\r
+\r
+    // Request data logging\r
+    if (is_datalog())\r
+        request.flag.datalog = 1;\r
+\r
+    // Request temperature and pressure measurement\r
+    if (is_altitude_measurement())\r
+        request.flag.altitude_measurement = 1;\r
+\r
+    // Get BlueRobin data from API\r
+    if (is_bluerobin())\r
+        get_bluerobin_data();\r
+\r
+    // If battery is low, count down display counter\r
+    if (sys.flag.low_battery)\r
+    {\r
+        if (sBatt.lobatt_display-- == 0)\r
+        {\r
+            message.flag.prepare = 1;\r
+            message.flag.type_lobatt = 1;\r
+            sBatt.lobatt_display = BATTERY_LOW_MESSAGE_CYCLE;\r
+        }\r
+    }\r
+\r
+    // If a message has to be displayed, set display flag\r
+    if (message.all_flags)\r
+    {\r
+        if (message.flag.prepare)\r
+        {\r
+            message.flag.prepare = 0;\r
+            message.flag.show = 1;\r
+        }\r
+        else if (message.flag.erase)    // message cycle is over, so erase it\r
+        {\r
+            message.flag.erase = 0;\r
+            display.flag.full_update = 1;\r
+        }\r
+    }\r
+\r
+    // -------------------------------------------------------------------\r
+    // Check idle timeout, set timeout flag\r
+    if (sys.flag.idle_timeout_enabled)\r
+    {\r
+        if (sTime.system_time - sTime.last_activity > INACTIVITY_TIME)\r
+            sys.flag.idle_timeout = 1;  //setFlag(sysFlag_g, SYS_TIMEOUT_IDLE);\r
+    }\r
+\r
+    // -------------------------------------------------------------------\r
+    // Turn the Backlight off after timeout\r
+    if (sButton.backlight_status == 1)\r
+    {\r
+        if (sButton.backlight_timeout > BACKLIGHT_TIME_ON)\r
+        {\r
+            //turn off Backlight\r
+            P2OUT &= ~BUTTON_BACKLIGHT_PIN;\r
+            P2DIR &= ~BUTTON_BACKLIGHT_PIN;\r
+            sButton.backlight_timeout = 0;\r
+            sButton.backlight_status = 0;\r
+        }\r
+        else\r
+        {\r
+            sButton.backlight_timeout++;\r
+        }\r
+    }\r
+\r
+    // -------------------------------------------------------------------\r
+    // Detect continuous button high states\r
+\r
+    // Trying to lock/unlock buttons?\r
+    if (BUTTON_NUM_IS_PRESSED && BUTTON_DOWN_IS_PRESSED)\r
+    {\r
+        if (button_lock_counter++ > LEFT_BUTTON_LONG_TIME)\r
+        {\r
+            // Toggle lock / unlock buttons flag\r
+            sys.flag.lock_buttons = ~sys.flag.lock_buttons;\r
+\r
+            // Show "buttons are locked/unlocked" message synchronously with next second tick\r
+            message.flag.prepare = 1;\r
+            if (sys.flag.lock_buttons)\r
+                message.flag.type_locked = 1;\r
+            else\r
+                message.flag.type_unlocked = 1;\r
+\r
+            // Reset button lock counter\r
+            button_lock_counter = 0;\r
+        }\r
+    }\r
+    else                        // Trying to create a long button press?\r
+    {\r
+        // Reset button lock counter\r
+        button_lock_counter = 0;\r
+\r
+        if (BUTTON_STAR_IS_PRESSED)\r
+        {\r
+            sButton.star_timeout++;\r
+\r
+            // Check if button was held low for some seconds\r
+            if (sButton.star_timeout > LEFT_BUTTON_LONG_TIME)\r
+            {\r
+                button.flag.star_long = 1;\r
+                button.flag.star_not_long = 0;\r
+                sButton.star_timeout = 0;\r
+                // Return interrupt edge to normal value\r
+                BUTTONS_IES &= ~BUTTON_STAR_PIN;\r
+            }\r
+        }\r
+        else                    // there was a button press not long enough\r
+        {\r
+            sButton.star_timeout = 0;\r
+        }\r
+\r
+        if (BUTTON_NUM_IS_PRESSED)\r
+        {\r
+            sButton.num_timeout++;\r
+\r
+            // Check if button was held low for some seconds\r
+            if (sButton.num_timeout > LEFT_BUTTON_LONG_TIME)\r
+            {\r
+                button.flag.num_long = 1;\r
+                button.flag.num_not_long = 0;\r
+                sButton.num_timeout = 0;\r
+                // Return interrupt edge to normal value\r
+                BUTTONS_IES &= ~BUTTON_NUM_PIN;\r
+            }\r
+        }\r
+        else                    // there was a button press not long enough\r
+        {\r
+            sButton.num_timeout = 0;\r
+        }\r
+    }\r
+\r
+    // Exit from LPM3 on RETI\r
+    _BIC_SR_IRQ(LPM3_bits);\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          Timer0_A1_5_ISR\r
+// @brief       IRQ handler for timer IRQ.\r
+//                              Timer0_A0       1/1sec clock tick (serviced by function\r
+// TIMER0_A0_ISR)\r
+//                              Timer0_A1       BlueRobin timer\r
+//                              Timer0_A2\r
+//                              Timer0_A3       Configurable periodic IRQ (used by button_repeat and\r
+// buzzer)\r
+//                              Timer0_A4       One-time delay\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+#pragma vector = TIMER0_A1_VECTOR\r
+__interrupt void TIMER0_A1_5_ISR(void)\r
+{\r
+    u16 value;\r
+\r
+    switch (TA0IV)\r
+    {\r
+        // Timer0_A1    BlueRobin timer\r
+        case 0x02:                                 // Timer0_A1 handler\r
+            BRRX_TimerTask_v();\r
+            break;\r
+\r
+        // Timer0_A3    Configurable periodic IRQ (used by button_repeat and buzzer)\r
+        case 0x06:                                 // Disable IE\r
+            TA0CCTL3 &= ~CCIE;\r
+            // Reset IRQ flag\r
+            TA0CCTL3 &= ~CCIFG;\r
+            // Store new value in CCR\r
+            value = TA0R + sTimer.timer0_A3_ticks; //timer0_A3_ticks_g;\r
+            // Load CCR register with next capture point\r
+            TA0CCR3 = value;\r
+            // Enable timer interrupt\r
+            TA0CCTL3 |= CCIE;\r
+            // Call function handler\r
+            fptr_Timer0_A3_function();\r
+            break;\r
+\r
+        // Timer0_A4    One-time delay\r
+        case 0x08:                                 // Disable IE\r
+            TA0CCTL4 &= ~CCIE;\r
+            // Reset IRQ flag\r
+            TA0CCTL4 &= ~CCIFG;\r
+            // Set delay over flag\r
+            sys.flag.delay_over = 1;\r
+            break;\r
+    }\r
+\r
+    // Exit from LPM3 on RETI\r
+    _BIC_SR_IRQ(LPM3_bits);\r
+}\r
+\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/driver/timer.h b/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/driver/timer.h
new file mode 100755 (executable)
index 0000000..a65bf92
--- /dev/null
@@ -0,0 +1,68 @@
+// *************************************************************************************************\r
+//\r
+//      Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//        Redistribution and use in source and binary forms, with or without\r
+//        modification, are permitted provided that the following conditions\r
+//        are met:\r
+//\r
+//          Redistributions of source code must retain the above copyright\r
+//          notice, this list of conditions and the following disclaimer.\r
+//\r
+//          Redistributions in binary form must reproduce the above copyright\r
+//          notice, this list of conditions and the following disclaimer in the\r
+//          documentation and/or other materials provided with the\r
+//          distribution.\r
+//\r
+//          Neither the name of Texas Instruments Incorporated nor the names of\r
+//          its contributors may be used to endorse or promote products derived\r
+//          from this software without specific prior written permission.\r
+//\r
+//        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+\r
+#ifndef TIMER_H_\r
+#define TIMER_H_\r
+\r
+// *************************************************************************************************\r
+// Include section\r
+\r
+// *************************************************************************************************\r
+// Prototypes section\r
+extern void Timer0_Init(void);\r
+extern void Timer0_Start(void);\r
+extern void Timer0_Stop(void);\r
+extern void Timer0_A3_Start(u16 ticks);\r
+extern void Timer0_A3_Stop(void);\r
+extern void Timer0_A4_Delay(u16 ticks);\r
+\r
+extern void (*fptr_Timer0_A3_function)(void);\r
+\r
+// *************************************************************************************************\r
+// Defines section\r
+struct timer\r
+{\r
+    // Timer0_A3 periodic delay\r
+    u16 timer0_A3_ticks;\r
+};\r
+extern struct timer sTimer;\r
+\r
+// *************************************************************************************************\r
+// Global Variable section\r
+\r
+// *************************************************************************************************\r
+// Extern section\r
+\r
+#endif                          /*TIMER_H_ */\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/driver/vti_as.c b/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/driver/vti_as.c
new file mode 100755 (executable)
index 0000000..0bd4912
--- /dev/null
@@ -0,0 +1,356 @@
+// *************************************************************************************************\r
+//\r
+//      Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//        Redistribution and use in source and binary forms, with or without\r
+//        modification, are permitted provided that the following conditions\r
+//        are met:\r
+//\r
+//          Redistributions of source code must retain the above copyright\r
+//          notice, this list of conditions and the following disclaimer.\r
+//\r
+//          Redistributions in binary form must reproduce the above copyright\r
+//          notice, this list of conditions and the following disclaimer in the\r
+//          documentation and/or other materials provided with the\r
+//          distribution.\r
+//\r
+//          Neither the name of Texas Instruments Incorporated nor the names of\r
+//          its contributors may be used to endorse or promote products derived\r
+//          from this software without specific prior written permission.\r
+//\r
+//        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+// VTI CMA3000-D0x acceleration sensor driver functions\r
+// *************************************************************************************************\r
+\r
+// *************************************************************************************************\r
+// Include section\r
+\r
+// system\r
+#include "project.h"\r
+\r
+// logic\r
+#include "simpliciti.h"\r
+\r
+// driver\r
+#include "vti_as.h"\r
+#include "timer.h"\r
+#include "display.h"\r
+\r
+// *************************************************************************************************\r
+// Prototypes section\r
+void as_start(void);\r
+void as_stop(void);\r
+u8 as_read_register(u8 bAddress);\r
+u8 as_write_register(u8 bAddress, u8 bData);\r
+\r
+// *************************************************************************************************\r
+// Defines section\r
+\r
+// =================================================================================================\r
+// CMA3000-D0x acceleration sensor configuration\r
+// =================================================================================================\r
+// DCO frequency division factor determining speed of the acceleration sensor SPI interface\r
+// Speed in Hz = 12MHz / AS_BR_DIVIDER (max. 500kHz)\r
+#define AS_BR_DIVIDER        (30u)\r
+\r
+// Acceleration measurement range in g\r
+// Valid ranges are: 2 and 8\r
+#define AS_RANGE             (2u)\r
+\r
+// Sample rate for acceleration values in Hz\r
+// Valid sample rates for 2g range are:     100, 400\r
+// Valid sample rates for 8g range are: 40, 100, 400\r
+#define AS_SAMPLE_RATE       (100u)\r
+\r
+// *************************************************************************************************\r
+// Global Variable section\r
+\r
+// Global flag for proper acceleration sensor operation\r
+u8 as_ok;\r
+\r
+// *************************************************************************************************\r
+// Extern section\r
+\r
+// *************************************************************************************************\r
+// @fn          as_init\r
+// @brief       Setup acceleration sensor connection, do not power up yet\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void as_init(void)\r
+{\r
+#ifdef AS_DISCONNECT\r
+    // Deactivate connection to acceleration sensor\r
+    AS_PWR_OUT &= ~AS_PWR_PIN;                             // Power off\r
+    AS_INT_OUT &= ~AS_INT_PIN;                             // Pin to low to avoid floating pins\r
+    AS_SPI_OUT &= ~(AS_SDO_PIN + AS_SDI_PIN + AS_SCK_PIN); // Pin to low to avoid floating pins\r
+    AS_CSN_OUT &= ~AS_CSN_PIN;                             // Pin to low to avoid floating pins\r
+    AS_INT_DIR |= AS_INT_PIN;                              // Pin to output to avoid floating pins\r
+    AS_SPI_DIR |= AS_SDO_PIN + AS_SDI_PIN + AS_SCK_PIN;    // Pin to output to avoid floating pins\r
+    AS_CSN_DIR |= AS_CSN_PIN;                              // Pin to output to avoid floating pins\r
+    AS_PWR_DIR |= AS_PWR_PIN;                              // Power pin to output direction\r
+#else\r
+    AS_INT_DIR &= ~AS_INT_PIN;                             // Input\r
+    AS_SPI_DIR &= ~AS_SDI_PIN;                             // Input\r
+    AS_SPI_DIR |= AS_SDO_PIN + AS_SCK_PIN;                 // Output\r
+    AS_SPI_SEL |= AS_SDO_PIN + AS_SDI_PIN + AS_SCK_PIN;    // Port pins to SDO, SDI and SCK function\r
+    AS_CSN_OUT |= AS_CSN_PIN;                              // CSN=1\r
+    AS_CSN_DIR |= AS_CSN_PIN;                              //\r
+    AS_PWR_OUT |= AS_PWR_PIN;                              // VDD=1\r
+    AS_PWR_DIR |= AS_PWR_PIN;                              //\r
+#endif\r
+\r
+    // Reset global sensor flag\r
+    as_ok = 1;\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          as_start\r
+// @brief       Power-up and initialize acceleration sensor\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void as_start(void)\r
+{\r
+    volatile u16 Counter_u16;\r
+    u8 bConfig;                                         //, bStatus;\r
+\r
+    // Initialize SPI interface to acceleration sensor\r
+    AS_SPI_CTL0 |= UCSYNC | UCMST | UCMSB               // SPI master, 8 data bits,  MSB first,\r
+        | UCCKPH;                                       //  clock idle low, data output on falling\r
+                                                        // edge\r
+    AS_SPI_CTL1 |= UCSSEL1;                             // SMCLK as clock source\r
+    AS_SPI_BR0 = AS_BR_DIVIDER;                         // Low byte of division factor for baud rate\r
+    AS_SPI_BR1 = 0x00;                                  // High byte of division factor for baud\r
+                                                        // rate\r
+    AS_SPI_CTL1 &= ~UCSWRST;                            // Start SPI hardware\r
+\r
+    // Initialize interrupt pin for data read out from acceleration sensor\r
+    AS_INT_IES &= ~AS_INT_PIN;                          // Interrupt on rising edge\r
+\r
+#ifdef AS_DISCONNECT\r
+    // Enable interrupt\r
+    AS_INT_DIR &= ~AS_INT_PIN;                          // Switch INT pin to input\r
+    AS_SPI_DIR &= ~AS_SDI_PIN;                          // Switch SDI pin to input\r
+    AS_SPI_REN |= AS_SDI_PIN;                           // Pulldown on SDI pin\r
+    AS_SPI_SEL |= AS_SDO_PIN + AS_SDI_PIN + AS_SCK_PIN; // Port pins to SDO, SDI and SCK function\r
+    AS_CSN_OUT |= AS_CSN_PIN;                           // Deselect acceleration sensor\r
+    AS_PWR_OUT |= AS_PWR_PIN;                           // Power on active high\r
+#endif\r
+\r
+    // Delay of >5ms required between switching on power and configuring sensor\r
+    Timer0_A4_Delay(CONV_MS_TO_TICKS(10));\r
+\r
+    // Initialize interrupt pin for data read out from acceleration sensor\r
+    AS_INT_IFG &= ~AS_INT_PIN;                          // Reset flag\r
+    AS_INT_IE |= AS_INT_PIN;                            // Enable interrupt\r
+\r
+    // Configure sensor and start to sample data\r
+#if (AS_RANGE == 2)\r
+    bConfig = 0x80;\r
+#    if (AS_SAMPLE_RATE == 100)\r
+    bConfig |= 0x02;\r
+#    elif (AS_SAMPLE_RATE == 400)\r
+    bConfig |= 0x04;\r
+#    else\r
+#        error "Sample rate not supported"\r
+#    endif\r
+#elif (AS_RANGE == 8)\r
+    bConfig = 0x00;\r
+#    if (AS_SAMPLE_RATE == 40)\r
+    bConfig |= 0x06;\r
+#    elif (AS_SAMPLE_RATE == 100)\r
+    bConfig |= 0x02;\r
+#    elif (AS_SAMPLE_RATE == 400)\r
+    bConfig |= 0x04;\r
+#    else\r
+#        error "Sample rate not supported"\r
+#    endif\r
+#else\r
+#    error "Measurement range not supported"\r
+#endif\r
+\r
+    // Reset sensor\r
+    as_write_register(0x04, 0x02);\r
+    as_write_register(0x04, 0x0A);\r
+    as_write_register(0x04, 0x04);\r
+\r
+    // Wait 5 ms before starting sensor output\r
+    Timer0_A4_Delay(CONV_MS_TO_TICKS(5));\r
+\r
+    // Set 2g measurement range, start to output data with 100Hz rate\r
+    as_write_register(0x02, bConfig);\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          as_stop\r
+// @brief       Power down acceleration sensor\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void as_stop(void)\r
+{\r
+    // Disable interrupt\r
+    AS_INT_IE &= ~AS_INT_PIN;                              // Disable interrupt\r
+\r
+#ifdef AS_DISCONNECT\r
+    // Power-down sensor\r
+    AS_PWR_OUT &= ~AS_PWR_PIN;                             // Power off\r
+    AS_INT_OUT &= ~AS_INT_PIN;                             // Pin to low to avoid floating pins\r
+    AS_SPI_OUT &= ~(AS_SDO_PIN + AS_SDI_PIN + AS_SCK_PIN); // Pins to low to avoid floating pins\r
+    AS_SPI_SEL &= ~(AS_SDO_PIN + AS_SDI_PIN + AS_SCK_PIN); // Port pins to I/O function\r
+    AS_CSN_OUT &= ~AS_CSN_PIN;                             // Pin to low to avoid floating pins\r
+    AS_INT_DIR |= AS_INT_PIN;                              // Pin to output to avoid floating pins\r
+    AS_SPI_DIR |= AS_SDO_PIN + AS_SDI_PIN + AS_SCK_PIN;    // Pins to output to avoid floating pins\r
+    AS_CSN_DIR |= AS_CSN_PIN;                              // Pin to output to avoid floating pins\r
+#else\r
+    // Reset sensor -> sensor to powerdown\r
+    as_write_register(0x04, 0x02);\r
+    as_write_register(0x04, 0x0A);\r
+    as_write_register(0x04, 0x04);\r
+#endif\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          as_read_register\r
+// @brief       Read a byte from the acceleration sensor\r
+// @param       u8 bAddress             Register address\r
+// @return      u8                                      Register content\r
+// *************************************************************************************************\r
+u8 as_read_register(u8 bAddress)\r
+{\r
+    u8 bResult;\r
+    u16 timeout;\r
+\r
+    // Exit function if an error was detected previously\r
+    if (!as_ok)\r
+        return (0);\r
+\r
+    bAddress <<= 2;                                         // Address to be shifted left by 2 and\r
+                                                            // RW bit to be reset\r
+\r
+    AS_SPI_REN &= ~AS_SDI_PIN;                              // Pulldown on SDI pin not required\r
+    AS_CSN_OUT &= ~AS_CSN_PIN;                              // Select acceleration sensor\r
+\r
+    bResult = AS_RX_BUFFER;                                 // Read RX buffer just to clear\r
+                                                            // interrupt flag\r
+\r
+    AS_TX_BUFFER = bAddress;                                // Write address to TX buffer\r
+\r
+    timeout = SPI_TIMEOUT;\r
+    while (!(AS_IRQ_REG & AS_RX_IFG) && (--timeout > 0)) ;  // Wait until new data was written into\r
+                                                            // RX buffer\r
+    if (timeout == 0)\r
+    {\r
+        as_ok = 0;\r
+        return (0);\r
+    }\r
+    bResult = AS_RX_BUFFER;                                 // Read RX buffer just to clear\r
+                                                            // interrupt flag\r
+\r
+    AS_TX_BUFFER = 0;                                       // Write dummy data to TX buffer\r
+\r
+    timeout = SPI_TIMEOUT;\r
+    while (!(AS_IRQ_REG & AS_RX_IFG) && (--timeout > 0)) ;  // Wait until new data was written into\r
+                                                            // RX buffer\r
+    if (timeout == 0)\r
+    {\r
+        as_ok = 0;\r
+        return (0);\r
+    }\r
+    bResult = AS_RX_BUFFER;                                 // Read RX buffer\r
+\r
+    AS_CSN_OUT |= AS_CSN_PIN;                               // Deselect acceleration sensor\r
+    AS_SPI_REN |= AS_SDI_PIN;                               // Pulldown on SDI pin required again\r
+\r
+    // Return new data from RX buffer\r
+    return bResult;\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          as_write_register\r
+// @brief               Write a byte to the acceleration sensor\r
+// @param       u8 bAddress             Register address\r
+//                              u8 bData                        Data to write\r
+// @return\r
+// *************************************************************************************************\r
+u8 as_write_register(u8 bAddress, u8 bData)\r
+{\r
+    u8 bResult;\r
+    u16 timeout;\r
+\r
+    // Exit function if an error was detected previously\r
+    if (!as_ok)\r
+        return (0);\r
+\r
+    bAddress <<= 2;                                         // Address to be shifted left by 1\r
+    bAddress |= BIT1;                                       // RW bit to be set\r
+\r
+    AS_SPI_REN &= ~AS_SDI_PIN;                              // Pulldown on SDI pin not required\r
+    AS_CSN_OUT &= ~AS_CSN_PIN;                              // Select acceleration sensor\r
+\r
+    bResult = AS_RX_BUFFER;                                 // Read RX buffer just to clear\r
+                                                            // interrupt flag\r
+\r
+    AS_TX_BUFFER = bAddress;                                // Write address to TX buffer\r
+\r
+    timeout = SPI_TIMEOUT;\r
+    while (!(AS_IRQ_REG & AS_RX_IFG) && (--timeout > 0)) ;  // Wait until new data was written into\r
+                                                            // RX buffer\r
+    if (timeout == 0)\r
+    {\r
+        as_ok = 0;\r
+        return (0);\r
+    }\r
+    bResult = AS_RX_BUFFER;                                 // Read RX buffer just to clear\r
+                                                            // interrupt flag\r
+\r
+    AS_TX_BUFFER = bData;                                   // Write data to TX buffer\r
+\r
+    timeout = SPI_TIMEOUT;\r
+    while (!(AS_IRQ_REG & AS_RX_IFG) && (--timeout > 0)) ;  // Wait until new data was written into\r
+                                                            // RX buffer\r
+    if (timeout == 0)\r
+    {\r
+        as_ok = 0;\r
+        return (0);\r
+    }\r
+    bResult = AS_RX_BUFFER;                                 // Read RX buffer\r
+\r
+    AS_CSN_OUT |= AS_CSN_PIN;                               // Deselect acceleration sensor\r
+    AS_SPI_REN |= AS_SDI_PIN;                               // Pulldown on SDI pin required again\r
+\r
+    return bResult;\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          as_get_data\r
+// @brief       Service routine to read acceleration values.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void as_get_data(u8 * data)\r
+{\r
+    // Exit if sensor is not powered up\r
+    if ((AS_PWR_OUT & AS_PWR_PIN) != AS_PWR_PIN)\r
+        return;\r
+\r
+    // Store X/Y/Z acceleration data in buffer\r
+    *(data + 0) = as_read_register(0x06);\r
+    *(data + 1) = as_read_register(0x07);\r
+    *(data + 2) = as_read_register(0x08);\r
+}\r
+\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/driver/vti_as.h b/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/driver/vti_as.h
new file mode 100755 (executable)
index 0000000..178af33
--- /dev/null
@@ -0,0 +1,106 @@
+// *************************************************************************************************\r
+//\r
+//      Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//        Redistribution and use in source and binary forms, with or without\r
+//        modification, are permitted provided that the following conditions\r
+//        are met:\r
+//\r
+//          Redistributions of source code must retain the above copyright\r
+//          notice, this list of conditions and the following disclaimer.\r
+//\r
+//          Redistributions in binary form must reproduce the above copyright\r
+//          notice, this list of conditions and the following disclaimer in the\r
+//          documentation and/or other materials provided with the\r
+//          distribution.\r
+//\r
+//          Neither the name of Texas Instruments Incorporated nor the names of\r
+//          its contributors may be used to endorse or promote products derived\r
+//          from this software without specific prior written permission.\r
+//\r
+//        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+\r
+#ifndef VTI_AS_H_\r
+#define VTI_AS_H_\r
+\r
+// *************************************************************************************************\r
+// Include section\r
+\r
+// *************************************************************************************************\r
+// Prototypes section\r
+extern void as_init(void);\r
+extern void as_start(void);\r
+extern void as_stop(void);\r
+extern u8 as_read_register(u8 bAddress);\r
+extern u8 as_write_register(u8 bAddress, u8 bData);\r
+extern void as_get_data(u8 * data);\r
+\r
+// *************************************************************************************************\r
+// Defines section\r
+\r
+// Disconnect power supply for acceleration sensor when not used\r
+#define AS_DISCONNECT\r
+\r
+// Port and pin resource for SPI interface to acceleration sensor\r
+// SDO=MOSI=P1.6, SDI=MISO=P1.5, SCK=P1.7\r
+#define AS_SPI_IN            (P1IN)\r
+#define AS_SPI_OUT           (P1OUT)\r
+#define AS_SPI_DIR           (P1DIR)\r
+#define AS_SPI_SEL           (P1SEL)\r
+#define AS_SPI_REN           (P1REN)\r
+#define AS_SDO_PIN           (BIT6)\r
+#define AS_SDI_PIN           (BIT5)\r
+#define AS_SCK_PIN           (BIT7)\r
+\r
+// CSN=PJ.1\r
+#define AS_CSN_OUT                       (PJOUT)\r
+#define AS_CSN_DIR                       (PJDIR)\r
+#define AS_CSN_PIN           (BIT1)\r
+\r
+#define AS_TX_BUFFER         (UCA0TXBUF)\r
+#define AS_RX_BUFFER         (UCA0RXBUF)\r
+#define AS_TX_IFG            (UCTXIFG)\r
+#define AS_RX_IFG            (UCRXIFG)\r
+#define AS_IRQ_REG           (UCA0IFG)\r
+#define AS_SPI_CTL0          (UCA0CTL0)\r
+#define AS_SPI_CTL1          (UCA0CTL1)\r
+#define AS_SPI_BR0           (UCA0BR0)\r
+#define AS_SPI_BR1           (UCA0BR1)\r
+\r
+// Port and pin resource for power-up of acceleration sensor, VDD=PJ.0\r
+#define AS_PWR_OUT           (PJOUT)\r
+#define AS_PWR_DIR           (PJDIR)\r
+#define AS_PWR_PIN           (BIT0)\r
+\r
+// Port, pin and interrupt resource for interrupt from acceleration sensor, CMA_INT=P2.5\r
+#define AS_INT_IN            (P2IN)\r
+#define AS_INT_OUT           (P2OUT)\r
+#define AS_INT_DIR           (P2DIR)\r
+#define AS_INT_IE            (P2IE)\r
+#define AS_INT_IES           (P2IES)\r
+#define AS_INT_IFG           (P2IFG)\r
+#define AS_INT_PIN           (BIT5)\r
+\r
+// SPI timeout to detect sensor failure\r
+#define SPI_TIMEOUT                             (1000u)\r
+\r
+// *************************************************************************************************\r
+// Global Variable section\r
+\r
+// *************************************************************************************************\r
+// Extern section\r
+\r
+#endif                          /*VTI_AS_H_ */\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/driver/vti_ps.c b/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/driver/vti_ps.c
new file mode 100755 (executable)
index 0000000..fa2d493
--- /dev/null
@@ -0,0 +1,563 @@
+// *************************************************************************************************\r
+//\r
+//      Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//        Redistribution and use in source and binary forms, with or without\r
+//        modification, are permitted provided that the following conditions\r
+//        are met:\r
+//\r
+//          Redistributions of source code must retain the above copyright\r
+//          notice, this list of conditions and the following disclaimer.\r
+//\r
+//          Redistributions in binary form must reproduce the above copyright\r
+//          notice, this list of conditions and the following disclaimer in the\r
+//          documentation and/or other materials provided with the\r
+//          distribution.\r
+//\r
+//          Neither the name of Texas Instruments Incorporated nor the names of\r
+//          its contributors may be used to endorse or promote products derived\r
+//          from this software without specific prior written permission.\r
+//\r
+//        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+// VTI SCP1000-D0x pressure sensor driver functions\r
+// *************************************************************************************************\r
+\r
+// *************************************************************************************************\r
+// Include section\r
+\r
+// system\r
+#include "project.h"\r
+\r
+// driver\r
+#include "vti_ps.h"\r
+#include "timer.h"\r
+\r
+// *************************************************************************************************\r
+// Prototypes section\r
+u16 ps_read_register(u8 address, u8 mode);\r
+u8 ps_write_register(u8 address, u8 data);\r
+u8 ps_twi_read(u8 ack);\r
+void twi_delay(void);\r
+\r
+// *************************************************************************************************\r
+// Defines section\r
+\r
+// *************************************************************************************************\r
+// Global Variable section\r
+\r
+// VTI pressure (hPa) to altitude (m) conversion tables\r
+const s16 h0[17] =\r
+{ -153, 0, 111, 540, 989, 1457, 1949, 2466, 3012, 3591, 4206, 4865, 5574, 6344, 7185, 8117, 9164 };\r
+const u16 p0[17] =\r
+{ 1031, 1013, 1000, 950, 900, 850, 800, 750, 700, 650, 600, 550, 500, 450, 400, 350, 300 };\r
+\r
+float p[17];\r
+\r
+// Global flag for proper pressure sensor operation\r
+u8 ps_ok;\r
+\r
+// *************************************************************************************************\r
+// Extern section\r
+\r
+// *************************************************************************************************\r
+// @fn          ps_init\r
+// @brief       Init pressure sensor I/O\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void ps_init(void)\r
+{\r
+    volatile u8 success, status, eeprom, timeout;\r
+\r
+    PS_INT_DIR &= ~PS_INT_PIN;             // DRDY is input\r
+    PS_INT_IES &= ~PS_INT_PIN;             // Interrupt on DRDY rising edge\r
+    PS_TWI_OUT |= PS_SCL_PIN + PS_SDA_PIN; // SCL and SDA are outputs by default\r
+    PS_TWI_DIR |= PS_SCL_PIN + PS_SDA_PIN; // SCL and SDA are outputs by default\r
+\r
+    // Reset global ps_ok flag\r
+    ps_ok = 0;\r
+\r
+    // 100msec delay to allow VDD stabilisation\r
+    Timer0_A4_Delay(CONV_MS_TO_TICKS(100));\r
+\r
+    // Reset pressure sensor -> powerdown sensor\r
+    success = ps_write_register(0x06, 0x01);\r
+\r
+    // 100msec delay\r
+    Timer0_A4_Delay(CONV_MS_TO_TICKS(100));\r
+\r
+    // Check if STATUS register BIT0 is cleared\r
+    status = ps_read_register(0x07, PS_TWI_8BIT_ACCESS);\r
+    if (((status & BIT0) == 0) && (status != 0))\r
+    {\r
+        // Check EEPROM checksum in DATARD8 register\r
+        eeprom = ps_read_register(0x7F, PS_TWI_8BIT_ACCESS);\r
+        if (eeprom == 0x01)\r
+            ps_ok = 1;\r
+        else\r
+            ps_ok = 0;\r
+    }\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          ps_start\r
+// @brief       Init pressure sensor registers and start sampling\r
+// @param       none\r
+// @return      u8              1=Sensor started, 0=Sensor did not start\r
+// *************************************************************************************************\r
+void ps_start(void)\r
+{\r
+    // Start sampling data in ultra low power mode\r
+    ps_write_register(0x03, 0x0B);\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          ps_stop\r
+// @brief       Power down pressure sensor\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void ps_stop(void)\r
+{\r
+    // Put sensor to standby\r
+    ps_write_register(0x03, 0x00);\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          ps_twi_sda\r
+// @brief       Control SDA line\r
+// @param       u8 condition            PS_TWI_SEND_START, PS_TWI_SEND_RESTART, PS_TWI_SEND_STOP\r
+//                                                                              PS_TWI_CHECK_ACK\r
+// @return      u8                                      1=ACK, 0=NACK\r
+// *************************************************************************************************\r
+u8 ps_twi_sda(u8 condition)\r
+{\r
+    u8 sda = 0;\r
+\r
+    if (condition == PS_TWI_SEND_START)\r
+    {\r
+        PS_TWI_SDA_OUT;         // SDA is output\r
+        PS_TWI_SCL_HI;\r
+        twi_delay();\r
+        PS_TWI_SDA_LO;\r
+        twi_delay();\r
+        PS_TWI_SCL_LO;          // SCL 1-0 transition while SDA=0\r
+        twi_delay();\r
+    }\r
+    else if (condition == PS_TWI_SEND_RESTART)\r
+    {\r
+        PS_TWI_SDA_OUT;         // SDA is output\r
+        PS_TWI_SCL_LO;\r
+        PS_TWI_SDA_HI;\r
+        twi_delay();\r
+        PS_TWI_SCL_HI;\r
+        twi_delay();\r
+        PS_TWI_SDA_LO;\r
+        twi_delay();\r
+        PS_TWI_SCL_LO;\r
+        twi_delay();\r
+    }\r
+    else if (condition == PS_TWI_SEND_STOP)\r
+    {\r
+        PS_TWI_SDA_OUT;         // SDA is output\r
+        PS_TWI_SDA_LO;\r
+        twi_delay();\r
+        PS_TWI_SCL_LO;\r
+        twi_delay();\r
+        PS_TWI_SCL_HI;\r
+        twi_delay();\r
+        PS_TWI_SDA_HI;          // SDA 0-1 transition while SCL=1\r
+        twi_delay();\r
+    }\r
+    else if (condition == PS_TWI_CHECK_ACK)\r
+    {\r
+        PS_TWI_SDA_IN;          // SDA is input\r
+        PS_TWI_SCL_LO;\r
+        twi_delay();\r
+        PS_TWI_SCL_HI;\r
+        twi_delay();\r
+        sda = PS_TWI_IN & PS_SDA_PIN;\r
+        PS_TWI_SCL_LO;\r
+    }\r
+\r
+    // Return value will only be evaluated when checking device ACK\r
+    return (sda == 0);\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          twi_delay\r
+// @brief       Delay between TWI signal edges.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void twi_delay(void)\r
+{\r
+    asm ("     nop");\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          ps_twi_write\r
+// @brief       Clock out bits through SDA.\r
+// @param       u8 data         Byte to send\r
+// @return      none\r
+// *************************************************************************************************\r
+void ps_twi_write(u8 data)\r
+{\r
+    u8 i, mask;\r
+\r
+    // Set mask byte to 10000000b\r
+    mask = BIT0 << 7;\r
+\r
+    PS_TWI_SDA_OUT;             // SDA is output\r
+\r
+    for (i = 8; i > 0; i--)\r
+    {\r
+        PS_TWI_SCL_LO;          // SCL=0\r
+        if ((data & mask) == mask)\r
+        {\r
+            PS_TWI_SDA_HI;      // SDA=1\r
+        }\r
+        else\r
+        {\r
+            PS_TWI_SDA_LO;      // SDA=0\r
+        }\r
+        mask = mask >> 1;\r
+        twi_delay();\r
+        PS_TWI_SCL_HI;          // SCL=1\r
+        twi_delay();\r
+    }\r
+\r
+    PS_TWI_SCL_LO;              // SCL=0\r
+    PS_TWI_SDA_IN;              // SDA is input\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          ps_twi_read\r
+// @brief       Read bits from SDA\r
+// @param       u8 ack          1=Send ACK after read, 0=Send NACK after read\r
+// @return      u8                      Bits read\r
+// *************************************************************************************************\r
+u8 ps_twi_read(u8 ack)\r
+{\r
+    u8 i;\r
+    u8 data = 0;\r
+\r
+    PS_TWI_SDA_IN;              // SDA is input\r
+\r
+    for (i = 0; i < 8; i++)\r
+    {\r
+        PS_TWI_SCL_LO;          // SCL=0\r
+        twi_delay();\r
+        PS_TWI_SCL_HI;          // SCL=0\r
+        twi_delay();\r
+\r
+        // Shift captured bits to left\r
+        data = data << 1;\r
+\r
+        // Capture new bit\r
+        if ((PS_TWI_IN & PS_SDA_PIN) == PS_SDA_PIN)\r
+            data |= BIT0;\r
+    }\r
+\r
+    PS_TWI_SDA_OUT;             // SDA is output\r
+\r
+    // 1 aditional clock phase to generate master ACK\r
+    PS_TWI_SCL_LO;              // SCL=0\r
+    if (ack == 1)               // Send ack -> continue read\r
+    {\r
+        PS_TWI_SDA_LO\r
+    }\r
+    else                        // Send nack -> stop read\r
+    {\r
+        PS_TWI_SDA_HI\r
+    }\r
+    twi_delay();\r
+    PS_TWI_SCL_HI;              // SCL=0\r
+    twi_delay();\r
+    PS_TWI_SCL_LO;\r
+\r
+    return (data);\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          as_write_register\r
+// @brief               Write a byte to the pressure sensor\r
+// @param       u8 address              Register address\r
+//                              u8 data                 Data to write\r
+// @return      u8\r
+// *************************************************************************************************\r
+u8 ps_write_register(u8 address, u8 data)\r
+{\r
+    volatile u8 success;\r
+\r
+    ps_twi_sda(PS_TWI_SEND_START);            // Generate start condition\r
+\r
+    ps_twi_write((0x11 << 1) | PS_TWI_WRITE); // Send 7bit device address 0x11 + write bit '0'\r
+    success = ps_twi_sda(PS_TWI_CHECK_ACK);   // Check ACK from device\r
+    if (!success)\r
+        return (0);\r
+\r
+    ps_twi_write(address);                    // Send 8bit register address\r
+    success = ps_twi_sda(PS_TWI_CHECK_ACK);   // Check ACK from device\r
+    if (!success)\r
+        return (0);\r
+\r
+    ps_twi_write(data);                       // Send 8bit data to register\r
+    success = ps_twi_sda(PS_TWI_CHECK_ACK);   // Check ACK from device\r
+    // Slave does not send this ACK\r
+    // if (!success) return (0);\r
+\r
+    ps_twi_sda(PS_TWI_SEND_STOP);             // Generate stop condition\r
+\r
+    return (1);\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          ps_read_register\r
+// @brief       Read a byte from the pressure sensor\r
+// @param       u8 address              Register address\r
+//                              u8      mode            PS_TWI_8BIT_ACCESS, PS_TWI_16BIT_ACCESS\r
+// @return      u16                         Register content\r
+// *************************************************************************************************\r
+u16 ps_read_register(u8 address, u8 mode)\r
+{\r
+    u8 success;\r
+    u16 data = 0;\r
+\r
+    ps_twi_sda(PS_TWI_SEND_START);            // Generate start condition\r
+\r
+    ps_twi_write((0x11 << 1) | PS_TWI_WRITE); // Send 7bit device address 0x11 + write bit '0'\r
+    success = ps_twi_sda(PS_TWI_CHECK_ACK);   // Check ACK from device\r
+    if (!success)\r
+        return (0);\r
+\r
+    ps_twi_write(address);                    // Send 8bit register address\r
+    success = ps_twi_sda(PS_TWI_CHECK_ACK);   // Check ACK from device\r
+    if (!success)\r
+        return (0);\r
+\r
+    ps_twi_sda(PS_TWI_SEND_RESTART);          // Generate restart condition\r
+\r
+    ps_twi_write((0x11 << 1) | PS_TWI_READ);  // Send 7bit device address 0x11 + read bit '1'\r
+    success = ps_twi_sda(PS_TWI_CHECK_ACK);   // Check ACK from device\r
+    if (!success)\r
+        return (0);\r
+\r
+    if (mode == PS_TWI_16BIT_ACCESS)\r
+    {\r
+        data = ps_twi_read(1) << 8;           // Read MSB 8bit data from register\r
+        data |= ps_twi_read(0);               // Read LSB 8bit data from register\r
+    }\r
+    else\r
+    {\r
+        data = ps_twi_read(0);                // Read 8bit data from register\r
+    }\r
+\r
+    ps_twi_sda(PS_TWI_SEND_STOP);             // Generate stop condition\r
+\r
+    return (data);\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          ps_get_pa\r
+// @brief       Read out pressure. Format is Pa. Range is 30000 .. 120000 Pa.\r
+// @param       none\r
+// @return      u32             15-bit pressure sensor value (Pa)\r
+// *************************************************************************************************\r
+u32 ps_get_pa(void)\r
+{\r
+    volatile u32 data = 0;\r
+\r
+    // Get 3 MSB from DATARD8 register\r
+    data = ps_read_register(0x7F, PS_TWI_8BIT_ACCESS);\r
+    data = ((data & 0x07) << 8) << 8;\r
+\r
+    // Get 16 LSB from DATARD16 register\r
+    data |= ps_read_register(0x80, PS_TWI_16BIT_ACCESS);\r
+\r
+    // Convert decimal value to Pa\r
+    data = (data >> 2);\r
+\r
+    return (data);\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          ps_get_temp\r
+// @brief       Read out temperature.\r
+// @param       none\r
+// @return      u16             13-bit temperature value in xx.x K format\r
+// *************************************************************************************************\r
+u16 ps_get_temp(void)\r
+{\r
+    volatile u16 data = 0;\r
+    u16 temp = 0;\r
+    u8 is_negative = 0;\r
+    u16 kelvin;\r
+\r
+    // Get 13 bit from TEMPOUT register\r
+    data = ps_read_register(0x81, PS_TWI_16BIT_ACCESS);\r
+\r
+    // Convert negative temperatures\r
+    if ((data & BIT(13)) == BIT(13))\r
+    {\r
+        // Sign extend temperature\r
+        data |= 0xC000;\r
+        // Convert two's complement\r
+        data = ~data;\r
+        data += 1;\r
+        is_negative = 1;\r
+    }\r
+\r
+    temp = data / 2;\r
+\r
+    // Convert from °C to K\r
+    if (is_negative)\r
+        kelvin = 2732 - temp;\r
+    else\r
+        kelvin = temp + 2732;\r
+\r
+    return (kelvin);\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          init_pressure_table\r
+// @brief       Init pressure table with constants\r
+// @param       u32             p               Pressure (Pa)\r
+// @return      u16                             Altitude (m)\r
+// *************************************************************************************************\r
+void init_pressure_table(void)\r
+{\r
+    u8 i;\r
+\r
+    for (i = 0; i < 17; i++)\r
+        p[i] = p0[i];\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          update_pressure_table\r
+// @brief       Calculate pressure table for reference altitude.\r
+//                              Implemented straight from VTI reference code.\r
+// @param       s16             href    Reference height\r
+//                              u32             p_meas  Pressure (Pa)\r
+//                              u16             t_meas  Temperature (10*K)\r
+// @return      none\r
+// *************************************************************************************************\r
+void update_pressure_table(s16 href, u32 p_meas, u16 t_meas)\r
+{\r
+    const float Invt00 = 0.003470415;\r
+    const float coefp = 0.00006;\r
+    volatile float p_fact;\r
+    volatile float p_noll;\r
+    volatile float hnoll;\r
+    volatile float h_low = 0;\r
+    volatile float t0;\r
+    u8 i;\r
+\r
+    // Typecast arguments\r
+    volatile float fl_href = href;\r
+    volatile float fl_p_meas = (float)p_meas / 100;     // Convert from Pa to hPa\r
+    volatile float fl_t_meas = (float)t_meas / 10;      // Convert from 10 K to 1 K\r
+\r
+    t0 = fl_t_meas + (0.0065 * fl_href);\r
+\r
+    hnoll = fl_href / (t0 * Invt00);\r
+\r
+    for (i = 0; i <= 15; i++)\r
+    {\r
+        if (h0[i] > hnoll)\r
+            break;\r
+        h_low = h0[i];\r
+    }\r
+\r
+    p_noll =\r
+        (float)(hnoll -\r
+                h_low) *\r
+        (1 -\r
+         (hnoll -\r
+          (float)h0[i]) *\r
+         coefp) * ((float)p0[i] - (float)p0[i - 1]) / ((float)h0[i] - h_low) + (float)p0[i - 1];\r
+\r
+    // Calculate multiplicator\r
+    p_fact = fl_p_meas / p_noll;\r
+\r
+    // Apply correction factor to pressure table\r
+    for (i = 0; i <= 16; i++)\r
+    {\r
+        p[i] = p0[i] * p_fact;\r
+    }\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          conv_pa_to_meter\r
+// @brief       Convert pressure (Pa) to altitude (m) using a conversion table\r
+//                              Implemented straight from VTI reference code.\r
+// @param       u32             p_meas  Pressure (Pa)\r
+//                              u16             t_meas  Temperature (10* K)\r
+// @return      s16                             Altitude (m)\r
+// *************************************************************************************************\r
+s16 conv_pa_to_meter(u32 p_meas, u16 t_meas)\r
+{\r
+    const float coef2 = 0.0007;\r
+    const float Invt00 = 0.003470415;\r
+    volatile float hnoll;\r
+    volatile float t0;\r
+    volatile float p_low;\r
+    volatile float fl_h;\r
+    volatile s16 h;\r
+    u8 i;\r
+\r
+    // Typecast arguments\r
+    volatile float fl_p_meas = (float)p_meas / 100;     // Convert from Pa to hPa\r
+    volatile float fl_t_meas = (float)t_meas / 10;      // Convert from 10 K to 1 K\r
+\r
+    for (i = 0; i <= 16; i++)\r
+    {\r
+        if (p[i] < fl_p_meas)\r
+            break;\r
+        p_low = p[i];\r
+    }\r
+\r
+    if (i == 0)\r
+    {\r
+        hnoll = (float)(fl_p_meas - p[0]) / (p[1] - p[0]) * ((float)(h0[1] - h0[0]));\r
+    }\r
+    else if (i < 15)\r
+    {\r
+        hnoll =\r
+            (float)(fl_p_meas -\r
+                    p_low) *\r
+            (1 -\r
+             (fl_p_meas -\r
+              p[i]) * coef2) / (p[i] - p_low) * ((float)(h0[i] - h0[i - 1])) + h0[i - 1];\r
+    }\r
+    else if (i == 15)\r
+    {\r
+        hnoll =\r
+            (float)(fl_p_meas - p_low) / (p[i] - p_low) * ((float)(h0[i] - h0[i - 1])) + h0[i - 1];\r
+    }\r
+    else                        // i==16\r
+    {\r
+        hnoll = (float)(fl_p_meas - p[16]) / (p[16] - p[15]) * ((float)(h0[16] - h0[15])) + h0[16];\r
+    }\r
+\r
+    // Compensate temperature error\r
+    t0 = fl_t_meas / (1 - hnoll * Invt00 * 0.0065);\r
+    fl_h = Invt00 * t0 * hnoll;\r
+    h = (u16) fl_h;\r
+\r
+    return (h);\r
+}\r
+\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/driver/vti_ps.h b/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/driver/vti_ps.h
new file mode 100755 (executable)
index 0000000..e044695
--- /dev/null
@@ -0,0 +1,99 @@
+// *************************************************************************************************\r
+//\r
+//      Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//        Redistribution and use in source and binary forms, with or without\r
+//        modification, are permitted provided that the following conditions\r
+//        are met:\r
+//\r
+//          Redistributions of source code must retain the above copyright\r
+//          notice, this list of conditions and the following disclaimer.\r
+//\r
+//          Redistributions in binary form must reproduce the above copyright\r
+//          notice, this list of conditions and the following disclaimer in the\r
+//          documentation and/or other materials provided with the\r
+//          distribution.\r
+//\r
+//          Neither the name of Texas Instruments Incorporated nor the names of\r
+//          its contributors may be used to endorse or promote products derived\r
+//          from this software without specific prior written permission.\r
+//\r
+//        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+\r
+#ifndef VTI_PS_H_\r
+#define VTI_PS_H_\r
+\r
+// *************************************************************************************************\r
+// Include section\r
+\r
+// *************************************************************************************************\r
+// Prototypes section\r
+extern void ps_init(void);\r
+extern void ps_start(void);\r
+extern void ps_stop(void);\r
+extern u32 ps_get_pa(void);\r
+extern u16 ps_get_temp(void);\r
+extern void init_pressure_table(void);\r
+extern void update_pressure_table(s16 href, u32 p_meas, u16 t_meas);\r
+extern s16 conv_pa_to_meter(u32 p_meas, u16 t_meas);\r
+\r
+// *************************************************************************************************\r
+// Defines section\r
+\r
+// Port and pin resource for TWI interface to pressure sensor\r
+// SCL=PJ.3, SDA=PJ.2, DRDY=P2.6\r
+#define PS_TWI_IN            (PJIN)\r
+#define PS_TWI_OUT           (PJOUT)\r
+#define PS_TWI_DIR           (PJDIR)\r
+#define PS_TWI_REN           (PJREN)\r
+#define PS_SCL_PIN           (BIT3)\r
+#define PS_SDA_PIN           (BIT2)\r
+\r
+// Port, pin and interrupt resource for interrupt from acceleration sensor, DRDY=P2.6\r
+#define PS_INT_IN            (P2IN)\r
+#define PS_INT_OUT           (P2OUT)\r
+#define PS_INT_DIR           (P2DIR)\r
+#define PS_INT_IE            (P2IE)\r
+#define PS_INT_IES           (P2IES)\r
+#define PS_INT_IFG           (P2IFG)\r
+#define PS_INT_PIN           (BIT6)\r
+\r
+// TWI defines\r
+#define PS_TWI_WRITE            (0u)\r
+#define PS_TWI_READ                     (1u)\r
+\r
+#define PS_TWI_SEND_START       (0u)\r
+#define PS_TWI_SEND_RESTART     (1u)\r
+#define PS_TWI_SEND_STOP        (2u)\r
+#define PS_TWI_CHECK_ACK        (3u)\r
+\r
+#define PS_TWI_8BIT_ACCESS      (0u)\r
+#define PS_TWI_16BIT_ACCESS     (1u)\r
+\r
+#define PS_TWI_SCL_HI           { PS_TWI_OUT |=  PS_SCL_PIN; }\r
+#define PS_TWI_SCL_LO           { PS_TWI_OUT &= ~PS_SCL_PIN; }\r
+#define PS_TWI_SDA_HI           { PS_TWI_OUT |=  PS_SDA_PIN; }\r
+#define PS_TWI_SDA_LO           { PS_TWI_OUT &= ~PS_SDA_PIN; }\r
+#define PS_TWI_SDA_IN           { PS_TWI_OUT |=  PS_SDA_PIN; PS_TWI_DIR &= ~PS_SDA_PIN; }\r
+#define PS_TWI_SDA_OUT          { PS_TWI_DIR |=  PS_SDA_PIN; }\r
+\r
+// *************************************************************************************************\r
+// Global Variable section\r
+\r
+// *************************************************************************************************\r
+// Extern section\r
+\r
+#endif                          /*VTI_PS_H_ */\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/include/project.h b/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/include/project.h
new file mode 100755 (executable)
index 0000000..de97736
--- /dev/null
@@ -0,0 +1,134 @@
+// *************************************************************************************************\r
+//\r
+//      Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//        Redistribution and use in source and binary forms, with or without\r
+//        modification, are permitted provided that the following conditions\r
+//        are met:\r
+//\r
+//          Redistributions of source code must retain the above copyright\r
+//          notice, this list of conditions and the following disclaimer.\r
+//\r
+//          Redistributions in binary form must reproduce the above copyright\r
+//          notice, this list of conditions and the following disclaimer in the\r
+//          documentation and/or other materials provided with the\r
+//          distribution.\r
+//\r
+//          Neither the name of Texas Instruments Incorporated nor the names of\r
+//          its contributors may be used to endorse or promote products derived\r
+//          from this software without specific prior written permission.\r
+//\r
+//        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+\r
+#ifndef PROJECT_H_\r
+#define PROJECT_H_\r
+\r
+// *************************************************************************************************\r
+// Include section\r
+#include <cc430x613x.h>\r
+#include <bm.h>\r
+\r
+// *************************************************************************************************\r
+// Defines section\r
+\r
+// Comment this to not use the LCD charge pump\r
+//#define USE_LCD_CHARGE_PUMP\r
+\r
+// Uncomment this define to build the application without watchdog support\r
+#define USE_WATCHDOG\r
+\r
+// Use/not use filter when measuring physical values\r
+#define FILTER_OFF                                              (0u)\r
+#define FILTER_ON                                               (1u)\r
+\r
+// Uncomment this define to build the application with BlueRobin heartrate support\r
+#define INCLUDE_BLUEROBIN_SUPPORT\r
+\r
+// *************************************************************************************************\r
+// Macro section\r
+\r
+// Conversion from usec to ACLK timer ticks\r
+#define CONV_US_TO_TICKS(usec)                          (((usec) * 32768) / 1000000)\r
+\r
+// Conversion from msec to ACLK timer ticks\r
+#define CONV_MS_TO_TICKS(msec)                          (((msec) * 32768) / 1000)\r
+\r
+// *************************************************************************************************\r
+// Typedef section\r
+\r
+typedef enum\r
+{\r
+    MENU_ITEM_NOT_VISIBLE = 0,            // Menu item is not visible\r
+    MENU_ITEM_VISIBLE                     // Menu item is visible\r
+} menu_t;\r
+\r
+// Set of system flags\r
+typedef union\r
+{\r
+    struct\r
+    {\r
+        u16 idle_timeout           : 1;   // Timeout after inactivity\r
+        u16 idle_timeout_enabled   : 1;   // When in set mode, timeout after a given period\r
+        u16 lock_buttons           : 1;   // Lock buttons\r
+        u16 mask_buzzer            : 1;   // Do not output buzz for next button event\r
+        u16 up_down_repeat_enabled : 1;   // While in set_value(), create virtual UP / DOWN button\r
+                                          // press\r
+        u16 low_battery            : 1;   // 1 = Battery is low\r
+        u16 use_metric_units       : 1;   // 1 = Use metric units, 0 = use English units\r
+        u16 delay_over             : 1;   // 1 = Timer delay over\r
+    } flag;\r
+    u16 all_flags;                        // Shortcut to all display flags (for reset)\r
+} s_system_flags;\r
+extern volatile s_system_flags sys;\r
+\r
+// Set of request flags\r
+typedef union\r
+{\r
+    struct\r
+    {\r
+        u16 voltage_measurement      : 1; // 1 = Measure voltage\r
+        u16 altitude_measurement     : 1; // 1 = Measure air pressure\r
+        u16 acceleration_measurement : 1; // 1 = Measure acceleration\r
+        u16 datalog                  : 1; // 1 = Add data\r
+    } flag;\r
+    u16 all_flags;                        // Shortcut to all display flags (for reset)\r
+} s_request_flags;\r
+extern volatile s_request_flags request;\r
+\r
+// Set of message flags\r
+typedef union\r
+{\r
+    struct\r
+    {\r
+        u16 prepare         : 1;          // 1 = Wait for clock tick, then set\r
+                                          // display.flag.show_message flag\r
+        u16 show            : 1;          // 1 = Display message now\r
+        u16 erase           : 1;          // 1 = Erase message\r
+        u16 type_locked     : 1;          // 1 = Show "buttons are locked" in Line2\r
+        u16 type_unlocked   : 1;          // 1 = Show "buttons are unlocked" in Line2\r
+        u16 type_lobatt     : 1;          // 1 = Show "lobatt" text in Line2\r
+        u16 type_on         : 1;          // 1 = Show "  on" text in Line1\r
+        u16 type_off        : 1;          // 1 = Show " off" text in Line1\r
+        u16 type_nomem      : 1;          // 1 = Show "nomem" text in Line2\r
+    } flag;\r
+    u16 all_flags;                        // Shortcut to all message flags (for reset)\r
+} s_message_flags;\r
+extern volatile s_message_flags message;\r
+\r
+// *************************************************************************************************\r
+// Global Variable section\r
+\r
+#endif                                    /*PROJECT_H_ */\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/lnk_cc430f6137.cmd b/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/lnk_cc430f6137.cmd
new file mode 100755 (executable)
index 0000000..4a74364
--- /dev/null
@@ -0,0 +1,202 @@
+/******************************************************************************/\r
+/* lnk_cc430f6137.cmd - LINKER COMMAND FILE FOR LINKING CC430F6137 PROGRAMS */\r
+/*                                                                            */\r
+/*  Ver | dd mmm yyyy | Who  | Description of changes                         */\r
+/* =====|=============|======|=============================================   */\r
+/*  0.01| 08 Mar 2004 | A.D. | First prototype                                */\r
+/*  0.02| 26 Mai 2004 | A.D. | Leading symbol underscores removed,            */\r
+/*      |             |      | Interrupt vector definition changed            */\r
+/*  0.03| 22 Jun 2004 | A.D. | File reformatted                               */\r
+/*                                                                            */\r
+/*   Usage:  lnk430 <obj files...>    -o <out file> -m <map file> lnk.cmd     */\r
+/*           cl430  <src files...> -z -o <out file> -m <map file> lnk.cmd     */\r
+/*                                                                            */\r
+/*----------------------------------------------------------------------------*/\r
+\r
+/* These linker options are for command line linking only.  For IDE linking,  */\r
+/* you should set your linker options in Project Properties                   */\r
+/* -c                                               LINK USING C CONVENTIONS  */\r
+/* -stack  0x0100                                   SOFTWARE STACK SIZE       */\r
+/* -heap   0x0100                                   HEAP AREA SIZE            */\r
+\r
+/*----------------------------------------------------------------------------*/\r
+/* 'Allocate' peripheral registers at given addresses                         */\r
+/*----------------------------------------------------------------------------*/\r
+\r
+/****************************************************************************/\r
+/* SPECIFY THE SYSTEM MEMORY MAP                                            */\r
+/****************************************************************************/\r
+\r
+MEMORY\r
+{\r
+    SFR                     : origin = 0x0000, length = 0x0010\r
+    PERIPHERALS_8BIT        : origin = 0x0010, length = 0x00F0\r
+    PERIPHERALS_16BIT       : origin = 0x0100, length = 0x0100\r
+       RAM                     : origin = 0x1C00, length = 0x0FFE\r
+    INFOA                   : origin = 0x1980, length = 0x0080\r
+    INFOB                   : origin = 0x1900, length = 0x0080\r
+    INFOC                   : origin = 0x1880, length = 0x0080\r
+    INFOD                   : origin = 0x1800, length = 0x0080\r
+    DATALOG_MEMORY                     : origin = 0x8000, length = 0x1E00\r
+    FLASH                   : origin = 0x9E00, length = 0x6180\r
+/*  FLASH                   : origin = 0x8000, length = 0x7F80 */\r
+    INT00                   : origin = 0xFF80, length = 0x0002\r
+    INT01                   : origin = 0xFF82, length = 0x0002\r
+    INT02                   : origin = 0xFF84, length = 0x0002\r
+    INT03                   : origin = 0xFF86, length = 0x0002\r
+    INT04                   : origin = 0xFF88, length = 0x0002\r
+    INT05                   : origin = 0xFF8A, length = 0x0002\r
+    INT06                   : origin = 0xFF8C, length = 0x0002\r
+    INT07                   : origin = 0xFF8E, length = 0x0002\r
+    INT08                   : origin = 0xFF90, length = 0x0002\r
+    INT09                   : origin = 0xFF92, length = 0x0002\r
+    INT10                   : origin = 0xFF94, length = 0x0002\r
+    INT11                   : origin = 0xFF96, length = 0x0002\r
+    INT12                   : origin = 0xFF98, length = 0x0002\r
+    INT13                   : origin = 0xFF9A, length = 0x0002\r
+    INT14                   : origin = 0xFF9C, length = 0x0002\r
+    INT15                   : origin = 0xFF9E, length = 0x0002\r
+    INT16                   : origin = 0xFFA0, length = 0x0002\r
+    INT17                   : origin = 0xFFA2, length = 0x0002\r
+    INT18                   : origin = 0xFFA4, length = 0x0002\r
+    INT19                   : origin = 0xFFA6, length = 0x0002\r
+    INT20                   : origin = 0xFFA8, length = 0x0002\r
+    INT21                   : origin = 0xFFAA, length = 0x0002\r
+    INT22                   : origin = 0xFFAC, length = 0x0002\r
+    INT23                   : origin = 0xFFAE, length = 0x0002\r
+    INT24                   : origin = 0xFFB0, length = 0x0002\r
+    INT25                   : origin = 0xFFB2, length = 0x0002\r
+    INT26                   : origin = 0xFFB4, length = 0x0002\r
+    INT27                   : origin = 0xFFB6, length = 0x0002\r
+    INT28                   : origin = 0xFFB8, length = 0x0002\r
+    INT29                   : origin = 0xFFBA, length = 0x0002\r
+    INT30                   : origin = 0xFFBC, length = 0x0002\r
+    INT31                   : origin = 0xFFBE, length = 0x0002\r
+    INT32                   : origin = 0xFFC0, length = 0x0002\r
+    INT33                   : origin = 0xFFC2, length = 0x0002\r
+    INT34                   : origin = 0xFFC4, length = 0x0002\r
+    INT35                   : origin = 0xFFC6, length = 0x0002\r
+    INT36                   : origin = 0xFFC8, length = 0x0002\r
+    INT37                   : origin = 0xFFCA, length = 0x0002\r
+    INT38                   : origin = 0xFFCC, length = 0x0002\r
+    INT39                   : origin = 0xFFCE, length = 0x0002\r
+    INT40                   : origin = 0xFFD0, length = 0x0002\r
+    INT41                   : origin = 0xFFD2, length = 0x0002\r
+    INT42                   : origin = 0xFFD4, length = 0x0002\r
+    INT43                   : origin = 0xFFD6, length = 0x0002\r
+    INT44                   : origin = 0xFFD8, length = 0x0002\r
+    INT45                   : origin = 0xFFDA, length = 0x0002\r
+    INT46                   : origin = 0xFFDC, length = 0x0002\r
+    INT47                   : origin = 0xFFDE, length = 0x0002\r
+    INT48                   : origin = 0xFFE0, length = 0x0002\r
+    INT49                   : origin = 0xFFE2, length = 0x0002\r
+    INT50                   : origin = 0xFFE4, length = 0x0002\r
+    INT51                   : origin = 0xFFE6, length = 0x0002\r
+    INT52                   : origin = 0xFFE8, length = 0x0002\r
+    INT53                   : origin = 0xFFEA, length = 0x0002\r
+    INT54                   : origin = 0xFFEC, length = 0x0002\r
+    INT55                   : origin = 0xFFEE, length = 0x0002\r
+    INT56                   : origin = 0xFFF0, length = 0x0002\r
+    INT57                   : origin = 0xFFF2, length = 0x0002\r
+    INT58                   : origin = 0xFFF4, length = 0x0002\r
+    INT59                   : origin = 0xFFF6, length = 0x0002\r
+    INT60                   : origin = 0xFFF8, length = 0x0002\r
+    INT61                   : origin = 0xFFFA, length = 0x0002\r
+    INT62                   : origin = 0xFFFC, length = 0x0002\r
+    RESET                   : origin = 0xFFFE, length = 0x0002\r
+}\r
+\r
+/****************************************************************************/\r
+/* SPECIFY THE SECTIONS ALLOCATION INTO MEMORY                              */\r
+/****************************************************************************/\r
+\r
+SECTIONS\r
+{\r
+    .bss       : {} > RAM                /* GLOBAL & STATIC VARS              */\r
+    .sysmem    : {} > RAM                /* DYNAMIC MEMORY ALLOCATION AREA    */\r
+    .stack     : {} > RAM (HIGH)         /* SOFTWARE SYSTEM STACK             */\r
+\r
+    .text      : {} > FLASH              /* CODE                              */\r
+    .cinit     : {} > FLASH              /* INITIALIZATION TABLES             */\r
+    .const     : {} > FLASH              /* CONSTANT DATA                     */\r
+    .cio       : {} > RAM                /* C I/O BUFFER                      */\r
+\r
+    .pinit     : {} > FLASH              /* C++ CONSTRUCTOR TABLES            */\r
+\r
+    .infoA     : {} > INFOA              /* MSP430 INFO FLASH MEMORY SEGMENTS */\r
+    .infoB     : {} > INFOB\r
+    .infoC     : {} > INFOC\r
+    .infoD     : {} > INFOD\r
+\r
+    .int00   : {} > INT00                /* MSP430 INTERRUPT VECTORS          */\r
+    .int01   : {} > INT01\r
+    .int02   : {} > INT02\r
+    .int03   : {} > INT03\r
+    .int04   : {} > INT04\r
+    .int05   : {} > INT05\r
+    .int06   : {} > INT06\r
+    .int07   : {} > INT07\r
+    .int08   : {} > INT08\r
+    .int09   : {} > INT09\r
+    .int10   : {} > INT10\r
+    .int11   : {} > INT11\r
+    .int12   : {} > INT12\r
+    .int13   : {} > INT13\r
+    .int14   : {} > INT14\r
+    .int15   : {} > INT15\r
+    .int16   : {} > INT16\r
+    .int17   : {} > INT17\r
+    .int18   : {} > INT18\r
+    .int19   : {} > INT19\r
+    .int20   : {} > INT20\r
+    .int21   : {} > INT21\r
+    .int22   : {} > INT22\r
+    .int23   : {} > INT23\r
+    .int24   : {} > INT24\r
+    .int25   : {} > INT25\r
+    .int26   : {} > INT26\r
+    .int27   : {} > INT27\r
+    .int28   : {} > INT28\r
+    .int29   : {} > INT29\r
+    .int30   : {} > INT30\r
+    .int31   : {} > INT31\r
+    .int32   : {} > INT32\r
+    .int33   : {} > INT33\r
+    .int34   : {} > INT34\r
+    .int35   : {} > INT35\r
+    .int36   : {} > INT36\r
+    .int37   : {} > INT37\r
+    .int38   : {} > INT38\r
+    .int39   : {} > INT39\r
+    .int40   : {} > INT40\r
+    .int41   : {} > INT41\r
+    .int42   : {} > INT42\r
+    .int43   : {} > INT43\r
+    .int44   : {} > INT44\r
+    .int45   : {} > INT45\r
+    .int46   : {} > INT46\r
+    .int47   : {} > INT47\r
+    .int48   : {} > INT48\r
+    .int49   : {} > INT49\r
+    .int50   : {} > INT50\r
+    .int51   : {} > INT51\r
+    .int52   : {} > INT52\r
+    .int53   : {} > INT53\r
+    .int54   : {} > INT54\r
+    .int55   : {} > INT55\r
+    .int56   : {} > INT56\r
+    .int57   : {} > INT57\r
+    .int58   : {} > INT58\r
+    .int59   : {} > INT59\r
+    .int60   : {} > INT60\r
+    .int61   : {} > INT61\r
+    .int62   : {} > INT62\r
+    .reset   : {} > RESET              /* MSP430 RESET VECTOR               */ \r
+}\r
+\r
+/****************************************************************************/\r
+/* INCLUDE PERIPHERALS MEMORY MAP                                           */\r
+/****************************************************************************/\r
+\r
+-l cc430x613x.cmd\r
+\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/logic/acceleration.c b/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/logic/acceleration.c
new file mode 100755 (executable)
index 0000000..c422496
--- /dev/null
@@ -0,0 +1,241 @@
+// *************************************************************************************************\r
+//\r
+//      Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//        Redistribution and use in source and binary forms, with or without\r
+//        modification, are permitted provided that the following conditions\r
+//        are met:\r
+//\r
+//          Redistributions of source code must retain the above copyright\r
+//          notice, this list of conditions and the following disclaimer.\r
+//\r
+//          Redistributions in binary form must reproduce the above copyright\r
+//          notice, this list of conditions and the following disclaimer in the\r
+//          documentation and/or other materials provided with the\r
+//          distribution.\r
+//\r
+//          Neither the name of Texas Instruments Incorporated nor the names of\r
+//          its contributors may be used to endorse or promote products derived\r
+//          from this software without specific prior written permission.\r
+//\r
+//        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+// Acceleration measurement functions.\r
+// *************************************************************************************************\r
+\r
+// *************************************************************************************************\r
+// Include section\r
+\r
+// system\r
+#include "project.h"\r
+\r
+// driver\r
+#include "display.h"\r
+#include "vti_as.h"\r
+\r
+// logic\r
+#include "acceleration.h"\r
+#include "simpliciti.h"\r
+#include "user.h"\r
+\r
+// *************************************************************************************************\r
+// Global Variable section\r
+struct accel sAccel;\r
+\r
+// Conversion values from data to mgrav taken from CMA3000-D0x datasheet (rev 0.4, table 4)\r
+const u16 mgrav_per_bit[7] = { 18, 36, 71, 143, 286, 571, 1142 };\r
+\r
+// *************************************************************************************************\r
+// Extern section\r
+\r
+// Global flag for proper acceleration sensor operation\r
+extern u8 as_ok;\r
+\r
+// *************************************************************************************************\r
+// @fn          reset_acceleration\r
+// @brief       Reset acceleration variables.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void reset_acceleration(void)\r
+{\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          acceleration_value_is_positive\r
+// @brief       Returns 1 if 2's complement number is positive\r
+// @param       u8 value        2's complement number\r
+// @return      u8                      1 = number is positive, 0 = number is negavtive\r
+// *************************************************************************************************\r
+u8 acceleration_value_is_positive(u8 value)\r
+{\r
+    return ((value & BIT7) == 0);\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          convert_acceleration_value_to_mgrav\r
+// @brief       Converts measured value to mgrav units\r
+// @param       u8 value        g data from sensor\r
+// @return      u16                     Acceleration (mgrav)\r
+// *************************************************************************************************\r
+u16 convert_acceleration_value_to_mgrav(u8 value)\r
+{\r
+    u16 result;\r
+    u8 i;\r
+\r
+    if (!acceleration_value_is_positive(value))\r
+    {\r
+        // Convert 2's complement negative number to positive number\r
+        value = ~value;\r
+        value += 1;\r
+    }\r
+\r
+    result = 0;\r
+    for (i = 0; i < 7; i++)\r
+    {\r
+        result += ((value & (BIT(i))) >> i) * mgrav_per_bit[i];\r
+    }\r
+\r
+    return (result);\r
+}\r
+\r
+//\r
+////\r
+// *************************************************************************************************\r
+//// @fn          display_acceleration\r
+//// @brief       Display routine.\r
+//// @param       u8 line                       LINE1\r
+////                            u8 update               DISPLAY_LINE_UPDATE_FULL, DISPLAY_LINE_CLEAR\r
+//// @return      none\r
+////\r
+// *************************************************************************************************\r
+//void display_acceleration(u8 line, u8 update)\r
+//{\r
+//      u8 * str;\r
+//      u8 raw_data;\r
+//      u16 accel_data;\r
+//\r
+//      // Show warning if acceleration sensor was not initialised properly\r
+//      if (!as_ok)\r
+//      {\r
+//              display_chars(LCD_SEG_L1_2_0, (u8*)"ERR", SEG_ON);\r
+//      }\r
+//      else\r
+//      {\r
+//              // Redraw whole screen\r
+//              if (update == DISPLAY_LINE_UPDATE_FULL)\r
+//              {\r
+//                      {\r
+//                              // Start acceleration sensor\r
+//                              if (!is_acceleration_measurement())\r
+//                              {\r
+//                                      // Clear previous acceleration value\r
+//                                      sAccel.data = 0;\r
+//\r
+//                                      // Start sensor\r
+//                                      as_start();\r
+//\r
+//                                      // Set timeout counter\r
+//                                      sAccel.timeout = ACCEL_MEASUREMENT_TIMEOUT;\r
+//\r
+//                                      // Set mode\r
+//                                      sAccel.mode = ACCEL_MODE_ON;\r
+//\r
+//                                      // Start with Y-axis values\r
+//                                      sAccel.view_style = DISPLAY_ACCEL_Y;\r
+//                              }\r
+//\r
+//                              // Display decimal point\r
+//                              display_symbol(LCD_SEG_L1_DP1, SEG_ON);\r
+//                      }\r
+//              }\r
+//              else if (update == DISPLAY_LINE_UPDATE_PARTIAL)\r
+//              {\r
+//                      // Convert X/Y/Z values to mg\r
+//                      switch (sAccel.view_style)\r
+//                      {\r
+//                              case DISPLAY_ACCEL_X:   raw_data = sAccel.xyz[0];\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//                                                                        display_char(LCD_SEG_L1_3,\r
+// 'X', SEG_ON);\r
+//                                                                              break;\r
+//                              case DISPLAY_ACCEL_Y:   raw_data = sAccel.xyz[1];\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//                                                                        display_char(LCD_SEG_L1_3,\r
+// 'Y', SEG_ON);\r
+//                                                                              break;\r
+//                              default:                                raw_data = sAccel.xyz[2];\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//                                                                        display_char(LCD_SEG_L1_3,\r
+// 'Z', SEG_ON);\r
+//                                                                              break;\r
+//                      }\r
+//                      accel_data = convert_acceleration_value_to_mgrav(raw_data) / 10;\r
+//\r
+//                      // Filter acceleration\r
+//                      accel_data = (u16)((accel_data * 0.2) + (sAccel.data * 0.8));\r
+//\r
+//                      // Store average acceleration\r
+//                      sAccel.data = accel_data;\r
+//\r
+//                      // Display acceleration in x.xx format\r
+//                      str = int_to_array(accel_data, 3, 0);\r
+//                      display_chars(LCD_SEG_L1_2_0, str, SEG_ON);\r
+//\r
+//                      // Display sign\r
+//                      if (acceleration_value_is_positive(raw_data))\r
+//                      {\r
+//                              display_symbol(LCD_SYMB_ARROW_UP, SEG_ON);\r
+//                              display_symbol(LCD_SYMB_ARROW_DOWN, SEG_OFF);\r
+//                      }\r
+//                      else\r
+//                      {\r
+//                              display_symbol(LCD_SYMB_ARROW_UP, SEG_OFF);\r
+//                              display_symbol(LCD_SYMB_ARROW_DOWN, SEG_ON);\r
+//                      }\r
+//              }\r
+//              else if (update == DISPLAY_LINE_CLEAR)\r
+//              {\r
+//                      // Stop acceleration sensor\r
+//                      as_stop();\r
+//\r
+//                      // Clear mode\r
+//                      sAccel.mode = ACCEL_MODE_OFF;\r
+//\r
+//                      // Clean up display\r
+//                      display_symbol(LCD_SEG_L1_DP1, SEG_OFF);\r
+//                      display_symbol(LCD_SYMB_ARROW_UP, SEG_OFF);\r
+//                      display_symbol(LCD_SYMB_ARROW_DOWN, SEG_OFF);\r
+//              }\r
+//      }\r
+//}\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/logic/acceleration.h b/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/logic/acceleration.h
new file mode 100755 (executable)
index 0000000..7b39c2a
--- /dev/null
@@ -0,0 +1,78 @@
+// *************************************************************************************************\r
+//\r
+//      Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//        Redistribution and use in source and binary forms, with or without\r
+//        modification, are permitted provided that the following conditions\r
+//        are met:\r
+//\r
+//          Redistributions of source code must retain the above copyright\r
+//          notice, this list of conditions and the following disclaimer.\r
+//\r
+//          Redistributions in binary form must reproduce the above copyright\r
+//          notice, this list of conditions and the following disclaimer in the\r
+//          documentation and/or other materials provided with the\r
+//          distribution.\r
+//\r
+//          Neither the name of Texas Instruments Incorporated nor the names of\r
+//          its contributors may be used to endorse or promote products derived\r
+//          from this software without specific prior written permission.\r
+//\r
+//        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+\r
+#ifndef ACCELERATION_H_\r
+#define ACCELERATION_H_\r
+\r
+// *************************************************************************************************\r
+// Include section\r
+\r
+// *************************************************************************************************\r
+// Prototypes section\r
+\r
+// *************************************************************************************************\r
+// Defines section\r
+\r
+//#define DISPLAY_ACCEL_X               (0u)\r
+//#define DISPLAY_ACCEL_Y               (1u)\r
+//#define DISPLAY_ACCEL_Z               (2u)\r
+\r
+//#define ACCEL_MODE_OFF                (0u)\r
+//#define ACCEL_MODE_ON         (1u)\r
+\r
+// Stop acceleration measurement after 60 minutes to save battery\r
+//#define ACCEL_MEASUREMENT_TIMEOUT             (60*60u)\r
+\r
+// *************************************************************************************************\r
+// Global Variable section\r
+struct accel\r
+{\r
+    //      u8                      mode;                   // ACC_MODE_OFF, ACC_MODE_ON\r
+    u8 xyz[3];                  // Sensor raw data\r
+    u16 data;                   // Acceleration data in 10 * mgrav\r
+    //      u8                      view_style;             // Display X/Y/Z values\r
+    //      u16                     timeout;                // Timeout\r
+};\r
+extern struct accel sAccel;\r
+\r
+// *************************************************************************************************\r
+// Extern section\r
+extern void reset_acceleration(void);\r
+extern void sx_acceleration(u8 line);\r
+extern void display_acceleration(u8 line, u8 update);\r
+extern u8 is_acceleration_measurement(void);\r
+extern void do_acceleration_measurement(void);\r
+\r
+#endif                          /*ACCELERATION_H_ */\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/logic/altitude.c b/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/logic/altitude.c
new file mode 100755 (executable)
index 0000000..b1cf98d
--- /dev/null
@@ -0,0 +1,342 @@
+// *************************************************************************************************\r
+//\r
+//      Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//        Redistribution and use in source and binary forms, with or without\r
+//        modification, are permitted provided that the following conditions\r
+//        are met:\r
+//\r
+//          Redistributions of source code must retain the above copyright\r
+//          notice, this list of conditions and the following disclaimer.\r
+//\r
+//          Redistributions in binary form must reproduce the above copyright\r
+//          notice, this list of conditions and the following disclaimer in the\r
+//          documentation and/or other materials provided with the\r
+//          distribution.\r
+//\r
+//          Neither the name of Texas Instruments Incorporated nor the names of\r
+//          its contributors may be used to endorse or promote products derived\r
+//          from this software without specific prior written permission.\r
+//\r
+//        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+// Altitude measurement functions.\r
+// *************************************************************************************************\r
+\r
+// *************************************************************************************************\r
+// Include section\r
+\r
+// system\r
+#include "project.h"\r
+\r
+// driver\r
+#include "altitude.h"\r
+#include "display.h"\r
+#include "vti_ps.h"\r
+#include "ports.h"\r
+#include "timer.h"\r
+\r
+// logic\r
+#include "user.h"\r
+#include "datalog.h"\r
+\r
+// *************************************************************************************************\r
+// Prototypes section\r
+\r
+// *************************************************************************************************\r
+// Defines section\r
+\r
+// *************************************************************************************************\r
+// Global Variable section\r
+struct alt sAlt;\r
+\r
+// *************************************************************************************************\r
+// Extern section\r
+\r
+// Global flag for pressure sensor initialisation status\r
+extern u8 ps_ok;\r
+\r
+// *************************************************************************************************\r
+// @fn          reset_altitude_measurement\r
+// @brief       Reset altitude measurement.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void reset_altitude_measurement(void)\r
+{\r
+    // Set default values\r
+    sAlt.on = 0;\r
+    sAlt.altitude = 0;\r
+    sAlt.temperature_C = 0;\r
+    sAlt.temperature_C_offset = 0;\r
+\r
+    // Pressure sensor ok?\r
+    if (ps_ok)\r
+    {\r
+        // Initialise pressure table\r
+        init_pressure_table();\r
+\r
+        // Do single conversion\r
+        start_altitude_measurement();\r
+        stop_altitude_measurement();\r
+\r
+        // Apply calibration offset and recalculate pressure table\r
+        if (sAlt.altitude_offset != 0)\r
+        {\r
+            sAlt.altitude += sAlt.altitude_offset;\r
+            update_pressure_table(sAlt.altitude, sAlt.pressure, sAlt.temperature_K);\r
+        }\r
+    }\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          conv_m_to_ft\r
+// @brief       Convert meters to feet\r
+// @param       u16 m           Meters\r
+// @return      u16             Feet\r
+// *************************************************************************************************\r
+s16 convert_m_to_ft(s16 m)\r
+{\r
+    return (((s32) 328 * m) / 100);\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          conv_ft_to_m\r
+// @brief       Convert feet to meters\r
+// @param       u16 ft          Feet\r
+// @return      u16             Meters\r
+// *************************************************************************************************\r
+s16 convert_ft_to_m(s16 ft)\r
+{\r
+    return (((s32) ft * 61) / 200);\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          start_altitude_measurement\r
+// @brief       Start altitude measurement\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void start_altitude_measurement(void)\r
+{\r
+    u8 timeout = 15;\r
+\r
+    // Already on?\r
+    if (sAlt.on)\r
+        return;\r
+\r
+    // Show warning if pressure sensor was not initialised properly\r
+    if (!ps_ok)\r
+    {\r
+        display_chars(LCD_SEG_L1_2_0, (u8 *) "ERR", SEG_ON);\r
+        return;\r
+    }\r
+\r
+    // Enable DRDY IRQ on rising edge\r
+    PS_INT_IFG &= ~PS_INT_PIN;\r
+    PS_INT_IE |= PS_INT_PIN;\r
+\r
+    // Start pressure sensor\r
+    ps_start();\r
+\r
+    // Set altitude measurement flag\r
+    sAlt.on = 1;\r
+\r
+    // Get updated altitude\r
+    while (((PS_INT_IN & PS_INT_PIN) == 0) && (timeout > 0))\r
+    {\r
+        Timer0_A4_Delay(CONV_MS_TO_TICKS(100));\r
+        timeout--;\r
+    }\r
+\r
+    // Failed to start?\r
+    if (timeout == 0)\r
+    {\r
+        sAlt.on = 0;\r
+    }\r
+\r
+    do_altitude_measurement(FILTER_OFF);\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          stop_altitude_measurement\r
+// @brief       Stop altitude measurement\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void stop_altitude_measurement(void)\r
+{\r
+    // Return if pressure sensor was not initialised properly\r
+    if (!ps_ok)\r
+        return;\r
+\r
+    // Not on?\r
+    if (!sAlt.on)\r
+        return;\r
+\r
+    // Logging data?\r
+    if (is_datalog())\r
+        return;\r
+\r
+    // Stop pressure sensor\r
+    ps_stop();\r
+\r
+    // Clear on flag\r
+    sAlt.on = 0;\r
+\r
+    // Disable DRDY IRQ\r
+    PS_INT_IE &= ~PS_INT_PIN;\r
+    PS_INT_IFG &= ~PS_INT_PIN;\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          is_altitude_measurement\r
+// @brief       Altitude measurement check\r
+// @param       none\r
+// @return      u8              1=Measurement ongoing, 0=measurement off\r
+// *************************************************************************************************\r
+u8 is_altitude_measurement(void)\r
+{\r
+    return (sAlt.on);\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          do_altitude_measurement\r
+// @brief       Perform single altitude measurement\r
+// @param       u8 filter       Filter option\r
+// @return      none\r
+// *************************************************************************************************\r
+void do_altitude_measurement(u8 filter)\r
+{\r
+    volatile u32 pressure;\r
+\r
+    // If sensor is not ready, skip data read\r
+    if ((PS_INT_IN & PS_INT_PIN) == 0)\r
+        return;\r
+\r
+    // Get temperature (format is *10 K) from sensor\r
+    sAlt.temperature_K = ps_get_temp();\r
+    sAlt.temperature_C = sAlt.temperature_K - 2721 + sAlt.temperature_C_offset;\r
+\r
+    // Get pressure (format is 1Pa) from sensor\r
+    pressure = ps_get_pa();\r
+\r
+    // Store measured pressure value\r
+    if (filter == FILTER_OFF)\r
+    {\r
+        sAlt.pressure = pressure;\r
+    }\r
+    else\r
+    {\r
+        // Filter current pressure\r
+        pressure = (u32) ((pressure * 0.2) + (sAlt.pressure * 0.8));\r
+\r
+        // Store average pressure\r
+        sAlt.pressure = pressure;\r
+    }\r
+\r
+    // Convert pressure (Pa) and temperature ( K) to altitude (m)\r
+    sAlt.altitude = conv_pa_to_meter(sAlt.pressure, sAlt.temperature_K);\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          display_altitude\r
+// @brief       Display routine. Supports display in meters and feet.\r
+// @param       u8 line                 LINE1\r
+//                              u8 update               DISPLAY_LINE_UPDATE_FULL,\r
+// DISPLAY_LINE_UPDATE_PARTIAL, DISPLAY_LINE_CLEAR\r
+// @return      none\r
+// *************************************************************************************************\r
+void display_altitude(u8 line, u8 update)\r
+{\r
+    u8 *str;\r
+    s16 ft;\r
+\r
+    // Start measurement\r
+    start_altitude_measurement();\r
+\r
+    // redraw whole screen\r
+    if (update == DISPLAY_LINE_UPDATE_FULL)\r
+    {\r
+        if (sys.flag.use_metric_units)\r
+        {\r
+            // Display "m" symbol\r
+            display_symbol(LCD_UNIT_L1_M, SEG_ON);\r
+        }\r
+        else\r
+        {\r
+            // Display "ft" symbol\r
+            display_symbol(LCD_UNIT_L1_FT, SEG_ON);\r
+        }\r
+\r
+        // Display altitude\r
+        display_altitude(LINE1, DISPLAY_LINE_UPDATE_PARTIAL);\r
+    }\r
+    else if (update == DISPLAY_LINE_UPDATE_PARTIAL)\r
+    {\r
+        if (sys.flag.use_metric_units)\r
+        {\r
+            // Display altitude in xxxx m format, allow 3 leading blank digits\r
+            if (sAlt.altitude >= 0)\r
+            {\r
+                str = int_to_array(sAlt.altitude, 4, 3);\r
+                display_symbol(LCD_SYMB_ARROW_UP, SEG_ON);\r
+                display_symbol(LCD_SYMB_ARROW_DOWN, SEG_OFF);\r
+            }\r
+            else\r
+            {\r
+                str = int_to_array(sAlt.altitude * (-1), 4, 3);\r
+                display_symbol(LCD_SYMB_ARROW_UP, SEG_OFF);\r
+                display_symbol(LCD_SYMB_ARROW_DOWN, SEG_ON);\r
+            }\r
+        }\r
+        else\r
+        {\r
+            // Convert from meters to feet\r
+            ft = convert_m_to_ft(sAlt.altitude);\r
+\r
+            // Limit to 9999ft (3047m)\r
+            if (ft > 9999)\r
+                ft = 9999;\r
+\r
+            // Display altitude in xxxx ft format, allow 3 leading blank digits\r
+            if (ft >= 0)\r
+            {\r
+                str = int_to_array(ft, 4, 3);\r
+                display_symbol(LCD_SYMB_ARROW_UP, SEG_ON);\r
+                display_symbol(LCD_SYMB_ARROW_DOWN, SEG_OFF);\r
+            }\r
+            else\r
+            {\r
+                str = int_to_array(ft * (-1), 4, 3);\r
+                display_symbol(LCD_SYMB_ARROW_UP, SEG_OFF);\r
+                display_symbol(LCD_SYMB_ARROW_DOWN, SEG_ON);\r
+            }\r
+        }\r
+        display_chars(LCD_SEG_L1_3_0, str, SEG_ON);\r
+    }\r
+    else if (update == DISPLAY_LINE_CLEAR)\r
+    {\r
+        // Stop measurement\r
+        stop_altitude_measurement();\r
+\r
+        // Clean up function-specific segments before leaving function\r
+        display_symbol(LCD_UNIT_L1_M, SEG_OFF);\r
+        display_symbol(LCD_UNIT_L1_FT, SEG_OFF);\r
+        display_symbol(LCD_SYMB_ARROW_UP, SEG_OFF);\r
+        display_symbol(LCD_SYMB_ARROW_DOWN, SEG_OFF);\r
+    }\r
+}\r
+\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/logic/altitude.h b/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/logic/altitude.h
new file mode 100755 (executable)
index 0000000..f9550d8
--- /dev/null
@@ -0,0 +1,73 @@
+// *************************************************************************************************\r
+//\r
+//      Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//        Redistribution and use in source and binary forms, with or without\r
+//        modification, are permitted provided that the following conditions\r
+//        are met:\r
+//\r
+//          Redistributions of source code must retain the above copyright\r
+//          notice, this list of conditions and the following disclaimer.\r
+//\r
+//          Redistributions in binary form must reproduce the above copyright\r
+//          notice, this list of conditions and the following disclaimer in the\r
+//          documentation and/or other materials provided with the\r
+//          distribution.\r
+//\r
+//          Neither the name of Texas Instruments Incorporated nor the names of\r
+//          its contributors may be used to endorse or promote products derived\r
+//          from this software without specific prior written permission.\r
+//\r
+//        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+\r
+#ifndef ALTITUDE_H_\r
+#define ALTITUDE_H_\r
+\r
+// *************************************************************************************************\r
+// Include section\r
+\r
+// *************************************************************************************************\r
+// Prototypes section\r
+extern void reset_altitude_measurement(void);\r
+extern void start_altitude_measurement(void);\r
+extern void stop_altitude_measurement(void);\r
+extern u8 is_altitude_measurement(void);\r
+extern void do_altitude_measurement(u8 filter);\r
+\r
+// menu functions\r
+extern void display_altitude(u8 line, u8 update);\r
+\r
+// *************************************************************************************************\r
+// Defines section\r
+\r
+// *************************************************************************************************\r
+// Global Variable section\r
+struct alt\r
+{\r
+    u8 on;                      // 1 = Measurement started, 0 = measurement off\r
+    u32 pressure;               // Pressure (Pa)\r
+    u16 temperature_K;          // Temperature in K\r
+    s16 temperature_C;          // Temperature in ºC\r
+    s16 temperature_C_offset;   // Temperature ºC offset\r
+    s16 altitude;               // Altitude (m)\r
+    s16 altitude_offset;        // Altitude offset stored during calibration\r
+};\r
+extern struct alt sAlt;\r
+\r
+// *************************************************************************************************\r
+// Extern section\r
+\r
+#endif                          /*ALTITUDE_H_ */\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/logic/battery.c b/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/logic/battery.c
new file mode 100755 (executable)
index 0000000..d02a821
--- /dev/null
@@ -0,0 +1,135 @@
+// *************************************************************************************************\r
+//\r
+//      Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//        Redistribution and use in source and binary forms, with or without\r
+//        modification, are permitted provided that the following conditions\r
+//        are met:\r
+//\r
+//          Redistributions of source code must retain the above copyright\r
+//          notice, this list of conditions and the following disclaimer.\r
+//\r
+//          Redistributions in binary form must reproduce the above copyright\r
+//          notice, this list of conditions and the following disclaimer in the\r
+//          documentation and/or other materials provided with the\r
+//          distribution.\r
+//\r
+//          Neither the name of Texas Instruments Incorporated nor the names of\r
+//          its contributors may be used to endorse or promote products derived\r
+//          from this software without specific prior written permission.\r
+//\r
+//        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+// Battery voltage measurement functions.\r
+// *************************************************************************************************\r
+\r
+// *************************************************************************************************\r
+// Include section\r
+\r
+// system\r
+#include "project.h"\r
+\r
+// driver\r
+#include "display.h"\r
+#include "ports.h"\r
+#include "adc12.h"\r
+\r
+// logic\r
+#include "menu.h"\r
+#include "battery.h"\r
+\r
+// *************************************************************************************************\r
+// Prototypes section\r
+void reset_batt_measurement(void);\r
+void battery_measurement(void);\r
+\r
+// *************************************************************************************************\r
+// Defines section\r
+\r
+// *************************************************************************************************\r
+// Global Variable section\r
+struct batt sBatt;\r
+\r
+// *************************************************************************************************\r
+// Extern section\r
+\r
+// *************************************************************************************************\r
+// @fn          reset_batt_measurement\r
+// @brief       Reset battery measurement module.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void reset_batt_measurement(void)\r
+{\r
+    // Reset lobatt display counter\r
+    sBatt.lobatt_display = BATTERY_LOW_MESSAGE_CYCLE;\r
+\r
+    // Start with battery voltage of 3.00V\r
+    sBatt.voltage = 300;\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          battery_measurement\r
+// @brief       Init ADC12. Do single conversion of AVCC voltage. Turn off ADC12.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void battery_measurement(void)\r
+{\r
+    u16 voltage;\r
+\r
+    // Convert external battery voltage (ADC12INCH_11=AVCC-AVSS/2)\r
+    voltage = adc12_single_conversion(REFVSEL_1, ADC12SHT0_10, ADC12INCH_11);\r
+\r
+    // Convert ADC value to "x.xx V"\r
+    // Ideally we have A11=0->AVCC=0V ... A11=4095(2^12-1)->AVCC=4V\r
+    // --> (A11/4095)*4V=AVCC --> AVCC=(A11*4)/4095\r
+    voltage = (voltage * 2 * 2) / 41;\r
+\r
+    // Correct measured voltage with calibration value\r
+    voltage += sBatt.offset;\r
+\r
+    // Discard values that are clearly outside the measurement range\r
+    if (voltage > BATTERY_HIGH_THRESHOLD)\r
+    {\r
+        voltage = sBatt.voltage;\r
+    }\r
+\r
+    // Filter battery voltage\r
+    sBatt.voltage = ((voltage * 2) + (sBatt.voltage * 8)) / 10;\r
+\r
+    // If battery voltage falls below low battery threshold, set system flag and modify LINE2\r
+    // display function pointer\r
+    if (sBatt.voltage < BATTERY_LOW_THRESHOLD)\r
+    {\r
+        sys.flag.low_battery = 1;\r
+\r
+        // Set sticky battery icon\r
+        display_symbol(LCD_SYMB_BATTERY, SEG_ON);\r
+    }\r
+    else\r
+    {\r
+        sys.flag.low_battery = 0;\r
+\r
+        // Clear sticky battery icon\r
+        display_symbol(LCD_SYMB_BATTERY, SEG_OFF);\r
+    }\r
+    // Update LINE2\r
+    display.flag.line2_full_update = 1;\r
+\r
+    // Indicate to display function that new value is available\r
+    display.flag.update_battery_voltage = 1;\r
+}\r
+\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/logic/battery.h b/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/logic/battery.h
new file mode 100755 (executable)
index 0000000..ade8b8e
--- /dev/null
@@ -0,0 +1,79 @@
+// *************************************************************************************************\r
+//\r
+//      Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//        Redistribution and use in source and binary forms, with or without\r
+//        modification, are permitted provided that the following conditions\r
+//        are met:\r
+//\r
+//          Redistributions of source code must retain the above copyright\r
+//          notice, this list of conditions and the following disclaimer.\r
+//\r
+//          Redistributions in binary form must reproduce the above copyright\r
+//          notice, this list of conditions and the following disclaimer in the\r
+//          documentation and/or other materials provided with the\r
+//          distribution.\r
+//\r
+//          Neither the name of Texas Instruments Incorporated nor the names of\r
+//          its contributors may be used to endorse or promote products derived\r
+//          from this software without specific prior written permission.\r
+//\r
+//        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+\r
+#ifndef BATTERY_H_\r
+#define BATTERY_H_\r
+\r
+// *************************************************************************************************\r
+// Include section\r
+\r
+// *************************************************************************************************\r
+// Prototypes section\r
+\r
+// Internal functions\r
+extern void reset_batt_measurement(void);\r
+extern void battery_measurement(void);\r
+\r
+// *************************************************************************************************\r
+// Defines section\r
+\r
+// Battery high voltage threshold\r
+#define BATTERY_HIGH_THRESHOLD                  (360u)\r
+\r
+// Battery end of life voltage threshold -> disable radio, show "lobatt" message\r
+#define BATTERY_LOW_THRESHOLD                   (240u)\r
+\r
+// Show "lobatt" message every n seconds\r
+#define BATTERY_LOW_MESSAGE_CYCLE               (15u)\r
+\r
+// *************************************************************************************************\r
+// Global Variable section\r
+struct batt\r
+{\r
+    // Counter for alternating "lobatt" display\r
+    u8 lobatt_display;\r
+\r
+    // Battery voltage\r
+    u16 voltage;\r
+\r
+    // Battery voltage offset\r
+    s16 offset;\r
+};\r
+extern struct batt sBatt;\r
+\r
+// *************************************************************************************************\r
+// Extern section\r
+\r
+#endif                          /*BATTERY_H_ */\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/logic/bluerobin.c b/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/logic/bluerobin.c
new file mode 100755 (executable)
index 0000000..f4460ef
--- /dev/null
@@ -0,0 +1,396 @@
+// *************************************************************************************************\r
+//\r
+//      Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//        Redistribution and use in source and binary forms, with or without\r
+//        modification, are permitted provided that the following conditions\r
+//        are met:\r
+//\r
+//          Redistributions of source code must retain the above copyright\r
+//          notice, this list of conditions and the following disclaimer.\r
+//\r
+//          Redistributions in binary form must reproduce the above copyright\r
+//          notice, this list of conditions and the following disclaimer in the\r
+//          documentation and/or other materials provided with the\r
+//          distribution.\r
+//\r
+//          Neither the name of Texas Instruments Incorporated nor the names of\r
+//          its contributors may be used to endorse or promote products derived\r
+//          from this software without specific prior written permission.\r
+//\r
+//        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+// BlueRobin functions.\r
+// *************************************************************************************************\r
+\r
+// *************************************************************************************************\r
+// Include section\r
+\r
+// system\r
+#include "project.h"\r
+\r
+// driver\r
+#include "display.h"\r
+#include "radio.h"\r
+#include "ports.h"\r
+#include "timer.h"\r
+#include "rf1a.h"\r
+\r
+// logic\r
+#include "BlueRobin_RX_API.h"\r
+#include "bluerobin.h"\r
+#include "rfsimpliciti.h"\r
+#include "user.h"\r
+\r
+// *************************************************************************************************\r
+// Prototypes section\r
+\r
+// *************************************************************************************************\r
+// Defines section\r
+\r
+// Set to TRUE if transmitter ID should be remembered when reconnecting\r
+// Transmitter ID can be cleared by pressing button STAR for more than 3 seconds\r
+#define REMEMBER_TX_ID                  (FALSE)\r
+\r
+// *************************************************************************************************\r
+// Global Variable section\r
+struct bluerobin sBlueRobin;\r
+\r
+// *************************************************************************************************\r
+// Extern section\r
+\r
+// Stop BlueRobin timer\r
+extern void BRRX__StopTimer_v(void);\r
+\r
+// Calibration value for FSCTRL0 register (corrects deviation of 26MHz crystal)\r
+extern u8 rf_frequoffset;\r
+\r
+// *************************************************************************************************\r
+// @fn          reset_bluerobin\r
+// @brief       Reset BlueRobin data.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void reset_bluerobin(void)\r
+{\r
+    // Reset state is no connection\r
+    sBlueRobin.state = BLUEROBIN_OFF;\r
+\r
+    // Reset value of chest strap ID is 0 --> connect to next best chest strap\r
+    sBlueRobin.cs_id = 0;\r
+\r
+    // No new data available\r
+    sBlueRobin.update = BLUEROBIN_NO_UPDATE;\r
+    sBlueRobin.heartrate = 0;\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          mx_rfblue\r
+// @brief       BlueRobin sub menu. Button STAR resets chest strap ID to 0.\r
+// @param       u8 line LINE2\r
+// @return      none\r
+// *************************************************************************************************\r
+void mx_bluerobin(u8 line)\r
+{\r
+#if REMEMBER_TX_ID == TRUE\r
+    u8 i;\r
+\r
+    // Reset chest strap ID\r
+    sBlueRobin.cs_id = 0;\r
+\r
+    display_chars(LCD_SEG_L1_2_0, (u8 *) "CLR", SEG_ON);\r
+    for (i = 0; i < 4; i++)\r
+        Timer0_A4_Delay(CONV_MS_TO_TICKS(500));\r
+#endif\r
+\r
+    // Clear simulated button event\r
+    button.all_flags = 0;\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          sx_bluerobin\r
+// @brief       BlueRobin direct function. Button UP connects/disconnects with transmitter unit.\r
+// @param       u8 line         LINE1\r
+// @return      none\r
+// *************************************************************************************************\r
+void sx_bluerobin(u8 line)\r
+{\r
+    u8 stop = 0;\r
+\r
+    // Exit if battery voltage is too low for radio operation\r
+    if (sys.flag.low_battery)\r
+        return;\r
+\r
+    // Exit if SimpliciTI stack is active\r
+    if (is_rf())\r
+        return;\r
+\r
+    // UP: connect / disconnect transmitter\r
+    if (button.flag.up)\r
+    {\r
+        if (sBlueRobin.state == BLUEROBIN_OFF)\r
+        {\r
+            // If no transmitter can be found, stop BlueRobin stack\r
+            if (!start_bluerobin())\r
+                stop = 1;\r
+        }\r
+        else if (sBlueRobin.state == BLUEROBIN_CONNECTED)\r
+        {\r
+            // Shutdown connection\r
+            stop = 1;\r
+        }\r
+    }\r
+\r
+    // Shutdown connection\r
+    if (stop)\r
+    {\r
+        stop_bluerobin();\r
+    }\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          display_heartrate\r
+// @brief       Heart rate display routine.\r
+// @param       u8 line         LINE1\r
+//                              u8 update       DISPLAY_LINE_UPDATE_FULL,\r
+// DISPLAY_LINE_UPDATE_PARTIAL, DISPLAY_LINE_CLEAR\r
+// @return      none\r
+// *************************************************************************************************\r
+void display_heartrate(u8 line, u8 update)\r
+{\r
+    u8 *str;\r
+\r
+    if (update != DISPLAY_LINE_CLEAR)\r
+    {\r
+        if (is_bluerobin())\r
+        {\r
+            str = int_to_array(sBlueRobin.heartrate, 3, 2);\r
+            display_chars(LCD_SEG_L1_2_0, str, SEG_ON);\r
+        }\r
+        else\r
+        {\r
+            display_chars(LCD_SEG_L1_2_0, (u8 *) "---", SEG_ON);\r
+        }\r
+    }\r
+\r
+    // Redraw whole screen\r
+    if (!is_bluerobin())\r
+    {\r
+        if (update == DISPLAY_LINE_UPDATE_FULL)\r
+        {\r
+            display_symbol(LCD_ICON_HEART, SEG_ON);\r
+        }\r
+        else if (update == DISPLAY_LINE_CLEAR)\r
+        {\r
+            // Clear heart when not connected\r
+            display_symbol(LCD_ICON_HEART, SEG_OFF);\r
+        }\r
+    }\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          is_bluerobin\r
+// @brief       Returns TRUE if BlueRobin transmitter is connected.\r
+// @param       none\r
+// @return      u8\r
+// *************************************************************************************************\r
+u8 is_bluerobin(void)\r
+{\r
+    return (sBlueRobin.state == BLUEROBIN_CONNECTED);\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          is_bluerobin_searching\r
+// @brief       Returns TRUE if BlueRobin is searching for a transmitter.\r
+// @param       none\r
+// @return      u8                      1 if it is trying to connect\r
+// *************************************************************************************************\r
+u8 is_bluerobin_searching(void)\r
+{\r
+    return (sBlueRobin.state == BLUEROBIN_SEARCHING);\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          get_bluerobin_data\r
+// @brief       Read BlueRobin packet data from API.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void get_bluerobin_data(void)\r
+{\r
+    brtx_state_t bChannelState;\r
+\r
+    // Check connection status\r
+    bChannelState = BRRX_GetState_t(HR_CHANNEL);\r
+\r
+    switch (bChannelState)\r
+    {\r
+        case TX_ACTIVE:        // Read heart rate data from BlueRobin API\r
+            sBlueRobin.heartrate = BRRX_GetHeartRate_u8();\r
+            sBlueRobin.update = BLUEROBIN_NEW_DATA;\r
+            break;\r
+\r
+        case TX_OFF:           // Shutdown connection\r
+            stop_bluerobin();\r
+            break;\r
+\r
+        // BR_SEARCH, BR_LEARN, BR_PAUSE: Keep old values until we receive new data\r
+        default:\r
+            break;\r
+    }\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          start_bluerobin\r
+// @brief       Start BlueRobin stack and search for a transmitter.\r
+// @param       none\r
+// @return      0 = no transmitter found, 1 = connected to a transmitter\r
+// *************************************************************************************************\r
+u8 start_bluerobin(void)\r
+{\r
+    u8 timeout, i;\r
+\r
+    // Init BlueRobin timer and radio\r
+    // Enable high current mode\r
+    open_radio();\r
+\r
+    // Initialize BR library\r
+    BRRX_Init_v();\r
+\r
+    // Set BR data transmission properties\r
+    BRRX_SetPowerdownDelay_v(10); // Power down channel after 10 consecutive lost data packets (~9\r
+                                  // seconds)\r
+    BRRX_SetSearchTimeout_v(6);   // Stop searching after 8 seconds\r
+\r
+    // Sensitivity in learn mode reduced --> connect only to close transmitters\r
+    // Skip this part if chest strap id was set in a previous learn mode run\r
+#if REMEMBER_TX_ID == TRUE\r
+    if (sBlueRobin.cs_id == 0)\r
+        BRRX_SetSignalLevelReduction_v(5);\r
+#else\r
+    // Forget previously learned transmitter ID and connect to next close transmitter\r
+    sBlueRobin.cs_id = 0;\r
+    BRRX_SetSignalLevelReduction_v(5);\r
+#endif\r
+\r
+    // Apply frequency offset compensation to radio register FSCTRL0\r
+    // If calibration memory was erased, rf_frequoffset defaults to 0x00 and has no effect\r
+    WriteSingleReg(FSCTRL0, rf_frequoffset);\r
+\r
+    // New state is SEARCH\r
+    sBlueRobin.state = BLUEROBIN_SEARCHING;\r
+\r
+    // Blink RF icon to show searching\r
+    display_symbol(LCD_ICON_BEEPER1, SEG_ON_BLINK_ON);\r
+    display_symbol(LCD_ICON_BEEPER2, SEG_ON_BLINK_ON);\r
+    display_symbol(LCD_ICON_BEEPER3, SEG_ON_BLINK_ON);\r
+\r
+    // Turn on radio and establish connection if channel not already started\r
+    if (BRRX_GetState_t(HR_CHANNEL) == TX_OFF)\r
+    {\r
+        // Start in learn mode (connect to closest heart rate transmitter)\r
+        BRRX_SetID_v(HR_CHANNEL, sBlueRobin.cs_id);\r
+        BRRX_Start_v(HR_CHANNEL);\r
+\r
+        // Wait until learning phase is over, additional timeout prevents race condition if hardware\r
+        // works incorrect\r
+        timeout = 40;\r
+        while ((BRRX_GetState_t(HR_CHANNEL) == TX_SEARCH) && (timeout-- > 0))\r
+        {\r
+            Timer0_A4_Delay(CONV_MS_TO_TICKS(200));\r
+        }\r
+\r
+        // Timeout?\r
+        if (timeout == 0)\r
+        {\r
+            display_chars(LCD_SEG_L1_3_0, (u8 *) "FAIL", SEG_ON);\r
+            for (i = 0; i < 4; i++)\r
+                Timer0_A4_Delay(CONV_MS_TO_TICKS(500));\r
+        }\r
+    }\r
+\r
+    // Check if connection attempt was successful\r
+    if (BRRX_GetState_t(HR_CHANNEL) == TX_ACTIVE)\r
+    {\r
+        // Successfully connected to transmitter\r
+        sBlueRobin.state = BLUEROBIN_CONNECTED;\r
+\r
+        // When in learn mode, copy chest strap ID\r
+        if (sBlueRobin.cs_id == 0)\r
+            sBlueRobin.cs_id = BRRX_GetID_u32(HR_CHANNEL);\r
+\r
+        // Show steady RF icon to indicate established connection\r
+        display_symbol(LCD_ICON_BEEPER1, SEG_ON_BLINK_OFF);\r
+        display_symbol(LCD_ICON_BEEPER2, SEG_ON_BLINK_OFF);\r
+        display_symbol(LCD_ICON_BEEPER3, SEG_ON_BLINK_OFF);\r
+\r
+        // Show blinking icon\r
+        display_symbol(LCD_ICON_HEART, SEG_ON_BLINK_ON);\r
+\r
+        return (1);\r
+    }\r
+    else                        // Error -> Shutdown connection\r
+    {\r
+        // Clear RF icon\r
+        display_symbol(LCD_ICON_BEEPER1, SEG_OFF_BLINK_OFF);\r
+        display_symbol(LCD_ICON_BEEPER2, SEG_OFF_BLINK_OFF);\r
+        display_symbol(LCD_ICON_BEEPER3, SEG_OFF_BLINK_OFF);\r
+\r
+        return (0);\r
+    }\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          stop_bluerobin\r
+// @brief       Stop communication and put peripherals in power-down mode.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void stop_bluerobin(void)\r
+{\r
+    // Reset connection status byte\r
+    sBlueRobin.state = BLUEROBIN_OFF;\r
+\r
+    // Stop channel\r
+    BRRX_Stop_v(HR_CHANNEL);\r
+\r
+    // Powerdown radio\r
+    close_radio();\r
+\r
+    // Force full display update to clear heart rate and speed data\r
+    sBlueRobin.heartrate = 0;\r
+    display.flag.full_update = 1;\r
+\r
+    // Clear heart and RF symbol\r
+    display_symbol(LCD_ICON_HEART, SEG_OFF_BLINK_OFF);\r
+    display_symbol(LCD_ICON_BEEPER1, SEG_OFF_BLINK_OFF);\r
+    display_symbol(LCD_ICON_BEEPER2, SEG_OFF_BLINK_OFF);\r
+    display_symbol(LCD_ICON_BEEPER3, SEG_OFF_BLINK_OFF);\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          bluerobin_flash_write_window\r
+// @brief       Returns 1 if next BlueRobin ISR is more than 15msec away.\r
+// @param       none\r
+// @return      u8\r
+// *************************************************************************************************\r
+u8 is_bluerobin_flash_write_window(void)\r
+{\r
+    if (is_bluerobin())\r
+        return ((TA0CCR1 - TA0R) > 500);\r
+    else\r
+        return (1);\r
+}\r
+\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/logic/bluerobin.h b/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/logic/bluerobin.h
new file mode 100755 (executable)
index 0000000..7127c04
--- /dev/null
@@ -0,0 +1,90 @@
+// *************************************************************************************************\r
+//\r
+//      Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//        Redistribution and use in source and binary forms, with or without\r
+//        modification, are permitted provided that the following conditions\r
+//        are met:\r
+//\r
+//          Redistributions of source code must retain the above copyright\r
+//          notice, this list of conditions and the following disclaimer.\r
+//\r
+//          Redistributions in binary form must reproduce the above copyright\r
+//          notice, this list of conditions and the following disclaimer in the\r
+//          documentation and/or other materials provided with the\r
+//          distribution.\r
+//\r
+//          Neither the name of Texas Instruments Incorporated nor the names of\r
+//          its contributors may be used to endorse or promote products derived\r
+//          from this software without specific prior written permission.\r
+//\r
+//        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+\r
+#ifndef BLUEROBIN_H_\r
+#define BLUEROBIN_H_\r
+\r
+// *************************************************************************************************\r
+// Include section\r
+#include <project.h>\r
+\r
+// *************************************************************************************************\r
+// Prototypes section\r
+extern void reset_bluerobin(void);\r
+extern void mx_bluerobin(u8 line);\r
+extern void sx_bluerobin(u8 line);\r
+extern void display_heartrate(u8 line, u8 update);\r
+extern u8 is_bluerobin(void);\r
+extern u8 is_bluerobin_searching(void);\r
+extern void get_bluerobin_data(void);\r
+extern u8 start_bluerobin(void);\r
+extern void stop_bluerobin(void);\r
+extern u8 is_bluerobin_flash_write_window(void);\r
+\r
+// *************************************************************************************************\r
+// Defines section\r
+\r
+// BlueRobin connection states\r
+typedef enum\r
+{\r
+    BLUEROBIN_OFF = 0,          // Not connected\r
+    BLUEROBIN_SEARCHING,        // Searching for transmitter\r
+    BLUEROBIN_CONNECTED,        // Connected\r
+    BLUEROBIN_ERROR             // Error occurred while trying to connect or while connected\r
+} BlueRobin_state_t;\r
+\r
+// BlueRobin data update states\r
+typedef enum\r
+{\r
+    BLUEROBIN_NO_UPDATE = 0,    // No new data available\r
+    BLUEROBIN_NEW_DATA          // New data arrived\r
+} BlueRobin_update_t;\r
+\r
+// *************************************************************************************************\r
+// Global Variable section\r
+struct bluerobin\r
+{\r
+    BlueRobin_state_t state;    // BLUEROBIN_OFF, BLUEROBIN_SEARCHING, BLUEROBIN_CONNECTED,\r
+                                // BLUEROBIN_ERROR\r
+    BlueRobin_update_t update;  // BLUEROBIN_NO_UPDATE, BLUEROBIN_NEW_DATA\r
+    u32 cs_id;                  // BLUEROBIN_NO_UPDATE, BLUEROBIN_NEW_DATA\r
+    u8 heartrate;               // Heart rate (1 bpm)\r
+};\r
+extern struct bluerobin sBlueRobin;\r
+\r
+// *************************************************************************************************\r
+// Extern section\r
+\r
+#endif                          /*BLUEROBIN_H_ */\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/logic/clock.c b/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/logic/clock.c
new file mode 100755 (executable)
index 0000000..bc44675
--- /dev/null
@@ -0,0 +1,292 @@
+// *************************************************************************************************\r
+//\r
+//      Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//        Redistribution and use in source and binary forms, with or without\r
+//        modification, are permitted provided that the following conditions\r
+//        are met:\r
+//\r
+//          Redistributions of source code must retain the above copyright\r
+//          notice, this list of conditions and the following disclaimer.\r
+//\r
+//          Redistributions in binary form must reproduce the above copyright\r
+//          notice, this list of conditions and the following disclaimer in the\r
+//          documentation and/or other materials provided with the\r
+//          distribution.\r
+//\r
+//          Neither the name of Texas Instruments Incorporated nor the names of\r
+//          its contributors may be used to endorse or promote products derived\r
+//          from this software without specific prior written permission.\r
+//\r
+//        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+// Time functions.\r
+// *************************************************************************************************\r
+\r
+// *************************************************************************************************\r
+// Include section\r
+\r
+// system\r
+#include "project.h"\r
+\r
+// driver\r
+#include "ports.h"\r
+#include "display.h"\r
+#include "timer.h"\r
+\r
+// logic\r
+#include "menu.h"\r
+#include "clock.h"\r
+#include "user.h"\r
+#include "bluerobin.h"\r
+#include "date.h"\r
+\r
+// *************************************************************************************************\r
+// Prototypes section\r
+void reset_clock(void);\r
+void clock_tick(void);\r
+void mx_time(u8 line);\r
+void sx_time(u8 line);\r
+\r
+void calc_24H_to_12H(u8 * hours, u8 * timeAM);\r
+void conv_24H_to_12H(u8 * hours24, u8 * hours12, u8 * timeAMorPM);\r
+\r
+// *************************************************************************************************\r
+// Defines section\r
+\r
+// *************************************************************************************************\r
+// Global Variable section\r
+struct time sTime;\r
+\r
+// *************************************************************************************************\r
+// Extern section\r
+\r
+// *************************************************************************************************\r
+// @fn          reset_clock\r
+// @brief       Resets clock time to 00:00:00, 24H time format.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void reset_clock(void)\r
+{\r
+    // Set global system time to 0\r
+    sTime.system_time = 0;\r
+\r
+    // Set main 24H time to start value\r
+    sTime.hour = 4;\r
+    sTime.minute = 30;\r
+    sTime.second = 0;\r
+\r
+    // Display style of both lines is default (HH:MM)\r
+    sTime.line1ViewStyle = DISPLAY_DEFAULT_VIEW;\r
+\r
+    // Reset timeout detection\r
+    sTime.last_activity = 0;\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          clock_tick\r
+// @brief       Add 1 second to system time and to display time\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void clock_tick(void)\r
+{\r
+    // Use sTime.drawFlag to minimize display updates\r
+    // sTime.drawFlag = 1: second\r
+    // sTime.drawFlag = 2: minute, second\r
+    // sTime.drawFlag = 3: hour, minute\r
+    sTime.drawFlag = 1;\r
+\r
+    // Increase global system time\r
+    sTime.system_time++;\r
+\r
+    // Add 1 second\r
+    sTime.second++;\r
+\r
+    // Add 1 minute\r
+    if (sTime.second == 60)\r
+    {\r
+        sTime.second = 0;\r
+        sTime.minute++;\r
+        sTime.drawFlag++;\r
+\r
+        // Add 1 hour\r
+        if (sTime.minute == 60)\r
+        {\r
+            sTime.minute = 0;\r
+            sTime.hour++;\r
+            sTime.drawFlag++;\r
+\r
+            // Add 1 day\r
+            if (sTime.hour == 24)\r
+            {\r
+                sTime.hour = 0;\r
+                add_day();\r
+            }\r
+        }\r
+    }\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          convert_hour_to_12H_format\r
+// @brief       Convert internal 24H time to 12H time.\r
+// @param       u8 hour         Hour in 24H format\r
+// @return      u8                      Hour in 12H format\r
+// *************************************************************************************************\r
+u8 convert_hour_to_12H_format(u8 hour)\r
+{\r
+    // 00:00 .. 11:59 --> AM 12:00 .. 11:59\r
+    if (hour == 0)\r
+        return (hour + 12);\r
+    else if (hour <= 12)\r
+        return (hour);\r
+    // 13:00 .. 23:59 --> PM 01:00 .. 11:59\r
+    else\r
+        return (hour - 12);\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          is_hour_am\r
+// @brief       Checks if internal 24H time is AM or PM\r
+// @param       u8 hour         Hour in 24H format\r
+// @return      u8                      1 = AM, 0 = PM\r
+// *************************************************************************************************\r
+u8 is_hour_am(u8 hour)\r
+{\r
+    // 00:00 .. 11:59 --> AM 12:00 .. 11:59\r
+    if (hour < 12)\r
+        return (1);\r
+    // 12:00 .. 23:59 --> PM 12:00 .. 11:59\r
+    else\r
+        return (0);\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          sx_time\r
+// @brief       Time user routine. Toggles view style between HH:MM and SS.\r
+// @param       line            LINE1\r
+// @return      none\r
+// *************************************************************************************************\r
+void sx_time(u8 line)\r
+{\r
+    // Toggle display view style\r
+    if (sTime.line1ViewStyle == DISPLAY_DEFAULT_VIEW)\r
+        sTime.line1ViewStyle = DISPLAY_ALTERNATIVE_VIEW;\r
+    else\r
+        sTime.line1ViewStyle = DISPLAY_DEFAULT_VIEW;\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          display_time\r
+// @brief       Clock display routine. Supports 24H and 12H time format.\r
+// @param       u8 line                 LINE1\r
+//                              u8 update               DISPLAY_LINE_UPDATE_FULL,\r
+// DISPLAY_LINE_UPDATE_PARTIAL\r
+// @return      none\r
+// *************************************************************************************************\r
+void display_time(u8 line, u8 update)\r
+{\r
+    u8 hour12;\r
+\r
+    // Partial update\r
+    if (update == DISPLAY_LINE_UPDATE_PARTIAL)\r
+    {\r
+        if (sTime.drawFlag != 0)\r
+        {\r
+            if (sTime.line1ViewStyle == DISPLAY_DEFAULT_VIEW)\r
+            {\r
+                switch (sTime.drawFlag)\r
+                {\r
+                    case 3:\r
+                        if (sys.flag.use_metric_units)\r
+                        {\r
+                            // Display 24H time "HH"\r
+                            display_chars(switch_seg(line, LCD_SEG_L1_3_2,\r
+                                                     LCD_SEG_L2_3_2), int_to_array(sTime.hour, 2,\r
+                                                                                   0), SEG_ON);\r
+                        }\r
+                        else\r
+                        {\r
+                            // Display 12H time "HH" + AM/PM\r
+                            hour12 = convert_hour_to_12H_format(sTime.hour);\r
+                            display_chars(switch_seg(line, LCD_SEG_L1_3_2,\r
+                                                     LCD_SEG_L2_3_2), int_to_array(hour12, 2,\r
+                                                                                   0), SEG_ON);\r
+                            display_am_pm_symbol(sTime.hour);\r
+                        }\r
+\r
+                    case 2:\r
+                        display_chars(switch_seg(line, LCD_SEG_L1_1_0,\r
+                                                 LCD_SEG_L2_1_0), int_to_array(sTime.minute, 2,\r
+                                                                               0), SEG_ON);\r
+                }\r
+            }\r
+            else\r
+            {\r
+                // Seconds are always updated\r
+                display_chars(switch_seg(line, LCD_SEG_L1_1_0,\r
+                                         LCD_SEG_L2_1_0), int_to_array(sTime.second, 2, 0), SEG_ON);\r
+            }\r
+        }\r
+    }\r
+    else if (update == DISPLAY_LINE_UPDATE_FULL)\r
+    {\r
+        // Full update\r
+        if (sTime.line1ViewStyle == DISPLAY_DEFAULT_VIEW)\r
+        {\r
+            // Display 24H/12H time\r
+            if (sys.flag.use_metric_units)\r
+            {\r
+                // Display 24H time "HH"\r
+                display_chars(switch_seg(line, LCD_SEG_L1_3_2,\r
+                                         LCD_SEG_L2_3_2), int_to_array(sTime.hour, 2, 0), SEG_ON);\r
+            }\r
+            else\r
+            {\r
+                // Display 12H time "HH" + AM/PM information\r
+                hour12 = convert_hour_to_12H_format(sTime.hour);\r
+                display_chars(switch_seg(line, LCD_SEG_L1_3_2,\r
+                                         LCD_SEG_L2_3_2), int_to_array(hour12, 2, 0), SEG_ON);\r
+                // Display AM/PM information\r
+                if (line == LINE1)\r
+                {\r
+                    display_am_pm_symbol(sTime.hour);\r
+                }\r
+            }\r
+\r
+            // Display minute\r
+            display_chars(switch_seg(line, LCD_SEG_L1_1_0,\r
+                                     LCD_SEG_L2_1_0), int_to_array(sTime.minute, 2, 0), SEG_ON);\r
+            display_symbol(switch_seg(line, LCD_SEG_L1_COL, LCD_SEG_L2_COL0), SEG_ON_BLINK_ON);\r
+        }\r
+        else\r
+        {\r
+            // Display seconds\r
+            display_chars(switch_seg(line, LCD_SEG_L1_1_0,\r
+                                     LCD_SEG_L2_1_0), int_to_array(sTime.second, 2, 0), SEG_ON);\r
+            display_symbol(switch_seg(line, LCD_SEG_L1_DP1, LCD_SEG_L2_DP), SEG_ON);\r
+        }\r
+    }\r
+    else if (update == DISPLAY_LINE_CLEAR)\r
+    {\r
+        display_symbol(switch_seg(line, LCD_SEG_L1_COL, LCD_SEG_L2_COL0), SEG_OFF_BLINK_OFF);\r
+        // Change display style to default (HH:MM)\r
+        sTime.line1ViewStyle = DISPLAY_DEFAULT_VIEW;\r
+        // Clean up AM/PM icon\r
+        display_symbol(LCD_SYMB_AM, SEG_OFF);\r
+    }\r
+}\r
+\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/logic/clock.h b/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/logic/clock.h
new file mode 100755 (executable)
index 0000000..a4ad480
--- /dev/null
@@ -0,0 +1,74 @@
+// *************************************************************************************************\r
+//\r
+//      Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//        Redistribution and use in source and binary forms, with or without\r
+//        modification, are permitted provided that the following conditions\r
+//        are met:\r
+//\r
+//          Redistributions of source code must retain the above copyright\r
+//          notice, this list of conditions and the following disclaimer.\r
+//\r
+//          Redistributions in binary form must reproduce the above copyright\r
+//          notice, this list of conditions and the following disclaimer in the\r
+//          documentation and/or other materials provided with the\r
+//          distribution.\r
+//\r
+//          Neither the name of Texas Instruments Incorporated nor the names of\r
+//          its contributors may be used to endorse or promote products derived\r
+//          from this software without specific prior written permission.\r
+//\r
+//        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+\r
+#ifndef CLOCK_H_\r
+#define CLOCK_H_\r
+\r
+// *************************************************************************************************\r
+// Defines section\r
+\r
+// Definitions for time format\r
+#define TIMEFORMAT_24H                  (0u)\r
+#define TIMEFORMAT_12H                  (1u)\r
+\r
+// *************************************************************************************************\r
+// Prototypes section\r
+extern void reset_clock(void);\r
+extern void sx_time(u8 line);\r
+extern void mx_time(u8 line);\r
+extern void clock_tick(void);\r
+extern void display_selection_Timeformat1(u8 segments, u32 index, u8 digits, u8 blanks);\r
+extern void display_time(u8 line, u8 update);\r
+\r
+// English units support\r
+extern void calc_24H_to_12H(u8 * hours, u8 * timeAM);\r
+extern u8 convert_hour_to_12H_format(u8 hour);\r
+extern u8 is_hour_am(u8 hour);\r
+\r
+// *************************************************************************************************\r
+// Global Variable section\r
+struct time\r
+{\r
+    u32 system_time;            // Global system time. Used to calculate last activity\r
+    u32 last_activity;          // Inactivity detection (exits set_value() function)\r
+    u8 drawFlag;                // Flag to minimize display updates\r
+    u8 line1ViewStyle;          // Viewing style\r
+    u8 hour;                    // Time data\r
+    u8 minute;                  // Time data\r
+    u8 second;                  // Time data\r
+};\r
+extern struct time sTime;\r
+\r
+#endif                          /*CLOCK_H_ */\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/logic/datalog.c b/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/logic/datalog.c
new file mode 100755 (executable)
index 0000000..6bd327b
--- /dev/null
@@ -0,0 +1,465 @@
+// *************************************************************************************************\r
+//\r
+//      Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//        Redistribution and use in source and binary forms, with or without\r
+//        modification, are permitted provided that the following conditions\r
+//        are met:\r
+//\r
+//          Redistributions of source code must retain the above copyright\r
+//          notice, this list of conditions and the following disclaimer.\r
+//\r
+//          Redistributions in binary form must reproduce the above copyright\r
+//          notice, this list of conditions and the following disclaimer in the\r
+//          documentation and/or other materials provided with the\r
+//          distribution.\r
+//\r
+//          Neither the name of Texas Instruments Incorporated nor the names of\r
+//          its contributors may be used to endorse or promote products derived\r
+//          from this software without specific prior written permission.\r
+//\r
+//        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+// Data logger routines.\r
+// *************************************************************************************************\r
+\r
+// *************************************************************************************************\r
+// Include section\r
+\r
+// system\r
+#include "project.h"\r
+\r
+// driver\r
+#include "display.h"\r
+#include "flash.h"\r
+#include "ports.h"\r
+\r
+// logic\r
+#include "datalog.h"\r
+#include "date.h"\r
+#include "clock.h"\r
+#include "altitude.h"\r
+#include "temperature.h"\r
+#include "bluerobin.h"\r
+\r
+// *************************************************************************************************\r
+// Prototypes section\r
+void start_datalog(void);\r
+void stop_datalog(void);\r
+void datalog_sm(u8 * data, u8 len, u8 cmd);\r
+\r
+// *************************************************************************************************\r
+// Defines section\r
+\r
+// *************************************************************************************************\r
+// Global Variable section\r
+struct datalog sDatalog;\r
+\r
+// *************************************************************************************************\r
+// Extern section\r
+\r
+// *************************************************************************************************\r
+// @fn          reset_datalog\r
+// @brief       Reset data logger memory and init variables.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void reset_datalog(void)\r
+{\r
+    u8 i;\r
+\r
+    // Clear data logger memory\r
+    for (i = DATALOG_PAGE_START; i <= DATALOG_PAGE_END; i++)\r
+    {\r
+        flash_erase_page(i);\r
+    }\r
+\r
+    sDatalog.flags.all = 0;\r
+    sDatalog.mode = DATALOG_MODE_TEMPERATURE + DATALOG_MODE_ALTITUDE;\r
+    sDatalog.interval = DATALOG_INTERVAL;\r
+    sDatalog.delay = 0;\r
+    sDatalog.wptr = (u16 *) DATALOG_MEMORY_START;\r
+    sDatalog.idx = 0;\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          sx_alarm\r
+// @brief       Sx button turns alarm on/off.\r
+// @param       u8 line         LINE1\r
+// @return      none\r
+// *************************************************************************************************\r
+void sx_datalog(u8 line)\r
+{\r
+    // Turn off the backlight\r
+    P2OUT &= ~BUTTON_BACKLIGHT_PIN;\r
+    P2DIR &= ~BUTTON_BACKLIGHT_PIN;\r
+\r
+    // Toggle data logger state\r
+    if (!sDatalog.flags.flag.on)\r
+    {\r
+        if (!sDatalog.flags.flag.memory_full)\r
+        {\r
+            // Turn on data logger\r
+            start_datalog();\r
+        }\r
+        else                    // Memory full\r
+        {\r
+            // Show "nomem" message\r
+            message.flag.prepare = 1;\r
+            message.flag.type_nomem = 1;\r
+        }\r
+    }\r
+    else\r
+    {\r
+        // Turn off data logger\r
+        stop_datalog();\r
+    }\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          start_datalog\r
+// @brief       Begin to log data.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void start_datalog(void)\r
+{\r
+    // Start BlueRobin RX\r
+    if ((sDatalog.mode & DATALOG_MODE_HEARTRATE) != 0)\r
+    {\r
+        // Keep existing connection\r
+        if (!is_bluerobin())\r
+        {\r
+            // Start BlueRobin\r
+            if (!start_bluerobin())\r
+            {\r
+                // No connection established? -> Close stack\r
+                stop_bluerobin();\r
+            }\r
+        }\r
+    }\r
+\r
+    // Start pressure measurement\r
+    if ((sDatalog.mode & (DATALOG_MODE_TEMPERATURE | DATALOG_MODE_ALTITUDE)) != 0)\r
+    {\r
+        // Start altitude measurement\r
+        start_altitude_measurement();\r
+    }\r
+\r
+    // Set datalogger icon\r
+    display_symbol(LCD_ICON_RECORD, SEG_ON_BLINK_OFF);\r
+\r
+    // Start data logging\r
+    datalog_sm(NULL, 0, DATALOG_CMD_START);\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          stop_datalog\r
+// @brief       Stop data logging.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void stop_datalog(void)\r
+{\r
+    if ((sDatalog.mode & DATALOG_MODE_HEARTRATE) != 0)\r
+    {\r
+        // Stop BlueRobin connection\r
+        if (is_bluerobin())\r
+            stop_bluerobin();\r
+    }\r
+\r
+    // Stop data logging and write out buffer\r
+    datalog_sm(NULL, 0, DATALOG_CMD_CLOSE);\r
+\r
+    if ((sDatalog.mode & (DATALOG_MODE_TEMPERATURE | DATALOG_MODE_ALTITUDE)) != 0)\r
+    {\r
+        // Stop altitude measurement\r
+        stop_altitude_measurement();\r
+    }\r
+\r
+    // Clear datalogger icon\r
+    display_symbol(LCD_ICON_RECORD, SEG_OFF_BLINK_OFF);\r
+}\r
+\r
+u8 is_datalog(void)\r
+{\r
+    return (sDatalog.flags.flag.on);\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          display_datalog\r
+// @brief       Display data logger information.\r
+// @param       u8 line LINE1, LINE2\r
+//                              u8 update       DISPLAY_LINE_UPDATE_FULL, DISPLAY_LINE_CLEAR\r
+// @return      none\r
+// *************************************************************************************************\r
+void display_datalog(u8 line, u8 update)\r
+{\r
+    if (update == DISPLAY_LINE_UPDATE_FULL)\r
+    {\r
+        display_chars(LCD_SEG_L2_4_0, (u8 *) " DLOG", SEG_ON);\r
+    }\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          do_datalog\r
+// @brief       Add data to data logging buffer. Called by second tick.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void do_datalog(void)\r
+{\r
+    u8 temp[4];\r
+    u8 count;\r
+\r
+    // If logging delay is over, add new data\r
+    if (--sDatalog.delay == 0)\r
+    {\r
+        // Store data when possible compressed (heartrate = 8 bits, temperature/altitude = min. 12\r
+        // bits)\r
+        if (sDatalog.mode == DATALOG_MODE_HEARTRATE)\r
+        {\r
+            temp[0] = sBlueRobin.heartrate;\r
+            count = 1;\r
+        }\r
+        else if (sDatalog.mode == DATALOG_MODE_TEMPERATURE)\r
+        {\r
+            temp[0] = (sAlt.temperature_C >> 8) & 0xFF;\r
+            temp[1] = sAlt.temperature_C & 0xFF;\r
+            count = 2;\r
+        }\r
+        else if (sDatalog.mode == DATALOG_MODE_ALTITUDE)\r
+        {\r
+            temp[0] = (sAlt.altitude >> 8) & 0xFF;\r
+            temp[1] = sAlt.altitude & 0xFF;\r
+            count = 2;\r
+        }\r
+        else if (sDatalog.mode ==\r
+                 (DATALOG_MODE_HEARTRATE | DATALOG_MODE_TEMPERATURE | DATALOG_MODE_ALTITUDE))\r
+        {\r
+            temp[0] = sBlueRobin.heartrate;\r
+            temp[1] = (sAlt.temperature_C >> 4) & 0xFF;\r
+            temp[2] = ((sAlt.temperature_C << 4) & 0xF0) | ((sAlt.altitude >> 8) & 0x0F);\r
+            temp[3] = sAlt.altitude & 0xFF;\r
+            count = 4;\r
+        }\r
+        else if (sDatalog.mode == (DATALOG_MODE_HEARTRATE | DATALOG_MODE_TEMPERATURE))\r
+        {\r
+            temp[0] = sBlueRobin.heartrate;\r
+            temp[1] = (sAlt.temperature_C >> 8) & 0xFF;\r
+            temp[2] = sAlt.temperature_C & 0xFF;\r
+            count = 3;\r
+        }\r
+        else if (sDatalog.mode == (DATALOG_MODE_HEARTRATE | DATALOG_MODE_ALTITUDE))\r
+        {\r
+            temp[0] = sBlueRobin.heartrate;\r
+            temp[1] = (sAlt.altitude >> 8) & 0xFF;\r
+            temp[2] = sAlt.altitude & 0xFF;\r
+            count = 3;\r
+        }\r
+        else if (sDatalog.mode == (DATALOG_MODE_TEMPERATURE | DATALOG_MODE_ALTITUDE))\r
+        {\r
+            temp[0] = (sAlt.temperature_C >> 4) & 0xFF;\r
+            temp[1] = ((sAlt.temperature_C << 4) & 0xF0) | ((sAlt.altitude >> 8) & 0x0F);\r
+            temp[2] = sAlt.altitude & 0xFF;\r
+            count = 3;\r
+        }\r
+\r
+        // Add data to recording buffer\r
+        datalog_sm((u8 *) &temp, count, DATALOG_CMD_ADD_DATA);\r
+\r
+        // Reset delay counter\r
+        sDatalog.delay = sDatalog.interval;\r
+\r
+        // Write to flash if buffer is over write threshold and no BlueRobin event is close\r
+        datalog_sm(NULL, 0, DATALOG_CMD_WRITE_DATA);\r
+    }\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          datalog_add_to_buffer\r
+// @brief       Add byte-data to data logging buffer\r
+// @param       u8 * data               Pointer to byte-data\r
+//                              u8 len                  Byte count\r
+// @return      none\r
+// *************************************************************************************************\r
+void datalog_add_to_buffer(u8 * data, u8 len)\r
+{\r
+    u8 i;\r
+\r
+    for (i = 0; i < len; i++)\r
+    {\r
+        // Copy values to buffer\r
+        if (sDatalog.idx < DATALOG_BUFFER_SIZE)\r
+        {\r
+            sDatalog.buffer[sDatalog.idx++] = *(data + i);\r
+        }\r
+    }\r
+}\r
+\r
+// *************************************************************************************************\r
+// Write buffer content to flash\r
+// *************************************************************************************************\r
+void datalog_write_buffer(void)\r
+{\r
+    u8 i = 0;\r
+    u16 data;\r
+    u8 eom = 0;\r
+    volatile u16 temp;\r
+\r
+    // Check if we cross end of memory threshold with this buffer write\r
+    if (sDatalog.wptr >= (u16 *) (DATALOG_MEMORY_END - 1 - sDatalog.idx))\r
+    {\r
+        // Correct index to only write to end of memory\r
+        // Leave 2 bytes for session end marker\r
+        temp = (u16) sDatalog.wptr;\r
+        sDatalog.idx = (u8) ((u16) DATALOG_MEMORY_END - 1 - temp);\r
+        eom = 1;\r
+    }\r
+\r
+    // Write buffer content to flash\r
+    while (i < sDatalog.idx - 1)\r
+    {\r
+        // Keep array order when writing to flash memory\r
+        data = sDatalog.buffer[i++];\r
+        data += (u16) (sDatalog.buffer[i++] << 8);\r
+\r
+        // Write 16-bit word to flash\r
+        flash_write(sDatalog.wptr++, data);\r
+    }\r
+\r
+    // Stop data logging and write session end marker\r
+    if (eom)\r
+    {\r
+        // Write end marker\r
+        flash_write((u16 *) (DATALOG_MEMORY_END - 1), 0xFFFE);\r
+        // Clear buffer index\r
+        sDatalog.idx = 0;\r
+        // Clear flags\r
+        sDatalog.flags.flag.on = 0;\r
+        sDatalog.flags.flag.memory_full = 1;\r
+        // Clear datalogger icon\r
+        display_symbol(LCD_ICON_RECORD, SEG_OFF_BLINK_OFF);\r
+    }\r
+    else\r
+    {\r
+        // If index was odd number, 1 byte remains in buffer and must be written next time\r
+        if ((sDatalog.idx & 0x01) == 0x01)\r
+        {\r
+            sDatalog.buffer[0] = sDatalog.buffer[sDatalog.idx - 1];\r
+            sDatalog.idx = 1;\r
+        }\r
+        else                    // All bytes haven been written\r
+        {\r
+            sDatalog.idx = 0;\r
+        }\r
+    }\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          datalog_sm\r
+// @brief       Data logging state machine\r
+// @param       u8 line LINE1, LINE2\r
+//                              u8 update       DISPLAY_LINE_UPDATE_FULL, DISPLAY_LINE_CLEAR\r
+// @return      none\r
+// *************************************************************************************************\r
+void datalog_sm(u8 * data, u8 len, u8 cmd)\r
+{\r
+    u8 i;\r
+    u16 temp;\r
+\r
+    switch (cmd)\r
+    {\r
+        case DATALOG_CMD_START:\r
+            if (!sDatalog.flags.flag.on && !sDatalog.flags.flag.memory_full)\r
+            {\r
+                // Clear index\r
+                sDatalog.idx = 0;\r
+                sDatalog.delay = sDatalog.interval;\r
+\r
+                // Add session begin marker to buffer (2 byte)\r
+                temp = 0xFFFB;\r
+                datalog_add_to_buffer((u8 *) &temp, 2);\r
+\r
+                // Add recording mode to buffer (1 byte)\r
+                datalog_add_to_buffer((u8 *) &sDatalog.mode, 1);\r
+\r
+                // Add recording interval to buffer (1 byte)\r
+                datalog_add_to_buffer((u8 *) &sDatalog.interval, 1);\r
+\r
+                // Add date to buffer (DD.MM.YYYY) (4 bytes)\r
+                datalog_add_to_buffer((u8 *) &sDate.day, 1);\r
+                datalog_add_to_buffer((u8 *) &sDate.month, 1);\r
+                datalog_add_to_buffer((u8 *) &sDate.year, 2);\r
+\r
+                // Add system time to buffer (HH.MM.SS) (3 bytes)\r
+                datalog_add_to_buffer((u8 *) &sTime.hour, 3);\r
+\r
+                // Data logging has started\r
+                sDatalog.flags.flag.on = 1;\r
+            }\r
+            break;\r
+\r
+        case DATALOG_CMD_CLOSE:\r
+            if (sDatalog.flags.flag.on && !sDatalog.flags.flag.memory_full)\r
+            {\r
+                // If index is odd, add a dummy byte before writing session end marker\r
+                if ((sDatalog.idx & 0x01) == 0x01)\r
+                {\r
+                    temp = 0x00;\r
+                    datalog_add_to_buffer((u8 *) &temp, 1);\r
+                }\r
+                // Add session end marker to buffer (2 byte)\r
+                temp = 0xFFFE;\r
+                datalog_add_to_buffer((u8 *) &temp, 2);\r
+                // Write buffer to flash\r
+                datalog_write_buffer();\r
+            }\r
+            sDatalog.flags.flag.on = 0;\r
+            break;\r
+\r
+        case DATALOG_CMD_ADD_DATA:\r
+            if (sDatalog.flags.flag.on && !sDatalog.flags.flag.memory_full)\r
+            {\r
+                datalog_add_to_buffer(data, len);\r
+            }\r
+            break;\r
+\r
+        case DATALOG_CMD_WRITE_DATA:\r
+            if (sDatalog.flags.flag.on && !sDatalog.flags.flag.memory_full)\r
+            {\r
+                // Over write threshold?\r
+                if (sDatalog.idx > DATALOG_BUFFER_WRITE_THRESHOLD)\r
+                {\r
+                    // BlueRobin ISR call more than ~13ms away?\r
+                    if (is_bluerobin_flash_write_window())\r
+                        datalog_write_buffer();\r
+                }\r
+            }\r
+            break;\r
+\r
+        case DATALOG_CMD_ERASE:\r
+            if (!sDatalog.flags.flag.on)\r
+            {\r
+                for (i = DATALOG_PAGE_START; i <= DATALOG_PAGE_END; i++)\r
+                {\r
+                    flash_erase_page(i);\r
+                }\r
+            }\r
+            break;\r
+\r
+    }\r
+}\r
+\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/logic/datalog.h b/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/logic/datalog.h
new file mode 100755 (executable)
index 0000000..da3903f
--- /dev/null
@@ -0,0 +1,134 @@
+// *************************************************************************************************\r
+//\r
+//      Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//        Redistribution and use in source and binary forms, with or without\r
+//        modification, are permitted provided that the following conditions\r
+//        are met:\r
+//\r
+//          Redistributions of source code must retain the above copyright\r
+//          notice, this list of conditions and the following disclaimer.\r
+//\r
+//          Redistributions in binary form must reproduce the above copyright\r
+//          notice, this list of conditions and the following disclaimer in the\r
+//          documentation and/or other materials provided with the\r
+//          distribution.\r
+//\r
+//          Neither the name of Texas Instruments Incorporated nor the names of\r
+//          its contributors may be used to endorse or promote products derived\r
+//          from this software without specific prior written permission.\r
+//\r
+//        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+\r
+#ifndef DATALOG_H_\r
+#define DATALOG_H_\r
+\r
+// *************************************************************************************************\r
+// Include section\r
+\r
+// *************************************************************************************************\r
+// Prototypes section\r
+\r
+// internal functions\r
+extern void reset_datalog(void);\r
+extern u8 is_datalog(void);\r
+extern void do_datalog(void);\r
+extern void display_datalog(u8 line, u8 update);\r
+extern void stop_datalog(void);\r
+\r
+// menu functions\r
+extern void sx_datalog(u8 line);\r
+\r
+// *************************************************************************************************\r
+// Defines section\r
+\r
+// Data logger state\r
+#define DATALOG_OFF                                             (0u)\r
+#define DATALOG_ON                                              (1u)\r
+\r
+// Data memory range: 0x8000 - 0x9DFF (7.5kB)\r
+#define DATALOG_MEMORY_START            (0x8000)\r
+#define DATALOG_MEMORY_END              (0x9DFF)\r
+#define DATALOG_BYTES_PER_PAGE          (512u)\r
+#define DATALOG_PAGE_START                              (DATALOG_MEMORY_START / \\r
+                                                         DATALOG_BYTES_PER_PAGE)\r
+#define DATALOG_PAGE_END                                (DATALOG_MEMORY_END / \\r
+                                                         DATALOG_BYTES_PER_PAGE)\r
+\r
+// Store data in buffer before writing to flash memory\r
+#define DATALOG_BUFFER_SIZE             (128u)\r
+#define DATALOG_BUFFER_WRITE_THRESHOLD  (100u)\r
+\r
+// Datalogging interval in seconds\r
+#define DATALOG_INTERVAL                        (5u)\r
+\r
+// Datalogger state machine commands\r
+#define DATALOG_CMD_START                       (BIT0)\r
+#define DATALOG_CMD_CLOSE                       (BIT1)\r
+#define DATALOG_CMD_ERASE                       (BIT2)\r
+#define DATALOG_CMD_ADD_DATA                    (BIT3)\r
+#define DATALOG_CMD_WRITE_DATA                  (BIT4)\r
+\r
+// Datalog modes\r
+#define DATALOG_MODE_HEARTRATE                  (BIT0)\r
+#define DATALOG_MODE_TEMPERATURE                (BIT1)\r
+#define DATALOG_MODE_ALTITUDE                   (BIT2)\r
+#define DATALOG_MODE_ACCELERATION               (BIT3)\r
+\r
+// *************************************************************************************************\r
+// Global Variable section\r
+\r
+// Flags\r
+typedef union\r
+{\r
+    struct\r
+    {\r
+        u8 on          : 1; // 1 = data logging has started\r
+        u8 memory_full : 1; // 1 = memory is full\r
+        u8 one_second  : 1; // 1 = 1 second has elapsed\r
+    } flag;\r
+    u8 all;                 // Shortcut to all flags (for reset)\r
+} datalog_flags;\r
+\r
+struct datalog\r
+{\r
+    // Flags\r
+    datalog_flags flags;\r
+\r
+    // Data logging mode\r
+    u8 mode;\r
+\r
+    // Data logging interval\r
+    u8 interval;\r
+\r
+    // Data logging delay counter\r
+    u8 delay;\r
+\r
+    // Datalog memory write pointer\r
+    u16 *wptr;\r
+\r
+    // Datalogger write buffer index\r
+    u8 idx;\r
+\r
+    // Datalogger write buffer\r
+    u8 buffer[DATALOG_BUFFER_SIZE];\r
+};\r
+extern struct datalog sDatalog;\r
+\r
+// *************************************************************************************************\r
+// Extern section\r
+\r
+#endif                          /*DATALOG_H_ */\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/logic/date.c b/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/logic/date.c
new file mode 100755 (executable)
index 0000000..1e34ec5
--- /dev/null
@@ -0,0 +1,234 @@
+// *************************************************************************************************\r
+//\r
+//      Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//        Redistribution and use in source and binary forms, with or without\r
+//        modification, are permitted provided that the following conditions\r
+//        are met:\r
+//\r
+//          Redistributions of source code must retain the above copyright\r
+//          notice, this list of conditions and the following disclaimer.\r
+//\r
+//          Redistributions in binary form must reproduce the above copyright\r
+//          notice, this list of conditions and the following disclaimer in the\r
+//          documentation and/or other materials provided with the\r
+//          distribution.\r
+//\r
+//          Neither the name of Texas Instruments Incorporated nor the names of\r
+//          its contributors may be used to endorse or promote products derived\r
+//          from this software without specific prior written permission.\r
+//\r
+//        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+// Date functions.\r
+// *************************************************************************************************\r
+\r
+// *************************************************************************************************\r
+// Include section\r
+\r
+// system\r
+#include "project.h"\r
+\r
+// driver\r
+#include "display.h"\r
+#include "ports.h"\r
+\r
+// logic\r
+#include "date.h"\r
+#include "user.h"\r
+\r
+// *************************************************************************************************\r
+// Prototypes section\r
+void reset_date(void);\r
+u8 get_numberOfDays(u8 month, u16 year);\r
+void add_day(void);\r
+void mx_date(u8 line);\r
+void sx_date(u8 line);\r
+void display_date(u8 line, u8 update);\r
+\r
+// *************************************************************************************************\r
+// Defines section\r
+\r
+// *************************************************************************************************\r
+// Global Variable section\r
+struct date sDate;\r
+\r
+// *************************************************************************************************\r
+// Extern section\r
+\r
+// *************************************************************************************************\r
+// @fn          reset_date\r
+// @brief       Reset date to start value.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void reset_date(void)\r
+{\r
+    // Set date\r
+    sDate.year = 2009;\r
+    sDate.month = 8;\r
+    sDate.day = 1;\r
+\r
+    // Show day and month on display\r
+    sDate.display = DISPLAY_DEFAULT_VIEW;\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          get_NumberOfDays\r
+// @brief       Return number of days for a given month\r
+// @param       month           month as char\r
+//                              year            year as int\r
+// @return                              day count for given month\r
+// *************************************************************************************************\r
+u8 get_numberOfDays(u8 month, u16 year)\r
+{\r
+    switch (month)\r
+    {\r
+        case 1:\r
+        case 3:\r
+        case 5:\r
+        case 7:\r
+        case 8:\r
+        case 10:\r
+        case 12:\r
+            return (31);\r
+\r
+        case 4:\r
+        case 6:\r
+        case 9:\r
+        case 11:\r
+            return (30);\r
+\r
+        // 1. A year that is divisible by 4 is a leap year. (Y % 4) == 0\r
+        // 2. Exception to rule 1: a year that is divisible by 100 is not a leap year. (Y % 100) !=\r
+        // 0\r
+        // 3. Exception to rule 2: a year that is divisible by 400 is a leap year. (Y % 400) == 0\r
+\r
+        case 2:\r
+            if ((year % 4 == 0) && ((year % 100 != 0) || (year % 400 == 0)))\r
+                return (29);\r
+            else\r
+                return (28);\r
+\r
+        default:\r
+            return (0);\r
+    }\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          add_day\r
+// @brief       Add one day to current date. Called when clock changes from 23:59 to 00:00\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void add_day(void)\r
+{\r
+    // Add 1 day\r
+    sDate.day++;\r
+\r
+    // Check if day overflows into next month\r
+    if (sDate.day > get_numberOfDays(sDate.month, sDate.year))\r
+    {\r
+        // Add 1 month and reset to day to 1\r
+        sDate.day = 1;\r
+        sDate.month++;\r
+\r
+        // Check if month overflows into next year\r
+        if (sDate.month > 12)\r
+        {\r
+            // Add 1 year and reset month and day to 1\r
+            sDate.day = 1;\r
+            sDate.month = 1;\r
+            sDate.year++;\r
+        }\r
+    }\r
+\r
+    // Indicate to display function that new value is available\r
+    display.flag.full_update = 1;\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          sx_date\r
+// @brief       Date user routine. Toggles view between DD.MM and YYYY.\r
+// @param       line            LINE1, LINE2\r
+// @return      none\r
+// *************************************************************************************************\r
+void sx_date(u8 line)\r
+{\r
+    // Toggle display items\r
+    if (sDate.display == DISPLAY_DEFAULT_VIEW)\r
+        sDate.display = DISPLAY_ALTERNATIVE_VIEW;\r
+    else\r
+        sDate.display = DISPLAY_DEFAULT_VIEW;\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          display_date\r
+// @brief       Display date in DD.MM format (metric units) or MM.DD (English units).\r
+// @param       u8 line                 LINE1, LINE2\r
+//                              u8 update               DISPLAY_LINE_UPDATE_FULL,\r
+// DISPLAY_LINE_UPDATE_PARTIAL\r
+// @return      none\r
+// *************************************************************************************************\r
+void display_date(u8 line, u8 update)\r
+{\r
+    u8 *str;\r
+\r
+    if (update == DISPLAY_LINE_UPDATE_FULL)\r
+    {\r
+        if (sDate.display == DISPLAY_DEFAULT_VIEW)\r
+        {\r
+            // Convert day to string\r
+            str = int_to_array(sDate.day, 2, 0);\r
+            if (sys.flag.use_metric_units)\r
+            {\r
+                display_chars(switch_seg(line, LCD_SEG_L1_3_2, LCD_SEG_L2_3_2), str, SEG_ON);\r
+            }\r
+            else\r
+            {\r
+                display_chars(switch_seg(line, LCD_SEG_L1_1_0, LCD_SEG_L2_1_0), str, SEG_ON);\r
+            }\r
+\r
+            // Convert month to string\r
+            str = int_to_array(sDate.month, 2, 0);\r
+            if (sys.flag.use_metric_units)\r
+            {\r
+                display_chars(switch_seg(line, LCD_SEG_L1_1_0, LCD_SEG_L2_1_0), str, SEG_ON);\r
+            }\r
+            else\r
+            {\r
+                display_chars(switch_seg(line, LCD_SEG_L1_3_2, LCD_SEG_L2_3_2), str, SEG_ON);\r
+            }\r
+\r
+            // Display "." to separate day and month\r
+            display_symbol(switch_seg(line, LCD_SEG_L1_DP1, LCD_SEG_L2_DP), SEG_ON);\r
+        }\r
+        else\r
+        {\r
+            // Convert year to string\r
+            str = int_to_array(sDate.year, 4, 0);\r
+            display_chars(switch_seg(line, LCD_SEG_L1_3_0, LCD_SEG_L2_3_0), str, SEG_ON);\r
+\r
+            // Clear "."\r
+            display_symbol(switch_seg(line, LCD_SEG_L1_DP1, LCD_SEG_L2_DP), SEG_OFF);\r
+        }\r
+    }\r
+    else if (update == DISPLAY_LINE_CLEAR)\r
+    {\r
+        // Show day and month on display when coming around next time\r
+        sDate.display = DISPLAY_DEFAULT_VIEW;\r
+    }\r
+}\r
+\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/logic/date.h b/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/logic/date.h
new file mode 100755 (executable)
index 0000000..f3a65b8
--- /dev/null
@@ -0,0 +1,68 @@
+// *************************************************************************************************\r
+//\r
+//      Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//        Redistribution and use in source and binary forms, with or without\r
+//        modification, are permitted provided that the following conditions\r
+//        are met:\r
+//\r
+//          Redistributions of source code must retain the above copyright\r
+//          notice, this list of conditions and the following disclaimer.\r
+//\r
+//          Redistributions in binary form must reproduce the above copyright\r
+//          notice, this list of conditions and the following disclaimer in the\r
+//          documentation and/or other materials provided with the\r
+//          distribution.\r
+//\r
+//          Neither the name of Texas Instruments Incorporated nor the names of\r
+//          its contributors may be used to endorse or promote products derived\r
+//          from this software without specific prior written permission.\r
+//\r
+//        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+\r
+#ifndef DATE_H_\r
+#define DATE_H_\r
+\r
+// *************************************************************************************************\r
+// Include section\r
+\r
+// *************************************************************************************************\r
+// Prototypes section\r
+extern void reset_date(void);\r
+extern void add_day(void);\r
+extern void mx_date(u8 line);\r
+extern void sx_date(u8 line);\r
+extern void display_date(u8 line, u8 update);\r
+\r
+// *************************************************************************************************\r
+// Defines section\r
+\r
+// *************************************************************************************************\r
+// Global Variable section\r
+struct date\r
+{\r
+    u8 display;                 // Toggles view between DISPLAY_DEFAULT_VIEW = DD.MM and\r
+                                // DISPLAY_ALTERNATIVE_VIEW = YYYY\r
+    u8 day;\r
+    u8 month;\r
+    u16 year;\r
+};\r
+extern struct date sDate;\r
+\r
+// *************************************************************************************************\r
+// Extern section\r
+\r
+#endif                          /*DATE_H_ */\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/logic/menu.c b/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/logic/menu.c
new file mode 100755 (executable)
index 0000000..f664cdf
--- /dev/null
@@ -0,0 +1,172 @@
+// *************************************************************************************************\r
+//\r
+//      Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//        Redistribution and use in source and binary forms, with or without\r
+//        modification, are permitted provided that the following conditions\r
+//        are met:\r
+//\r
+//          Redistributions of source code must retain the above copyright\r
+//          notice, this list of conditions and the following disclaimer.\r
+//\r
+//          Redistributions in binary form must reproduce the above copyright\r
+//          notice, this list of conditions and the following disclaimer in the\r
+//          documentation and/or other materials provided with the\r
+//          distribution.\r
+//\r
+//          Neither the name of Texas Instruments Incorporated nor the names of\r
+//          its contributors may be used to endorse or promote products derived\r
+//          from this software without specific prior written permission.\r
+//\r
+//        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+// Menu management functions.\r
+// *************************************************************************************************\r
+\r
+// *************************************************************************************************\r
+// Include section\r
+\r
+// system\r
+#include "project.h"\r
+\r
+// driver\r
+#include "display.h"\r
+\r
+// logic\r
+#include "menu.h"\r
+#include "user.h"\r
+#include "clock.h"\r
+#include "date.h"\r
+#include "temperature.h"\r
+#include "altitude.h"\r
+#include "battery.h"\r
+#include "bluerobin.h"\r
+#include "rfsimpliciti.h"\r
+#include "acceleration.h"\r
+#include "datalog.h"\r
+#include "rfbsl.h"\r
+\r
+// *************************************************************************************************\r
+// Defines section\r
+#define FUNCTION(function)  function\r
+\r
+// *************************************************************************************************\r
+// Global Variable section\r
+const struct menu *ptrMenu_L1 = NULL;\r
+const struct menu *ptrMenu_L2 = NULL;\r
+\r
+// *************************************************************************************************\r
+// Global Variable section\r
+\r
+void display_nothing(u8 line, u8 update)\r
+{\r
+}\r
+\r
+u8 update_time(void)\r
+{\r
+    return (display.flag.update_time);\r
+}\r
+\r
+u8 update_date(void)\r
+{\r
+    return (display.flag.update_date);\r
+}\r
+\r
+u8 update_temperature(void)\r
+{\r
+    return (display.flag.update_temperature);\r
+}\r
+\r
+// *************************************************************************************************\r
+// User navigation ( [____] = default menu item after reset )\r
+//\r
+//      LINE1:  [Time] -> Temperature -> Altitude -> Heart rate\r
+//\r
+//      LINE2:  [Date] -> Datalog -> SYNC -> RFBSL\r
+// *************************************************************************************************\r
+\r
+// Line1 - Time\r
+const struct menu menu_L1_Time = {\r
+    FUNCTION(sx_time),             // direct function\r
+    FUNCTION(dummy),               // sub menu function\r
+    FUNCTION(display_time),        // display function\r
+    FUNCTION(update_time),         // new display data\r
+    &menu_L1_Temperature,\r
+};\r
+\r
+// Line1 - Temperature\r
+const struct menu menu_L1_Temperature = {\r
+    FUNCTION(dummy),               // direct function\r
+    FUNCTION(dummy),               // sub menu function\r
+    FUNCTION(display_temperature), // display function\r
+    FUNCTION(update_time),         // new display data\r
+    &menu_L1_Altitude,\r
+};\r
+\r
+// Line1 - Altitude\r
+const struct menu menu_L1_Altitude = {\r
+    FUNCTION(dummy),               // direct function\r
+    FUNCTION(dummy),               // sub menu function\r
+    FUNCTION(display_altitude),    // display function\r
+    FUNCTION(update_time),         // new display data\r
+#ifdef INCLUDE_BLUEROBIN_SUPPORT\r
+    &menu_L1_Heartrate,\r
+};\r
+\r
+// Line1 - Heart Rate\r
+const struct menu menu_L1_Heartrate = {\r
+    FUNCTION(sx_bluerobin),        // direct function\r
+    FUNCTION(mx_bluerobin),        // sub menu function\r
+    FUNCTION(display_heartrate),   // display function\r
+    FUNCTION(update_time),         // new display data\r
+#endif\r
+    &menu_L1_Time,\r
+};\r
+\r
+// Line2 - Date\r
+const struct menu menu_L2_Date = {\r
+    FUNCTION(sx_date),             // direct function\r
+    FUNCTION(dummy),               // sub menu function\r
+    FUNCTION(display_date),        // display function\r
+    FUNCTION(update_date),         // new display data\r
+    &menu_L2_DataLog,\r
+};\r
+\r
+// Line2 - DataLog (data recording on/off)\r
+const struct menu menu_L2_DataLog = {\r
+    FUNCTION(sx_datalog),          // direct function\r
+    FUNCTION(dummy),               // sub menu function\r
+    FUNCTION(display_datalog),     // display function\r
+    FUNCTION(update_time),         // new display data\r
+    &menu_L2_Sync,\r
+};\r
+\r
+// Line2 - SYNC (synchronization/data download via SimpliciTI)\r
+const struct menu menu_L2_Sync = {\r
+    FUNCTION(sx_sync),             // direct function\r
+    FUNCTION(dummy),               // sub menu function\r
+    FUNCTION(display_sync),        // display function\r
+    FUNCTION(update_time),         // new display data\r
+    &menu_L2_RFBSL,\r
+};\r
+\r
+// Line2 - RFBSL (software update)\r
+const struct menu menu_L2_RFBSL = {\r
+    FUNCTION(sx_rfbsl),            // direct function\r
+    FUNCTION(dummy),               // sub menu function\r
+    FUNCTION(display_rfbsl),       // display function\r
+    FUNCTION(update_time),         // new display data\r
+    &menu_L2_Date,\r
+};\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/logic/menu.h b/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/logic/menu.h
new file mode 100755 (executable)
index 0000000..6b543e1
--- /dev/null
@@ -0,0 +1,84 @@
+// *************************************************************************************************\r
+//\r
+//      Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//        Redistribution and use in source and binary forms, with or without\r
+//        modification, are permitted provided that the following conditions\r
+//        are met:\r
+//\r
+//          Redistributions of source code must retain the above copyright\r
+//          notice, this list of conditions and the following disclaimer.\r
+//\r
+//          Redistributions in binary form must reproduce the above copyright\r
+//          notice, this list of conditions and the following disclaimer in the\r
+//          documentation and/or other materials provided with the\r
+//          distribution.\r
+//\r
+//          Neither the name of Texas Instruments Incorporated nor the names of\r
+//          its contributors may be used to endorse or promote products derived\r
+//          from this software without specific prior written permission.\r
+//\r
+//        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+\r
+#ifndef MENU_H_\r
+#define MENU_H_\r
+\r
+// *************************************************************************************************\r
+// Include section\r
+\r
+// *************************************************************************************************\r
+// Prototypes section\r
+\r
+// *************************************************************************************************\r
+// Defines section\r
+\r
+struct menu\r
+{\r
+    // Pointer to direct function (start, stop etc)\r
+    void (*sx_function)(u8 line);\r
+    // Pointer to sub menu function (change settings, reset counter etc)\r
+    void (*mx_function)(u8 line);\r
+    // Pointer to display function\r
+    void (*display_function)(u8 line, u8 mode);\r
+    // Display update trigger\r
+    u8 (*display_update)(void);\r
+    // Pointer to next menu item\r
+    const struct menu *next;\r
+};\r
+\r
+// *************************************************************************************************\r
+// Global Variable section\r
+\r
+// *************************************************************************************************\r
+// Extern section\r
+\r
+// Line1 navigation\r
+extern const struct menu menu_L1_Time;\r
+extern const struct menu menu_L1_Temperature;\r
+extern const struct menu menu_L1_Altitude;\r
+extern const struct menu menu_L1_Heartrate;\r
+\r
+// Line2 navigation\r
+extern const struct menu menu_L2_Date;\r
+extern const struct menu menu_L2_DataLog;\r
+extern const struct menu menu_L2_Sync;\r
+extern const struct menu menu_L2_RFBSL;\r
+\r
+// Pointers to current menu item\r
+extern const struct menu *ptrMenu_L1;\r
+extern const struct menu *ptrMenu_L2;\r
+\r
+#endif                          /*MENU_H_ */\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/logic/rfbsl.c b/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/logic/rfbsl.c
new file mode 100755 (executable)
index 0000000..c32c980
--- /dev/null
@@ -0,0 +1,118 @@
+// *************************************************************************************************\r
+//\r
+//      Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//        Redistribution and use in source and binary forms, with or without\r
+//        modification, are permitted provided that the following conditions\r
+//        are met:\r
+//\r
+//          Redistributions of source code must retain the above copyright\r
+//          notice, this list of conditions and the following disclaimer.\r
+//\r
+//          Redistributions in binary form must reproduce the above copyright\r
+//          notice, this list of conditions and the following disclaimer in the\r
+//          documentation and/or other materials provided with the\r
+//          distribution.\r
+//\r
+//          Neither the name of Texas Instruments Incorporated nor the names of\r
+//          its contributors may be used to endorse or promote products derived\r
+//          from this software without specific prior written permission.\r
+//\r
+//        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+// Wireless Update functions.\r
+// *************************************************************************************************\r
+\r
+\r
+// *************************************************************************************************\r
+// Include section\r
+\r
+// system\r
+#include "project.h"\r
+\r
+// driver\r
+#include "display.h"\r
+#include "ports.h"\r
+\r
+// logic\r
+#include "rfbsl.h"\r
+#include "bluerobin.h"\r
+#include "rfsimpliciti.h"\r
+\r
+// *************************************************************************************************\r
+// Global Variable section\r
+u8 rfBSL_button_confirmation;\r
+\r
+// *************************************************************************************************\r
+// @fn          sx_rfbsl\r
+// @brief       This functions starts the RFBSL\r
+// @param       line            LINE1, LINE2\r
+// @return      none\r
+// *************************************************************************************************\r
+void sx_rfbsl(u8 line)\r
+{\r
+    // Exit if battery voltage is too low for radio operation\r
+    if (sys.flag.low_battery)\r
+        return;\r
+\r
+    // Exit if BlueRobin stack is active\r
+    if (is_bluerobin())\r
+        return;\r
+\r
+    // Exit if SimpliciTI stack is active\r
+    if (is_rf())\r
+        return;\r
+\r
+    rfBSL_button_confirmation++;\r
+\r
+    if (rfBSL_button_confirmation == 2)\r
+    {\r
+        // Before entering RFBSL clear the LINE1 Symbols\r
+        display_symbol(LCD_SYMB_AM, SEG_OFF);\r
+\r
+        clear_line(LINE1);\r
+\r
+        // Write RAM to indicate we will be downloading the RAM Updater first\r
+        display_chars(LCD_SEG_L2_5_0, (u8 *) " RFBSL", SEG_ON);\r
+        display_chars(LCD_SEG_L1_3_0, (u8 *) " RAM", SEG_ON);\r
+\r
+        // Call RFBSL\r
+        CALL_RFSBL();\r
+    }\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          display_rfbsl\r
+// @brief       RFBSL display routine.\r
+// @param       u8 line                 LINE2\r
+//                              u8 update               DISPLAY_LINE_UPDATE_FULL\r
+// @return      none\r
+// *************************************************************************************************\r
+void display_rfbsl(u8 line, u8 update)\r
+{\r
+    if (update == DISPLAY_LINE_UPDATE_FULL)\r
+    {\r
+        if (rfBSL_button_confirmation == 0)\r
+        {\r
+            display_chars(LCD_SEG_L2_5_0, (u8 *) " RFBSL", SEG_ON);\r
+        }\r
+        else if (rfBSL_button_confirmation < 2)\r
+        {\r
+            // Request one more button press to confirm rfBSL call\r
+            display_chars(LCD_SEG_L2_5_0, (u8 *) " CONF", SEG_ON);\r
+        }\r
+    }\r
+}\r
+\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/logic/rfbsl.h b/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/logic/rfbsl.h
new file mode 100755 (executable)
index 0000000..364749f
--- /dev/null
@@ -0,0 +1,55 @@
+// *************************************************************************************************\r
+//\r
+//      Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//        Redistribution and use in source and binary forms, with or without\r
+//        modification, are permitted provided that the following conditions\r
+//        are met:\r
+//\r
+//          Redistributions of source code must retain the above copyright\r
+//          notice, this list of conditions and the following disclaimer.\r
+//\r
+//          Redistributions in binary form must reproduce the above copyright\r
+//          notice, this list of conditions and the following disclaimer in the\r
+//          documentation and/or other materials provided with the\r
+//          distribution.\r
+//\r
+//          Neither the name of Texas Instruments Incorporated nor the names of\r
+//          its contributors may be used to endorse or promote products derived\r
+//          from this software without specific prior written permission.\r
+//\r
+//        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+\r
+#ifndef RFBSL_H_\r
+#define RFBSL_H_\r
+\r
+// *************************************************************************************************\r
+// Prototypes section\r
+extern void sx_rfbsl(u8 line);\r
+extern void display_rfbsl(u8 line, u8 update);\r
+\r
+// *************************************************************************************************\r
+// Defines section\r
+\r
+// Entry point of of the Flash Updater in BSL memory\r
+#define CALL_RFSBL()   ((void (*)()) 0x1000)()\r
+\r
+\r
+// *************************************************************************************************\r
+// Global Variable section\r
+extern u8 rfBSL_button_confirmation;\r
+\r
+#endif                          /*RFBSL_H_ */\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/logic/rfsimpliciti.c b/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/logic/rfsimpliciti.c
new file mode 100755 (executable)
index 0000000..6887571
--- /dev/null
@@ -0,0 +1,403 @@
+// *************************************************************************************************\r
+//\r
+//      Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//        Redistribution and use in source and binary forms, with or without\r
+//        modification, are permitted provided that the following conditions\r
+//        are met:\r
+//\r
+//          Redistributions of source code must retain the above copyright\r
+//          notice, this list of conditions and the following disclaimer.\r
+//\r
+//          Redistributions in binary form must reproduce the above copyright\r
+//          notice, this list of conditions and the following disclaimer in the\r
+//          documentation and/or other materials provided with the\r
+//          distribution.\r
+//\r
+//          Neither the name of Texas Instruments Incorporated nor the names of\r
+//          its contributors may be used to endorse or promote products derived\r
+//          from this software without specific prior written permission.\r
+//\r
+//        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+// SimpliciTI functions.\r
+// *************************************************************************************************\r
+\r
+// *************************************************************************************************\r
+// Include section\r
+\r
+// system\r
+#include "project.h"\r
+\r
+// driver\r
+#include "display.h"\r
+#include "vti_as.h"\r
+#include "ports.h"\r
+#include "timer.h"\r
+#include "radio.h"\r
+#include "flash.h"\r
+\r
+// logic\r
+#include "acceleration.h"\r
+#include "rfsimpliciti.h"\r
+#include "bluerobin.h"\r
+#include "simpliciti.h"\r
+#include "clock.h"\r
+#include "date.h"\r
+#include "temperature.h"\r
+#include "vti_ps.h"\r
+#include "altitude.h"\r
+#include "datalog.h"\r
+\r
+// *************************************************************************************************\r
+// Prototypes section\r
+void simpliciti_get_data_callback(void);\r
+void start_simpliciti_sync(void);\r
+\r
+// *************************************************************************************************\r
+// Defines section\r
+\r
+// Each packet index requires 2 bytes, so we can have 9 packet indizes in 18 bytes usable payload\r
+#define BM_SYNC_BURST_PACKETS_IN_DATA           (9u)\r
+\r
+// *************************************************************************************************\r
+// Global Variable section\r
+struct RFsmpl sRFsmpl;\r
+\r
+// flag contains status information, trigger to send data and trigger to exit SimpliciTI\r
+unsigned char simpliciti_flag;\r
+\r
+// 4 data bytes to send\r
+unsigned char simpliciti_data[SIMPLICITI_MAX_PAYLOAD_LENGTH];\r
+\r
+// 4 byte device address overrides SimpliciTI end device address set in "smpl_config.dat"\r
+unsigned char simpliciti_ed_address[4];\r
+\r
+// 1 = send one or more reply packets, 0 = no need to reply\r
+//unsigned char simpliciti_reply;\r
+unsigned char simpliciti_reply_count;\r
+\r
+// 1 = send packets sequentially from burst_start to burst_end, 2 = send packets addressed by their\r
+// index\r
+u8 burst_mode;\r
+\r
+// Start and end index of packets to send out\r
+u16 burst_start, burst_end;\r
+\r
+// Array containing requested packets\r
+u16 burst_packet[BM_SYNC_BURST_PACKETS_IN_DATA];\r
+\r
+// Current packet index\r
+u8 burst_packet_index;\r
+\r
+// Byte-Pointer to flash memory\r
+u8 *flash_ptr;\r
+\r
+// *************************************************************************************************\r
+// Extern section\r
+extern void (*fptr_lcd_function_line1)(u8 line, u8 update);\r
+\r
+// *************************************************************************************************\r
+// @fn          reset_rf\r
+// @brief       Reset SimpliciTI data.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void reset_rf(void)\r
+{\r
+    // No connection\r
+    sRFsmpl.mode = SIMPLICITI_OFF;\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          sx_sync\r
+// @brief       Start SimpliciTI. Button DOWN connects/disconnects to access point.\r
+// @param       u8 line         LINE2\r
+// @return      none\r
+// *************************************************************************************************\r
+void sx_sync(u8 line)\r
+{\r
+    // Exit if battery voltage is too low for radio operation\r
+    if (sys.flag.low_battery)\r
+        return;\r
+\r
+    // Exit if BlueRobin stack is active\r
+    if (is_bluerobin())\r
+        return;\r
+\r
+    // Turn off the backlight\r
+    P2OUT &= ~BUTTON_BACKLIGHT_PIN;\r
+    P2DIR &= ~BUTTON_BACKLIGHT_PIN;\r
+    BUTTONS_IE &= ~BUTTON_BACKLIGHT_PIN;\r
+\r
+    // Start SimpliciTI in sync mode\r
+    start_simpliciti_sync();\r
+\r
+    BUTTONS_IE |= BUTTON_BACKLIGHT_PIN;\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          display_sync\r
+// @brief       SimpliciTI display routine.\r
+// @param       u8 line                 LINE2\r
+//                              u8 update               DISPLAY_LINE_UPDATE_FULL\r
+// @return      none\r
+// *************************************************************************************************\r
+void display_sync(u8 line, u8 update)\r
+{\r
+    if (update == DISPLAY_LINE_UPDATE_FULL)\r
+    {\r
+        display_chars(LCD_SEG_L2_5_0, (u8 *) "  SYNC", SEG_ON);\r
+    }\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          is_rf\r
+// @brief       Returns TRUE if SimpliciTI receiver is connected.\r
+// @param       none\r
+// @return      u8\r
+// *************************************************************************************************\r
+u8 is_rf(void)\r
+{\r
+    return (sRFsmpl.mode != SIMPLICITI_OFF);\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          start_simpliciti_sync\r
+// @brief       Start SimpliciTI (sync mode).\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void start_simpliciti_sync(void)\r
+{\r
+    // Clear LINE1\r
+    clear_line(LINE1);\r
+    fptr_lcd_function_line1(LINE1, DISPLAY_LINE_CLEAR);\r
+\r
+    // Stop data logging and close session\r
+    stop_datalog();\r
+\r
+    // Turn on beeper icon to show activity\r
+    display_symbol(LCD_ICON_BEEPER1, SEG_ON_BLINK_ON);\r
+    display_symbol(LCD_ICON_BEEPER2, SEG_ON_BLINK_ON);\r
+    display_symbol(LCD_ICON_BEEPER3, SEG_ON_BLINK_ON);\r
+\r
+    // Prepare radio for RF communication\r
+    open_radio();\r
+\r
+    // Set SimpliciTI mode\r
+    sRFsmpl.mode = SIMPLICITI_SYNC;\r
+\r
+    // Set SimpliciTI timeout to save battery power\r
+    sRFsmpl.timeout = SIMPLICITI_TIMEOUT;\r
+\r
+    // Start SimpliciTI stack. Try to link to access point.\r
+    // Exit with timeout or by a DOWN button press.\r
+    if (simpliciti_link())\r
+    {\r
+        // Enter sync routine. This will send ready-to-receive packets at regular intervals to the\r
+        // access point.\r
+        // The access point always replies a command (NOP if no other command is set)\r
+        simpliciti_main_sync();\r
+    }\r
+\r
+    // Set SimpliciTI state to OFF\r
+    sRFsmpl.mode = SIMPLICITI_OFF;\r
+\r
+    // Powerdown radio\r
+    close_radio();\r
+\r
+    // Clear last button events\r
+    Timer0_A4_Delay(CONV_MS_TO_TICKS(BUTTONS_DEBOUNCE_TIME_OUT));\r
+    BUTTONS_IFG = 0x00;\r
+    button.all_flags = 0;\r
+\r
+    // Clear icons\r
+    display_symbol(LCD_ICON_BEEPER1, SEG_OFF_BLINK_OFF);\r
+    display_symbol(LCD_ICON_BEEPER2, SEG_OFF_BLINK_OFF);\r
+    display_symbol(LCD_ICON_BEEPER3, SEG_OFF_BLINK_OFF);\r
+\r
+    // Force full display update\r
+    display.flag.full_update = 1;\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          simpliciti_sync_decode_ap_cmd_callback\r
+// @brief       For SYNC mode only: Decode command from access point and trigger actions.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void simpliciti_sync_decode_ap_cmd_callback(void)\r
+{\r
+    u8 i;\r
+    s16 t1, offset;\r
+\r
+    // Default behaviour is to send no reply packets\r
+    simpliciti_reply_count = 0;\r
+\r
+    switch (simpliciti_data[0])\r
+    {\r
+        case SYNC_AP_CMD_NOP:\r
+            break;\r
+\r
+        case SYNC_AP_CMD_GET_STATUS: // Send watch parameters\r
+            simpliciti_data[0] = SYNC_ED_TYPE_STATUS;\r
+            // Send single reply packet\r
+            simpliciti_reply_count = 1;\r
+            break;\r
+\r
+        case SYNC_AP_CMD_SET_WATCH:  // Set watch parameters\r
+            sys.flag.use_metric_units = (simpliciti_data[1] >> 7) & 0x01;\r
+            sTime.hour = simpliciti_data[1] & 0x7F;\r
+            sTime.minute = simpliciti_data[2];\r
+            sTime.second = simpliciti_data[3];\r
+            sDate.year = (simpliciti_data[4] << 8) + simpliciti_data[5];\r
+            sDate.month = simpliciti_data[6];\r
+            sDate.day = simpliciti_data[7];\r
+            // Set temperature and temperature offset\r
+            t1 = (s16) ((simpliciti_data[10] << 8) + simpliciti_data[11]);\r
+            offset = t1 - (sAlt.temperature_C - sAlt.temperature_C_offset);\r
+            sAlt.temperature_C_offset = offset;\r
+            sAlt.temperature_C = t1;\r
+            // Set altitude\r
+            sAlt.altitude = (s16) ((simpliciti_data[12] << 8) + simpliciti_data[13]);\r
+            update_pressure_table(sAlt.altitude, sAlt.pressure, sAlt.temperature_K);\r
+            // Data logging mode\r
+            sDatalog.mode = simpliciti_data[14];\r
+            // Data logging interval\r
+            sDatalog.interval = simpliciti_data[15];\r
+\r
+            display_chars(LCD_SEG_L2_5_0, (u8 *) "  DONE", SEG_ON);\r
+            sRFsmpl.display_sync_done = 1;\r
+            break;\r
+\r
+        case SYNC_AP_CMD_GET_MEMORY_BLOCKS_MODE_1:\r
+            // Send sequential packets out in a burst\r
+            simpliciti_data[0] = SYNC_ED_TYPE_MEMORY;\r
+            // Get burst start and end packet\r
+            burst_start = (simpliciti_data[1] << 8) + simpliciti_data[2];\r
+            burst_end = (simpliciti_data[3] << 8) + simpliciti_data[4];\r
+            // Set burst mode\r
+            burst_mode = 1;\r
+            // Number of packets to send\r
+            simpliciti_reply_count = burst_end - burst_start + 1;\r
+            break;\r
+\r
+        case SYNC_AP_CMD_GET_MEMORY_BLOCKS_MODE_2:\r
+            // Send specified packets out in a burst\r
+            simpliciti_data[0] = SYNC_ED_TYPE_MEMORY;\r
+            // Store the requested packets\r
+            for (i = 0; i < BM_SYNC_BURST_PACKETS_IN_DATA; i++)\r
+            {\r
+                burst_packet[i] = (simpliciti_data[i * 2 + 1] << 8) + simpliciti_data[i * 2 + 2];\r
+            }\r
+            // Set burst mode\r
+            burst_mode = 2;\r
+            // Number of packets to send\r
+            simpliciti_reply_count = BM_SYNC_BURST_PACKETS_IN_DATA;\r
+            break;\r
+\r
+        case SYNC_AP_CMD_ERASE_MEMORY: // Erase data logger memory\r
+            for (i = DATALOG_PAGE_START; i <= DATALOG_PAGE_END; i++)\r
+            {\r
+                flash_erase_page(i);\r
+            }\r
+            sDatalog.wptr = (u16 *) DATALOG_MEMORY_START;\r
+            sDatalog.flags.flag.memory_full = 0;\r
+            break;\r
+\r
+        case SYNC_AP_CMD_EXIT:         // Exit sync mode\r
+            simpliciti_flag |= SIMPLICITI_TRIGGER_STOP;\r
+            break;\r
+    }\r
+\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          simpliciti_sync_get_data_callback\r
+// @brief       For SYNC mode only: Access point has requested data. Copy this data into the TX\r
+// buffer now.\r
+// @param       u16 index               Index used for memory requests\r
+// @return      none\r
+// *************************************************************************************************\r
+void simpliciti_sync_get_data_callback(unsigned int index)\r
+{\r
+    u8 i;\r
+    u16 bytes_ready;\r
+\r
+    volatile u16 addr, mem;\r
+\r
+    // Calculate bytes ready for sync\r
+    bytes_ready = (sDatalog.wptr - (u16 *) DATALOG_MEMORY_START) * 2;\r
+\r
+    // simpliciti_data[0] contains data type and needs to be returned to AP\r
+    switch (simpliciti_data[0])\r
+    {\r
+        case SYNC_ED_TYPE_STATUS: // Status packet\r
+            // Time\r
+            simpliciti_data[1] = (sys.flag.use_metric_units << 7) | (sTime.hour & 0x7F);\r
+            simpliciti_data[2] = sTime.minute;\r
+            simpliciti_data[3] = sTime.second;\r
+            // Date\r
+            simpliciti_data[4] = sDate.year >> 8;\r
+            simpliciti_data[5] = sDate.year & 0xFF;\r
+            simpliciti_data[6] = sDate.month;\r
+            simpliciti_data[7] = sDate.day;\r
+            // Unused\r
+            simpliciti_data[8] = 0;\r
+            simpliciti_data[9] = 0;\r
+            // Temperature\r
+            simpliciti_data[10] = sAlt.temperature_C >> 8;\r
+            simpliciti_data[11] = sAlt.temperature_C & 0xFF;\r
+            // Altitude\r
+            simpliciti_data[12] = sAlt.altitude >> 8;\r
+            simpliciti_data[13] = sAlt.altitude & 0xFF;\r
+            // Data logging mode\r
+            simpliciti_data[14] = sDatalog.mode;\r
+            // Data logging interval\r
+            simpliciti_data[15] = sDatalog.interval;\r
+            // Bytes ready for download\r
+            simpliciti_data[16] = bytes_ready >> 8;\r
+            simpliciti_data[17] = bytes_ready & 0xFF;\r
+            // Unused\r
+            simpliciti_data[18] = 0;\r
+\r
+            break;\r
+\r
+        case SYNC_ED_TYPE_MEMORY:\r
+            if (burst_mode == 1)\r
+            {\r
+                // Set burst packet address\r
+                simpliciti_data[1] = ((burst_start + index) >> 8) & 0xFF;\r
+                simpliciti_data[2] = (burst_start + index) & 0xFF;\r
+                // Assemble payload\r
+                flash_ptr = (u8 *) (DATALOG_MEMORY_START + (burst_start + index) * 16);\r
+                for (i = 3; i < BM_SYNC_DATA_LENGTH; i++)\r
+                    simpliciti_data[i] = *flash_ptr++;\r
+            }\r
+            else if (burst_mode == 2)\r
+            {\r
+                // Set burst packet address\r
+                simpliciti_data[1] = (burst_packet[index] >> 8) & 0xFF;\r
+                simpliciti_data[2] = burst_packet[index] & 0xFF;\r
+                // Assemble payload\r
+                flash_ptr = (u8 *) (DATALOG_MEMORY_START + burst_packet[index] * 16);\r
+                for (i = 3; i < BM_SYNC_DATA_LENGTH; i++)\r
+                    simpliciti_data[i] = *flash_ptr++;\r
+            }\r
+            break;\r
+    }\r
+}\r
+\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/logic/rfsimpliciti.h b/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/logic/rfsimpliciti.h
new file mode 100755 (executable)
index 0000000..3cf7902
--- /dev/null
@@ -0,0 +1,98 @@
+// *************************************************************************************************\r
+//\r
+//      Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//        Redistribution and use in source and binary forms, with or without\r
+//        modification, are permitted provided that the following conditions\r
+//        are met:\r
+//\r
+//          Redistributions of source code must retain the above copyright\r
+//          notice, this list of conditions and the following disclaimer.\r
+//\r
+//          Redistributions in binary form must reproduce the above copyright\r
+//          notice, this list of conditions and the following disclaimer in the\r
+//          documentation and/or other materials provided with the\r
+//          distribution.\r
+//\r
+//          Neither the name of Texas Instruments Incorporated nor the names of\r
+//          its contributors may be used to endorse or promote products derived\r
+//          from this software without specific prior written permission.\r
+//\r
+//        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+\r
+#ifndef RFSIMPLICITI_H_\r
+#define RFSIMPLICITI_H_\r
+\r
+// *************************************************************************************************\r
+// Include section\r
+\r
+// *************************************************************************************************\r
+// Prototypes section\r
+extern void reset_rf(void);\r
+extern void sx_rf(u8 line);\r
+extern void sx_ppt(u8 line);\r
+extern void sx_sync(u8 line);\r
+extern void display_rf(u8 line, u8 update);\r
+extern void display_ppt(u8 line, u8 update);\r
+extern void display_sync(u8 line, u8 update);\r
+extern void send_smpl_data(u16 data);\r
+extern u8 is_rf(void);\r
+\r
+// *************************************************************************************************\r
+// Defines section\r
+\r
+// SimpliciTI connection states\r
+typedef enum\r
+{\r
+    SIMPLICITI_OFF = 0,         // Not connected\r
+    SIMPLICITI_ACCELERATION,    // Transmitting acceleration data and button events\r
+    SIMPLICITI_BUTTONS,         // Transmitting button events\r
+    SIMPLICITI_SYNC             // Syncing\r
+} simpliciti_mode_t;\r
+\r
+// Stop SimpliciTI transmission after 60 minutes to save power\r
+#define SIMPLICITI_TIMEOUT                              (60 * 60u)\r
+\r
+// Button flags for SimpliciTI data\r
+#define SIMPLICITI_BUTTON_STAR                  (0x10)\r
+#define SIMPLICITI_BUTTON_NUM                   (0x20)\r
+#define SIMPLICITI_BUTTON_UP                    (0x30)\r
+\r
+// SimpliciTI mode flag\r
+#define SIMPLICITI_MOUSE_EVENTS                 (0x01)\r
+#define SIMPLICITI_KEY_EVENTS                   (0x02)\r
+\r
+// *************************************************************************************************\r
+// Global Variable section\r
+struct RFsmpl\r
+{\r
+    // SIMPLICITI_OFF, SIMPLICITI_ACCELERATION, SIMPLICITI_BUTTONS\r
+    simpliciti_mode_t mode;\r
+\r
+    // Timeout until SimpliciTI transmission is automatically stopped\r
+    u16 timeout;\r
+\r
+    // Variable to display\r
+    u8 display_sync_done;\r
+};\r
+extern struct RFsmpl sRFsmpl;\r
+\r
+extern unsigned char simpliciti_flag;\r
+\r
+// *************************************************************************************************\r
+// Extern section\r
+\r
+#endif                          /*RFSIMPLICITI_H_ */\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/logic/temperature.c b/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/logic/temperature.c
new file mode 100755 (executable)
index 0000000..5a4f897
--- /dev/null
@@ -0,0 +1,170 @@
+// *************************************************************************************************\r
+//\r
+//      Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//        Redistribution and use in source and binary forms, with or without\r
+//        modification, are permitted provided that the following conditions\r
+//        are met:\r
+//\r
+//          Redistributions of source code must retain the above copyright\r
+//          notice, this list of conditions and the following disclaimer.\r
+//\r
+//          Redistributions in binary form must reproduce the above copyright\r
+//          notice, this list of conditions and the following disclaimer in the\r
+//          documentation and/or other materials provided with the\r
+//          distribution.\r
+//\r
+//          Neither the name of Texas Instruments Incorporated nor the names of\r
+//          its contributors may be used to endorse or promote products derived\r
+//          from this software without specific prior written permission.\r
+//\r
+//        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+// Temperature measurement functions.\r
+// *************************************************************************************************\r
+\r
+// *************************************************************************************************\r
+// Include section\r
+\r
+// system\r
+#include "project.h"\r
+\r
+// driver\r
+#include "temperature.h"\r
+#include "display.h"\r
+\r
+// logic\r
+#include "altitude.h"\r
+\r
+// *************************************************************************************************\r
+// Prototypes section\r
+s16 convert_C_to_F(s16 value);\r
+s16 convert_F_to_C(s16 value);\r
+\r
+// *************************************************************************************************\r
+// Defines section\r
+\r
+// *************************************************************************************************\r
+// Global Variable section\r
+\r
+// *************************************************************************************************\r
+// Extern section\r
+\r
+// *************************************************************************************************\r
+// @fn          convert_C_to_F\r
+// @brief       Convert °C to °F\r
+// @param       s16 value               Temperature in °C\r
+// @return      s16                     Temperature in °F\r
+// *************************************************************************************************\r
+s16 convert_C_to_F(s16 value)\r
+{\r
+    s16 DegF;\r
+\r
+    // Celsius in Fahrenheit = (( TCelsius × 9 ) / 5 ) + 32\r
+    DegF = ((value * 9 * 10) / 5 / 10) + 32 * 10;\r
+\r
+    return (DegF);\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          convert_F_to_C\r
+// @brief       Convert °F to °C\r
+// @param       s16 value               Temperature in 2.1 °F\r
+// @return      s16                     Temperature in 2.1 °C\r
+// *************************************************************************************************\r
+s16 convert_F_to_C(s16 value)\r
+{\r
+    s16 DegC;\r
+\r
+    // TCelsius =( TFahrenheit - 32 ) × 5 / 9\r
+    DegC = (((value - 320) * 5)) / 9;\r
+\r
+    return (DegC);\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          display_temperature\r
+// @brief       Common display routine for metric and English units.\r
+// @param       u8 line                 LINE1\r
+//                              u8 update               DISPLAY_LINE_UPDATE_FULL, DISPLAY_LINE_CLEAR\r
+// @return      none\r
+// *************************************************************************************************\r
+void display_temperature(u8 line, u8 update)\r
+{\r
+    u8 *str;\r
+    s16 temperature;\r
+\r
+    // Redraw whole screen\r
+    if (update == DISPLAY_LINE_UPDATE_FULL)\r
+    {\r
+        // Start measurement\r
+        start_altitude_measurement();\r
+\r
+        // Display °C / °F\r
+        display_symbol(LCD_SEG_L1_DP1, SEG_ON);\r
+        display_symbol(LCD_UNIT_L1_DEGREE, SEG_ON);\r
+        if (sys.flag.use_metric_units)\r
+            display_char(LCD_SEG_L1_0, 'C', SEG_ON);\r
+        else\r
+            display_char(LCD_SEG_L1_0, 'F', SEG_ON);\r
+\r
+        // Display temperature\r
+        display_temperature(LINE1, DISPLAY_LINE_UPDATE_PARTIAL);\r
+    }\r
+    else if (update == DISPLAY_LINE_UPDATE_PARTIAL)\r
+    {\r
+        // When using English units, convert °C to °F (temp*1.8+32)\r
+        if (!sys.flag.use_metric_units)\r
+        {\r
+            temperature = convert_C_to_F(sAlt.temperature_C);\r
+        }\r
+        else\r
+        {\r
+            temperature = sAlt.temperature_C;\r
+        }\r
+\r
+        // Indicate temperature sign through arrow up/down icon\r
+        if (temperature < 0)\r
+        {\r
+            // Convert negative to positive number\r
+            temperature = ~temperature;\r
+            temperature += 1;\r
+\r
+            display_symbol(LCD_SYMB_ARROW_UP, SEG_OFF);\r
+            display_symbol(LCD_SYMB_ARROW_DOWN, SEG_ON);\r
+        }\r
+        else                    // Temperature is >= 0\r
+        {\r
+            display_symbol(LCD_SYMB_ARROW_UP, SEG_ON);\r
+            display_symbol(LCD_SYMB_ARROW_DOWN, SEG_OFF);\r
+        }\r
+\r
+        // Display result in xx.x format\r
+        str = int_to_array(temperature, 3, 1);\r
+        display_chars(LCD_SEG_L1_3_1, str, SEG_ON);\r
+    }\r
+    else if (update == DISPLAY_LINE_CLEAR)\r
+    {\r
+        // Stop measurement\r
+        stop_altitude_measurement();\r
+\r
+        // Clean up function-specific segments before leaving function\r
+        display_symbol(LCD_SYMB_ARROW_UP, SEG_OFF);\r
+        display_symbol(LCD_SYMB_ARROW_DOWN, SEG_OFF);\r
+        display_symbol(LCD_UNIT_L1_DEGREE, SEG_OFF);\r
+        display_symbol(LCD_SEG_L1_DP1, SEG_OFF);\r
+    }\r
+}\r
+\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/logic/temperature.h b/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/logic/temperature.h
new file mode 100755 (executable)
index 0000000..81121ac
--- /dev/null
@@ -0,0 +1,55 @@
+// *************************************************************************************************\r
+//\r
+//      Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//        Redistribution and use in source and binary forms, with or without\r
+//        modification, are permitted provided that the following conditions\r
+//        are met:\r
+//\r
+//          Redistributions of source code must retain the above copyright\r
+//          notice, this list of conditions and the following disclaimer.\r
+//\r
+//          Redistributions in binary form must reproduce the above copyright\r
+//          notice, this list of conditions and the following disclaimer in the\r
+//          documentation and/or other materials provided with the\r
+//          distribution.\r
+//\r
+//          Neither the name of Texas Instruments Incorporated nor the names of\r
+//          its contributors may be used to endorse or promote products derived\r
+//          from this software without specific prior written permission.\r
+//\r
+//        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+\r
+#ifndef TEMPERATURE_H_\r
+#define TEMPERATURE_H_\r
+\r
+// *************************************************************************************************\r
+// Include section\r
+\r
+// *************************************************************************************************\r
+// Prototypes section\r
+extern void display_temperature(u8 line, u8 update);\r
+\r
+// *************************************************************************************************\r
+// Defines section\r
+\r
+// *************************************************************************************************\r
+// Global Variable section\r
+\r
+// *************************************************************************************************\r
+// Extern section\r
+\r
+#endif                          /*TEMPERATURE_H_ */\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/logic/user.c b/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/logic/user.c
new file mode 100755 (executable)
index 0000000..6410d0b
--- /dev/null
@@ -0,0 +1,282 @@
+// *************************************************************************************************\r
+//\r
+//      Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//        Redistribution and use in source and binary forms, with or without\r
+//        modification, are permitted provided that the following conditions\r
+//        are met:\r
+//\r
+//          Redistributions of source code must retain the above copyright\r
+//          notice, this list of conditions and the following disclaimer.\r
+//\r
+//          Redistributions in binary form must reproduce the above copyright\r
+//          notice, this list of conditions and the following disclaimer in the\r
+//          documentation and/or other materials provided with the\r
+//          distribution.\r
+//\r
+//          Neither the name of Texas Instruments Incorporated nor the names of\r
+//          its contributors may be used to endorse or promote products derived\r
+//          from this software without specific prior written permission.\r
+//\r
+//        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+// Several user functions.\r
+// *************************************************************************************************\r
+\r
+// *************************************************************************************************\r
+// Include section\r
+\r
+// system\r
+#include "project.h"\r
+\r
+// driver\r
+#include "display.h"\r
+#include "buzzer.h"\r
+#include "ports.h"\r
+\r
+// logic\r
+#include "menu.h"\r
+#include "date.h"\r
+#include "clock.h"\r
+#include "user.h"\r
+\r
+// *************************************************************************************************\r
+// Prototypes section\r
+\r
+// *************************************************************************************************\r
+// Defines section\r
+\r
+// *************************************************************************************************\r
+// Global Variable section\r
+\r
+// *************************************************************************************************\r
+// Extern section\r
+extern void idle_loop(void);\r
+\r
+// *************************************************************************************************\r
+// @fn          dummy\r
+// @brief       Dummy direct function.\r
+// @param       u8 line LINE1, LINE2\r
+// @return      none\r
+// *************************************************************************************************\r
+void dummy(u8 line)\r
+{\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          set_value\r
+// @brief       Generic value setting routine\r
+// @param       s32 * value                                                     Pointer to value to\r
+// set\r
+//                              u8digits\r
+//                                                        Number of digits\r
+//                              u8 blanks\r
+//                                                       Number of whitespaces before first valid\r
+// digit\r
+//                              s32 limitLow                                            Lower limit\r
+// of value\r
+//                              s32 limitHigh                                           Upper limit\r
+// of value\r
+//                              u16 mode\r
+//                              u8 segments\r
+//                                                     Segments where value should be drawn\r
+//                              fptr_setValue_display_function1         Value-specific display\r
+// routine\r
+// @return      none\r
+// *************************************************************************************************\r
+void set_value(s32 * value, u8 digits, u8 blanks, s32 limitLow, s32 limitHigh, u16 mode,\r
+               u8 segments,\r
+               void (*fptr_setValue_display_function1)(u8 segments, u32 value, u8 digits,\r
+                                                       u8 blanks))\r
+{\r
+    u8 update;\r
+    s16 stepValue = 1;\r
+    u8 doRound = 0;\r
+    u32 val;\r
+\r
+    // Clear button flags\r
+    button.all_flags = 0;\r
+\r
+    // Clear blink memory\r
+    clear_blink_mem();\r
+\r
+    // For safety only - buzzer on/off and button_repeat share same IRQ\r
+    stop_buzzer();\r
+\r
+    // Init step size and repeat counter\r
+    sButton.repeats = 0;\r
+\r
+    // Initial display update\r
+    update = 1;\r
+\r
+    // Turn on 200ms button repeat function\r
+    button_repeat_on(200);\r
+\r
+    // Start blinking with with 2Hz\r
+    set_blink_rate(BIT6 + BIT5);\r
+\r
+    // Value set loop\r
+    while (1)\r
+    {\r
+        // Idle timeout: exit function\r
+        if (sys.flag.idle_timeout)\r
+            break;\r
+\r
+        // STAR (short) button: exit function\r
+        if (button.flag.star)\r
+            break;\r
+\r
+        // NUM button: exit function and goto to next value (if available)\r
+        if (button.flag.num)\r
+        {\r
+            if ((mode & SETVALUE_NEXT_VALUE) == SETVALUE_NEXT_VALUE)\r
+                break;\r
+        }\r
+\r
+        // UP button: increase value\r
+        if (button.flag.up)\r
+        {\r
+            // Increase value\r
+            *value = *value + stepValue;\r
+\r
+            // Check value limits\r
+            if (*value > limitHigh)\r
+            {\r
+                // Check if value can roll over, else stick to limit\r
+                if ((mode & SETVALUE_ROLLOVER_VALUE) == SETVALUE_ROLLOVER_VALUE)\r
+                    *value = limitLow;\r
+                else\r
+                    *value = limitHigh;\r
+\r
+                // Reset step size to default\r
+                stepValue = 1;\r
+            }\r
+\r
+            // Trigger display update\r
+            update = 1;\r
+\r
+            // Clear button flag\r
+            button.flag.up = 0;\r
+        }\r
+\r
+        // DOWN button: decrease value\r
+        if (button.flag.down)\r
+        {\r
+            // Decrease value\r
+            *value = *value - stepValue;\r
+\r
+            // Check value limits\r
+            if (*value < limitLow)\r
+            {\r
+                // Check if value can roll over, else stick to limit\r
+                if ((mode & SETVALUE_ROLLOVER_VALUE) == SETVALUE_ROLLOVER_VALUE)\r
+                    *value = limitHigh;\r
+                else\r
+                    *value = limitLow;\r
+\r
+                // Reset step size to default\r
+                stepValue = 1;\r
+            }\r
+\r
+            // Trigger display update\r
+            update = 1;\r
+\r
+            // Clear button flag\r
+            button.flag.down = 0;\r
+        }\r
+\r
+        // When fast mode is enabled, increase step size if Sx button is continuously\r
+        if ((mode & SETVALUE_FAST_MODE) == SETVALUE_FAST_MODE)\r
+        {\r
+            switch (sButton.repeats)\r
+            {\r
+                case 0:\r
+                    stepValue = 1;\r
+                    doRound = 0;\r
+                    break;\r
+                case 10:\r
+                case -10:\r
+                    stepValue = 10;\r
+                    doRound = 1;\r
+                    break;\r
+                case 20:\r
+                case -20:\r
+                    stepValue = 100;\r
+                    doRound = 1;\r
+                    break;\r
+                case 30:\r
+                case -30:\r
+                    stepValue = 1000;\r
+                    doRound = 1;\r
+                    break;\r
+            }\r
+\r
+            // Round value to avoid odd numbers on display\r
+            if (stepValue != 1 && doRound == 1)\r
+            {\r
+                *value -= *value % stepValue;\r
+                doRound = 0;\r
+            }\r
+        }\r
+\r
+        // Update display when there is new data\r
+        if (update)\r
+        {\r
+            // Display up or down arrow according to sign of value\r
+            if ((mode & SETVALUE_DISPLAY_ARROWS) == SETVALUE_DISPLAY_ARROWS)\r
+            {\r
+                if (*value >= 0)\r
+                {\r
+                    display_symbol(LCD_SYMB_ARROW_UP, SEG_ON);\r
+                    display_symbol(LCD_SYMB_ARROW_DOWN, SEG_OFF);\r
+                    val = *value;\r
+                }\r
+                else\r
+                {\r
+                    display_symbol(LCD_SYMB_ARROW_UP, SEG_OFF);\r
+                    display_symbol(LCD_SYMB_ARROW_DOWN, SEG_ON);\r
+                    val = *value * (-1);\r
+                }\r
+            }\r
+            else\r
+            {\r
+                val = *value;\r
+            }\r
+\r
+            // Display function can either display value directly, modify value before displaying\r
+            // or display a string referenced by the value\r
+            fptr_setValue_display_function1(segments, val, digits, blanks);\r
+\r
+            // Clear update flag\r
+            update = 0;\r
+        }\r
+\r
+        // Call idle loop to serve background tasks\r
+        idle_loop();\r
+\r
+    }\r
+\r
+    // Clear up and down arrows\r
+    display_symbol(LCD_SYMB_ARROW_UP, SEG_OFF);\r
+    display_symbol(LCD_SYMB_ARROW_DOWN, SEG_OFF);\r
+\r
+    // Set blinking rate to 1Hz and stop\r
+    set_blink_rate(BIT7 + BIT6 + BIT5);\r
+    clear_blink_mem();\r
+\r
+    // Turn off button repeat function\r
+    button_repeat_off();\r
+}\r
+\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/logic/user.h b/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/logic/user.h
new file mode 100755 (executable)
index 0000000..f48cea4
--- /dev/null
@@ -0,0 +1,59 @@
+// *************************************************************************************************\r
+//\r
+//      Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//        Redistribution and use in source and binary forms, with or without\r
+//        modification, are permitted provided that the following conditions\r
+//        are met:\r
+//\r
+//          Redistributions of source code must retain the above copyright\r
+//          notice, this list of conditions and the following disclaimer.\r
+//\r
+//          Redistributions in binary form must reproduce the above copyright\r
+//          notice, this list of conditions and the following disclaimer in the\r
+//          documentation and/or other materials provided with the\r
+//          distribution.\r
+//\r
+//          Neither the name of Texas Instruments Incorporated nor the names of\r
+//          its contributors may be used to endorse or promote products derived\r
+//          from this software without specific prior written permission.\r
+//\r
+//        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+\r
+#ifndef USER_H_\r
+#define USER_H_\r
+\r
+// *************************************************************************************************\r
+// Defines section\r
+#define SETVALUE_ROLLOVER_VALUE                         BIT0\r
+#define SETVALUE_DISPLAY_VALUE                          BIT1\r
+#define SETVALUE_DISPLAY_ARROWS                         BIT2\r
+#define SETVALUE_DISPLAY_SELECTION                      BIT3\r
+#define SETVALUE_FAST_MODE                                      BIT4\r
+#define SETVALUE_NEXT_VALUE                                     BIT5\r
+\r
+// *************************************************************************************************\r
+// Prototypes section\r
+extern u8 *select_view_style(u8 line, u8 * view1, u8 * view2);\r
+\r
+extern void (*fptr_setValue_display_function1)(u8 segments, u32 value, u8 digits, u8 blanks);\r
+extern void set_value(s32 * value, u8 digits, u8 blanks, s32 limitLow, s32 limitHigh, u16 mode,\r
+                      u8 segments,\r
+                      void (*fptr_setValue_display_function1)(u8 segments, u32 value, u8 digits,\r
+                                                              u8 blanks));\r
+extern void dummy(u8 line);\r
+\r
+#endif                          /*USER_H_ */\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/main.c b/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/main.c
new file mode 100755 (executable)
index 0000000..7c96545
--- /dev/null
@@ -0,0 +1,707 @@
+// *************************************************************************************************\r
+//\r
+//      Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//        Redistribution and use in source and binary forms, with or without\r
+//        modification, are permitted provided that the following conditions\r
+//        are met:\r
+//\r
+//          Redistributions of source code must retain the above copyright\r
+//          notice, this list of conditions and the following disclaimer.\r
+//\r
+//          Redistributions in binary form must reproduce the above copyright\r
+//          notice, this list of conditions and the following disclaimer in the\r
+//          documentation and/or other materials provided with the\r
+//          distribution.\r
+//\r
+//          Neither the name of Texas Instruments Incorporated nor the names of\r
+//          its contributors may be used to endorse or promote products derived\r
+//          from this software without specific prior written permission.\r
+//\r
+//        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+//\r
+//******************************************************************************\r
+//   eZ430-Chronos\r
+//\r
+//   Description: Software for the eZ430-Chronos Datalogger\r
+//\r
+//   P.Francisco\r
+//   Version    1.6\r
+//   Texas Instruments, Inc\r
+//   November 2010\r
+//   Known working builds:\r
+//     IAR Embedded Workbench (Version: 5.10.4)\r
+//     Code Composer Studio (Version  4.2.0.10012)\r
+//******************************************************************************\r
+//Change Log (More detailed information can be found in change_record.txt):\r
+//******************************************************************************\r
+//Version:  1.6\r
+//Comments: Several bugs were fixed.\r
+//          LCD shows "done" after successfully received data\r
+//          rfBSL requires two button presses in order to update watch\r
+//          New method detects a long button press\r
+//          Removed file display1.c. The content is now in display.c\r
+//          Backlight of Chronos stays on for 3 sec after backlight button was pushed.\r
+//\r
+//Version:  1.5\r
+//Comments: Changed XT1 drive level to highest\r
+//          Modified key lock procedure.\r
+//          Negative °C are now converted correctly to Kelvin\r
+//          Enabled fast mode when changing altitude offset\r
+//          Disabled stopwatch stop when watch buttons are locked\r
+//          Added SimpliciTI sources to project. Upgraded to Version 1.1.1.\r
+//          Changed button names from M1/M2/S1/S2/BL to STAR/NUM/UP/DOWN/BACKLIGHT\r
+//\r
+//Version:  1.4\r
+//Comments: Initial Release Version\r
+//**********************************************************************************\r
+\r
+// *************************************************************************************************\r
+// Initialization and control of application.\r
+// *************************************************************************************************\r
+\r
+// *************************************************************************************************\r
+// Include section\r
+\r
+// system\r
+#include "project.h"\r
+#include <string.h>\r
+\r
+// driver\r
+#include "clock.h"\r
+#include "display.h"\r
+#include "vti_as.h"\r
+#include "vti_ps.h"\r
+#include "radio.h"\r
+#include "buzzer.h"\r
+#include "ports.h"\r
+#include "timer.h"\r
+#include "pmm.h"\r
+\r
+// logic\r
+#include "menu.h"\r
+#include "date.h"\r
+#include "battery.h"\r
+#include "temperature.h"\r
+#include "altitude.h"\r
+#include "battery.h"\r
+#include "acceleration.h"\r
+#include "bluerobin.h"\r
+#include "rfsimpliciti.h"\r
+#include "simpliciti.h"\r
+#include "datalog.h"\r
+#include "rfbsl.h"\r
+\r
+// *************************************************************************************************\r
+// Prototypes section\r
+void init_application(void);\r
+void init_global_variables(void);\r
+void wakeup_event(void);\r
+void process_requests(void);\r
+void display_update(void);\r
+void idle_loop(void);\r
+void configure_ports(void);\r
+void read_calibration_values(void);\r
+\r
+// *************************************************************************************************\r
+// Defines section\r
+\r
+// Number of calibration data bytes in INFOA memory\r
+#define CALIBRATION_DATA_LENGTH         (13u)\r
+\r
+// *************************************************************************************************\r
+// Global Variable section\r
+\r
+// Variable holding system internal flags\r
+volatile s_system_flags sys;\r
+\r
+// Variable holding flags set by logic modules\r
+volatile s_request_flags request;\r
+\r
+// Variable holding message flags\r
+volatile s_message_flags message;\r
+\r
+// Global radio frequency offset taken from calibration memory\r
+// Compensates crystal deviation from 26MHz nominal value\r
+u8 rf_frequoffset;\r
+\r
+// Function pointers for LINE1 and LINE2 display function\r
+void (*fptr_lcd_function_line1)(u8 line, u8 update);\r
+void (*fptr_lcd_function_line2)(u8 line, u8 update);\r
+\r
+// *************************************************************************************************\r
+// Extern section\r
+\r
+// *************************************************************************************************\r
+// @fn          main\r
+// @brief       Main routine\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+int main(void)\r
+{\r
+    // Init MCU\r
+    init_application();\r
+\r
+    // Assign initial value to global variables\r
+    init_global_variables();\r
+\r
+    // Main control loop: wait in low power mode until some event needs to be processed\r
+    while (1)\r
+    {\r
+        // When idle go to LPM3\r
+        idle_loop();\r
+\r
+        // Process wake-up events\r
+        if (button.all_flags || sys.all_flags)\r
+            wakeup_event();\r
+\r
+        // Process actions requested by logic modules\r
+        if (request.all_flags)\r
+            process_requests();\r
+\r
+        // Before going to LPM3, update display\r
+        if (display.all_flags)\r
+            display_update();\r
+    }\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          init_application\r
+// @brief       Initialize the microcontroller.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void init_application(void)\r
+{\r
+    volatile unsigned char *ptr;\r
+\r
+    // ---------------------------------------------------------------------\r
+    // Enable watchdog\r
+\r
+    // Watchdog triggers after 16 seconds when not cleared\r
+#ifdef USE_WATCHDOG\r
+    WDTCTL = WDTPW + WDTIS__512K + WDTSSEL__ACLK;\r
+#else\r
+    WDTCTL = WDTPW + WDTHOLD;\r
+#endif\r
+\r
+    // ---------------------------------------------------------------------\r
+    // Configure PMM\r
+    SetVCore(3);\r
+\r
+    // Set global high power request enable\r
+    PMMCTL0_H = 0xA5;\r
+    PMMCTL0_L |= PMMHPMRE;\r
+    PMMCTL0_H = 0x00;\r
+\r
+    // ---------------------------------------------------------------------\r
+    // Enable 32kHz ACLK\r
+    P5SEL |= 0x03;              // Select XIN, XOUT on P5.0 and P5.1\r
+    UCSCTL6 &= ~XT1OFF;         // XT1 On, Highest drive strength\r
+    UCSCTL6 |= XCAP_3;          // Internal load cap\r
+    UCSCTL3 = SELA__XT1CLK;     // Select XT1 as FLL reference\r
+    UCSCTL4 = SELA__XT1CLK | SELS__DCOCLKDIV | SELM__DCOCLKDIV;\r
+\r
+    // ---------------------------------------------------------------------\r
+    // Configure CPU clock for 12MHz\r
+    _BIS_SR(SCG0);              // Disable the FLL control loop\r
+    UCSCTL0 = 0x0000;           // Set lowest possible DCOx, MODx\r
+    UCSCTL1 = DCORSEL_5;        // Select suitable range\r
+    UCSCTL2 = FLLD_1 + 0x16E;   // Set DCO Multiplier\r
+    _BIC_SR(SCG0);              // Enable the FLL control loop\r
+\r
+    // Worst-case settling time for the DCO when the DCO range bits have been\r
+    // changed is n x 32 x 32 x f_MCLK / f_FLL_reference. See UCS chapter in 5xx\r
+    // UG for optimization.\r
+    // 32 x 32 x 12 MHz / 32,768 Hz = 375000 = MCLK cycles for DCO to settle\r
+    __delay_cycles(375000);\r
+\r
+    // Loop until XT1 & DCO stabilizes, use do-while to insure that\r
+    // body is executed at least once\r
+    do\r
+    {\r
+        UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG + XT1HFOFFG + DCOFFG);\r
+        SFRIFG1 &= ~OFIFG;      // Clear fault flags\r
+    }\r
+    while ((SFRIFG1 & OFIFG));\r
+\r
+    // ---------------------------------------------------------------------\r
+    // Configure port mapping\r
+\r
+    // Disable all interrupts\r
+    __disable_interrupt();\r
+    // Get write-access to port mapping registers:\r
+    PMAPPWD = 0x02D52;\r
+    // Allow reconfiguration during runtime:\r
+    PMAPCTL = PMAPRECFG;\r
+\r
+    // P2.7 = TA0CCR1A or TA1CCR0A output (buzzer output)\r
+    ptr = &P2MAP0;\r
+    *(ptr + 7) = PM_TA1CCR0A;\r
+    P2OUT &= ~BIT7;\r
+    P2DIR |= BIT7;\r
+\r
+    // P1.5 = SPI MISO input\r
+    ptr = &P1MAP0;\r
+    *(ptr + 5) = PM_UCA0SOMI;\r
+    // P1.6 = SPI MOSI output\r
+    *(ptr + 6) = PM_UCA0SIMO;\r
+    // P1.7 = SPI CLK output\r
+    *(ptr + 7) = PM_UCA0CLK;\r
+\r
+    // Disable write-access to port mapping registers:\r
+    PMAPPWD = 0;\r
+    // Re-enable all interrupts\r
+    __enable_interrupt();\r
+\r
+    // ---------------------------------------------------------------------\r
+    // Configure ports\r
+\r
+    // ---------------------------------------------------------------------\r
+    // Reset radio core\r
+    radio_reset();\r
+    radio_powerdown();\r
+\r
+    // ---------------------------------------------------------------------\r
+    // Init acceleration sensor\r
+    as_init();\r
+\r
+    // ---------------------------------------------------------------------\r
+    // Init LCD\r
+    lcd_init();\r
+\r
+    // ---------------------------------------------------------------------\r
+    // Init buttons\r
+    init_buttons();\r
+\r
+    // ---------------------------------------------------------------------\r
+    // Configure Timer0 for use by the clock and delay functions\r
+    Timer0_Init();\r
+\r
+    // ---------------------------------------------------------------------\r
+    // Init pressure sensor\r
+    ps_init();\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          init_global_variables\r
+// @brief       Initialize global variables.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void init_global_variables(void)\r
+{\r
+    // --------------------------------------------\r
+    // Apply default settings\r
+\r
+    // set menu pointers to default menu items\r
+    ptrMenu_L1 = &menu_L1_Time;\r
+    ptrMenu_L2 = &menu_L2_DataLog;\r
+\r
+    // Assign LINE1 and LINE2 display functions\r
+    fptr_lcd_function_line1 = ptrMenu_L1->display_function;\r
+    fptr_lcd_function_line2 = ptrMenu_L2->display_function;\r
+\r
+    // Init system flags\r
+    button.all_flags = 0;\r
+    sys.all_flags = 0;\r
+    request.all_flags = 0;\r
+    display.all_flags = 0;\r
+    message.all_flags = 0;\r
+\r
+    // Force full display update when starting up\r
+    display.flag.full_update = 1;\r
+\r
+#ifndef ISM_US\r
+    // Use metric units for display\r
+    sys.flag.use_metric_units = 1;\r
+#endif\r
+\r
+    // Read calibration values from info memory\r
+    read_calibration_values();\r
+\r
+    // Set system time to default value\r
+    reset_clock();\r
+\r
+    // Set date to default value\r
+    reset_date();\r
+\r
+    // Set buzzer to default value\r
+    reset_buzzer();\r
+\r
+    // Reset altitude measurement\r
+    reset_altitude_measurement();\r
+\r
+    // Reset acceleration measurement\r
+    reset_acceleration();\r
+\r
+#ifdef INCLUDE_BLUEROBIN_SUPPORT\r
+    // Reset BlueRobin stack\r
+    reset_bluerobin();\r
+#endif\r
+\r
+    // Reset SimpliciTI stack\r
+    reset_rf();\r
+\r
+    // Reset battery measurement\r
+    reset_batt_measurement();\r
+\r
+    // Reset data logger\r
+    reset_datalog();\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          wakeup_event\r
+// @brief       Process external / internal wakeup events.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void wakeup_event(void)\r
+{\r
+    // Enable idle timeout\r
+    sys.flag.idle_timeout_enabled = 1;\r
+\r
+    // If buttons are locked, only display "buttons are locked" message\r
+    if (button.all_flags && sys.flag.lock_buttons)\r
+    {\r
+        // Show "buttons are locked" message synchronously with next second tick\r
+        if (!(BUTTON_NUM_IS_PRESSED && BUTTON_DOWN_IS_PRESSED))\r
+        {\r
+            message.flag.prepare = 1;\r
+            message.flag.type_locked = 1;\r
+        }\r
+\r
+        // Clear buttons\r
+        button.all_flags = 0;\r
+    }\r
+    // Process long button press event (while button is held)\r
+    else if (button.flag.star_long)\r
+    {\r
+        // Clear button event\r
+        button.flag.star_long = 0;\r
+\r
+        // Call sub menu function\r
+        ptrMenu_L1->mx_function(LINE1);\r
+\r
+        // Set display update flag\r
+        display.flag.full_update = 1;\r
+    }\r
+    else if (button.flag.num_long)\r
+    {\r
+        // Clear button event\r
+        button.flag.num_long = 0;\r
+\r
+        // Call sub menu function\r
+        ptrMenu_L2->mx_function(LINE2);\r
+\r
+        // Set display update flag\r
+        display.flag.full_update = 1;\r
+    }\r
+    // Process single button press event (after button was released)\r
+    else if (button.all_flags)\r
+    {\r
+        // STAR button event ---------------------------------------------------------------------\r
+        // (Short) Advance to next menu item\r
+        if (button.flag.star)\r
+        {\r
+            // Clean up display before activating next menu item\r
+            fptr_lcd_function_line1(LINE1, DISPLAY_LINE_CLEAR);\r
+\r
+            // Go to next menu entry\r
+            ptrMenu_L1 = ptrMenu_L1->next;\r
+\r
+            // Assign new display function\r
+            fptr_lcd_function_line1 = ptrMenu_L1->display_function;\r
+\r
+            // Set Line1 display update flag\r
+            display.flag.line1_full_update = 1;\r
+\r
+            // Clear button flag\r
+            button.flag.star = 0;\r
+        }\r
+        // NUM button event ---------------------------------------------------------------------\r
+        // (Short) Advance to next menu item\r
+        else if (button.flag.num)\r
+        {\r
+            // Clear rfBSL confirmation flag\r
+            rfBSL_button_confirmation = 0;\r
+\r
+            // Clean up display before activating next menu item\r
+            fptr_lcd_function_line2(LINE2, DISPLAY_LINE_CLEAR);\r
+\r
+            // Go to next menu entry\r
+            ptrMenu_L2 = ptrMenu_L2->next;\r
+\r
+            // Assign new display function\r
+            fptr_lcd_function_line2 = ptrMenu_L2->display_function;\r
+\r
+            // Set Line2 display update flag\r
+            display.flag.line2_full_update = 1;\r
+\r
+            // Clear button flag\r
+            button.flag.num = 0;\r
+        }\r
+        // UP button event ---------------------------------------------------------------------\r
+        // Activate user function for Line1 menu item\r
+        else if (button.flag.up)\r
+        {\r
+            // Call direct function\r
+            ptrMenu_L1->sx_function(LINE1);\r
+\r
+            // Set Line1 display update flag\r
+            display.flag.line1_full_update = 1;\r
+\r
+            // Clear button flag\r
+            button.flag.up = 0;\r
+        }\r
+        // DOWN button event ---------------------------------------------------------------------\r
+        // Activate user function for Line2 menu item\r
+        else if (button.flag.down)\r
+        {\r
+            // Call direct function\r
+            ptrMenu_L2->sx_function(LINE2);\r
+\r
+            // Set Line1 display update flag\r
+            display.flag.line2_full_update = 1;\r
+\r
+            // Clear button flag\r
+            button.flag.down = 0;\r
+        }\r
+    }\r
+\r
+    // Process internal events\r
+    if (sys.all_flags)\r
+    {\r
+        // Idle timeout ---------------------------------------------------------------------\r
+        if (sys.flag.idle_timeout)\r
+        {\r
+            // Clear timeout flag\r
+            sys.flag.idle_timeout = 0;\r
+\r
+            // Clear display\r
+            clear_display();\r
+\r
+            // Set display update flags\r
+            display.flag.full_update = 1;\r
+        }\r
+    }\r
+\r
+    // Disable idle timeout\r
+    sys.flag.idle_timeout_enabled = 0;\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          process_requests\r
+// @brief       Process requested actions outside ISR context.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void process_requests(void)\r
+{\r
+    // Do temperature and pressure measurement\r
+    if (request.flag.altitude_measurement)\r
+        do_altitude_measurement(FILTER_ON);\r
+\r
+    // Add data to datalog buffer\r
+    if (request.flag.datalog)\r
+        do_datalog();\r
+\r
+    // Do voltage measurement\r
+    if (request.flag.voltage_measurement)\r
+        battery_measurement();\r
+\r
+    // Reset request flag\r
+    request.all_flags = 0;\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          display_update\r
+// @brief       Process display flags and call LCD update routines.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void display_update(void)\r
+{\r
+    u8 line;\r
+    u8 string[8];\r
+\r
+    // ---------------------------------------------------------------------\r
+    // Call Line1 display function\r
+    if (display.flag.full_update || display.flag.line1_full_update)\r
+    {\r
+        clear_line(LINE1);\r
+        fptr_lcd_function_line1(LINE1, DISPLAY_LINE_UPDATE_FULL);\r
+    }\r
+    else if (ptrMenu_L1->display_update())\r
+    {\r
+        // Update line1 only when new data is available\r
+        fptr_lcd_function_line1(LINE1, DISPLAY_LINE_UPDATE_PARTIAL);\r
+    }\r
+\r
+    // ---------------------------------------------------------------------\r
+    // If message text should be displayed on Line2, skip normal update\r
+    if (message.flag.show)\r
+    {\r
+        // Select message to display\r
+        line = LINE2;\r
+        if (message.flag.type_locked)\r
+            memcpy(string, "  LO?T", 6);\r
+        else if (message.flag.type_unlocked)\r
+            memcpy(string, "  OPEN", 6);\r
+        else if (message.flag.type_lobatt)\r
+            memcpy(string, "LOBATT", 6);\r
+        else if (message.flag.type_nomem)\r
+            memcpy(string, " NOMEM", 6);\r
+        else\r
+        {\r
+            line = LINE1;\r
+            if (message.flag.type_on)\r
+                memcpy(string, "  ON", 4);\r
+            else if (message.flag.type_off)\r
+                memcpy(string, " OFF", 4);\r
+        }\r
+\r
+        // Clear previous content\r
+        clear_line(line);\r
+        fptr_lcd_function_line2(line, DISPLAY_LINE_CLEAR);\r
+\r
+        if (line == LINE2)\r
+            display_chars(LCD_SEG_L2_5_0, string, SEG_ON);\r
+        else\r
+            display_chars(LCD_SEG_L1_3_0, string, SEG_ON);\r
+\r
+        // Next second tick erases message and repaints original screen content\r
+        message.all_flags = 0;\r
+        message.flag.erase = 1;\r
+    }\r
+    // ---------------------------------------------------------------------\r
+    // Call Line2 display function\r
+    else if (display.flag.full_update || display.flag.line2_full_update)\r
+    {\r
+        clear_line(LINE2);\r
+        fptr_lcd_function_line2(LINE2, DISPLAY_LINE_UPDATE_FULL);\r
+    }\r
+    else if (ptrMenu_L2->display_update() && !message.all_flags)\r
+    {\r
+        // Update line2 only when new data is available\r
+        fptr_lcd_function_line2(LINE2, DISPLAY_LINE_UPDATE_PARTIAL);\r
+    }\r
+\r
+    // ---------------------------------------------------------------------\r
+    // Restore blinking icons (blinking memory is cleared when calling set_value)\r
+    if (display.flag.full_update)\r
+    {\r
+        if (is_bluerobin() == BLUEROBIN_CONNECTED)\r
+        {\r
+            // Turn on beeper icon to show activity\r
+            display_symbol(LCD_ICON_BEEPER1, SEG_ON_BLINK_OFF);\r
+            display_symbol(LCD_ICON_BEEPER2, SEG_ON_BLINK_OFF);\r
+            display_symbol(LCD_ICON_BEEPER3, SEG_ON_BLINK_OFF);\r
+        }\r
+    }\r
+\r
+    // Clear display flag\r
+    display.all_flags = 0;\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          to_lpm\r
+// @brief       Go to LPM0/3.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void to_lpm(void)\r
+{\r
+    // Go to LPM3\r
+    _BIS_SR(LPM3_bits + GIE);\r
+    __no_operation();\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          idle_loop\r
+// @brief       Go to LPM. Service watchdog timer when waking up.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void idle_loop(void)\r
+{\r
+    // To low power mode\r
+    to_lpm();\r
+\r
+#ifdef USE_WATCHDOG\r
+    // Service watchdog\r
+    WDTCTL = WDTPW + WDTIS__512K + WDTSSEL__ACLK + WDTCNTCL;\r
+#endif\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          read_calibration_values\r
+// @brief       Read calibration values for temperature measurement, voltage measurement\r
+//                              and radio from INFO memory.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void read_calibration_values(void)\r
+{\r
+    u8 cal_data[CALIBRATION_DATA_LENGTH]; // Temporary storage for constants\r
+    u8 i;\r
+    u8 *flash_mem;                        // Memory pointer\r
+\r
+    // Read calibration data from Info D memory\r
+    flash_mem = (u8 *) 0x1800;\r
+    for (i = 0; i < CALIBRATION_DATA_LENGTH; i++)\r
+    {\r
+        cal_data[i] = *flash_mem++;\r
+    }\r
+\r
+    if (cal_data[0] == 0xFF)\r
+    {\r
+        // If no values are available (i.e. INFO D memory has been erased by user), assign\r
+        // experimentally derived values\r
+        rf_frequoffset = 4;\r
+        sBatt.offset = -10;\r
+        simpliciti_ed_address[0] = 0x79;\r
+        simpliciti_ed_address[1] = 0x56;\r
+        simpliciti_ed_address[2] = 0x34;\r
+        simpliciti_ed_address[3] = 0x12;\r
+        sAlt.altitude_offset = 0;\r
+    }\r
+    else\r
+    {\r
+        // Assign calibration data to global variables\r
+        rf_frequoffset = cal_data[1];\r
+        // Range check for calibrated FREQEST value (-20 .. + 20 is ok, else use default value)\r
+        if ((rf_frequoffset > 20) && (rf_frequoffset < (256 - 20)))\r
+        {\r
+            rf_frequoffset = 0;\r
+        }\r
+        sBatt.offset = (s16) ((cal_data[4] << 8) + cal_data[5]);\r
+        simpliciti_ed_address[0] = cal_data[6];\r
+        simpliciti_ed_address[1] = cal_data[7];\r
+        simpliciti_ed_address[2] = cal_data[8];\r
+        simpliciti_ed_address[3] = cal_data[9];\r
+        // S/W version byte set during calibration?\r
+        if (cal_data[12] != 0xFF)\r
+        {\r
+            sAlt.altitude_offset = (s16) ((cal_data[10] << 8) + cal_data[11]);\r
+        }\r
+        else\r
+        {\r
+            sAlt.altitude_offset = 0;\r
+        }\r
+    }\r
+}\r
+\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/Applications/application/End Device/main_ED_BM.c b/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/Applications/application/End Device/main_ED_BM.c
new file mode 100755 (executable)
index 0000000..3c3a5bb
--- /dev/null
@@ -0,0 +1,261 @@
+/**********************************************************************************************\r
+ * Copyright 2007-2009 Texas Instruments Incorporated. All rights reserved.\r
+ *\r
+ * IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+ * the terms of a software license agreement between the user who downloaded the software,\r
+ * his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+ * "License"). You may not use this Software unless you agree to abide by the terms of the\r
+ * License. The License limits your use, and you acknowledge, that the Software may not be\r
+ * modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+ * or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+ * transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+ * you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+ * perform, display or sell this Software and/or its documentation for any purpose.\r
+ *\r
+ * YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+ * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+ * WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+ * IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+ * NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+ * THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+ * INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+ * DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+ * THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+ *\r
+ * Should you have any questions regarding your right to use this Software,\r
+ * contact Texas Instruments Incorporated at www.TI.com.\r
+ **************************************************************************************************/\r
+\r
+// *************************************************************************************************\r
+// Include section\r
+#include "bsp.h"\r
+#include "mrfi.h"\r
+#include "nwk_types.h"\r
+#include "nwk_api.h"\r
+#include "bsp_leds.h"\r
+#include "bsp_buttons.h"\r
+#include "simpliciti.h"\r
+\r
+\r
+// *************************************************************************************************\r
+// Defines section\r
+#define TIMEOUT                                 (10u)\r
+\r
+// Conversion from msec to ACLK timer ticks\r
+#define CONV_MS_TO_TICKS(msec)                          (((msec) * 32768) / 1000)\r
+\r
+// U16\r
+typedef unsigned short u16;\r
+\r
+// *************************************************************************************************\r
+// Prototypes section\r
+\r
+\r
+// *************************************************************************************************\r
+// Extern section\r
+extern uint8_t sInit_done;\r
+\r
+// SimpliciTI has no low power delay function, so we have to use ours\r
+extern void Timer0_A4_Delay(u16 ticks);\r
+\r
+\r
+// *************************************************************************************************\r
+// Global Variable section\r
+static linkID_t sLinkID1;\r
+\r
+\r
+\r
+// *************************************************************************************************\r
+// @fn          simpliciti_link\r
+// @brief       Init hardware and try to link to access point.\r
+// @param       none\r
+// @return      unsigned char          0 = Could not link, timeout or external cancel.\r
+//                                                                     1 = Linked successful.\r
+// *************************************************************************************************\r
+unsigned char simpliciti_link(void)\r
+{\r
+    uint8_t timeout;\r
+    addr_t lAddr;\r
+    uint8_t i;\r
+    uint8_t pwr;\r
+\r
+    // Configure timer\r
+    BSP_InitBoard();\r
+\r
+    // Change network address to value set in calling function\r
+    for (i = 0; i < NET_ADDR_SIZE; i++)\r
+    {\r
+        lAddr.addr[i] = simpliciti_ed_address[i];\r
+    }\r
+    SMPL_Ioctl(IOCTL_OBJ_ADDR, IOCTL_ACT_SET, &lAddr);\r
+\r
+    // Set flag\r
+    simpliciti_flag = SIMPLICITI_STATUS_LINKING;\r
+\r
+    /* Keep trying to join (a side effect of successful initialization) until\r
+     * successful. Toggle LEDS to indicate that joining has not occurred.\r
+     */\r
+    timeout = 0;\r
+    while (SMPL_SUCCESS != SMPL_Init(0))\r
+    {\r
+        NWK_DELAY(1000);\r
+\r
+        // Service watchdog\r
+        WDTCTL = WDTPW + WDTIS__512K + WDTSSEL__ACLK + WDTCNTCL;\r
+\r
+        // Stop connecting after defined numbers of seconds (15)\r
+        if (timeout++ > TIMEOUT)\r
+        {\r
+            // Clean up SimpliciTI stack to enable restarting\r
+            sInit_done = 0;\r
+            simpliciti_flag = SIMPLICITI_STATUS_ERROR;\r
+            return (0);\r
+        }\r
+\r
+        // Break when flag bit SIMPLICITI_TRIGGER_STOP is set\r
+        if (getFlag(simpliciti_flag, SIMPLICITI_TRIGGER_STOP))\r
+        {\r
+            // Clean up SimpliciTI stack to enable restarting\r
+            sInit_done = 0;\r
+            return (0);\r
+        }\r
+    }\r
+\r
+    // Set output power to +3.3dmB\r
+    pwr = IOCTL_LEVEL_2;\r
+    SMPL_Ioctl(IOCTL_OBJ_RADIO, IOCTL_ACT_RADIO_SETPWR, &pwr);\r
+\r
+    /* Unconditional link to AP which is listening due to successful join. */\r
+    timeout = 0;\r
+    while (SMPL_SUCCESS != SMPL_Link(&sLinkID1))\r
+    {\r
+        NWK_DELAY(1000);\r
+\r
+        // Service watchdog\r
+        WDTCTL = WDTPW + WDTIS__512K + WDTSSEL__ACLK + WDTCNTCL;\r
+\r
+        // Stop linking after timeout\r
+        if (timeout++ > TIMEOUT)\r
+        {\r
+            // Clean up SimpliciTI stack to enable restarting\r
+            sInit_done = 0;\r
+            simpliciti_flag = SIMPLICITI_STATUS_ERROR;\r
+            return (0);\r
+        }\r
+\r
+        // Exit when flag bit SIMPLICITI_TRIGGER_STOP is set\r
+        if (getFlag(simpliciti_flag, SIMPLICITI_TRIGGER_STOP))\r
+        {\r
+            // Clean up SimpliciTI stack to enable restarting\r
+            sInit_done = 0;\r
+            return (0);\r
+        }\r
+    }\r
+    simpliciti_flag = SIMPLICITI_STATUS_LINKED;\r
+\r
+    return (1);\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          simpliciti_main_tx_only\r
+// @brief       Get data through callback. Transfer data when external trigger is set.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void simpliciti_main_tx_only(void)\r
+{\r
+    while (1)\r
+    {\r
+        // Get end device data from callback function\r
+        simpliciti_get_ed_data_callback();\r
+\r
+        // Send data when flag bit SIMPLICITI_TRIGGER_SEND_DATA is set\r
+        if (getFlag(simpliciti_flag, SIMPLICITI_TRIGGER_SEND_DATA))\r
+        {\r
+            // Get radio ready. Wakes up in IDLE state.\r
+            SMPL_Ioctl(IOCTL_OBJ_RADIO, IOCTL_ACT_RADIO_AWAKE, 0);\r
+\r
+            // Acceleration / button events packets are 4 bytes long\r
+            SMPL_SendOpt(sLinkID1, simpliciti_data, 4, SMPL_TXOPTION_NONE);\r
+\r
+            // Put radio back to SLEEP state\r
+            SMPL_Ioctl(IOCTL_OBJ_RADIO, IOCTL_ACT_RADIO_SLEEP, 0);\r
+\r
+            clearFlag(simpliciti_flag, SIMPLICITI_TRIGGER_SEND_DATA);\r
+        }\r
+\r
+        // Exit when flag bit SIMPLICITI_TRIGGER_STOP is set\r
+        if (getFlag(simpliciti_flag, SIMPLICITI_TRIGGER_STOP))\r
+        {\r
+            // Clean up SimpliciTI stack to enable restarting\r
+            sInit_done = 0;\r
+            break;\r
+        }\r
+    }\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          simpliciti_main_sync\r
+// @brief       Send ready-to-receive packets in regular intervals. Listen shortly for host reply.\r
+//                             Decode received host command and trigger action.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void simpliciti_main_sync(void)\r
+{\r
+    uint8_t len, i;\r
+    uint8_t ed_data[2];\r
+\r
+    while (1)\r
+    {\r
+        // Sleep 0.5sec between ready-to-receive packets\r
+        // SimpliciTI has no low power delay function, so we have to use ours\r
+        Timer0_A4_Delay(CONV_MS_TO_TICKS(500));\r
+\r
+        // Get radio ready. Radio wakes up in IDLE state.\r
+        SMPL_Ioctl(IOCTL_OBJ_RADIO, IOCTL_ACT_RADIO_AWAKE, 0);\r
+\r
+        // Send 2 byte long ready-to-receive packet to stimulate host reply\r
+        ed_data[0] = SYNC_ED_TYPE_R2R;\r
+        ed_data[1] = 0xCB;\r
+        SMPL_SendOpt(sLinkID1, ed_data, 2, SMPL_TXOPTION_NONE);\r
+\r
+        // Wait shortly for host reply\r
+        SMPL_Ioctl(IOCTL_OBJ_RADIO, IOCTL_ACT_RADIO_RXON, 0);\r
+        NWK_DELAY(10);\r
+\r
+        // Check if a command packet was received\r
+        while (SMPL_Receive(sLinkID1, simpliciti_data, &len) == SMPL_SUCCESS)\r
+        {\r
+            // Decode received data\r
+            if (len > 0)\r
+            {\r
+                // Use callback function in application to decode data and react\r
+                simpliciti_sync_decode_ap_cmd_callback();\r
+\r
+                // Get reply data and send out reply packet burst (19 bytes each)\r
+                for (i = 0; i < simpliciti_reply_count; i++)\r
+                {\r
+                    NWK_DELAY(10);\r
+                    simpliciti_sync_get_data_callback(i);\r
+                    SMPL_SendOpt(sLinkID1, simpliciti_data, BM_SYNC_DATA_LENGTH, SMPL_TXOPTION_NONE);\r
+                }\r
+            }\r
+        }\r
+\r
+        // Put radio back to sleep\r
+        SMPL_Ioctl(IOCTL_OBJ_RADIO, IOCTL_ACT_RADIO_SLEEP, 0);\r
+\r
+        // Service watchdog\r
+        WDTCTL = WDTPW + WDTIS__512K + WDTSSEL__ACLK + WDTCNTCL;\r
+\r
+        // Exit when flag bit SIMPLICITI_TRIGGER_STOP is set\r
+        if (getFlag(simpliciti_flag, SIMPLICITI_TRIGGER_STOP))\r
+        {\r
+            // Clean up SimpliciTI stack to enable restarting\r
+            sInit_done = 0;\r
+            break;\r
+        }\r
+    }\r
+}\r
+\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/Applications/configuration/End Device/smpl_config.dat b/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/Applications/configuration/End Device/smpl_config.dat
new file mode 100755 (executable)
index 0000000..59bfa8a
--- /dev/null
@@ -0,0 +1,72 @@
+#\r
+#  Filename:       smpl_config.dat\r
+#  Revised:        $Date: 2008-11-18 16:54:54 -0800 (Tue, 18 Nov 2008) $\r
+#  Revision:       $Revision: 18453 $\r
+#  Author:         $Author: lfriedman $\r
+#\r
+#  Description:    This file supports the SimpliciTI Customer Configuration for End Devices.\r
+#\r
+#  Copyright 2008-2009 Texas Instruments Incorporated. All rights reserved.\r
+#\r
+#  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+#  the terms of a software license agreement between the user who downloaded the software,\r
+#  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+#  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+#  License. The License limits your use, and you acknowledge, that the Software may not be\r
+#  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+#  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+#  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+#  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+#  perform, display or sell this Software and/or its documentation for any purpose.\r
+#\r
+#  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+#  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+#  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+#  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+#  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+#  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+#  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+#  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+#  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+#\r
+#  Should you have any questions regarding your right to use this Software,\r
+#  contact Texas Instruments Incorporated at www.TI.com.\r
+\r
+\r
+# Number of connections supported. Each connection supports bi-directional\r
+# communication.  Access Points and Range Extenders can set this to 0 if they\r
+# do not host End Device objects.\r
+#--define=NUM_CONNECTIONS=2\r
+# [BM] Only allow 1 connection to RF access point\r
+--define=NUM_CONNECTIONS=1\r
+\r
+# Size of low level queues for sent and received frames. Affects RAM usage\r
+\r
+# AP needs larger input frame queue if it is supporting store-and-forward\r
+# clients because the forwarded messages are held here.\r
+--define=SIZE_INFRAME_Q=2\r
+\r
+# The output frame queue can be small since Tx is done synchronously. Actually\r
+# 1 is probably enough. If an Access Point device is also hosting an End Device \r
+# that sends to a sleeping peer the output queue should be larger -- the waiting \r
+# frames in this case are held here. In that case the output frame queue should \r
+# be bigger.\r
+--define=SIZE_OUTFRAME_Q=2\r
+\r
+# This device's address. The first byte is used as a filter on the CC1100/CC2500\r
+# radios so THE FIRST BYTE MUST NOT BE either 0x00 or 0xFF. Also, for these radios\r
+# on End Devices the first byte should be the least significant byte so the filtering\r
+# is maximally effective. Otherwise the frame has to be processed by the MCU before it\r
+# is recognized as not intended for the device. APs and REs run in promiscuous mode so\r
+# the filtering is not done. This macro intializes a static const array of unsigned\r
+# characters of length NET_ADDR_SIZE (found in nwk_types.h). The quotes (") are\r
+# necessary below unless the spaces are removed.\r
+--define=THIS_DEVICE_ADDRESS="{0x79, 0x56, 0x34, 0x12}"\r
+\r
+--define=END_DEVICE\r
+\r
+# For polling End Devices we need to specify that they do so. Uncomment the \r
+# macro definition below if this is a polling device. This field is used \r
+# by the Access Point to know whether to reserve store-and-forward support \r
+# for the polling End Device during the Join exchange.\r
+# --define=RX_POLLS\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/Applications/configuration/smpl_nwk_config.dat b/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/Applications/configuration/smpl_nwk_config.dat
new file mode 100755 (executable)
index 0000000..d14b792
--- /dev/null
@@ -0,0 +1,77 @@
+#\r
+#  Filename:       smpl_nwk_config.dat\r
+#  Revised:        $Date: 2009-02-07 14:21:07 -0700 (Sat, 07 Feb 2009) $\r
+#  Revision:       $Revision: 19010 $\r
+#  Author:         $Author: lfriedman $\r
+#\r
+#  Description:    This file supports the SimpliciTI Customer Configuration for overall network.\r
+#\r
+#  Copyright 2009 Texas Instruments Incorporated. All rights reserved.\r
+#\r
+#  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+#  the terms of a software license agreement between the user who downloaded the software,\r
+#  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+#  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+#  License. The License limits your use, and you acknowledge, that the Software may not be\r
+#  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+#  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+#  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+#  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+#  perform, display or sell this Software and/or its documentation for any purpose.\r
+#\r
+#  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+#  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+#  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+#  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+#  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+#  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+#  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+#  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+#  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+#\r
+#  Should you have any questions regarding your right to use this Software,\r
+#  contact Texas Instruments Incorporated at www.TI.com.\r
+\r
+\r
+# Max hop count\r
+--define=MAX_HOPS=3\r
+\r
+# Max hops away from and AP. Keeps hop count and therefore replay\r
+# storms down for sending to and from polling End Devices. Also used\r
+# when joining since the EDs can't be more than 1 hop away.\r
+--define=MAX_HOPS_FROM_AP=1\r
+\r
+# Maximum size of Network application payload. Do not change unless\r
+# protocol changes are reflected in different maximum network\r
+# application payload size.\r
+--define=MAX_NWK_PAYLOAD=9\r
+\r
+# Maximum size of application payload\r
+#--define=MAX_APP_PAYLOAD=10\r
+# [BM] Need to increase max payload for sync application\r
+--define=MAX_APP_PAYLOAD=19\r
+\r
+# Default Link token\r
+--define=DEFAULT_LINK_TOKEN=0x01020304\r
+\r
+# Default Join token\r
+--define=DEFAULT_JOIN_TOKEN=0x05060708\r
+\r
+# Define Frequency Agility as active for this build\r
+# [BM] No need for frequency hopping\r
+#--define=FREQUENCY_AGILITY\r
+\r
+# Enable application autoacknowledge support. Requires extended API as well\r
+--define=APP_AUTO_ACK\r
+\r
+# Enable Extended API\r
+--define=EXTENDED_API\r
+\r
+# Remove '#' corruption to enable security. \r
+#--define=SMPL_SECURE\r
+\r
+# Remove '#' to enable NV object support\r
+#--define=NVOBJECT_SUPPORT\r
+\r
+# Insert '#' to disable software timer\r
+--define=SW_TIMER\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/CC430_End_Device_433MHz.lib b/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/CC430_End_Device_433MHz.lib
new file mode 100755 (executable)
index 0000000..39953df
Binary files /dev/null and b/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/CC430_End_Device_433MHz.lib differ
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/CC430_End_Device_868MHz.lib b/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/CC430_End_Device_868MHz.lib
new file mode 100755 (executable)
index 0000000..dd55c0e
Binary files /dev/null and b/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/CC430_End_Device_868MHz.lib differ
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/CC430_End_Device_915MHz.lib b/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/CC430_End_Device_915MHz.lib
new file mode 100755 (executable)
index 0000000..9363600
Binary files /dev/null and b/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/CC430_End_Device_915MHz.lib differ
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/Components/bsp/boards/CC430EM/bsp_board.c b/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/Components/bsp/boards/CC430EM/bsp_board.c
new file mode 100755 (executable)
index 0000000..27f627b
--- /dev/null
@@ -0,0 +1,309 @@
+/**************************************************************************************************\r
+*  Filename:       bsp_board.c\r
+*  Revised:        $Date: 2009-10-11 16:48:20 -0700 (Sun, 11 Oct 2009) $\r
+*  Revision:       $Revision: 20896 $\r
+*\r
+*  Copyright 2008-2009 Texas Instruments Incorporated.  All rights reserved.\r
+*\r
+*  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+*  the terms of a software license agreement between the user who downloaded the software,\r
+*  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+*  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+*  License. The License limits your use, and you acknowledge, that the Software may not be\r
+*  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+*  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+*  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+*  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+*  perform, display or sell this Software and/or its documentation for any purpose.\r
+*\r
+*  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+*  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+*  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+*  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+*  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+*  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+*  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+*  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+*  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+*\r
+*  Should you have any questions regarding your right to use this Software,\r
+*  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+/* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+ *   BSP (Board Support Package)\r
+ *   Target : Texas Instruments CC430EM\r
+ *   Top-level board code file.\r
+ * =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+ */\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                            Includes\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#include "bsp.h"\r
+#include "bsp_config.h"\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                            Prototypes\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+static void SetVCore(uint8_t level);\r
+static void SetVCoreUp(uint8_t level);\r
+static void SetVCoreDown(uint8_t level);\r
+static void Bsp_SetVCore(void);\r
+static void Bsp_SetClocks(void);\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                            Defines\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#define BSP_TIMER_CLK_MHZ   12                                       /* 12 MHz MCLKC and SMCLK */\r
+#define BSP_DELAY_MAX_USEC  (0xFFFF / BSP_TIMER_CLK_MHZ)\r
+\r
+/**************************************************************************************************\r
+ * @fn          SetVCore\r
+ *\r
+ * @brief       SetVCore level is called from the user API. Change level by one step only.\r
+ *\r
+ * @param       level - VcCore level\r
+ *\r
+ * @return      none\r
+ **************************************************************************************************\r
+ */\r
+\r
+static void SetVCore(uint8_t level)\r
+{\r
+    uint8_t actLevel;\r
+\r
+    do {\r
+        actLevel = PMMCTL0_L & PMMCOREV_3;\r
+        if (actLevel < level)\r
+            SetVCoreUp(++actLevel);                                  /* Set VCore (step by step) */\r
+        if (actLevel > level)\r
+            SetVCoreDown(--actLevel);                                /* Set VCore (step by step) */\r
+    } while (actLevel != level);\r
+}\r
+\r
+/**************************************************************************************************\r
+ * @fn          SetVCoreUp\r
+ *\r
+ * @brief       Set VCore up. Change level by one step only.\r
+ *\r
+ * @param       level - VcCore level\r
+ *\r
+ * @return      none\r
+ *************************************************************************************************\r
+ */\r
+\r
+static void SetVCoreUp(uint8_t level)\r
+{\r
+    PMMCTL0_H = 0xA5;                                                /* Open PMM module registers\r
+                                                                      *for write access */\r
+\r
+    SVSMHCTL = SVSHE + SVSHRVL0 * level + SVMHE + SVSMHRRL0 * level; /* Set SVS/M high side to new\r
+                                                                      *level */\r
+\r
+    SVSMLCTL = SVSLE + SVMLE + SVSMLRRL0 * level;                    /* Set SVM new Level */\r
+    while ((PMMIFG & SVSMLDLYIFG) == 0) ;                            /* Wait till SVM is settled\r
+                                                                      *(Delay) */\r
+    PMMCTL0_L = PMMCOREV0 * level;                                   /* Set VCore to x */\r
+    PMMIFG &= ~(SVMLVLRIFG + SVMLIFG);                               /* Clear already set flags */\r
+    if ((PMMIFG & SVMLIFG))\r
+        while ((PMMIFG & SVMLVLRIFG) == 0) ;                         /* Wait till level is reached\r
+                                                                      **/\r
+\r
+    SVSMLCTL = SVSLE + SVSLRVL0 * level + SVMLE + SVSMLRRL0 * level; /* Set SVS/M Low side to new\r
+                                                                      *level */\r
+    PMMCTL0_H = 0x00;                                                /* Lock PMM module registers\r
+                                                                      *for write access */\r
+}\r
+\r
+/**************************************************************************************************\r
+ * @fn          SetVCoreDown\r
+ *\r
+ * @brief       Set VCore down\r
+ *\r
+ * @param       level - VcCore level\r
+ *\r
+ * @return      none\r
+ **************************************************************************************************\r
+ */\r
+\r
+static void SetVCoreDown(uint8_t level)\r
+{\r
+    PMMCTL0_H = 0xA5;                                                /* Open PMM module registers\r
+                                                                      *for write access */\r
+    SVSMLCTL = SVSLE + SVSLRVL0 * level + SVMLE + SVSMLRRL0 * level; /* Set SVS/M Low side to new\r
+                                                                      *level */\r
+    while ((PMMIFG & SVSMLDLYIFG) == 0) ;                            /* Wait till SVM is settled\r
+                                                                      *(Delay) */\r
+    PMMCTL0_L = (level * PMMCOREV0);                                 /* Set VCore to 1.85 V for Max\r
+                                                                      *Speed. */\r
+    PMMCTL0_H = 0x00;                                                /* Lock PMM module registers\r
+                                                                      *for write access */\r
+}\r
+\r
+/**************************************************************************************************\r
+ * @fn          Bsp_SetVCore\r
+ *\r
+ * @brief       Setup the core voltage.\r
+ *\r
+ * @param       none\r
+ *\r
+ * @return      none\r
+ **************************************************************************************************\r
+ */\r
+\r
+static void Bsp_SetVCore(void)\r
+{\r
+    SetVCore(3);\r
+}\r
+\r
+/**************************************************************************************************\r
+ * @fn          Bsp_SetClocks\r
+ *\r
+ * @brief       Set up system clocks.\r
+ *\r
+ * @param       none\r
+ *\r
+ * @return      none\r
+ **************************************************************************************************\r
+ */\r
+\r
+static void Bsp_SetClocks(void)\r
+{\r
+    /* Configure CPU clock for 12MHz */\r
+\r
+    /* If clock settings are changed, remember to update BSP_TIMER_CLK_MHZ.\r
+     * Otherwise, all timer settings would be incorrect.\r
+     */\r
+    UCSCTL3 |= SELREF_2;                    /* Set DCO FLL reference = REFO */\r
+    UCSCTL4 |= SELA_2;                      /* Set ACLK = REFO */\r
+\r
+    __bis_SR_register(SCG0);                /* Disable the FLL control loop */\r
+    UCSCTL0 = 0x0000;                       /* Set lowest possible DCOx, MODx */\r
+    UCSCTL1 = DCORSEL_5;                    /* Select DCO range 24MHz operation */\r
+    UCSCTL2 = FLLD_1 + 374;                 /* Set DCO Multiplier for 12MHz\r
+                                             * (N + 1) * FLLRef = Fdco\r
+                                             * (374 + 1) * 32768 = 12MHz\r
+                                             * Set FLL Div = fDCOCLK/2 */\r
+    __bic_SR_register(SCG0);                /* Enable the FLL control loop */\r
+\r
+    /* Worst-case settling time for the DCO when the DCO range bits have been\r
+     * changed is n x 32 x 32 x f_MCLK / f_FLL_reference.\r
+     * 32 x 32 x 12 MHz / 32,768 Hz = 375000 = MCLK cycles for DCO to settle\r
+     */\r
+    __delay_cycles(375000);\r
+\r
+    /* Loop until XT1,XT2 & DCO fault flag is cleared */\r
+    do\r
+    {\r
+        UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG + DCOFFG);\r
+        /* Clear XT2,XT1,DCO fault flags */\r
+        SFRIFG1 &= ~OFIFG;                  /* Clear fault flags */\r
+    } while (SFRIFG1 & OFIFG);              /* Test oscillator fault flag */\r
+\r
+    /* Select REFO as ACLK source and DCOCLK as MCLK and SMCLK source */\r
+    UCSCTL4 = SELA__REFOCLK | SELS__DCOCLKDIV | SELM__DCOCLKDIV;\r
+}\r
+\r
+/**************************************************************************************************\r
+ * @fn          BSP_EARLY_INIT\r
+ *\r
+ * @brief       This function is called by start-up code before doing the normal initialization\r
+ *              of data segments. If the return value is zero, initialization is not performed.\r
+ *              The global macro label "BSP_EARLY_INIT" gets #defined in the bsp_msp430_defs.h\r
+ *              file, according to the specific compiler environment (CCE or IAR). In the CCE\r
+ *              environment this macro invokes "_system_pre_init()" and in the IAR environment\r
+ *              this macro invokes "__low_level_init()".\r
+ *\r
+ * @param       None\r
+ *\r
+ * @return      0 - don't intialize data segments / 1 - do initialization\r
+ *************************************************************************************************\r
+ */\r
+BSP_EARLY_INIT(void)\r
+{\r
+    /* Disable watchdog timer */\r
+    WDTCTL = WDTPW | WDTHOLD;\r
+\r
+    /* Setup Vcore */\r
+    Bsp_SetVCore();\r
+\r
+    /* Configure System clocks */\r
+    Bsp_SetClocks();\r
+\r
+    /* Return 1 - run seg_init */\r
+    return (1);\r
+}\r
+\r
+/**************************************************************************************************\r
+ * @fn          BSP_InitBoard\r
+ *\r
+ * @brief       Initialize the board.\r
+ *\r
+ * @param       none\r
+ *\r
+ * @return      none\r
+ **************************************************************************************************\r
+ */\r
+\r
+void BSP_InitBoard(void)\r
+{\r
+    /* Configure TimerA for use by the delay function */\r
+\r
+    /* Reset the timer */\r
+    //TA0CTL |= TACLR; /* Set the TACLR  */\r
+\r
+    /* Clear all settings */\r
+    //TA0CTL = 0x0;\r
+\r
+    /* Select the clk source to be - SMCLK (Sub-Main CLK)*/\r
+    //TA0CTL |= TASSEL_2;\r
+\r
+    // [BM] We need to use TA1 for delay function, because TA0 is already occupied\r
+    TA1CTL |= TACLR; /* Set the TACLR  */\r
+    TA1CTL = 0x0;\r
+    TA1CTL |= TASSEL_2;\r
+}\r
+\r
+/**************************************************************************************************\r
+ * @fn          BSP_Delay\r
+ *\r
+ * @brief       Delay for the requested amount of time.\r
+ *\r
+ * @param       # of microseconds to delay.\r
+ *\r
+ * @return      none\r
+ **************************************************************************************************\r
+ */\r
+\r
+void BSP_Delay(uint16_t usec)\r
+{\r
+    BSP_ASSERT(usec < BSP_DELAY_MAX_USEC);\r
+\r
+    //TA0R = 0; /* initial count  */\r
+    //TA0CCR0 = BSP_TIMER_CLK_MHZ*usec; /* compare count. (delay in ticks) */\r
+\r
+    /* Start the timer in UP mode */\r
+    //TA0CTL |= MC_1;\r
+\r
+    /* Loop till compare interrupt flag is set */\r
+    //while(!(TA0CCTL0 & CCIFG));\r
+\r
+    /* Stop the timer */\r
+    //TA0CTL &= ~(MC_1);\r
+\r
+    /* Clear the interrupt flag */\r
+    //TA0CCTL0 &= ~CCIFG;\r
+\r
+    // [BM] We need to use TA1 for delay function, because TA0 is already occupied\r
+    TA1R = 0;\r
+    TA1CCR0 = BSP_TIMER_CLK_MHZ * usec;\r
+    TA1CTL |= MC_1;\r
+    while (!(TA1CCTL0 & CCIFG)) ;\r
+    TA1CTL &= ~(MC_1);\r
+    TA1CCTL0 &= ~CCIFG;\r
+}\r
+\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/Components/bsp/boards/CC430EM/bsp_board_defs.h b/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/Components/bsp/boards/CC430EM/bsp_board_defs.h
new file mode 100755 (executable)
index 0000000..ed67c36
--- /dev/null
@@ -0,0 +1,83 @@
+/**************************************************************************************************\r
+*  Revised:        $Date: 2007-07-06 11:19:00 -0700 (Fri, 06 Jul 2007) $\r
+*  Revision:       $Revision: 13579 $\r
+*\r
+*  Copyright 2007 Texas Instruments Incorporated.  All rights reserved.\r
+*\r
+*  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+*  the terms of a software license agreement between the user who downloaded the software,\r
+*  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+*  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+*  License. The License limits your use, and you acknowledge, that the Software may not be\r
+*  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+*  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+*  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+*  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+*  perform, display or sell this Software and/or its documentation for any purpose.\r
+*\r
+*  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+*  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+*  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+*  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+*  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+*  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+*  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+*  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+*  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+*\r
+*  Should you have any questions regarding your right to use this Software,\r
+*  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+/* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+ *   BSP (Board Support Package)\r
+ *   Target : Texas Instruments CC430EM\r
+ *   Board definition file.\r
+ * =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+ */\r
+\r
+#ifndef BSP_BOARD_DEFS_H\r
+#define BSP_BOARD_DEFS_H\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                     Board Unique Define\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#define BSP_BOARD_CC430EM\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                           Mcu\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#include "mcus/bsp_msp430_defs.h"\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                          Clock\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#include "bsp_config.h"\r
+#define __bsp_CLOCK_MHZ__         BSP_CONFIG_CLOCK_MHZ\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                     Board Initialization\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#define BSP_BOARD_C               "bsp_board.c"\r
+#define BSP_INIT_BOARD()          BSP_InitBoard()\r
+#define BSP_DELAY_USECS(x)        BSP_Delay(x)\r
+\r
+void BSP_InitBoard(void);\r
+void BSP_Delay(uint16_t usec);\r
+\r
+/* ************************************************************************************************\r
+ *                                   Compile Time Integrity Checks\r
+ * ************************************************************************************************\r
+ */\r
+\r
+/**************************************************************************************************\r
+ */\r
+#endif\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/Components/bsp/boards/CC430EM/bsp_button_defs.h b/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/Components/bsp/boards/CC430EM/bsp_button_defs.h
new file mode 100755 (executable)
index 0000000..beac8c7
--- /dev/null
@@ -0,0 +1,92 @@
+/**************************************************************************************************\r
+*  Revised:        $Date: 2007-07-06 11:19:00 -0700 (Fri, 06 Jul 2007) $\r
+*  Revision:       $Revision: 13579 $\r
+*\r
+*  Copyright 2007 Texas Instruments Incorporated.  All rights reserved.\r
+*\r
+*  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+*  the terms of a software license agreement between the user who downloaded the software,\r
+*  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+*  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+*  License. The License limits your use, and you acknowledge, that the Software may not be\r
+*  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+*  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+*  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+*  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+*  perform, display or sell this Software and/or its documentation for any purpose.\r
+*\r
+*  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+*  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+*  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+*  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+*  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+*  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+*  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+*  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+*  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+*\r
+*  Should you have any questions regarding your right to use this Software,\r
+*  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+/* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+ *   BSP (Board Support Package)\r
+ *   Target : Texas Instruments CC430EM\r
+ *   Button definition file.\r
+ * =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+ */\r
+\r
+#ifndef BSP_BUTTON_DEFS_H\r
+#define BSP_BUTTON_DEFS_H\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                           Includes\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#include "bsp_board_defs.h"\r
+#include "bsp_macros.h"\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                      Button Configuration\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#define __bsp_NUM_BUTTONS__                   1\r
+#define __bsp_BUTTON_DEBOUNCE_WAIT__(expr)    st( \\r
+        int i; for (i = 0; i < 500; i++){ if (!(expr)) i = 0; })\r
+\r
+\r
+/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+ *                 BUTTON #1\r
+ * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+ *   Schematic   :  S2\r
+ *   Description :  Push Button\r
+ *   Polarity    :  Active Low\r
+ *   GPIO        :  P1.7\r
+ * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+ */\r
+#define __bsp_BUTTON1_BIT__             7\r
+#define __bsp_BUTTON1_PORT__            P1IN\r
+#define __bsp_BUTTON1_IS_ACTIVE_LOW__   1\r
+\r
+\r
+/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+ *          Extended Configuration\r
+ * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+ */\r
+/* Enable the internal PullUp for button #1. */\r
+#define __bsp_BUTTON_EXTENDED_CONFIG__() st(P1OUT |= BV(__bsp_BUTTON1_BIT__);   /* PullUp */ \\r
+                                            P1REN |= BV(__bsp_BUTTON1_BIT__); ) /* Enable PullUp */\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                Include Generic Button Macros\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#include "code/bsp_generic_buttons.h"\r
+\r
+\r
+/**************************************************************************************************\r
+ */\r
+#endif\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/Components/bsp/boards/CC430EM/bsp_config.h b/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/Components/bsp/boards/CC430EM/bsp_config.h
new file mode 100755 (executable)
index 0000000..fd29193
--- /dev/null
@@ -0,0 +1,47 @@
+/**************************************************************************************************\r
+*  Revised:        $Date: 2007-07-06 11:19:00 -0700 (Fri, 06 Jul 2007) $\r
+*  Revision:       $Revision: 13579 $\r
+*\r
+*  Copyright 2007 Texas Instruments Incorporated.  All rights reserved.\r
+*\r
+*  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+*  the terms of a software license agreement between the user who downloaded the software,\r
+*  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+*  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+*  License. The License limits your use, and you acknowledge, that the Software may not be\r
+*  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+*  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+*  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+*  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+*  perform, display or sell this Software and/or its documentation for any purpose.\r
+*\r
+*  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+*  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+*  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+*  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+*  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+*  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+*  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+*  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+*  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+*\r
+*  Should you have any questions regarding your right to use this Software,\r
+*  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+/* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+ *   BSP (Board Support Package)\r
+ *   Target : Texas Instruments CC430EM\r
+ *   Board configuration file.\r
+ * =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+ */\r
+\r
+#ifndef BSP_CONFIG_H\r
+#define BSP_CONFIG_H\r
+\r
+\r
+/* Nothing needed for this platform. */\r
+\r
+/**************************************************************************************************\r
+ */\r
+#endif\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/Components/bsp/boards/CC430EM/bsp_driver_defs.h b/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/Components/bsp/boards/CC430EM/bsp_driver_defs.h
new file mode 100755 (executable)
index 0000000..2dc5732
--- /dev/null
@@ -0,0 +1,54 @@
+/**************************************************************************************************\r
+*  Revised:        $Date: 2007-07-06 11:19:00 -0700 (Fri, 06 Jul 2007) $\r
+*  Revision:       $Revision: 13579 $\r
+*\r
+*  Copyright 2007 Texas Instruments Incorporated.  All rights reserved.\r
+*\r
+*  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+*  the terms of a software license agreement between the user who downloaded the software,\r
+*  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+*  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+*  License. The License limits your use, and you acknowledge, that the Software may not be\r
+*  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+*  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+*  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+*  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+*  perform, display or sell this Software and/or its documentation for any purpose.\r
+*\r
+*  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+*  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+*  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+*  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+*  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+*  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+*  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+*  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+*  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+*\r
+*  Should you have any questions regarding your right to use this Software,\r
+*  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+/* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+ *   BSP (Board Support Package)\r
+ *   Target : Texas Instruments CC430EM\r
+ *   Driver definition file.\r
+ * =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+ */\r
+\r
+#ifndef BSP_DRIVER_DEFS_H\r
+#define BSP_DRIVER_DEFS_H\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                     Driver Initialization\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#define BSP_DRIVERS_C               "bsp_drivers.c"\r
+#define BSP_INIT_DRIVERS()          BSP_InitDrivers()\r
+void BSP_InitDrivers(void);\r
+\r
+\r
+/**************************************************************************************************\r
+ */\r
+#endif\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/Components/bsp/boards/CC430EM/bsp_drivers.c b/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/Components/bsp/boards/CC430EM/bsp_drivers.c
new file mode 100755 (executable)
index 0000000..0e08bb2
--- /dev/null
@@ -0,0 +1,88 @@
+/**************************************************************************************************\r
+*  Revised:        $Date: 2007-07-06 11:19:00 -0700 (Fri, 06 Jul 2007) $\r
+*  Revision:       $Revision: 13579 $\r
+*\r
+*  Copyright 2007 Texas Instruments Incorporated.  All rights reserved.\r
+*\r
+*  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+*  the terms of a software license agreement between the user who downloaded the software,\r
+*  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+*  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+*  License. The License limits your use, and you acknowledge, that the Software may not be\r
+*  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+*  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+*  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+*  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+*  perform, display or sell this Software and/or its documentation for any purpose.\r
+*\r
+*  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+*  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+*  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+*  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+*  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+*  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+*  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+*  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+*  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+*\r
+*  Should you have any questions regarding your right to use this Software,\r
+*  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+/* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+ *   BSP (Board Support Package)\r
+ *   Target : Texas Instruments CC430EM\r
+ *   Top-level driver file.\r
+ * =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+ */\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                            Includes\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#include "bsp_driver_defs.h"\r
+#include "bsp_leds.h"\r
+#include "bsp_buttons.h"\r
+#include "bsp_config.h"\r
+\r
+\r
+/**************************************************************************************************\r
+ * @fn          BSP_InitDrivers\r
+ *\r
+ * @brief       Initialize all enabled BSP drivers.\r
+ *\r
+ * @param       none\r
+ *\r
+ * @return      none\r
+ **************************************************************************************************\r
+ */\r
+\r
+void BSP_InitDrivers(void)\r
+{\r
+#if (!defined BSP_NO_LEDS)\r
+    BSP_InitLeds();\r
+#endif\r
+\r
+#if (!defined BSP_NO_BUTTONS)\r
+    BSP_InitButtons();\r
+#endif\r
+}\r
+\r
+/* ================================================================================================\r
+ *                                        C Code Includes\r
+ * ================================================================================================\r
+ */\r
+#ifndef BSP_NO_LEDS\r
+#    include "drivers/code/bsp_leds.c"\r
+#endif\r
+\r
+#ifndef BSP_NO_BUTTONS\r
+#    include "drivers/code/bsp_buttons.c"\r
+#endif\r
+\r
+\r
+/**************************************************************************************************\r
+ */\r
+\r
+\r
+\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/Components/bsp/boards/CC430EM/bsp_external/mrfi_board_defs.h b/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/Components/bsp/boards/CC430EM/bsp_external/mrfi_board_defs.h
new file mode 100755 (executable)
index 0000000..4e8ff55
--- /dev/null
@@ -0,0 +1,81 @@
+/**************************************************************************************************\r
+*  Revised:        $Date: 2007-07-06 11:19:00 -0700 (Fri, 06 Jul 2007) $\r
+*  Revision:       $Revision: 13579 $\r
+*\r
+*  Copyright 2007 Texas Instruments Incorporated.  All rights reserved.\r
+*\r
+*  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+*  the terms of a software license agreement between the user who downloaded the software,\r
+*  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+*  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+*  License. The License limits your use, and you acknowledge, that the Software may not be\r
+*  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+*  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+*  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+*  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+*  perform, display or sell this Software and/or its documentation for any purpose.\r
+*\r
+*  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+*  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+*  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+*  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+*  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+*  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+*  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+*  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+*  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+*\r
+*  Should you have any questions regarding your right to use this Software,\r
+*  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+/* ~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=\r
+ *   MRFI (Minimal RF Interface)\r
+ *   Board definition file.\r
+ *   Target : Texas Instruments CC430EM\r
+ *   Radios : CC430\r
+ * ~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=\r
+ */\r
+\r
+#ifndef MRFI_BOARD_DEFS_H\r
+#define MRFI_BOARD_DEFS_H\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                           Includes\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#include "bsp.h"\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                           Defines\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                        Radio Selection\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#if (!defined MRFI_CC430)\r
+#    error "ERROR: A compatible radio must be specified for the CC430EM board."\r
+#endif\r
+\r
+\r
+/* Radio Interface critical section macros */\r
+typedef bspIState_t mrfiRIFIState_t;\r
+#define MRFI_RIF_ENTER_CRITICAL_SECTION(x)    BSP_ENTER_CRITICAL_SECTION(x)\r
+#define MRFI_RIF_EXIT_CRITICAL_SECTION(x)     BSP_EXIT_CRITICAL_SECTION(x)\r
+\r
+\r
+/**************************************************************************************************\r
+ *                                  Compile Time Integrity Checks\r
+ **************************************************************************************************\r
+ */\r
+#ifndef BSP_BOARD_CC430EM\r
+#    error "ERROR: Mismatch between specified board and MRFI configuration."\r
+#endif\r
+\r
+\r
+/**************************************************************************************************\r
+ */\r
+#endif\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/Components/bsp/boards/CC430EM/bsp_led_defs.h b/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/Components/bsp/boards/CC430EM/bsp_led_defs.h
new file mode 100755 (executable)
index 0000000..e213c25
--- /dev/null
@@ -0,0 +1,97 @@
+/**************************************************************************************************\r
+*  Revised:        $Date: 2007-07-06 11:19:00 -0700 (Fri, 06 Jul 2007) $\r
+*  Revision:       $Revision: 13579 $\r
+*\r
+*  Copyright 2007 Texas Instruments Incorporated.  All rights reserved.\r
+*\r
+*  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+*  the terms of a software license agreement between the user who downloaded the software,\r
+*  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+*  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+*  License. The License limits your use, and you acknowledge, that the Software may not be\r
+*  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+*  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+*  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+*  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+*  perform, display or sell this Software and/or its documentation for any purpose.\r
+*\r
+*  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+*  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+*  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+*  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+*  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+*  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+*  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+*  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+*  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+*\r
+*  Should you have any questions regarding your right to use this Software,\r
+*  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+/* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+ *   BSP (Board Support Package)\r
+ *   Target : Texas Instruments CC430EM\r
+ *   LED definition file.\r
+ * =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+ */\r
+\r
+#ifndef BSP_LED_DEFS_H\r
+#define BSP_LED_DEFS_H\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                           Includes\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#include "bsp_board_defs.h"\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                      Configuration\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#define __bsp_NUM_LEDS__               2\r
+#define __bsp_LED_BLINK_LOOP_COUNT__   0x34000\r
+\r
+\r
+/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+ *                 LED #1\r
+ * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+ *   Schematic :  LED1\r
+ *   Color     :  Green\r
+ *   Polarity  :  Active High\r
+ *   GPIO      :  P1.0\r
+ * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+ */\r
+#define __bsp_LED1_BIT__            0\r
+#define __bsp_LED1_PORT__           P1OUT\r
+#define __bsp_LED1_DDR__            P1DIR\r
+#define __bsp_LED1_IS_ACTIVE_LOW__  0\r
+\r
+\r
+/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+ *                 LED #2\r
+ * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+ *   Schematic :  LED2\r
+ *   Color     :  Green\r
+ *   Polarity  :  Active High\r
+ *   GPIO      :  P3.6\r
+ * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+ */\r
+#define __bsp_LED2_BIT__            6\r
+#define __bsp_LED2_PORT__           P3OUT\r
+#define __bsp_LED2_DDR__            P3DIR\r
+#define __bsp_LED2_IS_ACTIVE_LOW__  0\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                 Include Generic LED Macros\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#include "code/bsp_generic_leds.h"\r
+\r
+\r
+/**************************************************************************************************\r
+ */\r
+#endif\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/Components/bsp/bsp.c b/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/Components/bsp/bsp.c
new file mode 100755 (executable)
index 0000000..c0bedd3
--- /dev/null
@@ -0,0 +1,102 @@
+/**************************************************************************************************\r
+*  Revised:        $Date: 2007-07-06 11:19:00 -0700 (Fri, 06 Jul 2007) $\r
+*  Revision:       $Revision: 13579 $\r
+*\r
+*  Copyright 2007 Texas Instruments Incorporated.  All rights reserved.\r
+*\r
+*  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+*  the terms of a software license agreement between the user who downloaded the software,\r
+*  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+*  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+*  License. The License limits your use, and you acknowledge, that the Software may not be\r
+*  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+*  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+*  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+*  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+*  perform, display or sell this Software and/or its documentation for any purpose.\r
+*\r
+*  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+*  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+*  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+*  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+*  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+*  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+*  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+*  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+*  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+*\r
+*  Should you have any questions regarding your right to use this Software,\r
+*  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+/* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+ *   BSP (Board Support Package)\r
+ *   Top-level BSP code file.\r
+ * =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+ */\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                            Includes\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#include "bsp.h"\r
+#include "bsp_driver_defs.h"\r
+\r
+\r
+/**************************************************************************************************\r
+ * @fn          BSP_Init\r
+ *\r
+ * @brief       Initialize the board and drivers.\r
+ *\r
+ * @param       none\r
+ *\r
+ * @return      none\r
+ **************************************************************************************************\r
+ */\r
+\r
+void BSP_Init(void)\r
+{\r
+    BSP_INIT_BOARD();\r
+    BSP_INIT_DRIVERS();\r
+\r
+    /*-------------------------------------------------------------\r
+     *  Run time integrity checks.  Perform only if asserts\r
+     *  are enabled.\r
+     */\r
+#ifdef BSP_ASSERTS_ARE_ON\r
+    /* verify endianess is correctly specified */\r
+    {\r
+        uint16_t test = 0x00AA;                                   /* first storage byte of 'test' is\r
+                                                                   *non-zero for little endian */\r
+        BSP_ASSERT(!(*((uint8_t *)&test)) == !BSP_LITTLE_ENDIAN); /* endianess mismatch */\r
+    }\r
+#endif\r
+}\r
+\r
+/* ================================================================================================\r
+ *                                        C Code Includes\r
+ * ================================================================================================\r
+ */\r
+#ifdef BSP_BOARD_C\r
+#    include BSP_BOARD_C\r
+#endif\r
+\r
+#ifdef BSP_DRIVERS_C\r
+#    include BSP_DRIVERS_C\r
+#endif\r
+\r
+\r
+/* ************************************************************************************************\r
+ *                                   Compile Time Integrity Checks\r
+ * ************************************************************************************************\r
+ */\r
+BSP_STATIC_ASSERT(sizeof(uint8_t) == 1);\r
+BSP_STATIC_ASSERT(sizeof(int8_t) == 1);\r
+BSP_STATIC_ASSERT(sizeof(uint16_t) == 2);\r
+BSP_STATIC_ASSERT(sizeof(int16_t) == 2);\r
+BSP_STATIC_ASSERT(sizeof(uint32_t) == 4);\r
+BSP_STATIC_ASSERT(sizeof(int32_t) == 4);\r
+\r
+\r
+/**************************************************************************************************\r
+ */\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/Components/bsp/bsp.h b/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/Components/bsp/bsp.h
new file mode 100755 (executable)
index 0000000..d249d39
--- /dev/null
@@ -0,0 +1,184 @@
+/**************************************************************************************************\r
+*  Revised:        $Date: 2007-07-06 11:19:00 -0700 (Fri, 06 Jul 2007) $\r
+*  Revision:       $Revision: 13579 $\r
+*\r
+*  Copyright 2007 Texas Instruments Incorporated.  All rights reserved.\r
+*\r
+*  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+*  the terms of a software license agreement between the user who downloaded the software,\r
+*  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+*  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+*  License. The License limits your use, and you acknowledge, that the Software may not be\r
+*  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+*  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+*  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+*  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+*  perform, display or sell this Software and/or its documentation for any purpose.\r
+*\r
+*  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+*  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+*  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+*  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+*  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+*  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+*  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+*  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+*  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+*\r
+*  Should you have any questions regarding your right to use this Software,\r
+*  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+/* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+ *   BSP (Board Support Package)\r
+ *   Include file for core BSP services.\r
+ * =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+ */\r
+\r
+#ifndef BSP_H\r
+#define BSP_H\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                           Includes\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#include "bsp_board_defs.h"\r
+#include "bsp_macros.h"\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                          BSP Defines\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#define BSP\r
+#define BSP_VER       100  /* BSP version 1.00a */\r
+#define BSP_SUBVER    a\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                            Clock\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#define BSP_CLOCK_MHZ   __bsp_CLOCK_MHZ__\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                            Memory\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#ifndef __bsp_LITTLE_ENDIAN__\r
+#    error ERROR: Endianess not defined\r
+#endif\r
+\r
+#define BSP_LITTLE_ENDIAN   __bsp_LITTLE_ENDIAN__\r
+\r
+#define CODE    __bsp_CODE_MEMSPACE__\r
+#define XDATA   __bsp_XDATA_MEMSPACE__\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                            Interrupts\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#define BSP_ISR_FUNCTION(func, vect)     __bsp_ISR_FUNCTION__(func, vect)\r
+\r
+#define BSP_ENABLE_INTERRUPTS()         __bsp_ENABLE_INTERRUPTS__()\r
+#define BSP_DISABLE_INTERRUPTS()        __bsp_DISABLE_INTERRUPTS__()\r
+#define BSP_INTERRUPTS_ARE_ENABLED()    __bsp_INTERRUPTS_ARE_ENABLED__()\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                         Critical Sections\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+typedef __bsp_ISTATE_T__ bspIState_t;\r
+\r
+#define BSP_ENTER_CRITICAL_SECTION(x)   st(x = __bsp_GET_ISTATE__(); __bsp_DISABLE_INTERRUPTS__(); )\r
+#define BSP_EXIT_CRITICAL_SECTION(x)    __bsp_RESTORE_ISTATE__(x)\r
+#define BSP_CRITICAL_STATEMENT(x)       st(bspIState_t s;                    \\r
+                                           BSP_ENTER_CRITICAL_SECTION(s);    \\r
+                                           x;                                \\r
+                                           BSP_EXIT_CRITICAL_SECTION(s); )\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                           Asserts\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+\r
+/*\r
+ *  BSP_ASSERT( expression ) - The given expression must evaluate as "true" or else the assert\r
+ *  handler is called.  From here, the call stack feature of the debugger can pinpoint where\r
+ * the problem occurred.\r
+ *\r
+ *  BSP_FORCE_ASSERT() - If asserts are in use, immediately calls the assert handler.\r
+ *\r
+ *  BSP_ASSERTS_ARE_ON - can use #ifdef to see if asserts are enabled\r
+ *\r
+ *  Asserts can be disabled for optimum performance and minimum code size (ideal for\r
+ *  finalized, debugged production code).\r
+ */\r
+\r
+#if (!defined BSP_NO_DEBUG)\r
+#    ifndef BSP_ASSERT_HANDLER\r
+#        define BSP_ASSERT_HANDLER()      st(__bsp_DISABLE_INTERRUPTS__();  while (1) ; )\r
+#    endif\r
+#    define BSP_ASSERT(expr)          st(if (!(expr)) BSP_ASSERT_HANDLER(); )\r
+#    define BSP_FORCE_ASSERT()        BSP_ASSERT_HANDLER()\r
+#    define BSP_ASSERTS_ARE_ON\r
+#else\r
+#    define BSP_ASSERT(expr)      /* empty */\r
+#    define BSP_FORCE_ASSERT()    /* empty */\r
+#endif\r
+\r
+/* static assert */\r
+#define BSP_STATIC_ASSERT(expr)   void bspDummyPrototype(char dummy[1 / ((expr) != 0)])\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                           Prototypes\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+void BSP_Init(void);\r
+\r
+/**************************************************************************************************\r
+ */\r
+\r
+/****************************************************************************************\r
+*                                 BEGIN ENDIAN SUPPORT\r
+*\r
+* Security encrypt/decrypt operates on unsigned long quantities. These must match on\r
+* source and destination platforms. These macros enforce the standard conversions.\r
+* Currently all platforms (CC2520/CC2x30 and MSP430) are little endian.\r
+*\r
+*******************   Network order for encryption is LITTLE ENDIAN   ******************\r
+*\r
+****************************************************************************************/\r
+\r
+#if (BSP_LITTLE_ENDIAN != 0)\r
+#    define   ntohs(x)    (x)\r
+#    define   htons(x)    (x)\r
+\r
+#    define   ntohl(x)    (x)\r
+#    define   htonl(x)    (x)\r
+\r
+#else\r
+\r
+#    define   ntohs(x)    (((x >> 8) & 0xFF) | ((x & 0xFF) << 8))\r
+#    define   htons(x)    (((x >> 8) & 0xFF) | ((x & 0xFF) << 8))\r
+\r
+#    define   ntohl(x)    (((x >> 24) & 0xFF) | ((x >> 8) & 0xFF00) | \\r
+                           ((x & 0xFF00) << 8) | ((x & 0xFF) << 24)   \\r
+                           )\r
+#    define   htonl(x)    (((x >> 24) & 0xFF) | ((x >> 8) & 0xFF00) | \\r
+                           ((x & 0xFF00) << 8) | ((x & 0xFF) << 24)   \\r
+                           )\r
+\r
+#endif  /* (BSP_LITTLE_ENDIAN != 0) */\r
+\r
+/***************************************************************************************\r
+*                                 END ENDIAN SUPPORT\r
+***************************************************************************************/\r
+\r
+\r
+\r
+#endif\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/Components/bsp/bsp_macros.h b/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/Components/bsp/bsp_macros.h
new file mode 100755 (executable)
index 0000000..60392ba
--- /dev/null
@@ -0,0 +1,79 @@
+/**************************************************************************************************\r
+*  Revised:        $Date: 2007-07-06 11:19:00 -0700 (Fri, 06 Jul 2007) $\r
+*  Revision:       $Revision: 13579 $\r
+*\r
+*  Copyright 2007 Texas Instruments Incorporated.  All rights reserved.\r
+*\r
+*  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+*  the terms of a software license agreement between the user who downloaded the software,\r
+*  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+*  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+*  License. The License limits your use, and you acknowledge, that the Software may not be\r
+*  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+*  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+*  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+*  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+*  perform, display or sell this Software and/or its documentation for any purpose.\r
+*\r
+*  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+*  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+*  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+*  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+*  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+*  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+*  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+*  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+*  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+*\r
+*  Should you have any questions regarding your right to use this Software,\r
+*  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+/* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+ *   BSP (Board Support Package)\r
+ *   Include file for BSP utility macros.\r
+ * =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+ */\r
+\r
+#ifndef BSP_MACROS_H\r
+#define BSP_MACROS_H\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                          Macros\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+/* bit value */\r
+#ifndef BV\r
+#    define BV(n)      (1 << (n))\r
+#endif\r
+\r
+/*\r
+ *  This macro is for use by other macros to form a fully valid C statement.\r
+ *  Without this, the if/else conditionals could show unexpected behavior.\r
+ *\r
+ *  For example, use...\r
+ *    #define SET_REGS()  st( ioreg1 = 0; ioreg2 = 0; )\r
+ *  instead of ...\r
+ *    #define SET_REGS()  { ioreg1 = 0; ioreg2 = 0; }\r
+ *  or\r
+ *    #define  SET_REGS()    ioreg1 = 0; ioreg2 = 0;\r
+ *  The last macro would not behave as expected in the if/else construct.\r
+ *  The second to last macro will cause a compiler error in certain uses\r
+ *  of if/else construct\r
+ *\r
+ *  It is not necessary, or recommended, to use this macro where there is\r
+ *  already a valid C statement.  For example, the following is redundant...\r
+ *    #define CALL_FUNC()   st(  func();  )\r
+ *  This should simply be...\r
+ *    #define CALL_FUNC()   func()\r
+ *\r
+ * (The while condition below evaluates false without generating a\r
+ *  constant-controlling-loop type of warning on most compilers.)\r
+ */\r
+#define st(x)      do { x } while (__LINE__ == -1)\r
+\r
+\r
+/**************************************************************************************************\r
+ */\r
+#endif\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/Components/bsp/drivers/bsp_buttons.h b/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/Components/bsp/drivers/bsp_buttons.h
new file mode 100755 (executable)
index 0000000..6ec3d99
--- /dev/null
@@ -0,0 +1,90 @@
+/**************************************************************************************************\r
+*  Revised:        $Date: 2007-07-06 11:19:00 -0700 (Fri, 06 Jul 2007) $\r
+*  Revision:       $Revision: 13579 $\r
+*\r
+*  Copyright 2007 Texas Instruments Incorporated. All rights reserved.\r
+*\r
+*  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+*  the terms of a software license agreement between the user who downloaded the software,\r
+*  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+*  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+*  License. The License limits your use, and you acknowledge, that the Software may not be\r
+*  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+*  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+*  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+*  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+*  perform, display or sell this Software and/or its documentation for any purpose.\r
+*\r
+*  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+*  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+*  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+*  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+*  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+*  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+*  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+*  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+*  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+*\r
+*  Should you have any questions regarding your right to use this Software,\r
+*  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+/* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+ *   BSP (Board Support Package)\r
+ *   Button driver include file.\r
+ * =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+ */\r
+\r
+#ifndef BSP_BUTTONS_H\r
+#define BSP_BUTTONS_H\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                           Includes\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#include "bsp_button_defs.h"\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                           Defines\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#define BSP_NUM_BUTTONS                   __bsp_NUM_BUTTONS__\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                            Macros\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#define BSP_BUTTON_DEBOUNCE_WAIT(expr)    __bsp_BUTTON_DEBOUNCE_WAIT__(expr)\r
+\r
+#define BSP_BUTTON1()   __bsp_BUTTON1__()\r
+#define BSP_BUTTON2()   __bsp_BUTTON2__()\r
+#define BSP_BUTTON3()   __bsp_BUTTON3__()\r
+#define BSP_BUTTON4()   __bsp_BUTTON4__()\r
+#define BSP_BUTTON5()   __bsp_BUTTON5__()\r
+#define BSP_BUTTON6()   __bsp_BUTTON6__()\r
+#define BSP_BUTTON7()   __bsp_BUTTON7__()\r
+#define BSP_BUTTON8()   __bsp_BUTTON8__()\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                        Prototypes\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+void BSP_InitButtons(void);\r
+\r
+\r
+/* ************************************************************************************************\r
+ *                                   Compile Time Integrity Checks\r
+ * ************************************************************************************************\r
+ */\r
+#ifdef BSP_NO_BUTTONS\r
+#    error "ERROR: The button driver is disabled.  This file should not be included."\r
+#endif\r
+\r
+\r
+/**************************************************************************************************\r
+ */\r
+#endif\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/Components/bsp/drivers/bsp_leds.h b/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/Components/bsp/drivers/bsp_leds.h
new file mode 100755 (executable)
index 0000000..2d0195e
--- /dev/null
@@ -0,0 +1,133 @@
+/**************************************************************************************************\r
+*  Revised:        $Date: 2007-07-06 11:19:00 -0700 (Fri, 06 Jul 2007) $\r
+*  Revision:       $Revision: 13579 $\r
+*\r
+*  Copyright 2007 Texas Instruments Incorporated.  All rights reserved.\r
+*\r
+*  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+*  the terms of a software license agreement between the user who downloaded the software,\r
+*  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+*  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+*  License. The License limits your use, and you acknowledge, that the Software may not be\r
+*  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+*  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+*  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+*  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+*  perform, display or sell this Software and/or its documentation for any purpose.\r
+*\r
+*  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+*  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+*  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+*  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+*  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+*  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+*  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+*  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+*  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+*\r
+*  Should you have any questions regarding your right to use this Software,\r
+*  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+/* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+ *   BSP (Board Support Package)\r
+ *   LED driver include file.\r
+ * =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+ */\r
+\r
+#ifndef BSP_LEDS_H\r
+#define BSP_LEDS_H\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                           Includes\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#include "bsp_led_defs.h"\r
+#include "bsp_macros.h"\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                             Defines\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#define BSP_NUM_LEDS            __bsp_NUM_LEDS__\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                              Macros\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+\r
+/* blink delay loop */\r
+#define BSP_LED_BLINK_DELAY()   st({ volatile uint32_t i; \\r
+                                     for (i = 0; i < __bsp_LED_BLINK_LOOP_COUNT__; i++){ }; })\r
+\r
+/* LED1 */\r
+#define BSP_TURN_ON_LED1()      __bsp_LED1_TURN_ON__()\r
+#define BSP_TURN_OFF_LED1()     __bsp_LED1_TURN_OFF__()\r
+#define BSP_TOGGLE_LED1()       __bsp_LED1_TOGGLE__()\r
+#define BSP_LED1_IS_ON()        __bsp_LED1_IS_ON__()\r
+\r
+/* LED2 */\r
+#define BSP_TURN_ON_LED2()      __bsp_LED2_TURN_ON__()\r
+#define BSP_TURN_OFF_LED2()     __bsp_LED2_TURN_OFF__()\r
+#define BSP_TOGGLE_LED2()       __bsp_LED2_TOGGLE__()\r
+#define BSP_LED2_IS_ON()        __bsp_LED2_IS_ON__()\r
+\r
+/* LED3 */\r
+#define BSP_TURN_ON_LED3()      __bsp_LED3_TURN_ON__()\r
+#define BSP_TURN_OFF_LED3()     __bsp_LED3_TURN_OFF__()\r
+#define BSP_TOGGLE_LED3()       __bsp_LED3_TOGGLE__()\r
+#define BSP_LED3_IS_ON()        __bsp_LED3_IS_ON__()\r
+\r
+/* LED4 */\r
+#define BSP_TURN_ON_LED4()      __bsp_LED4_TURN_ON__()\r
+#define BSP_TURN_OFF_LED4()     __bsp_LED4_TURN_OFF__()\r
+#define BSP_TOGGLE_LED4()       __bsp_LED4_TOGGLE__()\r
+#define BSP_LED4_IS_ON()        __bsp_LED4_IS_ON__()\r
+\r
+/* LED5 */\r
+#define BSP_TURN_ON_LED5()      __bsp_LED5_TURN_ON__()\r
+#define BSP_TURN_OFF_LED5()     __bsp_LED5_TURN_OFF__()\r
+#define BSP_TOGGLE_LED5()       __bsp_LED5_TOGGLE__()\r
+#define BSP_LED5_IS_ON()        __bsp_LED5_IS_ON__()\r
+\r
+/* LED6 */\r
+#define BSP_TURN_ON_LED6()      __bsp_LED6_TURN_ON__()\r
+#define BSP_TURN_OFF_LED6()     __bsp_LED6_TURN_OFF__()\r
+#define BSP_TOGGLE_LED6()       __bsp_LED6_TOGGLE__()\r
+#define BSP_LED6_IS_ON()        __bsp_LED6_IS_ON__()\r
+\r
+/* LED7 */\r
+#define BSP_TURN_ON_LED7()      __bsp_LED7_TURN_ON__()\r
+#define BSP_TURN_OFF_LED7()     __bsp_LED7_TURN_OFF__()\r
+#define BSP_TOGGLE_LED7()       __bsp_LED7_TOGGLE__()\r
+#define BSP_LED7_IS_ON()        __bsp_LED7_IS_ON__()\r
+\r
+/* LED8 */\r
+#define BSP_TURN_ON_LED8()      __bsp_LED8_TURN_ON__()\r
+#define BSP_TURN_OFF_LED8()     __bsp_LED8_TURN_OFF__()\r
+#define BSP_TOGGLE_LED8()       __bsp_LED8_TOGGLE__()\r
+#define BSP_LED8_IS_ON()        __bsp_LED8_IS_ON__()\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                        Prototypes\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+void BSP_InitLeds(void);\r
+\r
+\r
+\r
+/* ************************************************************************************************\r
+ *                                   Compile Time Integrity Checks\r
+ * ************************************************************************************************\r
+ */\r
+#ifdef BSP_NO_LEDS\r
+#    error "ERROR: The LED driver is disabled.  This file should not be included."\r
+#endif\r
+\r
+/**************************************************************************************************\r
+ */\r
+#endif\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/Components/bsp/drivers/code/bsp_buttons.c b/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/Components/bsp/drivers/code/bsp_buttons.c
new file mode 100755 (executable)
index 0000000..bff3d5d
--- /dev/null
@@ -0,0 +1,97 @@
+/**************************************************************************************************\r
+*  Revised:        $Date: 2007-07-06 11:19:00 -0700 (Fri, 06 Jul 2007) $\r
+*  Revision:       $Revision: 13579 $\r
+*\r
+*  Copyright 2007 Texas Instruments Incorporated.  All rights reserved.\r
+*\r
+*  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+*  the terms of a software license agreement between the user who downloaded the software,\r
+*  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+*  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+*  License. The License limits your use, and you acknowledge, that the Software may not be\r
+*  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+*  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+*  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+*  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+*  perform, display or sell this Software and/or its documentation for any purpose.\r
+*\r
+*  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+*  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+*  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+*  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+*  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+*  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+*  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+*  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+*  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+*\r
+*  Should you have any questions regarding your right to use this Software,\r
+*  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+/* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+ *   BSP (Board Support Package)\r
+ *   Generic button driver code file.\r
+ * =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+ */\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                            Includes\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#include "bsp_buttons.h"\r
+#include "bsp_button_defs.h"\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                             Macros\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#define BSP_CONFIG_BUTTON1()    __bsp_BUTTON1_CONFIG__()\r
+#define BSP_CONFIG_BUTTON2()    __bsp_BUTTON2_CONFIG__()\r
+#define BSP_CONFIG_BUTTON3()    __bsp_BUTTON3_CONFIG__()\r
+#define BSP_CONFIG_BUTTON4()    __bsp_BUTTON4_CONFIG__()\r
+#define BSP_CONFIG_BUTTON5()    __bsp_BUTTON5_CONFIG__()\r
+#define BSP_CONFIG_BUTTON6()    __bsp_BUTTON6_CONFIG__()\r
+#define BSP_CONFIG_BUTTON7()    __bsp_BUTTON7_CONFIG__()\r
+#define BSP_CONFIG_BUTTON8()    __bsp_BUTTON8_CONFIG__()\r
+\r
+#ifdef __bsp_BUTTON_EXTENDED_CONFIG__\r
+#    define BSP_BUTTON_EXTENDED_CONFIG()  __bsp_BUTTON_EXTENDED_CONFIG__()\r
+#else\r
+#    define BSP_BUTTON_EXTENDED_CONFIG()\r
+#endif\r
+\r
+\r
+/**************************************************************************************************\r
+ * @fn          BSP_InitButtons\r
+ *\r
+ * @brief       Initialize button hardware and driver code.\r
+ *\r
+ * @param       none\r
+ *\r
+ * @return      none\r
+ **************************************************************************************************\r
+ */\r
+\r
+void BSP_InitButtons(void)\r
+{\r
+    /* configure LEDs */\r
+    BSP_CONFIG_BUTTON1();\r
+    BSP_CONFIG_BUTTON2();\r
+    BSP_CONFIG_BUTTON3();\r
+    BSP_CONFIG_BUTTON4();\r
+    BSP_CONFIG_BUTTON5();\r
+    BSP_CONFIG_BUTTON6();\r
+    BSP_CONFIG_BUTTON7();\r
+    BSP_CONFIG_BUTTON8();\r
+\r
+    /* peform extended configuration if needed */\r
+    BSP_BUTTON_EXTENDED_CONFIG();\r
+}\r
+\r
+/**************************************************************************************************\r
+ */\r
+\r
+\r
+\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/Components/bsp/drivers/code/bsp_generic_buttons.h b/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/Components/bsp/drivers/code/bsp_generic_buttons.h
new file mode 100755 (executable)
index 0000000..5a244bd
--- /dev/null
@@ -0,0 +1,211 @@
+/**************************************************************************************************\r
+*  Revised:        $Date: 2007-07-06 11:19:00 -0700 (Fri, 06 Jul 2007) $\r
+*  Revision:       $Revision: 13579 $\r
+*\r
+*  Copyright 2007 Texas Instruments Incorporated.  All rights reserved.\r
+*\r
+*  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+*  the terms of a software license agreement between the user who downloaded the software,\r
+*  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+*  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+*  License. The License limits your use, and you acknowledge, that the Software may not be\r
+*  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+*  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+*  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+*  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+*  perform, display or sell this Software and/or its documentation for any purpose.\r
+*\r
+*  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+*  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+*  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+*  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+*  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+*  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+*  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+*  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+*  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+*\r
+*  Should you have any questions regarding your right to use this Software,\r
+*  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+/* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+ *   BSP (Board Support Package)\r
+ *   Generic button macro include file.\r
+ * =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+ */\r
+\r
+#ifndef BSP_GENERIC_BUTTONS_H\r
+#define BSP_GENERIC_BUTTONS_H\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                           Includes\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#include "bsp_board_defs.h"\r
+#include "bsp_macros.h"\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                            Macros\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#define __bsp_BUTTON__(port, bit, low)    ((low) ? (!((port) & BV(bit))) : ((port) & BV(bit)))\r
+\r
+\r
+/* ------------------------- populate BUTTON #1 macros ------------------------- */\r
+#define __bsp_NUM_BUTTON1_DEFINES__  ((defined __bsp_BUTTON1_PORT__)  + \\r
+                                      (defined __bsp_BUTTON1_BIT__)   + \\r
+                                      (defined __bsp_BUTTON1_IS_ACTIVE_LOW__))\r
+#if (__bsp_NUM_BUTTON1_DEFINES__ == 3)\r
+#    define __bsp_BUTTON1__()           __bsp_BUTTON__(__bsp_BUTTON1_PORT__, __bsp_BUTTON1_BIT__, \\r
+                                                       __bsp_BUTTON1_IS_ACTIVE_LOW__)\r
+#    define __bsp_BUTTON1_CONFIG__() /* nothing required */\r
+#elif (__bsp_NUM_BUTTON1_DEFINES__ == 0)\r
+#    define __bsp_BUTTON1__()           /* no button */ 0\r
+#    define __bsp_BUTTON1_CONFIG__() /* no button */\r
+#else\r
+#    error "ERROR: Incomplete number of macros for BUTTON1."\r
+#endif\r
+\r
+/* ------------------------- populate BUTTON #2 macros ------------------------- */\r
+#define __bsp_NUM_BUTTON2_DEFINES__  ((defined __bsp_BUTTON2_PORT__)  + \\r
+                                      (defined __bsp_BUTTON2_BIT__)   + \\r
+                                      (defined __bsp_BUTTON2_IS_ACTIVE_LOW__))\r
+#if (__bsp_NUM_BUTTON2_DEFINES__ == 3)\r
+#    define __bsp_BUTTON2__()           __bsp_BUTTON__(__bsp_BUTTON2_PORT__, __bsp_BUTTON2_BIT__, \\r
+                                                       __bsp_BUTTON2_IS_ACTIVE_LOW__)\r
+#    define __bsp_BUTTON2_CONFIG__() /* nothing required */\r
+#elif (__bsp_NUM_BUTTON2_DEFINES__ == 0)\r
+#    define __bsp_BUTTON2__()           /* no button */ 0\r
+#    define __bsp_BUTTON2_CONFIG__() /* no button */\r
+#else\r
+#    error "ERROR: Incomplete number of macros for BUTTON2."\r
+#endif\r
+\r
+/* ------------------------- populate BUTTON #3 macros ------------------------- */\r
+#define __bsp_NUM_BUTTON3_DEFINES__  ((defined __bsp_BUTTON3_PORT__)  + \\r
+                                      (defined __bsp_BUTTON3_BIT__)   + \\r
+                                      (defined __bsp_BUTTON3_IS_ACTIVE_LOW__))\r
+#if (__bsp_NUM_BUTTON3_DEFINES__ == 3)\r
+#    define __bsp_BUTTON3__()           __bsp_BUTTON__(__bsp_BUTTON3_PORT__, __bsp_BUTTON3_BIT__, \\r
+                                                       __bsp_BUTTON3_IS_ACTIVE_LOW__)\r
+#    define __bsp_BUTTON3_CONFIG__() /* nothing required */\r
+#elif (__bsp_NUM_BUTTON3_DEFINES__ == 0)\r
+#    define __bsp_BUTTON3__()           /* no button */ 0\r
+#    define __bsp_BUTTON3_CONFIG__() /* no button */\r
+#else\r
+#    error "ERROR: Incomplete number of macros for BUTTON3."\r
+#endif\r
+\r
+/* ------------------------- populate BUTTON #4 macros ------------------------- */\r
+#define __bsp_NUM_BUTTON4_DEFINES__  ((defined __bsp_BUTTON4_PORT__)  + \\r
+                                      (defined __bsp_BUTTON4_BIT__)   + \\r
+                                      (defined __bsp_BUTTON4_IS_ACTIVE_LOW__))\r
+#if (__bsp_NUM_BUTTON4_DEFINES__ == 3)\r
+#    define __bsp_BUTTON4__()           __bsp_BUTTON__(__bsp_BUTTON4_PORT__, __bsp_BUTTON4_BIT__, \\r
+                                                       __bsp_BUTTON4_IS_ACTIVE_LOW__)\r
+#    define __bsp_BUTTON4_CONFIG__() /* nothing required */\r
+#elif (__bsp_NUM_BUTTON4_DEFINES__ == 0)\r
+#    define __bsp_BUTTON4__()           /* no button */ 0\r
+#    define __bsp_BUTTON4_CONFIG__() /* no button */\r
+#else\r
+#    error "ERROR: Incomplete number of macros for BUTTON4."\r
+#endif\r
+\r
+/* ------------------------- populate BUTTON #5 macros ------------------------- */\r
+#define __bsp_NUM_BUTTON5_DEFINES__  ((defined __bsp_BUTTON5_PORT__)  + \\r
+                                      (defined __bsp_BUTTON5_BIT__)   + \\r
+                                      (defined __bsp_BUTTON5_IS_ACTIVE_LOW__))\r
+#if (__bsp_NUM_BUTTON5_DEFINES__ == 3)\r
+#    define __bsp_BUTTON5__()           __bsp_BUTTON__(__bsp_BUTTON5_PORT__, __bsp_BUTTON5_BIT__, \\r
+                                                       __bsp_BUTTON5_IS_ACTIVE_LOW__)\r
+#    define __bsp_BUTTON5_CONFIG__() /* nothing required */\r
+#elif (__bsp_NUM_BUTTON5_DEFINES__ == 0)\r
+#    define __bsp_BUTTON5__()           /* no button */ 0\r
+#    define __bsp_BUTTON5_CONFIG__() /* no button */\r
+#else\r
+#    error "ERROR: Incomplete number of macros for BUTTON5."\r
+#endif\r
+\r
+/* ------------------------- populate BUTTON #6 macros ------------------------- */\r
+#define __bsp_NUM_BUTTON6_DEFINES__  ((defined __bsp_BUTTON6_PORT__)  + \\r
+                                      (defined __bsp_BUTTON6_BIT__)   + \\r
+                                      (defined __bsp_BUTTON6_IS_ACTIVE_LOW__))\r
+#if (__bsp_NUM_BUTTON6_DEFINES__ == 3)\r
+#    define __bsp_BUTTON6__()           __bsp_BUTTON__(__bsp_BUTTON6_PORT__, __bsp_BUTTON6_BIT__, \\r
+                                                       __bsp_BUTTON6_IS_ACTIVE_LOW__)\r
+#    define __bsp_BUTTON6_CONFIG__() /* nothing required */\r
+#elif (__bsp_NUM_BUTTON6_DEFINES__ == 0)\r
+#    define __bsp_BUTTON6__()           /* no button */ 0\r
+#    define __bsp_BUTTON6_CONFIG__() /* no button */\r
+#else\r
+#    error "ERROR: Incomplete number of macros for BUTTON6."\r
+#endif\r
+\r
+/* ------------------------- populate BUTTON #7 macros ------------------------- */\r
+#define __bsp_NUM_BUTTON7_DEFINES__  ((defined __bsp_BUTTON7_PORT__)  + \\r
+                                      (defined __bsp_BUTTON7_BIT__)   + \\r
+                                      (defined __bsp_BUTTON7_IS_ACTIVE_LOW__))\r
+#if (__bsp_NUM_BUTTON7_DEFINES__ == 3)\r
+#    define __bsp_BUTTON7__()           __bsp_BUTTON__(__bsp_BUTTON7_PORT__, __bsp_BUTTON7_BIT__, \\r
+                                                       __bsp_BUTTON7_IS_ACTIVE_LOW__)\r
+#    define __bsp_BUTTON7_CONFIG__() /* nothing required */\r
+#elif (__bsp_NUM_BUTTON7_DEFINES__ == 0)\r
+#    define __bsp_BUTTON7__()           /* no button */ 0\r
+#    define __bsp_BUTTON7_CONFIG__() /* no button */\r
+#else\r
+#    error "ERROR: Incomplete number of macros for BUTTON7."\r
+#endif\r
+\r
+/* ------------------------- populate BUTTON #8 macros ------------------------- */\r
+#define __bsp_NUM_BUTTON8_DEFINES__  ((defined __bsp_BUTTON8_PORT__)  + \\r
+                                      (defined __bsp_BUTTON8_BIT__)   + \\r
+                                      (defined __bsp_BUTTON8_IS_ACTIVE_LOW__))\r
+#if (__bsp_NUM_BUTTON8_DEFINES__ == 3)\r
+#    define __bsp_BUTTON8__()           __bsp_BUTTON__(__bsp_BUTTON8_PORT__, __bsp_BUTTON8_BIT__, \\r
+                                                       __bsp_BUTTON8_IS_ACTIVE_LOW__)\r
+#    define __bsp_BUTTON8_CONFIG__() /* nothing required */\r
+#elif (__bsp_NUM_BUTTON8_DEFINES__ == 0)\r
+#    define __bsp_BUTTON8__()           /* no button */ 0\r
+#    define __bsp_BUTTON8_CONFIG__() /* no button */\r
+#else\r
+#    error "ERROR: Incomplete number of macros for BUTTON8."\r
+#endif\r
+\r
+\r
+/* ************************************************************************************************\r
+ *                                   Compile Time Integrity Checks\r
+ * ************************************************************************************************\r
+ */\r
+\r
+/* -------------------- number of buttons defined -------------------- */\r
+#ifndef __bsp_NUM_BUTTONS__\r
+#    error "ERROR: Number of buttons is not specified."\r
+#else\r
+#    if ((__bsp_NUM_BUTTONS__ > 8) || (__bsp_NUM_BUTTONS__ < 0))\r
+#        error "ERROR: Unsupported number of buttons specified.  Maximum is eight."\r
+#    endif\r
+#endif\r
+\r
+#if (((__bsp_NUM_BUTTON1_DEFINES__ != 0) + \\r
+    (__bsp_NUM_BUTTON2_DEFINES__ != 0) + \\r
+    (__bsp_NUM_BUTTON3_DEFINES__ != 0) + \\r
+    (__bsp_NUM_BUTTON4_DEFINES__ != 0) + \\r
+    (__bsp_NUM_BUTTON5_DEFINES__ != 0) + \\r
+    (__bsp_NUM_BUTTON6_DEFINES__ != 0) + \\r
+    (__bsp_NUM_BUTTON7_DEFINES__ != 0) + \\r
+    (__bsp_NUM_BUTTON8_DEFINES__ != 0)) != __bsp_NUM_BUTTONS__)\r
+#    error "ERROR: Inconsistency between defined macros and specified number of buttons."\r
+#endif\r
+\r
+/* -------------------- debounce macro -------------------- */\r
+#ifndef __bsp_BUTTON_DEBOUNCE_WAIT__\r
+#    error "ERROR: Debounce delay macro is missing."\r
+#endif\r
+\r
+\r
+/**************************************************************************************************\r
+ */\r
+#endif\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/Components/bsp/drivers/code/bsp_generic_leds.h b/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/Components/bsp/drivers/code/bsp_generic_leds.h
new file mode 100755 (executable)
index 0000000..f356d46
--- /dev/null
@@ -0,0 +1,358 @@
+/**************************************************************************************************\r
+*  Revised:        $Date: 2007-07-06 11:19:00 -0700 (Fri, 06 Jul 2007) $\r
+*  Revision:       $Revision: 13579 $\r
+*\r
+*  Copyright 2007 Texas Instruments Incorporated.  All rights reserved.\r
+*\r
+*  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+*  the terms of a software license agreement between the user who downloaded the software,\r
+*  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+*  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+*  License. The License limits your use, and you acknowledge, that the Software may not be\r
+*  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+*  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+*  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+*  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+*  perform, display or sell this Software and/or its documentation for any purpose.\r
+*\r
+*  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+*  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+*  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+*  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+*  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+*  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+*  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+*  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+*  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+*\r
+*  Should you have any questions regarding your right to use this Software,\r
+*  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+/* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+ *   BSP (Board Support Package)\r
+ *   Generic LED macro include file.\r
+ * =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+ */\r
+\r
+#ifndef BSP_GENERIC_LEDS_H\r
+#define BSP_GENERIC_LEDS_H\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                          Includes\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#include "bsp_macros.h"\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                           Macros\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+\r
+/*\r
+ *  Note : The conditionals in the following macros evaulate compile time constants.\r
+ *         Any compiler worth its salt will optimize these conditionals out for the\r
+ *         smallest possible code.\r
+ */\r
+\r
+#define __bsp_LED_TURN_ON__(bit, port, ddr, low)  \\r
+    st(if (low){ port &= ~BV(bit); } else { port |= BV(bit); })\r
+\r
+#define __bsp_LED_TURN_OFF__(bit, port, ddr, low)  \\r
+    st(if (low){ port |= BV(bit); } else { port &= ~BV(bit); })\r
+\r
+#define __bsp_LED_IS_ON__(bit, port, ddr, low)  \\r
+    ((low) ? (!((port) & BV(bit))) : ((port) & BV(bit)))\r
+\r
+#define __bsp_LED_TOGGLE__(bit, port, ddr, low)     st(port ^= BV(bit); )\r
+#define __bsp_LED_CONFIG__(bit, port, ddr, low)     st(ddr |= BV(bit); )\r
+\r
+\r
+\r
+/* ------------------------- populate LED1 macros ------------------------- */\r
+#define __bsp_NUM_LED1_DEFINES__  ((defined __bsp_LED1_BIT__)  + \\r
+                                   (defined __bsp_LED1_PORT__) + \\r
+                                   (defined __bsp_LED1_DDR__)  + \\r
+                                   (defined __bsp_LED1_IS_ACTIVE_LOW__))\r
+#if (__bsp_NUM_LED1_DEFINES__ == 4)\r
+#    define __bsp_LED1_TURN_ON__()    __bsp_LED_TURN_ON__(__bsp_LED1_BIT__, __bsp_LED1_PORT__, \\r
+                                                          __bsp_LED1_DDR__, \\r
+                                                          __bsp_LED1_IS_ACTIVE_LOW__)\r
+#    define __bsp_LED1_TURN_OFF__()   __bsp_LED_TURN_OFF__(__bsp_LED1_BIT__, __bsp_LED1_PORT__, \\r
+                                                           __bsp_LED1_DDR__, \\r
+                                                           __bsp_LED1_IS_ACTIVE_LOW__)\r
+#    define __bsp_LED1_TOGGLE__()     __bsp_LED_TOGGLE__(__bsp_LED1_BIT__, __bsp_LED1_PORT__, \\r
+                                                         __bsp_LED1_DDR__, \\r
+                                                         __bsp_LED1_IS_ACTIVE_LOW__)\r
+#    define __bsp_LED1_IS_ON__()      __bsp_LED_IS_ON__(__bsp_LED1_BIT__, __bsp_LED1_PORT__, \\r
+                                                        __bsp_LED1_DDR__, \\r
+                                                        __bsp_LED1_IS_ACTIVE_LOW__)\r
+#    define __bsp_LED1_CONFIG__()     __bsp_LED_CONFIG__(__bsp_LED1_BIT__, __bsp_LED1_PORT__, \\r
+                                                         __bsp_LED1_DDR__, \\r
+                                                         __bsp_LED1_IS_ACTIVE_LOW__)\r
+#elif (__bsp_NUM_LED1_DEFINES__ == 0)\r
+#    define __bsp_LED1_TURN_ON__()  /* no LED */\r
+#    define __bsp_LED1_TURN_OFF__() /* no LED */\r
+#    define __bsp_LED1_TOGGLE__()   /* no LED */\r
+#    define __bsp_LED1_IS_ON__()      /* no LED */ 0\r
+#    define __bsp_LED1_CONFIG__()   /* no LED */\r
+#else\r
+#    error "ERROR: Incomplete number of macros for LED1."\r
+#endif\r
+\r
+\r
+/* ------------------------- populate LED2 macros ------------------------- */\r
+#define __bsp_NUM_LED2_DEFINES__  ((defined __bsp_LED2_BIT__)  + \\r
+                                   (defined __bsp_LED2_PORT__) + \\r
+                                   (defined __bsp_LED2_DDR__)  + \\r
+                                   (defined __bsp_LED2_IS_ACTIVE_LOW__))\r
+#if (__bsp_NUM_LED2_DEFINES__ == 4)\r
+#    define __bsp_LED2_TURN_ON__()    __bsp_LED_TURN_ON__(__bsp_LED2_BIT__, __bsp_LED2_PORT__, \\r
+                                                          __bsp_LED2_DDR__, \\r
+                                                          __bsp_LED2_IS_ACTIVE_LOW__)\r
+#    define __bsp_LED2_TURN_OFF__()   __bsp_LED_TURN_OFF__(__bsp_LED2_BIT__, __bsp_LED2_PORT__, \\r
+                                                           __bsp_LED2_DDR__, \\r
+                                                           __bsp_LED2_IS_ACTIVE_LOW__)\r
+#    define __bsp_LED2_TOGGLE__()     __bsp_LED_TOGGLE__(__bsp_LED2_BIT__, __bsp_LED2_PORT__, \\r
+                                                         __bsp_LED2_DDR__, \\r
+                                                         __bsp_LED2_IS_ACTIVE_LOW__)\r
+#    define __bsp_LED2_IS_ON__()      __bsp_LED_IS_ON__(__bsp_LED2_BIT__, __bsp_LED2_PORT__, \\r
+                                                        __bsp_LED2_DDR__, \\r
+                                                        __bsp_LED2_IS_ACTIVE_LOW__)\r
+#    define __bsp_LED2_CONFIG__()     __bsp_LED_CONFIG__(__bsp_LED2_BIT__, __bsp_LED2_PORT__, \\r
+                                                         __bsp_LED2_DDR__, \\r
+                                                         __bsp_LED2_IS_ACTIVE_LOW__)\r
+#elif (__bsp_NUM_LED2_DEFINES__ == 0)\r
+#    define __bsp_LED2_TURN_ON__()  /* no LED */\r
+#    define __bsp_LED2_TURN_OFF__() /* no LED */\r
+#    define __bsp_LED2_TOGGLE__()   /* no LED */\r
+#    define __bsp_LED2_IS_ON__()      /* no LED */ 0\r
+#    define __bsp_LED2_CONFIG__()   /* no LED */\r
+#else\r
+#    error "ERROR: Incomplete number of macros for LED2."\r
+#endif\r
+\r
+\r
+/* ------------------------- populate LED3 macros ------------------------- */\r
+#define __bsp_NUM_LED3_DEFINES__  ((defined __bsp_LED3_BIT__)  + \\r
+                                   (defined __bsp_LED3_PORT__) + \\r
+                                   (defined __bsp_LED3_DDR__)  + \\r
+                                   (defined __bsp_LED3_IS_ACTIVE_LOW__))\r
+#if (__bsp_NUM_LED3_DEFINES__ == 4)\r
+#    define __bsp_LED3_TURN_ON__()    __bsp_LED_TURN_ON__(__bsp_LED3_BIT__, __bsp_LED3_PORT__, \\r
+                                                          __bsp_LED3_DDR__, \\r
+                                                          __bsp_LED3_IS_ACTIVE_LOW__)\r
+#    define __bsp_LED3_TURN_OFF__()   __bsp_LED_TURN_OFF__(__bsp_LED3_BIT__, __bsp_LED3_PORT__, \\r
+                                                           __bsp_LED3_DDR__, \\r
+                                                           __bsp_LED3_IS_ACTIVE_LOW__)\r
+#    define __bsp_LED3_TOGGLE__()     __bsp_LED_TOGGLE__(__bsp_LED3_BIT__, __bsp_LED3_PORT__, \\r
+                                                         __bsp_LED3_DDR__, \\r
+                                                         __bsp_LED3_IS_ACTIVE_LOW__)\r
+#    define __bsp_LED3_IS_ON__()      __bsp_LED_IS_ON__(__bsp_LED3_BIT__, __bsp_LED3_PORT__, \\r
+                                                        __bsp_LED3_DDR__, \\r
+                                                        __bsp_LED3_IS_ACTIVE_LOW__)\r
+#    define __bsp_LED3_CONFIG__()     __bsp_LED_CONFIG__(__bsp_LED3_BIT__, __bsp_LED3_PORT__, \\r
+                                                         __bsp_LED3_DDR__, \\r
+                                                         __bsp_LED3_IS_ACTIVE_LOW__)\r
+#elif (__bsp_NUM_LED3_DEFINES__ == 0)\r
+#    define __bsp_LED3_TURN_ON__()  /* no LED */\r
+#    define __bsp_LED3_TURN_OFF__() /* no LED */\r
+#    define __bsp_LED3_TOGGLE__()   /* no LED */\r
+#    define __bsp_LED3_IS_ON__()      /* no LED */ 0\r
+#    define __bsp_LED3_CONFIG__()   /* no LED */\r
+#else\r
+#    error "ERROR: Incomplete number of macros for LED3."\r
+#endif\r
+\r
+\r
+/* ------------------------- populate LED4 macros ------------------------- */\r
+#define __bsp_NUM_LED4_DEFINES__  ((defined __bsp_LED4_BIT__)  + \\r
+                                   (defined __bsp_LED4_PORT__) + \\r
+                                   (defined __bsp_LED4_DDR__)  + \\r
+                                   (defined __bsp_LED4_IS_ACTIVE_LOW__))\r
+#if (__bsp_NUM_LED4_DEFINES__ == 4)\r
+#    define __bsp_LED4_TURN_ON__()    __bsp_LED_TURN_ON__(__bsp_LED4_BIT__, __bsp_LED4_PORT__, \\r
+                                                          __bsp_LED4_DDR__, \\r
+                                                          __bsp_LED4_IS_ACTIVE_LOW__)\r
+#    define __bsp_LED4_TURN_OFF__()   __bsp_LED_TURN_OFF__(__bsp_LED4_BIT__, __bsp_LED4_PORT__, \\r
+                                                           __bsp_LED4_DDR__, \\r
+                                                           __bsp_LED4_IS_ACTIVE_LOW__)\r
+#    define __bsp_LED4_TOGGLE__()     __bsp_LED_TOGGLE__(__bsp_LED4_BIT__, __bsp_LED4_PORT__, \\r
+                                                         __bsp_LED4_DDR__, \\r
+                                                         __bsp_LED4_IS_ACTIVE_LOW__)\r
+#    define __bsp_LED4_IS_ON__()      __bsp_LED_IS_ON__(__bsp_LED4_BIT__, __bsp_LED4_PORT__, \\r
+                                                        __bsp_LED4_DDR__, \\r
+                                                        __bsp_LED4_IS_ACTIVE_LOW__)\r
+#    define __bsp_LED4_CONFIG__()     __bsp_LED_CONFIG__(__bsp_LED4_BIT__, __bsp_LED4_PORT__, \\r
+                                                         __bsp_LED4_DDR__, \\r
+                                                         __bsp_LED4_IS_ACTIVE_LOW__)\r
+#elif (__bsp_NUM_LED4_DEFINES__ == 0)\r
+#    define __bsp_LED4_TURN_ON__()  /* no LED */\r
+#    define __bsp_LED4_TURN_OFF__() /* no LED */\r
+#    define __bsp_LED4_TOGGLE__()   /* no LED */\r
+#    define __bsp_LED4_IS_ON__()      /* no LED */ 0\r
+#    define __bsp_LED4_CONFIG__()   /* no LED */\r
+#else\r
+#    error "ERROR: Incomplete number of macros for LED4."\r
+#endif\r
+\r
+/* ------------------------- populate LED5 macros ------------------------- */\r
+#define __bsp_NUM_LED5_DEFINES__  ((defined __bsp_LED5_BIT__)  + \\r
+                                   (defined __bsp_LED5_PORT__) + \\r
+                                   (defined __bsp_LED5_DDR__)  + \\r
+                                   (defined __bsp_LED5_IS_ACTIVE_LOW__))\r
+#if (__bsp_NUM_LED5_DEFINES__ == 4)\r
+#    define __bsp_LED5_TURN_ON__()    __bsp_LED_TURN_ON__(__bsp_LED5_BIT__, __bsp_LED5_PORT__, \\r
+                                                          __bsp_LED5_DDR__, \\r
+                                                          __bsp_LED5_IS_ACTIVE_LOW__)\r
+#    define __bsp_LED5_TURN_OFF__()   __bsp_LED_TURN_OFF__(__bsp_LED5_BIT__, __bsp_LED5_PORT__, \\r
+                                                           __bsp_LED5_DDR__, \\r
+                                                           __bsp_LED5_IS_ACTIVE_LOW__)\r
+#    define __bsp_LED5_TOGGLE__()     __bsp_LED_TOGGLE__(__bsp_LED5_BIT__, __bsp_LED5_PORT__, \\r
+                                                         __bsp_LED5_DDR__, \\r
+                                                         __bsp_LED5_IS_ACTIVE_LOW__)\r
+#    define __bsp_LED5_IS_ON__()      __bsp_LED_IS_ON__(__bsp_LED5_BIT__, __bsp_LED5_PORT__, \\r
+                                                        __bsp_LED5_DDR__, \\r
+                                                        __bsp_LED5_IS_ACTIVE_LOW__)\r
+#    define __bsp_LED5_CONFIG__()     __bsp_LED_CONFIG__(__bsp_LED5_BIT__, __bsp_LED5_PORT__, \\r
+                                                         __bsp_LED5_DDR__, \\r
+                                                         __bsp_LED5_IS_ACTIVE_LOW__)\r
+#elif (__bsp_NUM_LED5_DEFINES__ == 0)\r
+#    define __bsp_LED5_TURN_ON__()  /* no LED */\r
+#    define __bsp_LED5_TURN_OFF__() /* no LED */\r
+#    define __bsp_LED5_TOGGLE__()   /* no LED */\r
+#    define __bsp_LED5_IS_ON__()      /* no LED */ 0\r
+#    define __bsp_LED5_CONFIG__()   /* no LED */\r
+#else\r
+#    error "ERROR: Incomplete number of macros for LED5."\r
+#endif\r
+\r
+/* ------------------------- populate LED6 macros ------------------------- */\r
+#define __bsp_NUM_LED6_DEFINES__  ((defined __bsp_LED6_BIT__)  + \\r
+                                   (defined __bsp_LED6_PORT__) + \\r
+                                   (defined __bsp_LED6_DDR__)  + \\r
+                                   (defined __bsp_LED6_IS_ACTIVE_LOW__))\r
+#if (__bsp_NUM_LED6_DEFINES__ == 4)\r
+#    define __bsp_LED6_TURN_ON__()    __bsp_LED_TURN_ON__(__bsp_LED6_BIT__, __bsp_LED6_PORT__, \\r
+                                                          __bsp_LED6_DDR__, \\r
+                                                          __bsp_LED6_IS_ACTIVE_LOW__)\r
+#    define __bsp_LED6_TURN_OFF__()   __bsp_LED_TURN_OFF__(__bsp_LED6_BIT__, __bsp_LED6_PORT__, \\r
+                                                           __bsp_LED6_DDR__, \\r
+                                                           __bsp_LED6_IS_ACTIVE_LOW__)\r
+#    define __bsp_LED6_TOGGLE__()     __bsp_LED_TOGGLE__(__bsp_LED6_BIT__, __bsp_LED6_PORT__, \\r
+                                                         __bsp_LED6_DDR__, \\r
+                                                         __bsp_LED6_IS_ACTIVE_LOW__)\r
+#    define __bsp_LED6_IS_ON__()      __bsp_LED_IS_ON__(__bsp_LED6_BIT__, __bsp_LED6_PORT__, \\r
+                                                        __bsp_LED6_DDR__, \\r
+                                                        __bsp_LED6_IS_ACTIVE_LOW__)\r
+#    define __bsp_LED6_CONFIG__()     __bsp_LED_CONFIG__(__bsp_LED6_BIT__, __bsp_LED6_PORT__, \\r
+                                                         __bsp_LED6_DDR__, \\r
+                                                         __bsp_LED6_IS_ACTIVE_LOW__)\r
+#elif (__bsp_NUM_LED6_DEFINES__ == 0)\r
+#    define __bsp_LED6_TURN_ON__()  /* no LED */\r
+#    define __bsp_LED6_TURN_OFF__() /* no LED */\r
+#    define __bsp_LED6_TOGGLE__()   /* no LED */\r
+#    define __bsp_LED6_IS_ON__()      /* no LED */ 0\r
+#    define __bsp_LED6_CONFIG__()   /* no LED */\r
+#else\r
+#    error "ERROR: Incomplete number of macros for LED6."\r
+#endif\r
+\r
+/* ------------------------- populate LED7 macros ------------------------- */\r
+#define __bsp_NUM_LED7_DEFINES__  ((defined __bsp_LED7_BIT__)  + \\r
+                                   (defined __bsp_LED7_PORT__) + \\r
+                                   (defined __bsp_LED7_DDR__)  + \\r
+                                   (defined __bsp_LED7_IS_ACTIVE_LOW__))\r
+#if (__bsp_NUM_LED7_DEFINES__ == 4)\r
+#    define __bsp_LED7_TURN_ON__()    __bsp_LED_TURN_ON__(__bsp_LED7_BIT__, __bsp_LED7_PORT__, \\r
+                                                          __bsp_LED7_DDR__, \\r
+                                                          __bsp_LED7_IS_ACTIVE_LOW__)\r
+#    define __bsp_LED7_TURN_OFF__()   __bsp_LED_TURN_OFF__(__bsp_LED7_BIT__, __bsp_LED7_PORT__, \\r
+                                                           __bsp_LED7_DDR__, \\r
+                                                           __bsp_LED7_IS_ACTIVE_LOW__)\r
+#    define __bsp_LED7_TOGGLE__()     __bsp_LED_TOGGLE__(__bsp_LED7_BIT__, __bsp_LED7_PORT__, \\r
+                                                         __bsp_LED7_DDR__, \\r
+                                                         __bsp_LED7_IS_ACTIVE_LOW__)\r
+#    define __bsp_LED7_IS_ON__()      __bsp_LED_IS_ON__(__bsp_LED7_BIT__, __bsp_LED7_PORT__, \\r
+                                                        __bsp_LED7_DDR__, \\r
+                                                        __bsp_LED7_IS_ACTIVE_LOW__)\r
+#    define __bsp_LED7_CONFIG__()     __bsp_LED_CONFIG__(__bsp_LED7_BIT__, __bsp_LED7_PORT__, \\r
+                                                         __bsp_LED7_DDR__, \\r
+                                                         __bsp_LED7_IS_ACTIVE_LOW__)\r
+#elif (__bsp_NUM_LED7_DEFINES__ == 0)\r
+#    define __bsp_LED7_TURN_ON__()  /* no LED */\r
+#    define __bsp_LED7_TURN_OFF__() /* no LED */\r
+#    define __bsp_LED7_TOGGLE__()   /* no LED */\r
+#    define __bsp_LED7_IS_ON__()      /* no LED */ 0\r
+#    define __bsp_LED7_CONFIG__()   /* no LED */\r
+#else\r
+#    error "ERROR: Incomplete number of macros for LED7."\r
+#endif\r
+\r
+/* ------------------------- populate LED8 macros ------------------------- */\r
+#define __bsp_NUM_LED8_DEFINES__  ((defined __bsp_LED8_BIT__)  + \\r
+                                   (defined __bsp_LED8_PORT__) + \\r
+                                   (defined __bsp_LED8_DDR__)  + \\r
+                                   (defined __bsp_LED8_IS_ACTIVE_LOW__))\r
+#if (__bsp_NUM_LED8_DEFINES__ == 4)\r
+#    define __bsp_LED8_TURN_ON__()    __bsp_LED_TURN_ON__(__bsp_LED8_BIT__, __bsp_LED8_PORT__, \\r
+                                                          __bsp_LED8_DDR__, \\r
+                                                          __bsp_LED8_IS_ACTIVE_LOW__)\r
+#    define __bsp_LED8_TURN_OFF__()   __bsp_LED_TURN_OFF__(__bsp_LED8_BIT__, __bsp_LED8_PORT__, \\r
+                                                           __bsp_LED8_DDR__, \\r
+                                                           __bsp_LED8_IS_ACTIVE_LOW__)\r
+#    define __bsp_LED8_TOGGLE__()     __bsp_LED_TOGGLE__(__bsp_LED8_BIT__, __bsp_LED8_PORT__, \\r
+                                                         __bsp_LED8_DDR__, \\r
+                                                         __bsp_LED8_IS_ACTIVE_LOW__)\r
+#    define __bsp_LED8_IS_ON__()      __bsp_LED_IS_ON__(__bsp_LED8_BIT__, __bsp_LED8_PORT__, \\r
+                                                        __bsp_LED8_DDR__, \\r
+                                                        __bsp_LED8_IS_ACTIVE_LOW__)\r
+#    define __bsp_LED8_CONFIG__()     __bsp_LED_CONFIG__(__bsp_LED8_BIT__, __bsp_LED8_PORT__, \\r
+                                                         __bsp_LED8_DDR__, \\r
+                                                         __bsp_LED8_IS_ACTIVE_LOW__)\r
+#elif (__bsp_NUM_LED8_DEFINES__ == 0)\r
+#    define __bsp_LED8_TURN_ON__()  /* no LED */\r
+#    define __bsp_LED8_TURN_OFF__() /* no LED */\r
+#    define __bsp_LED8_TOGGLE__()   /* no LED */\r
+#    define __bsp_LED8_IS_ON__()      /* no LED */ 0\r
+#    define __bsp_LED8_CONFIG__()   /* no LED */\r
+#else\r
+#    error "ERROR: Incomplete number of macros for LED8."\r
+#endif\r
+\r
+\r
+/* ************************************************************************************************\r
+ *                                   Compile Time Integrity Checks\r
+ * ************************************************************************************************\r
+ */\r
+\r
+/* -------------------- number of LEDs defined -------------------- */\r
+#ifndef __bsp_NUM_LEDS__\r
+#    error "ERROR: Number of LEDs is not specified."\r
+#else\r
+#    if ((__bsp_NUM_LEDS__ > 8) || (__bsp_NUM_LEDS__ < 0))\r
+#        error "ERROR: Unsupported number of LEDs specified.  Maximum is eight."\r
+#    endif\r
+#endif\r
+\r
+#if (((__bsp_NUM_LED1_DEFINES__ != 0) + \\r
+    (__bsp_NUM_LED2_DEFINES__ != 0) + \\r
+    (__bsp_NUM_LED3_DEFINES__ != 0) + \\r
+    (__bsp_NUM_LED4_DEFINES__ != 0) + \\r
+    (__bsp_NUM_LED5_DEFINES__ != 0) + \\r
+    (__bsp_NUM_LED6_DEFINES__ != 0) + \\r
+    (__bsp_NUM_LED7_DEFINES__ != 0) + \\r
+    (__bsp_NUM_LED8_DEFINES__ != 0)) != __bsp_NUM_LEDS__)\r
+#    error "ERROR: Inconsistency between defined macros and specified number of LEDs."\r
+#endif\r
+\r
+/* -------------------- blink delay loop count -------------------- */\r
+#ifndef __bsp_LED_BLINK_LOOP_COUNT__\r
+#    error "ERROR: Blink delay count is missing."\r
+#endif\r
+\r
+/**************************************************************************************************\r
+ */\r
+#endif\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/Components/bsp/drivers/code/bsp_leds.c b/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/Components/bsp/drivers/code/bsp_leds.c
new file mode 100755 (executable)
index 0000000..eac9f5f
--- /dev/null
@@ -0,0 +1,107 @@
+/**************************************************************************************************\r
+*  Revised:        $Date: 2007-07-06 11:19:00 -0700 (Fri, 06 Jul 2007) $\r
+*  Revision:       $Revision: 13579 $\r
+*\r
+*  Copyright 2007 Texas Instruments Incorporated.  All rights reserved.\r
+*\r
+*  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+*  the terms of a software license agreement between the user who downloaded the software,\r
+*  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+*  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+*  License. The License limits your use, and you acknowledge, that the Software may not be\r
+*  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+*  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+*  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+*  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+*  perform, display or sell this Software and/or its documentation for any purpose.\r
+*\r
+*  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+*  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+*  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+*  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+*  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+*  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+*  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+*  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+*  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+*\r
+*  Should you have any questions regarding your right to use this Software,\r
+*  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+/* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+ *   BSP (Board Support Package)\r
+ *   Generic LED driver code file.\r
+ * =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+ */\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                            Includes\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#include "bsp_leds.h"\r
+#include "bsp_led_defs.h"\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                             Macros\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#define BSP_CONFIG_LED1()    __bsp_LED1_CONFIG__()\r
+#define BSP_CONFIG_LED2()    __bsp_LED2_CONFIG__()\r
+#define BSP_CONFIG_LED3()    __bsp_LED3_CONFIG__()\r
+#define BSP_CONFIG_LED4()    __bsp_LED4_CONFIG__()\r
+#define BSP_CONFIG_LED5()    __bsp_LED5_CONFIG__()\r
+#define BSP_CONFIG_LED6()    __bsp_LED6_CONFIG__()\r
+#define BSP_CONFIG_LED7()    __bsp_LED7_CONFIG__()\r
+#define BSP_CONFIG_LED8()    __bsp_LED8_CONFIG__()\r
+\r
+#ifdef __bsp_LED_EXTENDED_CONFIG__\r
+#    define BSP_LED_EXTENDED_CONFIG()  __bsp_LED_EXTENDED_CONFIG__()\r
+#else\r
+#    define BSP_LED_EXTENDED_CONFIG()\r
+#endif\r
+\r
+\r
+/**************************************************************************************************\r
+ * @fn          BSP_InitLeds\r
+ *\r
+ * @brief       Initialize LED hardware and driver.\r
+ *\r
+ * @param       none\r
+ *\r
+ * @return      none\r
+ **************************************************************************************************\r
+ */\r
+\r
+void BSP_InitLeds(void)\r
+{\r
+    /* configure LEDs */\r
+    BSP_CONFIG_LED1();\r
+    BSP_CONFIG_LED2();\r
+    BSP_CONFIG_LED3();\r
+    BSP_CONFIG_LED4();\r
+    BSP_CONFIG_LED5();\r
+    BSP_CONFIG_LED6();\r
+    BSP_CONFIG_LED7();\r
+    BSP_CONFIG_LED8();\r
+\r
+    /* peform extended configuration if needed */\r
+    BSP_LED_EXTENDED_CONFIG();\r
+\r
+    /* turn all LEDs off as power-up default */\r
+    BSP_TURN_OFF_LED1();\r
+    BSP_TURN_OFF_LED2();\r
+    BSP_TURN_OFF_LED3();\r
+    BSP_TURN_OFF_LED4();\r
+    BSP_TURN_OFF_LED5();\r
+    BSP_TURN_OFF_LED6();\r
+    BSP_TURN_OFF_LED7();\r
+    BSP_TURN_OFF_LED8();\r
+}\r
+\r
+/**************************************************************************************************\r
+ */\r
+\r
+\r
+\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/Components/bsp/mcus/bsp_msp430_defs.h b/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/Components/bsp/mcus/bsp_msp430_defs.h
new file mode 100755 (executable)
index 0000000..9e08426
--- /dev/null
@@ -0,0 +1,142 @@
+/**************************************************************************************************\r
+*  Filename:       bsp_msp430_defs.h\r
+*  Revised:        $Date: 2009-10-11 18:52:46 -0700 (Sun, 11 Oct 2009) $\r
+*  Revision:       $Revision: 20897 $\r
+*\r
+*  Copyright 2007-2009 Texas Instruments Incorporated.  All rights reserved.\r
+*\r
+*  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+*  the terms of a software license agreement between the user who downloaded the software,\r
+*  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+*  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+*  License. The License limits your use, and you acknowledge, that the Software may not be\r
+*  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+*  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+*  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+*  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+*  perform, display or sell this Software and/or its documentation for any purpose.\r
+*\r
+*  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+*  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+*  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+*  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+*  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+*  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+*  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+*  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+*  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+*\r
+*  Should you have any questions regarding your right to use this Software,\r
+*  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+/* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+ *   BSP (Board Support Package)\r
+ *   MCU : Texas Instruments MSP430 family\r
+ *   Microcontroller definition file.\r
+ * =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+ */\r
+\r
+#ifndef BSP_MSP430_DEFS_H\r
+#define BSP_MSP430_DEFS_H\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                          Defines\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#define BSP_MCU_MSP430\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                     Compiler Abstraction\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+\r
+/* ---------------------- IAR Compiler ---------------------- */\r
+#ifdef __IAR_SYSTEMS_ICC__\r
+#    define BSP_COMPILER_IAR\r
+\r
+#    if (__VER__ < 342)\r
+#        error "ERROR: This IAR compiler port requires at least revision v3.42A."\r
+\r
+/*\r
+ *  Compiler versions previous to v3.42A do not have the universal msp430.h include file.\r
+ *  To use an earlier version of the compiler, replace the above #error statement with\r
+ *  the appropriate, device specific #include statement.\r
+ */\r
+#    endif\r
+\r
+/* Workaround for release v3.42A - the msp430.h file did not include support for some devices */\r
+#    if ((__VER__ == 342) && (__SUBVERSION__ == 'A')) && \\r
+    (defined (__MSP430F1610__) || defined (__MSP430F1611__) || defined (__MSP430F1612__))\r
+#        include <msp430x16x.h>\r
+#    else\r
+#        include <msp430.h>\r
+#    endif\r
+\r
+#    define __bsp_ISTATE_T__            istate_t\r
+#    define __bsp_ISR_FUNCTION__(f, v)   __bsp_QUOTED_PRAGMA__(vector = v) __interrupt void f(void); \\r
+    __bsp_QUOTED_PRAGMA__(vector = v) __interrupt void f(void)\r
+\r
+/* Initialization call provided in IAR environment before standard C-startup */\r
+#    include <intrinsics.h>\r
+#    define BSP_EARLY_INIT(void) __intrinsic int __low_level_init(void)\r
+\r
+/* ---------------------- Code Composer ---------------------- */\r
+#elif (defined __TI_COMPILER_VERSION__) && (defined __MSP430__)\r
+#    define BSP_COMPILER_CODE_COMPOSER\r
+\r
+/* At time of 1.1.0 release, CC430 support not in msp430.h */\r
+#    if (__CC430F6137__)\r
+#        include <cc430x613x.h>\r
+#    else\r
+#        include <msp430.h>\r
+#    endif\r
+\r
+#    define __bsp_ISTATE_T__            unsigned short\r
+#    define __bsp_ISR_FUNCTION__(f, v)   __bsp_QUOTED_PRAGMA__(vector = v) __interrupt void f(void)\r
+\r
+/* Initialization call provided in CCE environment before standard C-startup */\r
+// [BM] Cannot have a second low level init! Already done by application!\r
+//#define BSP_EARLY_INIT(void)  int _system_pre_init(void)\r
+\r
+/* ------------------ Unrecognized Compiler ------------------ */\r
+#else\r
+#    error "ERROR: Unknown compiler."\r
+#endif\r
+\r
+#if (defined BSP_COMPILER_IAR) || (defined BSP_COMPILER_CODE_COMPOSER)\r
+#    include <intrinsics.h>\r
+#    define __bsp_ENABLE_INTERRUPTS__()       __enable_interrupt()\r
+#    define __bsp_DISABLE_INTERRUPTS__()      __disable_interrupt()\r
+#    define __bsp_INTERRUPTS_ARE_ENABLED__()  (__get_SR_register() & GIE)\r
+\r
+#    define __bsp_GET_ISTATE__()              __get_interrupt_state()\r
+#    define __bsp_RESTORE_ISTATE__(x)         __set_interrupt_state(x)\r
+\r
+#    define __bsp_QUOTED_PRAGMA__(x)          _Pragma(# x)\r
+\r
+#endif\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                          Common\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#define __bsp_LITTLE_ENDIAN__   1\r
+#define __bsp_CODE_MEMSPACE__   /* blank */\r
+#define __bsp_XDATA_MEMSPACE__  /* blank */\r
+\r
+typedef   signed char int8_t;\r
+typedef   signed short int16_t;\r
+typedef   signed long int32_t;\r
+\r
+typedef   unsigned char uint8_t;\r
+typedef   unsigned short uint16_t;\r
+typedef   unsigned long uint32_t;\r
+\r
+#ifndef NULL\r
+#    define NULL 0\r
+#endif\r
+\r
+/**************************************************************************************************\r
+ */\r
+#endif\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/Components/mrfi/mrfi.c b/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/Components/mrfi/mrfi.c
new file mode 100755 (executable)
index 0000000..a8b40cf
--- /dev/null
@@ -0,0 +1,87 @@
+/**************************************************************************************************\r
+*  Revised:        $Date: 2007-07-06 11:19:00 -0700 (Fri, 06 Jul 2007) $\r
+*  Revision:       $Revision: 13579 $\r
+*\r
+*  Copyright 2007 Texas Instruments Incorporated.  All rights reserved.\r
+*\r
+*  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+*  the terms of a software license agreement between the user who downloaded the software,\r
+*  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+*  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+*  License. The License limits your use, and you acknowledge, that the Software may not be\r
+*  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+*  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+*  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+*  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+*  perform, display or sell this Software and/or its documentation for any purpose.\r
+*\r
+*  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+*  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+*  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+*  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+*  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+*  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+*  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+*  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+*  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+*\r
+*  Should you have any questions regarding your right to use this Software,\r
+*  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+/* ~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=\r
+ *   MRFI (Minimal RF Interface)\r
+ *   Top-level code file.\r
+ * ~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=\r
+ */\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                          Includes\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#include "mrfi_defs.h"\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                       C Code Includes\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+\r
+/* ----- Radio Family 1 ----- */\r
+#if (defined MRFI_RADIO_FAMILY1)\r
+#    include "radios/family1/mrfi_radio.c"\r
+#    include "radios/family1/mrfi_spi.c"\r
+#    include "radios/common/mrfi_f1f2.c"\r
+#    include "bsp_external/mrfi_board.c"\r
+\r
+/* ----- Radio Family 2 ----- */\r
+#elif (defined MRFI_RADIO_FAMILY2)\r
+#    include "radios/family2/mrfi_radio.c"\r
+#    include "radios/common/mrfi_f1f2.c"\r
+\r
+/* ----- Radio Family 3 ----- */\r
+#elif (defined MRFI_RADIO_FAMILY3)\r
+#    include "bsp_external/mrfi_board.c"\r
+#    include "radios/family3/mrfi_spi.c"\r
+#    include "radios/family3/mrfi_radio.c"\r
+\r
+/* ----- Radio Family 4 ----- */\r
+#elif (defined MRFI_RADIO_FAMILY4)\r
+#    include "radios/family4/mrfi_radio.c"\r
+\r
+/* ----- Radio Family 5 ----- */\r
+#elif (defined MRFI_RADIO_FAMILY5)\r
+#    include "radios/family5/mrfi_radio.c"\r
+#    include "radios/family5/mrfi_radio_interface.c"\r
+\r
+/* ----- Radio Family 6 ----- */\r
+#elif (defined MRFI_RADIO_FAMILY6)\r
+#    include "radios/family6/mrfi_radio.c"\r
+\r
+#else\r
+#    error "ERROR: Radio family is not defined."\r
+#endif\r
+\r
+\r
+/**************************************************************************************************\r
+ */\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/Components/mrfi/mrfi.h b/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/Components/mrfi/mrfi.h
new file mode 100755 (executable)
index 0000000..a976435
--- /dev/null
@@ -0,0 +1,190 @@
+/**************************************************************************************************\r
+*  Revised:        $Date: 2007-07-06 11:19:00 -0700 (Fri, 06 Jul 2007) $\r
+*  Revision:       $Revision: 13579 $\r
+*\r
+*  Copyright 2007 Texas Instruments Incorporated.  All rights reserved.\r
+*\r
+*  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+*  the terms of a software license agreement between the user who downloaded the software,\r
+*  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+*  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+*  License. The License limits your use, and you acknowledge, that the Software may not be\r
+*  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+*  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+*  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+*  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+*  perform, display or sell this Software and/or its documentation for any purpose.\r
+*\r
+*  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+*  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+*  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+*  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+*  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+*  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+*  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+*  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+*  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+*\r
+*  Should you have any questions regarding your right to use this Software,\r
+*  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+/* ~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=\r
+ *   MRFI (Minimal RF Interface)\r
+ *   Include file for all MRFI services.\r
+ * ~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=\r
+ */\r
+\r
+#ifndef MRFI_H\r
+#define MRFI_H\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                          Includes\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#include "bsp.h"\r
+#include "mrfi_defs.h"\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                          Defines\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#define MRFI_NUM_LOGICAL_CHANS           __mrfi_NUM_LOGICAL_CHANS__\r
+\r
+#define MRFI_NUM_POWER_SETTINGS          __mrfi_NUM_POWER_SETTINGS__\r
+\r
+/* return values for MRFI_Transmit */\r
+#define MRFI_TX_RESULT_SUCCESS        0\r
+#define MRFI_TX_RESULT_FAILED         1\r
+\r
+/* transmit type parameter for MRFI_Transmit */\r
+#define MRFI_TX_TYPE_FORCED           0\r
+#define MRFI_TX_TYPE_CCA              1\r
+\r
+/* Network header size definition */\r
+\r
+/* *********************************  NOTE  ****************************************\r
+ * There is a dependency here that really shouldn't exist. A reimplementation\r
+ * is necessary to avoid it.\r
+ *\r
+ * MRFI allocates the frame buffer which means it needs to know at compile time\r
+ * how big the buffer is. This means in must know the NWK header size, the\r
+ * maximum NWK and User application payload sizes and whether Security is enabled.\r
+ * ********************************************************************************\r
+ */\r
+#ifndef SMPL_SECURE\r
+#    define  NWK_HDR_SIZE   3\r
+#    define  NWK_PAYLOAD    MAX_NWK_PAYLOAD\r
+#else\r
+#    define  NWK_HDR_SIZE   6\r
+#    define  NWK_PAYLOAD    (MAX_NWK_PAYLOAD + 4)\r
+#endif\r
+\r
+/* if external code has defined a maximum payload, use that instead of default */\r
+#ifdef MAX_APP_PAYLOAD\r
+#    ifndef MAX_NWK_PAYLOAD\r
+#        error ERROR: MAX_NWK_PAYLOAD not defined\r
+#    endif\r
+#    if MAX_APP_PAYLOAD < NWK_PAYLOAD\r
+#        define MAX_PAYLOAD  NWK_PAYLOAD\r
+#    else\r
+#        define MAX_PAYLOAD  MAX_APP_PAYLOAD\r
+#    endif\r
+#    define MRFI_MAX_PAYLOAD_SIZE  (MAX_PAYLOAD + NWK_HDR_SIZE) /* SimpliciTI payload size plus six\r
+                                                                 *byte overhead */\r
+#endif\r
+\r
+\r
+/* frame definitions */\r
+#define MRFI_ADDR_SIZE              __mrfi_ADDR_SIZE__\r
+#ifndef MRFI_MAX_PAYLOAD_SIZE\r
+#    define MRFI_MAX_PAYLOAD_SIZE       __mrfi_MAX_PAYLOAD_SIZE__\r
+#endif\r
+#define MRFI_MAX_FRAME_SIZE         (MRFI_MAX_PAYLOAD_SIZE + __mrfi_FRAME_OVERHEAD_SIZE__)\r
+#define MRFI_RX_METRICS_SIZE        __mrfi_RX_METRICS_SIZE__\r
+#define MRFI_RX_METRICS_RSSI_OFS    __mrfi_RX_METRICS_RSSI_OFS__\r
+#define MRFI_RX_METRICS_CRC_LQI_OFS __mrfi_RX_METRICS_CRC_LQI_OFS__\r
+\r
+/* Radio States */\r
+#define MRFI_RADIO_STATE_UNKNOWN  0\r
+#define MRFI_RADIO_STATE_OFF      1\r
+#define MRFI_RADIO_STATE_IDLE     2\r
+#define MRFI_RADIO_STATE_RX       3\r
+\r
+/* Platform constant used to calculate worst-case for an application\r
+ * acknowledgment delay. Used in the NWK_REPLY_DELAY() macro.\r
+ *\r
+ *\r
+ *                                    processing time on peer\r
+ |   round trip\r
+ |   |      max number of replays\r
+ |   |      |             number of backoff opportunities\r
+ |   |      |             |         average number of backoffs\r
+ |   |      |             |         |                                    */\r
+#define   PLATFORM_FACTOR_CONSTANT   (2 + 2 * \\r
+                                      (MAX_HOPS * \\r
+                                       (MRFI_CCA_RETRIES * (8 * MRFI_BACKOFF_PERIOD_USECS) / 1000)))\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                          Macros\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#define MRFI_GET_PAYLOAD_LEN(p)         __mrfi_GET_PAYLOAD_LEN__(p)\r
+#define MRFI_SET_PAYLOAD_LEN(p, x)       __mrfi_SET_PAYLOAD_LEN__(p, x)\r
+\r
+#define MRFI_P_DST_ADDR(p)              __mrfi_P_DST_ADDR__(p)\r
+#define MRFI_P_SRC_ADDR(p)              __mrfi_P_SRC_ADDR__(p)\r
+#define MRFI_P_PAYLOAD(p)               __mrfi_P_PAYLOAD__(p)\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                          Typdefs\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+typedef struct\r
+{\r
+    uint8_t frame[MRFI_MAX_FRAME_SIZE];\r
+    uint8_t rxMetrics[MRFI_RX_METRICS_SIZE];\r
+} mrfiPacket_t;\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                         Prototypes\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+void MRFI_Init(void);\r
+\r
+uint8_t MRFI_Transmit(mrfiPacket_t *, uint8_t);\r
+void MRFI_Receive(mrfiPacket_t *);\r
+void MRFI_RxCompleteISR(void);    /* populated by code using MRFI */\r
+uint8_t MRFI_GetRadioState(void);\r
+void MRFI_RxOn(void);\r
+void MRFI_RxIdle(void);\r
+int8_t MRFI_Rssi(void);\r
+\r
+void MRFI_SetLogicalChannel(uint8_t);\r
+uint8_t MRFI_SetRxAddrFilter(uint8_t *);\r
+void MRFI_EnableRxAddrFilter(void);\r
+void MRFI_DisableRxAddrFilter(void);\r
+void MRFI_Sleep(void);\r
+void MRFI_WakeUp(void);\r
+uint8_t MRFI_RandomByte(void);\r
+\r
+void MRFI_DelayMs(uint16_t);\r
+void MRFI_ReplyDelay(void);\r
+void MRFI_PostKillSem(void);\r
+\r
+void MRFI_SetRFPwr(uint8_t);\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                       Global Constants\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+extern const uint8_t mrfiBroadcastAddr[];\r
+\r
+\r
+/**************************************************************************************************\r
+ */\r
+#endif\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/Components/mrfi/mrfi_defs.h b/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/Components/mrfi/mrfi_defs.h
new file mode 100755 (executable)
index 0000000..60d1d72
--- /dev/null
@@ -0,0 +1,233 @@
+/**************************************************************************************************\r
+*  Revised:        $Date: 2009-01-13 16:32:00 -0700 (Wed, 13 Jan 2009) $\r
+*  Revision:       $Revision: 18768 $\r
+*\r
+*  Copyright 2007-2009 Texas Instruments Incorporated.  All rights reserved.\r
+*\r
+*  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+*  the terms of a software license agreement between the user who downloaded the software,\r
+*  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+*  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+*  License. The License limits your use, and you acknowledge, that the Software may not be\r
+*  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+*  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+*  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+*  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+*  perform, display or sell this Software and/or its documentation for any purpose.\r
+*\r
+*  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+*  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+*  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+*  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+*  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+*  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+*  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+*  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+*  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+*\r
+*  Should you have any questions regarding your right to use this Software,\r
+*  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+/* ~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=\r
+ *   MRFI (Minimal RF Interface)\r
+ *   Definition and abstraction for radio targets.\r
+ * ~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=\r
+ */\r
+#ifndef MRFI_DEFS_H\r
+#define MRFI_DEFS_H\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                          Includes\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#include "bsp.h"\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                       Common Defines\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#define MRFI_CCA_RETRIES        4\r
+\r
+#define MRFI_ASSERT(x)          BSP_ASSERT(x)\r
+#define MRFI_FORCE_ASSERT()     BSP_FORCE_ASSERT()\r
+#define MRFI_ASSERTS_ARE_ON     BSP_ASSERTS_ARE_ON\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                    Radio Family Assigment\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+\r
+/* ------ Radio Family 1 ------ */\r
+#if (defined MRFI_CC1100) /* Sub 1 GHz RF Transceiver */ || \\r
+    (defined MRFI_CC1101) /* Sub 1 GHz RF Transceiver */ || \\r
+    (defined MRFI_CC1100E_470) /* Sub 1 GHz RF Transceiver (CC1100E Asia) */ || \\r
+    (defined MRFI_CC1100E_950) /* Sub 1 GHz RF Transceiver (CC1100E Asia) */ || \\r
+    (defined MRFI_CC2500)   /* 2.4 GHz RF Transceiver */\r
+#    define MRFI_RADIO_FAMILY1\r
+\r
+/* ------ Radio Family 2 ------ */\r
+#elif (defined MRFI_CC1110) /* Sub 1 GHz SoC */                     || \\r
+    (defined MRFI_CC1111) /* Sub 1 GHz SoC with USB controller */ || \\r
+    (defined MRFI_CC2510) /* 2.4 GHz SoC */                       || \\r
+    (defined MRFI_CC2511)   /* 2.4 GHz SoC with USB controller */\r
+#    define MRFI_RADIO_FAMILY2\r
+\r
+/* ------ Radio Family 3 ------ */\r
+#elif (defined MRFI_CC2420) /* 2.4 GHz IEEE 802.15.4 RF Transceiver */ || \\r
+    (defined MRFI_CC2520)   /* 2.4 GHz IEEE 802.15.4 RF Transceiver */\r
+\r
+#    define MRFI_RADIO_FAMILY3\r
+\r
+/* ------ Radio Family 4 ------ */\r
+#elif (defined MRFI_CC2430) /* 2.4 GHz IEEE 802.15.4 SoC */ || \\r
+    (defined MRFI_CC2431)   /* 2.4 GHz IEEE 802.15.4 SoC */\r
+#    define MRFI_RADIO_FAMILY4\r
+\r
+/* ------ Radio Family 5 ------ */\r
+#elif (defined MRFI_CC430)  /* Sub 1 GHz MSP SoC */\r
+#    define MRFI_RADIO_FAMILY5\r
+\r
+/* ------ Radio Family 6 ------ */\r
+#elif (defined MRFI_CC2530) /* 2.4 GHz IEEE 802.15.4 SoC */\r
+\r
+#    define MRFI_RADIO_FAMILY6\r
+\r
+#else\r
+#    error "ERROR: Unknown or missing radio selection."\r
+#endif\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                Radio Family 1 / Radio Family 2 / Radio Family 5\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#if (defined MRFI_RADIO_FAMILY1) || (defined MRFI_RADIO_FAMILY2) || (defined MRFI_RADIO_FAMILY5)\r
+\r
+#    define __mrfi_LENGTH_FIELD_SIZE__      1\r
+#    define __mrfi_ADDR_SIZE__              4\r
+#    define __mrfi_MAX_PAYLOAD_SIZE__       20\r
+\r
+#    define __mrfi_RX_METRICS_SIZE__        2\r
+#    define __mrfi_RX_METRICS_RSSI_OFS__    0\r
+#    define __mrfi_RX_METRICS_CRC_LQI_OFS__ 1\r
+#    define __mrfi_RX_METRICS_CRC_OK_MASK__ 0x80\r
+#    define __mrfi_RX_METRICS_LQI_MASK__    0x7F\r
+\r
+#    define __mrfi_NUM_LOGICAL_CHANS__      4\r
+#    define __mrfi_NUM_POWER_SETTINGS__     3\r
+\r
+#    define __mrfi_BACKOFF_PERIOD_USECS__   250\r
+\r
+#    define __mrfi_LENGTH_FIELD_OFS__       0\r
+#    define __mrfi_DST_ADDR_OFS__           (__mrfi_LENGTH_FIELD_OFS__ + __mrfi_LENGTH_FIELD_SIZE__)\r
+#    define __mrfi_SRC_ADDR_OFS__           (__mrfi_DST_ADDR_OFS__ + __mrfi_ADDR_SIZE__)\r
+#    define __mrfi_PAYLOAD_OFS__            (__mrfi_SRC_ADDR_OFS__ + __mrfi_ADDR_SIZE__)\r
+\r
+#    define __mrfi_HEADER_SIZE__            (2 * __mrfi_ADDR_SIZE__)\r
+#    define __mrfi_FRAME_OVERHEAD_SIZE__    (__mrfi_LENGTH_FIELD_SIZE__ + __mrfi_HEADER_SIZE__)\r
+\r
+#    define __mrfi_GET_PAYLOAD_LEN__(p)     ((p)->frame[__mrfi_LENGTH_FIELD_OFS__] - \\r
+                                             __mrfi_HEADER_SIZE__)\r
+#    define __mrfi_SET_PAYLOAD_LEN__(p, x)   st( \\r
+        (p)->frame[__mrfi_LENGTH_FIELD_OFS__] = x + __mrfi_HEADER_SIZE__; )\r
+\r
+#endif\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                Radio Family 3 / Radio Family 4 / Radio Family 6\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#if (defined MRFI_RADIO_FAMILY3) || (defined MRFI_RADIO_FAMILY4) || (defined MRFI_RADIO_FAMILY6)\r
+\r
+#    define __mrfi_LENGTH_FIELD_SIZE__      1\r
+#    define __mrfi_FCF_SIZE__               2\r
+#    define __mrfi_DSN_SIZE__               1\r
+#    define __mrfi_ADDR_SIZE__              4\r
+#    define __mrfi_MAX_PAYLOAD_SIZE__       20\r
+\r
+#    define __mrfi_RX_METRICS_SIZE__        2\r
+#    define __mrfi_RX_METRICS_RSSI_OFS__    0\r
+#    define __mrfi_RX_METRICS_CRC_LQI_OFS__ 1\r
+#    define __mrfi_RX_METRICS_CRC_OK_MASK__ 0x80\r
+#    define __mrfi_RX_METRICS_LQI_MASK__    0x7F\r
+\r
+#    define __mrfi_NUM_LOGICAL_CHANS__      4\r
+#    define __mrfi_NUM_POWER_SETTINGS__     3\r
+\r
+#    define __mrfi_BACKOFF_PERIOD_USECS__   250\r
+\r
+#    define __mrfi_LENGTH_FIELD_OFS__       0\r
+#    define __mrfi_FCF_OFS__                (__mrfi_LENGTH_FIELD_OFS__ + \\r
+                                             __mrfi_LENGTH_FIELD_SIZE__)\r
+#    define __mrfi_DSN_OFS__                (__mrfi_FCF_OFS__          +  __mrfi_FCF_SIZE__)\r
+#    define __mrfi_DST_ADDR_OFS__           (__mrfi_DSN_OFS__          +  __mrfi_DSN_SIZE__)\r
+#    define __mrfi_SRC_ADDR_OFS__           (__mrfi_DST_ADDR_OFS__     +  __mrfi_ADDR_SIZE__)\r
+#    define __mrfi_PAYLOAD_OFS__            (__mrfi_SRC_ADDR_OFS__     +  __mrfi_ADDR_SIZE__)\r
+\r
+#    define __mrfi_HEADER_SIZE__            ((2 * \\r
+                                              __mrfi_ADDR_SIZE__) + __mrfi_FCF_SIZE__ + \\r
+                                             __mrfi_DSN_SIZE__)\r
+#    define __mrfi_FRAME_OVERHEAD_SIZE__    (__mrfi_LENGTH_FIELD_SIZE__ + __mrfi_HEADER_SIZE__)\r
+\r
+#    define __mrfi_GET_PAYLOAD_LEN__(p)     ((p)->frame[__mrfi_LENGTH_FIELD_OFS__] - \\r
+                                             __mrfi_HEADER_SIZE__)\r
+#    define __mrfi_SET_PAYLOAD_LEN__(p, x)   st( \\r
+        (p)->frame[__mrfi_LENGTH_FIELD_OFS__] = x + __mrfi_HEADER_SIZE__; )\r
+\r
+#endif\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                   Radio Family Commonality\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#define __mrfi_P_DST_ADDR__(p)          (&((p)->frame[__mrfi_DST_ADDR_OFS__]))\r
+#define __mrfi_P_SRC_ADDR__(p)          (&((p)->frame[__mrfi_SRC_ADDR_OFS__]))\r
+#define __mrfi_P_PAYLOAD__(p)           (&((p)->frame[__mrfi_PAYLOAD_OFS__]))\r
+\r
+\r
+/* ************************************************************************************************\r
+ *                                   Compile Time Integrity Checks\r
+ * ************************************************************************************************\r
+ */\r
+\r
+/* verify that only one supported radio is selected */\r
+#define MRFI_NUM_SUPPORTED_RADIOS_SELECTED   ((defined MRFI_CC1100) + \\r
+                                              (defined MRFI_CC1101) + \\r
+                                              (defined MRFI_CC1110) + \\r
+                                              (defined MRFI_CC1111) + \\r
+                                              (defined MRFI_CC1100E_470) + \\r
+                                              (defined MRFI_CC1100E_950) + \\r
+                                              (defined MRFI_CC2500) + \\r
+                                              (defined MRFI_CC2510) + \\r
+                                              (defined MRFI_CC2511) + \\r
+                                              (defined MRFI_CC2430) + \\r
+                                              (defined MRFI_CC2431) + \\r
+                                              (defined MRFI_CC2520) + \\r
+                                              (defined MRFI_CC430)  + \\r
+                                              (defined MRFI_CC2530))\r
+#if (MRFI_NUM_SUPPORTED_RADIOS_SELECTED == 0)\r
+#    error "ERROR: A valid radio is not selected."\r
+#elif (MRFI_NUM_SUPPORTED_RADIOS_SELECTED > 1)\r
+#    error "ERROR: More than one radio is selected."\r
+#endif\r
+\r
+/* verify that a radio family is selected */\r
+#if (!defined MRFI_RADIO_FAMILY1) && \\r
+    (!defined MRFI_RADIO_FAMILY2) && \\r
+    (!defined MRFI_RADIO_FAMILY3) && \\r
+    (!defined MRFI_RADIO_FAMILY4) && \\r
+    (!defined MRFI_RADIO_FAMILY5) && \\r
+    (!defined MRFI_RADIO_FAMILY6)\r
+#    error "ERROR: A radio family has not been assigned."\r
+#endif\r
+\r
+\r
+/**************************************************************************************************\r
+ */\r
+#endif\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/Components/mrfi/radios/family5/mrfi_radio.c b/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/Components/mrfi/radios/family5/mrfi_radio.c
new file mode 100755 (executable)
index 0000000..5569553
--- /dev/null
@@ -0,0 +1,1824 @@
+/**************************************************************************************************\r
+*  Revised:        $Date: 2009-11-23 07:50:43 -0800 (Mon, 23 Nov 2009) $\r
+*  Revision:       $Revision: 21225 $\r
+*\r
+*  Copyright 2008-2009 Texas Instruments Incorporated.  All rights reserved.\r
+*\r
+*  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+*  the terms of a software license agreement between the user who downloaded the software,\r
+*  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+*  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+*  License. The License limits your use, and you acknowledge, that the Software may not be\r
+*  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+*  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+*  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+*  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+*  perform, display or sell this Software and/or its documentation for any purpose.\r
+*\r
+*  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS?\r
+*  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+*  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+*  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+*  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+*  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+*  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+*  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+*  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+*\r
+*  Should you have any questions regarding your right to use this Software,\r
+*  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+/* ~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=\r
+ *   MRFI (Minimal RF Interface)\r
+ *   Radios: CC430\r
+ *   Primary code file for supported radios.\r
+ * ~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=\r
+ */\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                          Includes\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#include <string.h>\r
+#include "mrfi.h"\r
+#include "bsp.h"\r
+#include "bsp_macros.h"\r
+#include "bsp_external/mrfi_board_defs.h"\r
+#include "mrfi_defs.h"\r
+#include "mrfi_radio_interface.h"\r
+#include "smartrf/CC430/smartrf_CC430.h"\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                    Global Constants\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+const uint8_t mrfiBroadcastAddr[] = { 0xFF, 0xFF, 0xFF, 0xFF };\r
+\r
+/* verify number of table entries matches the corresponding #define */\r
+BSP_STATIC_ASSERT(MRFI_ADDR_SIZE ==\r
+                  ((sizeof(mrfiBroadcastAddr) /\r
+                    sizeof(mrfiBroadcastAddr[0])) * sizeof(mrfiBroadcastAddr[0])));\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                          Defines\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#if (defined MRFI_CC430)\r
+#    define MRFI_RSSI_OFFSET    74 /* no units */\r
+#else\r
+#    error "ERROR: RSSI offset value not defined for this radio"\r
+#endif\r
+\r
+#define MRFI_LENGTH_FIELD_OFS               __mrfi_LENGTH_FIELD_OFS__\r
+#define MRFI_LENGTH_FIELD_SIZE              __mrfi_LENGTH_FIELD_SIZE__\r
+#define MRFI_HEADER_SIZE                    __mrfi_HEADER_SIZE__\r
+#define MRFI_FRAME_BODY_OFS                 __mrfi_DST_ADDR_OFS__\r
+#define MRFI_BACKOFF_PERIOD_USECS           __mrfi_BACKOFF_PERIOD_USECS__\r
+\r
+#define MRFI_RANDOM_OFFSET                   67\r
+#define MRFI_RANDOM_MULTIPLIER              109\r
+#define MRFI_MIN_SMPL_FRAME_SIZE            (MRFI_HEADER_SIZE + NWK_HDR_SIZE)\r
+\r
+/* rx metrics definitions, known as appended "packet status bytes" in datasheet parlance */\r
+#define MRFI_RX_METRICS_CRC_OK_MASK         __mrfi_RX_METRICS_CRC_OK_MASK__\r
+#define MRFI_RX_METRICS_LQI_MASK            __mrfi_RX_METRICS_LQI_MASK__\r
+\r
+\r
+/* ---------- Radio Abstraction ---------- */\r
+\r
+#define MRFI_RADIO_PARTNUM          0x00\r
+#define MRFI_RADIO_VERSION          0x06\r
+\r
+/* GDO0 == PA_PD signal */\r
+#define MRFI_SETTING_IOCFG0     27\r
+\r
+/* GDO1 == RSSI_VALID signal */\r
+#define MRFI_SETTING_IOCFG1     30\r
+\r
+/* Main Radio Control State Machine control configuration:\r
+ * Auto Calibrate - when going from IDLE to RX/TX\r
+ * XOSC is OFF in Sleep state.\r
+ */\r
+#define MRFI_SETTING_MCSM0      (0x10)\r
+\r
+/* Main Radio Control State Machine control configuration:\r
+ * - Remain RX state after RX\r
+ * - Go to IDLE after TX\r
+ * - RSSI below threshold and NOT receiving.\r
+ */\r
+#define MRFI_SETTING_MCSM1      0x3C\r
+\r
+/*\r
+ *  Packet Length - Setting for maximum allowed packet length.\r
+ *  The PKTLEN setting does not include the length field but maximum frame size does.\r
+ *  Subtract length field size from maximum frame size to get value for PKTLEN.\r
+ */\r
+#define MRFI_SETTING_PKTLEN     (MRFI_MAX_FRAME_SIZE - MRFI_LENGTH_FIELD_SIZE)\r
+\r
+/* Packet automation control - Original value except WHITE_DATA is extracted from SmartRF setting.\r
+ **/\r
+#define MRFI_SETTING_PKTCTRL0   (0x05 | (SMARTRF_SETTING_PKTCTRL0 & BV(6)))\r
+\r
+/* FIFO threshold - this register has fields that need to be configured for the CC1101 */\r
+#define MRFI_SETTING_FIFOTHR    (0x07 | (SMARTRF_SETTING_FIFOTHR & (BV(4) | BV(5) | BV(6) | BV(7))))\r
+\r
+/* Max time we can be in a critical section within the delay function.\r
+ * This could be fine-tuned by observing the overhead is calling the bsp delay\r
+ * function. The overhead should be very small compared to this value.\r
+ */\r
+#define MRFI_MAX_DELAY_US 16 /* usec */\r
+\r
+/* Packet automation control - base value is power up value whick has APPEND_STATUS enabled; no CRC\r
+ *autoflush */\r
+#define PKTCTRL1_BASE_VALUE         BV(2)\r
+#define PKTCTRL1_ADDR_FILTER_OFF    PKTCTRL1_BASE_VALUE\r
+#define PKTCTRL1_ADDR_FILTER_ON     (PKTCTRL1_BASE_VALUE | (BV(0) | BV(1)))\r
+\r
+#ifdef MRFI_ASSERTS_ARE_ON\r
+#    define RX_FILTER_ADDR_INITIAL_VALUE  0xFF\r
+#endif\r
+\r
+/* The SW timer is calibrated by adjusting the call to the microsecond delay\r
+ * routine. This allows maximum calibration control with repects to the longer\r
+ * times requested by applicationsd and decouples internal from external calls\r
+ * to the microsecond routine which can be calibrated independently.\r
+ */\r
+#if defined(SW_TIMER)\r
+#    define APP_USEC_VALUE    1000\r
+#else\r
+#    define APP_USEC_VALUE    1000\r
+#endif\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                           Macros\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#define MRFI_ENABLE_SYNC_PIN_INT()                  (RF1AIE |= BV(9))\r
+#define MRFI_DISABLE_SYNC_PIN_INT()                 (RF1AIE &= ~BV(9))\r
+#define MRFI_CLEAR_SYNC_PIN_INT_FLAG()              (RF1AIFG &= ~BV(9))\r
+#define MRFI_SYNC_PIN_INT_IS_ENABLED()              (RF1AIE & BV(9))\r
+#define MRFI_SYNC_PIN_IS_HIGH()                     (RF1AIN & BV(9))\r
+#define MRFI_SYNC_PIN_INT_FLAG_IS_SET()             (RF1AIFG & BV(9))\r
+\r
+\r
+#define MRFI_CLEAR_PAPD_PIN_INT_FLAG()              (RF1AIFG &= ~BV(0))\r
+#define MRFI_PAPD_PIN_IS_HIGH()                     (RF1AIN & BV(0))\r
+#define MRFI_PAPD_INT_FLAG_IS_SET()                 (RF1AIFG & BV(0))\r
+\r
+\r
+/* RSSI valid signal is available on the GDO_1 */\r
+#define MRFI_RSSI_VALID_WAIT()  while (!(RF1AIN & BV(1))) ;\r
+\r
+\r
+/* Abstract radio interface calls. Could use these later to\r
+ * merge code from similar radio but different interface.\r
+ */\r
+#define MRFI_STROBE(cmd)                      mrfiRadioInterfaceCmdStrobe(cmd)\r
+#define MRFI_RADIO_REG_READ(reg)              mrfiRadioInterfaceReadReg(reg)\r
+#define MRFI_RADIO_REG_WRITE(reg, value)      mrfiRadioInterfaceWriteReg(reg, value)\r
+#define MRFI_RADIO_WRITE_TX_FIFO(pData, len)  mrfiRadioInterfaceWriteTxFifo(pData, len)\r
+#define MRFI_RADIO_READ_RX_FIFO(pData, len)   mrfiRadioInterfaceReadRxFifo(pData, len)\r
+\r
+\r
+#define MRFI_STROBE_IDLE_AND_WAIT()              \\r
+    {                                                \\r
+        MRFI_STROBE(SIDLE);                          \\r
+        /* Wait for XOSC to be stable and radio in IDLE state */ \\r
+        while (MRFI_STROBE(SNOP) & 0xF0) ;           \\r
+    }\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                    Local Constants\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+const uint8_t mrfiRadioCfg[][2] =\r
+{\r
+    /* internal radio configuration */\r
+    {  IOCFG0,    MRFI_SETTING_IOCFG0       }, /* Configure GDO_0 to output PA_PD signal (low during\r
+                                                *TX, high otherwise). */\r
+    {  IOCFG1,    MRFI_SETTING_IOCFG1       }, /* Configure GDO_1 to output RSSI_VALID signal (high\r
+                                                *when RSSI is valid, low otherwise). */\r
+    {  MCSM1,     MRFI_SETTING_MCSM1        }, /* CCA mode, RX_OFF_MODE and TX_OFF_MODE */\r
+    {  MCSM0,     MRFI_SETTING_MCSM0        }, /* AUTO_CAL and XOSC state in sleep */\r
+    {  PKTLEN,    MRFI_SETTING_PKTLEN       },\r
+    {  PKTCTRL0,  MRFI_SETTING_PKTCTRL0     },\r
+    {  FIFOTHR,   MRFI_SETTING_FIFOTHR      },\r
+\r
+    /* imported SmartRF radio configuration */\r
+\r
+    {  FSCTRL1,   SMARTRF_SETTING_FSCTRL1   },\r
+    {  FSCTRL0,   SMARTRF_SETTING_FSCTRL0   },\r
+    {  FREQ2,     SMARTRF_SETTING_FREQ2     },\r
+    {  FREQ1,     SMARTRF_SETTING_FREQ1     },\r
+    {  FREQ0,     SMARTRF_SETTING_FREQ0     },\r
+    {  MDMCFG4,   SMARTRF_SETTING_MDMCFG4   },\r
+    {  MDMCFG3,   SMARTRF_SETTING_MDMCFG3   },\r
+    {  MDMCFG2,   SMARTRF_SETTING_MDMCFG2   },\r
+    {  MDMCFG1,   SMARTRF_SETTING_MDMCFG1   },\r
+    {  MDMCFG0,   SMARTRF_SETTING_MDMCFG0   },\r
+    {  DEVIATN,   SMARTRF_SETTING_DEVIATN   },\r
+    {  FOCCFG,    SMARTRF_SETTING_FOCCFG    },\r
+    {  BSCFG,     SMARTRF_SETTING_BSCFG     },\r
+    {  AGCCTRL2,  SMARTRF_SETTING_AGCCTRL2  },\r
+    {  AGCCTRL1,  SMARTRF_SETTING_AGCCTRL1  },\r
+    {  AGCCTRL0,  SMARTRF_SETTING_AGCCTRL0  },\r
+    {  FREND1,    SMARTRF_SETTING_FREND1    },\r
+    {  FREND0,    SMARTRF_SETTING_FREND0    },\r
+    {  FSCAL3,    SMARTRF_SETTING_FSCAL3    },\r
+    {  FSCAL2,    SMARTRF_SETTING_FSCAL2    },\r
+    {  FSCAL1,    SMARTRF_SETTING_FSCAL1    },\r
+    {  FSCAL0,    SMARTRF_SETTING_FSCAL0    },\r
+    {  TEST2,     SMARTRF_SETTING_TEST2     },\r
+    {  TEST1,     SMARTRF_SETTING_TEST1     },\r
+    {  TEST0,     SMARTRF_SETTING_TEST0     },\r
+};\r
+\r
+\r
+/*\r
+ *  Logical channel table - this table translates logical channel into\r
+ *  actual radio channel number.  Channel 0, the default channel, is\r
+ *  determined by the channel exported from SmartRF Studio.  The other\r
+ *  table entries are derived from that default.  Each derived channel is\r
+ *  masked with 0xFF to prevent generation of an illegal channel number.\r
+ *\r
+ *  This table is easily customized.  Just replace or add entries as needed.\r
+ *  If the number of entries changes, the corresponding #define must also\r
+ *  be adjusted.  It is located in mrfi_defs.h and is called __mrfi_NUM_LOGICAL_CHANS__.\r
+ *  The static assert below ensures that there is no mismatch.\r
+ */\r
+// [BM] Changed channel assignment to comply with local regulations\r
+#ifdef ISM_EU\r
+static const uint8_t mrfiLogicalChanTable[] =\r
+{\r
+    0,\r
+    50,\r
+    80,\r
+    110\r
+};\r
+#else\r
+#    ifdef ISM_US\r
+static const uint8_t mrfiLogicalChanTable[] =\r
+{\r
+    20,\r
+    50,\r
+    80,\r
+    110\r
+};\r
+#    else\r
+#        ifdef ISM_LF\r
+static const uint8_t mrfiLogicalChanTable[] =\r
+{\r
+    0,\r
+    50,\r
+    80,\r
+    110\r
+};\r
+#        else\r
+#            error "Wrong ISM band specified (valid are ISM_LF, ISM_EU and ISM_US)"\r
+#        endif\r
+#    endif\r
+#endif\r
+//static const uint8_t mrfiLogicalChanTable[] =\r
+//{\r
+//  SMARTRF_SETTING_CHANNR,\r
+//  50,\r
+//  80,\r
+//  110\r
+//};\r
+/* verify number of table entries matches the corresponding #define */\r
+BSP_STATIC_ASSERT(__mrfi_NUM_LOGICAL_CHANS__ ==\r
+                  ((sizeof(mrfiLogicalChanTable) /\r
+                    sizeof(mrfiLogicalChanTable[0])) * sizeof(mrfiLogicalChanTable[0])));\r
+\r
+/*\r
+ *  RF Power setting table - this table translates logical power value\r
+ *  to radio register setting.  The logical power value is used directly\r
+ *  as an index into the power setting table. The values in the table are\r
+ *  from low to high. The default settings set 3 values: -20 dBm, -10 dBm,\r
+ *  and 0 dBm. The default at startup is the highest value. Note that these\r
+ *  are approximate depending on the radio. Information is taken from the\r
+ *  data sheet.\r
+ *\r
+ *  This table is easily customized.  Just replace or add entries as needed.\r
+ *  If the number of entries changes, the corresponding #define must also\r
+ *  be adjusted.  It is located in mrfi_defs.h and is called __mrfi_NUM_POWER_SETTINGS__.\r
+ *  The static assert below ensures that there is no mismatch.\r
+ *\r
+ * For the CC430 use the CC1100 values.\r
+ */\r
+static const uint8_t mrfiRFPowerTable[] =\r
+{\r
+    // [BM] Changed default output power to comply with dongle settings\r
+    0x0F,\r
+    0x27,\r
+    // [BM] Increase output power from -0.3dBm to +1.4dBm (433MHz) / +1.1dBm (868MHz) / +1.3dBm\r
+    // (915MHz) to compensate antenna loss\r
+#ifdef ISM_EU\r
+    0x8C\r
+#else\r
+#    ifdef ISM_US\r
+    0x8B\r
+#    else\r
+#        ifdef ISM_LF\r
+    0x8D\r
+#        else\r
+#            error "Wrong ISM band specified (valid are ISM_LF, ISM_EU and ISM_US)"\r
+#        endif\r
+#    endif\r
+#endif\r
+};\r
+//static const uint8_t mrfiRFPowerTable[] =\r
+//{\r
+//  0x0D,\r
+//  0x34,\r
+//  0x8E\r
+//};\r
+\r
+/* verify number of table entries matches the corresponding #define */\r
+BSP_STATIC_ASSERT(__mrfi_NUM_POWER_SETTINGS__ ==\r
+                  ((sizeof(mrfiRFPowerTable) /\r
+                    sizeof(mrfiRFPowerTable[0])) * sizeof(mrfiRFPowerTable[0])));\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                       Local Prototypes\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+static void Mrfi_SyncPinRxIsr(void);\r
+static void Mrfi_RxModeOn(void);\r
+static void Mrfi_RandomBackoffDelay(void);\r
+static void Mrfi_RxModeOff(void);\r
+static void Mrfi_DelayUsec(uint16_t howLong);\r
+static void Mrfi_DelayUsecSem(uint16_t howLong);\r
+static int8_t Mrfi_CalculateRssi(uint8_t rawValue);\r
+static uint8_t Mrfi_RxAddrIsFiltered(uint8_t * pAddr);\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                       Local Variables\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+static uint8_t mrfiRadioState  = MRFI_RADIO_STATE_UNKNOWN;\r
+static mrfiPacket_t mrfiIncomingPacket;\r
+static uint8_t mrfiRndSeed = 0;\r
+\r
+/* reply delay support */\r
+static volatile uint8_t sKillSem = 0;\r
+static volatile uint8_t sReplyDelayContext = 0;\r
+static uint16_t sReplyDelayScalar = 0;\r
+static uint16_t sBackoffHelper = 0;\r
+\r
+static uint8_t mrfiRxFilterEnabled = 0;\r
+static uint8_t mrfiRxFilterAddr[MRFI_ADDR_SIZE] = { RX_FILTER_ADDR_INITIAL_VALUE };\r
+\r
+/* These counters are only for diagnostic purpose */\r
+static uint32_t crcFail = 0;\r
+static uint32_t crcPass = 0;\r
+static uint32_t noFrame = 0;\r
+\r
+// [BM] Radio frequency offset read from calibration memory\r
+// Compensates crystal deviation from 26MHz nominal value\r
+extern unsigned char rf_frequoffset;\r
+\r
+/**************************************************************************************************\r
+ * @fn          MRFI_Init\r
+ *\r
+ * @brief       Initialize MRFI.\r
+ *\r
+ * @param       none\r
+ *\r
+ * @return      none\r
+ **************************************************************************************************\r
+ */\r
+\r
+void MRFI_Init(void)\r
+{\r
+    /* ------------------------------------------------------------------\r
+     *    Radio power-up reset\r
+     *   ----------------------\r
+     */\r
+    memset(&mrfiIncomingPacket, 0x0, sizeof(mrfiIncomingPacket));\r
+\r
+    /* Initialize the radio interface */\r
+    mrfiRadioInterfaceInit();\r
+\r
+    /* Strobe Reset: Resets the radio and puts it in SLEEP state. */\r
+    MRFI_STROBE(SRES);\r
+\r
+    /* verify the correct radio is installed */\r
+    MRFI_ASSERT(MRFI_RADIO_REG_READ(PARTNUM) == MRFI_RADIO_PARTNUM);    /* incorrect radio specified\r
+                                                                         **/\r
+    MRFI_ASSERT(MRFI_RADIO_REG_READ(VERSION) == MRFI_RADIO_VERSION);    /* incorrect radio specified\r
+                                                                         * */\r
+\r
+    /* Put radio in Idle state */\r
+    MRFI_STROBE_IDLE_AND_WAIT();\r
+\r
+\r
+    /* ------------------------------------------------------------------\r
+     *    Configure radio\r
+     *   -----------------\r
+     */\r
+\r
+    /* Configure Radio interrupts:\r
+     *\r
+     * RF1AIN_0 => Programmed to PA_PD signal.\r
+     *             Configure it to interrupt on falling edge.\r
+     *\r
+     * RF1AIN_1 => Programmed to RSSI Valid signal.\r
+     *             No need to configure for interrupt. This value will be read\r
+     *             through polling.\r
+     *\r
+     * RF1AIN_9 => Rising edge indicates SYNC sent/received and\r
+     *             Falling edge indicates end of packet.\r
+     *             Configure it to interrupt on falling edge.\r
+     */\r
+\r
+    /* Select Interrupt edge for PA_PD and SYNC signal:\r
+     * Interrupt Edge select register: 1 == Interrupt on High to Low transition.\r
+     */\r
+    RF1AIES = BV(0) | BV(9);\r
+\r
+    /* Write the power output to the PA_TABLE and verify the write operation.  */\r
+    {\r
+        uint8_t readbackPATableValue = 0;\r
+        bspIState_t s;\r
+\r
+        BSP_ENTER_CRITICAL_SECTION(s);\r
+\r
+        while (!(RF1AIFCTL1 & RFINSTRIFG)) ;\r
+        RF1AINSTRW = 0x7E51;                /* PA Table write (burst) */\r
+\r
+        while (!(RF1AIFCTL1 & RFINSTRIFG)) ;\r
+        RF1AINSTRB = RF_SNOP;               /* reset pointer */\r
+\r
+        while (!(RF1AIFCTL1 & RFINSTRIFG)) ;\r
+        RF1AINSTRB = 0xFE;                  /* PA Table read (burst) */\r
+\r
+        while (!(RF1AIFCTL1 & RFDINIFG)) ;\r
+        RF1ADINB    = 0x00;                 /* dummy write */\r
+\r
+        while (!(RF1AIFCTL1 & RFDOUTIFG)) ;\r
+        readbackPATableValue = RF1ADOUT0B;\r
+\r
+        MRFI_ASSERT(readbackPATableValue == 0x51);\r
+\r
+        while (!(RF1AIFCTL1 & RFINSTRIFG)) ;\r
+        RF1AINSTRB = RF_SNOP;\r
+\r
+        BSP_EXIT_CRITICAL_SECTION(s);\r
+    }\r
+\r
+    /* initialize radio registers */\r
+    {\r
+        uint8_t i;\r
+\r
+        for (i = 0; i < (sizeof(mrfiRadioCfg) / sizeof(mrfiRadioCfg[0])); i++)\r
+        {\r
+            MRFI_RADIO_REG_WRITE(mrfiRadioCfg[i][0], mrfiRadioCfg[i][1]);\r
+        }\r
+    }\r
+\r
+    /* Confirm that the values were written correctly.\r
+     */\r
+    {\r
+        uint8_t i;\r
+\r
+        for (i = 0; i < (sizeof(mrfiRadioCfg) / sizeof(mrfiRadioCfg[0])); i++)\r
+        {\r
+            MRFI_ASSERT(mrfiRadioCfg[i][1] == MRFI_RADIO_REG_READ(mrfiRadioCfg[i][0]));\r
+        }\r
+    }\r
+\r
+    // [BM] Apply global frequency offset to FSCTRL0\r
+    MRFI_STROBE_IDLE_AND_WAIT();\r
+    MRFI_RADIO_REG_WRITE(FSCTRL0, rf_frequoffset);\r
+\r
+    /* set default channel */\r
+    MRFI_SetLogicalChannel(0);\r
+\r
+    /* Set default power level */\r
+    MRFI_SetRFPwr(MRFI_NUM_POWER_SETTINGS - 1);\r
+\r
+    /* Generate Random seed:\r
+     * We will use the RSSI value to generate our random seed.\r
+     */\r
+\r
+    /* Put the radio in RX state */\r
+    MRFI_STROBE(SRX);\r
+\r
+    /* delay for the rssi to be valid */\r
+    MRFI_RSSI_VALID_WAIT();\r
+\r
+    {\r
+        uint8_t i;\r
+        for (i = 0; i < 16; i++)\r
+        {\r
+            /* use most random bit of rssi to populate the random seed */\r
+            mrfiRndSeed = (mrfiRndSeed << 1) | (MRFI_RADIO_REG_READ(RSSI) & 0x01);\r
+        }\r
+    }\r
+\r
+    /* Force the seed to be non-zero by setting one bit, just in case... */\r
+    mrfiRndSeed |= 0x0080;\r
+\r
+    /* Turn off RF. */\r
+    Mrfi_RxModeOff();\r
+\r
+    /* Strobe Power Down (SPWD): puts the radio in SLEEP state. */\r
+\r
+    /* Chip bug: Radio does not come out of this SLEEP when put to sleep\r
+     * using the SPWD cmd. However, it does wakes up if SXOFF was used to\r
+     * put it to sleep.\r
+     */\r
+    MRFI_STROBE(SXOFF);\r
+\r
+    /* Initial radio state is IDLE state */\r
+    mrfiRadioState = MRFI_RADIO_STATE_OFF;\r
+\r
+    /*****************************************************************************************\r
+     *                            Compute reply delay scalar\r
+     *\r
+     * Formula from data sheet for all the narrow band radios is:\r
+     *\r
+     *                (256 + DATAR_Mantissa) * 2^(DATAR_Exponent)\r
+     * DATA_RATE =    ------------------------------------------ * f(xosc)\r
+     *                                    2^28\r
+     *\r
+     * To try and keep some accuracy we change the exponent of the denominator\r
+     * to (28 - (exponent from the configuration register)) so we do a division\r
+     * by a smaller number. We find the power of 2 by shifting.\r
+     *\r
+     * The maximum delay needed depends on the MAX_APP_PAYLOAD parameter. Figure\r
+     * out how many bits that will be when overhead is included. Bits/bits-per-second\r
+     * is seconds to transmit (or receive) the maximum frame. We multiply this number\r
+     * by 1000 to find the time in milliseconds. We then additionally multiply by\r
+     * 10 so we can add 5 and divide by 10 later, thus rounding up to the number of\r
+     * milliseconds. This last won't matter for slow transmissions but for faster ones\r
+     * we want to err on the side of being conservative and making sure the radio is on\r
+     * to receive the reply. The semaphore monitor will shut it down. The delay adds in\r
+     * a fudge factor that includes processing time on peer plus lags in Rx and processing\r
+     * time on receiver's side.\r
+     *\r
+     * Note that we assume a 26 MHz clock for the radio...\r
+     * ***************************************************************************************\r
+     */\r
+#define   MRFI_RADIO_OSC_FREQ         26000000\r
+#define   PHY_PREAMBLE_SYNC_BYTES     8\r
+\r
+    {\r
+        uint32_t dataRate, bits;\r
+        uint16_t exponent, mantissa;\r
+\r
+        /* mantissa is in MDMCFG3 */\r
+        mantissa = 256 + SMARTRF_SETTING_MDMCFG3;\r
+\r
+        /* exponent is lower nibble of MDMCFG4. */\r
+        exponent = 28 - (SMARTRF_SETTING_MDMCFG4 & 0x0F);\r
+\r
+        /* we can now get data rate */\r
+        dataRate = mantissa * (MRFI_RADIO_OSC_FREQ >> exponent);\r
+\r
+        bits = ((uint32_t)((PHY_PREAMBLE_SYNC_BYTES + MRFI_MAX_FRAME_SIZE) * 8)) * 10000;\r
+\r
+        /* processing on the peer + the Tx/Rx time plus more */\r
+        sReplyDelayScalar = PLATFORM_FACTOR_CONSTANT + (((bits / dataRate) + 5) / 10);\r
+\r
+        /* This helper value is used to scale the backoffs during CCA. At very\r
+         * low data rates we need to backoff longer to prevent continual sampling\r
+         * of valid frames which take longer to send at lower rates. Use the scalar\r
+         * we just calculated divided by 32. With the backoff algorithm backing\r
+         * off up to 16 periods this will result in waiting up to about 1/2 the total\r
+         * scalar value. For high data rates this does not contribute at all. Value\r
+         * is in microseconds.\r
+         */\r
+        sBackoffHelper = MRFI_BACKOFF_PERIOD_USECS + (sReplyDelayScalar >> 5) * 1000;\r
+    }\r
+\r
+    /* Clean out buffer to protect against spurious frames */\r
+    memset(mrfiIncomingPacket.frame, 0x00, sizeof(mrfiIncomingPacket.frame));\r
+    memset(mrfiIncomingPacket.rxMetrics, 0x00, sizeof(mrfiIncomingPacket.rxMetrics));\r
+\r
+    /* enable global interrupts */\r
+    BSP_ENABLE_INTERRUPTS();\r
+}\r
+\r
+/**************************************************************************************************\r
+ * @fn          MRFI_Transmit\r
+ *\r
+ * @brief       Transmit a packet using CCA algorithm.\r
+ *\r
+ * @param       pPacket - pointer to packet to transmit\r
+ *\r
+ * @return      Return code indicates success or failure of transmit:\r
+ *                  MRFI_TX_RESULT_SUCCESS - transmit succeeded\r
+ *                  MRFI_TX_RESULT_FAILED  - transmit failed because CCA failed\r
+ **************************************************************************************************\r
+ */\r
+\r
+uint8_t MRFI_Transmit(mrfiPacket_t * pPacket, uint8_t txType)\r
+{\r
+    uint8_t ccaRetries;\r
+    uint8_t txBufLen;\r
+    uint8_t returnValue = MRFI_TX_RESULT_SUCCESS;\r
+\r
+    /* radio must be awake to transmit */\r
+    MRFI_ASSERT(mrfiRadioState != MRFI_RADIO_STATE_OFF);\r
+\r
+    /* Turn off reciever. We can ignore/drop incoming packets during transmit. */\r
+    Mrfi_RxModeOff();\r
+\r
+    /* compute number of bytes to write to transmit FIFO */\r
+    txBufLen = pPacket->frame[MRFI_LENGTH_FIELD_OFS] + MRFI_LENGTH_FIELD_SIZE;\r
+\r
+    /* ------------------------------------------------------------------\r
+     *    Write packet to transmit FIFO\r
+     *   --------------------------------\r
+     */\r
+    MRFI_RADIO_WRITE_TX_FIFO(&(pPacket->frame[0]), txBufLen);\r
+\r
+\r
+    /* ------------------------------------------------------------------\r
+     *    Immediate transmit\r
+     *   ---------------------\r
+     */\r
+    if (txType == MRFI_TX_TYPE_FORCED)\r
+    {\r
+        /* Issue the TX strobe. */\r
+        MRFI_STROBE(STX);\r
+\r
+        /* Wait for transmit to complete */\r
+        while (!MRFI_SYNC_PIN_INT_FLAG_IS_SET()) ;\r
+\r
+        /* Clear the interrupt flag */\r
+        MRFI_CLEAR_SYNC_PIN_INT_FLAG();\r
+    }\r
+    else\r
+    {\r
+        /* ------------------------------------------------------------------\r
+         *    CCA transmit\r
+         *   ---------------\r
+         */\r
+\r
+        MRFI_ASSERT(txType == MRFI_TX_TYPE_CCA);\r
+\r
+        /* set number of CCA retries */\r
+        ccaRetries = MRFI_CCA_RETRIES;\r
+\r
+\r
+        /* ===============================================================================\r
+         *    Main Loop\r
+         *  =============\r
+         */\r
+        for (;;)\r
+        {\r
+            /* Radio must be in RX mode for CCA to happen.\r
+             * Otherwise it will transmit without CCA happening.\r
+             */\r
+\r
+            /* Can not use the Mrfi_RxModeOn() function here since it turns on the\r
+             * Rx interrupt, which we don't want in this case.\r
+             */\r
+            MRFI_STROBE(SRX);\r
+\r
+            /* wait for the rssi to be valid. */\r
+            MRFI_RSSI_VALID_WAIT();\r
+\r
+            /*\r
+             *  Clear the PA_PD pin interrupt flag.  This flag, not the interrupt itself,\r
+             *  is used to capture the transition that indicates a transmit was started.\r
+             *  The pin level cannot be used to indicate transmit success as timing may\r
+             *  prevent the transition from being detected.  The interrupt latch captures\r
+             *  the event regardless of timing.\r
+             */\r
+            MRFI_CLEAR_PAPD_PIN_INT_FLAG();\r
+\r
+            /* send strobe to initiate transmit */\r
+            MRFI_STROBE(STX);\r
+\r
+            /* Delay long enough for the PA_PD signal to indicate a\r
+             * successful transmit. This is the 250 XOSC periods\r
+             * (9.6 us for a 26 MHz crystal).\r
+             * Found out that we need a delay of atleast 25 us on CC1100 to see\r
+             * the PA_PD signal change. Hence keeping the same for CC430\r
+             */\r
+            Mrfi_DelayUsec(25);\r
+\r
+\r
+            /* PA_PD signal goes from HIGH to LOW when going from RX to TX state.\r
+             * This transition is trapped as a falling edge interrupt flag\r
+             * to indicate that CCA passed and the transmit has started.\r
+             */\r
+            if (MRFI_PAPD_INT_FLAG_IS_SET())\r
+            {\r
+                /* ------------------------------------------------------------------\r
+                 *    Clear Channel Assessment passed.\r
+                 *   ----------------------------------\r
+                 */\r
+\r
+                /* Clear the PA_PD int flag */\r
+                MRFI_CLEAR_PAPD_PIN_INT_FLAG();\r
+\r
+                /* PA_PD signal stays LOW while in TX state and goes back to HIGH when\r
+                 * the radio transitions to RX state.\r
+                 */\r
+                /* wait for transmit to complete */\r
+                while (!MRFI_PAPD_PIN_IS_HIGH()) ;\r
+\r
+                /* transmit done, break */\r
+                break;\r
+            }\r
+            else\r
+            {\r
+                /* ------------------------------------------------------------------\r
+                 *    Clear Channel Assessment failed.\r
+                 *   ----------------------------------\r
+                 */\r
+\r
+                /* Turn off radio and save some power during backoff */\r
+\r
+                /* NOTE: Can't use Mrfi_RxModeOff() - since it tries to update the\r
+                 * sync signal status which we are not using during the TX operation.\r
+                 */\r
+                MRFI_STROBE_IDLE_AND_WAIT();\r
+\r
+                /* flush the receive FIFO of any residual data */\r
+                MRFI_STROBE(SFRX);\r
+\r
+                /* Retry ? */\r
+                if (ccaRetries != 0)\r
+                {\r
+                    /* delay for a random number of backoffs */\r
+                    Mrfi_RandomBackoffDelay();\r
+\r
+                    /* decrement CCA retries before loop continues */\r
+                    ccaRetries--;\r
+                }\r
+                else /* No CCA retries are left, abort */\r
+                {\r
+                    /* set return value for failed transmit and break */\r
+                    returnValue = MRFI_TX_RESULT_FAILED;\r
+                    break;\r
+                }\r
+            }        /* CCA Failed */\r
+        }            /* CCA loop */\r
+    }                /* txType is CCA */\r
+\r
+\r
+    /* Done with TX. Clean up time... */\r
+\r
+    /* Radio is already in IDLE state */\r
+\r
+    /*\r
+     * Flush the transmit FIFO.  It must be flushed so that\r
+     * the next transmit can start with a clean slate.\r
+     */\r
+    MRFI_STROBE(SFTX);\r
+\r
+    /* If the radio was in RX state when transmit was attempted,\r
+     * put it back to Rx On state.\r
+     */\r
+    if (mrfiRadioState == MRFI_RADIO_STATE_RX)\r
+    {\r
+        Mrfi_RxModeOn();\r
+    }\r
+\r
+    return (returnValue);\r
+}\r
+\r
+/**************************************************************************************************\r
+ * @fn          MRFI_Receive\r
+ *\r
+ * @brief       Copies last packet received to the location specified.\r
+ *              This function is meant to be called after the ISR informs\r
+ *              higher level code that there is a newly received packet.\r
+ *\r
+ * @param       pPacket - pointer to location of where to copy received packet\r
+ *\r
+ * @return      none\r
+ **************************************************************************************************\r
+ */\r
+\r
+void MRFI_Receive(mrfiPacket_t * pPacket)\r
+{\r
+    *pPacket = mrfiIncomingPacket;\r
+}\r
+\r
+/**************************************************************************************************\r
+ * @fn          Mrfi_SyncPinRxIsr\r
+ *\r
+ * @brief       This interrupt is called when the SYNC signal transition from high to low.\r
+ *              The sync signal is routed to the sync pin which is a GPIO pin.  This high-to-low\r
+ *              transition signifies a receive has completed.  The SYNC signal also goes from\r
+ *              high to low when a transmit completes.   This is protected against within the\r
+ *              transmit function by disabling sync pin interrupts until transmit completes.\r
+ *\r
+ * @param       none\r
+ *\r
+ * @return      none\r
+ **************************************************************************************************\r
+ */\r
+\r
+static void Mrfi_SyncPinRxIsr(void)\r
+{\r
+    uint8_t frameLen = 0x00;\r
+    uint8_t rxBytes;\r
+\r
+    /* We should receive this interrupt only in RX state\r
+     * Should never receive it if RX was turned On only for\r
+     * some internal mrfi processing like - during CCA.\r
+     * Otherwise something is terribly wrong.\r
+     */\r
+    MRFI_ASSERT(mrfiRadioState == MRFI_RADIO_STATE_RX);\r
+\r
+    /* ------------------------------------------------------------------\r
+     *    Get RXBYTES\r
+     *   -------------\r
+     */\r
+\r
+    /*\r
+     *  Read the RXBYTES register from the radio.\r
+     *  Bit description of RXBYTES register:\r
+     *    bit 7     - RXFIFO_OVERFLOW, set if receive overflow occurred\r
+     *    bits 6:0  - NUM_BYTES, number of bytes in receive FIFO\r
+     *\r
+     *  Due a chip bug, the RXBYTES register must read the same value twice\r
+     *  in a row to guarantee an accurate value.\r
+     */\r
+    {\r
+        uint8_t rxBytesVerify;\r
+\r
+        rxBytesVerify = MRFI_RADIO_REG_READ(RXBYTES);\r
+\r
+        do\r
+        {\r
+            rxBytes = rxBytesVerify;\r
+            rxBytesVerify = MRFI_RADIO_REG_READ(RXBYTES);\r
+        }\r
+        while (rxBytes != rxBytesVerify);\r
+    }\r
+\r
+\r
+    /* ------------------------------------------------------------------\r
+     *    FIFO empty?\r
+     *   -------------\r
+     */\r
+\r
+    /*\r
+     *  See if the receive FIFIO is empty before attempting to read from it.\r
+     *  It is possible nothing the FIFO is empty even though the interrupt fired.\r
+     *  This can happen if address check is enabled and a non-matching packet is\r
+     *  received.  In that case, the radio automatically removes the packet from\r
+     *  the FIFO.\r
+     */\r
+    if (rxBytes == 0)\r
+    {\r
+        /* receive FIFO is empty - do nothing, skip to end */\r
+    }\r
+    else\r
+    {\r
+        /* receive FIFO is not empty, continue processing */\r
+\r
+        /* ------------------------------------------------------------------\r
+         *    Process frame length\r
+         *   ----------------------\r
+         */\r
+\r
+        /* read the first byte from FIFO - the packet length */\r
+        MRFI_RADIO_READ_RX_FIFO(&frameLen, MRFI_LENGTH_FIELD_SIZE);\r
+\r
+\r
+        /*\r
+         *  Make sure that the frame length just read corresponds to number of bytes in the buffer.\r
+         *  If these do not match up something is wrong.\r
+         *\r
+         *  This can happen for several reasons:\r
+         *   1) Incoming packet has an incorrect format or is corrupted.\r
+         *   2) The receive FIFO overflowed.  Overflow is indicated by the high\r
+         *      bit of rxBytes.  This guarantees the value of rxBytes value will not\r
+         *      match the number of bytes in the FIFO for overflow condition.\r
+         *   3) Interrupts were blocked for an abnormally long time which\r
+         *      allowed a following packet to at least start filling the\r
+         *      receive FIFO.  In this case, all received and partially received\r
+         *      packets will be lost - the packet in the FIFO and the packet coming in.\r
+         *      This is the price the user pays if they implement a giant\r
+         *      critical section.\r
+         *   4) A failed transmit forced radio to IDLE state to flush the transmit FIFO.\r
+         *      This could cause an active receive to be cut short.\r
+         *\r
+         *  Also check the sanity of the length to guard against rogue frames.\r
+         */\r
+        if ((rxBytes != (frameLen + MRFI_LENGTH_FIELD_SIZE + MRFI_RX_METRICS_SIZE))           ||\r
+            ((frameLen + MRFI_LENGTH_FIELD_SIZE) > MRFI_MAX_FRAME_SIZE) ||\r
+            (frameLen < MRFI_MIN_SMPL_FRAME_SIZE)\r
+            )\r
+        {\r
+            bspIState_t s;\r
+            noFrame++;\r
+\r
+            /* mismatch between bytes-in-FIFO and frame length */\r
+\r
+            /*\r
+             *  Flush receive FIFO to reset receive.  Must go to IDLE state to do this.\r
+             *  The critical section guarantees a transmit does not occur while cleaning up.\r
+             */\r
+            BSP_ENTER_CRITICAL_SECTION(s);\r
+            MRFI_STROBE_IDLE_AND_WAIT();\r
+            MRFI_STROBE(SFRX);\r
+            MRFI_STROBE(SRX);\r
+            BSP_EXIT_CRITICAL_SECTION(s);\r
+\r
+            /* flush complete, skip to end */\r
+        }\r
+        else\r
+        {\r
+            /* bytes-in-FIFO and frame length match up - continue processing */\r
+\r
+            /* ------------------------------------------------------------------\r
+             *    Get packet\r
+             *   ------------\r
+             */\r
+\r
+            /* clean out buffer to help protect against spurious frames */\r
+            memset(mrfiIncomingPacket.frame, 0x00, sizeof(mrfiIncomingPacket.frame));\r
+\r
+            /* set length field */\r
+            mrfiIncomingPacket.frame[MRFI_LENGTH_FIELD_OFS] = frameLen;\r
+\r
+            /* get packet from FIFO */\r
+            MRFI_RADIO_READ_RX_FIFO(&(mrfiIncomingPacket.frame[MRFI_FRAME_BODY_OFS]), frameLen);\r
+\r
+            /* get receive metrics from FIFO */\r
+            MRFI_RADIO_READ_RX_FIFO(&(mrfiIncomingPacket.rxMetrics[0]), MRFI_RX_METRICS_SIZE);\r
+\r
+\r
+            /* ------------------------------------------------------------------\r
+             *    CRC check\r
+             *   ------------\r
+             */\r
+\r
+            /*\r
+             *  Note!  Automatic CRC check is not, and must not, be enabled.  This feature\r
+             *  flushes the *entire* receive FIFO when CRC fails.  If this feature is\r
+             *  enabled it is possible to be reading from the FIFO and have a second\r
+             *  receive occur that fails CRC and automatically flushes the receive FIFO.\r
+             *  This could cause reads from an empty receive FIFO which puts the radio\r
+             *  into an undefined state.\r
+             */\r
+\r
+            /* determine if CRC failed */\r
+            if (!(mrfiIncomingPacket.rxMetrics[MRFI_RX_METRICS_CRC_LQI_OFS] &\r
+                  MRFI_RX_METRICS_CRC_OK_MASK))\r
+            {\r
+                /* CRC failed - do nothing, skip to end */\r
+                crcFail++;\r
+            }\r
+            else\r
+            {\r
+                /* CRC passed - continue processing */\r
+                crcPass++;\r
+\r
+                /* ------------------------------------------------------------------\r
+                 *    Filtering\r
+                 *   -----------\r
+                 */\r
+\r
+                /* if address is not filtered, receive is successful */\r
+                if (!Mrfi_RxAddrIsFiltered(MRFI_P_DST_ADDR(&mrfiIncomingPacket)))\r
+                {\r
+                    {\r
+                        /* ------------------------------------------------------------------\r
+                         *    Receive successful\r
+                         *   --------------------\r
+                         */\r
+\r
+                        /* Convert the raw RSSI value and do offset compensation for this radio */\r
+                        mrfiIncomingPacket.rxMetrics[MRFI_RX_METRICS_RSSI_OFS] =\r
+                            Mrfi_CalculateRssi(mrfiIncomingPacket.rxMetrics[\r
+                                                   MRFI_RX_METRICS_RSSI_OFS]);\r
+\r
+                        /* Remove the CRC valid bit from the LQI byte */\r
+                        mrfiIncomingPacket.rxMetrics[MRFI_RX_METRICS_CRC_LQI_OFS] =\r
+                            (mrfiIncomingPacket.rxMetrics[MRFI_RX_METRICS_CRC_LQI_OFS] &\r
+                             MRFI_RX_METRICS_LQI_MASK);\r
+\r
+\r
+                        /* call external, higher level "receive complete" processing routine */\r
+                        MRFI_RxCompleteISR();\r
+                    }\r
+                }\r
+            }\r
+        }\r
+    }\r
+\r
+    /* ------------------------------------------------------------------\r
+     *    End of function\r
+     *   -------------------\r
+     */\r
+\r
+}\r
+\r
+/**************************************************************************************************\r
+ * @fn          Mrfi_RxModeOn\r
+ *\r
+ * @brief       Put radio into receive mode.\r
+ *\r
+ * @param       none\r
+ *\r
+ * @return      none\r
+ **************************************************************************************************\r
+ */\r
+\r
+static void Mrfi_RxModeOn(void)\r
+{\r
+    /* clear any residual receive interrupt */\r
+    MRFI_CLEAR_SYNC_PIN_INT_FLAG();\r
+\r
+    /* send strobe to enter receive mode */\r
+    MRFI_STROBE(SRX);\r
+\r
+    /* enable receive interrupts */\r
+    MRFI_ENABLE_SYNC_PIN_INT();\r
+}\r
+\r
+/**************************************************************************************************\r
+ * @fn          MRFI_RxOn\r
+ *\r
+ * @brief       Turn on the receiver.  No harm is done if this function is called when\r
+ *              receiver is already on.\r
+ *\r
+ * @param       none\r
+ *\r
+ * @return      none\r
+ **************************************************************************************************\r
+ */\r
+\r
+void MRFI_RxOn(void)\r
+{\r
+    /* radio must be awake before we can move it to RX state */\r
+    MRFI_ASSERT(mrfiRadioState != MRFI_RADIO_STATE_OFF);\r
+\r
+    /* if radio is off, turn it on */\r
+    if (mrfiRadioState != MRFI_RADIO_STATE_RX)\r
+    {\r
+        mrfiRadioState = MRFI_RADIO_STATE_RX;\r
+        Mrfi_RxModeOn();\r
+    }\r
+}\r
+\r
+/**************************************************************************************************\r
+ * @fn          Mrfi_RxModeOff\r
+ *\r
+ * @brief       -\r
+ *\r
+ * @param       none\r
+ *\r
+ * @return      none\r
+ **************************************************************************************************\r
+ */\r
+\r
+static void Mrfi_RxModeOff(void)\r
+{\r
+    /* disable receive interrupts */\r
+    MRFI_DISABLE_SYNC_PIN_INT();\r
+\r
+    /* turn off radio */\r
+    MRFI_STROBE_IDLE_AND_WAIT();\r
+\r
+    /* flush the receive FIFO of any residual data */\r
+    MRFI_STROBE(SFRX);\r
+\r
+    /* clear receive interrupt */\r
+    MRFI_CLEAR_SYNC_PIN_INT_FLAG();\r
+}\r
+\r
+/**************************************************************************************************\r
+ * @fn          MRFI_RxIdle\r
+ *\r
+ * @brief       Put radio in idle mode (receiver if off).  No harm is done this function is\r
+ *              called when radio is already idle.\r
+ *\r
+ * @param       none\r
+ *\r
+ * @return      none\r
+ **************************************************************************************************\r
+ */\r
+\r
+void MRFI_RxIdle(void)\r
+{\r
+    /* radio must be awake to move it to idle mode */\r
+    MRFI_ASSERT(mrfiRadioState != MRFI_RADIO_STATE_OFF);\r
+\r
+    /* if radio is on, turn it off */\r
+    if (mrfiRadioState == MRFI_RADIO_STATE_RX)\r
+    {\r
+        Mrfi_RxModeOff();\r
+        mrfiRadioState = MRFI_RADIO_STATE_IDLE;\r
+    }\r
+}\r
+\r
+/**************************************************************************************************\r
+ * @fn          MRFI_Sleep\r
+ *\r
+ * @brief       Request radio go to sleep.\r
+ *\r
+ * @param       none\r
+ *\r
+ * @return      none\r
+ **************************************************************************************************\r
+ */\r
+\r
+void MRFI_Sleep(void)\r
+{\r
+    bspIState_t s;\r
+\r
+    /* Critical section necessary for watertight testing and\r
+     * setting of state variables.\r
+     */\r
+    BSP_ENTER_CRITICAL_SECTION(s);\r
+\r
+    /* If radio is not asleep, put it to sleep */\r
+    if (mrfiRadioState != MRFI_RADIO_STATE_OFF)\r
+    {\r
+        /* go to idle so radio is in a known state before sleeping */\r
+        MRFI_RxIdle();\r
+\r
+        /* Strobe Power Down (SPWD): puts the radio in SLEEP state. */\r
+\r
+        /* Chip bug: Radio does not come out of this SLEEP when put to sleep\r
+         * using the SPWD cmd. However, it does wakes up if SXOFF was used to\r
+         * put it to sleep.\r
+         */\r
+        MRFI_STROBE(SXOFF);\r
+\r
+        /* Our new state is OFF */\r
+        mrfiRadioState = MRFI_RADIO_STATE_OFF;\r
+    }\r
+\r
+    BSP_EXIT_CRITICAL_SECTION(s);\r
+}\r
+\r
+/**************************************************************************************************\r
+ * @fn          MRFI_WakeUp\r
+ *\r
+ * @brief       Wake up radio from sleep state.\r
+ *\r
+ * @param       none\r
+ *\r
+ * @return      none\r
+ **************************************************************************************************\r
+ */\r
+\r
+void MRFI_WakeUp(void)\r
+{\r
+    /* if radio is already awake, just ignore wakeup request */\r
+    if (mrfiRadioState != MRFI_RADIO_STATE_OFF)\r
+    {\r
+        return;\r
+    }\r
+\r
+    MRFI_STROBE_IDLE_AND_WAIT();\r
+\r
+    /* enter idle mode */\r
+    mrfiRadioState = MRFI_RADIO_STATE_IDLE;\r
+}\r
+\r
+/**************************************************************************************************\r
+ * @fn          MRFI_RadioIsr\r
+ *\r
+ * @brief       Radio Interface interrupts as well as Radio interrupts are\r
+ *              mapped to this interrupt vector.\r
+ *\r
+ * @param       -\r
+ *\r
+ * @return      -\r
+ **************************************************************************************************\r
+ */\r
+// [BM] Changed because CC1101_VECTOR ISR is declared of source code and this handler is called\r
+// indirect\r
+//BSP_ISR_FUNCTION( MRFI_RadioIsr, CC1101_VECTOR )\r
+void MRFI_RadioIsr(void)\r
+{\r
+    uint16_t coreIntSource = RF1AIV;          /* Radio Core      interrupt register */\r
+    uint16_t interfaceIntSource = RF1AIFIV;   /* Radio Interface interrupt register */\r
+\r
+    /* Interface interrupt */\r
+    if (interfaceIntSource)\r
+    {\r
+        if (interfaceIntSource == RF1AIFIV_RFERRIFG)\r
+        {\r
+            uint16_t interfaceError = RF1AIFERRV;\r
+\r
+            if (interfaceError == RF1AIFERRV_LVERR)\r
+            {\r
+                /* Low core voltage error */\r
+            }\r
+            else if (interfaceError == RF1AIFERRV_OPERR)\r
+            {\r
+                /* Operand error */\r
+            }\r
+            else if (interfaceError == RF1AIFERRV_OUTERR)\r
+            {\r
+                /* output data not available error */\r
+            }\r
+            else if (interfaceError == RF1AIFERRV_OPOVERR)\r
+            {\r
+                /* Operand overwrite error */\r
+            }\r
+            else\r
+            {\r
+                /* Can't possibly happen. If interface error flag was set,\r
+                 * then one of the interface errors must be set.\r
+                 */\r
+                MRFI_FORCE_ASSERT();\r
+            }\r
+\r
+            /* Assert anyways. No error handling implemented. */\r
+            MRFI_FORCE_ASSERT();\r
+        }\r
+        else\r
+        {\r
+            /* Not expecting any other interface interrupts (data in/out, status/instr in, fifo\r
+             *rx/tx) */\r
+            MRFI_FORCE_ASSERT();\r
+        }\r
+    }\r
+\r
+    /* Radio Core interrupt */\r
+    if (coreIntSource)\r
+    {\r
+        /* Check for SYNC interrupt */\r
+        if (coreIntSource == RF1AIV_RFIFG9)\r
+        {\r
+            if (MRFI_SYNC_PIN_INT_IS_ENABLED())\r
+            {\r
+                /*  clear the sync pin interrupt, run sync pin ISR */\r
+\r
+                /*\r
+                 *  NOTE!  The following macro clears the interrupt flag but it also *must*\r
+                 *  reset the interrupt capture.  In other words, if a second interrupt\r
+                 *  occurs after the flag is cleared it must be processed, i.e. this interrupt\r
+                 *  exits then immediately starts again.  Most microcontrollers handle this\r
+                 *  naturally but it must be verified for every target.\r
+                 */\r
+                MRFI_CLEAR_SYNC_PIN_INT_FLAG();\r
+\r
+                Mrfi_SyncPinRxIsr();\r
+            }\r
+            else\r
+            {\r
+                /* Fatal error. SYNC interrupt is not supposed to happen at this time. */\r
+                MRFI_FORCE_ASSERT();\r
+            }\r
+        }\r
+        else\r
+        {\r
+            /* Fatal error. No other Radio interurpt is enabled. */\r
+            MRFI_FORCE_ASSERT();\r
+        }\r
+    }\r
+}\r
+\r
+/**************************************************************************************************\r
+ * @fn          MRFI_Rssi\r
+ *\r
+ * @brief       Returns "live" RSSI value\r
+ *\r
+ * @param       none\r
+ *\r
+ * @return      RSSI value in units of dBm.\r
+ **************************************************************************************************\r
+ */\r
+\r
+int8_t MRFI_Rssi(void)\r
+{\r
+    uint8_t regValue;\r
+\r
+    /* Radio must be in RX state to measure rssi. */\r
+    MRFI_ASSERT(mrfiRadioState == MRFI_RADIO_STATE_RX);\r
+\r
+    /* Wait for the RSSI to be valid:\r
+     * Just having the Radio ON is not enough to read\r
+     * the correct RSSI value. The Radio must in RX mode for\r
+     * a certain duration. This duration depends on\r
+     * the baud rate and the received signal strength itself.\r
+     */\r
+    MRFI_RSSI_VALID_WAIT();\r
+\r
+    /* Read the RSSI value */\r
+    regValue = MRFI_RADIO_REG_READ(RSSI);\r
+\r
+    /* convert and do offset compensation */\r
+    return (Mrfi_CalculateRssi(regValue));\r
+}\r
+\r
+/**************************************************************************************************\r
+ * @fn          Mrfi_CalculateRssi\r
+ *\r
+ * @brief       Does binary to decimal conversion and offset compensation.\r
+ *\r
+ * @param       none\r
+ *\r
+ * @return      RSSI value in units of dBm.\r
+ **************************************************************************************************\r
+ */\r
+\r
+int8_t Mrfi_CalculateRssi(uint8_t rawValue)\r
+{\r
+    int16_t rssi;\r
+\r
+    /* The raw value is in 2's complement and in half db steps. Convert it to\r
+     * decimal taking into account the offset value.\r
+     */\r
+    if (rawValue >= 128)\r
+    {\r
+        rssi = (int16_t)(rawValue - 256) / 2 - MRFI_RSSI_OFFSET;\r
+    }\r
+    else\r
+    {\r
+        rssi = (rawValue / 2) - MRFI_RSSI_OFFSET;\r
+    }\r
+\r
+    /* Restrict this value to least value can be held in an 8 bit signed int */\r
+    if (rssi < -128)\r
+    {\r
+        rssi = -128;\r
+    }\r
+\r
+    return rssi;\r
+}\r
+\r
+/**************************************************************************************************\r
+ * @fn          MRFI_RandomByte\r
+ *\r
+ * @brief       Returns a random byte. This is a pseudo-random number generator.\r
+ *              The generated sequence will repeat every 256 values.\r
+ *              The sequence itself depends on the initial seed value.\r
+ *\r
+ * @param       none\r
+ *\r
+ * @return      a random byte\r
+ **************************************************************************************************\r
+ */\r
+\r
+uint8_t MRFI_RandomByte(void)\r
+{\r
+    mrfiRndSeed = (mrfiRndSeed * MRFI_RANDOM_MULTIPLIER) + MRFI_RANDOM_OFFSET;\r
+\r
+    return mrfiRndSeed;\r
+}\r
+\r
+/**************************************************************************************************\r
+ * @fn          Mrfi_RandomBackoffDelay\r
+ *\r
+ * @brief       -\r
+ *\r
+ * @param       none\r
+ *\r
+ * @return      none\r
+ **************************************************************************************************\r
+ */\r
+\r
+static void Mrfi_RandomBackoffDelay(void)\r
+{\r
+    uint8_t backoffs;\r
+    uint8_t i;\r
+\r
+    /* calculate random value for backoffs - 1 to 16 */\r
+    backoffs = (MRFI_RandomByte() & 0x0F) + 1;\r
+\r
+    /* delay for randomly computed number of backoff periods */\r
+    for (i = 0; i < backoffs; i++)\r
+    {\r
+        Mrfi_DelayUsec(sBackoffHelper);\r
+    }\r
+}\r
+\r
+/****************************************************************************************************\r
+ * @fn          Mrfi_DelayUsec\r
+ *\r
+ * @brief       Execute a delay loop using HW timer. The macro actually used to do the delay\r
+ *              is not thread-safe. This routine makes the delay execution thread-safe by breaking\r
+ *              up the requested delay up into small chunks and executing each chunk as a critical\r
+ *              section. The chunk size is choosen to be the smallest value used by MRFI. The delay\r
+ *              is only approximate because of the overhead computations. It errs on the side of\r
+ *              being too long.\r
+ *\r
+ * input parameters\r
+ * @param   howLong - number of microseconds to delay\r
+ *\r
+ * @return      none\r
+ ****************************************************************************************************\r
+ */\r
+\r
+static void Mrfi_DelayUsec(uint16_t howLong)\r
+{\r
+    bspIState_t s;\r
+    uint16_t count = howLong / MRFI_MAX_DELAY_US;\r
+\r
+    if (howLong)\r
+    {\r
+        do\r
+        {\r
+            BSP_ENTER_CRITICAL_SECTION(s);\r
+            BSP_DELAY_USECS(MRFI_MAX_DELAY_US);\r
+            BSP_EXIT_CRITICAL_SECTION(s);\r
+        } while (count--);\r
+    }\r
+\r
+    return;\r
+}\r
+\r
+/****************************************************************************************************\r
+ * @fn          Mrfi_DelayUsecSem\r
+ *\r
+ * @brief       Execute a delay loop using a HW timer. See comments for Mrfi_DelayUsec().\r
+ *              Delay specified number of microseconds checking semaphore for\r
+ *              early-out. Run in a separate thread when the reply delay is\r
+ *              invoked. Cleaner then trying to make MRFI_DelayUsec() thread-safe\r
+ *              and reentrant.\r
+ *\r
+ * input parameters\r
+ * @param   howLong - number of microseconds to delay\r
+ *\r
+ * @return      none\r
+ ****************************************************************************************************\r
+ */\r
+\r
+static void Mrfi_DelayUsecSem(uint16_t howLong)\r
+{\r
+    bspIState_t s;\r
+    uint16_t count = howLong / MRFI_MAX_DELAY_US;\r
+\r
+    if (howLong)\r
+    {\r
+        do\r
+        {\r
+            BSP_ENTER_CRITICAL_SECTION(s);\r
+            BSP_DELAY_USECS(MRFI_MAX_DELAY_US);\r
+            BSP_EXIT_CRITICAL_SECTION(s);\r
+            if (sKillSem)\r
+            {\r
+                break;\r
+            }\r
+        } while (count--);\r
+    }\r
+\r
+    return;\r
+}\r
+\r
+/**************************************************************************************************\r
+ * @fn          MRFI_DelayMs\r
+ *\r
+ * @brief       Delay the specified number of milliseconds.\r
+ *\r
+ * @param       milliseconds - delay time\r
+ *\r
+ * @return      none\r
+ **************************************************************************************************\r
+ */\r
+\r
+void MRFI_DelayMs(uint16_t milliseconds)\r
+{\r
+    while (milliseconds)\r
+    {\r
+        Mrfi_DelayUsec(APP_USEC_VALUE);\r
+        milliseconds--;\r
+    }\r
+}\r
+\r
+/**************************************************************************************************\r
+ * @fn          MRFI_ReplyDelay\r
+ *\r
+ * @brief       Delay number of milliseconds scaled by data rate. Check semaphore for\r
+ *              early-out. Run in a separate thread when the reply delay is\r
+ *              invoked. Cleaner then trying to make MRFI_DelayMs() thread-safe\r
+ *              and reentrant.\r
+ *\r
+ * @param       none\r
+ *\r
+ * @return      none\r
+ **************************************************************************************************\r
+ */\r
+\r
+void MRFI_ReplyDelay(void)\r
+{\r
+    bspIState_t s;\r
+    uint16_t milliseconds = sReplyDelayScalar;\r
+\r
+    BSP_ENTER_CRITICAL_SECTION(s);\r
+    sReplyDelayContext = 1;\r
+    BSP_EXIT_CRITICAL_SECTION(s);\r
+\r
+    while (milliseconds)\r
+    {\r
+        Mrfi_DelayUsecSem(APP_USEC_VALUE);\r
+        if (sKillSem)\r
+        {\r
+            break;\r
+        }\r
+        milliseconds--;\r
+    }\r
+\r
+    BSP_ENTER_CRITICAL_SECTION(s);\r
+    sKillSem           = 0;\r
+    sReplyDelayContext = 0;\r
+    BSP_EXIT_CRITICAL_SECTION(s);\r
+}\r
+\r
+/**************************************************************************************************\r
+ * @fn          MRFI_PostKillSem\r
+ *\r
+ * @brief       Post to the loop-kill semaphore that will be checked by the iteration loops\r
+ *              that control the delay thread.\r
+ *\r
+ * @param       none\r
+ *\r
+ * @return      none\r
+ **************************************************************************************************\r
+ */\r
+\r
+void MRFI_PostKillSem(void)\r
+{\r
+\r
+    if (sReplyDelayContext)\r
+    {\r
+        sKillSem = 1;\r
+    }\r
+\r
+    return;\r
+}\r
+\r
+/**************************************************************************************************\r
+ * @fn          MRFI_GetRadioState\r
+ *\r
+ * @brief       Returns the current radio state.\r
+ *\r
+ * @param       none\r
+ *\r
+ * @return      radio state - off/idle/rx\r
+ **************************************************************************************************\r
+ */\r
+\r
+uint8_t MRFI_GetRadioState(void)\r
+{\r
+    return mrfiRadioState;\r
+}\r
+\r
+/**************************************************************************************************\r
+ * @fn          MRFI_SetLogicalChannel\r
+ *\r
+ * @brief       Set logical channel.\r
+ *\r
+ * @param       chan - logical channel number\r
+ *\r
+ * @return      none\r
+ **************************************************************************************************\r
+ */\r
+\r
+void MRFI_SetLogicalChannel(uint8_t chan)\r
+{\r
+    /* logical channel is not valid? */\r
+    MRFI_ASSERT(chan < MRFI_NUM_LOGICAL_CHANS);\r
+\r
+    /* make sure radio is off before changing channels */\r
+    Mrfi_RxModeOff();\r
+\r
+    MRFI_RADIO_REG_WRITE(CHANNR, mrfiLogicalChanTable[chan]);\r
+\r
+    /* turn radio back on if it was on before channel change */\r
+    if (mrfiRadioState == MRFI_RADIO_STATE_RX)\r
+    {\r
+        Mrfi_RxModeOn();\r
+    }\r
+}\r
+\r
+/**************************************************************************************************\r
+ * @fn          MRFI_SetRFPwr\r
+ *\r
+ * @brief       Set ouput RF power level.\r
+ *\r
+ * @param       level - power level to be set\r
+ *\r
+ * @return      none\r
+ **************************************************************************************************\r
+ */\r
+\r
+void MRFI_SetRFPwr(uint8_t level)\r
+{\r
+    /* Power level is not valid? */\r
+    MRFI_ASSERT(level < MRFI_NUM_POWER_SETTINGS);\r
+\r
+    MRFI_RADIO_REG_WRITE(PATABLE, mrfiRFPowerTable[level]);\r
+\r
+    return;\r
+}\r
+\r
+/**************************************************************************************************\r
+ * @fn          MRFI_SetRxAddrFilter\r
+ *\r
+ * @brief       Set the address used for filtering received packets.\r
+ *\r
+ * @param       pAddr - pointer to address to use for filtering\r
+ *\r
+ * @return      zero     : successfully set filter address\r
+ *              non-zero : illegal address\r
+ **************************************************************************************************\r
+ */\r
+\r
+uint8_t MRFI_SetRxAddrFilter(uint8_t * pAddr)\r
+{\r
+    /*\r
+     *  If first byte of filter address match fir byte of broadcast address,\r
+     *  there is a conflict with hardware filtering.\r
+     */\r
+    if (pAddr[0] == mrfiBroadcastAddr[0])\r
+    {\r
+        /* unable to set filter address */\r
+        return (1);\r
+    }\r
+\r
+    /*\r
+     *  Set the hardware address register.  The hardware address filtering only recognizes\r
+     *  a single byte but this does provide at least some automatic hardware filtering.\r
+     */\r
+    MRFI_RADIO_REG_WRITE(ADDR, pAddr[0]);\r
+\r
+    /* save a copy of the filter address */\r
+    {\r
+        uint8_t i;\r
+\r
+        for (i = 0; i < MRFI_ADDR_SIZE; i++)\r
+        {\r
+            mrfiRxFilterAddr[i] = pAddr[i];\r
+        }\r
+    }\r
+\r
+    /* successfully set filter address */\r
+    return (0);\r
+}\r
+\r
+/**************************************************************************************************\r
+ * @fn          MRFI_EnableRxAddrFilter\r
+ *\r
+ * @brief       Enable received packet filtering.\r
+ *\r
+ * @param       none\r
+ *\r
+ * @return      none\r
+ **************************************************************************************************\r
+ */\r
+\r
+void MRFI_EnableRxAddrFilter(void)\r
+{\r
+    MRFI_ASSERT(mrfiRxFilterAddr[0] != mrfiBroadcastAddr[0]); /* filter address must be set before\r
+                                                               *enabling filter */\r
+\r
+    /* set flag to indicate filtering is enabled */\r
+    mrfiRxFilterEnabled = 1;\r
+\r
+    /* enable hardware filtering on the radio */\r
+    MRFI_RADIO_REG_WRITE(PKTCTRL1, PKTCTRL1_ADDR_FILTER_ON);\r
+}\r
+\r
+/**************************************************************************************************\r
+ * @fn          MRFI_DisableRxAddrFilter\r
+ *\r
+ * @brief       Disable received packet filtering.\r
+ *\r
+ * @param       pAddr - pointer to address to test for filtering\r
+ *\r
+ * @return      none\r
+ **************************************************************************************************\r
+ */\r
+\r
+void MRFI_DisableRxAddrFilter(void)\r
+{\r
+    /* clear flag that indicates filtering is enabled */\r
+    mrfiRxFilterEnabled = 0;\r
+\r
+    /* disable hardware filtering on the radio */\r
+    MRFI_RADIO_REG_WRITE(PKTCTRL1, PKTCTRL1_ADDR_FILTER_OFF);\r
+}\r
+\r
+/**************************************************************************************************\r
+ * @fn          Mrfi_RxAddrIsFiltered\r
+ *\r
+ * @brief       Determine if address is filtered.\r
+ *\r
+ * @param       none\r
+ *\r
+ * @return      zero     : address is not filtered\r
+ *              non-zero : address is filtered\r
+ **************************************************************************************************\r
+ */\r
+\r
+uint8_t Mrfi_RxAddrIsFiltered(uint8_t * pAddr)\r
+{\r
+    uint8_t i;\r
+    uint8_t addrByte;\r
+    uint8_t filterAddrMatches;\r
+    uint8_t broadcastAddrMatches;\r
+\r
+    /* first check to see if filtering is even enabled */\r
+    if (!mrfiRxFilterEnabled)\r
+    {\r
+        /*\r
+         *  Filtering is not enabled, so by definition the address is\r
+         *  not filtered.  Return zero to indicate address is not filtered.\r
+         */\r
+        return (0);\r
+    }\r
+\r
+    /* clear address byte match counts */\r
+    filterAddrMatches    = 0;\r
+    broadcastAddrMatches = 0;\r
+\r
+    /* loop through address to see if there is a match to filter address of broadcast address */\r
+    for (i = 0; i < MRFI_ADDR_SIZE; i++)\r
+    {\r
+        /* get byte from address to check */\r
+        addrByte = pAddr[i];\r
+\r
+        /* compare byte to filter address byte */\r
+        if (addrByte == mrfiRxFilterAddr[i])\r
+        {\r
+            filterAddrMatches++;\r
+        }\r
+        if (addrByte == mrfiBroadcastAddr[i])\r
+        {\r
+            broadcastAddrMatches++;\r
+        }\r
+    }\r
+\r
+    /*\r
+     *  If address is *not* filtered, either the "filter address match count" or\r
+     *  the "broadcast address match count" will equal the total number of bytes\r
+     *  in the address.\r
+     */\r
+    if ((broadcastAddrMatches == MRFI_ADDR_SIZE) || (filterAddrMatches == MRFI_ADDR_SIZE))\r
+    {\r
+        /* address *not* filtered, return zero */\r
+        return (0);\r
+    }\r
+    else\r
+    {\r
+        /* address filtered, return non-zero */\r
+        return (1);\r
+    }\r
+}\r
+\r
+/**************************************************************************************************\r
+ *                                  Compile Time Integrity Checks\r
+ **************************************************************************************************\r
+ */\r
+\r
+/* calculate maximum value for PKTLEN and verify it directly */\r
+#define MRFI_RADIO_TX_FIFO_SIZE     64  /* from datasheet */\r
+#define MRFI_RADIO_MAX_PKTLEN       (MRFI_RADIO_TX_FIFO_SIZE - MRFI_LENGTH_FIELD_SIZE - \\r
+                                     MRFI_RX_METRICS_SIZE)\r
+#if (MRFI_RADIO_MAX_PKTLEN != 61)\r
+#    error "ERROR:  The maximum value for PKTLEN is not correct."\r
+#endif\r
+\r
+/* verify setting for PKTLEN does not exceed maximum */\r
+#if (MRFI_SETTING_PKTLEN > MRFI_RADIO_MAX_PKTLEN)\r
+#    error \\r
+    "ERROR:  Maximum possible value for PKTLEN exceeded.  Decrease value of maximum payload."\r
+#endif\r
+\r
+/* verify largest possible packet fits within FIFO buffer */\r
+#if ((MRFI_MAX_FRAME_SIZE + MRFI_RX_METRICS_SIZE) > MRFI_RADIO_TX_FIFO_SIZE)\r
+#    error \\r
+    "ERROR:  Maximum possible packet length exceeds FIFO buffer.  Decrease value of maximum payload."\r
+#endif\r
+\r
+/* verify that the SmartRF file supplied is compatible */\r
+#if ((!defined SMARTRF_RADIO_CC430))\r
+#    error "ERROR:  The SmartRF export file is not compatible."\r
+#endif\r
+\r
+/*\r
+ *  These asserts happen if there is extraneous compiler padding of arrays.\r
+ *  Modify compiler settings for no padding, or, if that is not possible,\r
+ *  comment out the offending asserts.\r
+ */\r
+BSP_STATIC_ASSERT(sizeof(mrfiRadioCfg) ==\r
+                  ((sizeof(mrfiRadioCfg) / sizeof(mrfiRadioCfg[0])) * sizeof(mrfiRadioCfg[0])));\r
+\r
+\r
+/*\r
+ *  These asserts happen if there is extraneous compiler padding of arrays.\r
+ *  Modify compiler settings for no padding, or, if that is not possible,\r
+ *  comment out the offending asserts.\r
+ */\r
+BSP_STATIC_ASSERT(sizeof(mrfiLogicalChanTable) ==\r
+                  ((sizeof(mrfiLogicalChanTable) /\r
+                    sizeof(mrfiLogicalChanTable[0])) * sizeof(mrfiLogicalChanTable[0])));\r
+BSP_STATIC_ASSERT(sizeof(mrfiBroadcastAddr) ==\r
+                  ((sizeof(mrfiBroadcastAddr) /\r
+                    sizeof(mrfiBroadcastAddr[0])) * sizeof(mrfiBroadcastAddr[0])));\r
+\r
+/**************************************************************************************************\r
+ */\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/Components/mrfi/radios/family5/mrfi_radio_interface.c b/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/Components/mrfi/radios/family5/mrfi_radio_interface.c
new file mode 100755 (executable)
index 0000000..a8a85f6
--- /dev/null
@@ -0,0 +1,373 @@
+/**************************************************************************************************\r
+*  Revised:        $Date: 2009-11-23 07:50:43 -0800 (Mon, 23 Nov 2009) $\r
+*  Revision:       $Revision: 21225 $\r
+*\r
+*  Copyright 2008-2009 Texas Instruments Incorporated.  All rights reserved.\r
+*\r
+*  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+*  the terms of a software license agreement between the user who downloaded the software,\r
+*  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+*  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+*  License. The License limits your use, and you acknowledge, that the Software may not be\r
+*  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+*  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+*  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+*  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+*  perform, display or sell this Software and/or its documentation for any purpose.\r
+*\r
+*  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS?\r
+*  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+*  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+*  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+*  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+*  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+*  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+*  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+*  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+*\r
+*  Should you have any questions regarding your right to use this Software,\r
+*  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+/* ~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=\r
+ *   MRFI (Minimal RF Interface)\r
+ *   Radios: CC430\r
+ *   Radio Interface (RIF) code.\r
+ * ~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=\r
+ */\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                          Includes\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#include "mrfi_radio_interface.h"\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                            Defines\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                            Macros\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#define MRFI_RADIO_STATUS_READ_CLEAR()  RF1AIFCTL1 &= ~(RFSTATIFG);\r
+\r
+#define MRFI_RADIO_STATUS_READ_WAIT()  while (!(RF1AIFCTL1 & RFSTATIFG)) ;\r
+#define MRFI_RADIO_INST_WRITE_WAIT()   while (!(RF1AIFCTL1 & RFINSTRIFG)) ;\r
+#define MRFI_RADIO_DATA_WRITE_WAIT()   while (!(RF1AIFCTL1 & RFDINIFG)) ;\r
+#define MRFI_RADIO_DATA_READ_WAIT()    while (!(RF1AIFCTL1 & RFDOUTIFG)) ;\r
+\r
+#define MRFI_RIF_DEBUG\r
+#ifdef MRFI_RIF_DEBUG\r
+#    define MRFI_RIF_ASSERT(x)      BSP_ASSERT(x)\r
+#else\r
+#    define MRFI_RIF_ASSERT(x)\r
+#endif\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                       Local Prototypes\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+\r
+\r
+/**************************************************************************************************\r
+ * @fn          mrfiRadioInterfaceInit\r
+ *\r
+ * @brief       Initialize the Radio Interface\r
+ *\r
+ * @param       none\r
+ *\r
+ * @return      none\r
+ **************************************************************************************************\r
+ */\r
+\r
+void mrfiRadioInterfaceInit(void)\r
+{\r
+    /* Enable interrupt on interface error.\r
+     * The code behaves differently between different runs on the debugger, and seemingly fails\r
+     * due to error flags on the bench. The code does not fail, however, on functional tests.\r
+     * This points to problems with the debugger that need to be sorted through carefully.\r
+     * For the time being, remove the following line, since it will likely cause operational\r
+     * failures.\r
+     */\r
+    // RF1AIFCTL1 |= RFERRIE;\r
+}\r
+\r
+/**************************************************************************************************\r
+ * @fn          mrfiRadioInterfaceCmdStrobe\r
+ *\r
+ * @brief       Send command strobe to the radio.  Returns status byte read during transfer\r
+ *              of strobe command.\r
+ *\r
+ * @param       addr - address of register to strobe\r
+ *\r
+ * @return      status byte of radio\r
+ **************************************************************************************************\r
+ */\r
+\r
+uint8_t mrfiRadioInterfaceCmdStrobe(uint8_t addr)\r
+{\r
+    uint8_t statusByte, gdoState;\r
+    mrfiRIFIState_t s;\r
+\r
+    /* Check for invalid address.\r
+     * 0xBD is for SNOP with MSP set to read the bytes available in RX FIFO.\r
+     */\r
+    MRFI_RIF_ASSERT((addr == 0xBD) || (addr >= RF_SRES) && (addr <= RF_SNOP));\r
+\r
+    /* Lock out access to Radio IF */\r
+    MRFI_RIF_ENTER_CRITICAL_SECTION(s);\r
+\r
+    /* Clear the Status read flag */\r
+    MRFI_RADIO_STATUS_READ_CLEAR();\r
+\r
+    /* Wait for radio to be ready for next instruction */\r
+    MRFI_RADIO_INST_WRITE_WAIT();\r
+\r
+    if ((addr > RF_SRES) && (addr < RF_SNOP))\r
+    {\r
+        /* buffer IOCFG2 state */\r
+        gdoState = MRFI_RADIO_REG_READ(IOCFG2);\r
+\r
+        /* c-ready to GDO2 */\r
+        MRFI_RADIO_REG_WRITE(IOCFG2, 0x29);\r
+\r
+        RF1AINSTRB = addr;\r
+\r
+        /* chip at sleep mode */\r
+        if ((RF1AIN & 0x04) == 0x04)\r
+        {\r
+            if ((addr == RF_SXOFF) || (addr == RF_SPWD) || (addr == RF_SWOR))\r
+            {\r
+                /* Do nothing */\r
+            }\r
+            else\r
+            {\r
+                /* c-ready */\r
+                while ((RF1AIN & 0x04) == 0x04) ;\r
+\r
+                /* Delay should be 760us */\r
+                Mrfi_DelayUsec(760);\r
+            }\r
+        }\r
+\r
+        /* restore IOCFG2 setting */\r
+        MRFI_RADIO_REG_WRITE(IOCFG2, gdoState);\r
+    }\r
+    else\r
+    {\r
+        /* chip active mode */\r
+        RF1AINSTRB = addr;\r
+    }\r
+\r
+    /* Read status byte */\r
+    statusByte = RF1ASTAT0B;\r
+\r
+    /* Allow access to Radio IF */\r
+    MRFI_RIF_EXIT_CRITICAL_SECTION(s);\r
+\r
+    /* return the status byte */\r
+    return statusByte;\r
+}\r
+\r
+/**************************************************************************************************\r
+ * @fn          mrfiRadioInterfaceReadReg\r
+ *\r
+ * @brief       Read value from radio register.\r
+ *\r
+ * @param       addr - address of register\r
+ *\r
+ * @return      register value\r
+ **************************************************************************************************\r
+ */\r
+\r
+uint8_t mrfiRadioInterfaceReadReg(uint8_t addr)\r
+{\r
+    mrfiRIFIState_t s;\r
+    uint8_t regValue;\r
+\r
+    /* Check for valid range. 0x3E is for PATABLE access */\r
+    MRFI_RIF_ASSERT((addr <= 0x3B) || (addr == 0x3E));\r
+\r
+    /* Lock out access to Radio IF */\r
+    MRFI_RIF_ENTER_CRITICAL_SECTION(s);\r
+\r
+    /* Wait for radio to be ready for next instruction */\r
+    MRFI_RADIO_INST_WRITE_WAIT();\r
+\r
+    if ((addr <= 0x2E) || (addr == 0x3E))\r
+    {\r
+        /* Write cmd: read the Configuration register */\r
+        RF1AINSTR1B = (0x80 | addr);\r
+    }\r
+    else\r
+    {\r
+        /* Write cmd: read the Status register */\r
+        RF1AINSTR1B = (0xC0 | addr);\r
+    }\r
+\r
+    /* Read out the register value */\r
+    regValue   = RF1ADOUT1B; //auto read\r
+\r
+    /* Allow access to Radio IF */\r
+    MRFI_RIF_EXIT_CRITICAL_SECTION(s);\r
+\r
+    return (regValue);\r
+}\r
+\r
+/**************************************************************************************************\r
+ * @fn          mrfiRadioInterfaceWriteReg\r
+ *\r
+ * @brief       Write value to radio register.\r
+ *\r
+ * @param       addr  - address of register\r
+ * @param       value - register value to write\r
+ *\r
+ * @return      none\r
+ **************************************************************************************************\r
+ */\r
+\r
+void mrfiRadioInterfaceWriteReg(uint8_t addr, uint8_t value)\r
+{\r
+    mrfiRIFIState_t s;\r
+\r
+    /* Check for valid range. 0x3E is for PATABLE access */\r
+    MRFI_RIF_ASSERT((addr <= 0x2E) || (addr == 0x3E));\r
+\r
+    /* Lock out access to Radio IF */\r
+    MRFI_RIF_ENTER_CRITICAL_SECTION(s);\r
+\r
+    /* Wait for radio to be ready for next instruction */\r
+    MRFI_RADIO_INST_WRITE_WAIT();\r
+\r
+    /* Write cmd: 'write to register' */\r
+    RF1AINSTRB = (0x00 | addr);\r
+\r
+    /* Wait for radio to be ready to accept the data */\r
+    MRFI_RADIO_DATA_WRITE_WAIT();\r
+\r
+    /* Write the register value */\r
+    RF1ADINB   = value;        /* value to be written to the radio register */\r
+\r
+    /* Allow access to Radio IF */\r
+    MRFI_RIF_EXIT_CRITICAL_SECTION(s);\r
+}\r
+\r
+/**************************************************************************************************\r
+ * @fn          mrfiRadioInterfaceWriteTxFifo\r
+ *\r
+ * @brief       Write data to radio transmit FIFO.\r
+ *\r
+ * @param       pData - pointer for storing write data\r
+ * @param       len   - length of data in bytes\r
+ *\r
+ * @return      none\r
+ **************************************************************************************************\r
+ */\r
+\r
+void mrfiRadioInterfaceWriteTxFifo(uint8_t * pData, uint8_t len)\r
+{\r
+    mrfiRIFIState_t s;\r
+\r
+    MRFI_RIF_ASSERT(len != 0); /* zero length is not allowed */\r
+\r
+    /* Lock out access to Radio IF */\r
+    MRFI_RIF_ENTER_CRITICAL_SECTION(s);\r
+\r
+    /* Wait for radio to be ready for next instruction */\r
+    MRFI_RADIO_INST_WRITE_WAIT();\r
+\r
+    /* Write cmd: TXFIFOWR */\r
+    RF1AINSTRB = 0x7F;\r
+\r
+    do\r
+    {\r
+        /* Wait for radio to be ready to accept the data */\r
+        MRFI_RADIO_DATA_WRITE_WAIT();\r
+\r
+        /* Write one byte to FIFO */\r
+        RF1ADINB   = *pData;\r
+\r
+        pData++;\r
+        len--;\r
+\r
+    } while (len);\r
+\r
+    /* Allow access to Radio IF */\r
+    MRFI_RIF_EXIT_CRITICAL_SECTION(s);\r
+}\r
+\r
+/**************************************************************************************************\r
+ * @fn          mrfiRadioInterfaceReadRxFifo\r
+ *\r
+ * @brief       Read data from radio receive FIFO.\r
+ *\r
+ * @param       pData - pointer for storing read data\r
+ * @param       len   - length of data in bytes\r
+ *\r
+ * @return      none\r
+ **************************************************************************************************\r
+ */\r
+uint8_t method = 2;\r
+void mrfiRadioInterfaceReadRxFifo(uint8_t * pData, uint8_t len)\r
+{\r
+    mrfiRIFIState_t s;\r
+\r
+    MRFI_RIF_ASSERT(len != 0); /* zero length is not allowed */\r
+\r
+    /* Lock out access to Radio IF */\r
+    MRFI_RIF_ENTER_CRITICAL_SECTION(s);\r
+\r
+    if (method == 1)\r
+    {\r
+        /* Wait for radio to be ready for next instruction */\r
+        MRFI_RADIO_INST_WRITE_WAIT();\r
+\r
+        /* Write cmd: RXFIFORD */\r
+        RF1AINSTRB = 0xFF;\r
+\r
+        do\r
+        {\r
+            /* dummy write */\r
+            RF1ADINB = 0;\r
+\r
+            /* Wait for data to be available for reading */\r
+            MRFI_RADIO_DATA_READ_WAIT();\r
+\r
+            /* Read one byte from FIFO */\r
+            *pData = RF1ADOUT0B;\r
+\r
+            pData++;\r
+            len--;\r
+\r
+        } while (len);\r
+    }\r
+\r
+    if (method == 2)\r
+    {\r
+        do\r
+        {\r
+            /* Wait for radio to be ready for next instruction */\r
+            MRFI_RADIO_INST_WRITE_WAIT();\r
+\r
+            /* Write cmd: SNGLRXRD */\r
+            RF1AINSTR1B = 0xBF;\r
+\r
+            /* Read byte from FIFO */\r
+            *pData  = RF1ADOUT1B; //auto read register\r
+\r
+            pData++;\r
+            len--;\r
+\r
+        } while (len);\r
+    }\r
+\r
+    /* Allow access to Radio IF */\r
+    MRFI_RIF_EXIT_CRITICAL_SECTION(s);\r
+}\r
+\r
+/**************************************************************************************************\r
+ */\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/Components/mrfi/radios/family5/mrfi_radio_interface.h b/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/Components/mrfi/radios/family5/mrfi_radio_interface.h
new file mode 100755 (executable)
index 0000000..ae46724
--- /dev/null
@@ -0,0 +1,151 @@
+/**************************************************************************************************\r
+*  Revised:        $Date: 2007-07-06 11:19:00 -0700 (Fri, 06 Jul 2007) $\r
+*  Revision:       $Revision: 13579 $\r
+*\r
+*  Copyright 2007 Texas Instruments Incorporated.  All rights reserved.\r
+*\r
+*  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+*  the terms of a software license agreement between the user who downloaded the software,\r
+*  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+*  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+*  License. The License limits your use, and you acknowledge, that the Software may not be\r
+*  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+*  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+*  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+*  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+*  perform, display or sell this Software and/or its documentation for any purpose.\r
+*\r
+*  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+*  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+*  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+*  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+*  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+*  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+*  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+*  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+*  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+*\r
+*  Should you have any questions regarding your right to use this Software,\r
+*  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+/* ~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=\r
+ *   MRFI (Minimal RF Interface)\r
+ *   Radio interface code for CC430\r
+ * ~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=\r
+ */\r
+\r
+#ifndef MRFI_RADIO_INTERFACE_H\r
+#define MRFI_RADIO_INTERFACE_H\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                         Includes\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#include "bsp.h"\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                          Defines\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+\r
+/* configuration registers */\r
+#define IOCFG2      0x00      /*  IOCFG2   - GDO2 output pin configuration  */\r
+#define IOCFG1      0x01      /*  IOCFG1   - GDO1 output pin configuration  */\r
+#define IOCFG0      0x02      /*  IOCFG1   - GDO0 output pin configuration  */\r
+#define FIFOTHR     0x03      /*  FIFOTHR  - RX FIFO and TX FIFO thresholds */\r
+#define SYNC1       0x04      /*  SYNC1    - Sync word, high byte */\r
+#define SYNC0       0x05      /*  SYNC0    - Sync word, low byte */\r
+#define PKTLEN      0x06      /*  PKTLEN   - Packet length */\r
+#define PKTCTRL1    0x07      /*  PKTCTRL1 - Packet automation control */\r
+#define PKTCTRL0    0x08      /*  PKTCTRL0 - Packet automation control */\r
+#define ADDR        0x09      /*  ADDR     - Device address */\r
+#define CHANNR      0x0A      /*  CHANNR   - Channel number */\r
+#define FSCTRL1     0x0B      /*  FSCTRL1  - Frequency synthesizer control */\r
+#define FSCTRL0     0x0C      /*  FSCTRL0  - Frequency synthesizer control */\r
+#define FREQ2       0x0D      /*  FREQ2    - Frequency control word, high byte */\r
+#define FREQ1       0x0E      /*  FREQ1    - Frequency control word, middle byte */\r
+#define FREQ0       0x0F      /*  FREQ0    - Frequency control word, low byte */\r
+#define MDMCFG4     0x10      /*  MDMCFG4  - Modem configuration */\r
+#define MDMCFG3     0x11      /*  MDMCFG3  - Modem configuration */\r
+#define MDMCFG2     0x12      /*  MDMCFG2  - Modem configuration */\r
+#define MDMCFG1     0x13      /*  MDMCFG1  - Modem configuration */\r
+#define MDMCFG0     0x14      /*  MDMCFG0  - Modem configuration */\r
+#define DEVIATN     0x15      /*  DEVIATN  - Modem deviation setting */\r
+#define MCSM2       0x16      /*  MCSM2    - Main Radio Control State Machine configuration */\r
+#define MCSM1       0x17      /*  MCSM1    - Main Radio Control State Machine configuration */\r
+#define MCSM0       0x18      /*  MCSM0    - Main Radio Control State Machine configuration */\r
+#define FOCCFG      0x19      /*  FOCCFG   - Frequency Offset Compensation configuration */\r
+#define BSCFG       0x1A      /*  BSCFG    - Bit Synchronization configuration */\r
+#define AGCCTRL2    0x1B      /*  AGCCTRL2 - AGC control */\r
+#define AGCCTRL1    0x1C      /*  AGCCTRL1 - AGC control */\r
+#define AGCCTRL0    0x1D      /*  AGCCTRL0 - AGC control */\r
+#define WOREVT1     0x1E      /*  WOREVT1  - High byte Event0 timeout */\r
+#define WOREVT0     0x1F      /*  WOREVT0  - Low byte Event0 timeout */\r
+#define WORCTRL     0x20      /*  WORCTRL  - Wake On Radio control */\r
+#define FREND1      0x21      /*  FREND1   - Front end RX configuration */\r
+#define FREND0      0x22      /*  FREDN0   - Front end TX configuration */\r
+#define FSCAL3      0x23      /*  FSCAL3   - Frequency synthesizer calibration */\r
+#define FSCAL2      0x24      /*  FSCAL2   - Frequency synthesizer calibration */\r
+#define FSCAL1      0x25      /*  FSCAL1   - Frequency synthesizer calibration */\r
+#define FSCAL0      0x26      /*  FSCAL0   - Frequency synthesizer calibration */\r
+#define RCCTRL1     0x27      /*  RCCTRL1  - RC oscillator configuration */\r
+#define RCCTRL0     0x28      /*  RCCTRL0  - RC oscillator configuration */\r
+#define FSTEST      0x29      /*  FSTEST   - Frequency synthesizer calibration control */\r
+#define PTEST       0x2A      /*  PTEST    - Production test */\r
+#define AGCTEST     0x2B      /*  AGCTEST  - AGC test */\r
+#define TEST2       0x2C      /*  TEST2    - Various test settings */\r
+#define TEST1       0x2D      /*  TEST1    - Various test settings */\r
+#define TEST0       0x2E      /*  TEST0    - Various test settings */\r
+\r
+/* status registers */\r
+#define PARTNUM     0x30      /*  PARTNUM    - Chip ID */\r
+#define VERSION     0x31      /*  VERSION    - Chip ID */\r
+#define FREQEST     0x32      /*  FREQEST    \96 Frequency Offset Estimate from demodulator */\r
+#define LQI         0x33      /*  LQI        \96 Demodulator estimate for Link Quality */\r
+#define RSSI        0x34      /*  RSSI       \96 Received signal strength indication */\r
+#define MARCSTATE   0x35      /*  MARCSTATE  \96 Main Radio Control State Machine state */\r
+#define WORTIME1    0x36      /*  WORTIME1   \96 High byte of WOR time */\r
+#define WORTIME0    0x37      /*  WORTIME0   \96 Low byte of WOR time */\r
+#define PKTSTATUS   0x38      /*  PKTSTATUS  \96 Current GDOx status and packet status */\r
+#define VCO_VC_DAC  0x39      /*  VCO_VC_DAC \96 Current setting from PLL calibration module */\r
+#define TXBYTES     0x3A      /*  TXBYTES    \96 Underflow and number of bytes */\r
+#define RXBYTES     0x3B      /*  RXBYTES    \96 Overflow and number of bytes */\r
+\r
+/* burst write registers */\r
+#define PATABLE     0x3E      /*  PATABLE - PA control settings table */\r
+\r
+/* command strobe registers */\r
+#define SRES        0x30      /*  SRES    - Reset chip. */\r
+#define SFSTXON     0x31      /*  SFSTXON - Enable and calibrate frequency synthesizer. */\r
+#define SXOFF       0x32      /*  SXOFF   - Turn off crystal oscillator. */\r
+#define SCAL        0x33      /*  SCAL    - Calibrate frequency synthesizer and turn it off. */\r
+#define SRX         0x34      /*  SRX     - Enable RX. Perform calibration if enabled. */\r
+#define STX         0x35      /*  STX     - Enable TX. If in RX state, only enable TX if CCA passes.\r
+                               **/\r
+#define SIDLE       0x36      /*  SIDLE   - Exit RX / TX, turn off frequency synthesizer. */\r
+#define SRSVD       0x37      /*  SRVSD   - Reserved.  Do not use. */\r
+#define SWOR        0x38      /*  SWOR    - Start automatic RX polling sequence (Wake-on-Radio) */\r
+#define SPWD        0x39      /*  SPWD    - Enter power down mode when CSn goes high. */\r
+#define SFRX        0x3A      /*  SFRX    - Flush the RX FIFO buffer. */\r
+#define SFTX        0x3B      /*  SFTX    - Flush the TX FIFO buffer. */\r
+#define SWORRST     0x3C      /*  SWORRST - Reset real time clock. */\r
+#define SNOP        0x3D      /*  SNOP    - No operation. Returns status byte. */\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                         Prototypes\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+void mrfiRadioInterfaceInit(void);\r
+void mrfiRadioInterfaceWriteReg(uint8_t addr, uint8_t value);\r
+void mrfiRadioInterfaceWriteTxFifo(uint8_t * pWriteData, uint8_t len);\r
+void mrfiRadioInterfaceReadRxFifo(uint8_t * pReadData, uint8_t len);\r
+\r
+uint8_t mrfiRadioInterfaceCmdStrobe(uint8_t addr);\r
+uint8_t mrfiRadioInterfaceReadReg(uint8_t addr);\r
+\r
+/**************************************************************************************************\r
+ */\r
+#endif\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/Components/mrfi/smartrf/CC1101/smartrf_CC1101.h b/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/Components/mrfi/smartrf/CC1101/smartrf_CC1101.h
new file mode 100755 (executable)
index 0000000..65030e5
--- /dev/null
@@ -0,0 +1,168 @@
+/***************************************************************\r
+*  SmartRF Studio(tm) Export\r
+*\r
+*  Radio register settings specifed with C-code\r
+*  compatible #define statements.\r
+*\r
+***************************************************************/\r
+\r
+#ifndef SMARTRF_CC1101_H\r
+#define SMARTRF_CC1101_H\r
+\r
+// ISM_LF configuration\r
+//\r
+// Chipcon\r
+// Product = CC1101\r
+// Chip version = A   (VERSION = 0x04)\r
+// Crystal accuracy = 10 ppm\r
+// X-tal frequency = 26 MHz\r
+// RF output power = 0 dBm\r
+// RX filterbandwidth = 232.142857 kHz\r
+// Deviation = 32 kHz\r
+// Datarate = 76.766968 kBaud\r
+// Modulation = (1) GFSK\r
+// Manchester enable = (0) Manchester disabled\r
+// RF Frequency = 433.92 MHz\r
+// Channel spacing = 199.951172 kHz\r
+// Channel number = 0\r
+// Optimization = -\r
+// Sync mode = (3) 30/32 sync word bits detected\r
+// Format of RX/TX data = (0) Normal mode, use FIFOs for RX and TX\r
+// CRC operation = (1) CRC calculation in TX and CRC check in RX enabled\r
+// Forward Error Correction = (0) FEC disabled\r
+// Length configuration = (1) Variable length packets, packet length configured by the first\r
+// received byte after sync word.\r
+// Packetlength = 255\r
+// Preamble count = (2)  4 bytes\r
+// Append status = 1\r
+// Address check = (0) No address check\r
+// FIFO autoflush = 0\r
+// Device address = 0\r
+// GDO0 signal selection = ( 6) Asserts when sync word has been sent / received, and de-asserts at\r
+// the end of the packet\r
+// GDO2 signal selection = (41) CHIP_RDY\r
+\r
+// ISM_EU configuration\r
+//\r
+// Chipcon\r
+// Product = CC1101\r
+// Chip version = A   (VERSION = 0x04)\r
+// Crystal accuracy = 10 ppm\r
+// X-tal frequency = 26 MHz\r
+// RF output power = 0 dBm\r
+// RX filterbandwidth = 232.142857 kHz\r
+// Deviation = 32 kHz\r
+// Datarate = 76.766968 kBaud\r
+// Modulation = (1) GFSK\r
+// Manchester enable = (0) Manchester disabled\r
+// RF Frequency = 869.524963 MHz\r
+// Channel spacing = 199.951172 kHz\r
+// Channel number = 0\r
+// Optimization = -\r
+// Sync mode = (3) 30/32 sync word bits detected\r
+// Format of RX/TX data = (0) Normal mode, use FIFOs for RX and TX\r
+// CRC operation = (1) CRC calculation in TX and CRC check in RX enabled\r
+// Forward Error Correction = (0) FEC disabled\r
+// Length configuration = (1) Variable length packets, packet length configured by the first\r
+// received byte after sync word.\r
+// Packetlength = 255\r
+// Preamble count = (2)  4 bytes\r
+// Append status = 1\r
+// Address check = (0) No address check\r
+// FIFO autoflush = 0\r
+// Device address = 0\r
+// GDO0 signal selection = ( 6) Asserts when sync word has been sent / received, and de-asserts at\r
+// the end of the packet\r
+// GDO2 signal selection = (41) CHIP_RDY\r
+\r
+// ISM_US configuration\r
+//\r
+// Chipcon\r
+// Product = CC1101\r
+// Chip version = A   (VERSION = 0x04)\r
+// Crystal accuracy = 10 ppm\r
+// X-tal frequency = 26 MHz\r
+// RF output power = 0 dBm\r
+// RX filterbandwidth = 232.142857 kHz\r
+// Deviation = 32 kHz\r
+// Datarate = 76.766968 kBaud\r
+// Modulation = (1) GFSK\r
+// Manchester enable = (0) Manchester disabled\r
+// RF Frequency = 905.998993 MHz\r
+// Channel spacing = 199.951172 kHz\r
+// Channel number = 0\r
+// Optimization = -\r
+// Sync mode = (3) 30/32 sync word bits detected\r
+// Format of RX/TX data = (0) Normal mode, use FIFOs for RX and TX\r
+// CRC operation = (1) CRC calculation in TX and CRC check in RX enabled\r
+// Forward Error Correction = (0) FEC disabled\r
+// Length configuration = (1) Variable length packets, packet length configured by the first\r
+// received byte after sync word.\r
+// Packetlength = 255\r
+// Preamble count = (2)  4 bytes\r
+// Append status = 1\r
+// Address check = (0) No address check\r
+// FIFO autoflush = 0\r
+// Device address = 0\r
+// GDO0 signal selection = ( 6) Asserts when sync word has been sent / received, and de-asserts at\r
+// the end of the packet\r
+// GDO2 signal selection = (41) CHIP_RDY\r
+\r
+#define SMARTRF_RADIO_CC1101\r
+\r
+#define SMARTRF_SETTING_FSCTRL1    0x08\r
+#define SMARTRF_SETTING_FSCTRL0    0x00\r
+#ifdef ISM_EU\r
+// 869.50MHz\r
+#    define SMARTRF_SETTING_FREQ2      0x21\r
+#    define SMARTRF_SETTING_FREQ1      0x71\r
+#    define SMARTRF_SETTING_FREQ0      0x7A\r
+#else\r
+#    ifdef ISM_US\r
+// 902MHz (CHANNR=20->906MHz)\r
+#        define SMARTRF_SETTING_FREQ2      0x22\r
+#        define SMARTRF_SETTING_FREQ1      0xB1\r
+#        define SMARTRF_SETTING_FREQ0      0x3B\r
+#    else\r
+#        ifdef ISM_LF\r
+// 433.92MHz\r
+#            define SMARTRF_SETTING_FREQ2      0x10\r
+#            define SMARTRF_SETTING_FREQ1      0xB0\r
+#            define SMARTRF_SETTING_FREQ0      0x71\r
+#        else\r
+#            error "Wrong ISM band specified (valid are ISM_LF, ISM_EU and ISM_US)"\r
+#        endif // ISM_LF\r
+#    endif     // ISM_US\r
+#endif         // ISM_EU\r
+#define SMARTRF_SETTING_MDMCFG4    0x7B\r
+#define SMARTRF_SETTING_MDMCFG3    0x83\r
+#define SMARTRF_SETTING_MDMCFG2    0x13\r
+#define SMARTRF_SETTING_MDMCFG1    0x22\r
+#define SMARTRF_SETTING_MDMCFG0    0xF8\r
+#define SMARTRF_SETTING_CHANNR     0x00\r
+#define SMARTRF_SETTING_DEVIATN    0x42\r
+#define SMARTRF_SETTING_FREND1     0xB6\r
+#define SMARTRF_SETTING_FREND0     0x10\r
+#define SMARTRF_SETTING_MCSM0      0x18\r
+#define SMARTRF_SETTING_FOCCFG     0x1D\r
+#define SMARTRF_SETTING_BSCFG      0x1C\r
+#define SMARTRF_SETTING_AGCCTRL2   0xC7\r
+#define SMARTRF_SETTING_AGCCTRL1   0x00\r
+#define SMARTRF_SETTING_AGCCTRL0   0xB2\r
+#define SMARTRF_SETTING_FSCAL3     0xEA\r
+#define SMARTRF_SETTING_FSCAL2     0x2A\r
+#define SMARTRF_SETTING_FSCAL1     0x00\r
+#define SMARTRF_SETTING_FSCAL0     0x1F\r
+#define SMARTRF_SETTING_FSTEST     0x59\r
+#define SMARTRF_SETTING_TEST2      0x81\r
+#define SMARTRF_SETTING_TEST1      0x35\r
+#define SMARTRF_SETTING_TEST0      0x09\r
+#define SMARTRF_SETTING_FIFOTHR    0x47\r
+#define SMARTRF_SETTING_IOCFG2     0x29\r
+#define SMARTRF_SETTING_IOCFG0D    0x06\r
+#define SMARTRF_SETTING_PKTCTRL1   0x04\r
+#define SMARTRF_SETTING_PKTCTRL0   0x05\r
+#define SMARTRF_SETTING_ADDR       0x00\r
+#define SMARTRF_SETTING_PKTLEN     0xFF\r
+\r
+#endif // SMARTRF_CC1101_H\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/Components/mrfi/smartrf/CC430/smartrf_CC430.h b/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/Components/mrfi/smartrf/CC430/smartrf_CC430.h
new file mode 100755 (executable)
index 0000000..2c4aebc
--- /dev/null
@@ -0,0 +1,170 @@
+/***************************************************************\r
+*  SmartRF Studio(tm) Export\r
+*\r
+*  Radio register settings specifed with C-code\r
+*  compatible #define statements.\r
+*\r
+***************************************************************/\r
+\r
+#ifndef SMARTRF_CC430_H\r
+#define SMARTRF_CC430_H\r
+\r
+// [BM] Modified radio settings for 433MHz, 868MHz, 915MHz\r
+\r
+// ISM_LF configuration\r
+//\r
+// Chipcon\r
+// Product = CC1101\r
+// Chip version = A   (VERSION = 0x04)\r
+// Crystal accuracy = 10 ppm\r
+// X-tal frequency = 26 MHz\r
+// RF output power = 0 dBm\r
+// RX filterbandwidth = 232.142857 kHz\r
+// Deviation = 32 kHz\r
+// Datarate = 76.766968 kBaud\r
+// Modulation = (1) GFSK\r
+// Manchester enable = (0) Manchester disabled\r
+// RF Frequency = 433.92 MHz\r
+// Channel spacing = 199.951172 kHz\r
+// Channel number = 0\r
+// Optimization = -\r
+// Sync mode = (3) 30/32 sync word bits detected\r
+// Format of RX/TX data = (0) Normal mode, use FIFOs for RX and TX\r
+// CRC operation = (1) CRC calculation in TX and CRC check in RX enabled\r
+// Forward Error Correction = (0) FEC disabled\r
+// Length configuration = (1) Variable length packets, packet length configured by the first\r
+// received byte after sync word.\r
+// Packetlength = 255\r
+// Preamble count = (2)  4 bytes\r
+// Append status = 1\r
+// Address check = (0) No address check\r
+// FIFO autoflush = 0\r
+// Device address = 0\r
+// GDO0 signal selection = ( 6) Asserts when sync word has been sent / received, and de-asserts at\r
+// the end of the packet\r
+// GDO2 signal selection = (41) CHIP_RDY\r
+\r
+// ISM_EU configuration\r
+//\r
+// Chipcon\r
+// Product = CC1101\r
+// Chip version = A   (VERSION = 0x04)\r
+// Crystal accuracy = 10 ppm\r
+// X-tal frequency = 26 MHz\r
+// RF output power = 0 dBm\r
+// RX filterbandwidth = 232.142857 kHz\r
+// Deviation = 32 kHz\r
+// Datarate = 76.766968 kBaud\r
+// Modulation = (1) GFSK\r
+// Manchester enable = (0) Manchester disabled\r
+// RF Frequency = 869.524963 MHz\r
+// Channel spacing = 199.951172 kHz\r
+// Channel number = 0\r
+// Optimization = -\r
+// Sync mode = (3) 30/32 sync word bits detected\r
+// Format of RX/TX data = (0) Normal mode, use FIFOs for RX and TX\r
+// CRC operation = (1) CRC calculation in TX and CRC check in RX enabled\r
+// Forward Error Correction = (0) FEC disabled\r
+// Length configuration = (1) Variable length packets, packet length configured by the first\r
+// received byte after sync word.\r
+// Packetlength = 255\r
+// Preamble count = (2)  4 bytes\r
+// Append status = 1\r
+// Address check = (0) No address check\r
+// FIFO autoflush = 0\r
+// Device address = 0\r
+// GDO0 signal selection = ( 6) Asserts when sync word has been sent / received, and de-asserts at\r
+// the end of the packet\r
+// GDO2 signal selection = (41) CHIP_RDY\r
+\r
+// ISM_US configuration\r
+//\r
+// Chipcon\r
+// Product = CC1101\r
+// Chip version = A   (VERSION = 0x04)\r
+// Crystal accuracy = 10 ppm\r
+// X-tal frequency = 26 MHz\r
+// RF output power = 0 dBm\r
+// RX filterbandwidth = 232.142857 kHz\r
+// Deviation = 32 kHz\r
+// Datarate = 76.766968 kBaud\r
+// Modulation = (1) GFSK\r
+// Manchester enable = (0) Manchester disabled\r
+// RF Frequency = 905.998993 MHz\r
+// Channel spacing = 199.951172 kHz\r
+// Channel number = 0\r
+// Optimization = -\r
+// Sync mode = (3) 30/32 sync word bits detected\r
+// Format of RX/TX data = (0) Normal mode, use FIFOs for RX and TX\r
+// CRC operation = (1) CRC calculation in TX and CRC check in RX enabled\r
+// Forward Error Correction = (0) FEC disabled\r
+// Length configuration = (1) Variable length packets, packet length configured by the first\r
+// received byte after sync word.\r
+// Packetlength = 255\r
+// Preamble count = (2)  4 bytes\r
+// Append status = 1\r
+// Address check = (0) No address check\r
+// FIFO autoflush = 0\r
+// Device address = 0\r
+// GDO0 signal selection = ( 6) Asserts when sync word has been sent / received, and de-asserts at\r
+// the end of the packet\r
+// GDO2 signal selection = (41) CHIP_RDY\r
+\r
+#define SMARTRF_RADIO_CC430\r
+\r
+#define SMARTRF_SETTING_FSCTRL1    0x08\r
+#define SMARTRF_SETTING_FSCTRL0    0x00\r
+#ifdef ISM_EU\r
+// 869.50MHz\r
+#    define SMARTRF_SETTING_FREQ2      0x21\r
+#    define SMARTRF_SETTING_FREQ1      0x71\r
+#    define SMARTRF_SETTING_FREQ0      0x7A\r
+#else\r
+#    ifdef ISM_US\r
+// 902MHz (CHANNR=20->906MHz)\r
+#        define SMARTRF_SETTING_FREQ2      0x22\r
+#        define SMARTRF_SETTING_FREQ1      0xB1\r
+#        define SMARTRF_SETTING_FREQ0      0x3B\r
+#    else\r
+#        ifdef ISM_LF\r
+// 433.92MHz\r
+#            define SMARTRF_SETTING_FREQ2      0x10\r
+#            define SMARTRF_SETTING_FREQ1      0xB0\r
+#            define SMARTRF_SETTING_FREQ0      0x71\r
+#        else\r
+#            error "Wrong ISM band specified (valid are ISM_LF, ISM_EU and ISM_US)"\r
+#        endif // ISM_LF\r
+#    endif     // ISM_US\r
+#endif         // ISM_EU\r
+#define SMARTRF_SETTING_MDMCFG4    0x7B\r
+#define SMARTRF_SETTING_MDMCFG3    0x83\r
+#define SMARTRF_SETTING_MDMCFG2    0x13\r
+#define SMARTRF_SETTING_MDMCFG1    0x22\r
+#define SMARTRF_SETTING_MDMCFG0    0xF8\r
+#define SMARTRF_SETTING_CHANNR     0x00\r
+#define SMARTRF_SETTING_DEVIATN    0x42\r
+#define SMARTRF_SETTING_FREND1     0xB6\r
+#define SMARTRF_SETTING_FREND0     0x10\r
+#define SMARTRF_SETTING_MCSM0      0x18\r
+#define SMARTRF_SETTING_FOCCFG     0x1D\r
+#define SMARTRF_SETTING_BSCFG      0x1C\r
+#define SMARTRF_SETTING_AGCCTRL2   0xC7\r
+#define SMARTRF_SETTING_AGCCTRL1   0x00\r
+#define SMARTRF_SETTING_AGCCTRL0   0xB2\r
+#define SMARTRF_SETTING_FSCAL3     0xEA\r
+#define SMARTRF_SETTING_FSCAL2     0x2A\r
+#define SMARTRF_SETTING_FSCAL1     0x00\r
+#define SMARTRF_SETTING_FSCAL0     0x1F\r
+#define SMARTRF_SETTING_FSTEST     0x59\r
+#define SMARTRF_SETTING_TEST2      0x81\r
+#define SMARTRF_SETTING_TEST1      0x35\r
+#define SMARTRF_SETTING_TEST0      0x09\r
+#define SMARTRF_SETTING_FIFOTHR    0x47\r
+#define SMARTRF_SETTING_IOCFG2     0x29\r
+#define SMARTRF_SETTING_IOCFG0D    0x06\r
+#define SMARTRF_SETTING_PKTCTRL1   0x04\r
+#define SMARTRF_SETTING_PKTCTRL0   0x05\r
+#define SMARTRF_SETTING_ADDR       0x00\r
+#define SMARTRF_SETTING_PKTLEN     0xFF\r
+\r
+#endif // SMARTRF_CC430_H\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/Components/nwk/nwk.c b/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/Components/nwk/nwk.c
new file mode 100755 (executable)
index 0000000..526df8d
--- /dev/null
@@ -0,0 +1,1112 @@
+/**************************************************************************************************\r
+*  Filename:       nwk.c\r
+*  Revised:        $Date: 2009-03-11 15:29:07 -0700 (Wed, 11 Mar 2009) $\r
+*  Revision:       $Revision: 19382 $\r
+*  Author          $Author: lfriedman $\r
+*\r
+*  Description:    This file supports the SimpliciTI network layer.\r
+*\r
+*  Copyright 2007-2009 Texas Instruments Incorporated. All rights reserved.\r
+*\r
+*  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+*  the terms of a software license agreement between the user who downloaded the software,\r
+*  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+*  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+*  License. The License limits your use, and you acknowledge, that the Software may not be\r
+*  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+*  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+*  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+*  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+*  perform, display or sell this Software and/or its documentation for any purpose.\r
+*\r
+*  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+*  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+*  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+*  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+*  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+*  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+*  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+*  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+*  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+*\r
+*  Should you have any questions regarding your right to use this Software,\r
+*  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+/******************************************************************************\r
+ * INCLUDES\r
+ */\r
+#include <string.h>\r
+#include "bsp.h"\r
+#include "mrfi.h"\r
+#include "nwk_types.h"\r
+#include "nwk_frame.h"\r
+#include "nwk.h"\r
+#include "nwk_app.h"\r
+#include "nwk_globals.h"\r
+#include "nwk_QMgmt.h"\r
+\r
+/******************************************************************************\r
+ * MACROS\r
+ */\r
+/************************* NETWORK MANIFEST CONSTANT SANITY CHECKS ****************************/\r
+#if !defined(ACCESS_POINT) && !defined(RANGE_EXTENDER) && !defined(END_DEVICE)\r
+#    error ERROR: No SimpliciTI device type defined\r
+#endif\r
+\r
+#if defined(END_DEVICE) && !defined(RX_POLLS)\r
+#    define RX_USER\r
+#endif\r
+\r
+#ifndef MAX_HOPS\r
+#    define MAX_HOPS  3\r
+#elif MAX_HOPS > 4\r
+#    error ERROR: MAX_HOPS must be 4 or fewer\r
+#endif\r
+\r
+#ifndef MAX_APP_PAYLOAD\r
+#    error ERROR: MAX_APP_PAYLOAD must be defined\r
+#endif\r
+\r
+#if (MAX_PAYLOAD < MAX_FREQ_APP_FRAME)\r
+#    error ERROR: Application payload size too small for Frequency frame\r
+#endif\r
+\r
+#if (MAX_PAYLOAD < MAX_JOIN_APP_FRAME)\r
+#    error ERROR: Application payload size too small for Join frame\r
+#endif\r
+\r
+#if (MAX_PAYLOAD < MAX_LINK_APP_FRAME)\r
+#    error ERROR: Application payload size too small for Link frame\r
+#endif\r
+\r
+#if (MAX_PAYLOAD < MAX_MGMT_APP_FRAME)\r
+#    error ERROR: Application payload size too small for Management frame\r
+#endif\r
+\r
+#if (MAX_PAYLOAD < MAX_SEC_APP_FRAME)\r
+#    error ERROR: Application payload size too small for Security frame\r
+#endif\r
+\r
+#if (MAX_PAYLOAD < MAX_PING_APP_FRAME)\r
+#    error ERROR: Application payload size too small for Ping frame\r
+#endif\r
+\r
+#if NWK_FREQ_TBL_SIZE < 1\r
+#    error ERROR: NWK_FREQ_TBL_SIZE must be > 0\r
+#endif\r
+\r
+/************************* END NETWORK MANIFEST CONSTANT SANITY CHECKS ************************/\r
+\r
+/******************************************************************************\r
+ * CONSTANTS AND DEFINES\r
+ */\r
+#define SYS_NUM_CONNECTIONS   (NUM_CONNECTIONS + 1)\r
+\r
+/* Increment this if the persistentContext_t structure is changed. It will help\r
+ * detect the upgrade context: any saved values will have a version with a\r
+ * lower number.\r
+ */\r
+#define  CONNTABLEINFO_STRUCTURE_VERSION   1\r
+\r
+#define  SIZEOF_NV_OBJ   sizeof(sPersistInfo)\r
+\r
+/******************************************************************************\r
+ * TYPEDEFS\r
+ */\r
+\r
+/* This structure aggregates eveything necessary to save if we want to restore\r
+ * the connection information later.\r
+ */\r
+typedef struct\r
+{\r
+    const uint8_t structureVersion;  /* to dectect upgrades... */\r
+    uint8_t numConnections;          /* count includes the UUD port/link ID */\r
+\r
+    /* The next two are used to detect overlapping port assignments. When _sending_ a\r
+     * link frame the local port is assigned from the top down. When sending a _reply_\r
+     * the assignment is bottom up. Overlapping assignments are rejected. That said it\r
+     * is extremely unlikely that this will ever happen. If it does the test implemented\r
+     * here is overly cautious (it will reject assignments when it needn't). But we leave\r
+     * it that way on the assumption that it will never happen anyway.\r
+     */\r
+    uint8_t curNextLinkPort;\r
+    uint8_t curMaxReplyPort;\r
+    linkID_t nextLinkID;\r
+#ifdef ACCESS_POINT\r
+    sfInfo_t sSandFContext;\r
+#endif\r
+    /* Connection table entries last... */\r
+    connInfo_t connStruct[SYS_NUM_CONNECTIONS];\r
+} persistentContext_t;\r
+\r
+/******************************************************************************\r
+ * LOCAL VARIABLES\r
+ */\r
+\r
+/* This will be overwritten if we restore the structure from NV for example.\r
+ * Note that restoring will not permit overwriting the version element as it\r
+ * is declared 'const'.\r
+ */\r
+static persistentContext_t sPersistInfo = {CONNTABLEINFO_STRUCTURE_VERSION};\r
+\r
+/******************************************************************************\r
+ * LOCAL FUNCTIONS\r
+ */\r
+static uint8_t map_lid2idx(linkID_t, uint8_t *);\r
+static void initializeConnection(connInfo_t *);\r
+\r
+/******************************************************************************\r
+ * GLOBAL VARIABLES\r
+ */\r
+\r
+/******************************************************************************\r
+ * GLOBAL FUNCTIONS\r
+ */\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_nwkInit\r
+ *\r
+ * @brief       Initialize NWK conext.\r
+ *\r
+ * input parameters\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   Status of operation.\r
+ */\r
+\r
+smplStatus_t nwk_nwkInit(uint8_t (*f)(linkID_t))\r
+{\r
+    // [BM] Added variable\r
+    uint8_t i;\r
+\r
+    /* Truly ugly initialization because CCE won't initialize properly. Must\r
+     * skip first const element. Yuk.\r
+     */\r
+    memset((((uint8_t *)&sPersistInfo) + 1), 0x0, (sizeof(sPersistInfo) - 1));\r
+    /* OK. The zeroed elements are set. Now go back and do fixups...  */\r
+\r
+    sPersistInfo.numConnections   = SYS_NUM_CONNECTIONS;\r
+    sPersistInfo.curNextLinkPort  = SMPL_PORT_USER_MAX;\r
+    sPersistInfo.curMaxReplyPort  = PORT_BASE_NUMBER;\r
+    sPersistInfo.nextLinkID       = 1;\r
+\r
+    /* initialize globals */\r
+    nwk_globalsInit();\r
+\r
+    /* initialize frame processing */\r
+    nwk_frameInit(f);\r
+\r
+    /* initialize queue manager */\r
+    nwk_QInit();\r
+\r
+    /* initialize each network application. */\r
+    nwk_freqInit();\r
+    nwk_pingInit();\r
+    nwk_joinInit(f);\r
+    nwk_mgmtInit();\r
+    nwk_linkInit();\r
+    nwk_securityInit();\r
+\r
+    // [BM] Workaround to enable stack restarting\r
+    for (i = 0; i < SYS_NUM_CONNECTIONS; ++i)\r
+    {\r
+        sPersistInfo.connStruct[i].connState = CONNSTATE_FREE;\r
+    }\r
+\r
+    /* set up the last connection as the broadcast port mapped to the broadcast Link ID */\r
+    if (CONNSTATE_FREE == sPersistInfo.connStruct[NUM_CONNECTIONS].connState)\r
+    {\r
+        sPersistInfo.connStruct[NUM_CONNECTIONS].connState   = CONNSTATE_CONNECTED;\r
+        sPersistInfo.connStruct[NUM_CONNECTIONS].hops2target = MAX_HOPS;\r
+        sPersistInfo.connStruct[NUM_CONNECTIONS].portRx      = SMPL_PORT_USER_BCAST;\r
+        sPersistInfo.connStruct[NUM_CONNECTIONS].portTx      = SMPL_PORT_USER_BCAST;\r
+        sPersistInfo.connStruct[NUM_CONNECTIONS].thisLinkID  = SMPL_LINKID_USER_UUD;\r
+        /* set peer address to broadcast so it is used when Application sends to the broadcast Link\r
+         *ID */\r
+        memcpy(sPersistInfo.connStruct[NUM_CONNECTIONS].peerAddr,\r
+               nwk_getBCastAddress(), NET_ADDR_SIZE);\r
+    }\r
+\r
+    return SMPL_SUCCESS;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_getNextConnection\r
+ *\r
+ * @brief       Return the next free connection structure if on is available.\r
+ *\r
+ * input parameters\r
+ *\r
+ * output parameters\r
+ *      The returned structure has the Rx port number populated based on the\r
+ *      free strucure found. This is the port queried when the app wants to\r
+ *      do a receive.\r
+ *\r
+ * @return   pointer to the new connInfo_t structure. NULL if there is\r
+ *           no room in connection structure array.\r
+ */\r
+\r
+connInfo_t *nwk_getNextConnection()\r
+{\r
+    uint8_t i;\r
+\r
+    for (i = 0; i < SYS_NUM_CONNECTIONS; ++i)\r
+    {\r
+        if (sPersistInfo.connStruct[i].connState == CONNSTATE_CONNECTED)\r
+        {\r
+            continue;\r
+        }\r
+        break;\r
+    }\r
+\r
+    if (SYS_NUM_CONNECTIONS == i)\r
+    {\r
+        return (connInfo_t *)0;\r
+    }\r
+\r
+    initializeConnection(&sPersistInfo.connStruct[i]);\r
+\r
+    return &sPersistInfo.connStruct[i];\r
+}\r
+\r
+/************************************************************************************\r
+ * @fn          initializeConnection\r
+ *\r
+ * @brief       Initialize some elements of a Connection table entry.\r
+ *\r
+ * input parameters\r
+ * @param   pCInfo  - pointer to Connection Table entry to initialize. The file\r
+ *                    scope variable holding the next link ID value is also updated.\r
+ *\r
+ * output parameters\r
+ * @param   pCInfo  - certain elements are set to specific values.\r
+ *\r
+ *\r
+ * @return   void\r
+ */\r
+\r
+static void initializeConnection(connInfo_t *pCInfo)\r
+{\r
+    linkID_t *locLID = &sPersistInfo.nextLinkID;\r
+    uint8_t tmp;\r
+\r
+    /* this element will be populated during the exchange with the peer. */\r
+    pCInfo->portTx = 0;\r
+\r
+    pCInfo->connState  =  CONNSTATE_CONNECTED;\r
+    pCInfo->thisLinkID = *locLID;\r
+\r
+    /* Generate the next Link ID. This isn't foolproof. If the count wraps\r
+     * we can end up with confusing duplicates. We can protect aginst using\r
+     * one that is already in use but we can't protect against a stale Link ID\r
+     * remembered by an application that doesn't know its connection has been\r
+     * torn down. The test for 0 will hopefully never be true (indicating a wrap).\r
+     */\r
+    (*locLID)++;\r
+\r
+    while (!*locLID || (*locLID == SMPL_LINKID_USER_UUD) || map_lid2idx(*locLID, &tmp))\r
+    {\r
+        (*locLID)++;\r
+    }\r
+\r
+    return;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_freeConnection\r
+ *\r
+ * @brief       Return the connection structure to the free pool. Currently\r
+ *              this routine is only called when a link freame is sent and\r
+ *              no reply is received so the freeing steps are pretty simple.\r
+ *              But eventually this will be more complex so this place-holder\r
+ *              is introduced.\r
+ *\r
+ * input parameters\r
+ * @param   pCInfo    - pointer to entry to be freed\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   None.\r
+ */\r
+\r
+void nwk_freeConnection(connInfo_t *pCInfo)\r
+{\r
+#if NUM_CONNECTIONS > 0\r
+    pCInfo->connState = CONNSTATE_FREE;\r
+#endif\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_getConnInfo\r
+ *\r
+ * @brief       Return the connection info structure to which the input Link ID maps.\r
+ *\r
+ * input parameters\r
+ * @param   port    - port for which mapping desired\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   pointer to connInfo_t structure found. NULL if no mapping\r
+ *           found or entry not valid.\r
+ */\r
+\r
+connInfo_t *nwk_getConnInfo(linkID_t linkID)\r
+{\r
+    uint8_t idx, rc;\r
+\r
+    rc = map_lid2idx(linkID, &idx);\r
+\r
+    return (rc &&\r
+            (CONNSTATE_CONNECTED ==\r
+    sPersistInfo.connStruct[idx].connState)) ? &sPersistInfo.connStruct[idx] : (connInfo_t *)0;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_isLinkDuplicate\r
+ *\r
+ * @brief       Help determine if the link has already been established.. Defense\r
+ *              against duplicate link frames. This file owns the data structure\r
+ *              so the comparison is done here.\r
+ *\r
+ * input parameters\r
+ * @param   addr       - pointer to address of linker in question\r
+ * @param   remotePort - remote port number provided by linker\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   Returns pointer to connection entry if the address and remote Port\r
+ *           match an existing entry, otherwise 0.\r
+ */\r
+\r
+connInfo_t *nwk_isLinkDuplicate(uint8_t *addr, uint8_t remotePort)\r
+{\r
+#if NUM_CONNECTIONS > 0\r
+    uint8_t i;\r
+    connInfo_t   *ptr = sPersistInfo.connStruct;\r
+\r
+    for (i = 0; i < NUM_CONNECTIONS; ++i, ++ptr)\r
+    {\r
+        if (CONNSTATE_CONNECTED == ptr->connState)\r
+        {\r
+            if (!(memcmp(ptr->peerAddr, addr, NET_ADDR_SIZE)) &&\r
+                (ptr->portTx == remotePort))\r
+            {\r
+                return ptr;\r
+            }\r
+        }\r
+    }\r
+#endif\r
+\r
+    return (connInfo_t *)NULL;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_findAddressMatch\r
+ *\r
+ * @brief       Used to look for an address match in the Connection table.\r
+ *              Match is based on source address in frame.\r
+ *\r
+ * input parameters\r
+ * @param   frame    - pointer to frame in question\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   Returns non-zero if a match is found, otherwise 0.\r
+ */\r
+\r
+uint8_t nwk_findAddressMatch(mrfiPacket_t *frame)\r
+{\r
+#if NUM_CONNECTIONS > 0\r
+    uint8_t i;\r
+    connInfo_t   *ptr = sPersistInfo.connStruct;\r
+\r
+    for (i = 0; i < NUM_CONNECTIONS; ++i, ++ptr)\r
+    {\r
+\r
+        if (CONNSTATE_CONNECTED == ptr->connState)\r
+        {\r
+            if (!(memcmp(ptr->peerAddr, MRFI_P_SRC_ADDR(frame), NET_ADDR_SIZE)))\r
+            {\r
+                return 1;\r
+            }\r
+        }\r
+    }\r
+#endif\r
+\r
+    return 0;\r
+}\r
+\r
+#ifdef ACCESS_POINT\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_getSFInfoPtr\r
+ *\r
+ * @brief       Get pointer to store-and-forward information object kept in the\r
+ *              NV object aggregate.\r
+ *\r
+ * input parameters\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   Returns pointer to the store-nad-forward object.\r
+ */\r
+\r
+sfInfo_t *nwk_getSFInfoPtr(void)\r
+{\r
+    return &sPersistInfo.sSandFContext;\r
+}\r
+\r
+#    if defined(AP_IS_DATA_HUB)\r
+\r
+/***************************************************************************************\r
+ * @fn          nwk_saveJoinedDevice\r
+ *\r
+ * @brief       Save the address of a joining device on the Connection Table expecting\r
+ *              a Link frame to follow. Only for when AP is a data hub. We want to\r
+ *              use the space already allocated for a connection able entry instead\r
+ *              of having redundant arrays for alread-joined devices in the data hub\r
+ *              case.\r
+ *\r
+ * input parameters\r
+ * @param   frame  - pointer to frame containing address or joining device.\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   Returns non-zero if this is a new device and it is saved. Returns\r
+ *           0 if device already there or there is no room in the Connection\r
+ *           Table.\r
+ */\r
+\r
+uint8_t nwk_saveJoinedDevice(mrfiPacket_t *frame)\r
+{\r
+    uint8_t i;\r
+    connInfo_t *avail = 0;\r
+    connInfo_t *ptr   = sPersistInfo.connStruct;\r
+\r
+    for (i = 0; i < NUM_CONNECTIONS; ++i, ++ptr)\r
+    {\r
+        if ((ptr->connState == CONNSTATE_CONNECTED) || (ptr->connState == CONNSTATE_JOINED))\r
+        {\r
+            if (!memcmp(ptr->peerAddr, MRFI_P_SRC_ADDR(frame), NET_ADDR_SIZE))\r
+            {\r
+                return 0;\r
+            }\r
+        }\r
+        else\r
+        {\r
+            avail = ptr;\r
+        }\r
+    }\r
+\r
+    if (!avail)\r
+    {\r
+        return 0;\r
+    }\r
+\r
+    avail->connState = CONNSTATE_JOINED;\r
+    memcpy(avail->peerAddr, MRFI_P_SRC_ADDR(frame), NET_ADDR_SIZE);\r
+\r
+    return 1;\r
+}\r
+\r
+/***********************************************************************************\r
+ * @fn          nwk_findAlreadyJoined\r
+ *\r
+ * @brief       Used when AP is a data hub to look for an address match in the\r
+ *              Connection table for a device that is already enterd in the joined\r
+ *              state. This means that the Connection Table resource is already\r
+ *              allocated so the link-listen doesn't have to do it again. Match is\r
+ *              based on source address in frame. Thsi shoudl only be called from\r
+ *              the Link-listen context during the link frame reply.\r
+ *\r
+ *              If found the Connection Table entry is initialized as if it were\r
+ *              found using the nwk_getNextConnection() method.\r
+ *\r
+ * input parameters\r
+ * @param   frame    - pointer to frame in question\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   Returns pointer to Connection Table entry if match is found, otherwise\r
+ *           0. This call will only fail if the Connection Table was full when the\r
+ *           device tried to join initially.\r
+ */\r
+\r
+connInfo_t *nwk_findAlreadyJoined(mrfiPacket_t *frame)\r
+{\r
+    uint8_t i;\r
+    connInfo_t *ptr = sPersistInfo.connStruct;\r
+\r
+    for (i = 0; i < NUM_CONNECTIONS; ++i, ++ptr)\r
+    {\r
+        /* Look for an entry in the JOINED state */\r
+        if (CONNSTATE_JOINED == ptr->connState)\r
+        {\r
+            /* Is this it? */\r
+            if (!(memcmp(&ptr->peerAddr, MRFI_P_SRC_ADDR(frame), NET_ADDR_SIZE)))\r
+            {\r
+                /* Yes. Initilize tabel entry and return the pointer. */\r
+                initializeConnection(ptr);\r
+                return ptr;\r
+            }\r
+        }\r
+    }\r
+\r
+    /* Nothing found... */\r
+    return (connInfo_t *)NULL;\r
+}\r
+\r
+#    endif /* AP_IS_DATA_HUB */\r
+#endif     /* ACCESS_POINT */\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_checkConnInfo\r
+ *\r
+ * @brief       Do a sanity/validity check on the connection info\r
+ *\r
+ * input parameters\r
+ * @param   ptr     - pointer to a valid connection info structure to validate\r
+ * @param   which   - Tx or Rx port checked\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   Status of operation.\r
+ */\r
+\r
+smplStatus_t nwk_checkConnInfo(connInfo_t *ptr, uint8_t which)\r
+{\r
+    uint8_t port;\r
+\r
+    /* make sure port isn't null and that the entry is active */\r
+    port = (CHK_RX == which) ? ptr->portRx : ptr->portTx;\r
+    if (!port || (CONNSTATE_FREE == ptr->connState))\r
+    {\r
+        return SMPL_BAD_PARAM;\r
+    }\r
+\r
+    /* validate port number */\r
+    if (port < PORT_BASE_NUMBER)\r
+    {\r
+        return SMPL_BAD_PARAM;\r
+    }\r
+\r
+    return SMPL_SUCCESS;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_isConnectionValid\r
+ *\r
+ * @brief       Do a sanity/validity check on the frame target address by\r
+ *              validating frame against connection info\r
+ *\r
+ * input parameters\r
+ * @param   frame   - pointer to frame in question\r
+ *\r
+ * output parameters\r
+ * @param   lid   - link ID of found connection\r
+ *\r
+ * @return   0 if connection specified in frame is not valid, otherwise non-zero.\r
+ */\r
+\r
+uint8_t nwk_isConnectionValid(mrfiPacket_t *frame, linkID_t *lid)\r
+{\r
+    uint8_t i;\r
+    connInfo_t   *ptr  = sPersistInfo.connStruct;\r
+    uint8_t port = GET_FROM_FRAME(MRFI_P_PAYLOAD(frame), F_PORT_OS);\r
+\r
+    for (i = 0; i < SYS_NUM_CONNECTIONS; ++i, ++ptr)\r
+    {\r
+        if (CONNSTATE_CONNECTED == ptr->connState)\r
+        {\r
+            /* check port first since we're done if the port is the user bcast port. */\r
+            if (port == ptr->portRx)\r
+            {\r
+                /* yep...ports match. */\r
+                if ((SMPL_PORT_USER_BCAST == port) ||\r
+                    !(memcmp(ptr->peerAddr, MRFI_P_SRC_ADDR(frame), NET_ADDR_SIZE)))\r
+                {\r
+                    uint8_t rc = 1;\r
+\r
+                    /* we're done. */\r
+                    *lid = ptr->thisLinkID;\r
+#ifdef APP_AUTO_ACK\r
+                    /* can't ack the broadcast port... */\r
+                    if (!(SMPL_PORT_USER_BCAST == port))\r
+                    {\r
+                        if (GET_FROM_FRAME(MRFI_P_PAYLOAD(frame), F_ACK_REQ))\r
+                        {\r
+                            /* Ack requested. Send ack now */\r
+                            nwk_sendAckReply(frame, ptr->portTx);\r
+                        }\r
+                        else if (GET_FROM_FRAME(MRFI_P_PAYLOAD(frame), F_ACK_RPLY))\r
+                        {\r
+                            /* This is a reply. Signal that it was received by resetting the\r
+                             * saved transaction ID in the connection object if they match. The\r
+                             * main thread is polling this value. The setting here is in the\r
+                             * Rx ISR thread.\r
+                             */\r
+                            if (ptr->ackTID == GET_FROM_FRAME(MRFI_P_PAYLOAD(frame), F_TRACTID_OS))\r
+                            {\r
+                                ptr->ackTID = 0;\r
+                            }\r
+\r
+                            /* This causes the frame to be dropped. All ack frames are\r
+                             * dropped.\r
+                             */\r
+                            rc = 0;\r
+                        }\r
+                    }\r
+#endif              /* APP_AUTO_ACK */\r
+\r
+                    /* Unconditionally kill the reply delay semaphore. This used to be done\r
+                     * unconditionally in the calling routine.\r
+                     */\r
+                    MRFI_PostKillSem();\r
+                    return rc;\r
+                }\r
+            }\r
+        }\r
+    }\r
+\r
+    /* no matches */\r
+    return 0;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_allocateLocalRxPort\r
+ *\r
+ * @brief       Allocate a local port on which to receive frames from a peer.\r
+ *\r
+ *              Allocation differs depending on whether the allocation is for\r
+ *              a link reply frame or a link frame. In the former case we\r
+ *              know the address of the peer so we can ensure allocating a\r
+ *              unique port number for that address. The same port number can be\r
+ *              used mulitple times for distinct peers. Allocations are done from\r
+ *              the bottom of the namespace upward.\r
+ *\r
+ *              If allocation is for a link frame we do not yet know the peer\r
+ *              address so we must ensure the port number is unique now.\r
+ *              Allocations are done from the top of the namespace downward.\r
+ *\r
+ *              The two allocation methods track the extreme values used in each\r
+ *              case to detect overlap, i.e., exhausted namespace. This can only\r
+ *              happen if the number of connections supported is greater than the\r
+ *              total namespace available.\r
+ *\r
+ * input parameters\r
+ * @param   which   - Sending a link frame or a link reply frame\r
+ * @param   newPtr  - pointer to connection info structure to be populated\r
+ *\r
+ * output parameters\r
+ * @param   newPtr->portRx  - element is populated with port number.\r
+ *\r
+ * @return   Non-zero if port number assigned. 0 if no port available.\r
+ */\r
+\r
+uint8_t nwk_allocateLocalRxPort(uint8_t which, connInfo_t *newPtr)\r
+{\r
+#if NUM_CONNECTIONS > 0\r
+    uint8_t num, i;\r
+    uint8_t marker[NUM_CONNECTIONS];\r
+    connInfo_t *ptr = sPersistInfo.connStruct;\r
+\r
+    memset(&marker, 0x0, sizeof(marker));\r
+\r
+    for (i = 0; i < NUM_CONNECTIONS; ++i, ++ptr)\r
+    {\r
+        /* Mark the port number as used unless it's a statically allocated port */\r
+        if ((ptr != newPtr) && (CONNSTATE_CONNECTED == ptr->connState) &&\r
+            (ptr->portRx <= SMPL_PORT_USER_MAX))\r
+        {\r
+            if (LINK_SEND == which)\r
+            {\r
+                if (ptr->portRx > sPersistInfo.curNextLinkPort)\r
+                {\r
+                    marker[SMPL_PORT_USER_MAX - ptr->portRx] = 1;\r
+                }\r
+            }\r
+            else if (!memcmp(ptr->peerAddr, newPtr->peerAddr, NET_ADDR_SIZE))\r
+            {\r
+                marker[ptr->portRx - PORT_BASE_NUMBER] = 1;\r
+            }\r
+        }\r
+    }\r
+\r
+    num = 0;\r
+    for (i = 0; i < NUM_CONNECTIONS; ++i)\r
+    {\r
+        if (!marker[i])\r
+        {\r
+            if (LINK_REPLY == which)\r
+            {\r
+                num = PORT_BASE_NUMBER + i;\r
+            }\r
+            else\r
+            {\r
+                num = SMPL_PORT_USER_MAX - i;\r
+            }\r
+            break;\r
+        }\r
+    }\r
+\r
+    if (LINK_REPLY == which)\r
+    {\r
+        /* if the number we have doesn't overlap the assignment of ports used\r
+         * for sending link frames, use it.\r
+         */\r
+        if (num <= sPersistInfo.curNextLinkPort)\r
+        {\r
+            if (num > sPersistInfo.curMaxReplyPort)\r
+            {\r
+                /* remember maximum port number used */\r
+                sPersistInfo.curMaxReplyPort = num;\r
+            }\r
+        }\r
+        else\r
+        {\r
+            /* the port number we need has already been used in the other context. It may or\r
+             * may not have been used for the same address but we don't bother to check...we\r
+             * just reject the asignment. This is the overly cautious part but is extermely\r
+             * unlikely to ever occur.\r
+             */\r
+            num = 0;\r
+        }\r
+    }\r
+    else\r
+    {\r
+        /* if the number we have doesn't overlap the assignment of ports used\r
+         * for sending link frame replies, use it.\r
+         */\r
+        if (num >= sPersistInfo.curMaxReplyPort)\r
+        {\r
+            if (num == sPersistInfo.curNextLinkPort)\r
+            {\r
+                sPersistInfo.curNextLinkPort--;\r
+            }\r
+        }\r
+        else\r
+        {\r
+            /* the port number we need has already been used in the other context. It may or\r
+             * may not have been used for the same address but we don't bother to check...we\r
+             * just reject the asignment. This is the overly cautious part but is extermely\r
+             * unlikely to ever occur.\r
+             */\r
+            num = 0;\r
+        }\r
+    }\r
+\r
+    newPtr->portRx = num;\r
+\r
+    return num;\r
+#else\r
+    return 0;\r
+#endif  /* NUM_CONNECTIONS > 0 */\r
+\r
+}\r
+\r
+/*******************************************************************************\r
+ * @fn          nwk_isValidReply\r
+ *\r
+ * @brief       Examine a frame to see if it is a valid reply when compared with\r
+ *              expected parameters.\r
+ *\r
+ * input parameters\r
+ * @param   frame      - pointer to frmae being examined\r
+ * @param   tid        - expected transaction ID in application payload\r
+ * @param   infoOffset - offset to payload information containing reply hint\r
+ * @param   tidOffset  - offset to transaction ID in payload\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   reply category:\r
+ *               SMPL_NOT_REPLY: not a reply\r
+ *               SMPL_MY_REPLY : a reply that matches input parameters\r
+ *               SMPL_A_REPLY  : a reply but does not match input parameters\r
+ */\r
+\r
+uint8_t nwk_isValidReply(mrfiPacket_t *frame, uint8_t tid, uint8_t infoOffset, uint8_t tidOffset)\r
+{\r
+    uint8_t rc = SMPL_NOT_REPLY;\r
+\r
+    if ((*(MRFI_P_PAYLOAD(frame) + F_APP_PAYLOAD_OS + infoOffset) & NWK_APP_REPLY_BIT))\r
+    {\r
+        if ((*(MRFI_P_PAYLOAD(frame) + F_APP_PAYLOAD_OS + tidOffset) == tid) &&\r
+            !memcmp(MRFI_P_DST_ADDR(frame), nwk_getMyAddress(), NET_ADDR_SIZE))\r
+        {\r
+            rc = SMPL_MY_REPLY;\r
+        }\r
+        else\r
+        {\r
+            rc = SMPL_A_REPLY;\r
+        }\r
+    }\r
+\r
+    return rc;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          map_lid2idx\r
+ *\r
+ * @brief       Map link ID to index into connection table.\r
+ *\r
+ * input parameters\r
+ * @param   lid   - Link ID to be matched\r
+ *\r
+ * output parameters\r
+ * @param   idx   - populated with index into connection table\r
+ *\r
+ * @return   Non-zero if Link ID found and output is valid else 0.\r
+ */\r
+\r
+static uint8_t map_lid2idx(linkID_t lid, uint8_t *idx)\r
+{\r
+    uint8_t i;\r
+    connInfo_t *ptr = sPersistInfo.connStruct;\r
+\r
+    for (i = 0; i < SYS_NUM_CONNECTIONS; ++i, ++ptr)\r
+    {\r
+        if ((CONNSTATE_CONNECTED == ptr->connState) && (ptr->thisLinkID == lid))\r
+        {\r
+            *idx = i;\r
+            return 1;\r
+        }\r
+    }\r
+\r
+    return 0;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_findPeer\r
+ *\r
+ * @brief       Find connection entry for a peer\r
+ *\r
+ * input parameters\r
+ * @param   peerAddr   - address of peer\r
+ * @param   peerPort   - port on which this device was sending to peer.\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   Pointer to matching connection table entry else 0.\r
+ */\r
+\r
+connInfo_t *nwk_findPeer(addr_t *peerAddr, uint8_t peerPort)\r
+{\r
+    uint8_t i;\r
+    connInfo_t *ptr = sPersistInfo.connStruct;\r
+\r
+    for (i = 0; i < SYS_NUM_CONNECTIONS; ++i, ++ptr)\r
+    {\r
+        if (CONNSTATE_CONNECTED == ptr->connState)\r
+        {\r
+            if (!memcmp(peerAddr, ptr->peerAddr, NET_ADDR_SIZE))\r
+            {\r
+                if (peerPort == ptr->portTx)\r
+                {\r
+                    return ptr;\r
+                }\r
+            }\r
+        }\r
+    }\r
+\r
+    return (connInfo_t *)NULL;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_checkAppMsgTID\r
+ *\r
+ * @brief       Compare received TID to last-seen TID to decide whether the\r
+ *              received message is a duplicate or we missed some.\r
+ *\r
+ * input parameters\r
+ * @param   lastTID   - last-seen TID\r
+ * @param   appMsgTID - TID from current application payload.\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   Returns zero if message with supplied TID should be discarded.\r
+ *           Otherwise returns non-zero. In this case the message should be\r
+ *           processed. The last-seen TID should be updated with the current\r
+ *           application payload TID.\r
+ *\r
+ */\r
+\r
+uint8_t nwk_checkAppMsgTID(appPTid_t lastTID, appPTid_t appMsgTID)\r
+{\r
+    uint8_t rc = 0;\r
+\r
+    /* If the values are equal this is a duplicate. We're done. */\r
+    if (lastTID != appMsgTID)\r
+    {\r
+        /* Is the new TID bigger? */\r
+        if (appMsgTID > lastTID)\r
+        {\r
+            /* In this case the current payload is OK unless we've received a late\r
+             * (duplicate) message that occurred just before the TID wrapped. This is\r
+             * considered a duplicate and we should discard it.\r
+             */\r
+            if (!(DUP_TID_AFTER_WRAP(lastTID, appMsgTID)))\r
+            {\r
+                rc = 1;\r
+            }\r
+        }\r
+        else\r
+        {\r
+            /* New TID is smaller. Accept the payload if this is the wrap case or we missed\r
+             * the specific wrap frame but are still within the range in which we assume\r
+             * we missed it. Otherwise is a genuine late frame so we should ignore it.\r
+             */\r
+            if (CHECK_TID_WRAP(lastTID, appMsgTID))\r
+            {\r
+                rc = 1;\r
+            }\r
+        }\r
+    }\r
+\r
+    return rc;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_getNumObjectFromMsg\r
+ *\r
+ * @brief       Get a numeric object from a message buffer. Take care of\r
+ *              alignment and endianess issues.\r
+ *\r
+ * input parameters\r
+ * @param   src     - pointer to object location in message buffer\r
+ * @param   objSize - size of numeric object\r
+ *\r
+ * output parameters\r
+ * @param   dest - pointer to numeric type variable receiving the object\r
+ *                 contains aligned number in correct endian order on return.\r
+ *\r
+ * @return   void. There is no warning if there is no case for the supplied\r
+ *                 object size. A simple copy is then done. Alignment is\r
+ *                 guaranteed only for object size cases defined (and\r
+ *                 vacuously size 1).\r
+ *\r
+ */\r
+\r
+void nwk_getNumObjectFromMsg(void *src, void *dest, uint8_t objSize)\r
+{\r
+    /* Take care of alignment */\r
+    memmove(dest, src, objSize);\r
+\r
+    /* Take care of endianess */\r
+    switch (objSize)\r
+    {\r
+        case 2:\r
+            *((uint16_t *)dest) = ntohs(*((uint16_t *)dest));\r
+            break;\r
+\r
+        case 4:\r
+            *((uint32_t *)dest) = ntohl(*((uint32_t *)dest));\r
+            break;\r
+    }\r
+\r
+    return;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_putNumObjectIntoMsg\r
+ *\r
+ * @brief       Put a numeric object into a message buffer. Take care of\r
+ *              alignment and endianess issues.\r
+ *\r
+ * input parameters\r
+ * @param   src     - pointer to numeric type variable providing the object\r
+ * @param   objSize - size of numeric object. Fuction works for object size 1.\r
+ *\r
+ * output parameters\r
+ * @param   dest - pointer to object location in message buffer where the\r
+ *                 correct endian order representation will be placed.\r
+ *\r
+ * @return   void. There is no warning if there is no case for the supplied\r
+ *                 object size. A simple copy is then done.\r
+ *\r
+ */\r
+\r
+void nwk_putNumObjectIntoMsg(void *src, void *dest, uint8_t objSize)\r
+{\r
+\r
+    uint8_t *ptr;\r
+    uint16_t u16;\r
+    uint32_t u32;\r
+\r
+    /* Take care of endianess */\r
+    switch (objSize)\r
+    {\r
+        case 1:\r
+            ptr = (uint8_t *)src;\r
+            break;\r
+\r
+        case 2:\r
+            u16 = htons(*((uint16_t *)src));\r
+            ptr = (uint8_t *)&u16;\r
+            break;\r
+\r
+        case 4:\r
+            u32 = htonl(*((uint32_t *)src));\r
+            ptr = (uint8_t *)&u32;\r
+            break;\r
+\r
+        default:\r
+            ptr = (uint8_t *)src;\r
+            break;\r
+    }\r
+\r
+    /* Take care of alignment */\r
+    memmove(dest, ptr, objSize);\r
+\r
+    return;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_NVObj\r
+ *\r
+ * @brief       GET and SET support for NV object (connection context).\r
+ *\r
+ * input parameters\r
+ * @param   action  - GET or SET\r
+ * @param   val     - (GET/SET) pointer to NV IOCTL object.\r
+ *                    (SET) NV length and version values to be used for sanity\r
+ *                    checks.\r
+ *\r
+ * output parameters\r
+ * @param   val     - (GET) Version number of NV object, size of NV object and\r
+ *                          pointer to the connection context memory.\r
+ *                  - (SET) Pointer to the connection context memory.\r
+ *\r
+ * @return   SMPL_SUCCESS\r
+ *           SMPL_BAD_PARAM   Object version or size do not conform on a SET call\r
+ *                            or illegal action specified.\r
+ */\r
+\r
+smplStatus_t nwk_NVObj(ioctlAction_t action, ioctlNVObj_t *val)\r
+{\r
+#ifdef NVOBJECT_SUPPORT\r
+    smplStatus_t rc = SMPL_SUCCESS;\r
+\r
+    if (IOCTL_ACT_GET == action)\r
+    {\r
+        /* Populate helper objects */\r
+        val->objLen     = SIZEOF_NV_OBJ;\r
+        val->objVersion = sPersistInfo.structureVersion;\r
+        /* Set pointer to connection context if address of pointer is not null */\r
+        if (val->objPtr)\r
+        {\r
+            *(val->objPtr) = (uint8_t *)&sPersistInfo;\r
+        }\r
+    }\r
+    else\r
+    {\r
+        rc = SMPL_BAD_PARAM;\r
+    }\r
+\r
+    return rc;\r
+#else  /* NVOBJECT_SUPPORT */\r
+    return SMPL_BAD_PARAM;\r
+#endif\r
+}\r
+\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/Components/nwk/nwk.h b/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/Components/nwk/nwk.h
new file mode 100755 (executable)
index 0000000..4fffc01
--- /dev/null
@@ -0,0 +1,164 @@
+/**************************************************************************************************\r
+*  Filename:       nwk.h\r
+*  Revised:        $Date: 2008-12-01 11:58:33 -0800 (Mon, 01 Dec 2008) $\r
+*  Revision:       $Revision: 18551 $\r
+*  Author:         $Author: lfriedman $\r
+*\r
+*  Description:    This header file supports the SimpliciTI network layer.\r
+*\r
+*  Copyright 2004-2007 Texas Instruments Incorporated. All rights reserved.\r
+*\r
+*  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+*  the terms of a software license agreement between the user who downloaded the software,\r
+*  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+*  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+*  License. The License limits your use, and you acknowledge, that the Software may not be\r
+*  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+*  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+*  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+*  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+*  perform, display or sell this Software and/or its documentation for any purpose.\r
+*\r
+*  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+*  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+*  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+*  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+*  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+*  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+*  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+*  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+*  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+*\r
+*  Should you have any questions regarding your right to use this Software,\r
+*  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+#ifndef NWK_H\r
+#define NWK_H\r
+\r
+\r
+/* well known ports*/\r
+#define SMPL_PORT_PING          0x01\r
+#define SMPL_PORT_LINK          0x02\r
+#define SMPL_PORT_JOIN          0x03\r
+#define SMPL_PORT_SECURITY      0x04\r
+#define SMPL_PORT_FREQ          0x05\r
+#define SMPL_PORT_MGMT          0x06\r
+\r
+#define SMPL_PORT_NWK_BCAST     0x1F\r
+#define SMPL_PORT_USER_BCAST    0x3F\r
+\r
+/* Unconnected User Datagram Link ID */\r
+#define SMPL_LINKID_USER_UUD    ((linkID_t) ~0)\r
+\r
+#define PORT_BASE_NUMBER        0x20\r
+\r
+/* Reserve the top of the User port namespace below the broadcast\r
+ * address for static allocation.\r
+ */\r
+#define PORT_USER_STATIC_NUM    1\r
+#define SMPL_PORT_STATIC_MAX    0x3E\r
+#define SMPL_PORT_USER_MAX      (SMPL_PORT_STATIC_MAX - PORT_USER_STATIC_NUM)\r
+\r
+\r
+/* to check connection info sanity */\r
+#define CHK_RX   0\r
+#define CHK_TX   1\r
+\r
+/* return types for validating a reply frame */\r
+#define SMPL_MY_REPLY    0\r
+#define SMPL_A_REPLY     1\r
+#define SMPL_NOT_REPLY   2\r
+\r
+/* when allocating local Rx port it depends on whether the allocation\r
+ * is being done as a result of a link or a link reply\r
+ */\r
+#define LINK_SEND   1\r
+#define LINK_REPLY  2\r
+\r
+#define  CONNSTATE_FREE       (0x00)\r
+#define  CONNSTATE_JOINED     (0x01)\r
+#define  CONNSTATE_CONNECTED  (0x02)\r
+\r
+typedef struct\r
+{\r
+    volatile uint8_t connState;\r
+    uint8_t hops2target;\r
+#ifdef APP_AUTO_ACK\r
+    volatile uint8_t ackTID;\r
+#endif\r
+    uint8_t peerAddr[NET_ADDR_SIZE];\r
+    rxMetrics_t sigInfo;\r
+    uint8_t portRx;\r
+    uint8_t portTx;\r
+    linkID_t thisLinkID;\r
+#ifdef SMPL_SECURE\r
+    uint32_t connTxCTR;\r
+    uint32_t connRxCTR;\r
+#endif\r
+} connInfo_t;\r
+\r
+/****************************************************************************************\r
+ *                         Application Payload TID support\r
+ *\r
+ * Sometimes the receiving application uses a payload TID to determine if either it\r
+ * missed frames (received TID > (last-seen TID+1)) or is seeing a duplicate (received\r
+ * TID <= last-seen TID). Typically the TID simply increments for each successive frame.\r
+ * But when the count wraps there is a problem. The received TID should always be one\r
+ * more than the last TID. If it's equal, it's a duplicate. If it's less it's late. If\r
+ * it's one more it's the one we expect. If it's more than 1 more then we missed frames.\r
+ * Simple increments work for the wrap arithmetically. If the received TID is 0 and the last\r
+ * seen ID is the biggest number in the world -- 0xFF... depending on type we can detect\r
+ * the wrap. But if the receiver misses the 0 TID value for any reason or the biggest\r
+ * number in the world TID is missed then susbequent testing for missed or duplicate\r
+ * frames can get confused. We resolve this by allowing some leeway in the wrap testing.\r
+ * this testing is assisted by the following macros. Setting TID_VALID_WINDOW to 0\r
+ * will enforce a no leniency policy. In this case you'd better not miss either the\r
+ * biggest number or the 0. The CHECK_TID_WRAP macro is only needed if the received\r
+ * TID is less than the last-seen TID. The DUP_TID_AFTER_WRAP macro is only needed if the\r
+ * received TID is greater than 1 more than the last-seen TID.\r
+ ***************************************************************************************/\r
+#define MAX_APT           ((appPTid_t) ~0)   /* max value of application payload TID type */\r
+#define TID_VALID_WINDOW  2                  /* window around max and 0 */\r
+\r
+#define CHECK_TID_WRAP(lastTID, newTID)   ((lastTID >= (MAX_APT - TID_VALID_WINDOW)) &&  \\r
+                                           (newTID <= TID_VALID_WINDOW)                  \\r
+                                           )\r
+#define DUP_TID_AFTER_WRAP(lastTID, newTID)     ((newTID >= (MAX_APT - TID_VALID_WINDOW)) &&  \\r
+                                                 (lastTID <= TID_VALID_WINDOW)                  \\r
+                                                 )\r
+\r
+/* prototypes */\r
+smplStatus_t nwk_nwkInit(uint8_t (*)(linkID_t));\r
+connInfo_t   *nwk_getNextConnection(void);\r
+void nwk_freeConnection(connInfo_t *);\r
+uint8_t nwk_getNextClientPort(void);\r
+connInfo_t   *nwk_getConnInfo(linkID_t port);\r
+\r
+connInfo_t   *nwk_isLinkDuplicate(uint8_t *, uint8_t);\r
+uint8_t nwk_findAddressMatch(mrfiPacket_t *);\r
+\r
+smplStatus_t nwk_checkConnInfo(connInfo_t *, uint8_t);\r
+uint8_t nwk_isConnectionValid(mrfiPacket_t *, linkID_t *);\r
+\r
+uint8_t nwk_allocateLocalRxPort(uint8_t, connInfo_t *);\r
+uint8_t nwk_isValidReply(mrfiPacket_t *, uint8_t, uint8_t, uint8_t);\r
+connInfo_t   *nwk_findPeer(addr_t *, uint8_t);\r
+smplStatus_t nwk_NVObj(ioctlAction_t, ioctlNVObj_t *);\r
+\r
+\r
+uint8_t nwk_checkAppMsgTID(appPTid_t, appPTid_t);\r
+void nwk_getNumObjectFromMsg(void *, void *, uint8_t);\r
+void nwk_putNumObjectIntoMsg(void *, void *, uint8_t);\r
+#ifdef ACCESS_POINT\r
+sfInfo_t     *nwk_getSFInfoPtr(void);\r
+\r
+#    ifdef AP_IS_DATA_HUB\r
+uint8_t nwk_saveJoinedDevice(mrfiPacket_t *);\r
+connInfo_t   *nwk_findAlreadyJoined(mrfiPacket_t *);\r
+\r
+#    endif\r
+#endif\r
+\r
+\r
+#endif\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/Components/nwk/nwk_QMgmt.c b/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/Components/nwk/nwk_QMgmt.c
new file mode 100755 (executable)
index 0000000..721cad7
--- /dev/null
@@ -0,0 +1,422 @@
+/**************************************************************************************************\r
+*  Filename:       nwk_QMgmt.c\r
+*  Revised:        $Date: 2009-03-10 17:01:56 -0700 (Tue, 10 Mar 2009) $\r
+*  Revision:       $Revision: 19372 $\r
+*  Author:         $Author: lfriedman $\r
+*\r
+*  Description:    This file supports the SimpliciTI input and output frame queues\r
+*\r
+*  Copyright 2007-2008 Texas Instruments Incorporated. All rights reserved.\r
+*\r
+*  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+*  the terms of a software license agreement between the user who downloaded the software,\r
+*  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+*  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+*  License. The License limits your use, and you acknowledge, that the Software may not be\r
+*  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+*  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+*  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+*  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+*  perform, display or sell this Software and/or its documentation for any purpose.\r
+*\r
+*  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+*  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+*  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+*  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+*  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+*  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+*  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+*  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+*  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+*\r
+*  Should you have any questions regarding your right to use this Software,\r
+*  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+\r
+/******************************************************************************\r
+ * INCLUDES\r
+ */\r
+#include <intrinsics.h>\r
+#include <string.h>\r
+#include "bsp.h"\r
+#include "mrfi.h"\r
+#include "nwk_types.h"\r
+#include "nwk.h"\r
+#include "nwk_frame.h"\r
+#include "nwk_QMgmt.h"\r
+#include "nwk_mgmt.h"     /* need offsets for poll frames */\r
+\r
+/******************************************************************************\r
+ * MACROS\r
+ */\r
+\r
+/******************************************************************************\r
+ * CONSTANTS AND DEFINES\r
+ */\r
+\r
+/******************************************************************************\r
+ * TYPEDEFS\r
+ */\r
+\r
+/******************************************************************************\r
+ * LOCAL VARIABLES\r
+ */\r
+\r
+#if SIZE_INFRAME_Q > 0\r
+static frameInfo_t sInFrameQ[SIZE_INFRAME_Q];\r
+#else\r
+static frameInfo_t  *sInFrameQ = NULL;\r
+#endif  /* SIZE_INFRAME_Q > 0 */\r
+\r
+static frameInfo_t sOutFrameQ[SIZE_OUTFRAME_Q];\r
+\r
+/******************************************************************************\r
+ * LOCAL FUNCTIONS\r
+ */\r
+\r
+/******************************************************************************\r
+ * GLOBAL VARIABLES\r
+ */\r
+\r
+/******************************************************************************\r
+ * GLOBAL FUNCTIONS\r
+ */\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_QInit\r
+ *\r
+ * @brief     Initialize the input and output frame queues to hold no packets.\r
+ *\r
+ * input parameters\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   void\r
+ */\r
+\r
+void nwk_QInit(void)\r
+{\r
+#if SIZE_INFRAME_Q > 0\r
+    memset(sInFrameQ, 0, sizeof(sInFrameQ));\r
+#endif  // SIZE_INFRAME_Q > 0\r
+    memset(sOutFrameQ, 0, sizeof(sOutFrameQ));\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_QfindSlot\r
+ *\r
+ * @brief       Finds a slot to use to retrieve the frame from the radio. It\r
+ *              uses a LRU cast-out scheme. It is possible that this routine\r
+ *              finds no slot. This can happen if the queue is of size 1 or 2\r
+ *              and the Rx interrupt occurs during a retrieval call from an\r
+ *              application. There are meta-states for frames as the application\r
+ *              looks for the oldest frame on the port being requested.\r
+ *\r
+ *              This routine is running in interrupt context.\r
+ *\r
+ * input parameters\r
+ * @param   which   - INQ or OUTQ to search\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return      Pointer to oldest available frame in the queue\r
+ */\r
+\r
+frameInfo_t *nwk_QfindSlot(uint8_t which)\r
+{\r
+    frameInfo_t *pFI, *oldest = 0, *newFI = 0;\r
+    uint8_t i, num, newOrder = 0, orderTest;\r
+\r
+    if (INQ == which)\r
+    {\r
+        pFI  = sInFrameQ;\r
+        num  = SIZE_INFRAME_Q;\r
+    }\r
+    else\r
+    {\r
+        pFI  = sOutFrameQ;\r
+        num  = SIZE_OUTFRAME_Q;\r
+    }\r
+\r
+    orderTest = num + 1;\r
+\r
+    for (i = 0; i < num; ++i, ++pFI)\r
+    {\r
+        /* if frame is available it's a candidate. */\r
+        if (pFI->fi_usage != FI_AVAILABLE)\r
+        {\r
+            if (INQ == which) /* TODO: do cast-out for Tx as well */\r
+            {\r
+\r
+                /* need to know the number of occupied slots so we know the age value\r
+                 * for the unoccupied slot (if there is one).\r
+                 */\r
+                newOrder++;\r
+\r
+                /* make sure nwk_retrieveFrame() is not processing this frame */\r
+                if (FI_INUSE_TRANSITION == pFI->fi_usage)\r
+                {\r
+                    continue;\r
+                }\r
+                /* is this frame older than any we've seen? */\r
+                if (orderTest > pFI->orderStamp)\r
+                {\r
+                    /* yes. */\r
+                    oldest    = pFI;\r
+                    orderTest = pFI->orderStamp;\r
+                }\r
+            }\r
+        }\r
+        else\r
+        {\r
+            if (OUTQ == which) /* TODO: do cast-out for Tx as well */\r
+            {\r
+                return pFI;\r
+            }\r
+            newFI = pFI;\r
+        }\r
+    }\r
+\r
+    /* did we find anything? */\r
+    if (!newFI)\r
+    {\r
+        /* queue was full. cast-out happens here...unless... */\r
+        if (!oldest)\r
+        {\r
+            /* This can happen if the queue is only of size 1 or 2 and all\r
+             * the frames are in transition when the Rx interrupt occurs.\r
+             */\r
+            return (frameInfo_t *)0;\r
+        }\r
+        newFI = oldest;\r
+        nwk_QadjustOrder(which, newFI->orderStamp);\r
+        newFI->orderStamp = i;\r
+    }\r
+    else\r
+    {\r
+        /* mark the available slot. */\r
+        newFI->orderStamp = ++newOrder;\r
+    }\r
+\r
+    return newFI;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_QadjustOrder\r
+ *\r
+ * @brief       Adjusts the age of everyone in the queue newer than the frame\r
+ *              being removed.\r
+ *\r
+ * input parameters\r
+ * @param   which   - INQ or OUTQ to adjust\r
+ * @param   stamp   - value of frame being removed\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return      void\r
+ */\r
+\r
+void nwk_QadjustOrder(uint8_t which, uint8_t stamp)\r
+{\r
+    frameInfo_t *pFI;\r
+    uint8_t i, num;\r
+    bspIState_t intState;\r
+\r
+    if (INQ == which)\r
+    {\r
+        pFI  = sInFrameQ;\r
+        num  = SIZE_INFRAME_Q;\r
+    }\r
+    else\r
+    {\r
+        /*    pFI  = sOutFrameQ;\r
+         *    num  = SIZE_OUTFRAME_Q; */\r
+        return;\r
+    }\r
+\r
+    BSP_ENTER_CRITICAL_SECTION(intState);\r
+\r
+    for (i = 0; i < num; ++i, ++pFI)\r
+    {\r
+        if ((pFI->fi_usage != FI_AVAILABLE) && (pFI->orderStamp > stamp))\r
+        {\r
+            pFI->orderStamp--;\r
+        }\r
+    }\r
+\r
+    BSP_EXIT_CRITICAL_SECTION(intState);\r
+\r
+    return;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_QfindOldest\r
+ *\r
+ * @brief       Look through frame queue and find the oldest available frame\r
+ *              in the context in question. Supports connection-based (user),\r
+ *              non-connection based (NWK applications), and the special case\r
+ *              of store-and-forward.\r
+ *\r
+ * input parameters\r
+ * @param   which      - INQ or OUTQ to adjust\r
+ * @param   rcvContext - context information for finding the oldest\r
+ * @param   usage      - normal usage or store-and-forward usage\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return      Pointer to frame that is the oldsest on the requested port, or\r
+ *              0 if there are none.\r
+ */\r
+\r
+frameInfo_t *nwk_QfindOldest(uint8_t which, rcvContext_t *rcv, uint8_t fi_usage)\r
+{\r
+    uint8_t i, oldest, num, port;\r
+    uint8_t uType, addr12Compare;\r
+    bspIState_t intState;\r
+    frameInfo_t *fPtr = 0, *wPtr;\r
+    connInfo_t  *pCInfo = 0;\r
+    uint8_t     *pAddr1, *pAddr2, *pAddr3 = 0;\r
+\r
+    if (INQ == which)\r
+    {\r
+        wPtr   = sInFrameQ;\r
+        num    = SIZE_INFRAME_Q;\r
+        oldest = SIZE_INFRAME_Q + 1;\r
+    }\r
+    else\r
+    {\r
+        /*    pFI  = sOutFrameQ;\r
+         *    num  = SIZE_OUTFRAME_Q; */\r
+        return 0;\r
+    }\r
+\r
+    if (RCV_APP_LID == rcv->type)\r
+    {\r
+        pCInfo = nwk_getConnInfo(rcv->t.lid);\r
+        if (!pCInfo)\r
+        {\r
+            return (frameInfo_t *)0;\r
+        }\r
+        port   = pCInfo->portRx;\r
+        pAddr2 = pCInfo->peerAddr;\r
+    }\r
+    else if (RCV_NWK_PORT == rcv->type)\r
+    {\r
+        port = rcv->t.port;\r
+    }\r
+#ifdef ACCESS_POINT\r
+    else if (RCV_RAW_POLL_FRAME == rcv->type)\r
+    {\r
+        port   = *(MRFI_P_PAYLOAD(rcv->t.pkt) + F_APP_PAYLOAD_OS + M_POLL_PORT_OS);\r
+        pAddr2 = MRFI_P_SRC_ADDR(rcv->t.pkt);\r
+        pAddr3 = MRFI_P_PAYLOAD(rcv->t.pkt) + F_APP_PAYLOAD_OS + M_POLL_ADDR_OS;\r
+    }\r
+#endif\r
+    else\r
+    {\r
+        return (frameInfo_t *)0;\r
+    }\r
+\r
+    uType = (USAGE_NORMAL == fi_usage) ? FI_INUSE_UNTIL_DEL : FI_INUSE_UNTIL_FWD;\r
+\r
+    for (i = 0; i < num; ++i, ++wPtr)\r
+    {\r
+\r
+        BSP_ENTER_CRITICAL_SECTION(intState);    /* protect the frame states */\r
+\r
+        /* only check entries in use and waiting for this port */\r
+        if (uType == wPtr->fi_usage)\r
+        {\r
+            wPtr->fi_usage = FI_INUSE_TRANSITION;\r
+\r
+            BSP_EXIT_CRITICAL_SECTION(intState); /* release hold */\r
+            /* message sent to this device? */\r
+            if (GET_FROM_FRAME(MRFI_P_PAYLOAD(&wPtr->mrfiPkt), F_PORT_OS) == port)\r
+            {\r
+                /* Port matches. If the port of interest is a NWK applicaiton we're a\r
+                 * match...the NWK applications are not connection-based. If it is a\r
+                 * NWK application we need to check the source address for disambiguation.\r
+                 * Also need to check source address if it's a raw frame lookup (S&F frame)\r
+                 */\r
+                if (RCV_APP_LID == rcv->type)\r
+                {\r
+                    if (SMPL_PORT_USER_BCAST == port)\r
+                    {\r
+                        /* guarantee a match... */\r
+                        pAddr1 = pCInfo->peerAddr;\r
+                    }\r
+                    else\r
+                    {\r
+                        pAddr1 = MRFI_P_SRC_ADDR(&wPtr->mrfiPkt);\r
+                    }\r
+                }\r
+#ifdef ACCESS_POINT\r
+                else if (RCV_RAW_POLL_FRAME == rcv->type)\r
+                {\r
+                    pAddr1 = MRFI_P_DST_ADDR(&wPtr->mrfiPkt);\r
+                }\r
+#endif\r
+\r
+                addr12Compare = memcmp(pAddr1, pAddr2, NET_ADDR_SIZE);\r
+                if ((RCV_NWK_PORT == rcv->type) ||\r
+                    (!pAddr3 && !addr12Compare) ||\r
+                    (pAddr3 && !memcmp(pAddr3, MRFI_P_SRC_ADDR(&wPtr->mrfiPkt), NET_ADDR_SIZE))\r
+                    )\r
+                {\r
+                    if (wPtr->orderStamp < oldest)\r
+                    {\r
+                        if (fPtr)\r
+                        {\r
+                            /* restore previous oldest one */\r
+                            fPtr->fi_usage = uType;\r
+                        }\r
+                        oldest = wPtr->orderStamp;\r
+                        fPtr   = wPtr;\r
+                        continue;\r
+                    }\r
+                    else\r
+                    {\r
+                        /* not oldest. restore state */\r
+                        wPtr->fi_usage = uType;\r
+                    }\r
+                }\r
+                else\r
+                {\r
+                    /* not a match. restore state */\r
+                    wPtr->fi_usage = uType;\r
+                }\r
+            }\r
+            else\r
+            {\r
+                /* wrong port. restore state */\r
+                wPtr->fi_usage = uType;\r
+            }\r
+        }\r
+        else\r
+        {\r
+            BSP_EXIT_CRITICAL_SECTION(intState);\r
+        }\r
+    }\r
+\r
+    return fPtr;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_getQ\r
+ *\r
+ * @brief       Get location of teh specified frame queue.\r
+ *\r
+ * input parameters\r
+ * @param   which   - INQ or OUTQ to get\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return      Pointer to frame queue\r
+ */\r
+\r
+frameInfo_t *nwk_getQ(uint8_t which)\r
+{\r
+    return (INQ == which) ? sInFrameQ : sOutFrameQ;\r
+}\r
+\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/Components/nwk/nwk_QMgmt.h b/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/Components/nwk/nwk_QMgmt.h
new file mode 100755 (executable)
index 0000000..c66e141
--- /dev/null
@@ -0,0 +1,54 @@
+/**************************************************************************************************\r
+*  Filename:       nwk_QMgmt.h\r
+*  Revised:        $Date: 2009-01-17 15:14:16 -0800 (Sat, 17 Jan 2009) $\r
+*  Revision:       $Revision: 18788 $\r
+*  Author:         $Author: rlord $\r
+*\r
+*  Description:    This header file supports the SimpliciTI input and output frame queues.\r
+*\r
+*  Copyright 2007-2009 Texas Instruments Incorporated. All rights reserved.\r
+*\r
+*  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+*  the terms of a software license agreement between the user who downloaded the software,\r
+*  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+*  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+*  License. The License limits your use, and you acknowledge, that the Software may not be\r
+*  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+*  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+*  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+*  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+*  perform, display or sell this Software and/or its documentation for any purpose.\r
+*\r
+*  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+*  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+*  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+*  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+*  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+*  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+*  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+*  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+*  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+*\r
+*  Should you have any questions regarding your right to use this Software,\r
+*  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+#ifndef NWK_QMGMT_H\r
+#define NWK_QMGMT_H\r
+\r
+\r
+#define  INQ   1\r
+#define  OUTQ  2\r
+\r
+#define  USAGE_NORMAL  1\r
+#define  USAGE_FWD     2\r
+\r
+/* prototypes */\r
+void nwk_QInit(void);\r
+\r
+frameInfo_t *nwk_QfindSlot(uint8_t);\r
+void nwk_QadjustOrder(uint8_t, uint8_t);\r
+frameInfo_t *nwk_QfindOldest(uint8_t, rcvContext_t *, uint8_t);\r
+frameInfo_t *nwk_getQ(uint8_t);\r
+\r
+#endif  /* NWK_QMGMT_H */\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/Components/nwk/nwk_api.c b/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/Components/nwk/nwk_api.c
new file mode 100755 (executable)
index 0000000..caa6093
--- /dev/null
@@ -0,0 +1,876 @@
+/**************************************************************************************************\r
+*  Filename:       nwk_api.c\r
+*  Revised:        $Date: 2009-01-28 18:27:38 -0800 (Wed, 28 Jan 2009) $\r
+*  Revision:       $Revision: 18875 $\r
+*  Author:         $Author: lfriedman $\r
+*\r
+*  Description:    This file supports the SimpliciTI appliction layer API.\r
+*\r
+*  Copyright 2007-2009 Texas Instruments Incorporated. All rights reserved.\r
+*\r
+*  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+*  the terms of a software license agreement between the user who downloaded the software,\r
+*  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+*  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+*  License. The License limits your use, and you acknowledge, that the Software may not be\r
+*  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+*  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+*  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+*  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+*  perform, display or sell this Software and/or its documentation for any purpose.\r
+*\r
+*  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+*  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+*  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+*  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+*  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+*  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+*  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+*  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+*  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+*\r
+*  Should you have any questions regarding your right to use this Software,\r
+*  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+/******************************************************************************\r
+ * INCLUDES\r
+ */\r
+\r
+#include <string.h>\r
+#include "bsp.h"\r
+#include "mrfi.h"\r
+#include "nwk_types.h"\r
+#include "nwk_api.h"\r
+#include "nwk_frame.h"\r
+#include "nwk.h"\r
+#include "nwk_app.h"\r
+#include "mrfi.h"\r
+#include "nwk_globals.h"\r
+#include "nwk_freq.h"\r
+\r
+/******************************************************************************\r
+ * MACROS\r
+ */\r
+\r
+/******************************************************************************\r
+ * CONSTANTS AND DEFINES\r
+ */\r
+\r
+/* These defines are in support an application listening for a link frame to\r
+ * terminate after some amount of time. The intention is that this guard be\r
+ * the exception. The intention of the SimpliciTI design is that the\r
+ * temporal contiguity between the listen and the reception of the link frame\r
+ * from the peer be very tight. The SMPL_LinkListen() should be termninated\r
+ * by the reception of the link frame. But in case it does not receive the frame\r
+ * the support below allows intervention by the application.\r
+ */\r
+\r
+/* The intention is for user to modify just the following single value */\r
+#define LINKLISTEN_MILLISECONDS_2_WAIT    (5000)\r
+\r
+#define LINKLISTEN_POLL_PERIOD_MS         (10)\r
+#define LINKLISTEN_POLL_COUNT             ((LINKLISTEN_MILLISECONDS_2_WAIT) / \\r
+                                           (LINKLISTEN_POLL_PERIOD_MS))\r
+\r
+/******************************************************************************\r
+ * TYPEDEFS\r
+ */\r
+\r
+/******************************************************************************\r
+ * LOCAL VARIABLES\r
+ */\r
+// [BM] Workaround to enable multiple stack restarts\r
+// static uint8_t sInit_done = 0;\r
+uint8_t sInit_done = 0;\r
+\r
+/******************************************************************************\r
+ * LOCAL FUNCTIONS\r
+ */\r
+static uint8_t ioctlPreInitAccessIsOK(ioctlObject_t);\r
+\r
+/******************************************************************************\r
+ * GLOBAL VARIABLES\r
+ */\r
+\r
+/******************************************************************************\r
+ * GLOBAL FUNCTIONS\r
+ */\r
+\r
+/***********************************************************************************\r
+ * @fn          SMPL_Init\r
+ *\r
+ * @brief       Initialize the SimpliciTI stack.\r
+ *\r
+ * input parameters\r
+ * @param   f  - Pointer to call back function. Function called by NWK when\r
+ *               user application frame received. The callback is done in the\r
+ *               ISR thread. Argument is Link ID associated with frame. Function\r
+ *               returns 0 if frame is to be kept by NWK, otherwise 1. Frame\r
+ *               should be kept if application will do a SMPL_Receive() in the\r
+ *               user thread (recommended). Pointer may be NULL.\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   Status of operation:\r
+ *             SMPL_SUCCESS\r
+ *             SMPL_NO_JOIN     No Join reply. AP possibly not yet up.\r
+ *             SMPL_NO_CHANNEL  Only if Frequency Agility enabled. Channel scan\r
+ *                              failed. AP possibly not yet up.\r
+ */\r
+\r
+smplStatus_t SMPL_Init(uint8_t (*f)(linkID_t))\r
+{\r
+    smplStatus_t rc;\r
+\r
+    if (!sInit_done)\r
+    {\r
+        /* set up radio. */\r
+        MRFI_Init();\r
+\r
+        /* initialize network */\r
+        if ((rc = nwk_nwkInit(f)) != SMPL_SUCCESS)\r
+        {\r
+            return rc;\r
+        }\r
+\r
+        MRFI_WakeUp();\r
+#if defined(FREQUENCY_AGILITY)\r
+        {\r
+            freqEntry_t chan;\r
+\r
+            chan.logicalChan = 0;\r
+            /* ok to set default channel explicitly now that MRFI initialized. */\r
+            nwk_setChannel(&chan);\r
+        }\r
+#endif\r
+        /* don't turn Rx on if we're an end device that isn't always on. */\r
+#if !defined(END_DEVICE)\r
+        MRFI_RxOn();\r
+#endif\r
+\r
+#if defined(END_DEVICE)\r
+        /* All except End Devices are in promiscuous mode */\r
+        MRFI_SetRxAddrFilter((uint8_t *)nwk_getMyAddress());\r
+        MRFI_EnableRxAddrFilter();\r
+#endif\r
+    }\r
+    sInit_done = 1;\r
+\r
+    /* Join. if no AP or Join fails that status is returned. */\r
+    rc = nwk_join();\r
+\r
+    return rc;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          SMPL_LinkListen\r
+ *\r
+ * @brief       Listen for a link frame from a 'client' device.\r
+ *\r
+ * input parameters\r
+ *\r
+ * output parameters\r
+ * @param   linkID     - pointer to Link ID to be used by application to\r
+ *                       read and write to the linked peer.\r
+ *\r
+ * @return   status of operation.\r
+ *             SMPL_SUCCESS\r
+ *             SMPL_TIMEOUT  No link frame received during listen interval.\r
+ *                            Interval set in #defines above. linkID not valid.\r
+ *\r
+ */\r
+\r
+smplStatus_t SMPL_LinkListen(linkID_t *linkID)\r
+{\r
+    uint8_t radioState = MRFI_GetRadioState();\r
+    uint16_t i;\r
+    linkID_t locLinkID;\r
+\r
+    /* Set the context. We want to reject any link frames received if\r
+     * we're not listening. For example if we're an AP we are in\r
+     * promiscuous mode and we'll see any broadcast link frames.\r
+     */\r
+    nwk_setListenContext(LINK_LISTEN_ON);\r
+\r
+    NWK_CHECK_FOR_SETRX(radioState);\r
+\r
+    for (i = 0; i < LINKLISTEN_POLL_COUNT; ++i)\r
+    {\r
+        /* check the semaphore. local port is assigned when the reply is sent. */\r
+        if ((locLinkID = nwk_getLocalLinkID()))\r
+        {\r
+            break;\r
+        }\r
+        NWK_DELAY(LINKLISTEN_POLL_PERIOD_MS);\r
+    }\r
+\r
+    NWK_CHECK_FOR_RESTORE_STATE(radioState);\r
+\r
+    /* If the listen is terminated without hearing a message and setting a\r
+     * link ID the listen context must be explicitly turned off.\r
+     */\r
+    if (!(locLinkID))\r
+    {\r
+        nwk_setListenContext(LINK_LISTEN_OFF);\r
+        return SMPL_TIMEOUT;\r
+    }\r
+\r
+    *linkID = locLinkID;\r
+\r
+    return SMPL_SUCCESS;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          SMPL_Send\r
+ *\r
+ * @brief       Send a message to a peer application. Old API kept for\r
+ *              backward compatibility. Calls the new SMPL_SendOpt() with\r
+ *              no options.\r
+ *\r
+ * input parameters\r
+ * @param   lid     - Link ID (port) from application\r
+ * @param   msg     - pointer to message from app to be sent\r
+ * @param   len     - length of enclosed message\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   Status of operation. On a filaure the frame buffer is discarded\r
+ *           and the Send call must be redone by the app.\r
+ *             SMPL_SUCCESS\r
+ *             SMPL_BAD_PARAM    No valid Connection Table entry for Link ID\r
+ *                               Data in Connection Table entry bad\r
+ *                               No message or message too long\r
+ *             SMPL_NOMEM        No room in output frame queue\r
+ *             SMPL_TX_CCA_FAIL  CCA failure.\r
+ */\r
+\r
+smplStatus_t SMPL_Send(linkID_t lid, uint8_t *msg, uint8_t len)\r
+{\r
+    return SMPL_SendOpt(lid, msg, len, SMPL_TXOPTION_NONE);\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          SMPL_SendOpt\r
+ *\r
+ * @brief       Send a message to a peer application.\r
+ *\r
+ * input parameters\r
+ * @param   lid     - Link ID (port) from application\r
+ * @param   msg     - pointer to message from app to be sent\r
+ * @param   len     - length of enclosed message\r
+ * @param   options - Transmit options (bit map)\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   Status of operation. On a filaure the frame buffer is discarded\r
+ *           and the Send call must be redone by the app.\r
+ *             SMPL_SUCCESS\r
+ *             SMPL_BAD_PARAM    No valid Connection Table entry for Link ID\r
+ *                               Data in Connection Table entry bad\r
+ *                               No message or message too long\r
+ *             SMPL_NOMEM        No room in output frame queue\r
+ *             SMPL_TX_CCA_FAIL  CCA failure.\r
+ *             SMPL_NO_ACK       If application auto acknowledgement enabled\r
+ *                               and no acknowledgement is received\r
+ */\r
+\r
+smplStatus_t SMPL_SendOpt(linkID_t lid, uint8_t *msg, uint8_t len, txOpt_t options)\r
+{\r
+    frameInfo_t  *pFrameInfo;\r
+    connInfo_t   *pCInfo     = nwk_getConnInfo(lid);\r
+    smplStatus_t rc         = SMPL_BAD_PARAM;\r
+    uint8_t radioState = MRFI_GetRadioState();\r
+    uint8_t ackreq     = 0;\r
+\r
+#if defined(ACCESS_POINT)\r
+    uint8_t loc;\r
+#endif\r
+\r
+    /* we have the connection info for this Link ID. make sure it is valid. */\r
+    if (!pCInfo || ((rc = nwk_checkConnInfo(pCInfo, CHK_TX)) != SMPL_SUCCESS))\r
+    {\r
+        return rc;\r
+    }\r
+\r
+    /* parameter sanity check... */\r
+    if (!msg || (len > MAX_APP_PAYLOAD))\r
+    {\r
+        return rc;\r
+    }\r
+\r
+    /* Build an outgoing message frame destined for the port from the\r
+     * connection info using the destination address also from the\r
+     * connection info.\r
+     */\r
+    if (SMPL_TXOPTION_NONE == options)\r
+    {\r
+        pFrameInfo = nwk_buildFrame(pCInfo->portTx, msg, len, pCInfo->hops2target);\r
+    }\r
+#if defined(APP_AUTO_ACK)\r
+    else if (options & SMPL_TXOPTION_ACKREQ)\r
+    {\r
+        if (SMPL_LINKID_USER_UUD != lid)\r
+        {\r
+            pFrameInfo = nwk_buildAckReqFrame(pCInfo->portTx, msg, len, pCInfo->hops2target,\r
+                                              &pCInfo->ackTID);\r
+            ackreq     = 1;\r
+        }\r
+        else\r
+        {\r
+            /* can't request an ack on the UUD link ID */\r
+            return SMPL_BAD_PARAM;\r
+        }\r
+    }\r
+#endif  /* APP_AUTO_ACK */\r
+    else\r
+    {\r
+        return SMPL_BAD_PARAM;\r
+    }\r
+\r
+    if (!pFrameInfo)\r
+    {\r
+        return SMPL_NOMEM;\r
+    }\r
+    memcpy(MRFI_P_DST_ADDR(&pFrameInfo->mrfiPkt), pCInfo->peerAddr, NET_ADDR_SIZE);\r
+\r
+#if defined(SMPL_SECURE)\r
+    {\r
+        uint32_t *pUL = 0;\r
+\r
+        if (pCInfo->thisLinkID != SMPL_LINKID_USER_UUD)\r
+        {\r
+            pUL = &pCInfo->connTxCTR;\r
+        }\r
+        nwk_setSecureFrame(&pFrameInfo->mrfiPkt, len, pUL);\r
+    }\r
+#endif  /* SMPL_SECURE */\r
+\r
+#if defined(ACCESS_POINT)\r
+\r
+    /* If we are an AP trying to send to a polling device, don't do it.\r
+     * See if the target is a store-and-forward client.\r
+     */\r
+    if (nwk_isSandFClient(MRFI_P_DST_ADDR(&pFrameInfo->mrfiPkt), &loc))\r
+    {\r
+        pFrameInfo->fi_usage = FI_INUSE_UNTIL_FWD;\r
+        return SMPL_SUCCESS;\r
+    }\r
+    else\r
+#endif  /* ACCESS_POINT */\r
+    {\r
+        rc = nwk_sendFrame(pFrameInfo, MRFI_TX_TYPE_CCA);\r
+    }\r
+\r
+#if !defined(APP_AUTO_ACK)\r
+    /* save a little code space with this #if */\r
+    (void) ackreq;  /* keep compiler happy */\r
+    return rc;\r
+#else\r
+    /* we're done if the send failed or no ack requested. */\r
+    if (SMPL_SUCCESS != rc || !ackreq)\r
+    {\r
+        return rc;\r
+    }\r
+\r
+    NWK_CHECK_FOR_SETRX(radioState);\r
+    NWK_REPLY_DELAY();\r
+    NWK_CHECK_FOR_RESTORE_STATE(radioState);\r
+\r
+    {\r
+        bspIState_t intState;\r
+\r
+        /* If the saved TID hasn't been reset then we never got the ack. */\r
+        BSP_ENTER_CRITICAL_SECTION(intState);\r
+        if (pCInfo->ackTID)\r
+        {\r
+            pCInfo->ackTID = 0;\r
+            rc = SMPL_NO_ACK;\r
+        }\r
+        BSP_EXIT_CRITICAL_SECTION(intState);\r
+    }\r
+\r
+    return rc;\r
+#endif  /* APP_AUTO_ACK */\r
+}\r
+\r
+/**************************************************************************************\r
+ * @fn          SMPL_Receive\r
+ *\r
+ * @brief       Receive a message from a peer application.\r
+ *\r
+ * input parameters\r
+ * @param   lid     - Link ID (port) from application\r
+ *\r
+ *\r
+ * output parameters\r
+ * @param   msg     - pointer to where received message should be copied.\r
+ *                    buffer should be of size == MAX_APP_PAYLOAD\r
+ * @param   len     - pointer to receive length of received message\r
+ *\r
+ * @return    Status of operation.\r
+ *            Caller should not use the value returned in 'len' to decide\r
+ *            whether there is a frame or not. It could be useful to the\r
+ *            Caller to distinguish between no frame and a frame with no data.\r
+ *            For example, in the polling case a frame with no application payload\r
+ *            is the way the AP conveys that there are no frames waiting.\r
+ *\r
+ *              SMPL_SUCCESS\r
+ *\r
+ *              SMPL_BAD_PARAM  No valid Connection Table entry for Link ID\r
+ *                              Data in Connection Table entry bad\r
+ *              SMPL_NO_FRAME   No frame received.\r
+ *              SMPL_NO_PAYLOAD Frame received with no payload (not necessarily\r
+ *                              an error and could be deduced by application\r
+ *                              because the returned length will be 0)\r
+ *\r
+ *            Polling device only:\r
+ *\r
+ *              SMPL_TIMEOUT        No response from Access Point\r
+ *              SMPL_NO_AP_ADDRESS  Access Point address unknown\r
+ *              SMPL_TX_CCA_FAIL    Could not send poll frame\r
+ *              SMPL_NOMEM          No memory in output frame queue\r
+ *              SMPL_NO_CHANNEL     Frequency Agility enabled and could not find channel\r
+ */\r
+\r
+smplStatus_t SMPL_Receive(linkID_t lid, uint8_t *msg, uint8_t *len)\r
+{\r
+    connInfo_t  *pCInfo = nwk_getConnInfo(lid);\r
+    smplStatus_t rc = SMPL_BAD_PARAM;\r
+    rcvContext_t rcv;\r
+\r
+    if (!pCInfo || ((rc = nwk_checkConnInfo(pCInfo, CHK_RX)) != SMPL_SUCCESS))\r
+    {\r
+        return rc;\r
+    }\r
+\r
+    rcv.type  = RCV_APP_LID;\r
+    rcv.t.lid = lid;\r
+\r
+#if defined(RX_POLLS)\r
+    {\r
+        uint8_t numChans  = 1;\r
+#    if defined(FREQUENCY_AGILITY)\r
+        freqEntry_t chans[NWK_FREQ_TBL_SIZE];\r
+        uint8_t scannedB4 = 0;\r
+#    endif\r
+\r
+        do\r
+        {\r
+            uint8_t radioState = MRFI_GetRadioState();\r
+\r
+            /* I'm polling. Do the poll to stimulate the sending of a frame. If the\r
+             * frame has application length of 0 it means there were no frames.  If\r
+             * no reply is received infer that the channel is changed. We then need\r
+             * to scan and then retry the poll on each channel returned.\r
+             */\r
+            if (SMPL_SUCCESS != (rc = nwk_poll(pCInfo->portRx, pCInfo->peerAddr)))\r
+            {\r
+                /* for some reason couldn't send the poll out. */\r
+                return rc;\r
+            }\r
+\r
+            /* do this before code block below which may reset it. */\r
+            numChans--;\r
+\r
+            /* Wait until there's a frame. if the len is 0 then return SMPL_NO_FRAME\r
+             * to the caller. In the poll case the AP always sends something.\r
+             */\r
+            NWK_CHECK_FOR_SETRX(radioState);\r
+            NWK_REPLY_DELAY();\r
+            NWK_CHECK_FOR_RESTORE_STATE(radioState);\r
+\r
+            /* TODO: deal with pending */\r
+            rc = nwk_retrieveFrame(&rcv, msg, len, 0, 0);\r
+\r
+#    if defined(FREQUENCY_AGILITY)\r
+            if (SMPL_SUCCESS == rc)\r
+            {\r
+                /* we received something... */\r
+                return (*len) ? SMPL_SUCCESS : SMPL_NO_PAYLOAD;\r
+            }\r
+\r
+            /* No reply. scan for other channel(s) if we haven't already. Then set\r
+             * one and try again.\r
+             */\r
+            if (!scannedB4)\r
+            {\r
+                numChans  = nwk_scanForChannels(chans);\r
+                scannedB4 = 1;\r
+            }\r
+            if (numChans)\r
+            {\r
+                nwk_setChannel(&chans[numChans - 1]);\r
+            }\r
+#    else /*  FREQUENCY_AGILITY */\r
+            return (*len) ? rc : ((SMPL_SUCCESS == rc) ? SMPL_NO_PAYLOAD : SMPL_TIMEOUT);\r
+#    endif\r
+        } while (numChans);\r
+    }\r
+\r
+#    if defined(FREQUENCY_AGILITY)\r
+    return SMPL_NO_CHANNEL;\r
+#    endif\r
+\r
+#else     /* RX_POLLS */\r
+    return nwk_retrieveFrame(&rcv, msg, len, 0, 0);\r
+#endif  /* RX_POLLS */\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          SMPL_Link\r
+ *\r
+ * @brief       Link to a peer.\r
+ *\r
+ * input parameters\r
+ *\r
+ * output parameters\r
+ * @param   lid     - pointer to where we should write the link ID to which the\r
+ *                    application will read and write.\r
+ *\r
+ * @return   Status of operation.\r
+ *             SMPL_SUCCESS\r
+ *             SMPL_NOMEM         No room to allocate local Rx port, no more\r
+ *                                room in Connection Table, or no room in\r
+ *                                output frame queue.\r
+ *             SMPL_NO_LINK       No reply frame during wait window.\r
+ *             SMPL_TX_CCA_FAIL   Could not send Link frame.\r
+ */\r
+\r
+smplStatus_t SMPL_Link(linkID_t *lid)\r
+{\r
+    return nwk_link(lid);\r
+}\r
+\r
+#if defined(EXTENDED_API)\r
+\r
+/**************************************************************************************\r
+ * @fn          SMPL_Unlink\r
+ *\r
+ * @brief       Tear down connection to a peer.\r
+ *\r
+ * input parameters\r
+ * @param   lid     - Link ID whose connection is to be terminated.\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   Status of operation. The Connection Table entry for the Link ID\r
+ *           is always freed successfuly. The returned status value is the\r
+ *           status of the _peer's_ connection tear-down as a result of the\r
+ *           message sent here.\r
+ *           SMPL_SUCCESS         Local and remote connection destroyed.\r
+ *           SMPL_BAD_PARAM       No local connection table entry for this Link ID\r
+ *           SMPL_TIMEOUT         No reply from peer.\r
+ *           SMPL_NO_PEER_UNLINK  Peer did not have a Connection Table entry for me.\r
+ */\r
+\r
+smplStatus_t SMPL_Unlink(linkID_t lid)\r
+{\r
+    return nwk_unlink(lid);\r
+}\r
+\r
+/**************************************************************************************\r
+ * @fn          SMPL_Ping\r
+ *\r
+ * @brief       Ping a peer. Synchronous call. Although a link ID is used it is the\r
+ *              NWK Ping application that is pinged, not the peer of this Link ID. The\r
+ *              peer is not expected to be the responder to the frame sent from here.\r
+ *              This API is a proxy for a real ping since the application doesn't\r
+ *              have direct access to SimpliciTI device addresses. Kind of hokey but a\r
+ *              useful keep-alive mechanism without having to support it with\r
+ *              user application service.\r
+ *\r
+ * input parameters\r
+ * @param   lid  - The link ID whose peer device address is used to direct the NWK Ping\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   Status of operation.\r
+ */\r
+\r
+smplStatus_t SMPL_Ping(linkID_t lid)\r
+{\r
+    return nwk_ping(lid);\r
+}\r
+\r
+/**************************************************************************************\r
+ * @fn          SMPL_Commission\r
+ *\r
+ * @brief       Commission a connection.\r
+ *\r
+ * input parameters\r
+ * @param   peerAddr  - Pointer to address of the peer for this connection\r
+ * @param    locPort  - Port on which to listen for messages from the peer\r
+ * @param    rmtPort  - Port on which to send messages to the peer.\r
+ * @param        lid  - Pointer to Link ID object. If content of location is\r
+ *                      non-zero on input the value is placed in the Connection\r
+ *                      object.\r
+ *\r
+ * output parameters\r
+ * @param        lid  - Pointer to Link ID object. If content of location is zero\r
+ *                      on input the value in the Connection object is stored there.\r
+ *\r
+ * @return   SMPL_SUCCESS\r
+ *           SMPL_NOMEM     - No room left in Connection table.\r
+ *           SMPL_BAD_PARAM - A pointer to a Link object was not supplied.\r
+ */\r
+\r
+smplStatus_t SMPL_Commission(addr_t *peerAddr, uint8_t locPort, uint8_t rmtPort, linkID_t *lid)\r
+{\r
+    connInfo_t   *pCInfo = nwk_getNextConnection();\r
+    smplStatus_t rc     = SMPL_BAD_PARAM;\r
+\r
+    do {\r
+        if (pCInfo)\r
+        {\r
+            /* sanity checks... */\r
+\r
+            /* Check port info. */\r
+            if ((locPort > SMPL_PORT_STATIC_MAX) ||\r
+                (locPort < (SMPL_PORT_STATIC_MAX - PORT_USER_STATIC_NUM + 1)))\r
+            {\r
+                continue;\r
+            }\r
+\r
+            if ((rmtPort > SMPL_PORT_STATIC_MAX) ||\r
+                (rmtPort < (SMPL_PORT_STATIC_MAX - PORT_USER_STATIC_NUM + 1)))\r
+            {\r
+                continue;\r
+            }\r
+\r
+            /* Must supply a pointer to the Link ID object */\r
+            if (!lid)\r
+            {\r
+                /* No Link ID pointer supplied */\r
+                continue;\r
+            }\r
+\r
+            /* we're sane */\r
+\r
+            /* Use the value generated at connection object assign time. */\r
+            *lid = pCInfo->thisLinkID;\r
+\r
+            /* store peer's address */\r
+            memcpy(pCInfo->peerAddr, peerAddr, NET_ADDR_SIZE);\r
+\r
+            /* store port info */\r
+            pCInfo->portRx = locPort;\r
+            pCInfo->portTx = rmtPort;\r
+\r
+            pCInfo->hops2target = MAX_HOPS;\r
+\r
+            rc = SMPL_SUCCESS;\r
+        }\r
+        else\r
+        {\r
+            /* No room in Connection table */\r
+            rc = SMPL_NOMEM;\r
+        }\r
+    } while (0);\r
+\r
+    if ((SMPL_SUCCESS != rc) && pCInfo)\r
+    {\r
+        nwk_freeConnection(pCInfo);\r
+    }\r
+\r
+    return rc;\r
+}\r
+\r
+#endif   /* EXTENDED_API */\r
+\r
+/******************************************************************************\r
+ * @fn          SMPL_Ioctl\r
+ *\r
+ * @brief       This routine supplies the SimpliciTI IOCTL support.\r
+ *\r
+ * input parameters\r
+ * @param   object   - The IOCTL target object\r
+ * @param   action   - The IOCTL target action on the object\r
+ * @param   val      - pointer to value. exact forn depends on object type.\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   Status of action. Value depends on object, action, and result.\r
+ *\r
+ *           SMPL_BAD_PARAM is returned if this API is called before\r
+ *                          initialization and the object is not one of\r
+ *                          the valid exceptions.\r
+ */\r
+\r
+smplStatus_t SMPL_Ioctl(ioctlObject_t object, ioctlAction_t action, void *val)\r
+{\r
+    smplStatus_t rc;\r
+\r
+    /* if init hasn't occurred see if access is still valid */\r
+    if (!sInit_done && !ioctlPreInitAccessIsOK(object))\r
+    {\r
+        return SMPL_BAD_PARAM;\r
+    }\r
+\r
+    switch (object)\r
+    {\r
+#if defined(EXTENDED_API)\r
+        case IOCTL_OBJ_TOKEN:\r
+        {\r
+            ioctlToken_t *t = (ioctlToken_t *)val;\r
+\r
+            rc = SMPL_SUCCESS;\r
+            if (TT_LINK == t->tokenType)\r
+            {\r
+                if (IOCTL_ACT_SET == action)\r
+                {\r
+                    nwk_setLinkToken(t->token.linkToken);\r
+                }\r
+                else if (IOCTL_ACT_GET == action)\r
+                {\r
+                    nwk_getLinkToken(&t->token.linkToken);\r
+                }\r
+                else\r
+                {\r
+                    rc = SMPL_BAD_PARAM;\r
+                }\r
+            }\r
+            else if (TT_JOIN == t->tokenType)\r
+            {\r
+                if (IOCTL_ACT_SET == action)\r
+                {\r
+                    nwk_setJoinToken(t->token.joinToken);\r
+                }\r
+                else if (IOCTL_ACT_GET == action)\r
+                {\r
+                    nwk_getJoinToken(&t->token.joinToken);\r
+                }\r
+                else\r
+                {\r
+                    rc = SMPL_BAD_PARAM;\r
+                }\r
+            }\r
+            else\r
+            {\r
+                rc = SMPL_BAD_PARAM;\r
+            }\r
+        }\r
+        break;\r
+\r
+        case IOCTL_OBJ_NVOBJ:\r
+            rc = nwk_NVObj(action, (ioctlNVObj_t *)val);\r
+            break;\r
+#endif  /* EXTENDED_API */\r
+\r
+        case IOCTL_OBJ_CONNOBJ:\r
+            rc = nwk_connectionControl(action, val);\r
+            break;\r
+\r
+        case IOCTL_OBJ_ADDR:\r
+            if ((IOCTL_ACT_GET == action) || (IOCTL_ACT_SET == action))\r
+            {\r
+                rc = nwk_deviceAddress(action, (addr_t *)val);\r
+            }\r
+            else\r
+            {\r
+                rc = SMPL_BAD_PARAM;\r
+            }\r
+            break;\r
+\r
+        case IOCTL_OBJ_RAW_IO:\r
+            if (IOCTL_ACT_WRITE == action)\r
+            {\r
+                rc = nwk_rawSend((ioctlRawSend_t *)val);\r
+            }\r
+            else if (IOCTL_ACT_READ == action)\r
+            {\r
+                rc = nwk_rawReceive((ioctlRawReceive_t *)val);\r
+            }\r
+            else\r
+            {\r
+                rc = SMPL_BAD_PARAM;\r
+            }\r
+            break;\r
+\r
+        case IOCTL_OBJ_RADIO:\r
+            rc = nwk_radioControl(action, val);\r
+            break;\r
+\r
+#if defined(ACCESS_POINT)\r
+        case IOCTL_OBJ_AP_JOIN:\r
+            rc = nwk_joinContext(action);\r
+            break;\r
+#endif\r
+#if defined(FREQUENCY_AGILITY)\r
+        case IOCTL_OBJ_FREQ:\r
+            rc = nwk_freqControl(action, val);\r
+            break;\r
+#endif\r
+        case IOCTL_OBJ_FWVER:\r
+            if (IOCTL_ACT_GET == action)\r
+            {\r
+                memcpy(val, nwk_getFWVersion(), SMPL_FWVERSION_SIZE);\r
+                rc = SMPL_SUCCESS;\r
+            }\r
+            else\r
+            {\r
+                rc = SMPL_BAD_PARAM;\r
+            }\r
+            break;\r
+\r
+        case IOCTL_OBJ_PROTOVER:\r
+            if (IOCTL_ACT_GET == action)\r
+            {\r
+                *((uint8_t *)val) = nwk_getProtocolVersion();\r
+                rc = SMPL_SUCCESS;\r
+            }\r
+            else\r
+            {\r
+                rc = SMPL_BAD_PARAM;\r
+            }\r
+            break;\r
+\r
+        default:\r
+            rc = SMPL_BAD_PARAM;\r
+            break;\r
+    }\r
+\r
+    return rc;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          ioctlPreInitAccessIsOK\r
+ *\r
+ * @brief       Is the request legal yet? Most requests are not legal before\r
+ *              SMPL_Init().\r
+ *\r
+ * input parameters\r
+ * @param   object   - The IOCTL target object\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   Returns non-zero if request should be honored for further\r
+ *           processing, otherwise returns 0. This function does not\r
+ *           determine of the object-action pair are valid. It only knows\r
+ *           about exceptions, i.e., those that are valid before the\r
+ *           SMPL_Init() call.\r
+ *\r
+ */\r
+\r
+static uint8_t ioctlPreInitAccessIsOK(ioctlObject_t object)\r
+{\r
+    uint8_t rc;\r
+\r
+    /* Currently the only legal pre-init accesses are the address and\r
+     * the token objects.\r
+     */\r
+    switch (object)\r
+    {\r
+        case IOCTL_OBJ_ADDR:\r
+        case IOCTL_OBJ_TOKEN:\r
+            rc = 1; /* legal */\r
+            break;\r
+\r
+        default:\r
+            rc = 0; /* not legal when init not done */\r
+            break;\r
+    }\r
+\r
+    return rc;\r
+}\r
+\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/Components/nwk/nwk_api.h b/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/Components/nwk/nwk_api.h
new file mode 100755 (executable)
index 0000000..104f031
--- /dev/null
@@ -0,0 +1,58 @@
+/**************************************************************************************************\r
+*  Filename:       nwk_api.h\r
+*  Revised:        $Date: 2008-11-24 12:09:31 -0800 (Mon, 24 Nov 2008) $\r
+*  Revision:       $Revision: 18508 $\r
+*  Author:         $Author: lfriedman $\r
+*\r
+*  Description:    This header file supports the SimpliciTI appliction layer API.\r
+*\r
+*  Copyright 2004-2007 Texas Instruments Incorporated. All rights reserved.\r
+*\r
+*  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+*  the terms of a software license agreement between the user who downloaded the software,\r
+*  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+*  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+*  License. The License limits your use, and you acknowledge, that the Software may not be\r
+*  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+*  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+*  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+*  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+*  perform, display or sell this Software and/or its documentation for any purpose.\r
+*\r
+*  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+*  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+*  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+*  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+*  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+*  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+*  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+*  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+*  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+*\r
+*  Should you have any questions regarding your right to use this Software,\r
+*  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+#ifndef NWK_API_H\r
+#define NWK_API_H\r
+\r
+/* Tx options (bit map) */\r
+#define  SMPL_TXOPTION_NONE       ((txOpt_t)0x00)\r
+#define  SMPL_TXOPTION_ACKREQ     ((txOpt_t)0x01)\r
+\r
+smplStatus_t SMPL_Init(uint8_t (*)(linkID_t));\r
+smplStatus_t SMPL_Link(linkID_t *);\r
+smplStatus_t SMPL_LinkListen(linkID_t *);\r
+smplStatus_t SMPL_Send(linkID_t lid, uint8_t *msg, uint8_t len);\r
+\r
+smplStatus_t SMPL_SendOpt(linkID_t lid, uint8_t * msg, uint8_t len, txOpt_t);\r
+smplStatus_t SMPL_Receive(linkID_t lid, uint8_t *msg, uint8_t *len);\r
+\r
+smplStatus_t SMPL_Ioctl(ioctlObject_t, ioctlAction_t, void *);\r
+#ifdef EXTENDED_API\r
+smplStatus_t SMPL_Ping(linkID_t);\r
+smplStatus_t SMPL_Unlink(linkID_t);\r
+smplStatus_t SMPL_Commission(addr_t *, uint8_t, uint8_t, linkID_t *);\r
+#endif  /* EXTENDED_API */\r
+\r
+#endif\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/Components/nwk/nwk_app.h b/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/Components/nwk/nwk_app.h
new file mode 100755 (executable)
index 0000000..4aa942b
--- /dev/null
@@ -0,0 +1,53 @@
+\r
+/**************************************************************************************************\r
+*  Filename:       nwk_app.h\r
+*  Revised:        $Date: 2007-07-10 11:21:35 -0700 (Tue, 10 Jul 2007) $\r
+*  Revision:       $Revision: 14865 $\r
+*  Author:         $Author: lfriedman $\r
+*\r
+*  Description:    This header file is for convenience and includes the headers for all the\r
+*                 network applications.\r
+*\r
+*  Copyright 2004-2007 Texas Instruments Incorporated. All rights reserved.\r
+*\r
+*  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+*  the terms of a software license agreement between the user who downloaded the software,\r
+*  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+*  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+*  License. The License limits your use, and you acknowledge, that the Software may not be\r
+*  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+*  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+*  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+*  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+*  perform, display or sell this Software and/or its documentation for any purpose.\r
+*\r
+*  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+*  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+*  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+*  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+*  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+*  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+*  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+*  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+*  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+*\r
+*  Should you have any questions regarding your right to use this Software,\r
+*  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+\r
+\r
+\r
+#ifndef NWK_APP_H\r
+#define NWK_APP_H\r
+\r
+#include "nwk_freq.h"\r
+#include "nwk_ping.h"\r
+#include "nwk_link.h"\r
+#include "nwk_mgmt.h"\r
+#include "nwk_join.h"\r
+#include "nwk_security.h"\r
+#include "nwk_ioctl.h"\r
+\r
+#endif\r
+\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/Components/nwk/nwk_frame.c b/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/Components/nwk/nwk_frame.c
new file mode 100755 (executable)
index 0000000..1726d13
--- /dev/null
@@ -0,0 +1,984 @@
+/**************************************************************************************************\r
+*  Filename:       nwk_frame.c\r
+*  Revised:        $Date: 2009-03-10 16:21:40 -0700 (Tue, 10 Mar 2009) $\r
+*  Revision:       $Revision: 19368 $\r
+*  Author          $Author: lfriedman $\r
+*\r
+*  Description:    This file supports the SimpliciTI frame handling functions.\r
+*\r
+*  Copyright 2007-2009 Texas Instruments Incorporated. All rights reserved.\r
+*\r
+*  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+*  the terms of a software license agreement between the user who downloaded the software,\r
+*  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+*  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+*  License. The License limits your use, and you acknowledge, that the Software may not be\r
+*  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+*  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+*  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+*  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+*  perform, display or sell this Software and/or its documentation for any purpose.\r
+*\r
+*  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+*  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+*  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+*  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+*  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+*  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+*  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+*  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+*  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+*\r
+*  Should you have any questions regarding your right to use this Software,\r
+*  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+\r
+/******************************************************************************\r
+ * INCLUDES\r
+ */\r
+\r
+#include <string.h>\r
+#include "bsp.h"\r
+#include "mrfi.h"\r
+#include "nwk_types.h"\r
+#include "nwk_frame.h"\r
+#include "nwk.h"\r
+#include "nwk_app.h"\r
+#include "nwk_QMgmt.h"\r
+#include "nwk_globals.h"\r
+#include "nwk_mgmt.h"\r
+#include "nwk_security.h"\r
+\r
+/******************************************************************************\r
+ * MACROS\r
+ */\r
+\r
+/******************************************************************************\r
+ * CONSTANTS AND DEFINES\r
+ */\r
+\r
+/******************************************************************************\r
+ * TYPEDEFS\r
+ */\r
+\r
+/******************************************************************************\r
+ * LOCAL VARIABLES\r
+ */\r
+\r
+#if SIZE_INFRAME_Q > 0\r
+/* array of function pointers to handle NWK application frames */\r
+static fhStatus_t(*const func[]) (mrfiPacket_t *) = { nwk_processPing,\r
+                                                      nwk_processLink,\r
+                                                      nwk_processJoin,\r
+                                                      nwk_processSecurity,\r
+                                                      nwk_processFreq,\r
+                                                      nwk_processMgmt};\r
+#endif  /* SIZE_INFRAME_Q > 0 */\r
+\r
+static uint8_t sTRACTID = 0;\r
+\r
+static addr_t const *sMyAddr = NULL;\r
+\r
+static uint8_t sMyRxType = 0, sMyTxType = 0;\r
+\r
+#if !defined(RX_POLLS)\r
+static uint8_t (*spCallback)(linkID_t) = NULL;\r
+#endif\r
+\r
+/******************************************************************************\r
+ * LOCAL FUNCTIONS\r
+ */\r
+\r
+#if SIZE_INFRAME_Q > 0\r
+/* local helper functions for Rx devices */\r
+static void dispatchFrame(frameInfo_t *);\r
+\r
+#    if !defined(END_DEVICE)\r
+#        if defined(ACCESS_POINT)\r
+/* only Access Points need to worry about duplicate S&F frames */\r
+uint8_t isDupSandFFrame(mrfiPacket_t *);\r
+\r
+#        endif /* ACCESS_POINT */\r
+#    endif     /* !END_DEVICE */\r
+#endif         /* SIZE_INFRAME_Q > 0 */\r
+\r
+/******************************************************************************\r
+ * GLOBAL VARIABLES\r
+ */\r
+\r
+/******************************************************************************\r
+ * GLOBAL FUNCTIONS\r
+ */\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_frameInit\r
+ *\r
+ * @brief       Initialize network context.\r
+ *\r
+ * input parameters\r
+ *       pF - Pointer to callback function. If none intended should be NULL.\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return    void\r
+ */\r
+\r
+void nwk_frameInit(uint8_t (*pF)(linkID_t))\r
+{\r
+\r
+    /****** Fill static values for the DEVICEINFO byte that will go in each frame *****\r
+     * Rx type when frame originates from this device. Set in nwk_buildFrame()\r
+     * Tx type when frame sent from this device. Set in nwk_sendframe() */\r
+#if !defined(END_DEVICE)\r
+    sMyRxType = F_RX_TYPE_USER_CTL;\r
+#    if defined(ACCESS_POINT)\r
+    sMyTxType = F_TX_DEVICE_AP;\r
+#    else\r
+    sMyTxType = F_TX_DEVICE_RE;\r
+#    endif\r
+#else\r
+    sMyTxType = F_TX_DEVICE_ED;\r
+#    if defined(RX_POLLS)\r
+    sMyRxType = F_RX_TYPE_POLLS;\r
+#    endif\r
+#    if defined(RX_USER)\r
+    sMyRxType = F_RX_TYPE_USER_CTL;\r
+#    endif\r
+#endif\r
+    /****** DONE fill static values for the DEVICEINFO byte that will go in each frame ******/\r
+\r
+#if !defined(RX_POLLS)\r
+    spCallback = pF;\r
+#else\r
+    (void) pF;\r
+#endif\r
+\r
+    sMyAddr = nwk_getMyAddress();\r
+\r
+    while (!(sTRACTID = MRFI_RandomByte())) ;\r
+\r
+    return;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_buildFrame\r
+ *\r
+ * @brief       Builds an output frame for the port and message enclosed.\r
+ *              This routine prepends the frame header and populates the\r
+ *              frame in the output queue.\r
+ *\r
+ * input parameters\r
+ * @param   port    - port from application\r
+ * @param   msg     - pointer to message from app to be sent\r
+ * @param   len     - length of enclosed message\r
+ * @param   hops    - number of hops allowed. this is less than MAX_HOPS\r
+ *                    whenever the frame is being sent to the AP. this is to\r
+ *                    help mitigate the (short) broadcast storms\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   pointer to frameInfo_t structure created. NULL if there is\r
+ *           no room in output queue.\r
+ */\r
+\r
+frameInfo_t *nwk_buildFrame(uint8_t port, uint8_t *msg, uint8_t len, uint8_t hops)\r
+{\r
+    frameInfo_t  *fInfoPtr;\r
+\r
+    if (!(fInfoPtr = nwk_QfindSlot(OUTQ)))\r
+    {\r
+        return (frameInfo_t *)NULL;\r
+    }\r
+\r
+    MRFI_SET_PAYLOAD_LEN(&fInfoPtr->mrfiPkt, len + F_APP_PAYLOAD_OS);\r
+\r
+    PUT_INTO_FRAME(MRFI_P_PAYLOAD(&fInfoPtr->mrfiPkt), F_ENCRYPT_OS, 0);\r
+    PUT_INTO_FRAME(MRFI_P_PAYLOAD(&fInfoPtr->mrfiPkt), F_PORT_OS, port);\r
+    PUT_INTO_FRAME(MRFI_P_PAYLOAD(&fInfoPtr->mrfiPkt), F_TRACTID_OS, sTRACTID);\r
+    while (!(++sTRACTID)) ;  /* transaction ID can't be 0 */\r
+    PUT_INTO_FRAME(MRFI_P_PAYLOAD(&fInfoPtr->mrfiPkt), F_RX_TYPE, sMyRxType);\r
+    PUT_INTO_FRAME(MRFI_P_PAYLOAD(&fInfoPtr->mrfiPkt), F_HOP_COUNT, hops);\r
+\r
+    /* reset ack-relevant bits */\r
+    PUT_INTO_FRAME(MRFI_P_PAYLOAD(&fInfoPtr->mrfiPkt), F_ACK_REQ, 0);\r
+    PUT_INTO_FRAME(MRFI_P_PAYLOAD(&fInfoPtr->mrfiPkt), F_ACK_RPLY, 0);\r
+\r
+    /* reset forwarding bit */\r
+    PUT_INTO_FRAME(MRFI_P_PAYLOAD(&fInfoPtr->mrfiPkt), F_FWD_FRAME, 0);\r
+\r
+    memcpy(MRFI_P_PAYLOAD(&fInfoPtr->mrfiPkt) + F_APP_PAYLOAD_OS, msg, len);\r
+    memcpy(MRFI_P_SRC_ADDR(&fInfoPtr->mrfiPkt), sMyAddr, NET_ADDR_SIZE);\r
+\r
+    return fInfoPtr;\r
+}\r
+\r
+#if defined(APP_AUTO_ACK)\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_buildAckReqFrame\r
+ *\r
+ * @brief       Builds an output frame for the port and message enclosed.\r
+ *              This routine prepends the frame header and populates the\r
+ *              frame in the output queue. The frame is set to request that\r
+ *              an ack frame be sent by the peer.\r
+ *\r
+ * input parameters\r
+ * @param   port    - port from application\r
+ * @param   msg     - pointer to message from app to be sent\r
+ * @param   len     - length of enclosed message\r
+ * @param   hops    - number of hops allowed. this is less than MAX_HOPS\r
+ *                    whenever the frame is being sent to the AP. this is to\r
+ *                    help mitigate the (short) broadcast storms\r
+ * @param   tid     - Transaction ID to insert in NWK header used to match\r
+ *                    the ack reply.\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   pointer to frameInfo_t structure created. NULL if there is\r
+ *           no room in output queue.\r
+ */\r
+\r
+frameInfo_t *nwk_buildAckReqFrame(uint8_t port, uint8_t *msg, uint8_t len, uint8_t hops,\r
+                                  volatile uint8_t *tid)\r
+{\r
+    frameInfo_t *fInfoPtr;\r
+\r
+    /* Build a normal frame first. */\r
+    if (!(fInfoPtr = nwk_buildFrame(port, msg, len, hops)))\r
+    {\r
+        return (frameInfo_t *)NULL;\r
+    }\r
+\r
+    /* save TID  */\r
+    *tid = GET_FROM_FRAME(MRFI_P_PAYLOAD(&fInfoPtr->mrfiPkt), F_TRACTID_OS);\r
+    /* Set REQ_ACK bit */\r
+    PUT_INTO_FRAME(MRFI_P_PAYLOAD(&fInfoPtr->mrfiPkt), F_ACK_REQ, F_ACK_REQ_TYPE);\r
+\r
+    return fInfoPtr;\r
+}\r
+\r
+#endif  /* APP_AUTO_ACK */\r
+\r
+#if SIZE_INFRAME_Q > 0\r
+\r
+/******************************************************************************\r
+ * @fn          MRFI_RxCompleteISR\r
+ *\r
+ * @brief       Here on Rx interrupt from radio. Process received frame from the\r
+ *              radio Rx FIFO.\r
+ *\r
+ * input parameters\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return      void\r
+ */\r
+\r
+void MRFI_RxCompleteISR()\r
+{\r
+    frameInfo_t  *fInfoPtr;\r
+\r
+    /* room for more? */\r
+    if (fInfoPtr = nwk_QfindSlot(INQ))\r
+    {\r
+        MRFI_Receive(&fInfoPtr->mrfiPkt);\r
+\r
+        dispatchFrame(fInfoPtr);\r
+    }\r
+\r
+    return;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_retrieveFrame\r
+ *\r
+ * @brief       Retrieve frame from Rx frame queue. Invoked by application-level\r
+ *              code either app through SMPL_Receive() or IOCTL through raw Rx. This\r
+ *              should run in a user thread, not an ISR thread.\r
+ *\r
+ * input parameters\r
+ * @param    port    - port on which to get a frame\r
+ *\r
+ * output parameters\r
+ * @param    msg     - pointer to where app payload should be copied. Buffer\r
+ *                     allocated should be == MAX_APP_PAYLOAD.\r
+ *\r
+ * @param    len      - pointer to where payload length should be stored. Caller\r
+ *                      can check for non-zero when polling the port. initialized\r
+ *                      to 0 even if no frame is retrieved.\r
+ * @param    srcAddr  - if non-NULL, a pointer to where to copy the source address\r
+ *                      of the retrieved message.\r
+ * @param    hopCount - if non-NULL, a pointer to where to copy the hop count\r
+ *                      of the retrieved message.\r
+ *\r
+ * @return    SMPL_SUCCESS\r
+ *            SMPL_NO_FRAME  - no frame found for specified destination\r
+ *            SMPL_BAD_PARAM - no valid connection info for the Link ID\r
+ *\r
+ */\r
+\r
+smplStatus_t nwk_retrieveFrame(rcvContext_t *rcv, uint8_t *msg, uint8_t *len, addr_t *srcAddr,\r
+                               uint8_t *hopCount)\r
+{\r
+    frameInfo_t *fPtr;\r
+    uint8_t done;\r
+\r
+    do {\r
+        /* look for a frame on requested port. */\r
+        *len = 0;\r
+        done = 1;\r
+\r
+        fPtr = nwk_QfindOldest(INQ, rcv, USAGE_NORMAL);\r
+        if (fPtr)\r
+        {\r
+            connInfo_t  *pCInfo = 0;\r
+\r
+            if (RCV_APP_LID == rcv->type)\r
+            {\r
+                pCInfo = nwk_getConnInfo(rcv->t.lid);\r
+                if (!pCInfo)\r
+                {\r
+                    return SMPL_BAD_PARAM;\r
+                }\r
+#    if defined(SMPL_SECURE)\r
+                /* decrypt here...we have all the context we need. */\r
+                {\r
+                    uint32_t ctr  = pCInfo->connRxCTR;\r
+                    uint32_t *pctr = &ctr;\r
+                    uint8_t len  = MRFI_GET_PAYLOAD_LEN(&fPtr->mrfiPkt) - F_SEC_CTR_OS;\r
+\r
+                    if (pCInfo->thisLinkID == SMPL_LINKID_USER_UUD)\r
+                    {\r
+                        pctr = NULL;\r
+                    }\r
+#        if defined(RX_POLLS)\r
+                    else if ((F_APP_PAYLOAD_OS - F_SEC_CTR_OS) == len)\r
+                    {\r
+                        /* This was an empty poll reply frame generated by the AP.\r
+                         * It uses the single-byte CTR value like network applications.\r
+                         * We do not want to use the application layer counter in this case.\r
+                         */\r
+                        pctr = NULL;\r
+                    }\r
+#        endif\r
+                    if (nwk_getSecureFrame(&fPtr->mrfiPkt, len, pctr))\r
+                    {\r
+                        if (pctr)\r
+                        {\r
+                            /* Update connection's counter. */\r
+                            pCInfo->connRxCTR = ctr;\r
+                        }\r
+                    }\r
+                    else\r
+                    {\r
+                        /* Frame bogus. Check for another frame. */\r
+                        done = 0;\r
+                        continue;\r
+                    }\r
+                }\r
+#    endif      /* SMPL_SECURE */\r
+            }\r
+\r
+            /* it's on the requested port. */\r
+            *len = MRFI_GET_PAYLOAD_LEN(&fPtr->mrfiPkt) - F_APP_PAYLOAD_OS;\r
+            memcpy(msg, MRFI_P_PAYLOAD(&fPtr->mrfiPkt) + F_APP_PAYLOAD_OS, *len);\r
+            /* save signal info */\r
+            if (pCInfo)\r
+            {\r
+                /* Save Rx metrics... */\r
+                pCInfo->sigInfo.rssi = fPtr->mrfiPkt.rxMetrics[MRFI_RX_METRICS_RSSI_OFS];\r
+                pCInfo->sigInfo.lqi  = fPtr->mrfiPkt.rxMetrics[MRFI_RX_METRICS_CRC_LQI_OFS];\r
+            }\r
+            if (srcAddr)\r
+            {\r
+                /* copy source address if requested */\r
+                memcpy(srcAddr, MRFI_P_SRC_ADDR(&fPtr->mrfiPkt), NET_ADDR_SIZE);\r
+            }\r
+            if (hopCount)\r
+            {\r
+                /* copy hop count if requested */\r
+                *hopCount = GET_FROM_FRAME(MRFI_P_PAYLOAD(&fPtr->mrfiPkt), F_HOP_COUNT);\r
+            }\r
+            /* input frame no longer needed. free it. */\r
+            nwk_QadjustOrder(INQ, fPtr->orderStamp);\r
+\r
+            fPtr->fi_usage = FI_AVAILABLE;\r
+            return SMPL_SUCCESS;\r
+        }\r
+    } while (!done);\r
+\r
+    return SMPL_NO_FRAME;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          dispatchFrame\r
+ *\r
+ * @brief       Received frame looks OK so far. Dispatch to either NWK app by\r
+ *              invoking the handler or the user's app by simply leaving the\r
+ *              frame in the queue and letting the app poll the port.\r
+ *\r
+ * input parameters\r
+ * @param   fiPtr    - frameInfo_t pointer to received frame\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   void\r
+ */\r
+\r
+static void dispatchFrame(frameInfo_t *fiPtr)\r
+{\r
+    uint8_t port       = GET_FROM_FRAME(MRFI_P_PAYLOAD(&fiPtr->mrfiPkt), F_PORT_OS);\r
+    uint8_t nwkAppSize = sizeof(func) / sizeof(func[0]);\r
+    fhStatus_t rc;\r
+    linkID_t lid;\r
+\r
+#    if defined(ACCESS_POINT)\r
+    uint8_t loc;\r
+#    endif\r
+#    if !defined(END_DEVICE)\r
+    uint8_t isForMe;\r
+#    endif\r
+\r
+    /* be sure it's not an echo... */\r
+    if (!memcmp(MRFI_P_SRC_ADDR(&fiPtr->mrfiPkt), sMyAddr, NET_ADDR_SIZE))\r
+    {\r
+        fiPtr->fi_usage = FI_AVAILABLE;\r
+        return;\r
+    }\r
+\r
+    /* Make sure encyrption bit conforms to our security support context. */\r
+#    if defined(SMPL_SECURE)\r
+    if (!(GET_FROM_FRAME(MRFI_P_PAYLOAD(&fiPtr->mrfiPkt), F_ENCRYPT_OS)))\r
+    {\r
+        /* Encyrption bit is not on when when it should be */\r
+        fiPtr->fi_usage = FI_AVAILABLE;\r
+        return;\r
+    }\r
+#    else\r
+    if (GET_FROM_FRAME(MRFI_P_PAYLOAD(&fiPtr->mrfiPkt), F_ENCRYPT_OS))\r
+    {\r
+        /* Encyrption bit is on when when it should not be */\r
+        fiPtr->fi_usage = FI_AVAILABLE;\r
+        return;\r
+    }\r
+#    endif /* SMPL_SECURE */\r
+\r
+    /* If it's a network application port dispatch to service routine. Dispose\r
+     * of frame depending on return code.\r
+     */\r
+    if (port && (port <= nwkAppSize))\r
+    {\r
+#    if defined(SMPL_SECURE)\r
+        /* Non-connection-based frame. We can decode here if it was encrypted */\r
+        if (!nwk_getSecureFrame(&fiPtr->mrfiPkt, MRFI_GET_PAYLOAD_LEN(&fiPtr->mrfiPkt) -\r
+                                F_SEC_CTR_OS, 0))\r
+        {\r
+            fiPtr->fi_usage = FI_AVAILABLE;\r
+            return;\r
+        }\r
+#    endif\r
+        rc = func[port - 1](&fiPtr->mrfiPkt);\r
+        if (FHS_KEEP == rc)\r
+        {\r
+            fiPtr->fi_usage = FI_INUSE_UNTIL_DEL;\r
+        }\r
+#    if !defined(END_DEVICE)\r
+        else if (FHS_REPLAY == rc)\r
+        {\r
+            /* an AP or an RE could be relaying a NWK application frame... */\r
+            nwk_replayFrame(fiPtr);\r
+        }\r
+#    endif\r
+        else /* rc == FHS_RELEASE (default...) */\r
+        {\r
+            fiPtr->fi_usage = FI_AVAILABLE;\r
+        }\r
+        return;\r
+    }\r
+    /* sanity check */\r
+    else if ((port != SMPL_PORT_USER_BCAST) &&\r
+             ((port < PORT_BASE_NUMBER) || (port > SMPL_PORT_STATIC_MAX)))\r
+    {\r
+        /* bogus port. drop frame */\r
+        fiPtr->fi_usage = FI_AVAILABLE;\r
+        return;\r
+    }\r
+\r
+    /* At this point we know the target is a user app. If this is an end device\r
+     * and we got this far save the frame and we're done. If we're an AP there\r
+     * are 3 cases: it's for us, it's for s store-and-forward client, or we need\r
+     * to replay the frame. If we're and RE and the frame didn't come from an RE\r
+     * and it's not for us, replay the frame.\r
+     */\r
+\r
+#    if defined(END_DEVICE)\r
+\r
+    /* If we're s polling end device we only accept application frames from\r
+     * the AP. This prevents duplicate reception if we happen to be on when\r
+     * a linked peer sends.\r
+     */\r
+#        if defined(RX_POLLS)\r
+    if (F_TX_DEVICE_ED != GET_FROM_FRAME(MRFI_P_PAYLOAD(&fiPtr->mrfiPkt), F_TX_DEVICE))\r
+    {\r
+        if (nwk_isConnectionValid(&fiPtr->mrfiPkt, &lid))\r
+        {\r
+            fiPtr->fi_usage = FI_INUSE_UNTIL_DEL;\r
+        }\r
+        else\r
+        {\r
+            fiPtr->fi_usage = FI_AVAILABLE;\r
+        }\r
+    }\r
+    else\r
+    {\r
+        fiPtr->fi_usage = FI_AVAILABLE;\r
+    }\r
+#        else\r
+    /* it's destined for a user app. */\r
+    if (nwk_isConnectionValid(&fiPtr->mrfiPkt, &lid))\r
+    {\r
+        fiPtr->fi_usage = FI_INUSE_UNTIL_DEL;\r
+        if (spCallback && spCallback(lid))\r
+        {\r
+            fiPtr->fi_usage = FI_AVAILABLE;\r
+            return;\r
+        }\r
+    }\r
+    else\r
+    {\r
+        fiPtr->fi_usage = FI_AVAILABLE;\r
+    }\r
+#        endif /* RX_POLLS */\r
+\r
+#    else /* END_DEVICE */\r
+\r
+    /* We have an issue if the frame is broadcast to the UUD port. The AP (or RE) must\r
+     * handle this frame as if it were the target in case there is an application\r
+     * running that is listening on that port. But if it's a broadcast it must also be\r
+     * replayed. It isn't enough just to test for the UUD port because it could be a\r
+     * directed frame to another device. We must check explicitly for broadcast\r
+     * destination address.\r
+     */\r
+    isForMe = !memcmp(sMyAddr, MRFI_P_DST_ADDR(&fiPtr->mrfiPkt), NET_ADDR_SIZE);\r
+    if (isForMe ||\r
+        ((port == SMPL_PORT_USER_BCAST) &&\r
+    !memcmp(nwk_getBCastAddress(), MRFI_P_DST_ADDR(&fiPtr->mrfiPkt), NET_ADDR_SIZE)))\r
+    {\r
+        /* The folllowing test will succeed for the UUD port regardless of the\r
+         * source address.\r
+         */\r
+        if (nwk_isConnectionValid(&fiPtr->mrfiPkt, &lid))\r
+        {\r
+            /* If this is for the UUD port and we are here then the device is either\r
+             * an AP or an RE. In either case it must replay the UUD port frame if the\r
+             * frame is not "for me". But it also must handle it since it could have a\r
+             * UUD-listening application. Do the reply first and let the subsequent code\r
+             * correctly set the frame usage state. Note that the routine return can be\r
+             * from this code block. If not it will drop through to the bottom without\r
+             * doing a replay.\r
+             */\r
+            /* Do I need to replay it? */\r
+            if (!isForMe)\r
+            {\r
+                /* must be a broadcast for the UUD port */\r
+                nwk_replayFrame(fiPtr);\r
+            }\r
+            /* OK. Now I handle it... */\r
+            fiPtr->fi_usage = FI_INUSE_UNTIL_DEL;\r
+            if (spCallback && spCallback(lid))\r
+            {\r
+                fiPtr->fi_usage = FI_AVAILABLE;\r
+                return;\r
+            }\r
+        }\r
+        else\r
+        {\r
+            fiPtr->fi_usage = FI_AVAILABLE;\r
+        }\r
+    }\r
+#        if defined(ACCESS_POINT)\r
+\r
+    /* Check to see if we need to save this for a S and F client. Otherwise,\r
+     * if it's not for us, get rid of it.\r
+     */\r
+    else if (nwk_isSandFClient(MRFI_P_DST_ADDR(&fiPtr->mrfiPkt), &loc))\r
+    {\r
+        /* Don't bother if it is a duplicate frame or if it's a forwarded frame\r
+         * echoed back from an RE.\r
+         */\r
+        if (!isDupSandFFrame(&fiPtr->mrfiPkt) &&\r
+            !(GET_FROM_FRAME(MRFI_P_PAYLOAD(&fiPtr->mrfiPkt), F_FWD_FRAME))\r
+            )\r
+        {\r
+#            if defined(APP_AUTO_ACK)\r
+            /* Make sure ack request bit is off. Sender will have gone away. */\r
+            PUT_INTO_FRAME(MRFI_P_PAYLOAD(&fiPtr->mrfiPkt), F_ACK_REQ, 0);\r
+#            endif\r
+            fiPtr->fi_usage = FI_INUSE_UNTIL_FWD;\r
+        }\r
+        else\r
+        {\r
+            fiPtr->fi_usage = FI_AVAILABLE;\r
+        }\r
+    }\r
+    else if (GET_FROM_FRAME(MRFI_P_PAYLOAD(&fiPtr->mrfiPkt), F_TX_DEVICE) == F_TX_DEVICE_AP)\r
+    {\r
+        /* I'm an AP and this frame came from an AP. Don't replay. */\r
+        fiPtr->fi_usage = FI_AVAILABLE;\r
+    }\r
+#        elif defined(RANGE_EXTENDER)\r
+    else if (GET_FROM_FRAME(MRFI_P_PAYLOAD(&fiPtr->mrfiPkt), F_TX_DEVICE) == F_TX_DEVICE_RE)\r
+    {\r
+        /* I'm an RE and this frame came from an RE. Don't replay. */\r
+        fiPtr->fi_usage = FI_AVAILABLE;\r
+    }\r
+#        endif\r
+    else\r
+    {\r
+        /* It's not for me and I'm either an AP or I'm an RE and the frame\r
+         * didn't come from an RE. Replay the frame.\r
+         */\r
+        nwk_replayFrame(fiPtr);\r
+    }\r
+#    endif /* !END_DEVICE */\r
+    return;\r
+}\r
+\r
+#endif   /* SIZE_INFRAME_Q > 0 */\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_sendFrame\r
+ *\r
+ * @brief       Send a frame by copying it to the radio Tx FIFO.\r
+ *\r
+ * input parameters\r
+ * @param   pFrameInfo   - pointer to frame to be sent\r
+ * @param   txOption     - do CCA or force frame out.\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return    SMPL_SUCCESS\r
+ *            SMPL_TX_CCA_FAIL Tx failed because of CCA failure.\r
+ *                             Tx FIFO flushed in this case.\r
+ */\r
+\r
+smplStatus_t nwk_sendFrame(frameInfo_t *pFrameInfo, uint8_t txOption)\r
+{\r
+    smplStatus_t rc;\r
+\r
+    /* set the type of device sending the frame in the header */\r
+    PUT_INTO_FRAME(MRFI_P_PAYLOAD(&pFrameInfo->mrfiPkt), F_TX_DEVICE, sMyTxType);\r
+\r
+    if (MRFI_TX_RESULT_SUCCESS == MRFI_Transmit(&pFrameInfo->mrfiPkt, txOption))\r
+    {\r
+        rc = SMPL_SUCCESS;\r
+    }\r
+    else\r
+    {\r
+        /* Tx failed -- probably CCA. free up frame buffer. We do not have NWK\r
+         * level retries. Let application do it.\r
+         */\r
+        rc = SMPL_TX_CCA_FAIL;\r
+    }\r
+\r
+    /* TX is done. free up the frame buffer */\r
+    pFrameInfo->fi_usage = FI_AVAILABLE;\r
+\r
+    return rc;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_getMyRxType\r
+ *\r
+ * @brief       Get my Rx type. Used to help populate the hops count in the\r
+ *              frame header to try and limit the broadcast storm. Info is\r
+ *              exchanged when linking.\r
+ *\r
+ * input parameters\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return      The address LSB.\r
+ */\r
+\r
+uint8_t nwk_getMyRxType(void)\r
+{\r
+    return sMyRxType;\r
+}\r
+\r
+#if defined(APP_AUTO_ACK)\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_sendAckReply\r
+ *\r
+ * @brief       Send an acknowledgement reply frame.\r
+ *\r
+ * input parameters\r
+ * @param   frame   - pointer to frame with ack request.\r
+ * @param   port    - port on whcih reply expected.\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return      void\r
+ */\r
+\r
+void nwk_sendAckReply(mrfiPacket_t *frame, uint8_t port)\r
+{\r
+    mrfiPacket_t dFrame;\r
+    uint8_t tid = GET_FROM_FRAME(MRFI_P_PAYLOAD(frame), F_TRACTID_OS);\r
+\r
+    /* set the type of device sending the frame in the header */\r
+    PUT_INTO_FRAME(MRFI_P_PAYLOAD(&dFrame), F_TX_DEVICE, sMyTxType);\r
+\r
+    /* set the listen type of device sending the frame in the header. */\r
+    PUT_INTO_FRAME(MRFI_P_PAYLOAD(&dFrame), F_RX_TYPE, sMyRxType);\r
+\r
+    /* destination address from received frame */\r
+    memcpy(MRFI_P_DST_ADDR(&dFrame), MRFI_P_SRC_ADDR(frame), NET_ADDR_SIZE);\r
+\r
+    /* source address */\r
+    memcpy(MRFI_P_SRC_ADDR(&dFrame), sMyAddr, NET_ADDR_SIZE);\r
+\r
+    /* port is the source the Tx port from the connection object */\r
+    PUT_INTO_FRAME(MRFI_P_PAYLOAD(&dFrame), F_PORT_OS, port);\r
+\r
+    /* frame length... */\r
+    MRFI_SET_PAYLOAD_LEN(&dFrame, F_APP_PAYLOAD_OS);\r
+\r
+    /* transaction ID taken from source frame */\r
+    PUT_INTO_FRAME(MRFI_P_PAYLOAD(&dFrame), F_TRACTID_OS, tid);\r
+\r
+    /* hop count... */\r
+    PUT_INTO_FRAME(MRFI_P_PAYLOAD(&dFrame), F_HOP_COUNT, MAX_HOPS);\r
+\r
+    /* set ACK field */\r
+    PUT_INTO_FRAME(MRFI_P_PAYLOAD(&dFrame), F_ACK_RPLY, F_ACK_RPLY_TYPE);\r
+    PUT_INTO_FRAME(MRFI_P_PAYLOAD(&dFrame), F_ACK_REQ, 0);\r
+\r
+    /* This is not a forwarded frame */\r
+    PUT_INTO_FRAME(MRFI_P_PAYLOAD(&dFrame), F_FWD_FRAME, 0);\r
+\r
+    /* Encryption state */\r
+#    if !defined(SMPL_SECURE)\r
+    PUT_INTO_FRAME(MRFI_P_PAYLOAD(&dFrame), F_ENCRYPT_OS, 0);\r
+#    else\r
+    PUT_INTO_FRAME(MRFI_P_PAYLOAD(&dFrame), F_ENCRYPT_OS, F_ENCRYPT_OS_MSK);\r
+    nwk_setSecureFrame(&dFrame, 0, 0);\r
+#    endif\r
+\r
+    MRFI_Transmit(&dFrame, MRFI_TX_TYPE_FORCED);\r
+\r
+    return;\r
+}\r
+\r
+#endif /* APP_AUTO_ACK */\r
+\r
+#if !defined(END_DEVICE)\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_replayFrame\r
+ *\r
+ * @brief       Deal with hop count on a Range Extender or Access Point replay.\r
+ *              Queue entry usage always left as available when done.\r
+ *\r
+ * input parameters\r
+ * @param   pFrameInfo   - pointer to frame information structure\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return      void\r
+ */\r
+\r
+void nwk_replayFrame(frameInfo_t *pFrameInfo)\r
+{\r
+    uint8_t hops = GET_FROM_FRAME(MRFI_P_PAYLOAD(&pFrameInfo->mrfiPkt), F_HOP_COUNT);\r
+\r
+    /* if hops are zero, drop frame. othewise send it. */\r
+    if (hops--)\r
+    {\r
+        PUT_INTO_FRAME(MRFI_P_PAYLOAD(&pFrameInfo->mrfiPkt), F_HOP_COUNT, hops);\r
+\r
+        /* Don't care if the Tx fails because of TO. Either someone else\r
+         * will retransmit or the application itself will recover.\r
+         */\r
+#    if defined(SMPL_SECURE)\r
+\r
+        /* If the frame was targeted to a NWK port it was decrypted on spec in\r
+         * the 'dispatchFrame()' method. It must be re-encypted in this case.\r
+         */\r
+        if (GET_FROM_FRAME(MRFI_P_PAYLOAD(&pFrameInfo->mrfiPkt), F_PORT_OS) <= SMPL_PORT_NWK_BCAST)\r
+        {\r
+            nwk_setSecureFrame(&pFrameInfo->mrfiPkt, MRFI_GET_PAYLOAD_LEN(\r
+                                   &pFrameInfo->mrfiPkt) - F_APP_PAYLOAD_OS, 0);\r
+        }\r
+#    endif\r
+        MRFI_DelayMs(1);\r
+        nwk_sendFrame(pFrameInfo, MRFI_TX_TYPE_CCA);\r
+    }\r
+    else\r
+    {\r
+        pFrameInfo->fi_usage = FI_AVAILABLE;\r
+    }\r
+    return;\r
+}\r
+\r
+#    if defined(ACCESS_POINT)\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_getSandFFrame\r
+ *\r
+ * @brief       Get any frame waiting for the client on the port supplied in\r
+ *              the frame payload.\r
+ *              TODO: support returning NWK application frames always. the\r
+ *              port requested in the call should be an user application port.\r
+ *              NWK app ports will never be in the called frame.\r
+ *              TODO: deal with broadcast NWK frames from AP.\r
+ *\r
+ * input parameters\r
+ * @param   frame   - pointer to frame in question\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return      pointer to frame if there is one, otherwise 0.\r
+ */\r
+\r
+frameInfo_t *nwk_getSandFFrame(mrfiPacket_t *frame, uint8_t osPort)\r
+{\r
+    uint8_t i, port = *(MRFI_P_PAYLOAD(frame) + F_APP_PAYLOAD_OS + osPort);\r
+    frameInfo_t *fiPtr;\r
+    rcvContext_t rcv;\r
+\r
+    rcv.type  = RCV_RAW_POLL_FRAME;\r
+    rcv.t.pkt = frame;\r
+    /* check the input queue for messages sent by others. */\r
+    if (fiPtr = nwk_QfindOldest(INQ, &rcv, USAGE_FWD))\r
+    {\r
+        return fiPtr;\r
+    }\r
+\r
+    /* Check the output queue to see if we ourselves need to send anything.\r
+     * TODO: use the cast-out scheme for output queue so this routine finds\r
+     * the oldest in either queue.\r
+     */\r
+    fiPtr = nwk_getQ(OUTQ);\r
+    for (i = 0; i < SIZE_OUTFRAME_Q; ++i, fiPtr++)\r
+    {\r
+        if (FI_INUSE_UNTIL_FWD == fiPtr->fi_usage)\r
+        {\r
+            if (!memcmp(MRFI_P_DST_ADDR(&fiPtr->mrfiPkt), MRFI_P_SRC_ADDR(frame), NET_ADDR_SIZE))\r
+            {\r
+                if (GET_FROM_FRAME(MRFI_P_PAYLOAD(&fiPtr->mrfiPkt), F_PORT_OS) == port)\r
+                {\r
+                    return fiPtr;\r
+                }\r
+            }\r
+        }\r
+    }\r
+    return 0;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_SendEmptyPollRspFrame\r
+ *\r
+ * @brief       There are no frames waiting for the requester on the specified\r
+ *              port. Send a frame back to that port with no payload.\r
+ *\r
+ * input parameters\r
+ * @param   frame   - pointer to frame in question\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return      void\r
+ */\r
+\r
+void nwk_SendEmptyPollRspFrame(mrfiPacket_t *frame)\r
+{\r
+    mrfiPacket_t dFrame;\r
+    uint8_t port = *(MRFI_P_PAYLOAD(frame) + F_APP_PAYLOAD_OS + M_POLL_PORT_OS);\r
+\r
+    /* set the type of device sending the frame in the header. we know it's an AP */\r
+    PUT_INTO_FRAME(MRFI_P_PAYLOAD(&dFrame), F_TX_DEVICE, F_TX_DEVICE_AP);\r
+\r
+    /* set the listen type of device sending the frame in the header. we know it's\r
+     * an AP is is probably always on...but use the static variable anyway.\r
+     */\r
+    PUT_INTO_FRAME(MRFI_P_PAYLOAD(&dFrame), F_RX_TYPE, sMyRxType);\r
+    /* destination address from received frame (polling device) */\r
+    memcpy(MRFI_P_DST_ADDR(&dFrame), MRFI_P_SRC_ADDR(frame), NET_ADDR_SIZE);\r
+    /* source address */\r
+    memcpy(MRFI_P_SRC_ADDR(&dFrame), MRFI_P_PAYLOAD(\r
+               frame) + F_APP_PAYLOAD_OS + M_POLL_ADDR_OS, NET_ADDR_SIZE);\r
+    /* port is the port requested */\r
+    PUT_INTO_FRAME(MRFI_P_PAYLOAD(&dFrame), F_PORT_OS, port);\r
+    /* frame length... */\r
+    MRFI_SET_PAYLOAD_LEN(&dFrame, F_APP_PAYLOAD_OS);\r
+    /* transaction ID... */\r
+    PUT_INTO_FRAME(MRFI_P_PAYLOAD(&dFrame), F_TRACTID_OS, sTRACTID);\r
+    sTRACTID++;\r
+    /* hop count... */\r
+    PUT_INTO_FRAME(MRFI_P_PAYLOAD(&dFrame), F_HOP_COUNT, MAX_HOPS_FROM_AP);\r
+\r
+    /* Ack fields */\r
+    PUT_INTO_FRAME(MRFI_P_PAYLOAD(&dFrame), F_ACK_RPLY, 0);\r
+    PUT_INTO_FRAME(MRFI_P_PAYLOAD(&dFrame), F_ACK_REQ, 0);\r
+\r
+    /* This is logically a forwarded frame */\r
+    PUT_INTO_FRAME(MRFI_P_PAYLOAD(&dFrame), F_FWD_FRAME, F_FRAME_FWD_TYPE);\r
+\r
+    /* Encryption state */\r
+#        if !defined(SMPL_SECURE)\r
+    PUT_INTO_FRAME(MRFI_P_PAYLOAD(&dFrame), F_ENCRYPT_OS, 0);\r
+#        else\r
+    PUT_INTO_FRAME(MRFI_P_PAYLOAD(&dFrame), F_ENCRYPT_OS, F_ENCRYPT_OS_MSK);\r
+    nwk_setSecureFrame(&dFrame, 0, 0);\r
+#        endif\r
+\r
+    MRFI_Transmit(&dFrame, MRFI_TX_TYPE_FORCED);\r
+\r
+    return;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          isDupSandFFrame\r
+ *\r
+ * @brief       Have we already stored this frame on behalf of a client?\r
+ *\r
+ * input parameters\r
+ * @param   frame   - pointer to frame in question\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return      Returns 1 if the frame is a duplicate, otherwise 0.\r
+ */\r
+\r
+uint8_t isDupSandFFrame(mrfiPacket_t *frame)\r
+{\r
+    uint8_t i, plLen = MRFI_GET_PAYLOAD_LEN(frame);\r
+    frameInfo_t *fiPtr;\r
+\r
+    /* check the input queue for duplicate S&F frame. */\r
+    fiPtr = nwk_getQ(INQ);\r
+    for (i = 0; i < SIZE_INFRAME_Q; ++i, fiPtr++)\r
+    {\r
+        if (FI_INUSE_UNTIL_FWD == fiPtr->fi_usage)\r
+        {\r
+            /* compare everything except the DEVICE INFO byte. */\r
+            if (MRFI_GET_PAYLOAD_LEN(&fiPtr->mrfiPkt) == plLen                                   &&\r
+                !memcmp(MRFI_P_DST_ADDR(&fiPtr->mrfiPkt), MRFI_P_DST_ADDR(frame), NET_ADDR_SIZE) &&\r
+                !memcmp(MRFI_P_SRC_ADDR(&fiPtr->mrfiPkt), MRFI_P_SRC_ADDR(frame), NET_ADDR_SIZE) &&\r
+                !memcmp(MRFI_P_PAYLOAD(&fiPtr->mrfiPkt), MRFI_P_PAYLOAD(frame), 1)               &&\r
+                !memcmp(MRFI_P_PAYLOAD(&fiPtr->mrfiPkt) + F_TRACTID_OS, MRFI_P_PAYLOAD(frame) +\r
+                        F_TRACTID_OS, plLen - F_TRACTID_OS)\r
+                )\r
+            {\r
+                return 1;\r
+            }\r
+        }\r
+    }\r
+    return 0;\r
+}\r
+\r
+#    endif /* ACCESS_POINT */\r
+\r
+#endif     /* !END_DEVICE */\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/Components/nwk/nwk_frame.h b/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/Components/nwk/nwk_frame.h
new file mode 100755 (executable)
index 0000000..f169911
--- /dev/null
@@ -0,0 +1,155 @@
+/**************************************************************************************************\r
+*  Filename:       nwk_frame.h\r
+*  Revised:        $Date: 2008-12-23 13:49:41 -0800 (Tue, 23 Dec 2008) $\r
+*  Revision:       $Revision: 18651 $\r
+*  Author:         $Author: lfriedman $\r
+*\r
+*  Description:    This header file supports the SimpliciTI frame handling functions.\r
+*\r
+*  Copyright 2004-2007 Texas Instruments Incorporated. All rights reserved.\r
+*\r
+*  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+*  the terms of a software license agreement between the user who downloaded the software,\r
+*  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+*  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+*  License. The License limits your use, and you acknowledge, that the Software may not be\r
+*  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+*  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+*  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+*  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+*  perform, display or sell this Software and/or its documentation for any purpose.\r
+*\r
+*  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+*  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+*  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+*  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+*  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+*  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+*  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+*  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+*  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+*\r
+*  Should you have any questions regarding your right to use this Software,\r
+*  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+\r
+#ifndef NWK_FRAME_H\r
+#define NWK_FRAME_H\r
+\r
+/* Frame field defines and masks. Mask name must be field name with '_MSK' appended\r
+ * so the GET and PUT macros work correctly -- they use token pasting. Offset values\r
+ * are with respect to the MRFI payload and not the entire frame.\r
+ */\r
+#define F_PORT_OS         0\r
+#define F_PORT_OS_MSK     (0x3F)\r
+#define F_ENCRYPT_OS      0\r
+#define F_ENCRYPT_OS_MSK  (0x40)\r
+#define F_FWD_FRAME       0\r
+#define F_FWD_FRAME_MSK   (0x80)\r
+#define F_RX_TYPE         1\r
+#define F_RX_TYPE_MSK     (0x40)\r
+#define F_ACK_REQ         1\r
+#define F_ACK_REQ_MSK     (0x80)\r
+#define F_ACK_RPLY        1\r
+#define F_ACK_RPLY_MSK    (0x08)\r
+#define F_TX_DEVICE       1\r
+#define F_TX_DEVICE_MSK   (0x30)\r
+#define F_HOP_COUNT       1\r
+#define F_HOP_COUNT_MSK   (0x07)\r
+#define F_TRACTID_OS      2\r
+#define F_TRACTID_OS_MSK  (0xFF)\r
+#define SMPL_NWK_HDR_SIZE 3\r
+\r
+#ifdef SMPL_SECURE\r
+\r
+#    define F_SECURE_OS       3\r
+\r
+#    define F_SEC_CTR_OS      3       /* counter hint */\r
+#    define F_SEC_CTR_OS_MSK  (0xFF)\r
+#    define F_SEC_ICHK_OS     4       /* Message integrity check */\r
+#    define F_SEC_ICHK_OS_MSK (0xFF)\r
+#    define F_SEC_MAC_OS      5       /* Message authentication code */\r
+#    define F_SEC_MAC_OS_MSK  (0xFF)\r
+\r
+#else\r
+\r
+#    define F_SECURE_OS       0\r
+\r
+#endif  /* SMPL_SECURE */\r
+\r
+#define F_APP_PAYLOAD_OS  (SMPL_NWK_HDR_SIZE + F_SECURE_OS)\r
+\r
+/* sub field details. they are in the correct bit locations (already shifted) */\r
+#define F_RX_TYPE_USER_CTL       0x00 /* does not poll... */\r
+#define F_RX_TYPE_POLLS          0x40 /* polls for held messages */\r
+\r
+#define F_ACK_REQ_TYPE           0x80\r
+#define F_ACK_RPLY_TYPE          0x08\r
+#define F_FRAME_FWD_TYPE         0x80\r
+#define F_FRAME_ENCRYPT_TYPE     0x40\r
+\r
+/* device type fields */\r
+#define F_TX_DEVICE_ED           0x00 /* End Device */\r
+#define F_TX_DEVICE_RE           0x10 /* Range Extender */\r
+#define F_TX_DEVICE_AP           0x20 /* Access Point */\r
+\r
+/* macro to get a field from a frame buffer */\r
+#define GET_FROM_FRAME(b, f)  ((b)[f] & (f##_MSK))\r
+\r
+/* Macro to put a value 'v' into a frame buffer 'b'. 'v' value must already be shifted\r
+ * if necessary. 'b' is a byte array\r
+ */\r
+#define PUT_INTO_FRAME(b, f, v)  do {(b)[f] = ((b)[f] & ~(f##_MSK)) | (v); } while (0)\r
+\r
+\r
+/*       ****   frame information objects\r
+ * info kept on each frame object\r
+ */\r
+#define   FI_AVAILABLE         0      /* entry available for use */\r
+#define   FI_INUSE_UNTIL_DEL   1      /* in use. will be explicitly reclaimed */\r
+#define   FI_INUSE_UNTIL_TX    2      /* in use. will be reclaimed after Tx */\r
+#define   FI_INUSE_UNTIL_FWD   3      /* in use until forwarded by AP */\r
+#define   FI_INUSE_TRANSITION  4      /* being retrieved. do not delete in Rx ISR thread. */\r
+\r
+typedef struct\r
+{\r
+    uint8_t rssi;\r
+    uint8_t lqi;\r
+} sigInfo_t;\r
+\r
+typedef struct\r
+{\r
+    volatile uint8_t fi_usage;\r
+    uint8_t orderStamp;\r
+    mrfiPacket_t mrfiPkt;\r
+} frameInfo_t;\r
+\r
+\r
+/* prototypes */\r
+frameInfo_t  *nwk_buildFrame(uint8_t, uint8_t * msg, uint8_t len, uint8_t hops);\r
+#ifdef APP_AUTO_ACK\r
+frameInfo_t  *nwk_buildAckReqFrame(uint8_t, uint8_t *, uint8_t, uint8_t, volatile uint8_t *);\r
+#endif\r
+void nwk_receiveFrame(void);\r
+\r
+void nwk_frameInit(uint8_t (*)(linkID_t));\r
+smplStatus_t nwk_retrieveFrame(rcvContext_t *, uint8_t *, uint8_t *, addr_t *, uint8_t *);\r
+smplStatus_t nwk_sendFrame(frameInfo_t *, uint8_t txOption);\r
+\r
+frameInfo_t  *nwk_getSandFFrame(mrfiPacket_t *, uint8_t);\r
+uint8_t nwk_getMyRxType(void);\r
+void nwk_SendEmptyPollRspFrame(mrfiPacket_t *);\r
+\r
+#ifdef APP_AUTO_ACK\r
+void nwk_sendAckReply(mrfiPacket_t *, uint8_t);\r
+#endif\r
+\r
+#ifndef END_DEVICE\r
+/* only APs and REs repeat frames */\r
+void nwk_replayFrame(frameInfo_t *);\r
+\r
+#endif\r
+\r
+\r
+#endif\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/Components/nwk/nwk_globals.c b/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/Components/nwk/nwk_globals.c
new file mode 100755 (executable)
index 0000000..b63cf67
--- /dev/null
@@ -0,0 +1,267 @@
+/**************************************************************************************************\r
+*  Filename:       nwk_globals.c\r
+*  Revised:        $Date: 2009-10-27 20:48:11 -0700 (Tue, 27 Oct 2009) $\r
+*  Revision:       $Revision: 20995 $\r
+*\r
+*  Description:    This file manages global NWK data.\r
+*\r
+*  Copyright 2007-2009 Texas Instruments Incorporated. All rights reserved.\r
+*\r
+*  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+*  the terms of a software license agreement between the user who downloaded the software,\r
+*  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+*  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+*  License. The License limits your use, and you acknowledge, that the Software may not be\r
+*  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+*  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+*  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+*  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+*  perform, display or sell this Software and/or its documentation for any purpose.\r
+*\r
+*  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+*  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+*  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+*  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+*  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+*  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+*  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+*  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+*  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+*\r
+*  Should you have any questions regarding your right to use this Software,\r
+*  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+\r
+/******************************************************************************\r
+ * INCLUDES\r
+ */\r
+#include <string.h>\r
+#include "bsp.h"\r
+#include "mrfi.h"\r
+#include "nwk_types.h"\r
+#include "nwk_globals.h"\r
+\r
+/******************************************************************************\r
+ * MACROS\r
+ */\r
+\r
+/******************************************************************************\r
+ * CONSTANTS AND DEFINES\r
+ */\r
+\r
+/******************************************************************************\r
+ * TYPEDEFS\r
+ */\r
+\r
+/******************************************************************************\r
+ * LOCAL VARIABLES\r
+ */\r
+static const addr_t sMyROMAddress = THIS_DEVICE_ADDRESS;\r
+static addr_t sAPAddress;\r
+static addr_t sMyRAMAddress;\r
+static uint8_t sRAMAddressIsSet = 0;\r
+\r
+/* Version number set as a 4 byte quantity. Each byte is a revision number\r
+ * in the form w.x.y.z. The subfields are each limited to values 0x0-0xFF.\r
+ */\r
+static const smplVersionInfo_t sVersionInfo = {\r
+    0x02,                                              /* protocol version */\r
+    0x01,                                              /* major revision number */\r
+    0x01,                                              /* minor revision number */\r
+    0x01,                                              /* maintenance release number */\r
+    0x00                                               /* special release */\r
+};\r
+\r
+/******************************************************************************\r
+ * LOCAL FUNCTIONS\r
+ */\r
+\r
+/******************************************************************************\r
+ * GLOBAL VARIABLES\r
+ */\r
+\r
+/******************************************************************************\r
+ * GLOBAL FUNCTIONS\r
+ */\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_globalsInit\r
+ *\r
+ * @brief       Initialization of global symbols\r
+ *\r
+ * input parameters\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   void\r
+ */\r
+\r
+void nwk_globalsInit(void)\r
+{\r
+\r
+    memset(&sAPAddress, 0x00, sizeof(addr_t));\r
+\r
+    /* populate RAM address from ROM default if it hasn't laready been set\r
+     * using the IOCTL interface.\r
+     */\r
+    if (!sRAMAddressIsSet)\r
+    {\r
+        memcpy(&sMyRAMAddress, &sMyROMAddress, sizeof(addr_t));\r
+        sRAMAddressIsSet = 1; /* RAM address is now valid */\r
+    }\r
+\r
+    return;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_getMyAddress\r
+ *\r
+ * @brief       Return a pointer to my address. It comes either from ROM as\r
+ *              set in the configuration file or it was set using the IOCTL\r
+ *              interface -- probably from random bytes.\r
+ *\r
+ * input parameters\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   pointer to a constant address type object.\r
+ */\r
+\r
+addr_t const *nwk_getMyAddress(void)\r
+{\r
+    /* This call supports returning a valid pointer before either the\r
+     * initialization or external setting of the address. But caller needs\r
+     * to be careful -- if this routine is called immediately it will return\r
+     * the ROM address. If the application then sets the address using the\r
+     * IOCTL before doing the SMPL_Init() the original pointer is no longer\r
+     * valid as it points to the wrong address.\r
+     */\r
+    return sRAMAddressIsSet ? &sMyRAMAddress : &sMyROMAddress;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_getFWVersion\r
+ *\r
+ * @brief       Return a pointer to the current firmware version string.\r
+ *\r
+ * input parameters\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   pointer to a constant uint16_t object.\r
+ */\r
+\r
+uint8_t const *nwk_getFWVersion()\r
+{\r
+    return sVersionInfo.fwVerString;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_getProtocolVersion\r
+ *\r
+ * @brief       Return the current protocol version.\r
+ *\r
+ * input parameters\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   Protocol version.\r
+ */\r
+\r
+uint8_t nwk_getProtocolVersion(void)\r
+{\r
+    return sVersionInfo.protocolVersion;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_setMyAddress\r
+ *\r
+ * @brief       Set my address object if it hasn't already been set. This call\r
+ *              is referenced by the IOCTL support used to change the device\r
+ *              address. It is effective only if the address has not already\r
+ *              been set.\r
+ *\r
+ * input parameters\r
+ *\r
+ * @param   addr  - pointer to the address object to be used to set my address.\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   Returns non-zero if request is respected, otherwise returns 0.\r
+ */\r
+\r
+uint8_t nwk_setMyAddress(addr_t *addr)\r
+{\r
+    uint8_t rc = 0;\r
+\r
+    if (!sRAMAddressIsSet)\r
+    {\r
+        memcpy(&sMyRAMAddress, addr, sizeof(addr_t));\r
+        sRAMAddressIsSet = 1; /* RAM address is now valid */\r
+        rc = 1;\r
+    }\r
+\r
+    return rc;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_setAPAddress\r
+ *\r
+ * @brief       Set the AP's address. Called after the AP address is gleaned\r
+ *              from the Join reply.\r
+ *\r
+ * input parameters\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   void\r
+ */\r
+\r
+void nwk_setAPAddress(addr_t *addr)\r
+{\r
+\r
+    memcpy((void *)&sAPAddress, (void *)addr, NET_ADDR_SIZE);\r
+\r
+    return;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_getAPAddress\r
+ *\r
+ * @brief       Get the AP's address.\r
+ *\r
+ * input parameters\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   Pointer to a constant address object or null if the address has not\r
+ *           yet been set.\r
+ */\r
+\r
+addr_t const *nwk_getAPAddress(void)\r
+{\r
+    addr_t addr;\r
+\r
+    memset(&addr, 0x0, sizeof(addr));\r
+\r
+    return !memcmp(&sAPAddress, &addr, NET_ADDR_SIZE) ? 0 : &sAPAddress;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_getBCastAddress\r
+ *\r
+ * @brief       Get the network broadcast address.\r
+ *\r
+ * input parameters\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   Pointer to a constant address object.\r
+ */\r
+\r
+addr_t const *nwk_getBCastAddress(void)\r
+{\r
+    return (addr_t const *)mrfiBroadcastAddr;\r
+}\r
+\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/Components/nwk/nwk_globals.h b/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/Components/nwk/nwk_globals.h
new file mode 100755 (executable)
index 0000000..7f349c7
--- /dev/null
@@ -0,0 +1,51 @@
+/**************************************************************************************************\r
+*  Filename:       nwk_globals.h\r
+*  Revised:        $Date: 2008-07-30 11:22:21 -0700 (Wed, 30 Jul 2008) $\r
+*  Revision:       $Revision: 17655 $\r
+*  Author:         $Author: lfriedman $\r
+*\r
+*  Description:    This header file supports the management of NWK global symbols.\r
+*\r
+*  Copyright 2004-2007 Texas Instruments Incorporated. All rights reserved.\r
+*\r
+*  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+*  the terms of a software license agreement between the user who downloaded the software,\r
+*  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+*  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+*  License. The License limits your use, and you acknowledge, that the Software may not be\r
+*  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+*  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+*  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+*  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+*  perform, display or sell this Software and/or its documentation for any purpose.\r
+*\r
+*  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+*  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+*  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+*  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+*  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+*  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+*  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+*  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+*  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+*\r
+*  Should you have any questions regarding your right to use this Software,\r
+*  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+#ifndef NWK_GLOBALS_H\r
+#define NWK_GLOBALS_H\r
+\r
+\r
+/* Prototypes */\r
+void nwk_globalsInit(void);\r
+addr_t const  *nwk_getMyAddress(void);\r
+uint8_t nwk_setMyAddress(addr_t *addr);\r
+void nwk_setAPAddress(addr_t *addr);\r
+addr_t const  *nwk_getAPAddress(void);\r
+addr_t const  *nwk_getBCastAddress(void);\r
+uint8_t const *nwk_getFWVersion(void);\r
+uint8_t nwk_getProtocolVersion(void);\r
+\r
+\r
+#endif\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/Components/nwk/nwk_types.h b/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/Components/nwk/nwk_types.h
new file mode 100755 (executable)
index 0000000..79d4e03
--- /dev/null
@@ -0,0 +1,344 @@
+/**************************************************************************************************\r
+*  Filename:       nwk_types.h\r
+*  Revised:        $Date: 2009-01-13 11:31:14 -0800 (Tue, 13 Jan 2009) $\r
+*  Revision:       $Revision: 18744 $\r
+*  Author:         $Author: lfriedman $\r
+*\r
+*  Description:    This header file defines the SimpliciTI typedefs.\r
+*\r
+*  Copyright 2004-2007 Texas Instruments Incorporated. All rights reserved.\r
+*\r
+*  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+*  the terms of a software license agreement between the user who downloaded the software,\r
+*  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+*  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+*  License. The License limits your use, and you acknowledge, that the Software may not be\r
+*  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+*  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+*  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+*  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+*  perform, display or sell this Software and/or its documentation for any purpose.\r
+*\r
+*  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+*  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+*  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+*  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+*  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+*  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+*  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+*  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+*  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+*\r
+*  Should you have any questions regarding your right to use this Software,\r
+*  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+#ifndef NWK_TYPES_H\r
+#define NWK_TYPES_H\r
+\r
+#define NWK_TX_RETRY_COUNT    10\r
+#define NWK_RX_RETRY_COUNT    10\r
+\r
+#define NWK_APP_REPLY_BIT  (0x80)\r
+\r
+#define NET_ADDR_SIZE      MRFI_ADDR_SIZE   /* size of address in bytes */\r
+\r
+#ifdef  FREQUENCY_AGILITY\r
+#    define NWK_FREQ_TBL_SIZE  MRFI_NUM_LOGICAL_CHANS\r
+#else\r
+#    define NWK_FREQ_TBL_SIZE  1\r
+#endif\r
+\r
+typedef struct\r
+{\r
+    uint8_t addr[NET_ADDR_SIZE];\r
+} addr_t;\r
+\r
+typedef uint8_t linkID_t;\r
+typedef uint8_t ccRadioStatus_t;\r
+\r
+\r
+/*      ***********************************************\r
+ *                   Begin IOCTL Support\r
+ *      ***********************************************\r
+ */\r
+enum ioctlObject {\r
+    IOCTL_OBJ_FREQ,\r
+    IOCTL_OBJ_CRYPTKEY,\r
+    IOCTL_OBJ_RAW_IO,\r
+    IOCTL_OBJ_RADIO,\r
+    IOCTL_OBJ_AP_JOIN,\r
+    IOCTL_OBJ_ADDR,\r
+    IOCTL_OBJ_CONNOBJ,\r
+    IOCTL_OBJ_FWVER,\r
+    IOCTL_OBJ_PROTOVER,\r
+    IOCTL_OBJ_NVOBJ,\r
+    IOCTL_OBJ_TOKEN\r
+};\r
+\r
+enum ioctlAction {\r
+    IOCTL_ACT_SET,\r
+    IOCTL_ACT_GET,\r
+    IOCTL_ACT_READ,\r
+    IOCTL_ACT_WRITE,\r
+    IOCTL_ACT_RADIO_SLEEP,\r
+    IOCTL_ACT_RADIO_AWAKE,\r
+    IOCTL_ACT_RADIO_SIGINFO,\r
+    IOCTL_ACT_RADIO_RSSI,\r
+    IOCTL_ACT_RADIO_RXON,\r
+    IOCTL_ACT_RADIO_RXIDLE,\r
+    IOCTL_ACT_RADIO_SETPWR,\r
+    IOCTL_ACT_ON,\r
+    IOCTL_ACT_OFF,\r
+    IOCTL_ACT_SCAN,\r
+    IOCTL_ACT_DELETE\r
+};\r
+\r
+typedef enum ioctlObject ioctlObject_t;\r
+typedef enum ioctlAction ioctlAction_t;\r
+\r
+enum ioctlLevel\r
+{\r
+    IOCTL_LEVEL_0,\r
+    IOCTL_LEVEL_1,\r
+    IOCTL_LEVEL_2\r
+};\r
+\r
+typedef enum ioctlLevel ioctlLevel_t;\r
+\r
+typedef struct\r
+{\r
+    addr_t   *addr;\r
+    uint8_t  *msg;\r
+    uint8_t len;\r
+    uint8_t port;\r
+} ioctlRawSend_t;\r
+\r
+typedef struct\r
+{\r
+    addr_t  *addr;\r
+    uint8_t *msg;\r
+    uint8_t len;\r
+    uint8_t port;\r
+    uint8_t hopCount;\r
+} ioctlRawReceive_t;\r
+\r
+/*\r
+ * Signal information support\r
+ */\r
+typedef int8_t rssi_t;\r
+\r
+typedef struct\r
+{\r
+    rssi_t rssi;\r
+    uint8_t lqi;\r
+} rxMetrics_t;\r
+\r
+typedef struct\r
+{\r
+    linkID_t lid; /* input: Link ID for which signal info desired */\r
+    rxMetrics_t sigInfo;\r
+} ioctlRadioSiginfo_t;\r
+\r
+\r
+/*                      *** Begin SET/GET token support ***                */\r
+enum tokenType\r
+{\r
+    TT_LINK,      /* Token Type is Link */\r
+    TT_JOIN       /* Token Type is Join */\r
+};\r
+\r
+typedef enum tokenType tokenType_t;\r
+\r
+/* Create a union. If either token ever changes type it will make things easier. */\r
+typedef union\r
+{\r
+    uint32_t linkToken;\r
+    uint32_t joinToken;\r
+} token_t;\r
+\r
+typedef struct\r
+{\r
+    tokenType_t tokenType;\r
+    token_t token;\r
+} ioctlToken_t;\r
+/*                      *** End SET/GET token support ***                */\r
+\r
+\r
+/*\r
+ * Frequency Agility support\r
+ */\r
+typedef struct\r
+{\r
+    uint8_t logicalChan;\r
+} freqEntry_t;\r
+\r
+typedef struct\r
+{\r
+    uint8_t numChan;\r
+    freqEntry_t *freq;\r
+} ioctlScanChan_t;\r
+\r
+/* Security typedefs to make things easier if they change types */\r
+typedef uint8_t secMAC_t;\r
+typedef uint8_t secFCS_t;\r
+\r
+/***************************************************************************************\r
+ *                                 ** NV Object support **\r
+ *\r
+ * The following object supports saving and restoring the information\r
+ * necessary to save and restore a device connection context.\r
+ *\r
+ * On a GET interface populates the IOCTL object with the version and length (in bytes)\r
+ * of the current static connection iformation area. In addition it populates the address\r
+ * pointed to by 'objPtr' with the base address of the connection context. At this point\r
+ * the caller can either copy to or from the address. Note that this is a dangerous\r
+ * interface, as the caller is provided with direct access to the connection context.\r
+ *\r
+ * When restoring the connection context some sanity checks are possible. If the\r
+ * version or length elements of the saved context do not match those of the current\r
+ * static object the static object should not be populated. If this sanity fails the\r
+ * caller is not provided with the pointer to the conneciton ocntext.\r
+ *\r
+ * This interface is fairly simple and it is possible to get the address of the\r
+ * connection context to do a restore by simply doing a GET call. This avoids the\r
+ * sanity checks. However, this is not recommended because there may be other side\r
+ * effects of doing a SET that are necessary when restoring a context and are done\r
+ * only when the proper option is used to restore the connection context.\r
+ *\r
+ *************************************************************************************/\r
+typedef struct\r
+{\r
+    uint8_t objVersion;\r
+    uint16_t objLen;\r
+    uint8_t  **objPtr;\r
+} ioctlNVObj_t;\r
+\r
+/*      ***********************************************\r
+ *                    End IOCTL Support\r
+ *      ***********************************************\r
+ */\r
+\r
+enum smplStatus {\r
+    SMPL_SUCCESS,\r
+    SMPL_TIMEOUT,\r
+    SMPL_BAD_PARAM,\r
+    SMPL_NOMEM,\r
+    SMPL_NO_FRAME,\r
+    SMPL_NO_LINK,\r
+    SMPL_NO_JOIN,\r
+    SMPL_NO_CHANNEL,\r
+    SMPL_NO_PEER_UNLINK,\r
+    SMPL_TX_CCA_FAIL,\r
+    SMPL_NO_PAYLOAD,\r
+    SMPL_NO_AP_ADDRESS,\r
+    SMPL_NO_ACK\r
+};\r
+\r
+typedef enum smplStatus smplStatus_t;\r
+\r
+/* NWK application frame handling status codes */\r
+enum fhStatus\r
+{\r
+    FHS_RELEASE, /* handled in interrupt thread */\r
+    FHS_KEEP,    /* handled by background application */\r
+    FHS_REPLAY   /* non-ED case: NWK frame not for me that should be replayed */\r
+};\r
+\r
+typedef enum fhStatus fhStatus_t;\r
+\r
+/********    BEGIN: Object support for parameter context in queue management *********/\r
+enum rcvType\r
+{\r
+    RCV_NWK_PORT,\r
+    RCV_APP_LID,\r
+    RCV_RAW_POLL_FRAME\r
+};\r
+\r
+typedef enum rcvType rcvType_t;\r
+\r
+/* Tx options type */\r
+typedef  uint16_t txOpt_t;\r
+\r
+typedef struct\r
+{\r
+    rcvType_t type;\r
+    union\r
+    {\r
+        linkID_t lid;\r
+        uint8_t port;\r
+        mrfiPacket_t *pkt;\r
+    } t;\r
+} rcvContext_t;\r
+/********    END: Object support for parameter context in queue management *********/\r
+\r
+#define SMPL_FWVERSION_SIZE  4\r
+\r
+typedef struct\r
+{\r
+    uint8_t protocolVersion;\r
+    uint8_t fwVerString[SMPL_FWVERSION_SIZE];\r
+} smplVersionInfo_t;\r
+\r
+/* The following typedef is used to standardize the application Transaction ID field.\r
+ * This field can be used for detection of out-of-order application payloads if this\r
+ * is an issue. There is no real reason to use more than a byte for this support. But\r
+ * if this typedef is anything other than uint8_t be sure to attend to alignment and\r
+ * endian issues.\r
+ */\r
+typedef uint8_t appPTid_t;\r
+\r
+#ifdef ACCESS_POINT\r
+/* Store-and-forward client info object */\r
+typedef struct\r
+{\r
+    addr_t clientAddr;\r
+    appPTid_t lastTID;\r
+} sfClientInfo_t;\r
+\r
+typedef struct\r
+{\r
+    uint8_t curNumSFClients;\r
+    sfClientInfo_t sfClients[NUM_STORE_AND_FWD_CLIENTS];\r
+} sfInfo_t;\r
+#endif\r
+\r
+/****************************************************************************************\r
+*                           SOME USEFUL MACROS\r
+****************************************************************************************/\r
+\r
+/* Delay loop support. Requires mrfi.h */\r
+#define NWK_DELAY(spin)   MRFI_DelayMs(spin)\r
+#define NWK_REPLY_DELAY() MRFI_ReplyDelay();\r
+\r
+/* Network applications may need to remember radio state because the user\r
+ * application may choose to turn Rx off. These macros help get and restore\r
+ * the radio Rx state. The macros should be in the same code block at the same level.\r
+ * The argument 's' is the 'current' radio state and should be set in the code block\r
+ * with a call to MRFI_GetRadioState() _before_ using the macros.\r
+ *\r
+ * Used extensively by NWK but user applications may use them as well. But it is\r
+ * much more liekly that an application will know the radio state since it likely\r
+ * will have set it with IOCTL calls. Requires mrfi.h.\r
+ */\r
+#define NWK_CHECK_FOR_SETRX(s)  if (MRFI_RADIO_STATE_RX != s)    \\r
+    {                                \\r
+        if (MRFI_RADIO_STATE_OFF == s) \\r
+        {                              \\r
+            MRFI_WakeUp();               \\r
+        }                              \\r
+        MRFI_RxOn();                   \\r
+    }\r
+\r
+#define NWK_CHECK_FOR_RESTORE_STATE(s) if (MRFI_RADIO_STATE_RX != s)    \\r
+    {                                \\r
+        if (MRFI_RADIO_STATE_OFF == s) \\r
+        {                              \\r
+            MRFI_Sleep();                \\r
+        }                              \\r
+        else                           \\r
+        {                              \\r
+            MRFI_RxIdle();               \\r
+        }                              \\r
+    }\r
+#endif\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/Components/nwk_applications/nwk_freq.c b/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/Components/nwk_applications/nwk_freq.c
new file mode 100755 (executable)
index 0000000..ed18428
--- /dev/null
@@ -0,0 +1,649 @@
+/**************************************************************************************************\r
+*  Filename:       nwk_freq.c\r
+*  Revised:        $Date: 2008-12-10 13:50:46 -0800 (Wed, 10 Dec 2008) $\r
+*  Revision:       $Revision: 18594 $\r
+*  Author:         $Author: lfriedman $\r
+*\r
+*  Description:    This file supports the SimpliciTI Freq network application.\r
+*\r
+*  Copyright 2007-2009 Texas Instruments Incorporated. All rights reserved.\r
+*\r
+*  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+*  the terms of a software license agreement between the user who downloaded the software,\r
+*  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+*  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+*  License. The License limits your use, and you acknowledge, that the Software may not be\r
+*  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+*  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+*  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+*  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+*  perform, display or sell this Software and/or its documentation for any purpose.\r
+*\r
+*  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+*  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+*  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+*  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+*  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+*  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+*  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+*  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+*  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+*\r
+*  Should you have any questions regarding your right to use this Software,\r
+*  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+/******************************************************************************\r
+ * INCLUDES\r
+ */\r
+\r
+#include <string.h>\r
+#include "bsp.h"\r
+#include "mrfi.h"\r
+#include "nwk_types.h"\r
+#include "nwk.h"\r
+#include "nwk_frame.h"\r
+#include "nwk_freq.h"\r
+#include "nwk_globals.h"\r
+#include "nwk_api.h"\r
+#include "nwk_security.h"\r
+\r
+#if defined(FREQUENCY_AGILITY)\r
+\r
+/******************************************************************************\r
+ * MACROS\r
+ */\r
+\r
+/******************************************************************************\r
+ * CONSTANTS AND DEFINES\r
+ */\r
+\r
+/******************************************************************************\r
+ * TYPEDEFS\r
+ */\r
+\r
+/******************************************************************************\r
+ * LOCAL VARIABLES\r
+ */\r
+static freqEntry_t sCurLogicalChan;\r
+static volatile uint8_t sTid = 0;\r
+\r
+/******************************************************************************\r
+ * LOCAL FUNCTIONS\r
+ */\r
+\r
+static fhStatus_t handle_freq_cmd(mrfiPacket_t *);\r
+static fhStatus_t send_ping_reply(mrfiPacket_t *);\r
+\r
+#    ifndef ACCESS_POINT\r
+static uint8_t change_channel_cmd_is_valid(mrfiPacket_t *);\r
+\r
+#    endif\r
+#    ifdef RANGE_EXTENDER\r
+/* REs must replay frame before changing channels */\r
+static void replayFirst(mrfiPacket_t *);\r
+\r
+#    endif\r
+#    ifdef ACCESS_POINT\r
+/* only the AP can broadcast this command */\r
+static void broadcast_channel_change(uint8_t);\r
+\r
+#    else\r
+/* APs do not process this frame */\r
+static void change_channel_cmd(mrfiPacket_t *);\r
+\r
+#    endif\r
+\r
+/******************************************************************************\r
+ * GLOBAL VARIABLES\r
+ */\r
+\r
+/******************************************************************************\r
+ * GLOBAL FUNCTIONS\r
+ */\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_freqInit\r
+ *\r
+ * @brief       Initialize NWK Frequency application.\r
+ *\r
+ * @return   none.\r
+ */\r
+\r
+void nwk_freqInit(void)\r
+{\r
+\r
+    memset(&sCurLogicalChan, 0x0, sizeof(sCurLogicalChan));\r
+\r
+    /* pick a random value to start the transaction ID for this app. */\r
+    sTid = MRFI_RandomByte();\r
+\r
+    return;\r
+}\r
+\r
+/***************************************************************************\r
+ * @fn          nwk_setChannel\r
+ *\r
+ * @brief       Set requested logical channel.  Accessed by application\r
+ *              through IOCTL interface\r
+ *\r
+ * input parameters\r
+ * @param   chan     - pointer to channel object of requested channel\r
+ *\r
+ * @return   status of operation:\r
+ *             SMPL_SUCCESS    if channel set\r
+ *             SMPL_BAD_PARAM  if requested channel is out of range\r
+ */\r
+\r
+smplStatus_t nwk_setChannel(freqEntry_t *chan)\r
+{\r
+    smplStatus_t rc = SMPL_BAD_PARAM;\r
+\r
+    if (chan->logicalChan < NWK_FREQ_TBL_SIZE)\r
+    {\r
+        MRFI_SetLogicalChannel(chan->logicalChan);\r
+        sCurLogicalChan = *chan;\r
+        rc = SMPL_SUCCESS;\r
+    }\r
+    return rc;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_getChannel\r
+ *\r
+ * @brief       Get current logical channel. Accessed by application through\r
+ *              IOCTL interface\r
+ *\r
+ * input parameters\r
+ * @param   chan     - pointer to channel object of requested channel\r
+ *\r
+ * output parameters\r
+ * @param   chan     - populated channel object\r
+ *\r
+ * @return   none.\r
+ */\r
+\r
+void nwk_getChannel(freqEntry_t *chan)\r
+{\r
+    *chan = sCurLogicalChan;\r
+\r
+    return;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          handle_freq_cmd\r
+ *\r
+ * @brief       Handle a Frequency application command.\r
+ *\r
+ * input parameters\r
+ * @param   frame     - pointer to frame with command context\r
+ *\r
+ * @return   Return FHS_RELEASE if caller should release frame otherwise\r
+ *           return FHS_REPLAY.\r
+ */\r
+\r
+static fhStatus_t handle_freq_cmd(mrfiPacket_t *frame)\r
+{\r
+    fhStatus_t rc = FHS_RELEASE;\r
+\r
+    switch (*(MRFI_P_PAYLOAD(frame) + F_APP_PAYLOAD_OS))\r
+    {\r
+        case FREQ_REQ_PING:\r
+            rc = send_ping_reply(frame);\r
+            break;\r
+\r
+#    ifndef ACCESS_POINT\r
+        case FREQ_REQ_MOVE:\r
+#        ifdef RANGE_EXTENDER\r
+            replayFirst(frame);\r
+#        endif\r
+\r
+            /* Make sure the change channel Freq command came from\r
+             * a valid source before obeying.\r
+             */\r
+            if (change_channel_cmd_is_valid(frame))\r
+            {\r
+                change_channel_cmd(frame);\r
+            }\r
+            break;\r
+#    endif\r
+\r
+#    ifdef ACCESS_POINT\r
+        case FREQ_REQ_REQ_MOVE:\r
+            break;\r
+#    endif\r
+        default:\r
+            break;\r
+    }\r
+\r
+    return rc;\r
+}\r
+\r
+#    ifndef ACCESS_POINT\r
+\r
+/******************************************************************************\r
+ * @fn          change_channel_cmd_is_valid\r
+ *\r
+ * @brief       Check validity of a change channel command frame.\r
+ *\r
+ * input parameters\r
+ * @param   frame  - pointer to frame with command context\r
+ *\r
+ * @return   Returns non-zero if command is valid, otherwise returns 0.\r
+ *           Command is valid if either:\r
+ *             - frame is directed\r
+ *             - frame is from an AP and we know about that AP\r
+ *\r
+ *           It is possible that either we don't know about an AP or that\r
+ *           we do but this frame comes from another AP in range.\r
+ */\r
+\r
+static uint8_t change_channel_cmd_is_valid(mrfiPacket_t *frame)\r
+{\r
+    uint8_t rc = 0;\r
+    addr_t const *apAddr;\r
+\r
+    /* If this was a directed frame obey the command. */\r
+    if (!memcmp(MRFI_P_DST_ADDR(frame), nwk_getMyAddress(), NET_ADDR_SIZE))\r
+    {\r
+        rc = 1;\r
+    }\r
+    else\r
+    {\r
+        /* Do we know about an AP? If not assume frame bogus. */\r
+        apAddr = nwk_getAPAddress();\r
+        if (apAddr)\r
+        {\r
+            /* Yes, we know about an AP. Is that who sent it? */\r
+            if (!memcmp(apAddr, MRFI_P_SRC_ADDR(frame), NET_ADDR_SIZE))\r
+            {\r
+                /* OK. We obey. */\r
+                rc = 1;\r
+            }\r
+        }\r
+    }\r
+\r
+    return rc;\r
+}\r
+\r
+#    endif /* !ACCESS_POINT */\r
+\r
+#    ifdef RANGE_EXTENDER\r
+\r
+/******************************************************************************\r
+ * @fn          replayFirst\r
+ *\r
+ * @brief       Range Extenders must replay the change-channel boradcast\r
+ *              frame before actually changing its own channel.\r
+ *\r
+ * input parameters\r
+ * @param   frame     - pointer to frame with command context\r
+ *\r
+ * @return   void\r
+ */\r
+\r
+/* This routine takes care of some awkwardness. From the dispatch thread all\r
+ * we have is a pointer to the mrfiPacket_t element in the frame buffer into\r
+ * which the frame was retrieved. But to call the replay routine we need the\r
+ * entire frame information structure frameInfo_t. This routine regenerates\r
+ * the frame information structure pointer and then calls the replay routine.\r
+ *\r
+ * This approach requires that the disptach thread guarantee that it will\r
+ * always pass a pointer to the mrfiPacket_t structure in the frame\r
+ * information structure and not a copy of the mrfipacket_t element. It is\r
+ * either the approach here or change all the NWK application dispatch routine\r
+ * argument types. This latter has the downside of interfering with any\r
+ * user-implemented NWK applications. It also needlessly complicates the argument\r
+ * handling: except for this instance all any routine needs is the mrfiPacket_t\r
+ * pointer.\r
+ */\r
+\r
+static void replayFirst(mrfiPacket_t *frame)\r
+{\r
+    frameInfo_t *fiptr;\r
+    uint16_t offset = (uint16_t)&(((frameInfo_t *)0)->mrfiPkt);\r
+\r
+    fiptr = (frameInfo_t *)(((uint8_t *)frame) - ((uint8_t *)offset));\r
+\r
+    nwk_replayFrame(fiptr);\r
+\r
+    return;\r
+}\r
+\r
+#    endif /* RANGE_EXTENDER */\r
+\r
+#    ifndef ACCESS_POINT\r
+\r
+/********************************************************************************\r
+ * @fn          change_channel_cmd\r
+ *\r
+ * @brief       Change to channel specified in received frame. Polling devices\r
+ *              might be awake when the broadcast occurs but we want the channel\r
+ *              change recovery to occur in a disciplined manner using the\r
+ *              polling code. Also, with certain Test sceanrios in which a\r
+ *              sleeping device is emulated we want to emulate 'missing' the\r
+ *              broadcast change-channel command.\r
+ *\r
+ * input parameters\r
+ * @param   frame     - pointer to frame containing target logical channel.\r
+ *\r
+ * @return   none.\r
+ */\r
+\r
+static void change_channel_cmd(mrfiPacket_t *frame)\r
+{\r
+#        if !defined(RX_POLLS)\r
+    freqEntry_t chan;\r
+\r
+    chan.logicalChan = *(MRFI_P_PAYLOAD(frame) + F_APP_PAYLOAD_OS + F_CHAN_OS);\r
+\r
+    nwk_setChannel(&chan);\r
+#        endif\r
+    return;\r
+}\r
+\r
+#    endif /* !ACCESS_POINT */\r
+\r
+/******************************************************************************\r
+ * @fn          send_ping_reply\r
+ *\r
+ * @brief       Send Frequency application ping reply.\r
+ *\r
+ * input parameters\r
+ * @param   frame     - pointer to frame from pinger.\r
+ *\r
+ * @return   FHS_RELEASE unless this isn't an Access Point. In this case for\r
+ *           flow to et this far it is a Range Extender, so replay the frame\r
+ *           by returning FHW_REPLAY\r
+ */\r
+\r
+static fhStatus_t send_ping_reply(mrfiPacket_t *frame)\r
+{\r
+#    ifdef ACCESS_POINT\r
+    uint8_t msg[FREQ_REQ_PING_FRAME_SIZE];\r
+    frameInfo_t *pOutFrame;\r
+\r
+    /* original request with reply bit on */\r
+    msg[FB_APP_INFO_OS] = *(MRFI_P_PAYLOAD(frame) + F_APP_PAYLOAD_OS) | NWK_APP_REPLY_BIT;\r
+    msg[FB_TID_OS]      = *(MRFI_P_PAYLOAD(frame) + F_APP_PAYLOAD_OS + FB_TID_OS);\r
+\r
+    if (pOutFrame = nwk_buildFrame(SMPL_PORT_FREQ, msg, sizeof(msg), MAX_HOPS_FROM_AP))\r
+    {\r
+        /* destination address is the source address of the received frame. */\r
+        memcpy(MRFI_P_DST_ADDR(&pOutFrame->mrfiPkt), MRFI_P_SRC_ADDR(frame), NET_ADDR_SIZE);\r
+        /* must use transaction ID of source frame */\r
+        PUT_INTO_FRAME(MRFI_P_PAYLOAD(&pOutFrame->mrfiPkt), F_TRACTID_OS,\r
+                       (GET_FROM_FRAME(MRFI_P_PAYLOAD(frame), F_TRACTID_OS)));\r
+#        ifdef SMPL_SECURE\r
+        nwk_setSecureFrame(&pOutFrame->mrfiPkt, sizeof(msg), 0);\r
+#        endif /* SMPL_SECURE */\r
+        nwk_sendFrame(pOutFrame, MRFI_TX_TYPE_FORCED);\r
+    }\r
+\r
+    return FHS_RELEASE;\r
+#    else\r
+    return FHS_REPLAY;\r
+#    endif     /* ACCESS_POINT */\r
+}\r
+\r
+/****************************************************************************************\r
+ * @fn          nwk_processFreq\r
+ *\r
+ * @brief       Process a Frequency application frame.\r
+ *\r
+ * input parameters\r
+ * @param   frame     - pointer to frame\r
+ *\r
+ * @return   Disposition for frame: either release (FHS_RELEASE) or replay (FHS_REPLAY).\r
+ */\r
+\r
+fhStatus_t nwk_processFreq(mrfiPacket_t *frame)\r
+{\r
+    fhStatus_t rc = FHS_RELEASE;\r
+    uint8_t replyType;\r
+\r
+    /* Make sure this is a reply and see if we sent this. Validate the\r
+     * packet for reception by client app.\r
+     */\r
+    if (SMPL_MY_REPLY == (replyType = nwk_isValidReply(frame, sTid, FB_APP_INFO_OS, FB_TID_OS)))\r
+    {\r
+        /* It's a match and it's a reply. Validate the received packet by\r
+         * returning a 1 so it can be received by the client app.\r
+         */\r
+        MRFI_PostKillSem();\r
+        rc = FHS_KEEP;\r
+    }\r
+#    if !defined(END_DEVICE)\r
+    else if (SMPL_A_REPLY == replyType)\r
+    {\r
+        /* no match. if i'm not an ED this is a reply that should be passed on. */\r
+        rc = FHS_REPLAY;\r
+    }\r
+#    endif /* !END_DEVICE */\r
+    else if (SMPL_NOT_REPLY == replyType)\r
+    {\r
+        rc = handle_freq_cmd(frame);\r
+    }\r
+\r
+    return rc;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_scanForChannels\r
+ *\r
+ * @brief       Scan for channels by sending a ping frame on each channel in the\r
+ *              channel table and listen for a reply.\r
+ *\r
+ * input parameters\r
+ * @param  channels    - pointer to area to receive list of channels from which\r
+ *                       ping replies were received.\r
+ *\r
+ * output parameters\r
+ * @param   channels   - populated list of channels.\r
+ *\r
+ * @return   statuis of operation..\r
+ */\r
+\r
+uint8_t nwk_scanForChannels(freqEntry_t *channels)\r
+{\r
+    uint8_t msg[FREQ_REQ_PING_FRAME_SIZE], i, num = 0, notBcast = 1;\r
+    addr_t      *apAddr, retAddr;\r
+    uint8_t radioState = MRFI_GetRadioState();\r
+    freqEntry_t chan;\r
+    freqEntry_t curChan;\r
+\r
+    union\r
+    {\r
+        ioctlRawSend_t send;\r
+        ioctlRawReceive_t recv;\r
+    } ioctl_info;\r
+\r
+    nwk_getChannel(&curChan);\r
+\r
+    /* send to AP. If we don't know AP address, broadcast. */\r
+    apAddr = (addr_t *)nwk_getAPAddress();\r
+    if (!apAddr)\r
+    {\r
+        apAddr = (addr_t *)nwk_getBCastAddress();\r
+        notBcast = 0;\r
+    }\r
+\r
+    for (i = 0; i < NWK_FREQ_TBL_SIZE; ++i)\r
+    {\r
+        chan.logicalChan = i;\r
+\r
+        nwk_setChannel(&chan);\r
+\r
+        ioctl_info.send.addr = apAddr;\r
+        ioctl_info.send.msg  = msg;\r
+        ioctl_info.send.len  = sizeof(msg);\r
+        ioctl_info.send.port = SMPL_PORT_FREQ;\r
+\r
+        msg[FB_APP_INFO_OS] = FREQ_REQ_PING;\r
+        msg[FB_TID_OS]      = sTid;\r
+\r
+        SMPL_Ioctl(IOCTL_OBJ_RAW_IO, IOCTL_ACT_WRITE, &ioctl_info.send);\r
+\r
+        ioctl_info.recv.port = SMPL_PORT_FREQ;\r
+        ioctl_info.recv.msg  = msg;\r
+        ioctl_info.recv.addr = &retAddr;\r
+\r
+        NWK_CHECK_FOR_SETRX(radioState);\r
+        NWK_REPLY_DELAY();\r
+        NWK_CHECK_FOR_RESTORE_STATE(radioState);\r
+\r
+        if (SMPL_SUCCESS == SMPL_Ioctl(IOCTL_OBJ_RAW_IO, IOCTL_ACT_READ, &ioctl_info.recv))\r
+        {\r
+            /* Once we know the Access Point we're related to we only accept\r
+             * ping replies from that one.\r
+             */\r
+            if (!notBcast || (notBcast && !memcmp(&retAddr, apAddr, NET_ADDR_SIZE)))\r
+            {\r
+                channels[num++].logicalChan = i;\r
+            }\r
+        }\r
+\r
+        sTid++;\r
+        if (num && notBcast)\r
+        {\r
+            /* we're done...only one possible channel if we know the AP address. */\r
+            break;\r
+        }\r
+        /* TODO: process encryption stuff */\r
+    }\r
+\r
+    /* reset original channel */\r
+    nwk_setChannel(&curChan);\r
+\r
+    return num;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_freqControl\r
+ *\r
+ * @brief       Handle application requests received through IOCTL interface.\r
+ *\r
+ * input parameters\r
+ * @param   action  - requested action\r
+ * @param   val     - pointer to parameters required/returned for action\r
+ *\r
+ * output parameters\r
+ * @param   val   - populated values if action was a retrieval action.\r
+ *\r
+ * @return   status of operation.\r
+ */\r
+\r
+smplStatus_t nwk_freqControl(ioctlAction_t action, void *val)\r
+{\r
+    smplStatus_t rc;\r
+\r
+    switch (action)\r
+    {\r
+        case IOCTL_ACT_SET:\r
+#    ifdef ACCESS_POINT\r
+            broadcast_channel_change(((freqEntry_t *)val)->logicalChan);\r
+#    endif /* ACCESS_POINT */\r
+            rc = nwk_setChannel((freqEntry_t *)val);\r
+            break;\r
+\r
+        case IOCTL_ACT_GET:\r
+            nwk_getChannel((freqEntry_t *)val);\r
+            rc = SMPL_SUCCESS;\r
+            break;\r
+\r
+        case IOCTL_ACT_SCAN:\r
+        {\r
+            ioctlScanChan_t *sc = (ioctlScanChan_t *)val;\r
+\r
+            sc->numChan = nwk_scanForChannels(sc->freq);\r
+            rc = SMPL_SUCCESS;\r
+        }\r
+        break;\r
+\r
+        default:\r
+            rc = SMPL_BAD_PARAM;\r
+            break;\r
+    }\r
+\r
+    return rc;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          broadcast_channel_change\r
+ *\r
+ * @brief       For Access Point only: broadcast a channel change frame.\r
+ *\r
+ * input parameters\r
+ * @param   idx  -  index into channel table of new (logical) channel\r
+ *\r
+ * @return   none.\r
+ */\r
+#    ifdef ACCESS_POINT\r
+#        define CC_REDUNDANCY      1 /* Change-channel redundancy count */\r
+static void broadcast_channel_change(uint8_t idx)\r
+{\r
+    ioctlRawSend_t send;\r
+    uint8_t msg[FREQ_REQ_MOVE_FRAME_SIZE];\r
+    uint8_t repeat = CC_REDUNDANCY;\r
+\r
+    if (idx >= NWK_FREQ_TBL_SIZE)\r
+    {\r
+        return;\r
+    }\r
+\r
+    msg[FB_APP_INFO_OS] = FREQ_REQ_MOVE;\r
+    msg[F_CHAN_OS]      = idx;\r
+\r
+    send.addr = (addr_t *)nwk_getBCastAddress();\r
+    send.msg  = msg;\r
+    send.len  = sizeof(msg);\r
+    send.port = SMPL_PORT_FREQ;\r
+\r
+    SMPL_Ioctl(IOCTL_OBJ_RAW_IO, IOCTL_ACT_WRITE, &send);\r
+\r
+    /* Redundancy addresses the fact that an RE (or any always-listening\r
+     * device) might miss the command\r
+     */\r
+    while (repeat--)\r
+    {\r
+        NWK_DELAY(250);\r
+        SMPL_Ioctl(IOCTL_OBJ_RAW_IO, IOCTL_ACT_WRITE, &send);\r
+    }\r
+}\r
+\r
+#    endif /* ACCESS_POINT */\r
+\r
+#else  /* FREQUENCY_AGILITY */\r
+\r
+/**********************************************************************************\r
+ * @fn          nwk_freqInit\r
+ *\r
+ * @brief       Initialize NWK Frequency application. Stub when Frequency Agility\r
+ *              not supported.\r
+ *\r
+ * @return   none.\r
+ */\r
+\r
+void nwk_freqInit(void)\r
+{\r
+    return;\r
+}\r
+\r
+/****************************************************************************************\r
+ * @fn          nwk_processFreq\r
+ *\r
+ * @brief       Process a Frequency application frame. Stub when Frequency Agility\r
+ *              not supported.\r
+ *\r
+ * input parameters\r
+ * @param   frame     - pointer to frame\r
+ *\r
+ * @return   Disposition for frame: either release (FHS_RELEASE) or replay (FHS_REPLAY).\r
+ */\r
+\r
+fhStatus_t nwk_processFreq(mrfiPacket_t *frame)\r
+{\r
+    return FHS_RELEASE;\r
+}\r
+\r
+#endif  /* FREQUENCY_AGILITY */\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/Components/nwk_applications/nwk_freq.h b/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/Components/nwk_applications/nwk_freq.h
new file mode 100755 (executable)
index 0000000..05c9b41
--- /dev/null
@@ -0,0 +1,74 @@
+/**************************************************************************************************\r
+*  Filename:       nwk_freq.h\r
+*  Revised:        $Date: 2008-05-06 16:48:33 -0700 (Tue, 06 May 2008) $\r
+*  Revision:       $Revision: 17025 $\r
+*  Author:         $Author: lfriedman $\r
+*\r
+*  Description:    This header file supports the SimpliciTI Freq network application.\r
+*\r
+*  Copyright 2004-2007 Texas Instruments Incorporated. All rights reserved.\r
+*\r
+*  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+*  the terms of a software license agreement between the user who downloaded the software,\r
+*  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+*  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+*  License. The License limits your use, and you acknowledge, that the Software may not be\r
+*  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+*  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+*  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+*  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+*  perform, display or sell this Software and/or its documentation for any purpose.\r
+*\r
+*  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+*  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+*  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+*  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+*  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+*  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+*  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+*  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+*  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+*\r
+*  Should you have any questions regarding your right to use this Software,\r
+*  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+#ifndef NWK_FREQ_H\r
+#define NWK_FREQ_H\r
+\r
+/* application payload offsets\r
+ *    both */\r
+#define FB_APP_INFO_OS     0\r
+#define FB_TID_OS          1\r
+\r
+/* Logical channel number for MOVE request. Frame brodcast so no TID\r
+ * is used. Channel number can occupy the TID location. Same offset\r
+ * used for channel change request. No reply to that frame.\r
+ */\r
+#define F_CHAN_OS          1\r
+\r
+/* MGMT frame application requests */\r
+#define  FREQ_REQ_MOVE        0x01\r
+#define  FREQ_REQ_PING        0x02\r
+#define  FREQ_REQ_REQ_MOVE    0x03\r
+\r
+/* change the following as protocol developed */\r
+#define MAX_FREQ_APP_FRAME    2\r
+\r
+/* set the out frame sizes */\r
+#define  FREQ_REQ_MOVE_FRAME_SIZE   2\r
+#define  FREQ_REQ_PING_FRAME_SIZE   2\r
+\r
+/* prototypes */\r
+void nwk_freqInit(void);\r
+fhStatus_t nwk_processFreq(mrfiPacket_t *);\r
+\r
+#if defined(FREQUENCY_AGILITY)\r
+smplStatus_t nwk_setChannel(freqEntry_t *);\r
+void nwk_getChannel(freqEntry_t *);\r
+uint8_t nwk_scanForChannels(freqEntry_t *);\r
+\r
+smplStatus_t nwk_freqControl(ioctlAction_t, void *);\r
+#endif\r
+\r
+#endif\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/Components/nwk_applications/nwk_ioctl.c b/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/Components/nwk_applications/nwk_ioctl.c
new file mode 100755 (executable)
index 0000000..9d88be2
--- /dev/null
@@ -0,0 +1,356 @@
+\r
+/**************************************************************************************************\r
+*  Filename:       nwk_ioctl.c\r
+*  Revised:        $Date: 2009-01-13 11:31:14 -0800 (Tue, 13 Jan 2009) $\r
+*  Revision:       $Revision: 18744 $\r
+*  Author:         $Author: lfriedman $\r
+*\r
+*  Description:    This file supports the SimpliciTI IOCTL implmentation. This interface\r
+*                 gives applications access to the "driver" network level functions\r
+*                 when necessary.\r
+*\r
+*  Copyright 2004-2007 Texas Instruments Incorporated. All rights reserved.\r
+*\r
+*  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+*  the terms of a software license agreement between the user who downloaded the software,\r
+*  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+*  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+*  License. The License limits your use, and you acknowledge, that the Software may not be\r
+*  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+*  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+*  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+*  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+*  perform, display or sell this Software and/or its documentation for any purpose.\r
+*\r
+*  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+*  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+*  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+*  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+*  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+*  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+*  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+*  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+*  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+*\r
+*  Should you have any questions regarding your right to use this Software,\r
+*  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+\r
+/******************************************************************************\r
+ * INCLUDES\r
+ */\r
+#include <string.h>\r
+#include "bsp.h"\r
+#include "mrfi.h"\r
+#include "nwk_types.h"\r
+#include "nwk_frame.h"\r
+#include "nwk.h"\r
+#include "nwk_ioctl.h"\r
+#include "nwk_globals.h"\r
+#include "nwk_security.h"\r
+#ifdef ACCESS_POINT\r
+#    include "nwk_join.h"\r
+#endif\r
+\r
+/******************************************************************************\r
+ * MACROS\r
+ */\r
+\r
+/******************************************************************************\r
+ * CONSTANTS AND DEFINES\r
+ */\r
+\r
+/******************************************************************************\r
+ * TYPEDEFS\r
+ */\r
+\r
+/******************************************************************************\r
+ * LOCAL VARIABLES\r
+ */\r
+\r
+/******************************************************************************\r
+ * LOCAL FUNCTIONS\r
+ */\r
+\r
+/******************************************************************************\r
+ * GLOBAL VARIABLES\r
+ */\r
+\r
+/******************************************************************************\r
+ * GLOBAL FUNCTIONS\r
+ */\r
+\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_rawSend\r
+ *\r
+ * @brief       Builds an outut frame based on information provided by the\r
+ *              caller. This function allows a raw transmission to the target\r
+ *              if the network address is known. this function is used a lot\r
+ *              to support NWK applications.\r
+ *\r
+ * input parameters\r
+ * @param   info    - pointer to strcuture containing info on how to build\r
+ *                    the outgoing frame.\r
+ * output parameters\r
+ *\r
+ * @return         SMPL_SUCCESS\r
+ *                 SMPL_NOMEM       - no room in output frame queue\r
+ *                 SMPL_TX_CCA_FAIL - CCA failure\r
+ */\r
+\r
+smplStatus_t nwk_rawSend(ioctlRawSend_t *info)\r
+{\r
+    frameInfo_t *pOutFrame;\r
+    uint8_t hops;\r
+\r
+    /* If we know frame is going to or from the AP then we can reduce the hop\r
+     * count.\r
+     */\r
+    switch (info->port)\r
+    {\r
+        case SMPL_PORT_JOIN:\r
+        case SMPL_PORT_FREQ:\r
+        case SMPL_PORT_MGMT:\r
+            hops = MAX_HOPS_FROM_AP;\r
+            break;\r
+\r
+        default:\r
+            hops = MAX_HOPS;\r
+            break;\r
+    }\r
+\r
+    if (pOutFrame = nwk_buildFrame(info->port, info->msg, info->len, hops))\r
+    {\r
+        memcpy(MRFI_P_DST_ADDR(&pOutFrame->mrfiPkt), info->addr, NET_ADDR_SIZE);\r
+#ifdef SMPL_SECURE\r
+        nwk_setSecureFrame(&pOutFrame->mrfiPkt, info->len, 0);\r
+#endif  /* SMPL_SECURE */\r
+        return nwk_sendFrame(pOutFrame, MRFI_TX_TYPE_CCA);\r
+    }\r
+    return SMPL_NOMEM;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_rawReceive\r
+ *\r
+ * @brief       Retriievs specified from from the input frame queue. Additional\r
+ *              information such as source address and hop count may also be\r
+ *              retrieved\r
+ *\r
+ * input parameters\r
+ * @param   info    - pointer to structure containing info on what to retrieve\r
+ *\r
+ * output parameters - actually populated by nwk_retrieveFrame()\r
+ *      info->msg      - application payload copied here\r
+ *      info->len      - length of received application payload\r
+ *      info->addr     - if non-NULL points to memory to be populated with\r
+ *                       source address of retrieved frame.\r
+ *      info->hopCount - if non-NULL points to memory to be populated with\r
+ *                       hop count of retrieved frame.\r
+ *\r
+ * @return   Status of operation.\r
+ */\r
+\r
+smplStatus_t nwk_rawReceive(ioctlRawReceive_t *info)\r
+{\r
+    rcvContext_t rcv;\r
+\r
+    rcv.type   = RCV_NWK_PORT;\r
+    rcv.t.port = info->port;\r
+\r
+    return nwk_retrieveFrame(&rcv, info->msg, &info->len, info->addr, &info->hopCount);\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_radioControl\r
+ *\r
+ * @brief       Handle radio control functions.\r
+ *\r
+ * input parameters\r
+ * @param   action   - radio operation to perform. currently suppoerted:\r
+ *                         sleep/unsleep\r
+ * output parameters\r
+ *\r
+ * @return   Status of operation.\r
+ */\r
+\r
+smplStatus_t nwk_radioControl(ioctlAction_t action, void *val)\r
+{\r
+    smplStatus_t rc = SMPL_SUCCESS;\r
+\r
+    if (IOCTL_ACT_RADIO_SLEEP == action)\r
+    {\r
+        /* go to sleep mode. */\r
+        MRFI_RxIdle();\r
+        MRFI_Sleep();\r
+    }\r
+    else if (IOCTL_ACT_RADIO_AWAKE == action)\r
+    {\r
+        MRFI_WakeUp();\r
+\r
+#if !defined(END_DEVICE)\r
+        MRFI_RxOn();\r
+#endif\r
+\r
+    }\r
+    else if (IOCTL_ACT_RADIO_SIGINFO == action)\r
+    {\r
+        ioctlRadioSiginfo_t *pSigInfo = (ioctlRadioSiginfo_t *)val;\r
+        connInfo_t          *pCInfo   = nwk_getConnInfo(pSigInfo->lid);\r
+\r
+        if (!pCInfo)\r
+        {\r
+            return SMPL_BAD_PARAM;\r
+        }\r
+        memcpy(&pSigInfo->sigInfo, &pCInfo->sigInfo, sizeof(pCInfo->sigInfo));\r
+    }\r
+    else if (IOCTL_ACT_RADIO_RSSI == action)\r
+    {\r
+        *((rssi_t *)val) = MRFI_Rssi();\r
+    }\r
+    else if (IOCTL_ACT_RADIO_RXON == action)\r
+    {\r
+        MRFI_RxOn();\r
+    }\r
+    else if (IOCTL_ACT_RADIO_RXIDLE == action)\r
+    {\r
+        MRFI_RxIdle();\r
+    }\r
+#ifdef EXTENDED_API\r
+    else if (IOCTL_ACT_RADIO_SETPWR == action)\r
+    {\r
+        uint8_t idx;\r
+\r
+        switch (*(ioctlLevel_t *)val)\r
+        {\r
+            case IOCTL_LEVEL_2:\r
+                idx = 2;\r
+                break;\r
+\r
+            case IOCTL_LEVEL_1:\r
+                idx = 1;\r
+                break;\r
+\r
+            case IOCTL_LEVEL_0:\r
+                idx = 0;\r
+                break;\r
+\r
+            default:\r
+                return SMPL_BAD_PARAM;\r
+        }\r
+        MRFI_SetRFPwr(idx);\r
+        return SMPL_SUCCESS;\r
+    }\r
+#endif  /* EXTENDED_API */\r
+    else\r
+    {\r
+        rc = SMPL_BAD_PARAM;\r
+    }\r
+    return rc;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_joinContext\r
+ *\r
+ * @brief       For Access Points we need a way to support changing the Join\r
+ *              context. This will allow arbitration bewteen potentially nearby\r
+ *              Access Points when a new device is joining.\r
+ *\r
+ * input parameters\r
+ * @param   action  - Join context is either on or off.\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   Status of operation. Currently always succeeds.\r
+ */\r
+#ifdef ACCESS_POINT\r
+smplStatus_t nwk_joinContext(ioctlAction_t action)\r
+{\r
+    nwk_setJoinContext((IOCTL_ACT_ON == action) ? JOIN_CONTEXT_ON : JOIN_CONTEXT_OFF);\r
+\r
+    return SMPL_SUCCESS;\r
+}\r
+\r
+#endif\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_deviceAddress\r
+ *\r
+ * @brief       Set or Get this device address. The Set must be done before\r
+ *              SMPL_Init() for it to take effect. The Get is always legal but\r
+ *              the value could be invalid if it is called before a valid set\r
+ *              call is made.\r
+ *\r
+ * input parameters\r
+ * @param   action  - Gte or Set\r
+ * @param   addr    - pointer to address object containing value on Set\r
+ *\r
+ * output parameters\r
+ * @param   addr    - pointer to address object to receive value on Get.\r
+ *\r
+ * @return   SMPL_SUCCESS\r
+ *           SMPL_BAD_PARAM  Action request illegal or a Set request\r
+ *                           was not respected.\r
+ */\r
+\r
+smplStatus_t nwk_deviceAddress(ioctlAction_t action, addr_t *addr)\r
+{\r
+    smplStatus_t rc = SMPL_BAD_PARAM;\r
+\r
+    if (IOCTL_ACT_GET == action)\r
+    {\r
+        memcpy(addr, nwk_getMyAddress(), sizeof(addr_t));\r
+        rc = SMPL_SUCCESS;\r
+    }\r
+    else if (IOCTL_ACT_SET == action)\r
+    {\r
+        if (nwk_setMyAddress(addr))\r
+        {\r
+            rc = SMPL_SUCCESS;\r
+        }\r
+    }\r
+\r
+    return rc;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_connectionControl\r
+ *\r
+ * @brief       Access to connection table. Currently supports only deleting\r
+ *              a connection from the table.\r
+ *\r
+ * input parameters\r
+ * @param   action  - Connection control action (only delete is curently valid).\r
+ * @param   val     - pointer to Link ID of connection on which to operate.\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   SMPL_SUCCESS\r
+ *           SMPL_BAD_PARAM  Action is not delete\r
+ *                           Link ID is the UUD Link ID\r
+ *                           No connection table info for Link ID\r
+ */\r
+\r
+smplStatus_t nwk_connectionControl(ioctlAction_t action, void *val)\r
+{\r
+    connInfo_t *pCInfo;\r
+    linkID_t lid = *((linkID_t *)val);\r
+\r
+    if (IOCTL_ACT_DELETE != action)\r
+    {\r
+        return SMPL_BAD_PARAM;\r
+    }\r
+\r
+    if ((SMPL_LINKID_USER_UUD == lid) ||\r
+        (!(pCInfo = nwk_getConnInfo(lid))))\r
+    {\r
+        return SMPL_BAD_PARAM;\r
+    }\r
+\r
+    nwk_freeConnection(pCInfo);\r
+\r
+    return SMPL_SUCCESS;\r
+}\r
+\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/Components/nwk_applications/nwk_ioctl.h b/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/Components/nwk_applications/nwk_ioctl.h
new file mode 100755 (executable)
index 0000000..3b583a9
--- /dev/null
@@ -0,0 +1,54 @@
+/**************************************************************************************************\r
+*  Filename:       nwk_ioctl.h\r
+*  Revised:        $Date: 2008-04-29 15:47:05 -0700 (Tue, 29 Apr 2008) $\r
+*  Revision:       $Revision: 16972 $\r
+*  Author:         $Author: lfriedman $\r
+*\r
+*  Description:    This header file supports the SimpliciTI IOCTL implmentation. This interface\r
+*                 gives applications access to the "driver" network level functions\r
+*                 when necessary.\r
+*\r
+*  Copyright 2004-2007 Texas Instruments Incorporated. All rights reserved.\r
+*\r
+*  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+*  the terms of a software license agreement between the user who downloaded the software,\r
+*  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+*  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+*  License. The License limits your use, and you acknowledge, that the Software may not be\r
+*  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+*  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+*  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+*  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+*  perform, display or sell this Software and/or its documentation for any purpose.\r
+*\r
+*  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+*  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+*  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+*  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+*  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+*  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+*  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+*  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+*  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+*\r
+*  Should you have any questions regarding your right to use this Software,\r
+*  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+\r
+\r
+#ifndef NWK_IOCTL_H\r
+#define NWK_IOCTL_H\r
+\r
+/* prototypes */\r
+smplStatus_t nwk_rawSend(ioctlRawSend_t *);\r
+smplStatus_t nwk_rawReceive(ioctlRawReceive_t *);\r
+\r
+smplStatus_t nwk_radioControl(ioctlAction_t, void *);\r
+smplStatus_t nwk_deviceAddress(ioctlAction_t, addr_t *);\r
+smplStatus_t nwk_connectionControl(ioctlAction_t, void *);\r
+#ifdef ACCESS_POINT\r
+smplStatus_t nwk_joinContext(ioctlAction_t);\r
+#endif\r
+\r
+#endif\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/Components/nwk_applications/nwk_join.c b/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/Components/nwk_applications/nwk_join.c
new file mode 100755 (executable)
index 0000000..039bddd
--- /dev/null
@@ -0,0 +1,599 @@
+/**************************************************************************************************\r
+*  Filename:       nwk_join.c\r
+*  Revised:        $Date: 2009-01-06 15:45:54 -0800 (Tue, 06 Jan 2009) $\r
+*  Revision:       $Revision: 18697 $\r
+*\r
+*  Description:    This file supports the SimpliciTI Join network application.\r
+*\r
+*  Copyright 2007-2009 Texas Instruments Incorporated. All rights reserved.\r
+*\r
+*  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+*  the terms of a software license agreement between the user who downloaded the software,\r
+*  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+*  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+*  License. The License limits your use, and you acknowledge, that the Software may not be\r
+*  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+*  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+*  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+*  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+*  perform, display or sell this Software and/or its documentation for any purpose.\r
+*\r
+*  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+*  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+*  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+*  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+*  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+*  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+*  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+*  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+*  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+*\r
+*  Should you have any questions regarding your right to use this Software,\r
+*  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+\r
+/******************************************************************************\r
+ * INCLUDES\r
+ */\r
+#include <string.h>\r
+#include "bsp.h"\r
+#include "mrfi.h"\r
+#include "nwk_types.h"\r
+#include "nwk_api.h"\r
+#include "nwk_frame.h"\r
+#include "nwk.h"\r
+#include "nwk_link.h"\r
+#include "nwk_join.h"\r
+#include "nwk_globals.h"\r
+#include "nwk_freq.h"\r
+#include "nwk_security.h"\r
+#include "nwk_mgmt.h"\r
+\r
+/******************************************************************************\r
+ * MACROS\r
+ */\r
+\r
+/******************************************************************************\r
+ * CONSTANTS AND DEFINES\r
+ */\r
+\r
+/******************************************************************************\r
+ * TYPEDEFS\r
+ */\r
+\r
+/******************************************************************************\r
+ * LOCAL VARIABLES\r
+ */\r
+\r
+static uint32_t sJoinToken = 0;\r
+static uint8_t (*spCallback)(linkID_t) = NULL;\r
+static volatile uint8_t sTid = 0;\r
+\r
+#ifdef ACCESS_POINT\r
+static sfInfo_t *spSandFContext = NULL;\r
+static uint8_t sJoinOK = 0;\r
+#endif /* ACCESS_POINT */\r
+\r
+/******************************************************************************\r
+ * LOCAL FUNCTIONS\r
+ */\r
+#ifdef ACCESS_POINT\r
+static void smpl_send_join_reply(mrfiPacket_t *frame);\r
+static uint32_t generateLinkToken(void);\r
+static void handleJoinRequest(mrfiPacket_t *);\r
+\r
+#endif /*  ACCESS_POINT */\r
+\r
+/******************************************************************************\r
+ * GLOBAL VARIABLES\r
+ */\r
+\r
+/******************************************************************************\r
+ * GLOBAL FUNCTIONS\r
+ */\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_joinInit\r
+ *\r
+ * @brief       Initialize Join application.\r
+ *\r
+ * input parameters\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   void\r
+ */\r
+\r
+void nwk_joinInit(uint8_t (*pf)(linkID_t))\r
+{\r
+    if (!sJoinToken)\r
+    {\r
+        sJoinToken = DEFAULT_JOIN_TOKEN;\r
+    }\r
+\r
+    spCallback = pf;\r
+    (void) spCallback; /* keep compiler happy if we don't use this */\r
+\r
+    sTid = MRFI_RandomByte();\r
+\r
+#ifdef ACCESS_POINT\r
+    /* set link token to something other than deafult if desired */\r
+    nwk_setLinkToken(generateLinkToken());\r
+#    if defined(STARTUP_JOINCONTEXT_ON)\r
+    sJoinOK = 1;\r
+#    elif defined(STARTUP_JOINCONTEXT_OFF)\r
+    sJoinOK = 0;\r
+#    else\r
+#        error ERROR: Must define either STARTUP_JOINCONTEXT_ON or STARTUP_JOINCONTEXT_OFF\r
+#    endif\r
+    spSandFContext = nwk_getSFInfoPtr();\r
+#endif\r
+\r
+    return;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_setJoinToken\r
+ *\r
+ * @brief       Sets the join token.\r
+ *\r
+ * input parameters\r
+ * @param   token   - join token to be used on this network.\r
+ *\r
+ * output parameters\r
+ *         no room in output queue.\r
+ *\r
+ * @return   void\r
+ */\r
+\r
+void nwk_setJoinToken(uint32_t token)\r
+{\r
+    /* only set if the supplied token is non-zero. */\r
+    if (token)\r
+    {\r
+        sJoinToken = token;\r
+    }\r
+\r
+    return;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_getJoinToken\r
+ *\r
+ * @brief       Gets the current join token.\r
+ *\r
+ * input parameters\r
+ *\r
+ * output parameters\r
+ * @param   pToken   - pointer to the returned value.\r
+ *\r
+ * @return   Current link token\r
+ */\r
+\r
+void nwk_getJoinToken(uint32_t *pToken)\r
+{\r
+    /* only set if the supplied token is non-zero. */\r
+    if (pToken)\r
+    {\r
+        *pToken = sJoinToken;\r
+    }\r
+\r
+    return;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          generateLinkToken\r
+ *\r
+ * @brief       Generate the link token to be used for the network controlled\r
+ *              by this Access Point.\r
+ *\r
+ * input parameters\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   void\r
+ */\r
+#ifdef ACCESS_POINT\r
+static uint32_t generateLinkToken(void)\r
+{\r
+    return 0xDEADBEEF;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          smpl_send_join_reply\r
+ *\r
+ * @brief       Send the Join reply. Include the Link token. If the device is\r
+ *              a polling sleeper put it into the list of store-and-forward\r
+ *              clients.\r
+ *\r
+ * input parameters\r
+ * @param   frame     - join frame for which a reply is needed...maybe\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   void\r
+ */\r
+\r
+static void smpl_send_join_reply(mrfiPacket_t *frame)\r
+{\r
+    frameInfo_t *pOutFrame;\r
+    uint8_t msg[JOIN_REPLY_FRAME_SIZE];\r
+\r
+    /* Is this a legacy frame? If so continue. Otherwise check verion.*/\r
+    if ((MRFI_GET_PAYLOAD_LEN(frame) - F_APP_PAYLOAD_OS) > JOIN_LEGACY_MSG_LENGTH)\r
+    {\r
+        /* see if protocol version is correct... */\r
+        if (*(MRFI_P_PAYLOAD(frame) + F_APP_PAYLOAD_OS + J_PROTOCOL_VERSION_OS) !=\r
+            nwk_getProtocolVersion())\r
+        {\r
+            /* Accommodation of protocol version differences can be noted or accomplished here.\r
+             * Otherwise, no match and the board goes back\r
+             */\r
+            return;\r
+        }\r
+    }\r
+\r
+\r
+    /* see if join token is correct */\r
+    {\r
+        uint32_t jt;\r
+\r
+        nwk_getNumObjectFromMsg(MRFI_P_PAYLOAD(\r
+                                    frame) + F_APP_PAYLOAD_OS + J_JOIN_TOKEN_OS, &jt, sizeof(jt));\r
+        if (jt != sJoinToken)\r
+        {\r
+            return;\r
+        }\r
+    }\r
+\r
+    /* send reply with tid, the link token, and the encryption context */\r
+    {\r
+        uint32_t linkToken;\r
+\r
+        nwk_getLinkToken(&linkToken);\r
+        nwk_putNumObjectIntoMsg((void *)&linkToken, msg + JR_LINK_TOKEN_OS, sizeof(linkToken));\r
+    }\r
+    msg[JR_CRYPTKEY_SIZE_OS] = SEC_CRYPT_KEY_SIZE;\r
+    msg[JB_REQ_OS]           = JOIN_REQ_JOIN | NWK_APP_REPLY_BIT;\r
+    /* sender's tid... */\r
+    msg[JB_TID_OS]           = *(MRFI_P_PAYLOAD(frame) + F_APP_PAYLOAD_OS + JB_TID_OS);\r
+\r
+    if (pOutFrame = nwk_buildFrame(SMPL_PORT_JOIN, msg, sizeof(msg), MAX_HOPS_FROM_AP))\r
+    {\r
+        /* destination address is the source adddress of the received frame. */\r
+        memcpy(MRFI_P_DST_ADDR(&pOutFrame->mrfiPkt), MRFI_P_SRC_ADDR(frame), NET_ADDR_SIZE);\r
+\r
+#    ifdef AP_IS_DATA_HUB\r
+        /* if source device supports ED objects save source address to detect duplicate joins */\r
+        if (*(MRFI_P_PAYLOAD(frame) + F_APP_PAYLOAD_OS + J_NUMCONN_OS))\r
+        {\r
+            if (nwk_saveJoinedDevice(frame) && spCallback)\r
+            {\r
+                spCallback(0);\r
+            }\r
+        }\r
+#    endif\r
+    }\r
+    else\r
+    {\r
+        /* oops -- no room left for Tx frame. Don't send reply. */\r
+        return;\r
+    }\r
+\r
+    /* If this device polls we need to provide store-and-forward support */\r
+    if (GET_FROM_FRAME(MRFI_P_PAYLOAD(frame), F_RX_TYPE) == F_RX_TYPE_POLLS)\r
+    {\r
+        uint8_t loc;\r
+\r
+        /* Check duplicate status */\r
+        if (!nwk_isSandFClient(MRFI_P_SRC_ADDR(frame), &loc))\r
+        {\r
+            uint8_t        *pNumc   = &spSandFContext->curNumSFClients;\r
+            sfClientInfo_t *pClient = &spSandFContext->sfClients[*pNumc];\r
+\r
+            /* It's not a duplicate. Save it if there's room */\r
+            if (*pNumc < NUM_STORE_AND_FWD_CLIENTS)\r
+            {\r
+                memcpy(pClient->clientAddr.addr, MRFI_P_SRC_ADDR(frame), NET_ADDR_SIZE);\r
+                *pNumc = *pNumc + 1;\r
+            }\r
+            else\r
+            {\r
+                /* No room left. Just return and don't send reply. */\r
+                return;\r
+            }\r
+        }\r
+        else\r
+        {\r
+            /* We get here if it's a duplicate. We drop through and send reply.\r
+             * Reset the S&F marker in the Management application -- we should\r
+             * assume that the Client reset so the TID will be random. If this is\r
+             * simply a duplicate frame it causes no harm.\r
+             */\r
+            nwk_resetSFMarker(loc);\r
+        }\r
+    }\r
+\r
+#    ifdef SMPL_SECURE\r
+    nwk_setSecureFrame(&pOutFrame->mrfiPkt, sizeof(msg), 0);\r
+#    endif /* SMPL_SECURE */\r
+\r
+    /* It's not S&F or it is but we're OK to send reply. */\r
+    nwk_sendFrame(pOutFrame, MRFI_TX_TYPE_FORCED);\r
+\r
+    return;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_join\r
+ *\r
+ * @brief       Stub Join function for Access Points.\r
+ *\r
+ * input parameters\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   Always returns SMPL_SUCCESS.\r
+ */\r
+\r
+smplStatus_t nwk_join(void)\r
+{\r
+    return SMPL_SUCCESS;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_isSandFClient\r
+ *\r
+ * @brief       Helper function to see if the destination of a frame we have is\r
+ *              one of AP's store-and-forward clients.\r
+ *\r
+ * input parameters\r
+ * @param   fPtr     - pointer to address in frame in question\r
+ *\r
+ * output parameters\r
+ * @param   entLoc   - pointer to receive entry location in array of clients.\r
+ *\r
+ * @return   Returns client info structure pointer if the destination is a\r
+ *           store-and-forward client, else 0.\r
+ */\r
+\r
+sfClientInfo_t *nwk_isSandFClient(uint8_t *pAddr, uint8_t *entLoc)\r
+{\r
+    uint8_t i;\r
+    sfClientInfo_t *pSFClient = spSandFContext->sfClients;\r
+\r
+    for (i = 0; i < spSandFContext->curNumSFClients; ++i, ++pSFClient)\r
+    {\r
+        if (!memcmp(&pSFClient->clientAddr.addr, pAddr, NET_ADDR_SIZE))\r
+        {\r
+            *entLoc = i;\r
+            return pSFClient;\r
+        }\r
+    }\r
+\r
+    return 0;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_setJoinContext\r
+ *\r
+ * @brief       Helper function to set Join context for Access Point. This will\r
+ *              allow arbitration bewteen potentially nearby Access Points when\r
+ *              a new device is joining.\r
+ *\r
+ * input parameters\r
+ * @param   which   - Join context is either off or on\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   void\r
+ */\r
+\r
+void nwk_setJoinContext(uint8_t which)\r
+{\r
+    sJoinOK = (JOIN_CONTEXT_ON == which) ? 1 : 0;\r
+\r
+    return;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          handleJoinRequest\r
+ *\r
+ * @brief       Dispatches handler for specfic join request\r
+ *\r
+ * input parameters\r
+ *\r
+ * @param   frame - Join frame received\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   void\r
+ */\r
+\r
+static void handleJoinRequest(mrfiPacket_t *frame)\r
+{\r
+    if (JOIN_LEGACY_MSG_LENGTH == (MRFI_GET_PAYLOAD_LEN(frame) - F_APP_PAYLOAD_OS))\r
+    {\r
+        /* Legacy frame. Spoof a join request */\r
+        *(MRFI_P_PAYLOAD(frame) + F_APP_PAYLOAD_OS) = JOIN_REQ_JOIN;\r
+    }\r
+\r
+    switch (*(MRFI_P_PAYLOAD(frame) + F_APP_PAYLOAD_OS))\r
+    {\r
+        case JOIN_REQ_JOIN:\r
+            smpl_send_join_reply(frame);\r
+            break;\r
+\r
+        default:\r
+            break;\r
+    }\r
+\r
+    return;\r
+}\r
+\r
+#else  /* ACCESS_POINT */\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_join\r
+ *\r
+ * @brief       Join functioanlity for non-AP devices. Send the Join token\r
+ *              and wait for the reply.\r
+ *\r
+ * input parameters\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   Status of operation.\r
+ */\r
+\r
+smplStatus_t nwk_join(void)\r
+{\r
+    uint8_t msg[JOIN_FRAME_SIZE];\r
+    uint32_t linkToken;\r
+    addr_t apAddr;\r
+    uint8_t radioState = MRFI_GetRadioState();\r
+    smplStatus_t rc = SMPL_NO_JOIN;\r
+\r
+    union\r
+    {\r
+        ioctlRawSend_t send;\r
+        ioctlRawReceive_t recv;\r
+    } ioctl_info;\r
+\r
+#    if defined(FREQUENCY_AGILITY)\r
+    uint8_t i, numChan;\r
+    freqEntry_t channels[NWK_FREQ_TBL_SIZE];\r
+\r
+    if (!(numChan = nwk_scanForChannels(channels)))\r
+    {\r
+        return SMPL_NO_CHANNEL;\r
+    }\r
+\r
+    for (i = 0; i < numChan; ++i)\r
+    {\r
+        nwk_setChannel(&channels[i]);\r
+#    else\r
+    {\r
+#    endif\r
+\r
+        ioctl_info.send.addr = (addr_t *)nwk_getBCastAddress();\r
+        ioctl_info.send.msg  = msg;\r
+        ioctl_info.send.len  = sizeof(msg);\r
+        ioctl_info.send.port = SMPL_PORT_JOIN;\r
+\r
+        /* Put join token in */\r
+        nwk_putNumObjectIntoMsg((void *)&sJoinToken, msg + J_JOIN_TOKEN_OS, sizeof(sJoinToken));\r
+        /* set app info byte */\r
+        msg[JB_REQ_OS] = JOIN_REQ_JOIN;\r
+        msg[JB_TID_OS] = sTid;\r
+\r
+        /* Set number of connections supported. Used only by AP if it is\r
+         * a data hub.\r
+         */\r
+        msg[J_NUMCONN_OS] = NUM_CONNECTIONS;\r
+        /* protocol version number */\r
+        msg[J_PROTOCOL_VERSION_OS] = nwk_getProtocolVersion();\r
+\r
+        SMPL_Ioctl(IOCTL_OBJ_RAW_IO, IOCTL_ACT_WRITE, &ioctl_info.send);\r
+\r
+        ioctl_info.recv.port = SMPL_PORT_JOIN;\r
+        ioctl_info.recv.msg  = msg;\r
+        ioctl_info.recv.addr = &apAddr; /* save AP address from reply */\r
+\r
+        NWK_CHECK_FOR_SETRX(radioState);\r
+        NWK_REPLY_DELAY();\r
+        NWK_CHECK_FOR_RESTORE_STATE(radioState);\r
+\r
+        if (SMPL_SUCCESS == SMPL_Ioctl(IOCTL_OBJ_RAW_IO, IOCTL_ACT_READ, &ioctl_info.recv))\r
+        {\r
+            uint8_t firstByte = msg[JB_REQ_OS] & (~NWK_APP_REPLY_BIT);\r
+\r
+            /* Sanity check for correct reply frame. Older version\r
+             * has the length instead of the request as the first byte.\r
+             */\r
+            if ((firstByte == JOIN_REQ_JOIN) ||\r
+                (firstByte == JOIN_REPLY_LEGACY_MSG_LENGTH)\r
+                )\r
+            {\r
+                /* join reply returns link token */\r
+                memcpy(&linkToken, msg + JR_LINK_TOKEN_OS, sizeof(linkToken));\r
+\r
+                nwk_setLinkToken(linkToken);\r
+                /* save AP address */\r
+                nwk_setAPAddress(&apAddr);\r
+                sTid++; /* guard against duplicates */\r
+                rc = SMPL_SUCCESS;\r
+#    if defined(FREQUENCY_AGILITY)\r
+                break;\r
+#    endif\r
+            }\r
+        }\r
+        /* TODO: process encryption stuff */\r
+    }\r
+\r
+    return rc;\r
+\r
+}\r
+\r
+#endif /* ACCESS_POINT */\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_processJoin\r
+ *\r
+ * @brief       Processes a Join frame. If this is a reply let it go to the\r
+ *              application. Otherwise generate and send the reply.\r
+ *\r
+ * input parameters\r
+ * @param   frame     - Pointer to Join frame\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   Keep frame for application, release frame, or replay frame.\r
+ */\r
+\r
+fhStatus_t nwk_processJoin(mrfiPacket_t *frame)\r
+{\r
+    fhStatus_t rc = FHS_RELEASE;\r
+    uint8_t replyType;\r
+\r
+    /* Make sure this is a reply and see if we sent this. Validate the\r
+     * packet for reception by client app.\r
+     */\r
+    if (SMPL_MY_REPLY == (replyType = nwk_isValidReply(frame, sTid, JB_REQ_OS, JB_TID_OS)))\r
+    {\r
+        /* It's a match and it's a reply. Validate the received packet by\r
+         * returning a 1 so it can be received by the client app.\r
+         */\r
+        MRFI_PostKillSem();\r
+        rc = FHS_KEEP;\r
+    }\r
+#if defined(ACCESS_POINT)\r
+    else if (SMPL_A_REPLY == replyType)\r
+    {\r
+        /* No match. If I'm not an ED this is a reply that should be passed on. */\r
+        rc = FHS_REPLAY;\r
+    }\r
+    else\r
+    {\r
+        /* Send reply if we're an Access Point otherwise ignore the frame. */\r
+        if ((SMPL_NOT_REPLY == replyType) && sJoinOK)\r
+        {\r
+            handleJoinRequest(frame);\r
+        }\r
+    }\r
+#elif defined(RANGE_EXTENDER)\r
+    else\r
+    {\r
+        /* Either a reply that has to be replayed or a request that\r
+         * also must be replayed.\r
+         */\r
+        rc = FHS_REPLAY;\r
+    }\r
+#endif /* not END_DEVICE */\r
+\r
+    (void) replyType; /* keep compiler happy */\r
+\r
+    return rc;\r
+}\r
+\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/Components/nwk_applications/nwk_join.h b/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/Components/nwk_applications/nwk_join.h
new file mode 100755 (executable)
index 0000000..63ff2c4
--- /dev/null
@@ -0,0 +1,94 @@
+/**************************************************************************************************\r
+*  Filename:       nwk_join.h\r
+*  Revised:        $Date: 2009-01-06 12:26:02 -0800 (Tue, 06 Jan 2009) $\r
+*  Revision:       $Revision: 18693 $\r
+*  Author:         $Author: lfriedman $\r
+*\r
+*  Description:    This header file supports the SimpliciTI Join network application.\r
+*\r
+*  Copyright 2004-2007 Texas Instruments Incorporated. All rights reserved.\r
+*\r
+*  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+*  the terms of a software license agreement between the user who downloaded the software,\r
+*  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+*  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+*  License. The License limits your use, and you acknowledge, that the Software may not be\r
+*  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+*  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+*  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+*  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+*  perform, display or sell this Software and/or its documentation for any purpose.\r
+*\r
+*  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+*  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+*  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+*  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+*  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+*  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+*  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+*  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+*  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+*\r
+*  Should you have any questions regarding your right to use this Software,\r
+*  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+\r
+#ifndef NWK_JOIN_H\r
+#define NWK_JOIN_H\r
+\r
+#define JOIN_CONTEXT_ON  (0x01)\r
+#define JOIN_CONTEXT_OFF (0x02)\r
+\r
+/* Macros needed for protocol backward compatibility */\r
+#define JOIN_LEGACY_MSG_LENGTH        7\r
+#define JOIN_REPLY_LEGACY_MSG_LENGTH  6\r
+\r
+/* place holder... */\r
+#define SEC_CRYPT_KEY_SIZE  0\r
+\r
+/* application payload offsets\r
+ *    both */\r
+#define JB_REQ_OS                0\r
+#define JB_TID_OS                1\r
+/*    join frame */\r
+#define J_JOIN_TOKEN_OS          2\r
+#define J_NUMCONN_OS             6\r
+#define J_PROTOCOL_VERSION_OS    7\r
+/*    join reply frame */\r
+#define JR_LINK_TOKEN_OS         2\r
+#define JR_CRYPTKEY_SIZE_OS      6\r
+#define JR_CRYPTKEY_OS           7\r
+\r
+/* change the following as protocol developed */\r
+#define MAX_JOIN_APP_FRAME    (JR_CRYPTKEY_OS + SEC_CRYPT_KEY_SIZE)\r
+\r
+/* set out frame size */\r
+#define JOIN_FRAME_SIZE         8\r
+#define JOIN_REPLY_FRAME_SIZE   MAX_JOIN_APP_FRAME\r
+\r
+/* join requests\r
+ * NOTE: If aditional command codes are required do _not_ use the\r
+ *       value JOIN_REPLY_LEGACY_MSG_LENGTH. This numeral is used\r
+ *       to guarantee that legacy Join frames (from before release\r
+ *       1.0.6) work correctly. Don't ask.\r
+ */\r
+#define JOIN_REQ_JOIN       1\r
+\r
+/* prototypes */\r
+void nwk_joinInit(uint8_t (*)(linkID_t));\r
+smplStatus_t nwk_join(void);\r
+fhStatus_t nwk_processJoin(mrfiPacket_t *);\r
+void nwk_getJoinToken(uint32_t *);\r
+\r
+void nwk_setJoinContext(uint8_t);\r
+void nwk_setJoinToken(uint32_t);\r
+void nwk_getJoinToken(uint32_t *);\r
+\r
+#ifdef ACCESS_POINT\r
+sfClientInfo_t *nwk_isSandFClient(uint8_t *, uint8_t *);\r
+\r
+#endif\r
+\r
+#endif\r
+\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/Components/nwk_applications/nwk_link.c b/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/Components/nwk_applications/nwk_link.c
new file mode 100755 (executable)
index 0000000..8188970
--- /dev/null
@@ -0,0 +1,886 @@
+/**************************************************************************************************\r
+*  Filename:       nwk_link.c\r
+*  Revised:        $Date: 2008-12-23 13:54:27 -0800 (Tue, 23 Dec 2008) $\r
+*  Revision:       $Revision: 18652 $\r
+*  Author:         $Author: lfriedman $\r
+*\r
+*  Description:    This file supports the SimpliciTI Link network application.\r
+*\r
+*  Copyright 2007-2008 Texas Instruments Incorporated. All rights reserved.\r
+*\r
+*  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+*  the terms of a software license agreement between the user who downloaded the software,\r
+*  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+*  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+*  License. The License limits your use, and you acknowledge, that the Software may not be\r
+*  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+*  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+*  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+*  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+*  perform, display or sell this Software and/or its documentation for any purpose.\r
+*\r
+*  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+*  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+*  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+*  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+*  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+*  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+*  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+*  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+*  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+*\r
+*  Should you have any questions regarding your right to use this Software,\r
+*  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+\r
+/******************************************************************************\r
+ * INCLUDES\r
+ */\r
+\r
+#include <string.h>\r
+#include "bsp.h"\r
+#include "mrfi.h"\r
+#include "nwk_types.h"\r
+#include "nwk_api.h"\r
+#include "nwk_frame.h"\r
+#include "nwk.h"\r
+#include "nwk_link.h"\r
+#include "nwk_globals.h"\r
+#include "nwk_security.h"\r
+\r
+/******************************************************************************\r
+ * MACROS\r
+ */\r
+\r
+/******************************************************************************\r
+ * CONSTANTS AND DEFINES\r
+ */\r
+\r
+/******************************************************************************\r
+ * TYPEDEFS\r
+ */\r
+\r
+/******************************************************************************\r
+ * LOCAL VARIABLES\r
+ */\r
+static uint32_t sLinkToken = 0;\r
+static volatile uint8_t sListenActive = 0;\r
+#if NUM_CONNECTIONS > 0\r
+static volatile linkID_t sServiceLinkID[NUM_CONNECTIONS];\r
+#endif\r
+static volatile uint8_t sNumLinkers = 0;\r
+static volatile uint8_t sTid = 0;\r
+\r
+/******************************************************************************\r
+ * LOCAL FUNCTIONS\r
+ */\r
+\r
+#define  SENT_REPLY       1\r
+#define  SENT_NO_REPLY    2\r
+static uint8_t smpl_send_link_reply(mrfiPacket_t *);\r
+static fhStatus_t handleLinkRequest(mrfiPacket_t *);\r
+\r
+#if defined(EXTENDED_API)\r
+static void smpl_send_unlink_reply(mrfiPacket_t *);\r
+\r
+#endif\r
+\r
+\r
+/******************************************************************************\r
+ * GLOBAL VARIABLES\r
+ */\r
+\r
+/******************************************************************************\r
+ * GLOBAL FUNCTIONS\r
+ */\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_linkInit\r
+ *\r
+ * @brief       Initialize link app. Set link token to the default.\r
+ *\r
+ * input parameters\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   void\r
+ */\r
+\r
+void nwk_linkInit(void)\r
+{\r
+    if (!sLinkToken)\r
+    {\r
+        /* if the link token has not been set externally by the time we get here\r
+         * (such as by the ioctl token-setting interface) assign the default\r
+         */\r
+        sLinkToken = DEFAULT_LINK_TOKEN;\r
+    }\r
+\r
+    /* set a non-zero TID. */\r
+    while (!(sTid = MRFI_RandomByte())) ;\r
+\r
+#if NUM_CONNECTIONS > 0\r
+    memset((void *)&sServiceLinkID, 0x0, sizeof(sServiceLinkID));\r
+#endif\r
+\r
+    return;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_setLinkToken\r
+ *\r
+ * @brief       Sets the link token received in a Join reply.\r
+ *\r
+ * input parameters\r
+ * @param   token   - Link token to be used on this network to link to any peer.\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   void\r
+ */\r
+\r
+void nwk_setLinkToken(uint32_t token)\r
+{\r
+    /* only set if the supplied token is non-zero. */\r
+    if (token)\r
+    {\r
+        sLinkToken = token;\r
+    }\r
+\r
+    return;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_getLinkToken\r
+ *\r
+ * @brief       Gets the current link token.\r
+ *\r
+ * input parameters\r
+ *\r
+ * output parameters\r
+ * @param   pToken   - pointer to the returned value.\r
+ *\r
+ * @return   Current link token\r
+ */\r
+\r
+void nwk_getLinkToken(uint32_t *pToken)\r
+{\r
+    /* only set if the supplied token is non-zero. */\r
+    if (pToken)\r
+    {\r
+        *pToken = sLinkToken;\r
+    }\r
+\r
+    return;\r
+}\r
+\r
+#if defined(EXTENDED_API)\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_unlink\r
+ *\r
+ * @brief       Called from the application level to tear down a link.\r
+ *\r
+ * input parameters\r
+ *\r
+ * output parameters\r
+ * @param   lid     - Link ID assigned for this link\r
+ *\r
+ * @return   Status of the operation.\r
+ *           SMPL_SUCCESS\r
+ *           SMPL_BAD_PARAM       No connection table entry for this Link ID;\r
+ *                                SMPL_LINKID_USER_UUD not valid since it is not\r
+ *                                connection-based.\r
+ *           SMPL_TIMEOUT         No reply from peer.\r
+ *           SMPL_NO_PEER_UNLINK  Peer did not have a Connection Table entry for me.\r
+ */\r
+\r
+smplStatus_t nwk_unlink(linkID_t lid)\r
+{\r
+    uint8_t msg[UNLINK_FRAME_SIZE];\r
+    connInfo_t  *pCInfo = nwk_getConnInfo(lid);\r
+    smplStatus_t rc     = SMPL_SUCCESS;\r
+    addr_t addr;\r
+\r
+    union\r
+    {\r
+        ioctlRawSend_t send;\r
+        ioctlRawReceive_t recv;\r
+    } ioctl_info;\r
+\r
+    /* is there connection info? */\r
+    if (!pCInfo || (lid == SMPL_LINKID_USER_UUD))\r
+    {\r
+        return SMPL_BAD_PARAM;\r
+    }\r
+\r
+    /* set request byte */\r
+    msg[LB_REQ_OS] = LINK_REQ_UNLINK;\r
+\r
+    /* set the transaction ID. this allows target to figure out duplicates */\r
+    msg[LB_TID_OS] = sTid;\r
+\r
+    /* remote port to be sent in message to help match connection */\r
+    msg[UL_RMT_PORT_OS] = pCInfo->portRx;\r
+\r
+    /* setup for ioctl raw I/O */\r
+    memcpy(addr.addr, pCInfo->peerAddr, NET_ADDR_SIZE);\r
+    ioctl_info.send.addr = &addr;\r
+    ioctl_info.send.msg  = msg;\r
+    ioctl_info.send.len  = sizeof(msg);\r
+    ioctl_info.send.port = SMPL_PORT_LINK;\r
+\r
+    SMPL_Ioctl(IOCTL_OBJ_RAW_IO, IOCTL_ACT_WRITE, &ioctl_info.send);\r
+\r
+    {\r
+        uint8_t spin       = NWK_RX_RETRY_COUNT;\r
+        uint8_t radioState = MRFI_GetRadioState();\r
+\r
+        ioctl_info.recv.port = SMPL_PORT_LINK;\r
+        ioctl_info.recv.msg  = msg;\r
+        ioctl_info.recv.addr = (addr_t *)0;\r
+\r
+        do\r
+        {\r
+            NWK_CHECK_FOR_SETRX(radioState);\r
+            NWK_REPLY_DELAY();\r
+            NWK_CHECK_FOR_RESTORE_STATE(radioState);\r
+\r
+            if (SMPL_SUCCESS == SMPL_Ioctl(IOCTL_OBJ_RAW_IO, IOCTL_ACT_READ, &ioctl_info.recv))\r
+            {\r
+                if ((msg[LB_REQ_OS] & (~NWK_APP_REPLY_BIT)) == LINK_REQ_UNLINK)\r
+                {\r
+                    rc = (smplStatus_t)msg[ULR_RESULT_OS];\r
+                    break;\r
+                }\r
+            }\r
+            if (!spin)\r
+            {\r
+                rc = SMPL_TIMEOUT;\r
+                break;\r
+            }\r
+            --spin;\r
+        } while (1);\r
+\r
+        /* it's ok to unconditionally invalidate connection object */\r
+        nwk_freeConnection(pCInfo);\r
+    }\r
+    return rc;\r
+}\r
+\r
+#endif  /* EXTENDED_API */\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_link\r
+ *\r
+ * @brief       Called from the application level to accomplish the link\r
+ *\r
+ * input parameters\r
+ *\r
+ * output parameters\r
+ * @param   lid     - pointer to Link ID (port) assigned for this link\r
+ *\r
+ * @return   Status of the operation.\r
+ */\r
+\r
+smplStatus_t nwk_link(linkID_t *lid)\r
+{\r
+    uint8_t msg[LINK_FRAME_SIZE];\r
+    connInfo_t   *pCInfo = nwk_getNextConnection();\r
+    smplStatus_t rc;\r
+\r
+    if (pCInfo)\r
+    {\r
+        addr_t addr;\r
+        union\r
+        {\r
+            ioctlRawSend_t send;\r
+            ioctlRawReceive_t recv;\r
+        } ioctl_info;\r
+\r
+        if (!nwk_allocateLocalRxPort(LINK_SEND, pCInfo))\r
+        {\r
+            nwk_freeConnection(pCInfo);\r
+            return SMPL_NOMEM;\r
+        }\r
+\r
+        memcpy(addr.addr, nwk_getBCastAddress(), NET_ADDR_SIZE);\r
+        ioctl_info.send.addr = &addr;\r
+        ioctl_info.send.msg  = msg;\r
+        ioctl_info.send.len  = sizeof(msg);\r
+        ioctl_info.send.port = SMPL_PORT_LINK;\r
+\r
+        /* Put link token in */\r
+        nwk_putNumObjectIntoMsg((void *)&sLinkToken, msg + L_LINK_TOKEN_OS, sizeof(sLinkToken));\r
+\r
+        /* set port to which the remote device should send */\r
+        msg[L_RMT_PORT_OS] = pCInfo->portRx;\r
+\r
+        /* set the transaction ID. this allows target to figure out duplicates */\r
+        msg[LB_TID_OS] = sTid;\r
+\r
+        /* set my Rx type */\r
+        msg[L_MY_RXTYPE_OS] = nwk_getMyRxType();\r
+\r
+        /* set request byte */\r
+        msg[LB_REQ_OS] = LINK_REQ_LINK;\r
+\r
+        /* protocol version number */\r
+        msg[L_PROTOCOL_VERSION_OS] = nwk_getProtocolVersion();\r
+\r
+#if defined(SMPL_SECURE)\r
+        pCInfo->connTxCTR = MRFI_RandomByte()                   | \\r
+            ((uint32_t)(MRFI_RandomByte()) << 8)  | \\r
+            ((uint32_t)(MRFI_RandomByte()) << 16) | \\r
+            ((uint32_t)(MRFI_RandomByte()) << 24);\r
+\r
+        nwk_putNumObjectIntoMsg((void *)&pCInfo->connTxCTR, (void *)&msg[L_CTR_OS], 4);\r
+#endif\r
+\r
+\r
+        if (SMPL_SUCCESS != (rc = SMPL_Ioctl(IOCTL_OBJ_RAW_IO, IOCTL_ACT_WRITE, &ioctl_info.send)))\r
+        {\r
+            return rc;\r
+        }\r
+\r
+        {\r
+            uint8_t radioState = MRFI_GetRadioState();\r
+\r
+            ioctl_info.recv.port = SMPL_PORT_LINK;\r
+            ioctl_info.recv.msg  = msg;\r
+            ioctl_info.recv.addr = (addr_t *)pCInfo->peerAddr;\r
+\r
+            NWK_CHECK_FOR_SETRX(radioState);\r
+            NWK_REPLY_DELAY();\r
+            NWK_CHECK_FOR_RESTORE_STATE(radioState);\r
+\r
+            if (SMPL_SUCCESS == SMPL_Ioctl(IOCTL_OBJ_RAW_IO, IOCTL_ACT_READ, &ioctl_info.recv))\r
+            {\r
+                uint8_t firstByte = msg[LB_REQ_OS] & (~NWK_APP_REPLY_BIT);\r
+\r
+                /* Sanity check for correct reply frame. Older version\r
+                 * has the length instead of the request as the first byte.\r
+                 */\r
+                if ((firstByte != LINK_REQ_LINK) &&\r
+                    (firstByte != LINK_REPLY_LEGACY_MSG_LENGTH)\r
+                    )\r
+                {\r
+                    /* invalidate connection object */\r
+                    nwk_freeConnection(pCInfo);\r
+                    return SMPL_NO_LINK;\r
+\r
+                }\r
+            }\r
+            else\r
+            {\r
+                /* no successful receive */\r
+                nwk_freeConnection(pCInfo);\r
+                return SMPL_TIMEOUT;\r
+            }\r
+\r
+            pCInfo->connState = CONNSTATE_CONNECTED;\r
+            pCInfo->portTx    = msg[LR_RMT_PORT_OS]; /* link reply returns remote port */\r
+            *lid              = pCInfo->thisLinkID;  /* return our local port number */\r
+\r
+            /* Set hop count. If it's a polling device set the count to the\r
+             * distance to the AP. Otherwise, set it to the max less the remaining\r
+             * which will be the path taken for this frame. It will be no worse\r
+             * then tha max and probably will be better.\r
+             */\r
+            if (F_RX_TYPE_POLLS == msg[LR_MY_RXTYPE_OS])\r
+            {\r
+                pCInfo->hops2target = MAX_HOPS_FROM_AP;\r
+            }\r
+            else\r
+            {\r
+                /* Can't really use this trick because the device could move. If the\r
+                 * devices are all static this may work unless the initial reception\r
+                 * was marginal.\r
+                 */\r
+#if defined(DEVICE_DOES_NOT_MOVE)\r
+                pCInfo->hops2target = MAX_HOPS - ioctl_info.recv.hopCount;\r
+#else\r
+                pCInfo->hops2target = MAX_HOPS;\r
+#endif\r
+            }\r
+\r
+#if defined(SMPL_SECURE)\r
+            nwk_getNumObjectFromMsg((void *)&msg[LR_CTR_OS], (void *)&pCInfo->connRxCTR, 4);\r
+#endif\r
+        }\r
+\r
+        /* guard against duplicates... */\r
+        ++sTid;\r
+        if (!sTid)\r
+        {\r
+            sTid = 1;\r
+        }\r
+        return SMPL_SUCCESS;\r
+    }\r
+\r
+    return SMPL_NOMEM;\r
+}\r
+\r
+#if defined(EXTENDED_API)\r
+\r
+/******************************************************************************\r
+ * @fn          smpl_send_unlink_reply\r
+ *\r
+ * @brief       Send the unlink reply to the device trying to unlink\r
+ *\r
+ * input parameters\r
+ * @param   frame   - frame received from linker\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   void\r
+ */\r
+\r
+static void smpl_send_unlink_reply(mrfiPacket_t *frame)\r
+{\r
+    connInfo_t  *pCInfo;\r
+    frameInfo_t *pOutFrame;\r
+    uint8_t msg[UNLINK_REPLY_FRAME_SIZE];\r
+    smplStatus_t rc = SMPL_NO_PEER_UNLINK;\r
+\r
+    /* match the remote port and source address with a connection table entry */\r
+    if (pCInfo =\r
+            nwk_findPeer((addr_t *)MRFI_P_SRC_ADDR(frame),\r
+                         *(MRFI_P_PAYLOAD(frame) + F_APP_PAYLOAD_OS + UL_RMT_PORT_OS)))\r
+    {\r
+        /* Note we unconditionally free the connection resources */\r
+        nwk_freeConnection(pCInfo);\r
+        rc = SMPL_SUCCESS;\r
+    }\r
+\r
+    /* set reply bit */\r
+    msg[LB_REQ_OS] = LINK_REQ_UNLINK | NWK_APP_REPLY_BIT;\r
+\r
+    /* sender's TID */\r
+    msg[LB_TID_OS] = *(MRFI_P_PAYLOAD(frame) + F_APP_PAYLOAD_OS + LB_TID_OS);\r
+\r
+    /* result of freeing local connection */\r
+    msg[ULR_RESULT_OS] = rc;\r
+\r
+    if (pOutFrame = nwk_buildFrame(SMPL_PORT_LINK, msg, sizeof(msg), MAX_HOPS))\r
+    {\r
+        /* destination address is the source adddress of the received frame. */\r
+        memcpy(MRFI_P_DST_ADDR(&pOutFrame->mrfiPkt), MRFI_P_SRC_ADDR(frame), NET_ADDR_SIZE);\r
+#    if defined(SMPL_SECURE)\r
+        nwk_setSecureFrame(&pOutFrame->mrfiPkt, sizeof(msg), 0);\r
+#    endif /* SMPL_SECURE */\r
+        nwk_sendFrame(pOutFrame, MRFI_TX_TYPE_FORCED);\r
+    }\r
+}\r
+\r
+#endif     /* EXTENDED_API */\r
+\r
+/******************************************************************************\r
+ * @fn          smpl_send_link_reply\r
+ *\r
+ * @brief       Send the link reply to the device trying to link. This routine\r
+ *              will handle duplicates.\r
+ *\r
+ * input parameters\r
+ * @param   frame   - frame received from linker\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   Returns SENT_REPLY if reply sent, else SENT_NO_REPLY.\r
+ *           The return value is used as this routine unwinds to know\r
+ *           whether to replay the frame. An RE or AP can host an ED\r
+ *           object in which case it might send a reply (possibly from\r
+ *           a duplicate frame). If we do reply we do not want to replay.\r
+ */\r
+\r
+static uint8_t smpl_send_link_reply(mrfiPacket_t *frame)\r
+{\r
+#if NUM_CONNECTIONS > 0\r
+    frameInfo_t *pOutFrame;\r
+    connInfo_t  *pCInfo;\r
+    uint8_t remotePort;\r
+    uint8_t msg[LINK_REPLY_FRAME_SIZE];\r
+\r
+    /* Is this a legacy frame? If so continue. Otherwise check version.*/\r
+    if ((MRFI_GET_PAYLOAD_LEN(frame) - F_APP_PAYLOAD_OS) > LINK_LEGACY_MSG_LENGTH)\r
+    {\r
+        /* see if protocol version is correct... */\r
+        if (*(MRFI_P_PAYLOAD(frame) + F_APP_PAYLOAD_OS + L_PROTOCOL_VERSION_OS) !=\r
+            nwk_getProtocolVersion())\r
+        {\r
+            /* Accommodation of protocol version differences can be noted or accomplished here.\r
+             * This field was also checked in the join transaction but it is checked again here\r
+             * because that check may not have occurred if thre is no AP in this topology.\r
+             * Otherwise, no match and the board goes back\r
+             */\r
+            return SENT_NO_REPLY;\r
+        }\r
+    }\r
+\r
+    /* see if token is correct */\r
+    {\r
+        uint32_t lt;\r
+\r
+        nwk_getNumObjectFromMsg(MRFI_P_PAYLOAD(\r
+                                    frame) + F_APP_PAYLOAD_OS + L_LINK_TOKEN_OS, &lt, sizeof(lt));\r
+        if (lt != sLinkToken)\r
+        {\r
+            return SENT_NO_REPLY;\r
+        }\r
+    }\r
+\r
+    /* if we get here the token matched. */\r
+\r
+    /* is this a duplicate request? */\r
+    remotePort = *(MRFI_P_PAYLOAD(frame) + F_APP_PAYLOAD_OS + L_RMT_PORT_OS);\r
+    if (pCInfo = nwk_isLinkDuplicate(MRFI_P_SRC_ADDR(frame), remotePort))\r
+    {\r
+        /* resend reply */\r
+        msg[LB_REQ_OS] = LINK_REQ_LINK | NWK_APP_REPLY_BIT;\r
+\r
+        /* sender's TID */\r
+        msg[LB_TID_OS] = *(MRFI_P_PAYLOAD(frame) + F_APP_PAYLOAD_OS + LB_TID_OS);\r
+\r
+        /* Send reply with the local port number so the remote device knows where to\r
+         * send packets.\r
+         */\r
+        msg[LR_RMT_PORT_OS] = pCInfo->portRx;\r
+\r
+        /* put my Rx type in there. used to know how to set hops when sending back. */\r
+        msg[LR_MY_RXTYPE_OS] = nwk_getMyRxType();\r
+#    if defined(SMPL_SECURE)\r
+        /* Set the Tx counter value for peer's Rx counter object */\r
+        nwk_putNumObjectIntoMsg((void *)&pCInfo->connTxCTR, (void *)&msg[LR_CTR_OS], 4);\r
+        /* We also need to save the newly generated Rx counter value. */\r
+        nwk_getNumObjectFromMsg((void *)(MRFI_P_PAYLOAD(frame) + F_APP_PAYLOAD_OS + L_CTR_OS),\r
+                                (void *)&pCInfo->connRxCTR, 4);\r
+#    endif\r
+        if (pOutFrame =\r
+                nwk_buildFrame(SMPL_PORT_LINK, msg, sizeof(msg), MAX_HOPS -\r
+                               (GET_FROM_FRAME(MRFI_P_PAYLOAD(frame), F_HOP_COUNT))))\r
+        {\r
+            /* destination address is the source adddress of the received frame. */\r
+            memcpy(MRFI_P_DST_ADDR(&pOutFrame->mrfiPkt), MRFI_P_SRC_ADDR(frame), NET_ADDR_SIZE);\r
+#    if defined(SMPL_SECURE)\r
+            nwk_setSecureFrame(&pOutFrame->mrfiPkt, sizeof(msg), 0);\r
+#    endif  /* SMPL_SECURE */\r
+            nwk_sendFrame(pOutFrame, MRFI_TX_TYPE_FORCED);\r
+        }\r
+        return SENT_REPLY;\r
+    }\r
+\r
+    if (!sListenActive)\r
+    {\r
+        /* We've checked for duplicate and resent reply. In that case we weren't listening\r
+         * so just go back`.\r
+         */\r
+        return SENT_NO_REPLY;\r
+    }\r
+\r
+    /* room to link? */\r
+#    if defined(AP_IS_DATA_HUB)\r
+    pCInfo = nwk_findAlreadyJoined(frame);\r
+\r
+    if (!pCInfo)\r
+#    endif\r
+    {\r
+        pCInfo = nwk_getNextConnection();\r
+    }\r
+\r
+    if (pCInfo)\r
+    {\r
+        /* yes there's room and it's not a dup. address. */\r
+        memcpy(&pCInfo->peerAddr, MRFI_P_SRC_ADDR(frame), NET_ADDR_SIZE);\r
+\r
+        if (!nwk_allocateLocalRxPort(LINK_REPLY, pCInfo))\r
+        {\r
+            nwk_freeConnection(pCInfo);\r
+            /* we're done with the packet */\r
+            return SENT_REPLY;\r
+        }\r
+\r
+        /* The local Rx port is the one returned in the connection structure. The\r
+         * caller is waiting on this to be set. The code here is running in an ISR\r
+         * thread so the caller will see this change after RETI.\r
+         */\r
+        if (NUM_CONNECTIONS == sNumLinkers)\r
+        {\r
+            /* Something is wrong -- no room to stack Link request */\r
+            nwk_freeConnection(pCInfo);\r
+            /* we're done with the packet */\r
+            return SENT_REPLY;\r
+        }\r
+        sServiceLinkID[sNumLinkers++] = pCInfo->thisLinkID;\r
+\r
+        /* save the remote Tx port */\r
+        pCInfo->portTx = remotePort;\r
+\r
+        /* connection is valid... */\r
+        pCInfo->connState = CONNSTATE_CONNECTED;\r
+\r
+        /* Set hop count. If it's a polling device set the count to the\r
+         * distance to the AP. otherwise, set it to the max less the remaining\r
+         * which will be the path taken for this frame. It will be no worse\r
+         * then tha max and probably will be better.\r
+         */\r
+        if (F_RX_TYPE_POLLS == *(MRFI_P_PAYLOAD(frame) + F_APP_PAYLOAD_OS + L_MY_RXTYPE_OS))\r
+        {\r
+            /* It polls. so. we'll be sending to the AP which will store the\r
+             * frame. The AP is only MAX_HOPS_FROM_AP hops away from us.\r
+             */\r
+            pCInfo->hops2target = MAX_HOPS_FROM_AP;\r
+        }\r
+        else\r
+        {\r
+            /* Can't really use this trick because the device could move. If the\r
+             * devices are all static this may work unless the initial reception\r
+             * was marginal.\r
+             */\r
+#    if defined(DEVICE_DOES_NOT_MOVE)\r
+            pCInfo->hops2target = MAX_HOPS - GET_FROM_FRAME(MRFI_P_PAYLOAD(frame), F_HOP_COUNT);\r
+#    else\r
+            pCInfo->hops2target = MAX_HOPS;\r
+#    endif\r
+        }\r
+\r
+        /* Send reply with the local port number so the remote device knows where to\r
+         * send packets.\r
+         */\r
+        msg[LR_RMT_PORT_OS]  = pCInfo->portRx;\r
+\r
+        /* put my Rx type in there. used to know how to set hops when sending back. */\r
+        msg[LR_MY_RXTYPE_OS] = nwk_getMyRxType();\r
+\r
+        msg[LB_REQ_OS] = LINK_REQ_LINK | NWK_APP_REPLY_BIT;\r
+\r
+        /* sender's TID */\r
+        msg[LB_TID_OS] = *(MRFI_P_PAYLOAD(frame) + F_APP_PAYLOAD_OS + LB_TID_OS);\r
+#    if defined(SMPL_SECURE)\r
+        nwk_getNumObjectFromMsg((void *)(MRFI_P_PAYLOAD(frame) + F_APP_PAYLOAD_OS + L_CTR_OS),\r
+                                (void *)&pCInfo->connRxCTR, 4);\r
+        pCInfo->connTxCTR = MRFI_RandomByte()                   | \\r
+            ((uint32_t)(MRFI_RandomByte()) << 8)  | \\r
+            ((uint32_t)(MRFI_RandomByte()) << 16) | \\r
+            ((uint32_t)(MRFI_RandomByte()) << 24);\r
+\r
+        nwk_putNumObjectIntoMsg((void *)&pCInfo->connTxCTR, (void *)&msg[LR_CTR_OS], 4);\r
+#    endif\r
+        if (pOutFrame =\r
+                nwk_buildFrame(SMPL_PORT_LINK, msg, sizeof(msg), MAX_HOPS -\r
+                               (GET_FROM_FRAME(MRFI_P_PAYLOAD(frame), F_HOP_COUNT))))\r
+        {\r
+            /* destination address is the source adddress of the received frame. */\r
+            memcpy(MRFI_P_DST_ADDR(&pOutFrame->mrfiPkt), MRFI_P_SRC_ADDR(frame), NET_ADDR_SIZE);\r
+#    if defined(SMPL_SECURE)\r
+            nwk_setSecureFrame(&pOutFrame->mrfiPkt, sizeof(msg), 0);\r
+#    endif\r
+            if (SMPL_SUCCESS != nwk_sendFrame(pOutFrame, MRFI_TX_TYPE_FORCED))\r
+            {\r
+                /* better release the connection structure */\r
+                nwk_freeConnection(pCInfo);\r
+            }\r
+        }\r
+        else\r
+        {\r
+            /* better release the connection structure */\r
+            nwk_freeConnection(pCInfo);\r
+        }\r
+    }\r
+    /* we're done with the packet */\r
+    return SENT_REPLY;\r
+#else\r
+    return SENT_NO_REPLY;\r
+#endif  /* NUM_CONNECTIONS */\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_processLink\r
+ *\r
+ * @brief       Process Link frame. Just save the frame for the Link app if it\r
+ *              a reply. If it isn't a reply, send the reply in this thread.\r
+ *\r
+ * input parameters\r
+ * @param   frame   - pointer to frame to be processed\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   Keep frame for application, release frame, or replay frame..\r
+ */\r
+\r
+fhStatus_t nwk_processLink(mrfiPacket_t *frame)\r
+{\r
+    fhStatus_t rc;\r
+    uint8_t replyType;\r
+\r
+    /* If we sent this then this is the reply. Validate the\r
+     * packet for reception by client app. If we didn't send\r
+     * it then we are the target. send the reply.\r
+     */\r
+    if (SMPL_MY_REPLY == (replyType = nwk_isValidReply(frame, sTid, LB_REQ_OS, LB_TID_OS)))\r
+    {\r
+        /* It's a match and it's a reply. Validate the received packet by\r
+         * returning a 1 so it can be received by the client app.\r
+         */\r
+        MRFI_PostKillSem();\r
+        rc = FHS_KEEP;\r
+    }\r
+#if !defined(END_DEVICE)\r
+    else if (SMPL_A_REPLY == replyType)\r
+    {\r
+        /* no match. if i'm not an ED this is a reply that should be passed on. */\r
+        rc = FHS_REPLAY;\r
+    }\r
+#endif  /* !END_DEVICE */\r
+    else\r
+    {\r
+        /* No, we didn't send it. Process request assuming it's\r
+         * intended for us.\r
+         */\r
+        rc = handleLinkRequest(frame);\r
+    }\r
+\r
+    (void) replyType; /* keep compiler happy when ED built... */\r
+\r
+    return rc;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_getLocalLinkID\r
+ *\r
+ * @brief       This routine checks to see if a service port has been assigned\r
+ *              as a result of a link reply frame being received. It is the means\r
+ *              by which the user thread knows that the waiting is over for the\r
+ *              link listen. the value is set in an interrupt thread.\r
+ *\r
+ * input parameters\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   Local port assigned when the link reply was received.\r
+ */\r
+\r
+linkID_t nwk_getLocalLinkID(void)\r
+{\r
+    linkID_t lid = 0;\r
+\r
+#if NUM_CONNECTIONS > 0\r
+    uint8_t i;\r
+    bspIState_t intState;\r
+\r
+\r
+    BSP_ENTER_CRITICAL_SECTION(intState);\r
+    if (sNumLinkers)\r
+    {\r
+        sNumLinkers--;\r
+        BSP_EXIT_CRITICAL_SECTION(intState);\r
+\r
+        nwk_setListenContext(LINK_LISTEN_OFF);\r
+        lid = sServiceLinkID[0];\r
+\r
+        /* If more than one Link frame has been processed without an intervening\r
+         * Listen assume that there will be another Link Listen call that will\r
+         * poll for completion which has already occurred. Age any existing entries.\r
+         * This code was added to deal with the possibility of mulitple EDs being\r
+         * activated simultaneously in the AP-as-data-hub example. This opens a\r
+         * window of opportunity for a "typical" scenario to get hosed. But for\r
+         * a "typical" scenario to get hosed a number of improbable events have to\r
+         * occur. These are deemed far less likely than the multiple-ED-activation\r
+         * scenario in the AP-as-dat-hub case.\r
+         */\r
+        for (i = 0; i < sNumLinkers; ++i)\r
+        {\r
+            sServiceLinkID[i] = sServiceLinkID[i + 1];\r
+        }\r
+    }\r
+    else\r
+    {\r
+        BSP_EXIT_CRITICAL_SECTION(intState);\r
+    }\r
+#endif  /* NUM_CONNECTIONS */\r
+\r
+    return lid;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_setListenContext\r
+ *\r
+ * @brief       Sets the context when a LinkListen is executed. This prevents\r
+ *              processing other link frames from being confused with the real\r
+ *              one. Without this semaphore other broadcast link messages\r
+ *              could wait int the input queue and accidently be processed if\r
+ *              a listen is done later.\r
+ *\r
+ * input parameters\r
+ *\r
+ * @param   context - listen on or off\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   void\r
+ */\r
+\r
+void nwk_setListenContext(uint8_t context)\r
+{\r
+    sListenActive = (context == LINK_LISTEN_ON) ? 1 : 0;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          handleLinkRequest\r
+ *\r
+ * @brief       Dispatches handler for specfic link request\r
+ *\r
+ * input parameters\r
+ *\r
+ * @param   frame - Link frame received\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   void\r
+ */\r
+\r
+static fhStatus_t handleLinkRequest(mrfiPacket_t *frame)\r
+{\r
+    fhStatus_t rc = FHS_RELEASE;\r
+    uint8_t isReplySent;\r
+\r
+    if (LINK_LEGACY_MSG_LENGTH == (MRFI_GET_PAYLOAD_LEN(frame) - F_APP_PAYLOAD_OS))\r
+    {\r
+        /* Legacy frame. Spoof a link request */\r
+        *(MRFI_P_PAYLOAD(frame) + F_APP_PAYLOAD_OS) = LINK_REQ_LINK;\r
+    }\r
+\r
+    switch (*(MRFI_P_PAYLOAD(frame) + F_APP_PAYLOAD_OS))\r
+    {\r
+        case LINK_REQ_LINK:\r
+            isReplySent = smpl_send_link_reply(frame);\r
+#if !defined(END_DEVICE)\r
+\r
+            /* If I am an AP or RE and not listening I need to replay frame.\r
+             * The exception is if I am an AP or RE hosting an End Device\r
+             * object and I just sent a reply frame to a duplicate link frame\r
+             * for which I was not listening. In this case don't replay.\r
+             */\r
+            if (!sListenActive && (SENT_REPLY != isReplySent))\r
+            {\r
+                rc = FHS_REPLAY;\r
+            }\r
+#endif   /* !END_DEVICE */\r
+            break;\r
+\r
+#if defined(EXTENDED_API)\r
+        case LINK_REQ_UNLINK:\r
+            smpl_send_unlink_reply(frame);\r
+            break;\r
+#endif\r
+\r
+        default:\r
+            break;\r
+    }\r
+\r
+    /* keep compiler happy if I'm compiled as an End Device */\r
+    (void) isReplySent;\r
+\r
+    return rc;\r
+}\r
+\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/Components/nwk_applications/nwk_link.h b/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/Components/nwk_applications/nwk_link.h
new file mode 100755 (executable)
index 0000000..64ed033
--- /dev/null
@@ -0,0 +1,108 @@
+/**************************************************************************************************\r
+*  Filename:       nwk_link.h\r
+*  Revised:        $Date: 2008-12-10 16:52:14 -0800 (Wed, 10 Dec 2008) $\r
+*  Revision:       $Revision: 18596 $\r
+*  Author:         $Author: lfriedman $\r
+*\r
+*  Description:    This header file supports the SimpliciTI Join network application.\r
+*\r
+*  Copyright 2004-2007 Texas Instruments Incorporated. All rights reserved.\r
+*\r
+*  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+*  the terms of a software license agreement between the user who downloaded the software,\r
+*  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+*  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+*  License. The License limits your use, and you acknowledge, that the Software may not be\r
+*  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+*  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+*  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+*  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+*  perform, display or sell this Software and/or its documentation for any purpose.\r
+*\r
+*  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+*  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+*  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+*  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+*  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+*  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+*  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+*  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+*  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+*\r
+*  Should you have any questions regarding your right to use this Software,\r
+*  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+#ifndef NWK_LINK_H\r
+#define NWK_LINK_H\r
+\r
+/* Macros needed for protocol backward compatibility */\r
+#define LINK_LEGACY_MSG_LENGTH       8\r
+#define LINK_REPLY_LEGACY_MSG_LENGTH 3\r
+\r
+\r
+#define LINK_LISTEN_ON   0\r
+#define LINK_LISTEN_OFF  1\r
+\r
+/* application payload offsets\r
+ *    both */\r
+#define LB_REQ_OS         0\r
+#define LB_TID_OS         1\r
+\r
+/*    link frame */\r
+#define L_LINK_TOKEN_OS        2\r
+#define L_RMT_PORT_OS          6\r
+#define L_MY_RXTYPE_OS         7\r
+#define L_PROTOCOL_VERSION_OS  8\r
+#define L_CTR_OS               9\r
+/*    link reply frame */\r
+#define LR_RMT_PORT_OS         2\r
+#define LR_MY_RXTYPE_OS        3\r
+#define LR_CTR_OS              4\r
+\r
+/*    unlink frame */\r
+#define UL_RMT_PORT_OS        2\r
+/*    unlink reply frame */\r
+#define ULR_RESULT_OS         2\r
+\r
+/* change the following as protocol developed */\r
+#ifndef SMPL_SECURE\r
+#    define MAX_LINK_APP_FRAME      9\r
+#else\r
+#    define MAX_LINK_APP_FRAME      13\r
+#endif\r
+\r
+/* frame sizes */\r
+#ifndef SMPL_SECURE\r
+#    define LINK_FRAME_SIZE         9\r
+#    define LINK_REPLY_FRAME_SIZE   4\r
+#else\r
+#    define LINK_FRAME_SIZE         13\r
+#    define LINK_REPLY_FRAME_SIZE   8\r
+#endif\r
+#define UNLINK_FRAME_SIZE       3\r
+#define UNLINK_REPLY_FRAME_SIZE 3\r
+\r
+/* link requests\r
+ * NOTE: If aditional command codes are required do _not_ use the\r
+ *       value LINK_REPLY_LEGACY_MSG_LENGTH. This numeral is used\r
+ *       to guarantee that legacy Link frames (from before release\r
+ *       1.0.6) work correctly. Don't ask.\r
+ */\r
+\r
+#define LINK_REQ_LINK       1\r
+#define LINK_REQ_UNLINK     2\r
+\r
+/* prototypes */\r
+fhStatus_t nwk_processLink(mrfiPacket_t *);\r
+linkID_t nwk_getLocalLinkID(void);\r
+void nwk_linkInit(void);\r
+smplStatus_t nwk_link(linkID_t *);\r
+\r
+smplStatus_t nwk_unlink(linkID_t);\r
+void nwk_setLinkToken(uint32_t);\r
+void nwk_getLinkToken(uint32_t *);\r
+\r
+void nwk_setListenContext(uint8_t);\r
+\r
+#endif\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/Components/nwk_applications/nwk_mgmt.c b/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/Components/nwk_applications/nwk_mgmt.c
new file mode 100755 (executable)
index 0000000..51253ac
--- /dev/null
@@ -0,0 +1,357 @@
+/**************************************************************************************************\r
+*  Filename:       nwk_mgmt.c\r
+*  Revised:        $Date: 2009-01-06 15:45:54 -0800 (Tue, 06 Jan 2009) $\r
+*  Revision:       $Revision: 18697 $\r
+*  Author:         $Author: lfriedman $\r
+*\r
+*  Description:    This file supports the SimpliciTI Mgmt network application.\r
+*\r
+*  Copyright 2007-2009 Texas Instruments Incorporated. All rights reserved.\r
+*\r
+*  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+*  the terms of a software license agreement between the user who downloaded the software,\r
+*  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+*  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+*  License. The License limits your use, and you acknowledge, that the Software may not be\r
+*  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+*  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+*  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+*  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+*  perform, display or sell this Software and/or its documentation for any purpose.\r
+*\r
+*  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+*  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+*  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+*  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+*  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+*  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+*  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+*  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+*  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+*\r
+*  Should you have any questions regarding your right to use this Software,\r
+*  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+\r
+/******************************************************************************\r
+ * INCLUDES\r
+ */\r
+#include <string.h>\r
+#include "bsp.h"\r
+#include "mrfi.h"\r
+#include "nwk_types.h"\r
+#include "nwk_api.h"\r
+#include "nwk_frame.h"\r
+#include "nwk.h"\r
+#include "nwk_mgmt.h"\r
+#include "nwk_join.h"\r
+#include "nwk_globals.h"\r
+#include "nwk_QMgmt.h"\r
+\r
+/******************************************************************************\r
+ * MACROS\r
+ */\r
+\r
+/******************************************************************************\r
+ * CONSTANTS AND DEFINES\r
+ */\r
+\r
+/******************************************************************************\r
+ * TYPEDEFS\r
+ */\r
+\r
+/******************************************************************************\r
+ * LOCAL VARIABLES\r
+ */\r
+#ifndef ACCESS_POINT\r
+static addr_t const *sAPAddr = NULL;\r
+#else\r
+static uint8_t sSFMarker[NUM_STORE_AND_FWD_CLIENTS] = {0};\r
+#endif\r
+\r
+static volatile uint8_t sTid = 0;\r
+\r
+/******************************************************************************\r
+ * LOCAL FUNCTIONS\r
+ */\r
+static void smpl_send_mgmt_reply(mrfiPacket_t *);\r
+\r
+#ifdef ACCESS_POINT\r
+static void send_poll_reply(mrfiPacket_t *);\r
+\r
+#endif\r
+\r
+/******************************************************************************\r
+ * GLOBAL VARIABLES\r
+ */\r
+\r
+/******************************************************************************\r
+ * GLOBAL FUNCTIONS\r
+ */\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_mgmtInit\r
+ *\r
+ * @brief       Initialize Management functions.\r
+ *\r
+ * input parameters\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   void\r
+ */\r
+\r
+void nwk_mgmtInit(void)\r
+{\r
+    sTid = MRFI_RandomByte();\r
+\r
+#ifdef ACCESS_POINT\r
+    memset(&sSFMarker, 0x0, sizeof(sSFMarker));\r
+#endif\r
+\r
+    return;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_processMgmt\r
+ *\r
+ * @brief       Process Management frame. Just save the frame for the Management\r
+ *              app it it is a reply. If it isn't a reply, send the reply in this\r
+ *              thread.\r
+ *\r
+ * input parameters\r
+ * @param   frame   - pointer to frame to be processed\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   Keep frame for application, release frame, or replay frame.\r
+ */\r
+\r
+fhStatus_t nwk_processMgmt(mrfiPacket_t *frame)\r
+{\r
+    fhStatus_t rc;\r
+    uint8_t replyType;\r
+\r
+    /* If we sent this then this is the reply. Validate the\r
+     * packet for reception by client app. If we didn't send\r
+     * it then we are the target. send the reply.\r
+     */\r
+    if (SMPL_MY_REPLY == (replyType = nwk_isValidReply(frame, sTid, MB_APP_INFO_OS, MB_TID_OS)))\r
+    {\r
+        /* It's a match and it's a reply. Validate the received packet by\r
+         * returning a 1 so it can be received by the client app.\r
+         */\r
+        MRFI_PostKillSem();\r
+        rc = FHS_KEEP;\r
+    }\r
+#if !defined(END_DEVICE)\r
+    else if (SMPL_A_REPLY == replyType)\r
+    {\r
+        /* no match. if i'm not an ED this is a reply that should be passed on. */\r
+        rc = FHS_REPLAY;\r
+    }\r
+#endif  /* !END_DEVICE */\r
+    else\r
+    {\r
+        /* no, we didn't send it. send reply if it's intended for us */\r
+        if (!memcmp(MRFI_P_DST_ADDR(frame), nwk_getMyAddress(), NET_ADDR_SIZE))\r
+        {\r
+            smpl_send_mgmt_reply(frame);\r
+\r
+            /* we're done with the frame. */\r
+            rc = FHS_RELEASE;\r
+        }\r
+        else\r
+        {\r
+            rc = FHS_REPLAY;\r
+        }\r
+    }\r
+\r
+    (void) replyType; /* keep compiler happy */\r
+\r
+    return rc;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          smpl_send_mgmt_reply\r
+ *\r
+ * @brief       Send appropriate reply to Management frame.\r
+ *\r
+ * input parameters\r
+ * @param  frame  - Pointer to frame for which reply required.\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   void\r
+ */\r
+\r
+static void smpl_send_mgmt_reply(mrfiPacket_t *frame)\r
+{\r
+#ifdef ACCESS_POINT\r
+    /* what kind of management frame is this? */\r
+    switch (*(MRFI_P_PAYLOAD(frame) + F_APP_PAYLOAD_OS + MB_APP_INFO_OS))\r
+    {\r
+        case MGMT_REQ_POLL:\r
+            send_poll_reply(frame);\r
+            break;\r
+\r
+        default:\r
+            break;\r
+    }\r
+#endif  /* ACCESS_POINT */\r
+    return;\r
+}\r
+\r
+#ifdef ACCESS_POINT\r
+\r
+/******************************************************************************\r
+ * @fn          send_poll_reply\r
+ *\r
+ * @brief       Send reply to polling frame.\r
+ *\r
+ * input parameters\r
+ * @param  frame  - Pointer to frame for which reply required.\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   void\r
+ */\r
+\r
+static void send_poll_reply(mrfiPacket_t *frame)\r
+{\r
+    uint8_t msgtid = *(MRFI_P_PAYLOAD(frame) + F_APP_PAYLOAD_OS + MB_TID_OS);\r
+    frameInfo_t    *pOutFrame;\r
+    sfClientInfo_t *pClientInfo;\r
+    uint8_t loc;\r
+\r
+    /* Make sure this guy is really a client. We can tell from the source address. */\r
+    if (!(pClientInfo = nwk_isSandFClient(MRFI_P_SRC_ADDR(frame), &loc)))\r
+    {\r
+        /* TODO: maybe send an error frame? */\r
+        return;\r
+    }\r
+\r
+    /* If we have to resync the TID then do it based on the first\r
+     * poll frame we see\r
+     */\r
+    if (!sSFMarker[loc])\r
+    {\r
+        /* If the marker flag is null then it has been initialized, i.e.,\r
+         * there has been a reset. In this case infer that we need to update\r
+         * a (probably) stale last TID. The test will always be true the first\r
+         * time through after a client is established even when an NV restore\r
+         * did not take place but this does no harm.\r
+         */\r
+        pClientInfo->lastTID = msgtid;\r
+        sSFMarker[loc]       = 1;\r
+    }\r
+\r
+    /* If we've seen this poll frame before ignore it. Otherwise we\r
+     * may send a stored frame when we shouldn't.\r
+     */\r
+    else if (nwk_checkAppMsgTID(pClientInfo->lastTID, msgtid))\r
+    {\r
+        pClientInfo->lastTID = msgtid;\r
+    }\r
+    else\r
+    {\r
+        return;\r
+    }\r
+\r
+    if (pOutFrame = nwk_getSandFFrame(frame, M_POLL_PORT_OS))\r
+    {\r
+        /* We need to adjust the order in the queue in this case. Currently\r
+         * we know it is in the input queue and that this adjustment is safe\r
+         * because we're in an ISR thread. This is a fragile fix, though, and\r
+         * should be revisited when time permits.\r
+         */\r
+        nwk_QadjustOrder(INQ, pOutFrame->orderStamp);\r
+\r
+        /* reset hop count... */\r
+        PUT_INTO_FRAME(MRFI_P_PAYLOAD(&pOutFrame->mrfiPkt), F_HOP_COUNT, MAX_HOPS_FROM_AP);\r
+        /* It's gonna be a forwarded frame. */\r
+        PUT_INTO_FRAME(MRFI_P_PAYLOAD(&pOutFrame->mrfiPkt), F_FWD_FRAME, 0x80);\r
+\r
+        nwk_sendFrame(pOutFrame, MRFI_TX_TYPE_FORCED);\r
+    }\r
+    else\r
+    {\r
+        nwk_SendEmptyPollRspFrame(frame);\r
+    }\r
+\r
+    return;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_resetSFMarker\r
+ *\r
+ * @brief       Reset S&F cklient marker so the TIDs resync.\r
+ *\r
+ * input parameters\r
+ * @param  idx  - index of the client that should be reset.\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   void\r
+ */\r
+\r
+void nwk_resetSFMarker(uint8_t idx)\r
+{\r
+    sSFMarker[idx] = 0;\r
+\r
+    return;\r
+}\r
+\r
+#else  /* ACCESS_POINT */\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_poll\r
+ *\r
+ * @brief       Poll S&F server for any waiting frames.\r
+ *\r
+ * input parameters\r
+ * @param  port  - Port on peer.\r
+ * @param  addr  - SimpliciTI address of peer.\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   SMPL_SUCCESS\r
+ *           SMPL_NO_AP_ADDRESS - We don't know Access Point's address\r
+ *           SMPL_NOMEM         - no room in output frame queue\r
+ *           SMPL_TX_CCA_FAIL   - CCA failure\r
+ */\r
+\r
+smplStatus_t nwk_poll(uint8_t port, uint8_t *addr)\r
+{\r
+    uint8_t msg[MGMT_POLL_FRAME_SIZE];\r
+    ioctlRawSend_t send;\r
+\r
+    msg[MB_APP_INFO_OS] = MGMT_REQ_POLL;\r
+    msg[MB_TID_OS]      = sTid;\r
+    msg[M_POLL_PORT_OS] = port;\r
+    memcpy(msg + M_POLL_ADDR_OS, addr, NET_ADDR_SIZE);\r
+\r
+    /* it's OK to increment the TID here because the reply will not be\r
+     * matched based on this number. The reply to the poll comes back\r
+     * to the client port, not the Management port.\r
+     */\r
+    sTid++;\r
+\r
+    if (!sAPAddr)\r
+    {\r
+        sAPAddr = nwk_getAPAddress();\r
+        if (!sAPAddr)\r
+        {\r
+            return SMPL_NO_AP_ADDRESS;\r
+        }\r
+    }\r
+    send.addr = (addr_t *)sAPAddr;\r
+    send.msg  = msg;\r
+    send.len  = sizeof(msg);\r
+    send.port = SMPL_PORT_MGMT;\r
+\r
+    return SMPL_Ioctl(IOCTL_OBJ_RAW_IO, IOCTL_ACT_WRITE, &send);\r
+}\r
+\r
+#endif /* ACCESS_POINT */\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/Components/nwk_applications/nwk_mgmt.h b/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/Components/nwk_applications/nwk_mgmt.h
new file mode 100755 (executable)
index 0000000..13bff76
--- /dev/null
@@ -0,0 +1,68 @@
+/**************************************************************************************************\r
+*  Filename:       nwk_mgmt.h\r
+*  Revised:        $Date: 2009-01-06 15:45:54 -0800 (Tue, 06 Jan 2009) $\r
+*  Revision:       $Revision: 18697 $\r
+*  Author:         $Author: lfriedman $\r
+*\r
+*  Description:    This header file supports the SimpliciTI Mgmt network application.\r
+*\r
+*  Copyright 2004-2007 Texas Instruments Incorporated. All rights reserved.\r
+*\r
+*  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+*  the terms of a software license agreement between the user who downloaded the software,\r
+*  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+*  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+*  License. The License limits your use, and you acknowledge, that the Software may not be\r
+*  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+*  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+*  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+*  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+*  perform, display or sell this Software and/or its documentation for any purpose.\r
+*\r
+*  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+*  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+*  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+*  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+*  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+*  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+*  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+*  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+*  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+*\r
+*  Should you have any questions regarding your right to use this Software,\r
+*  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+\r
+#ifndef NWK_MGMT_H\r
+#define NWK_MGMT_H\r
+\r
+/* MGMT frame application requests */\r
+#define  MGMT_REQ_POLL        0x01\r
+\r
+/* change the following as protocol developed */\r
+#define MAX_MGMT_APP_FRAME    7\r
+\r
+/* application payload offsets\r
+ *    both */\r
+#define MB_APP_INFO_OS           0\r
+#define MB_TID_OS                1\r
+\r
+/*    Poll frame */\r
+#define M_POLL_PORT_OS          2\r
+#define M_POLL_ADDR_OS          3\r
+\r
+/* change the following as protocol developed */\r
+#define MAX_MGMT_APP_FRAME    7\r
+\r
+/* frame sizes */\r
+#define MGMT_POLL_FRAME_SIZE  7\r
+\r
+/* prototypes */\r
+void nwk_mgmtInit(void);\r
+fhStatus_t nwk_processMgmt(mrfiPacket_t *);\r
+\r
+smplStatus_t nwk_poll(uint8_t, uint8_t *);\r
+void nwk_resetSFMarker(uint8_t);\r
+\r
+#endif\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/Components/nwk_applications/nwk_ping.c b/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/Components/nwk_applications/nwk_ping.c
new file mode 100755 (executable)
index 0000000..a257e62
--- /dev/null
@@ -0,0 +1,323 @@
+/**************************************************************************************************\r
+*  Filename:       nwk_ping.c\r
+*  Revised:        $Date: 2009-01-18 16:01:08 -0800 (Sun, 18 Jan 2009) $\r
+*  Revision:       $Revision: 18796 $\r
+*  Author:         $Author: lfriedman $\r
+*\r
+*  Description:    This file supports the SimpliciTI Ping network application.\r
+*\r
+*  Copyright 2007-2009 Texas Instruments Incorporated. All rights reserved.\r
+*\r
+*  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+*  the terms of a software license agreement between the user who downloaded the software,\r
+*  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+*  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+*  License. The License limits your use, and you acknowledge, that the Software may not be\r
+*  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+*  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+*  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+*  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+*  perform, display or sell this Software and/or its documentation for any purpose.\r
+*\r
+*  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+*  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+*  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+*  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+*  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+*  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+*  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+*  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+*  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+*\r
+*  Should you have any questions regarding your right to use this Software,\r
+*  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+\r
+/******************************************************************************\r
+ * INCLUDES\r
+ */\r
+#include <string.h>\r
+#include "bsp.h"\r
+#include "mrfi.h"\r
+#include "nwk_types.h"\r
+#include "nwk_frame.h"\r
+#include "nwk.h"\r
+#include "nwk_ping.h"\r
+#include "nwk_globals.h"\r
+#include "nwk_api.h"\r
+#include "nwk_freq.h"\r
+#include "nwk_security.h"\r
+\r
+/******************************************************************************\r
+ * MACROS\r
+ */\r
+\r
+/******************************************************************************\r
+ * CONSTANTS AND DEFINES\r
+ */\r
+\r
+/******************************************************************************\r
+ * TYPEDEFS\r
+ */\r
+\r
+/******************************************************************************\r
+ * LOCAL VARIABLES\r
+ */\r
+\r
+static volatile uint8_t sTid = 0;\r
+\r
+/******************************************************************************\r
+ * LOCAL FUNCTIONS\r
+ */\r
+static void smpl_send_ping_reply(mrfiPacket_t *);\r
+static void handlePingRequest(mrfiPacket_t *);\r
+\r
+/******************************************************************************\r
+ * GLOBAL VARIABLES\r
+ */\r
+\r
+/******************************************************************************\r
+ * GLOBAL FUNCTIONS\r
+ */\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_pingInit\r
+ *\r
+ * @brief       Initialize Ping application.\r
+ *\r
+ * input parameters\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   void\r
+ */\r
+\r
+void nwk_pingInit(void)\r
+{\r
+    sTid = MRFI_RandomByte();\r
+\r
+    return;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_ping\r
+ *\r
+ * @brief       Called from the application level to ping a peer. A small\r
+ *              payload is sent that includes a tid to detect correct reply.\r
+ *              Caller does not supply payload.\r
+ *\r
+ * input parameters\r
+ * @param   lid     - Link ID representing peer to ping\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   SMPL_SUCCESS   valid reply received\r
+ *           SMPL_TIMEOUT   no valid reply received\r
+ *           SMPL_NO_CHANNEL  no channels returned on a scan\r
+ */\r
+\r
+smplStatus_t nwk_ping(linkID_t lid)\r
+{\r
+    connInfo_t  *pCInfo   = nwk_getConnInfo(lid);\r
+    smplStatus_t rc       = SMPL_BAD_PARAM;\r
+    uint8_t done     = 0;\r
+    uint8_t repeatIt = 2;\r
+    uint8_t msg[MAX_PING_APP_FRAME];\r
+    uint8_t radioState = MRFI_GetRadioState();\r
+\r
+    union\r
+    {\r
+        ioctlRawSend_t send;\r
+        ioctlRawReceive_t recv;\r
+    } ioctl_info;\r
+\r
+    if (!pCInfo || (SMPL_LINKID_USER_UUD == lid))\r
+    {\r
+        /* either link ID bogus or tried to ping the unconnected user datagram link ID. */\r
+        return rc;\r
+    }\r
+\r
+    do\r
+    {\r
+#if defined(FREQUENCY_AGILITY) && !defined(ACCESS_POINT)\r
+        uint8_t i, numChan;\r
+        freqEntry_t channels[NWK_FREQ_TBL_SIZE];\r
+\r
+        if (repeatIt == 2)\r
+        {\r
+            /* If FA enabled, first time through set up so that the 'for'\r
+             * loop checks the current channel. This saves time (no scan)\r
+             * and is very likely to succeed. Populate the proper strucure.\r
+             */\r
+            SMPL_Ioctl(IOCTL_OBJ_FREQ, IOCTL_ACT_GET, channels);\r
+            numChan = 1;\r
+        }\r
+        else\r
+        {\r
+            /* If we get here we must scan for the channel we're now on */\r
+            if (!(numChan = nwk_scanForChannels(channels)))\r
+            {\r
+                return SMPL_NO_CHANNEL;\r
+            }\r
+        }\r
+        /* Either we scan next time through or we're done */\r
+        repeatIt--;\r
+\r
+        /* this loop Pings on each channel (probably only 1) looking\r
+         * for peer.\r
+         */\r
+        for (i = 0; i < numChan && !done; ++i)\r
+        {\r
+            nwk_setChannel(&channels[i]);\r
+#else\r
+        {\r
+            repeatIt = 0;\r
+#endif      /* defined(FREQUENCY_AGILITY) && !defined(ACCESS_POINT) */\r
+\r
+            ioctl_info.send.addr = (addr_t *)pCInfo->peerAddr;\r
+            ioctl_info.send.msg  = msg;\r
+            ioctl_info.send.len  = sizeof(msg);\r
+            ioctl_info.send.port = SMPL_PORT_PING;\r
+\r
+            /* fill in msg */\r
+            msg[PB_REQ_OS] = PING_REQ_PING;\r
+            msg[PB_TID_OS] = sTid;\r
+\r
+            SMPL_Ioctl(IOCTL_OBJ_RAW_IO, IOCTL_ACT_WRITE, &ioctl_info.send);\r
+\r
+            ioctl_info.recv.port = SMPL_PORT_PING;\r
+            ioctl_info.recv.msg  = msg;\r
+            ioctl_info.recv.addr = 0;\r
+\r
+            NWK_CHECK_FOR_SETRX(radioState);\r
+            NWK_REPLY_DELAY();\r
+            NWK_CHECK_FOR_RESTORE_STATE(radioState);\r
+\r
+            if (SMPL_SUCCESS == SMPL_Ioctl(IOCTL_OBJ_RAW_IO, IOCTL_ACT_READ, &ioctl_info.recv))\r
+            {\r
+                repeatIt = 0;\r
+                done     = 1;\r
+                sTid++; /* guard against duplicates */\r
+            }\r
+        }\r
+    } while (repeatIt);\r
+\r
+    return done ? SMPL_SUCCESS : SMPL_TIMEOUT;\r
+\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          smpl_send_ping_reply\r
+ *\r
+ * @brief       Send a reply to a ping request.\r
+ *\r
+ * input parameters\r
+ * @param   frame     - pointer to frame containing request\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   void\r
+ */\r
+\r
+static void smpl_send_ping_reply(mrfiPacket_t *frame)\r
+{\r
+    frameInfo_t *pOutFrame;\r
+\r
+    /* Build the reply frame. The application payload is the one included in the\r
+     * received frame payload.\r
+     */\r
+    if (pOutFrame =\r
+            nwk_buildFrame(SMPL_PORT_PING, MRFI_P_PAYLOAD(frame) + F_APP_PAYLOAD_OS,\r
+                           MRFI_GET_PAYLOAD_LEN(frame) - F_APP_PAYLOAD_OS, MAX_HOPS))\r
+    {\r
+        /* destination address is the source adddress of the received frame. */\r
+        memcpy(MRFI_P_DST_ADDR(&pOutFrame->mrfiPkt), MRFI_P_SRC_ADDR(frame), NET_ADDR_SIZE);\r
+\r
+        /* turn on the reply bit in the application payload */\r
+        *(MRFI_P_PAYLOAD(&pOutFrame->mrfiPkt) + F_APP_PAYLOAD_OS + PB_REQ_OS) |= NWK_APP_REPLY_BIT;\r
+#ifdef SMPL_SECURE\r
+        nwk_setSecureFrame(&pOutFrame->mrfiPkt, MRFI_GET_PAYLOAD_LEN(frame) - F_APP_PAYLOAD_OS, 0);\r
+#endif  /* SMPL_SECURE */\r
+        nwk_sendFrame(pOutFrame, MRFI_TX_TYPE_FORCED);\r
+    }\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_processPing\r
+ *\r
+ * @brief       Ping network application frame handler.\r
+ *\r
+ * input parameters\r
+ * @param   frame   - pointer to frame in question\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return    Keep frame for application, release frame, or replay frame.\r
+ */\r
+\r
+fhStatus_t nwk_processPing(mrfiPacket_t *frame)\r
+{\r
+    fhStatus_t rc;\r
+    uint8_t replyType;\r
+\r
+    /* If we sent this then this is the reply. Validate the\r
+     * packet for reception by client app. If we didn't send\r
+     * it then we are the target. Send the reply.\r
+     */\r
+    replyType = nwk_isValidReply(frame, sTid, PB_REQ_OS, PB_TID_OS);\r
+    if (SMPL_MY_REPLY == replyType)\r
+    {\r
+        /* It's a match and it's a reply. Validate the received packet by\r
+         * returning a 1 so it can be received by the client app.\r
+         */\r
+        MRFI_PostKillSem();\r
+        rc = FHS_KEEP;\r
+    }\r
+#if !defined(END_DEVICE)\r
+    else if (SMPL_A_REPLY == replyType)\r
+    {\r
+        /* no match. If I'm not an ED this is a reply that should be passed on. */\r
+        rc = FHS_REPLAY;\r
+    }\r
+#endif  /* !END_DEVICE */\r
+    else\r
+    {\r
+        /* No, we didn't send it. Send reply assuming it's a Ping intended for us. */\r
+        handlePingRequest(frame);\r
+\r
+        rc = FHS_RELEASE;\r
+    }\r
+\r
+    return rc;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          handlePingRequest\r
+ *\r
+ * @brief       Dispatches handler for specfic Ping request\r
+ *\r
+ * input parameters\r
+ *\r
+ * @param   frame - Ping frame received\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   void\r
+ */\r
+\r
+static void handlePingRequest(mrfiPacket_t *frame)\r
+{\r
+    switch (*(MRFI_P_PAYLOAD(frame) + F_APP_PAYLOAD_OS))\r
+    {\r
+        case PING_REQ_PING:\r
+            smpl_send_ping_reply(frame);\r
+            break;\r
+\r
+        default:\r
+            break;\r
+    }\r
+\r
+    return;\r
+}\r
+\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/Components/nwk_applications/nwk_ping.h b/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/Components/nwk_applications/nwk_ping.h
new file mode 100755 (executable)
index 0000000..6f49bbf
--- /dev/null
@@ -0,0 +1,59 @@
+/**************************************************************************************************\r
+*  Filename:       nwk_ping.h\r
+*  Revised:        $Date: 2008-05-14 14:22:31 -0700 (Wed, 14 May 2008) $\r
+*  Revision:       $Revision: 17075 $\r
+*  Author:         $Author: lfriedman $\r
+*\r
+*  Description:    This file supports the SimpliciTI Ping network application.\r
+*\r
+*  Copyright 2004-2007 Texas Instruments Incorporated. All rights reserved.\r
+*\r
+*  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+*  the terms of a software license agreement between the user who downloaded the software,\r
+*  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+*  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+*  License. The License limits your use, and you acknowledge, that the Software may not be\r
+*  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+*  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+*  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+*  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+*  perform, display or sell this Software and/or its documentation for any purpose.\r
+*\r
+*  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+*  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+*  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+*  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+*  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+*  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+*  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+*  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+*  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+*\r
+*  Should you have any questions regarding your right to use this Software,\r
+*  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+\r
+#ifndef NWK_PING_H\r
+#define NWK_PING_H\r
+\r
+/* change the following as protocol developed */\r
+#define MAX_PING_APP_FRAME    2\r
+\r
+/* application payload offsets\r
+ *    both */\r
+#define PB_REQ_OS     0\r
+#define PB_TID_OS     1\r
+\r
+\r
+/* ping requests */\r
+#define PING_REQ_PING       1\r
+\r
+/* prototypes */\r
+fhStatus_t nwk_processPing(mrfiPacket_t *);\r
+void nwk_pingInit(void);\r
+\r
+smplStatus_t nwk_ping(linkID_t);\r
+\r
+\r
+#endif\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/Components/nwk_applications/nwk_security.c b/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/Components/nwk_applications/nwk_security.c
new file mode 100755 (executable)
index 0000000..d53a558
--- /dev/null
@@ -0,0 +1,565 @@
+/**************************************************************************************************\r
+*  Filename:       nwk_security.c\r
+*  Revised:        $Date: 2009-01-20 14:05:46 -0800 (Tue, 20 Jan 2009) $\r
+*  Revision:       $Revision: 18816 $\r
+*  Author:         $Author: lfriedman $\r
+*\r
+*  Description:    This file supports the SimpliciTI Security network application.\r
+*\r
+*  Copyright 2008-2009 Texas Instruments Incorporated. All rights reserved.\r
+*\r
+*  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+*  the terms of a software license agreement between the user who downloaded the software,\r
+*  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+*  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+*  License. The License limits your use, and you acknowledge, that the Software may not be\r
+*  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+*  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+*  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+*  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+*  perform, display or sell this Software and/or its documentation for any purpose.\r
+*\r
+*  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+*  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+*  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+*  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+*  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+*  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+*  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+*  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+*  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+*\r
+*  Should you have any questions regarding your right to use this Software,\r
+*  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+/******************************************************************************\r
+ * INCLUDES\r
+ */\r
+\r
+#include <string.h>     /* needed for NULL */\r
+#include "mrfi.h"\r
+#include "nwk_types.h"\r
+#include "nwk_security.h"\r
+#include "nwk_frame.h"\r
+#include "nwk.h"\r
+\r
+#ifdef SMPL_SECURE\r
+\r
+/*                   *** GENERAL SECURITY OUTLINE ***\r
+ *\r
+ * We are using XTEA (eXtended Tiny Encryption Algorithm) with a fixed\r
+ * number of rounds (32). We have removed the parameters from the API\r
+ * we harvested from the public domain.\r
+ *\r
+ * We are using a CTR-like mode. We use the 64-bit block cipher function of the\r
+ * XTEA code to encipher a concatenation of the 32-bit initialization vector and\r
+ * a 32-bit counter that increments each block. We encrypt using a fixed 128-bit\r
+ * key. The resulting 64-bit output is XOR'ed with the message. If the message is\r
+ * longer than 64 bits we encipher the next block (incrementing the counter) and\r
+ * continue until the message is exhausted. If the last cipher block is longer\r
+ * than the message we simply discard the remaining cipher block.\r
+ */\r
+\r
+\r
+/******************************************************************************\r
+ * MACROS\r
+ */\r
+\r
+/******************************************************************************\r
+ * CONSTANTS AND DEFINES\r
+ */\r
+\r
+/* The counter can be off by quite a bit because the number of cipher\r
+ * blocks can easily be more than 1 per frame. Value limited to a\r
+ * maximum of 255.\r
+ */\r
+#    define CTR_WINDOW  255\r
+\r
+#    if (CTR_WINDOW > 255) || (CTR_WINDOW < 0)\r
+#        error ERROR: 0 <= CTR_WINDOW < 256\r
+#    endif\r
+\r
+/* Number of rounds for XTEA algorithm. A parameter in the public domain code\r
+ * but we fix it here at 32.\r
+ */\r
+#    define NUM_ROUNDS  32\r
+\r
+/* Key and cipher block size constants */\r
+#    define SMPL_KEYSIZE_BYTES    16\r
+#    define SMPL_KEYSIZE_LONGS     4\r
+\r
+/******************************************************************************\r
+ * TYPEDEFS\r
+ */\r
+/* Union used to access key as both a string and as unsigned longs */\r
+typedef union\r
+{\r
+    uint8_t keyS[SMPL_KEYSIZE_BYTES];\r
+    uint32_t keyL[SMPL_KEYSIZE_LONGS];\r
+} key_t;\r
+\r
+\r
+/******************************************************************************\r
+ * LOCAL VARIABLES\r
+ */\r
+/* 32-bit Initialization vector */\r
+static uint32_t const sIV = 0x87654321;\r
+\r
+/* 128-bit (16 byte) key. Initialized as string but fetched and used in XTEA\r
+ * encryption as 4 unsigned longs. Endianess could count if the peers are on\r
+ * two different MCUs. Endianess is rectified in initialization code.\r
+ *\r
+ * Initialization _MUST_ be done as a string (or character array). Though it\r
+ * won't matter how the initialization is done if both peers are the same\r
+ * endianness, good prectice will initialize these as a string (or character\r
+ * array) so that the endianess reconciliation works properly for all cases.\r
+ */\r
+static key_t sKey = {"SimpliciTI's Key"};\r
+\r
+/* Constant set as an authentication code. Note that since it is a\r
+ * fixed value as opposed to a hash of the message it does not provide\r
+ * an integrity check. It will only differentiate two message encryptions\r
+ * with the same LSB but different MSB components. Thus it helps guard\r
+ * against replays.\r
+ */\r
+static secMAC_t const sMAC = 0xA5;\r
+\r
+/* This is the 64-bit cipher block target. It is this 64-bit block that\r
+ * is XOR'ed with the actual message to be encrypted.\r
+ */\r
+static uint32_t sMsg[2] = {0, 0};\r
+\r
+/******************************************************************************\r
+ * LOCAL FUNCTIONS\r
+ */\r
+static secFCS_t calcFCS(uint8_t *, uint8_t);\r
+static void msg_encipher(uint8_t *, uint8_t, uint32_t *);\r
+static void msg_decipher(uint8_t *, uint8_t, uint32_t *);\r
+static void xtea_encipher(void);\r
+\r
+#endif  /* SMPL_SECURE */\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_securityInit\r
+ *\r
+ * @brief       Initialize Security network application.\r
+ *\r
+ * input parameters\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return      void\r
+ */\r
+\r
+void nwk_securityInit(void)\r
+{\r
+#ifdef SMPL_SECURE\r
+    uint8_t i;\r
+\r
+    /* The key is set as a string. But the XTEA routines operate on 32-bit\r
+     * unsigned longs. Endianess should be taken into account and we do that\r
+     * here by treating the key as being an array of unsigned longs in\r
+     * network order.\r
+     */\r
+    for (i = 0; i < sizeof(sKey.keyL) / sizeof(uint32_t); ++i)\r
+    {\r
+        sKey.keyL[i] = ntohl(sKey.keyL[i]);\r
+    }\r
+\r
+#endif  /* SMPL_SECURE */\r
+    return;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_processSecurity\r
+ *\r
+ * @brief       Security network application frame handler.\r
+ *\r
+ * input parameters\r
+ * @param   frame   - pointer to frame in question\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return    Keep frame for application, release frame, or replay frame.\r
+ */\r
+\r
+fhStatus_t nwk_processSecurity(mrfiPacket_t *frame)\r
+{\r
+    return FHS_RELEASE;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          msg_encipher\r
+ *\r
+ * @brief       Encipher a message using the XTEA algorithm and the modified\r
+ *              CTR mode method.\r
+ *\r
+ * input parameters\r
+ * @param   msg      - pointer to message to encipher\r
+ * @param   len      - length of message\r
+ * @param   cntStart - pointer to the counter used in the cipher block.\r
+ *\r
+ * output parameters\r
+ * @param   cntStart - counter is updated during encryption.\r
+ *\r
+ * @return      void\r
+ */\r
+#ifdef SMPL_SECURE\r
+static void msg_encipher(uint8_t *msg, uint8_t len, uint32_t *cntStart)\r
+{\r
+    uint8_t i, idx, done;\r
+    uint8_t *mptr = (uint8_t *)&sMsg[0];\r
+    uint32_t ctr;\r
+\r
+    if ((NULL == msg) || !len)\r
+    {\r
+        return;\r
+    }\r
+\r
+    /* set local counter from input */\r
+    ctr = *cntStart;\r
+\r
+    idx  = 0;\r
+    done = 0;\r
+    do\r
+    {\r
+        /* Set block to be enciphered. 1st 32 bits are the IV. The second\r
+         * 32 bits are the current CTR value.\r
+         */\r
+        sMsg[0] = sIV;\r
+        sMsg[1] = ctr;\r
+        /* encrypt */\r
+        xtea_encipher();\r
+        /* increment counter for next time. */\r
+        ctr++;\r
+\r
+        /* XOR ciphered block with message to be sent. Only operate\r
+         * up to and including the last message byte which may not\r
+         * be on a cipher block boundary (64 bits == 8 bytes).\r
+         */\r
+        for (i = 0; i < sizeof(sMsg) && idx < len; ++i, ++idx)\r
+        {\r
+            msg[idx] ^= mptr[i];\r
+        }\r
+\r
+        if (idx >= len)\r
+        {\r
+            /* we're done */\r
+            done = 1;\r
+        }\r
+    } while (!done);\r
+\r
+    /* return counter value start for next time */\r
+    *cntStart = ctr;\r
+\r
+    return;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          msg_decipher\r
+ *\r
+ * @brief       Decipher a message using the XTEA algorithm and the modified\r
+ *              CTR mode method.\r
+ *\r
+ * input parameters\r
+ * @param   msg      - pointer to message to decipher\r
+ * @param   len      - length of message\r
+ * @param   cntStart - pointer to the counter used in the cipher block.\r
+ *\r
+ * output parameters\r
+ * @param   cntStart - counter is updated during decryption.\r
+ *\r
+ * @return      void\r
+ */\r
+\r
+static void msg_decipher(uint8_t *msg, uint8_t len, uint32_t *cntStart)\r
+{\r
+    msg_encipher(msg, len, cntStart);\r
+\r
+    return;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          xtea_encipher\r
+ *\r
+ * @brief       XTEA encipher algorithm. Calling arguments removed from public\r
+ *              domain code and static-scope values used instead.\r
+ *\r
+ * input parameters\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return      void\r
+ */\r
+\r
+void xtea_encipher(void)\r
+{\r
+    uint32_t v0 = sMsg[0], v1 = sMsg[1];\r
+    uint16_t i;\r
+    uint32_t sum = 0, delta = 0x9E3779B9;\r
+\r
+    for (i = 0; i < NUM_ROUNDS; i++)\r
+    {\r
+        v0  += (((v1 << 4) ^ (v1 >> 5)) + v1) ^ (sum + sKey.keyL[sum & 3]);\r
+        sum += delta;\r
+        v1  += (((v0 << 4) ^ (v0 >> 5)) + v0) ^ (sum + sKey.keyL[(sum >> 11) & 3]);\r
+    }\r
+\r
+    sMsg[0] = v0;\r
+    sMsg[1] = v1;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_setSecureFrame\r
+ *\r
+ * @brief       Called from NWK to secure a frame.\r
+ *\r
+ * input parameters\r
+ * @param   frame   - pointer to frame to secure\r
+ * @param   msglen  - length of message\r
+ * @param   ctr     - pointer to the counter used in the cipher block. This will\r
+ *                    be NULL if a network application is sending a frame. Since\r
+ *                    these are not connection-based there is no counter sync\r
+ *                    issue but we still need a counter value. A random value\r
+ *                    is used.\r
+ *\r
+ * output parameters\r
+ * @param   cntStart - counter is updated during encryption.\r
+ *\r
+ * @return      void\r
+ */\r
+\r
+void nwk_setSecureFrame(mrfiPacket_t *frame, uint8_t msglen, uint32_t *ctr)\r
+{\r
+    uint32_t locCnt;\r
+\r
+    /* If an encrypted frame is to be sent to a non-connection based port use a\r
+     * random number as the lsb counter value. In this case only the lsb is used\r
+     * for a counter value during decryption. Not as secure but there are still\r
+     * the 32 bits in the IV.\r
+     */\r
+    locCnt = ctr ? *ctr : MRFI_RandomByte();\r
+\r
+    /* place counter value into frame */\r
+    PUT_INTO_FRAME(MRFI_P_PAYLOAD(frame), F_SEC_CTR_OS, (uint8_t)(locCnt & 0xFF));\r
+\r
+    /* Put MAC value in */\r
+    nwk_putNumObjectIntoMsg((void *)&sMAC, (void *)(MRFI_P_PAYLOAD(frame) + F_SEC_MAC_OS),\r
+                            sizeof(secMAC_t));\r
+\r
+    /* Put FCS value in */\r
+    {\r
+        secFCS_t fcs = calcFCS(MRFI_P_PAYLOAD(frame) + F_SEC_MAC_OS, msglen + sizeof(secMAC_t));\r
+\r
+        nwk_putNumObjectIntoMsg((void *)&fcs, (void *)(MRFI_P_PAYLOAD(\r
+                                                           frame) + F_SEC_ICHK_OS), sizeof(secFCS_t));\r
+    }\r
+\r
+    /* Encrypt frame */\r
+    msg_encipher(MRFI_P_PAYLOAD(\r
+                     frame) + F_SEC_ICHK_OS, msglen + sizeof(secMAC_t) + sizeof(secFCS_t), &locCnt);\r
+\r
+    /* Set the Encryption bit */\r
+    PUT_INTO_FRAME(MRFI_P_PAYLOAD(frame), F_ENCRYPT_OS, F_ENCRYPT_OS_MSK);\r
+\r
+    /* Update the counter if it was a "real" counter. */\r
+    if (ctr)\r
+    {\r
+        *ctr = locCnt;\r
+    }\r
+\r
+    return;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          calcFCS\r
+ *\r
+ * @brief       Calculate the frame check sequence. Currently it's just a\r
+ *              cumulative XOR of each byte starting with the MAC byte. The\r
+ *              FCS is placed in front of the MAC after the counter hint and is\r
+ *              included in the encryption.\r
+ *\r
+ * input parameters\r
+ * @param   msg      - pointer to message\r
+ * @param   len      - length of message\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return      Returns the FCS using the typedef.\r
+ */\r
+\r
+static secFCS_t calcFCS(uint8_t *msg, uint8_t len)\r
+{\r
+    uint8_t i;\r
+    secFCS_t result = 0;\r
+\r
+    for (i = 0; i < len; ++i)\r
+    {\r
+        result ^= *(msg + i);\r
+    }\r
+\r
+    return result;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_getSecureFrame\r
+ *\r
+ * @brief       Called from NWK to get a secure a frame and decrypt.\r
+ *\r
+ * input parameters\r
+ * @param   frame    - pointer to frame containing encrypted message\r
+ * @param   msglen   - length of message\r
+ * @param   ctr      - pointer to the counter used in the cipher block. This will\r
+ *                     be NULL if a network applicaiton is getting a frame. Since\r
+ *                     these are not connection-nbased there is no counter sync\r
+ *                     issue but we still need a counter value.\r
+ *\r
+ * output parameters\r
+ * @param   cntStart - counter is updated during decryption. If decryption fails\r
+ *                     this value is not changed.\r
+ *\r
+ * @return      Returns non-zero if frame decryption is valid, otherwise returns 0.\r
+ */\r
+\r
+uint8_t nwk_getSecureFrame(mrfiPacket_t *frame, uint8_t msglen, uint32_t *ctr)\r
+{\r
+    uint8_t rc = 1;\r
+    uint8_t done = 0;\r
+    uint8_t cntHint = GET_FROM_FRAME(MRFI_P_PAYLOAD(frame), F_SEC_CTR_OS);\r
+    uint32_t locCnt, frameCnt;\r
+\r
+    /* Construct proposed CTR values */\r
+\r
+    /* Just like encryption, we may be talking to a non-connection based\r
+     * peer in which case the counter value is represented by the lsb byte\r
+     * conveyed in the frame.\r
+     */\r
+    locCnt = ctr ? *ctr : cntHint;\r
+\r
+    frameCnt = (locCnt & 0xFFFFFF00) + cntHint;\r
+\r
+    do\r
+    {\r
+        /* See if counters match */\r
+        if (locCnt == frameCnt)\r
+        {\r
+            /* When the counters appear to match is the only time we actually decipher\r
+             * the message. It is the only time we can do so since out-of-sync lsb counter\r
+             * values guarantees that something is wrong somewhere. Decryption is successful\r
+             * only if the MAC and FCS values match. The message is left as-is after the\r
+             * decipher attempt. Either it appears valid or is doesn't and is discarded.\r
+             * There is no recovery attempt if the counters match but the MAC or FCS do\r
+             * not. It is considered a rogue message.\r
+             */\r
+            msg_decipher(MRFI_P_PAYLOAD(frame) + F_SEC_ICHK_OS, msglen - 1, &locCnt);\r
+\r
+            /* Get MAC and make sure it matches. A failure can occur if a replayed frame happens\r
+             * to have the correct counter sync value but was encoded with the wrong complete\r
+             * counter value. Otherwise the MAC values must match when the counter values are equal.\r
+             */\r
+            {\r
+                secMAC_t mac;\r
+\r
+                nwk_getNumObjectFromMsg((void *)(MRFI_P_PAYLOAD(\r
+                                                     frame) + F_SEC_MAC_OS), (void *)&mac,\r
+                                        sizeof(secMAC_t));\r
+                if (mac != sMAC)\r
+                {\r
+                    rc = 0;\r
+                }\r
+            }\r
+\r
+            /* FCS check... */\r
+            {\r
+                secFCS_t fcs;\r
+\r
+                nwk_getNumObjectFromMsg((void *)(MRFI_P_PAYLOAD(\r
+                                                     frame) + F_SEC_ICHK_OS), (void *)&fcs,\r
+                                        sizeof(secFCS_t));\r
+                if (fcs !=\r
+                    calcFCS(MRFI_P_PAYLOAD(frame) + F_SEC_MAC_OS, msglen - 1 - sizeof(secMAC_t)))\r
+                {\r
+                    rc = 0;\r
+                }\r
+            }\r
+\r
+            /* we're done. */\r
+            done = 1;\r
+        }\r
+        else\r
+        {\r
+            /* Uh oh. Counters don't match. Try and resync. We need to distinguish among\r
+             * missed frames, duplicates and rogues plus account for counter wrap.\r
+             */\r
+            if (frameCnt > locCnt)\r
+            {\r
+                /* frameCnt is bigger. Second part of test below takes care of\r
+                 * the unlikely case of a complete counter wrap (msb's all 0) in\r
+                 * which case the test will incorrectly fail when the count is\r
+                 * actually within the (wrapped) window. #ifdef'ed to avoid compiler\r
+                 * warning in case user sets CNT_WINDOW to 0 (pointless comparison of\r
+                 * unsigned value).\r
+                 */\r
+                if (((frameCnt - CTR_WINDOW) <= locCnt)\r
+#    if CTR_WINDOW > 0\r
+                    || (frameCnt < CTR_WINDOW)\r
+#    endif\r
+                    )\r
+                {\r
+                    /* Value within window. We probably missed something. Adjust and decipher.\r
+                     * If locCnt is less because it wrapped and frameCnt didn't it means that\r
+                     * it's a duplicate or late frame. In that case the following will lead to\r
+                     * a decryption that fails sanity checks which is OK because the frame will\r
+                     * be correctly rejected.\r
+                     */\r
+                    locCnt = frameCnt;\r
+                }\r
+                else\r
+                {\r
+                    /* It's either a rogue or a really old duplicate packet. In either case\r
+                     * we dismiss the frame.\r
+                     */\r
+                    rc   = 0;\r
+                    done = 1;\r
+                }\r
+            }\r
+            else\r
+            {\r
+                /* locCnt is bigger. The only way the frame can be valid is if the\r
+                 * counter wrapped causing frameCnt to appear to be smaller. Wrap the\r
+                 * counter and decrypt. If the frame isn't valid, i.e., it's late,\r
+                 * a duplicate, or a rogue, the decryption will fail sanity checks and\r
+                 * the frame will be correctly rejected. The following arithmetic works\r
+                 * correctly without a special test for the complete counter wrap case.\r
+                 */\r
+                frameCnt += 0x100; /* wrap the hint-based counter */\r
+                if (((frameCnt - CTR_WINDOW) <= locCnt))\r
+                {\r
+                    /* An lsb wrap but still within window. We probably missed something.\r
+                     * Adjust (with wrap) and decrypt.\r
+                     */\r
+                    locCnt = frameCnt;\r
+                }\r
+                else\r
+                {\r
+                    /* rogue frame */\r
+                    rc   = 0;\r
+                    done = 1;\r
+                }\r
+            }\r
+        }\r
+    } while (!done);\r
+\r
+    if (ctr && rc)\r
+    {\r
+        /* Only update the counter if the count was a "real" one and the\r
+         * decryption succeeded.\r
+         */\r
+        *ctr = locCnt;\r
+    }\r
+\r
+    return rc;\r
+}\r
+\r
+#endif  /* SMPL_SECURE */\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/Components/nwk_applications/nwk_security.h b/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/Components/nwk_applications/nwk_security.h
new file mode 100755 (executable)
index 0000000..ad8b087
--- /dev/null
@@ -0,0 +1,49 @@
+/**************************************************************************************************\r
+*  Filename:       nwk_security.h\r
+*  Revised:        $Date: 2009-01-09 15:02:17 -0800 (Fri, 09 Jan 2009) $\r
+*  Revision:       $Revision: 18728 $\r
+*  Author:         $Author: lfriedman $\r
+*\r
+*  Description:    This file supports the SimpliciTI Security network application.\r
+*\r
+*  Copyright 2004-2007 Texas Instruments Incorporated. All rights reserved.\r
+*\r
+*  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+*  the terms of a software license agreement between the user who downloaded the software,\r
+*  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+*  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+*  License. The License limits your use, and you acknowledge, that the Software may not be\r
+*  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+*  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+*  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+*  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+*  perform, display or sell this Software and/or its documentation for any purpose.\r
+*\r
+*  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+*  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+*  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+*  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+*  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+*  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+*  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+*  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+*  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+*\r
+*  Should you have any questions regarding your right to use this Software,\r
+*  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+\r
+#ifndef NWK_SECURITY_H\r
+#define NWK_SECURITY_H\r
+\r
+/* change the following as Security application is developed */\r
+#define MAX_SEC_APP_FRAME    0\r
+\r
+/* prototypes  */\r
+void nwk_securityInit(void);\r
+fhStatus_t nwk_processSecurity(mrfiPacket_t *);\r
+\r
+void nwk_setSecureFrame(mrfiPacket_t *, uint8_t, uint32_t *);\r
+uint8_t nwk_getSecureFrame(mrfiPacket_t *, uint8_t, uint32_t *);\r
+#endif\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/simpliciti.h b/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/simpliciti.h
new file mode 100755 (executable)
index 0000000..9881a61
--- /dev/null
@@ -0,0 +1,163 @@
+// *************************************************************************************************\r
+//\r
+//     Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//       Redistribution and use in source and binary forms, with or without\r
+//       modification, are permitted provided that the following conditions\r
+//       are met:\r
+//\r
+//         Redistributions of source code must retain the above copyright\r
+//         notice, this list of conditions and the following disclaimer.\r
+//\r
+//         Redistributions in binary form must reproduce the above copyright\r
+//         notice, this list of conditions and the following disclaimer in the\r
+//         documentation and/or other materials provided with the\r
+//         distribution.\r
+//\r
+//         Neither the name of Texas Instruments Incorporated nor the names of\r
+//         its contributors may be used to endorse or promote products derived\r
+//         from this software without specific prior written permission.\r
+//\r
+//       THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//       "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//       LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//       A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//       OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//       SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//       LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//       DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//       THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//       (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//       OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+//\r
+// SimpliciTI packet size (TX only mode)\r
+// -------------------------------------\r
+//\r
+//              * packet rate                  (100/3) packets/second = 33.3 packets/second\r
+//             * packet length                 28 bytes\r
+//             * packet structure              4 bytes         preamble\r
+//                                                             4 bytes         sync\r
+//                                                             1 bytes         length\r
+//                                                             1 bytes         address\r
+//                                                             16 bytes        data\r
+//                                                                      12 byte network data\r
+//                                                                      4  byte user data\r
+//                                                             2 bytes         crc\r
+//\r
+// SimpliciTI frequency overview\r
+// -----------------------------\r
+//\r
+// CC430_End_Device_433MHz.lib (433MHz ISM band)\r
+//\r
+//             * base frequency                433.92 MHz\r
+//             * deviation                             32 kHz\r
+//             * channel spacing               25 kHz\r
+//             * used channel number   0 (frequency agility/hopping disabled)\r
+//             * data rate                             76.8 kBaud\r
+//             * output power                  1.4 dBm\r
+//             * duty                                  9,6% (TX only mode, 32 packets / second)\r
+//\r
+// CC430_End_Device_868MHz.lib (868MHz ISM band)\r
+//\r
+//             * base frequency                869.525 MHz\r
+//             * deviation                             32 kHz\r
+//             * channel spacing               25 kHz\r
+//             * used channel number   0 (frequency agility/hopping disabled)\r
+//             * data rate                             76.8 kBaud\r
+//             * output power                  1.1 dBm\r
+//             * duty                                  9,6% (TX only mode, 32 packets / second)\r
+//\r
+// CC430_End_Device_915MHz.lib (915MHz ISM band)\r
+//\r
+//             * base frequency                902.000 MHz\r
+//             * deviation                             32 kHz\r
+//             * channel spacing               200 kHz\r
+//             * used channel number   20 (frequency agility/hopping disabled)\r
+//             * data rate                             76.8 kBaud\r
+//             * output power                  1.3 dBm\r
+//             * duty                                  9.6% (TX only mode, 32 packets / second)\r
+//\r
+// *************************************************************************************************\r
+\r
+// ---------------------------------------------------------------\r
+// Generic defines and variables\r
+\r
+// Entry point into SimpliciTI library\r
+extern unsigned char simpliciti_link(void);\r
+\r
+// 4 byte device address overrides device address set during compile time\r
+extern unsigned char simpliciti_ed_address[4];\r
+\r
+// Maximum data length\r
+#define SIMPLICITI_MAX_PAYLOAD_LENGTH           (32u)\r
+\r
+// Data to send / receive\r
+extern unsigned char simpliciti_data[SIMPLICITI_MAX_PAYLOAD_LENGTH];\r
+\r
+// Flag contains status information and triggers to send data or to exit SimpliciTI library\r
+// Control is done from outside SimpliciTI library\r
+extern unsigned char simpliciti_flag;\r
+#define SIMPLICITI_STATUS_LINKING                       (BIT0)\r
+#define SIMPLICITI_STATUS_LINKED                        (BIT1)\r
+#define SIMPLICITI_STATUS_ERROR                     (BIT2)\r
+#define SIMPLICITI_TRIGGER_SEND_DATA            (BIT3)\r
+#define SIMPLICITI_TRIGGER_RECEIVED_DATA            (BIT4)\r
+#define SIMPLICITI_TRIGGER_STOP                     (BIT5)\r
+\r
+// Radio frequency offset read from calibration memory\r
+// Compensates crystal deviation from 26MHz nominal value\r
+extern unsigned char rf_frequoffset;\r
+\r
+// Macros\r
+#define getFlag(val, flag)                                              ((val & flag) == flag)\r
+#define setFlag(val, flag)                                              (val |= flag)\r
+#define clearFlag(val, flag)                                    (val &= (~flag))\r
+#define toggleFlag(val, flag)                                   (val ^= flag)\r
+\r
+\r
+// ---------------------------------------------------------------\r
+// SimpliciTI RX only\r
+\r
+// Entry point into SimpliciTI library\r
+extern void simpliciti_main_tx_only(void);\r
+\r
+// Callback function to read data from acceleration sensor or buttons and trigger sending\r
+extern void simpliciti_get_ed_data_callback(void);\r
+\r
+\r
+// ---------------------------------------------------------------\r
+// SimpliciTI Sync\r
+\r
+// Sync data length\r
+#define BM_SYNC_DATA_LENGTH                     (19u)\r
+\r
+// Device data  (0)TYPE   (1) - (18) DATA\r
+#define SYNC_ED_TYPE_R2R                        (1u)\r
+#define SYNC_ED_TYPE_MEMORY                     (2u)\r
+#define SYNC_ED_TYPE_STATUS                     (3u)\r
+\r
+// Host data    (0)CMD    (1) - (18) DATA\r
+#define SYNC_AP_CMD_NOP                         (1u)\r
+#define SYNC_AP_CMD_GET_STATUS                                  (2u)\r
+#define SYNC_AP_CMD_SET_WATCH                   (3u)\r
+#define SYNC_AP_CMD_GET_MEMORY_BLOCKS_MODE_1    (4u)\r
+#define SYNC_AP_CMD_GET_MEMORY_BLOCKS_MODE_2    (5u)\r
+#define SYNC_AP_CMD_ERASE_MEMORY                (6u)\r
+#define SYNC_AP_CMD_EXIT                                                (7u)\r
+\r
+\r
+// Entry point into SimpliciTI library\r
+extern void simpliciti_main_sync(void);\r
+\r
+// Callback function to decode access point command\r
+extern void simpliciti_sync_decode_ap_cmd_callback(void);\r
+\r
+// Callback function to read data from application and trigger sending\r
+extern void simpliciti_sync_get_data_callback(unsigned int index);\r
+\r
+// Send reply packets (>0), 0=no need to reply\r
+extern unsigned char simpliciti_reply_count;\r
+\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/simpliciti_readme.txt b/chronos-ti/Software Projects/Chronos Watch/CCS/Data Logger/simpliciti/simpliciti_readme.txt
new file mode 100755 (executable)
index 0000000..d1ff81d
--- /dev/null
@@ -0,0 +1,46 @@
+Some notes about the SimpliciTI configuration used in this project\r
+\r
+- The source code is based on the SimpliciTI 1.1.1 release.\r
+\r
+- A full SimpliciTI installation contains configurations for many targets and device types. To avoid confusion,\r
+  only the configuration (End Device) and target files (CC430EM) required for the eZ430-Chronos have been used.\r
+\r
+- All source code files have been copied into the project physically. Symbolic links have been replaced with\r
+  the real source code file. \r
+  \r
+- Due to the indirect inclusion scheme of hardware-dependent source code, some source code files have been\r
+  excluded from build. However, they will be included through higher level source code.  \r
+\r
+- Some modifications where required to the original source code. All these changes have been marked with [BM].\r
+\r
+       bsp_board.c/BSP_InitBoard(void)                 Changed from TA0 to TA1 for delay function, because TA0 is already occupied.\r
+\r
+       bsp_msp430_defs.h/BSP_EarlyInit(void)   Function removed, because SimpliciTI must run in watch context\r
+\r
+       mrfi_radio_interface.c/mrfiRadioInterfaceCmdStrobe(uint8_t addr)\r
+                                                                                       Added code to properly synchronize with radio interface. Otherwise\r
+                                                                                       interface could get stuck.\r
+                                                                                       \r
+       mrfi_radio.c                                                    Changed channel assignment (mrfiLogicalChanTable) for three ISM bands\r
+                                                                                       Changed power output settings (mrfiRFPowerTable) for three ISM bands\r
+                               \r
+       mrfi_radio.c/MRFI_Init(void)                    Added frequency offset correction to use calibrated frequency offset\r
+                                                                                       when starting RF communication\r
+                                                                                       \r
+       mrfi_radio.c/MRFI_RadioIsr(void)                Changed radio ISR to normal function, since we have a shared radio ISR\r
+       \r
+       nwk_api.c                                                               Made variable sInit_done globally available to allow SimpliciTI to shutdown \r
+                                                                                       and restart multiple times\r
+       \r
+       nwk.c/nwk_nwkInit                                               Added workaround to allow allow SimpliciTI to shutdown \r
+                                                                                       and restart multiple times\r
+\r
+- If you (for whatever reason) want to upgrade to a newer version of SimpliciTI, please bear in mind that\r
+\r
+       a) the access point SimpliciTI version is 1.1.1 (and cannot be updated)\r
+\r
+       b) the workarounds used here to enable SimpliciTI to shutdown and restart multiple times might not necessarily\r
+          work when used with later revisions\r
+                  \r
+          \r
+       
\ No newline at end of file
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/.ccsproject b/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/.ccsproject
new file mode 100755 (executable)
index 0000000..fb1bc89
--- /dev/null
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>\r
+<?ccsproject version="1.0"?>\r
+\r
+<projectOptions>\r
+<deviceVariant value="CC430F6137"/>\r
+<deviceEndianness value="little"/>\r
+<codegenToolVersion value="3.2.1"/>\r
+<linkerCommandFile value="lnk_cc430f6137.cmd"/>\r
+<rts value="rts430x.lib"/>\r
+<defaultAssemblyOnly value="false"/>\r
+</projectOptions>\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/.cdtbuild b/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/.cdtbuild
new file mode 100755 (executable)
index 0000000..bfea64b
--- /dev/null
@@ -0,0 +1,870 @@
+<?xml version="1.0" encoding="UTF-8"?>\r
+<?fileVersion 3.1.0?>\r
+\r
+<ManagedProjectBuildInfo>\r
+<project id="ez430_chronos.com.ti.ccstudio.buildDefinitions.MSP430.ProjectType.854736374" name="MSP430" projectType="com.ti.ccstudio.buildDefinitions.MSP430.ProjectType">\r
+<configuration artifactExtension="out" artifactName="ez430_chronos_868MHz" description="Europe" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.82500526" name="868MHz - Unrestricted CCS Platinum" parent="com.ti.ccstudio.buildDefinitions.MSP430.Debug" postannouncebuildStep="Create flash image: TI-TXT" postbuildStep="&quot;${CG_TOOL_ROOT}/bin/hex${CG_TOOL_SUFFIX}.exe&quot; --ti_txt &quot;${BuildArtifactFileName}&quot; -o &quot;${BuildArtifactFileBaseName}.txt&quot; -order MS -romwidth 16">\r
+<toolChain id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.DebugToolchain.1914573601" name="TI Code Generation Tools" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.DebugToolchain" targetTool="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.79027564">\r
+<option id="com.ti.ccstudio.buildDefinitions.core.OPT_TAGS.1213352956" superClass="com.ti.ccstudio.buildDefinitions.core.OPT_TAGS" valueType="stringList">\r
+<listOptionValue builtIn="false" value="DEVICE_CONFIGURATION_ID=CC430F6137"/>\r
+<listOptionValue builtIn="false" value="DEVICE_ENDIANNESS=little"/>\r
+<listOptionValue builtIn="false" value="OUTPUT_FORMAT=COFF"/>\r
+<listOptionValue builtIn="false" value="CCS_MBS_VERSION=4.2.0"/>\r
+<listOptionValue builtIn="false" value="LINKER_COMMAND_FILE=lnk_cc430f6137.cmd"/>\r
+<listOptionValue builtIn="false" value="RUNTIME_SUPPORT_LIBRARY=rts430x.lib"/>\r
+<listOptionValue builtIn="false" value="PROJECT_KIND=com.ti.ccstudio.managedbuild.core.ProjectKind_Executable"/>\r
+<listOptionValue builtIn="false" value="IS_ASSEMBLY_ONLY=false"/>\r
+<listOptionValue builtIn="false" value="OUTPUT_TYPE=executable"/>\r
+</option>\r
+<option id="com.ti.ccstudio.buildDefinitions.core.OPT_CODEGEN_VERSION.740715971" superClass="com.ti.ccstudio.buildDefinitions.core.OPT_CODEGEN_VERSION" value="3.3.1" valueType="string"/>\r
+<tool command="&quot;${MSP430_CG_ROOT}/bin/cl430&quot;" commandLinePattern="${command} ${flags} ${inputs}" id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.489789850" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug">\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.DIAG_WARNING.45756229" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.DIAG_WARNING" valueType="stringList">\r
+<listOptionValue builtIn="false" value="225"/>\r
+</option>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.PRINTF_SUPPORT.1184584326" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.PRINTF_SUPPORT" value="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.PRINTF_SUPPORT.minimal" valueType="enumerated"/>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.SILICON_VERSION.1649029899" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.SILICON_VERSION" value="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.SILICON_VERSION.mspx" valueType="enumerated"/>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.OPT_LEVEL.1267015687" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.OPT_LEVEL" value="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.OPT_LEVEL.4" valueType="enumerated"/>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.OPT_FOR_SPEED.1711356305" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.OPT_FOR_SPEED" value="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.OPT_FOR_SPEED.0" valueType="enumerated"/>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.DEFINE.586237410" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.DEFINE" valueType="definedSymbols">\r
+<listOptionValue builtIn="false" value="__CCE__"/>\r
+<listOptionValue builtIn="false" value="ISM_EU"/>\r
+<listOptionValue builtIn="false" value="__CC430F6137__"/>\r
+<listOptionValue builtIn="false" value="MRFI_CC430"/>\r
+</option>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.INCLUDE_PATH.1719593878" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.INCLUDE_PATH" valueType="includePath">\r
+<listOptionValue builtIn="false" value="&quot;${CCS_INSTALL_ROOT}/msp430/include&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${CG_TOOL_ROOT}/include&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${CCE_INSTALL_ROOT}/msp430/include&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${workspace_loc:/ez430_chronos/include}&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${workspace_loc:/ez430_chronos/driver}&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${workspace_loc:/ez430_chronos/logic}&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${workspace_loc:/ez430_chronos/bluerobin}&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${workspace_loc:/ez430_chronos/simpliciti}&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${workspace_loc:/ez430_chronos/simpliciti/Applications/application/End Device}&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${workspace_loc:/ez430_chronos/simpliciti/Components/bsp}&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${workspace_loc:/ez430_chronos/simpliciti/Components/bsp/boards}&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${workspace_loc:/ez430_chronos/simpliciti/Components/bsp/boards/CC430EM}&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${workspace_loc:/ez430_chronos/simpliciti/Components/bsp/boards/CC430EM/bsp_external}&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${workspace_loc:/ez430_chronos/simpliciti/Components/bsp/drivers}&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${workspace_loc:/ez430_chronos/simpliciti/Components/bsp/drivers/code}&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${workspace_loc:/ez430_chronos/simpliciti/Components/bsp/mcus}&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${workspace_loc:/ez430_chronos/simpliciti/Components/mrfi}&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${workspace_loc:/ez430_chronos/simpliciti/Components/mrfi/radios}&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${workspace_loc:/ez430_chronos/simpliciti/Components/mrfi/radios/family5}&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${workspace_loc:/ez430_chronos/simpliciti/Components/mrfi/smartrf}&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${workspace_loc:/ez430_chronos/simpliciti/Components/nwk}&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${workspace_loc:/ez430_chronos/simpliciti/Components/nwk_applications}&quot;"/>\r
+</option>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.CALL_ASSUMPTIONS.2025879478" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.CALL_ASSUMPTIONS" value="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.CALL_ASSUMPTIONS.0" valueType="enumerated"/>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.GEN_OPT_INFO.305485071" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.GEN_OPT_INFO" value="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.GEN_OPT_INFO.2" valueType="enumerated"/>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.CMD_FILE.1067248774" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.CMD_FILE" valueType="stringList">\r
+<listOptionValue builtIn="false" value="&quot;${workspace_loc:/ez430_chronos/simpliciti/Applications/configuration/smpl_nwk_config.dat}&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${workspace_loc:/ez430_chronos/simpliciti/Applications/configuration/End Device/smpl_config.dat}&quot;"/>\r
+</option>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.AUTO_INLINE.1503034068" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.AUTO_INLINE" value="0" valueType="string"/>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.DEBUGGING_MODEL.279531829" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.DEBUGGING_MODEL" value="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.DEBUGGING_MODEL.SYMDEBUG__DWARF" valueType="enumerated"/>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.ASM_LISTING.2143689999" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.ASM_LISTING" value="false" valueType="boolean"/>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.OUTPUT_ALL_SYMS.577471420" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.OUTPUT_ALL_SYMS" value="false" valueType="boolean"/>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.ALIASED_VARIABLES.1653704943" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.ALIASED_VARIABLES" value="false" valueType="boolean"/>\r
+</tool>\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.79027564" name="MSP430 Linker" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug">\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.HEAP_SIZE.1792662352" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.HEAP_SIZE" value="80" valueType="string"/>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.STACK_SIZE.1653215793" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.STACK_SIZE" value="80" valueType="string"/>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.USE_HW_MPY.1129827062" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.USE_HW_MPY" value="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.USE_HW_MPY.F5" valueType="enumerated"/>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.OUTPUT_FILE.1642091054" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.OUTPUT_FILE" value="&quot;ez430_chronos_868MHz.out&quot;" valueType="string"/>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.MAP_FILE.1415969492" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.MAP_FILE" value="&quot;ez430_chronos_868MHz.map&quot;" valueType="string"/>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.generatedLinkerCommandFiles.1838097262" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.generatedLinkerCommandFiles" valueType="libs">\r
+<listOptionValue builtIn="false" value="&quot;$(GEN_CMDS_QUOTED)&quot;"/>\r
+</option>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.SEARCH_PATH.1602977917" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.SEARCH_PATH" valueType="stringList">\r
+<listOptionValue builtIn="false" value="&quot;${CCS_INSTALL_ROOT}/msp430/include&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${CG_TOOL_ROOT}/lib&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${CG_TOOL_ROOT}/include&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${CCE_INSTALL_ROOT}/msp430/include&quot;"/>\r
+</option>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.LIBRARY.341207438" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.LIBRARY" valueType="libs">\r
+<listOptionValue builtIn="false" value="&quot;rts430x.lib&quot;"/>\r
+</option>\r
+</tool>\r
+<macros expandEnvironmentMacros="true"/>\r
+</toolChain>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.82500526./ez430_chronos/simpliciti/Components/mrfi/radios/family5/mrfi_radio.c" name="mrfi_radio.c" rcbsApplicability="disable" resourcePath="/ez430_chronos/simpliciti/Components/mrfi/radios/family5/mrfi_radio.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.489789850./ez430_chronos/simpliciti/Components/mrfi/radios/family5/mrfi_radio.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.489789850./ez430_chronos/simpliciti/Components/mrfi/radios/family5/mrfi_radio.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.489789850"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.82500526./ez430_chronos/simpliciti/Components/bsp/boards/CC430EM/bsp_board.c" name="bsp_board.c" rcbsApplicability="disable" resourcePath="/ez430_chronos/simpliciti/Components/bsp/boards/CC430EM/bsp_board.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.489789850./ez430_chronos/simpliciti/Components/bsp/boards/CC430EM/bsp_board.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.489789850./ez430_chronos/simpliciti/Components/bsp/boards/CC430EM/bsp_board.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.489789850"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.82500526./ez430_chronos/simpliciti/Components/bsp/boards/CC430EM/bsp_drivers.c" name="bsp_drivers.c" rcbsApplicability="disable" resourcePath="/ez430_chronos/simpliciti/Components/bsp/boards/CC430EM/bsp_drivers.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.489789850./ez430_chronos/simpliciti/Components/bsp/boards/CC430EM/bsp_drivers.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.489789850./ez430_chronos/simpliciti/Components/bsp/boards/CC430EM/bsp_drivers.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.489789850"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.82500526./ez430_chronos/simpliciti/Components/bsp/drivers/code/bsp_leds.c" name="bsp_leds.c" rcbsApplicability="disable" resourcePath="/ez430_chronos/simpliciti/Components/bsp/drivers/code/bsp_leds.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.489789850./ez430_chronos/simpliciti/Components/bsp/drivers/code/bsp_leds.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.489789850./ez430_chronos/simpliciti/Components/bsp/drivers/code/bsp_leds.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.489789850"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.82500526./ez430_chronos/simpliciti/Components/bsp/drivers/code/bsp_buttons.c" name="bsp_buttons.c" rcbsApplicability="disable" resourcePath="/ez430_chronos/simpliciti/Components/bsp/drivers/code/bsp_buttons.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.489789850./ez430_chronos/simpliciti/Components/bsp/drivers/code/bsp_buttons.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.489789850./ez430_chronos/simpliciti/Components/bsp/drivers/code/bsp_buttons.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.489789850"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.82500526./ez430_chronos/simpliciti/Components/mrfi/radios/family5/mrfi_radio_interface.c" name="mrfi_radio_interface.c" rcbsApplicability="disable" resourcePath="/ez430_chronos/simpliciti/Components/mrfi/radios/family5/mrfi_radio_interface.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.489789850./ez430_chronos/simpliciti/Components/mrfi/radios/family5/mrfi_radio_interface.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.489789850./ez430_chronos/simpliciti/Components/mrfi/radios/family5/mrfi_radio_interface.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.489789850"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.82500526./ez430_chronos/bluerobin/BlueRobin_RX_433MHz.lib" name="BlueRobin_RX_433MHz.lib" rcbsApplicability="disable" resourcePath="/ez430_chronos/bluerobin/BlueRobin_RX_433MHz.lib" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.79027564./ez430_chronos/bluerobin/BlueRobin_RX_433MHz.lib">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.79027564./ez430_chronos/bluerobin/BlueRobin_RX_433MHz.lib" name="MSP430 Linker" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.79027564"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.82500526./ez430_chronos/bluerobin/BlueRobin_RX_915MHz.lib" name="BlueRobin_RX_915MHz.lib" rcbsApplicability="disable" resourcePath="/ez430_chronos/bluerobin/BlueRobin_RX_915MHz.lib" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.79027564./ez430_chronos/bluerobin/BlueRobin_RX_915MHz.lib">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.79027564./ez430_chronos/bluerobin/BlueRobin_RX_915MHz.lib" name="MSP430 Linker" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.79027564"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.82500526./ez430_chronos/simpliciti/CC430_End_Device_868MHz.lib" name="CC430_End_Device_868MHz.lib" rcbsApplicability="disable" resourcePath="/ez430_chronos/simpliciti/CC430_End_Device_868MHz.lib" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.79027564./ez430_chronos/simpliciti/CC430_End_Device_868MHz.lib">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.79027564./ez430_chronos/simpliciti/CC430_End_Device_868MHz.lib" name="MSP430 Linker" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.79027564"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.82500526./ez430_chronos/simpliciti/CC430_End_Device_433MHz.lib" name="CC430_End_Device_433MHz.lib" rcbsApplicability="disable" resourcePath="/ez430_chronos/simpliciti/CC430_End_Device_433MHz.lib" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.79027564./ez430_chronos/simpliciti/CC430_End_Device_433MHz.lib">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.79027564./ez430_chronos/simpliciti/CC430_End_Device_433MHz.lib" name="MSP430 Linker" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.79027564"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.82500526./ez430_chronos/simpliciti/CC430_End_Device_915MHz.lib" name="CC430_End_Device_915MHz.lib" rcbsApplicability="disable" resourcePath="/ez430_chronos/simpliciti/CC430_End_Device_915MHz.lib" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.79027564./ez430_chronos/simpliciti/CC430_End_Device_915MHz.lib">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.79027564./ez430_chronos/simpliciti/CC430_End_Device_915MHz.lib" name="MSP430 Linker" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.79027564"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.82500526./ez430_chronos/driver/ez430_chronos_drivers.lib" name="ez430_chronos_drivers.lib" rcbsApplicability="disable" resourcePath="/ez430_chronos/driver/ez430_chronos_drivers.lib" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.79027564./ez430_chronos/driver/ez430_chronos_drivers.lib">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.79027564./ez430_chronos/driver/ez430_chronos_drivers.lib" name="MSP430 Linker" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.79027564"/>\r
+</resourceConfiguration>\r
+</configuration>\r
+<configuration artifactExtension="out" artifactName="ez430_chronos_868MHz" description="Europe" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.2047404142" name="868MHz - Limited CCS Core Edition" parent="com.ti.ccstudio.buildDefinitions.MSP430.Debug" postannouncebuildStep="Create flash image: TI-TXT" postbuildStep="&quot;${CG_TOOL_ROOT}/bin/hex${CG_TOOL_SUFFIX}.exe&quot; --ti_txt &quot;${BuildArtifactFileName}&quot; -o &quot;${BuildArtifactFileBaseName}.txt&quot; -order MS -romwidth 16">\r
+<toolChain id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.DebugToolchain.703528111" name="TI Code Generation Tools" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.DebugToolchain" targetTool="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.2035431365">\r
+<option id="com.ti.ccstudio.buildDefinitions.core.OPT_TAGS.1358765683" superClass="com.ti.ccstudio.buildDefinitions.core.OPT_TAGS" valueType="stringList">\r
+<listOptionValue builtIn="false" value="DEVICE_CONFIGURATION_ID=CC430F6137"/>\r
+<listOptionValue builtIn="false" value="DEVICE_ENDIANNESS=little"/>\r
+<listOptionValue builtIn="false" value="OUTPUT_FORMAT=COFF"/>\r
+<listOptionValue builtIn="false" value="CCS_MBS_VERSION=4.2.0"/>\r
+<listOptionValue builtIn="false" value="LINKER_COMMAND_FILE=lnk_cc430f6137.cmd"/>\r
+<listOptionValue builtIn="false" value="RUNTIME_SUPPORT_LIBRARY=rts430x.lib"/>\r
+<listOptionValue builtIn="false" value="PROJECT_KIND=com.ti.ccstudio.managedbuild.core.ProjectKind_Executable"/>\r
+<listOptionValue builtIn="false" value="IS_ASSEMBLY_ONLY=false"/>\r
+<listOptionValue builtIn="false" value="OUTPUT_TYPE=executable"/>\r
+</option>\r
+<option id="com.ti.ccstudio.buildDefinitions.core.OPT_CODEGEN_VERSION.1863472540" superClass="com.ti.ccstudio.buildDefinitions.core.OPT_CODEGEN_VERSION" value="3.3.1" valueType="string"/>\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1859344897" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug">\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.DIAG_WARNING.152831801" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.DIAG_WARNING" valueType="stringList">\r
+<listOptionValue builtIn="false" value="225"/>\r
+</option>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.PRINTF_SUPPORT.850179567" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.PRINTF_SUPPORT" value="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.PRINTF_SUPPORT.minimal" valueType="enumerated"/>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.SILICON_VERSION.1090289733" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.SILICON_VERSION" value="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.SILICON_VERSION.mspx" valueType="enumerated"/>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.OPT_LEVEL.1369879490" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.OPT_LEVEL" value="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.OPT_LEVEL.4" valueType="enumerated"/>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.OPT_FOR_SPEED.1401129891" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.OPT_FOR_SPEED" value="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.OPT_FOR_SPEED.0" valueType="enumerated"/>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.DEFINE.1396244830" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.DEFINE" valueType="definedSymbols">\r
+<listOptionValue builtIn="false" value="__CCE__"/>\r
+<listOptionValue builtIn="false" value="ISM_EU"/>\r
+</option>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.INCLUDE_PATH.90895860" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.INCLUDE_PATH" valueType="includePath">\r
+<listOptionValue builtIn="false" value="&quot;${CCS_INSTALL_ROOT}/msp430/include&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${CG_TOOL_ROOT}/include&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${CCE_INSTALL_ROOT}/msp430/include&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${workspace_loc:/ez430_chronos/include}&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${workspace_loc:/ez430_chronos/driver}&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${workspace_loc:/ez430_chronos/logic}&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${workspace_loc:/ez430_chronos/bluerobin}&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${workspace_loc:/ez430_chronos/simpliciti}&quot;"/>\r
+</option>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.CALL_ASSUMPTIONS.1545446084" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.CALL_ASSUMPTIONS" value="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.CALL_ASSUMPTIONS.0" valueType="enumerated"/>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.GEN_OPT_INFO.967080260" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.GEN_OPT_INFO" value="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.GEN_OPT_INFO.2" valueType="enumerated"/>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.AUTO_INLINE.260955211" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.AUTO_INLINE" value="0" valueType="string"/>\r
+</tool>\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.2035431365" name="MSP430 Linker" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug">\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.HEAP_SIZE.1825694619" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.HEAP_SIZE" value="80" valueType="string"/>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.STACK_SIZE.1623469289" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.STACK_SIZE" value="80" valueType="string"/>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.USE_HW_MPY.488569747" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.USE_HW_MPY" value="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.USE_HW_MPY.F5" valueType="enumerated"/>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.OUTPUT_FILE.778770754" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.OUTPUT_FILE" value="&quot;ez430_chronos_868MHz.out&quot;" valueType="string"/>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.MAP_FILE.1908037366" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.MAP_FILE" value="&quot;ez430_chronos_868MHz.map&quot;" valueType="string"/>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.generatedLinkerCommandFiles.1297952765" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.generatedLinkerCommandFiles" valueType="libs">\r
+<listOptionValue builtIn="false" value="&quot;$(GEN_CMDS_QUOTED)&quot;"/>\r
+</option>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.SEARCH_PATH.1416345095" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.SEARCH_PATH" valueType="stringList">\r
+<listOptionValue builtIn="false" value="&quot;${CCS_INSTALL_ROOT}/msp430/include&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${CG_TOOL_ROOT}/lib&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${CG_TOOL_ROOT}/include&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${CCE_INSTALL_ROOT}/msp430/include&quot;"/>\r
+</option>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.LIBRARY.1045932921" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.LIBRARY" valueType="libs">\r
+<listOptionValue builtIn="false" value="&quot;rts430x.lib&quot;"/>\r
+</option>\r
+</tool>\r
+<macros expandEnvironmentMacros="true"/>\r
+</toolChain>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.2047404142./ez430_chronos/driver/adc12.c" name="adc12.c" rcbsApplicability="disable" resourcePath="/ez430_chronos/driver/adc12.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1859344897./ez430_chronos/driver/adc12.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1859344897./ez430_chronos/driver/adc12.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1859344897"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.2047404142./ez430_chronos/driver/buzzer.c" name="buzzer.c" rcbsApplicability="disable" resourcePath="/ez430_chronos/driver/buzzer.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1859344897./ez430_chronos/driver/buzzer.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1859344897./ez430_chronos/driver/buzzer.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1859344897"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.2047404142./ez430_chronos/driver/display.c" name="display.c" rcbsApplicability="disable" resourcePath="/ez430_chronos/driver/display.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1859344897./ez430_chronos/driver/display.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1859344897./ez430_chronos/driver/display.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1859344897"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.2047404142./ez430_chronos/driver/pmm.c" name="pmm.c" rcbsApplicability="disable" resourcePath="/ez430_chronos/driver/pmm.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1859344897./ez430_chronos/driver/pmm.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1859344897./ez430_chronos/driver/pmm.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1859344897"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.2047404142./ez430_chronos/driver/ports.c" name="ports.c" rcbsApplicability="disable" resourcePath="/ez430_chronos/driver/ports.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1859344897./ez430_chronos/driver/ports.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1859344897./ez430_chronos/driver/ports.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1859344897"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.2047404142./ez430_chronos/driver/radio.c" name="radio.c" rcbsApplicability="disable" resourcePath="/ez430_chronos/driver/radio.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1859344897./ez430_chronos/driver/radio.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1859344897./ez430_chronos/driver/radio.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1859344897"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.2047404142./ez430_chronos/driver/rf1a.c" name="rf1a.c" rcbsApplicability="disable" resourcePath="/ez430_chronos/driver/rf1a.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1859344897./ez430_chronos/driver/rf1a.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1859344897./ez430_chronos/driver/rf1a.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1859344897"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.2047404142./ez430_chronos/driver/timer.c" name="timer.c" rcbsApplicability="disable" resourcePath="/ez430_chronos/driver/timer.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1859344897./ez430_chronos/driver/timer.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1859344897./ez430_chronos/driver/timer.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1859344897"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.2047404142./ez430_chronos/driver/vti_as.c" name="vti_as.c" rcbsApplicability="disable" resourcePath="/ez430_chronos/driver/vti_as.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1859344897./ez430_chronos/driver/vti_as.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1859344897./ez430_chronos/driver/vti_as.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1859344897"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.2047404142./ez430_chronos/driver/vti_ps.c" name="vti_ps.c" rcbsApplicability="disable" resourcePath="/ez430_chronos/driver/vti_ps.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1859344897./ez430_chronos/driver/vti_ps.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1859344897./ez430_chronos/driver/vti_ps.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1859344897"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.2047404142./ez430_chronos/simpliciti/Components/bsp/drivers/code/bsp_buttons.c" name="bsp_buttons.c" rcbsApplicability="disable" resourcePath="/ez430_chronos/simpliciti/Components/bsp/drivers/code/bsp_buttons.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1859344897./ez430_chronos/simpliciti/Components/bsp/drivers/code/bsp_buttons.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1859344897./ez430_chronos/simpliciti/Components/bsp/drivers/code/bsp_buttons.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1859344897"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.2047404142./ez430_chronos/simpliciti/Components/bsp/drivers/code/bsp_leds.c" name="bsp_leds.c" rcbsApplicability="disable" resourcePath="/ez430_chronos/simpliciti/Components/bsp/drivers/code/bsp_leds.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1859344897./ez430_chronos/simpliciti/Components/bsp/drivers/code/bsp_leds.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1859344897./ez430_chronos/simpliciti/Components/bsp/drivers/code/bsp_leds.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1859344897"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.2047404142./ez430_chronos/simpliciti/Components/bsp/boards/CC430EM/bsp_board.c" name="bsp_board.c" rcbsApplicability="disable" resourcePath="/ez430_chronos/simpliciti/Components/bsp/boards/CC430EM/bsp_board.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1859344897./ez430_chronos/simpliciti/Components/bsp/boards/CC430EM/bsp_board.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1859344897./ez430_chronos/simpliciti/Components/bsp/boards/CC430EM/bsp_board.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1859344897"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.2047404142./ez430_chronos/simpliciti/Components/bsp/boards/CC430EM/bsp_drivers.c" name="bsp_drivers.c" rcbsApplicability="disable" resourcePath="/ez430_chronos/simpliciti/Components/bsp/boards/CC430EM/bsp_drivers.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1859344897./ez430_chronos/simpliciti/Components/bsp/boards/CC430EM/bsp_drivers.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1859344897./ez430_chronos/simpliciti/Components/bsp/boards/CC430EM/bsp_drivers.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1859344897"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.2047404142./ez430_chronos/simpliciti/Components/mrfi/radios/family5/mrfi_radio_interface.c" name="mrfi_radio_interface.c" rcbsApplicability="disable" resourcePath="/ez430_chronos/simpliciti/Components/mrfi/radios/family5/mrfi_radio_interface.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1859344897./ez430_chronos/simpliciti/Components/mrfi/radios/family5/mrfi_radio_interface.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1859344897./ez430_chronos/simpliciti/Components/mrfi/radios/family5/mrfi_radio_interface.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1859344897"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.2047404142./ez430_chronos/simpliciti/Components/mrfi/radios/family5/mrfi_radio.c" name="mrfi_radio.c" rcbsApplicability="disable" resourcePath="/ez430_chronos/simpliciti/Components/mrfi/radios/family5/mrfi_radio.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1859344897./ez430_chronos/simpliciti/Components/mrfi/radios/family5/mrfi_radio.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1859344897./ez430_chronos/simpliciti/Components/mrfi/radios/family5/mrfi_radio.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1859344897"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.2047404142./ez430_chronos/simpliciti/Applications/application/End Device/main_ED_BM.c" name="main_ED_BM.c" rcbsApplicability="disable" resourcePath="/ez430_chronos/simpliciti/Applications/application/End Device/main_ED_BM.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1859344897./ez430_chronos/simpliciti/Applications/application/End Device/main_ED_BM.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1859344897./ez430_chronos/simpliciti/Applications/application/End Device/main_ED_BM.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1859344897"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.2047404142./ez430_chronos/simpliciti/Components/bsp/bsp.c" name="bsp.c" rcbsApplicability="disable" resourcePath="/ez430_chronos/simpliciti/Components/bsp/bsp.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1859344897./ez430_chronos/simpliciti/Components/bsp/bsp.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1859344897./ez430_chronos/simpliciti/Components/bsp/bsp.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1859344897"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.2047404142./ez430_chronos/simpliciti/Components/mrfi/mrfi.c" name="mrfi.c" rcbsApplicability="disable" resourcePath="/ez430_chronos/simpliciti/Components/mrfi/mrfi.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1859344897./ez430_chronos/simpliciti/Components/mrfi/mrfi.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1859344897./ez430_chronos/simpliciti/Components/mrfi/mrfi.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1859344897"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.2047404142./ez430_chronos/simpliciti/Components/nwk/nwk_api.c" name="nwk_api.c" rcbsApplicability="disable" resourcePath="/ez430_chronos/simpliciti/Components/nwk/nwk_api.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1859344897./ez430_chronos/simpliciti/Components/nwk/nwk_api.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1859344897./ez430_chronos/simpliciti/Components/nwk/nwk_api.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1859344897"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.2047404142./ez430_chronos/simpliciti/Components/nwk/nwk_frame.c" name="nwk_frame.c" rcbsApplicability="disable" resourcePath="/ez430_chronos/simpliciti/Components/nwk/nwk_frame.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1859344897./ez430_chronos/simpliciti/Components/nwk/nwk_frame.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1859344897./ez430_chronos/simpliciti/Components/nwk/nwk_frame.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1859344897"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.2047404142./ez430_chronos/simpliciti/Components/nwk/nwk_globals.c" name="nwk_globals.c" rcbsApplicability="disable" resourcePath="/ez430_chronos/simpliciti/Components/nwk/nwk_globals.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1859344897./ez430_chronos/simpliciti/Components/nwk/nwk_globals.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1859344897./ez430_chronos/simpliciti/Components/nwk/nwk_globals.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1859344897"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.2047404142./ez430_chronos/simpliciti/Components/nwk/nwk_QMgmt.c" name="nwk_QMgmt.c" rcbsApplicability="disable" resourcePath="/ez430_chronos/simpliciti/Components/nwk/nwk_QMgmt.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1859344897./ez430_chronos/simpliciti/Components/nwk/nwk_QMgmt.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1859344897./ez430_chronos/simpliciti/Components/nwk/nwk_QMgmt.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1859344897"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.2047404142./ez430_chronos/simpliciti/Components/nwk/nwk.c" name="nwk.c" rcbsApplicability="disable" resourcePath="/ez430_chronos/simpliciti/Components/nwk/nwk.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1859344897./ez430_chronos/simpliciti/Components/nwk/nwk.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1859344897./ez430_chronos/simpliciti/Components/nwk/nwk.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1859344897"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.2047404142./ez430_chronos/simpliciti/Components/nwk_applications/nwk_ioctl.c" name="nwk_ioctl.c" rcbsApplicability="disable" resourcePath="/ez430_chronos/simpliciti/Components/nwk_applications/nwk_ioctl.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1859344897./ez430_chronos/simpliciti/Components/nwk_applications/nwk_ioctl.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1859344897./ez430_chronos/simpliciti/Components/nwk_applications/nwk_ioctl.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1859344897"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.2047404142./ez430_chronos/simpliciti/Components/nwk_applications/nwk_join.c" name="nwk_join.c" rcbsApplicability="disable" resourcePath="/ez430_chronos/simpliciti/Components/nwk_applications/nwk_join.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1859344897./ez430_chronos/simpliciti/Components/nwk_applications/nwk_join.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1859344897./ez430_chronos/simpliciti/Components/nwk_applications/nwk_join.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1859344897"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.2047404142./ez430_chronos/simpliciti/Components/nwk_applications/nwk_link.c" name="nwk_link.c" rcbsApplicability="disable" resourcePath="/ez430_chronos/simpliciti/Components/nwk_applications/nwk_link.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1859344897./ez430_chronos/simpliciti/Components/nwk_applications/nwk_link.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1859344897./ez430_chronos/simpliciti/Components/nwk_applications/nwk_link.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1859344897"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.2047404142./ez430_chronos/simpliciti/Components/nwk_applications/nwk_mgmt.c" name="nwk_mgmt.c" rcbsApplicability="disable" resourcePath="/ez430_chronos/simpliciti/Components/nwk_applications/nwk_mgmt.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1859344897./ez430_chronos/simpliciti/Components/nwk_applications/nwk_mgmt.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1859344897./ez430_chronos/simpliciti/Components/nwk_applications/nwk_mgmt.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1859344897"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.2047404142./ez430_chronos/simpliciti/Components/nwk_applications/nwk_ping.c" name="nwk_ping.c" rcbsApplicability="disable" resourcePath="/ez430_chronos/simpliciti/Components/nwk_applications/nwk_ping.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1859344897./ez430_chronos/simpliciti/Components/nwk_applications/nwk_ping.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1859344897./ez430_chronos/simpliciti/Components/nwk_applications/nwk_ping.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1859344897"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.2047404142./ez430_chronos/simpliciti/Components/nwk_applications/nwk_security.c" name="nwk_security.c" rcbsApplicability="disable" resourcePath="/ez430_chronos/simpliciti/Components/nwk_applications/nwk_security.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1859344897./ez430_chronos/simpliciti/Components/nwk_applications/nwk_security.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1859344897./ez430_chronos/simpliciti/Components/nwk_applications/nwk_security.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1859344897"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.2047404142./ez430_chronos/simpliciti/Components/nwk_applications/nwk_freq.c" name="nwk_freq.c" rcbsApplicability="disable" resourcePath="/ez430_chronos/simpliciti/Components/nwk_applications/nwk_freq.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1859344897./ez430_chronos/simpliciti/Components/nwk_applications/nwk_freq.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1859344897./ez430_chronos/simpliciti/Components/nwk_applications/nwk_freq.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1859344897"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.2047404142./ez430_chronos/bluerobin/BlueRobin_RX_433MHz.lib" name="BlueRobin_RX_433MHz.lib" rcbsApplicability="disable" resourcePath="/ez430_chronos/bluerobin/BlueRobin_RX_433MHz.lib" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.2035431365./ez430_chronos/bluerobin/BlueRobin_RX_433MHz.lib">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.2035431365./ez430_chronos/bluerobin/BlueRobin_RX_433MHz.lib" name="MSP430 Linker" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.2035431365"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.2047404142./ez430_chronos/bluerobin/BlueRobin_RX_915MHz.lib" name="BlueRobin_RX_915MHz.lib" rcbsApplicability="disable" resourcePath="/ez430_chronos/bluerobin/BlueRobin_RX_915MHz.lib" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.2035431365./ez430_chronos/bluerobin/BlueRobin_RX_915MHz.lib">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.2035431365./ez430_chronos/bluerobin/BlueRobin_RX_915MHz.lib" name="MSP430 Linker" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.2035431365"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.2047404142./ez430_chronos/simpliciti/CC430_End_Device_433MHz.lib" name="CC430_End_Device_433MHz.lib" rcbsApplicability="disable" resourcePath="/ez430_chronos/simpliciti/CC430_End_Device_433MHz.lib" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.2035431365./ez430_chronos/simpliciti/CC430_End_Device_433MHz.lib">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.2035431365./ez430_chronos/simpliciti/CC430_End_Device_433MHz.lib" name="MSP430 Linker" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.2035431365"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.2047404142./ez430_chronos/simpliciti/CC430_End_Device_915MHz.lib" name="CC430_End_Device_915MHz.lib" rcbsApplicability="disable" resourcePath="/ez430_chronos/simpliciti/CC430_End_Device_915MHz.lib" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.2035431365./ez430_chronos/simpliciti/CC430_End_Device_915MHz.lib">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.2035431365./ez430_chronos/simpliciti/CC430_End_Device_915MHz.lib" name="MSP430 Linker" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.2035431365"/>\r
+</resourceConfiguration>\r
+</configuration>\r
+<configuration artifactExtension="out" artifactName="ez430_chronos_915MHz" description="USA" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.518486332" name="915MHz - Limited CCS Core Edition" parent="com.ti.ccstudio.buildDefinitions.MSP430.Debug" postannouncebuildStep="Create flash image: TI-TXT" postbuildStep="&quot;${CG_TOOL_ROOT}/bin/hex${CG_TOOL_SUFFIX}.exe&quot; --ti_txt &quot;${BuildArtifactFileName}&quot; -o &quot;${BuildArtifactFileBaseName}.txt&quot; -order MS -romwidth 16">\r
+<toolChain id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.DebugToolchain.88205837" name="TI Code Generation Tools" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.DebugToolchain" targetTool="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.772028756">\r
+<option id="com.ti.ccstudio.buildDefinitions.core.OPT_TAGS.97033534" superClass="com.ti.ccstudio.buildDefinitions.core.OPT_TAGS" valueType="stringList">\r
+<listOptionValue builtIn="false" value="DEVICE_CONFIGURATION_ID=CC430F6137"/>\r
+<listOptionValue builtIn="false" value="DEVICE_ENDIANNESS=little"/>\r
+<listOptionValue builtIn="false" value="OUTPUT_FORMAT=COFF"/>\r
+<listOptionValue builtIn="false" value="CCS_MBS_VERSION=4.2.0"/>\r
+<listOptionValue builtIn="false" value="LINKER_COMMAND_FILE=lnk_cc430f6137.cmd"/>\r
+<listOptionValue builtIn="false" value="RUNTIME_SUPPORT_LIBRARY=rts430x.lib"/>\r
+<listOptionValue builtIn="false" value="PROJECT_KIND=com.ti.ccstudio.managedbuild.core.ProjectKind_Executable"/>\r
+<listOptionValue builtIn="false" value="IS_ASSEMBLY_ONLY=false"/>\r
+<listOptionValue builtIn="false" value="OUTPUT_TYPE=executable"/>\r
+</option>\r
+<option id="com.ti.ccstudio.buildDefinitions.core.OPT_CODEGEN_VERSION.426406135" superClass="com.ti.ccstudio.buildDefinitions.core.OPT_CODEGEN_VERSION" value="3.3.1" valueType="string"/>\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1296271789" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug">\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.DIAG_WARNING.1645022679" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.DIAG_WARNING" valueType="stringList">\r
+<listOptionValue builtIn="false" value="225"/>\r
+</option>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.PRINTF_SUPPORT.1335057470" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.PRINTF_SUPPORT" value="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.PRINTF_SUPPORT.minimal" valueType="enumerated"/>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.SILICON_VERSION.725719493" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.SILICON_VERSION" value="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.SILICON_VERSION.mspx" valueType="enumerated"/>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.OPT_LEVEL.597534777" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.OPT_LEVEL" value="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.OPT_LEVEL.4" valueType="enumerated"/>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.DEFINE.1220339482" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.DEFINE" valueType="definedSymbols">\r
+<listOptionValue builtIn="false" value="__CCE__"/>\r
+<listOptionValue builtIn="false" value="ISM_US"/>\r
+</option>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.INCLUDE_PATH.1299668800" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.INCLUDE_PATH" valueType="includePath">\r
+<listOptionValue builtIn="false" value="&quot;${CCS_INSTALL_ROOT}/msp430/include&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${CG_TOOL_ROOT}/include&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${CCE_INSTALL_ROOT}/msp430/include&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${workspace_loc:/ez430_chronos/include}&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${workspace_loc:/ez430_chronos/driver}&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${workspace_loc:/ez430_chronos/logic}&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${workspace_loc:/ez430_chronos/bluerobin}&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${workspace_loc:/ez430_chronos/simpliciti}&quot;"/>\r
+</option>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.CALL_ASSUMPTIONS.1708204416" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.CALL_ASSUMPTIONS" value="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.CALL_ASSUMPTIONS.0" valueType="enumerated"/>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.GEN_OPT_INFO.1375291523" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.GEN_OPT_INFO" value="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.GEN_OPT_INFO.2" valueType="enumerated"/>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.OPT_FOR_SPEED.377539874" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.OPT_FOR_SPEED" value="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.OPT_FOR_SPEED.0" valueType="enumerated"/>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.AUTO_INLINE.173111860" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.AUTO_INLINE" value="0" valueType="string"/>\r
+</tool>\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.772028756" name="MSP430 Linker" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug">\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.HEAP_SIZE.1376781108" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.HEAP_SIZE" value="80" valueType="string"/>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.STACK_SIZE.1231095657" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.STACK_SIZE" value="80" valueType="string"/>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.USE_HW_MPY.1864099721" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.USE_HW_MPY" value="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.USE_HW_MPY.F5" valueType="enumerated"/>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.OUTPUT_FILE.1375028020" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.OUTPUT_FILE" value="&quot;ez430_chronos_915MHz.out&quot;" valueType="string"/>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.MAP_FILE.387781435" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.MAP_FILE" value="&quot;ez430_chronos_915MHz.map&quot;" valueType="string"/>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.SEARCH_PATH.1741839549" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.SEARCH_PATH" valueType="stringList">\r
+<listOptionValue builtIn="false" value="&quot;${CCS_INSTALL_ROOT}/msp430/include&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${CG_TOOL_ROOT}/lib&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${CG_TOOL_ROOT}/include&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${CCE_INSTALL_ROOT}/msp430/include&quot;"/>\r
+</option>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.LIBRARY.1840906077" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.LIBRARY" valueType="libs">\r
+<listOptionValue builtIn="false" value="&quot;rts430x.lib&quot;"/>\r
+</option>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.generatedLinkerCommandFiles.405066678" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.generatedLinkerCommandFiles" valueType="libs">\r
+<listOptionValue builtIn="false" value="&quot;$(GEN_CMDS_QUOTED)&quot;"/>\r
+</option>\r
+</tool>\r
+<macros expandEnvironmentMacros="true"/>\r
+</toolChain>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.518486332./ez430_chronos/driver/vti_ps.c" name="vti_ps.c" rcbsApplicability="disable" resourcePath="/ez430_chronos/driver/vti_ps.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1296271789./ez430_chronos/driver/vti_ps.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1296271789./ez430_chronos/driver/vti_ps.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1296271789"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.518486332./ez430_chronos/driver/vti_as.c" name="vti_as.c" rcbsApplicability="disable" resourcePath="/ez430_chronos/driver/vti_as.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1296271789./ez430_chronos/driver/vti_as.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1296271789./ez430_chronos/driver/vti_as.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1296271789"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.518486332./ez430_chronos/driver/timer.c" name="timer.c" rcbsApplicability="disable" resourcePath="/ez430_chronos/driver/timer.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1296271789./ez430_chronos/driver/timer.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1296271789./ez430_chronos/driver/timer.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1296271789"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.518486332./ez430_chronos/driver/rf1a.c" name="rf1a.c" rcbsApplicability="disable" resourcePath="/ez430_chronos/driver/rf1a.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1296271789./ez430_chronos/driver/rf1a.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1296271789./ez430_chronos/driver/rf1a.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1296271789"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.518486332./ez430_chronos/driver/radio.c" name="radio.c" rcbsApplicability="disable" resourcePath="/ez430_chronos/driver/radio.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1296271789./ez430_chronos/driver/radio.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1296271789./ez430_chronos/driver/radio.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1296271789"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.518486332./ez430_chronos/driver/ports.c" name="ports.c" rcbsApplicability="disable" resourcePath="/ez430_chronos/driver/ports.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1296271789./ez430_chronos/driver/ports.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1296271789./ez430_chronos/driver/ports.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1296271789"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.518486332./ez430_chronos/driver/pmm.c" name="pmm.c" rcbsApplicability="disable" resourcePath="/ez430_chronos/driver/pmm.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1296271789./ez430_chronos/driver/pmm.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1296271789./ez430_chronos/driver/pmm.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1296271789"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.518486332./ez430_chronos/driver/display.c" name="display.c" rcbsApplicability="disable" resourcePath="/ez430_chronos/driver/display.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1296271789./ez430_chronos/driver/display.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1296271789./ez430_chronos/driver/display.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1296271789"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.518486332./ez430_chronos/driver/buzzer.c" name="buzzer.c" rcbsApplicability="disable" resourcePath="/ez430_chronos/driver/buzzer.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1296271789./ez430_chronos/driver/buzzer.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1296271789./ez430_chronos/driver/buzzer.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1296271789"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.518486332./ez430_chronos/driver/adc12.c" name="adc12.c" rcbsApplicability="disable" resourcePath="/ez430_chronos/driver/adc12.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1296271789./ez430_chronos/driver/adc12.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1296271789./ez430_chronos/driver/adc12.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1296271789"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.518486332./ez430_chronos/simpliciti/Components/mrfi/radios/family5/mrfi_radio.c" name="mrfi_radio.c" rcbsApplicability="disable" resourcePath="/ez430_chronos/simpliciti/Components/mrfi/radios/family5/mrfi_radio.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1296271789./ez430_chronos/simpliciti/Components/mrfi/radios/family5/mrfi_radio.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1296271789./ez430_chronos/simpliciti/Components/mrfi/radios/family5/mrfi_radio.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1296271789"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.518486332./ez430_chronos/simpliciti/Components/bsp/boards/CC430EM/bsp_board.c" name="bsp_board.c" rcbsApplicability="disable" resourcePath="/ez430_chronos/simpliciti/Components/bsp/boards/CC430EM/bsp_board.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1296271789./ez430_chronos/simpliciti/Components/bsp/boards/CC430EM/bsp_board.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1296271789./ez430_chronos/simpliciti/Components/bsp/boards/CC430EM/bsp_board.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1296271789"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.518486332./ez430_chronos/simpliciti/Components/bsp/boards/CC430EM/bsp_drivers.c" name="bsp_drivers.c" rcbsApplicability="disable" resourcePath="/ez430_chronos/simpliciti/Components/bsp/boards/CC430EM/bsp_drivers.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1296271789./ez430_chronos/simpliciti/Components/bsp/boards/CC430EM/bsp_drivers.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1296271789./ez430_chronos/simpliciti/Components/bsp/boards/CC430EM/bsp_drivers.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1296271789"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.518486332./ez430_chronos/simpliciti/Components/bsp/drivers/code/bsp_buttons.c" name="bsp_buttons.c" rcbsApplicability="disable" resourcePath="/ez430_chronos/simpliciti/Components/bsp/drivers/code/bsp_buttons.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1296271789./ez430_chronos/simpliciti/Components/bsp/drivers/code/bsp_buttons.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1296271789./ez430_chronos/simpliciti/Components/bsp/drivers/code/bsp_buttons.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1296271789"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.518486332./ez430_chronos/simpliciti/Components/bsp/drivers/code/bsp_leds.c" name="bsp_leds.c" rcbsApplicability="disable" resourcePath="/ez430_chronos/simpliciti/Components/bsp/drivers/code/bsp_leds.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1296271789./ez430_chronos/simpliciti/Components/bsp/drivers/code/bsp_leds.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1296271789./ez430_chronos/simpliciti/Components/bsp/drivers/code/bsp_leds.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1296271789"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.518486332./ez430_chronos/simpliciti/Components/mrfi/radios/family5/mrfi_radio_interface.c" name="mrfi_radio_interface.c" rcbsApplicability="disable" resourcePath="/ez430_chronos/simpliciti/Components/mrfi/radios/family5/mrfi_radio_interface.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1296271789./ez430_chronos/simpliciti/Components/mrfi/radios/family5/mrfi_radio_interface.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1296271789./ez430_chronos/simpliciti/Components/mrfi/radios/family5/mrfi_radio_interface.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1296271789"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.518486332./ez430_chronos/simpliciti/Applications/application/End Device/main_ED_BM.c" name="main_ED_BM.c" rcbsApplicability="disable" resourcePath="/ez430_chronos/simpliciti/Applications/application/End Device/main_ED_BM.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1296271789./ez430_chronos/simpliciti/Applications/application/End Device/main_ED_BM.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1296271789./ez430_chronos/simpliciti/Applications/application/End Device/main_ED_BM.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1296271789"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.518486332./ez430_chronos/simpliciti/Components/bsp/bsp.c" name="bsp.c" rcbsApplicability="disable" resourcePath="/ez430_chronos/simpliciti/Components/bsp/bsp.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1296271789./ez430_chronos/simpliciti/Components/bsp/bsp.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1296271789./ez430_chronos/simpliciti/Components/bsp/bsp.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1296271789"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.518486332./ez430_chronos/simpliciti/Components/mrfi/mrfi.c" name="mrfi.c" rcbsApplicability="disable" resourcePath="/ez430_chronos/simpliciti/Components/mrfi/mrfi.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1296271789./ez430_chronos/simpliciti/Components/mrfi/mrfi.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1296271789./ez430_chronos/simpliciti/Components/mrfi/mrfi.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1296271789"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.518486332./ez430_chronos/simpliciti/Components/nwk/nwk_api.c" name="nwk_api.c" rcbsApplicability="disable" resourcePath="/ez430_chronos/simpliciti/Components/nwk/nwk_api.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1296271789./ez430_chronos/simpliciti/Components/nwk/nwk_api.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1296271789./ez430_chronos/simpliciti/Components/nwk/nwk_api.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1296271789"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.518486332./ez430_chronos/simpliciti/Components/nwk/nwk_frame.c" name="nwk_frame.c" rcbsApplicability="disable" resourcePath="/ez430_chronos/simpliciti/Components/nwk/nwk_frame.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1296271789./ez430_chronos/simpliciti/Components/nwk/nwk_frame.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1296271789./ez430_chronos/simpliciti/Components/nwk/nwk_frame.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1296271789"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.518486332./ez430_chronos/simpliciti/Components/nwk/nwk_globals.c" name="nwk_globals.c" rcbsApplicability="disable" resourcePath="/ez430_chronos/simpliciti/Components/nwk/nwk_globals.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1296271789./ez430_chronos/simpliciti/Components/nwk/nwk_globals.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1296271789./ez430_chronos/simpliciti/Components/nwk/nwk_globals.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1296271789"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.518486332./ez430_chronos/simpliciti/Components/nwk/nwk_QMgmt.c" name="nwk_QMgmt.c" rcbsApplicability="disable" resourcePath="/ez430_chronos/simpliciti/Components/nwk/nwk_QMgmt.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1296271789./ez430_chronos/simpliciti/Components/nwk/nwk_QMgmt.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1296271789./ez430_chronos/simpliciti/Components/nwk/nwk_QMgmt.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1296271789"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.518486332./ez430_chronos/simpliciti/Components/nwk/nwk.c" name="nwk.c" rcbsApplicability="disable" resourcePath="/ez430_chronos/simpliciti/Components/nwk/nwk.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1296271789./ez430_chronos/simpliciti/Components/nwk/nwk.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1296271789./ez430_chronos/simpliciti/Components/nwk/nwk.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1296271789"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.518486332./ez430_chronos/simpliciti/Components/nwk_applications/nwk_freq.c" name="nwk_freq.c" rcbsApplicability="disable" resourcePath="/ez430_chronos/simpliciti/Components/nwk_applications/nwk_freq.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1296271789./ez430_chronos/simpliciti/Components/nwk_applications/nwk_freq.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1296271789./ez430_chronos/simpliciti/Components/nwk_applications/nwk_freq.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1296271789"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.518486332./ez430_chronos/simpliciti/Components/nwk_applications/nwk_ioctl.c" name="nwk_ioctl.c" rcbsApplicability="disable" resourcePath="/ez430_chronos/simpliciti/Components/nwk_applications/nwk_ioctl.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1296271789./ez430_chronos/simpliciti/Components/nwk_applications/nwk_ioctl.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1296271789./ez430_chronos/simpliciti/Components/nwk_applications/nwk_ioctl.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1296271789"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.518486332./ez430_chronos/simpliciti/Components/nwk_applications/nwk_join.c" name="nwk_join.c" rcbsApplicability="disable" resourcePath="/ez430_chronos/simpliciti/Components/nwk_applications/nwk_join.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1296271789./ez430_chronos/simpliciti/Components/nwk_applications/nwk_join.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1296271789./ez430_chronos/simpliciti/Components/nwk_applications/nwk_join.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1296271789"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.518486332./ez430_chronos/simpliciti/Components/nwk_applications/nwk_link.c" name="nwk_link.c" rcbsApplicability="disable" resourcePath="/ez430_chronos/simpliciti/Components/nwk_applications/nwk_link.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1296271789./ez430_chronos/simpliciti/Components/nwk_applications/nwk_link.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1296271789./ez430_chronos/simpliciti/Components/nwk_applications/nwk_link.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1296271789"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.518486332./ez430_chronos/simpliciti/Components/nwk_applications/nwk_mgmt.c" name="nwk_mgmt.c" rcbsApplicability="disable" resourcePath="/ez430_chronos/simpliciti/Components/nwk_applications/nwk_mgmt.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1296271789./ez430_chronos/simpliciti/Components/nwk_applications/nwk_mgmt.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1296271789./ez430_chronos/simpliciti/Components/nwk_applications/nwk_mgmt.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1296271789"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.518486332./ez430_chronos/simpliciti/Components/nwk_applications/nwk_ping.c" name="nwk_ping.c" rcbsApplicability="disable" resourcePath="/ez430_chronos/simpliciti/Components/nwk_applications/nwk_ping.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1296271789./ez430_chronos/simpliciti/Components/nwk_applications/nwk_ping.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1296271789./ez430_chronos/simpliciti/Components/nwk_applications/nwk_ping.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1296271789"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.518486332./ez430_chronos/simpliciti/Components/nwk_applications/nwk_security.c" name="nwk_security.c" rcbsApplicability="disable" resourcePath="/ez430_chronos/simpliciti/Components/nwk_applications/nwk_security.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1296271789./ez430_chronos/simpliciti/Components/nwk_applications/nwk_security.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1296271789./ez430_chronos/simpliciti/Components/nwk_applications/nwk_security.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.1296271789"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.518486332./ez430_chronos/bluerobin/BlueRobin_RX_868MHz.lib" name="BlueRobin_RX_868MHz.lib" rcbsApplicability="disable" resourcePath="/ez430_chronos/bluerobin/BlueRobin_RX_868MHz.lib" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.772028756./ez430_chronos/bluerobin/BlueRobin_RX_868MHz.lib">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.772028756./ez430_chronos/bluerobin/BlueRobin_RX_868MHz.lib" name="MSP430 Linker" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.772028756"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.518486332./ez430_chronos/bluerobin/BlueRobin_RX_433MHz.lib" name="BlueRobin_RX_433MHz.lib" rcbsApplicability="disable" resourcePath="/ez430_chronos/bluerobin/BlueRobin_RX_433MHz.lib" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.772028756./ez430_chronos/bluerobin/BlueRobin_RX_433MHz.lib">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.772028756./ez430_chronos/bluerobin/BlueRobin_RX_433MHz.lib" name="MSP430 Linker" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.772028756"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.518486332./ez430_chronos/simpliciti/CC430_End_Device_868MHz.lib" name="CC430_End_Device_868MHz.lib" rcbsApplicability="disable" resourcePath="/ez430_chronos/simpliciti/CC430_End_Device_868MHz.lib" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.772028756./ez430_chronos/simpliciti/CC430_End_Device_868MHz.lib">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.772028756./ez430_chronos/simpliciti/CC430_End_Device_868MHz.lib" name="MSP430 Linker" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.772028756"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.518486332./ez430_chronos/simpliciti/CC430_End_Device_433MHz.lib" name="CC430_End_Device_433MHz.lib" rcbsApplicability="disable" resourcePath="/ez430_chronos/simpliciti/CC430_End_Device_433MHz.lib" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.772028756./ez430_chronos/simpliciti/CC430_End_Device_433MHz.lib">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.772028756./ez430_chronos/simpliciti/CC430_End_Device_433MHz.lib" name="MSP430 Linker" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.772028756"/>\r
+</resourceConfiguration>\r
+</configuration>\r
+<configuration artifactExtension="out" artifactName="ez430_chronos_433MHz" description="Other regions" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.2101481428" name="433MHz - Limited CCS Core Edition" parent="com.ti.ccstudio.buildDefinitions.MSP430.Debug" postannouncebuildStep="Create flash image: TI-TXT" postbuildStep="&quot;${CG_TOOL_ROOT}/bin/hex${CG_TOOL_SUFFIX}.exe&quot; --ti_txt &quot;${BuildArtifactFileName}&quot; -o &quot;${BuildArtifactFileBaseName}.txt&quot; -order MS -romwidth 16">\r
+<toolChain id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.DebugToolchain.1601118977" name="TI Code Generation Tools" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.DebugToolchain" targetTool="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.1401123618">\r
+<option id="com.ti.ccstudio.buildDefinitions.core.OPT_TAGS.1817675113" superClass="com.ti.ccstudio.buildDefinitions.core.OPT_TAGS" valueType="stringList">\r
+<listOptionValue builtIn="false" value="DEVICE_CONFIGURATION_ID=CC430F6137"/>\r
+<listOptionValue builtIn="false" value="DEVICE_ENDIANNESS=little"/>\r
+<listOptionValue builtIn="false" value="OUTPUT_FORMAT=COFF"/>\r
+<listOptionValue builtIn="false" value="CCS_MBS_VERSION=4.2.0"/>\r
+<listOptionValue builtIn="false" value="LINKER_COMMAND_FILE=lnk_cc430f6137.cmd"/>\r
+<listOptionValue builtIn="false" value="RUNTIME_SUPPORT_LIBRARY=rts430x.lib"/>\r
+<listOptionValue builtIn="false" value="PROJECT_KIND=com.ti.ccstudio.managedbuild.core.ProjectKind_Executable"/>\r
+<listOptionValue builtIn="false" value="IS_ASSEMBLY_ONLY=false"/>\r
+<listOptionValue builtIn="false" value="OUTPUT_TYPE=executable"/>\r
+</option>\r
+<option id="com.ti.ccstudio.buildDefinitions.core.OPT_CODEGEN_VERSION.1314111727" superClass="com.ti.ccstudio.buildDefinitions.core.OPT_CODEGEN_VERSION" value="3.3.1" valueType="string"/>\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.59650022" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug">\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.DIAG_WARNING.1465816490" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.DIAG_WARNING" valueType="stringList">\r
+<listOptionValue builtIn="false" value="225"/>\r
+</option>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.PRINTF_SUPPORT.1114240155" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.PRINTF_SUPPORT" value="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.PRINTF_SUPPORT.minimal" valueType="enumerated"/>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.SILICON_VERSION.24400279" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.SILICON_VERSION" value="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.SILICON_VERSION.mspx" valueType="enumerated"/>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.OPT_LEVEL.1997292667" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.OPT_LEVEL" value="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.OPT_LEVEL.4" valueType="enumerated"/>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.DEFINE.1522035439" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.DEFINE" valueType="definedSymbols">\r
+<listOptionValue builtIn="false" value="__CCE__"/>\r
+<listOptionValue builtIn="false" value="ISM_LF"/>\r
+</option>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.INCLUDE_PATH.278828972" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.INCLUDE_PATH" valueType="includePath">\r
+<listOptionValue builtIn="false" value="&quot;${CCS_INSTALL_ROOT}/msp430/include&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${CG_TOOL_ROOT}/include&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${CCE_INSTALL_ROOT}/msp430/include&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${workspace_loc:/ez430_chronos/include}&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${workspace_loc:/ez430_chronos/driver}&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${workspace_loc:/ez430_chronos/logic}&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${workspace_loc:/ez430_chronos/bluerobin}&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${workspace_loc:/ez430_chronos/simpliciti}&quot;"/>\r
+</option>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.CALL_ASSUMPTIONS.1554825553" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.CALL_ASSUMPTIONS" value="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.CALL_ASSUMPTIONS.0" valueType="enumerated"/>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.GEN_OPT_INFO.782793277" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.GEN_OPT_INFO" value="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.GEN_OPT_INFO.2" valueType="enumerated"/>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.OPT_FOR_SPEED.1678796582" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.OPT_FOR_SPEED" value="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.OPT_FOR_SPEED.0" valueType="enumerated"/>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.AUTO_INLINE.2120143285" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.AUTO_INLINE" value="0" valueType="string"/>\r
+</tool>\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.1401123618" name="MSP430 Linker" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug">\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.HEAP_SIZE.564026115" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.HEAP_SIZE" value="80" valueType="string"/>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.STACK_SIZE.1931166705" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.STACK_SIZE" value="80" valueType="string"/>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.USE_HW_MPY.290097625" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.USE_HW_MPY" value="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.USE_HW_MPY.F5" valueType="enumerated"/>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.OUTPUT_FILE.1585824390" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.OUTPUT_FILE" value="&quot;ez430_chronos_433MHz.out&quot;" valueType="string"/>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.MAP_FILE.1423222500" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.MAP_FILE" value="&quot;ez430_chronos_433MHz.map&quot;" valueType="string"/>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.SEARCH_PATH.422219365" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.SEARCH_PATH" valueType="stringList">\r
+<listOptionValue builtIn="false" value="&quot;${CCS_INSTALL_ROOT}/msp430/include&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${CG_TOOL_ROOT}/lib&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${CG_TOOL_ROOT}/include&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${CCE_INSTALL_ROOT}/msp430/include&quot;"/>\r
+</option>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.LIBRARY.823760917" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.LIBRARY" valueType="libs">\r
+<listOptionValue builtIn="false" value="&quot;rts430x.lib&quot;"/>\r
+</option>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.generatedLinkerCommandFiles.89677944" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.generatedLinkerCommandFiles" valueType="libs">\r
+<listOptionValue builtIn="false" value="&quot;$(GEN_CMDS_QUOTED)&quot;"/>\r
+</option>\r
+</tool>\r
+<macros expandEnvironmentMacros="true"/>\r
+</toolChain>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.2101481428./ez430_chronos/driver/adc12.c" name="adc12.c" rcbsApplicability="disable" resourcePath="/ez430_chronos/driver/adc12.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.59650022./ez430_chronos/driver/adc12.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.59650022./ez430_chronos/driver/adc12.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.59650022"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.2101481428./ez430_chronos/driver/buzzer.c" name="buzzer.c" rcbsApplicability="disable" resourcePath="/ez430_chronos/driver/buzzer.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.59650022./ez430_chronos/driver/buzzer.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.59650022./ez430_chronos/driver/buzzer.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.59650022"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.2101481428./ez430_chronos/driver/display.c" name="display.c" rcbsApplicability="disable" resourcePath="/ez430_chronos/driver/display.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.59650022./ez430_chronos/driver/display.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.59650022./ez430_chronos/driver/display.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.59650022"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.2101481428./ez430_chronos/driver/pmm.c" name="pmm.c" rcbsApplicability="disable" resourcePath="/ez430_chronos/driver/pmm.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.59650022./ez430_chronos/driver/pmm.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.59650022./ez430_chronos/driver/pmm.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.59650022"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.2101481428./ez430_chronos/driver/ports.c" name="ports.c" rcbsApplicability="disable" resourcePath="/ez430_chronos/driver/ports.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.59650022./ez430_chronos/driver/ports.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.59650022./ez430_chronos/driver/ports.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.59650022"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.2101481428./ez430_chronos/driver/radio.c" name="radio.c" rcbsApplicability="disable" resourcePath="/ez430_chronos/driver/radio.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.59650022./ez430_chronos/driver/radio.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.59650022./ez430_chronos/driver/radio.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.59650022"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.2101481428./ez430_chronos/driver/rf1a.c" name="rf1a.c" rcbsApplicability="disable" resourcePath="/ez430_chronos/driver/rf1a.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.59650022./ez430_chronos/driver/rf1a.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.59650022./ez430_chronos/driver/rf1a.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.59650022"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.2101481428./ez430_chronos/driver/timer.c" name="timer.c" rcbsApplicability="disable" resourcePath="/ez430_chronos/driver/timer.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.59650022./ez430_chronos/driver/timer.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.59650022./ez430_chronos/driver/timer.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.59650022"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.2101481428./ez430_chronos/driver/vti_as.c" name="vti_as.c" rcbsApplicability="disable" resourcePath="/ez430_chronos/driver/vti_as.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.59650022./ez430_chronos/driver/vti_as.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.59650022./ez430_chronos/driver/vti_as.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.59650022"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.2101481428./ez430_chronos/driver/vti_ps.c" name="vti_ps.c" rcbsApplicability="disable" resourcePath="/ez430_chronos/driver/vti_ps.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.59650022./ez430_chronos/driver/vti_ps.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.59650022./ez430_chronos/driver/vti_ps.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.59650022"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.2101481428./ez430_chronos/simpliciti/Components/mrfi/radios/family5/mrfi_radio_interface.c" name="mrfi_radio_interface.c" rcbsApplicability="disable" resourcePath="/ez430_chronos/simpliciti/Components/mrfi/radios/family5/mrfi_radio_interface.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.59650022./ez430_chronos/simpliciti/Components/mrfi/radios/family5/mrfi_radio_interface.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.59650022./ez430_chronos/simpliciti/Components/mrfi/radios/family5/mrfi_radio_interface.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.59650022"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.2101481428./ez430_chronos/simpliciti/Components/mrfi/radios/family5/mrfi_radio.c" name="mrfi_radio.c" rcbsApplicability="disable" resourcePath="/ez430_chronos/simpliciti/Components/mrfi/radios/family5/mrfi_radio.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.59650022./ez430_chronos/simpliciti/Components/mrfi/radios/family5/mrfi_radio.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.59650022./ez430_chronos/simpliciti/Components/mrfi/radios/family5/mrfi_radio.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.59650022"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.2101481428./ez430_chronos/simpliciti/Components/bsp/boards/CC430EM/bsp_board.c" name="bsp_board.c" rcbsApplicability="disable" resourcePath="/ez430_chronos/simpliciti/Components/bsp/boards/CC430EM/bsp_board.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.59650022./ez430_chronos/simpliciti/Components/bsp/boards/CC430EM/bsp_board.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.59650022./ez430_chronos/simpliciti/Components/bsp/boards/CC430EM/bsp_board.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.59650022"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.2101481428./ez430_chronos/simpliciti/Components/bsp/boards/CC430EM/bsp_drivers.c" name="bsp_drivers.c" rcbsApplicability="disable" resourcePath="/ez430_chronos/simpliciti/Components/bsp/boards/CC430EM/bsp_drivers.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.59650022./ez430_chronos/simpliciti/Components/bsp/boards/CC430EM/bsp_drivers.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.59650022./ez430_chronos/simpliciti/Components/bsp/boards/CC430EM/bsp_drivers.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.59650022"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.2101481428./ez430_chronos/simpliciti/Components/bsp/drivers/code/bsp_buttons.c" name="bsp_buttons.c" rcbsApplicability="disable" resourcePath="/ez430_chronos/simpliciti/Components/bsp/drivers/code/bsp_buttons.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.59650022./ez430_chronos/simpliciti/Components/bsp/drivers/code/bsp_buttons.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.59650022./ez430_chronos/simpliciti/Components/bsp/drivers/code/bsp_buttons.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.59650022"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.2101481428./ez430_chronos/simpliciti/Components/bsp/drivers/code/bsp_leds.c" name="bsp_leds.c" rcbsApplicability="disable" resourcePath="/ez430_chronos/simpliciti/Components/bsp/drivers/code/bsp_leds.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.59650022./ez430_chronos/simpliciti/Components/bsp/drivers/code/bsp_leds.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.59650022./ez430_chronos/simpliciti/Components/bsp/drivers/code/bsp_leds.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.59650022"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.2101481428./ez430_chronos/simpliciti/Applications/application/End Device/main_ED_BM.c" name="main_ED_BM.c" rcbsApplicability="disable" resourcePath="/ez430_chronos/simpliciti/Applications/application/End Device/main_ED_BM.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.59650022./ez430_chronos/simpliciti/Applications/application/End Device/main_ED_BM.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.59650022./ez430_chronos/simpliciti/Applications/application/End Device/main_ED_BM.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.59650022"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.2101481428./ez430_chronos/simpliciti/Components/bsp/bsp.c" name="bsp.c" rcbsApplicability="disable" resourcePath="/ez430_chronos/simpliciti/Components/bsp/bsp.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.59650022./ez430_chronos/simpliciti/Components/bsp/bsp.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.59650022./ez430_chronos/simpliciti/Components/bsp/bsp.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.59650022"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.2101481428./ez430_chronos/simpliciti/Components/mrfi/mrfi.c" name="mrfi.c" rcbsApplicability="disable" resourcePath="/ez430_chronos/simpliciti/Components/mrfi/mrfi.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.59650022./ez430_chronos/simpliciti/Components/mrfi/mrfi.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.59650022./ez430_chronos/simpliciti/Components/mrfi/mrfi.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.59650022"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.2101481428./ez430_chronos/simpliciti/Components/nwk/nwk_api.c" name="nwk_api.c" rcbsApplicability="disable" resourcePath="/ez430_chronos/simpliciti/Components/nwk/nwk_api.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.59650022./ez430_chronos/simpliciti/Components/nwk/nwk_api.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.59650022./ez430_chronos/simpliciti/Components/nwk/nwk_api.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.59650022"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.2101481428./ez430_chronos/simpliciti/Components/nwk/nwk_frame.c" name="nwk_frame.c" rcbsApplicability="disable" resourcePath="/ez430_chronos/simpliciti/Components/nwk/nwk_frame.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.59650022./ez430_chronos/simpliciti/Components/nwk/nwk_frame.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.59650022./ez430_chronos/simpliciti/Components/nwk/nwk_frame.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.59650022"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.2101481428./ez430_chronos/simpliciti/Components/nwk/nwk_globals.c" name="nwk_globals.c" rcbsApplicability="disable" resourcePath="/ez430_chronos/simpliciti/Components/nwk/nwk_globals.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.59650022./ez430_chronos/simpliciti/Components/nwk/nwk_globals.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.59650022./ez430_chronos/simpliciti/Components/nwk/nwk_globals.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.59650022"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.2101481428./ez430_chronos/simpliciti/Components/nwk/nwk_QMgmt.c" name="nwk_QMgmt.c" rcbsApplicability="disable" resourcePath="/ez430_chronos/simpliciti/Components/nwk/nwk_QMgmt.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.59650022./ez430_chronos/simpliciti/Components/nwk/nwk_QMgmt.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.59650022./ez430_chronos/simpliciti/Components/nwk/nwk_QMgmt.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.59650022"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.2101481428./ez430_chronos/simpliciti/Components/nwk/nwk.c" name="nwk.c" rcbsApplicability="disable" resourcePath="/ez430_chronos/simpliciti/Components/nwk/nwk.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.59650022./ez430_chronos/simpliciti/Components/nwk/nwk.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.59650022./ez430_chronos/simpliciti/Components/nwk/nwk.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.59650022"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.2101481428./ez430_chronos/simpliciti/Components/nwk_applications/nwk_freq.c" name="nwk_freq.c" rcbsApplicability="disable" resourcePath="/ez430_chronos/simpliciti/Components/nwk_applications/nwk_freq.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.59650022./ez430_chronos/simpliciti/Components/nwk_applications/nwk_freq.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.59650022./ez430_chronos/simpliciti/Components/nwk_applications/nwk_freq.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.59650022"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.2101481428./ez430_chronos/simpliciti/Components/nwk_applications/nwk_ioctl.c" name="nwk_ioctl.c" rcbsApplicability="disable" resourcePath="/ez430_chronos/simpliciti/Components/nwk_applications/nwk_ioctl.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.59650022./ez430_chronos/simpliciti/Components/nwk_applications/nwk_ioctl.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.59650022./ez430_chronos/simpliciti/Components/nwk_applications/nwk_ioctl.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.59650022"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.2101481428./ez430_chronos/simpliciti/Components/nwk_applications/nwk_join.c" name="nwk_join.c" rcbsApplicability="disable" resourcePath="/ez430_chronos/simpliciti/Components/nwk_applications/nwk_join.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.59650022./ez430_chronos/simpliciti/Components/nwk_applications/nwk_join.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.59650022./ez430_chronos/simpliciti/Components/nwk_applications/nwk_join.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.59650022"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.2101481428./ez430_chronos/simpliciti/Components/nwk_applications/nwk_link.c" name="nwk_link.c" rcbsApplicability="disable" resourcePath="/ez430_chronos/simpliciti/Components/nwk_applications/nwk_link.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.59650022./ez430_chronos/simpliciti/Components/nwk_applications/nwk_link.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.59650022./ez430_chronos/simpliciti/Components/nwk_applications/nwk_link.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.59650022"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.2101481428./ez430_chronos/simpliciti/Components/nwk_applications/nwk_mgmt.c" name="nwk_mgmt.c" rcbsApplicability="disable" resourcePath="/ez430_chronos/simpliciti/Components/nwk_applications/nwk_mgmt.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.59650022./ez430_chronos/simpliciti/Components/nwk_applications/nwk_mgmt.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.59650022./ez430_chronos/simpliciti/Components/nwk_applications/nwk_mgmt.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.59650022"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.2101481428./ez430_chronos/simpliciti/Components/nwk_applications/nwk_ping.c" name="nwk_ping.c" rcbsApplicability="disable" resourcePath="/ez430_chronos/simpliciti/Components/nwk_applications/nwk_ping.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.59650022./ez430_chronos/simpliciti/Components/nwk_applications/nwk_ping.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.59650022./ez430_chronos/simpliciti/Components/nwk_applications/nwk_ping.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.59650022"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.2101481428./ez430_chronos/simpliciti/Components/nwk_applications/nwk_security.c" name="nwk_security.c" rcbsApplicability="disable" resourcePath="/ez430_chronos/simpliciti/Components/nwk_applications/nwk_security.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.59650022./ez430_chronos/simpliciti/Components/nwk_applications/nwk_security.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.59650022./ez430_chronos/simpliciti/Components/nwk_applications/nwk_security.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.59650022"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.2101481428./ez430_chronos/bluerobin/BlueRobin_RX_868MHz.lib" name="BlueRobin_RX_868MHz.lib" rcbsApplicability="disable" resourcePath="/ez430_chronos/bluerobin/BlueRobin_RX_868MHz.lib" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.1401123618./ez430_chronos/bluerobin/BlueRobin_RX_868MHz.lib">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.1401123618./ez430_chronos/bluerobin/BlueRobin_RX_868MHz.lib" name="MSP430 Linker" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.1401123618"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="false" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.2101481428./ez430_chronos/bluerobin/BlueRobin_RX_433MHz.lib" name="BlueRobin_RX_433MHz.lib" rcbsApplicability="disable" resourcePath="/ez430_chronos/bluerobin/BlueRobin_RX_433MHz.lib" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.1401123618./ez430_chronos/bluerobin/BlueRobin_RX_433MHz.lib">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.1401123618./ez430_chronos/bluerobin/BlueRobin_RX_433MHz.lib" name="MSP430 Linker" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.1401123618"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.2101481428./ez430_chronos/bluerobin/BlueRobin_RX_915MHz.lib" name="BlueRobin_RX_915MHz.lib" rcbsApplicability="disable" resourcePath="/ez430_chronos/bluerobin/BlueRobin_RX_915MHz.lib" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.1401123618./ez430_chronos/bluerobin/BlueRobin_RX_915MHz.lib">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.1401123618./ez430_chronos/bluerobin/BlueRobin_RX_915MHz.lib" name="MSP430 Linker" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.1401123618"/>\r
+</resourceConfiguration>\r
+</configuration>\r
+<configuration artifactExtension="out" artifactName="ez430_chronos_915MHz" description="USA" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.1834157678" name="915MHz - Unrestricted CCS Platinum" parent="com.ti.ccstudio.buildDefinitions.MSP430.Debug" postannouncebuildStep="Create flash image: TI-TXT" postbuildStep="&quot;${CG_TOOL_ROOT}/bin/hex${CG_TOOL_SUFFIX}.exe&quot; --ti_txt &quot;${BuildArtifactFileName}&quot; -o &quot;${BuildArtifactFileBaseName}.txt&quot; -order MS -romwidth 16">\r
+<toolChain id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.DebugToolchain.862966845" name="TI Code Generation Tools" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.DebugToolchain" targetTool="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.1111017585">\r
+<option id="com.ti.ccstudio.buildDefinitions.core.OPT_TAGS.1189908261" superClass="com.ti.ccstudio.buildDefinitions.core.OPT_TAGS" valueType="stringList">\r
+<listOptionValue builtIn="false" value="DEVICE_CONFIGURATION_ID=CC430F6137"/>\r
+<listOptionValue builtIn="false" value="DEVICE_ENDIANNESS=little"/>\r
+<listOptionValue builtIn="false" value="OUTPUT_FORMAT=COFF"/>\r
+<listOptionValue builtIn="false" value="CCS_MBS_VERSION=4.2.0"/>\r
+<listOptionValue builtIn="false" value="LINKER_COMMAND_FILE=lnk_cc430f6137.cmd"/>\r
+<listOptionValue builtIn="false" value="RUNTIME_SUPPORT_LIBRARY=rts430x.lib"/>\r
+<listOptionValue builtIn="false" value="PROJECT_KIND=com.ti.ccstudio.managedbuild.core.ProjectKind_Executable"/>\r
+<listOptionValue builtIn="false" value="IS_ASSEMBLY_ONLY=false"/>\r
+<listOptionValue builtIn="false" value="OUTPUT_TYPE=executable"/>\r
+</option>\r
+<option id="com.ti.ccstudio.buildDefinitions.core.OPT_CODEGEN_VERSION.1111720337" superClass="com.ti.ccstudio.buildDefinitions.core.OPT_CODEGEN_VERSION" value="3.3.1" valueType="string"/>\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.2018020710" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug">\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.DIAG_WARNING.192227313" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.DIAG_WARNING" valueType="stringList">\r
+<listOptionValue builtIn="false" value="225"/>\r
+</option>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.PRINTF_SUPPORT.570393412" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.PRINTF_SUPPORT" value="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.PRINTF_SUPPORT.minimal" valueType="enumerated"/>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.SILICON_VERSION.9733366" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.SILICON_VERSION" value="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.SILICON_VERSION.mspx" valueType="enumerated"/>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.OPT_LEVEL.1865584303" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.OPT_LEVEL" value="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.OPT_LEVEL.4" valueType="enumerated"/>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.DEFINE.1135659681" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.DEFINE" valueType="definedSymbols">\r
+<listOptionValue builtIn="false" value="__CCE__"/>\r
+<listOptionValue builtIn="false" value="ISM_US"/>\r
+<listOptionValue builtIn="false" value="__CC430F6137__"/>\r
+<listOptionValue builtIn="false" value="MRFI_CC430"/>\r
+</option>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.INCLUDE_PATH.301728950" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.INCLUDE_PATH" valueType="includePath">\r
+<listOptionValue builtIn="false" value="&quot;${CCS_INSTALL_ROOT}/msp430/include&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${CG_TOOL_ROOT}/include&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${CCE_INSTALL_ROOT}/msp430/include&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${workspace_loc:/ez430_chronos/include}&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${workspace_loc:/ez430_chronos/driver}&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${workspace_loc:/ez430_chronos/logic}&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${workspace_loc:/ez430_chronos/bluerobin}&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${workspace_loc:/ez430_chronos/simpliciti}&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${workspace_loc:/ez430_chronos/simpliciti/Applications/application/End Device}&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${workspace_loc:/ez430_chronos/simpliciti/Components/bsp}&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${workspace_loc:/ez430_chronos/simpliciti/Components/bsp/boards}&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${workspace_loc:/ez430_chronos/simpliciti/Components/bsp/boards/CC430EM}&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${workspace_loc:/ez430_chronos/simpliciti/Components/bsp/boards/CC430EM/bsp_external}&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${workspace_loc:/ez430_chronos/simpliciti/Components/bsp/drivers}&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${workspace_loc:/ez430_chronos/simpliciti/Components/bsp/drivers/code}&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${workspace_loc:/ez430_chronos/simpliciti/Components/bsp/mcus}&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${workspace_loc:/ez430_chronos/simpliciti/Components/mrfi}&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${workspace_loc:/ez430_chronos/simpliciti/Components/mrfi/radios}&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${workspace_loc:/ez430_chronos/simpliciti/Components/mrfi/radios/family5}&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${workspace_loc:/ez430_chronos/simpliciti/Components/mrfi/smartrf}&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${workspace_loc:/ez430_chronos/simpliciti/Components/nwk}&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${workspace_loc:/ez430_chronos/simpliciti/Components/nwk_applications}&quot;"/>\r
+</option>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.CALL_ASSUMPTIONS.1269468845" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.CALL_ASSUMPTIONS" value="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.CALL_ASSUMPTIONS.0" valueType="enumerated"/>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.GEN_OPT_INFO.2104699763" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.GEN_OPT_INFO" value="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.GEN_OPT_INFO.2" valueType="enumerated"/>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.CMD_FILE.1231377896" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.CMD_FILE" valueType="stringList">\r
+<listOptionValue builtIn="false" value="&quot;${workspace_loc:/ez430_chronos/simpliciti/Applications/configuration/smpl_nwk_config.dat}&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${workspace_loc:/ez430_chronos/simpliciti/Applications/configuration/End Device/smpl_config.dat}&quot;"/>\r
+</option>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.OPT_FOR_SPEED.1322174083" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.OPT_FOR_SPEED" value="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.OPT_FOR_SPEED.0" valueType="enumerated"/>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.AUTO_INLINE.609715029" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.AUTO_INLINE" value="0" valueType="string"/>\r
+</tool>\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.1111017585" name="MSP430 Linker" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug">\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.HEAP_SIZE.1427696934" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.HEAP_SIZE" value="80" valueType="string"/>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.STACK_SIZE.158415280" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.STACK_SIZE" value="80" valueType="string"/>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.USE_HW_MPY.1510579454" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.USE_HW_MPY" value="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.USE_HW_MPY.F5" valueType="enumerated"/>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.OUTPUT_FILE.1415288672" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.OUTPUT_FILE" value="&quot;ez430_chronos_915MHz.out&quot;" valueType="string"/>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.MAP_FILE.827872624" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.MAP_FILE" value="&quot;ez430_chronos_915MHz.map&quot;" valueType="string"/>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.SEARCH_PATH.2041841311" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.SEARCH_PATH" valueType="stringList">\r
+<listOptionValue builtIn="false" value="&quot;${CCS_INSTALL_ROOT}/msp430/include&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${CG_TOOL_ROOT}/lib&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${CG_TOOL_ROOT}/include&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${CCE_INSTALL_ROOT}/msp430/include&quot;"/>\r
+</option>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.LIBRARY.986268171" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.LIBRARY" valueType="libs">\r
+<listOptionValue builtIn="false" value="&quot;rts430x.lib&quot;"/>\r
+</option>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.generatedLinkerCommandFiles.471858087" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.generatedLinkerCommandFiles" valueType="libs">\r
+<listOptionValue builtIn="false" value="&quot;$(GEN_CMDS_QUOTED)&quot;"/>\r
+</option>\r
+</tool>\r
+<macros expandEnvironmentMacros="true"/>\r
+</toolChain>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.1834157678./ez430_chronos/simpliciti/Components/mrfi/radios/family5/mrfi_radio.c" name="mrfi_radio.c" rcbsApplicability="disable" resourcePath="/ez430_chronos/simpliciti/Components/mrfi/radios/family5/mrfi_radio.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.2018020710./ez430_chronos/simpliciti/Components/mrfi/radios/family5/mrfi_radio.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.2018020710./ez430_chronos/simpliciti/Components/mrfi/radios/family5/mrfi_radio.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.2018020710"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.1834157678./ez430_chronos/simpliciti/Components/bsp/boards/CC430EM/bsp_board.c" name="bsp_board.c" rcbsApplicability="disable" resourcePath="/ez430_chronos/simpliciti/Components/bsp/boards/CC430EM/bsp_board.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.2018020710./ez430_chronos/simpliciti/Components/bsp/boards/CC430EM/bsp_board.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.2018020710./ez430_chronos/simpliciti/Components/bsp/boards/CC430EM/bsp_board.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.2018020710"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.1834157678./ez430_chronos/simpliciti/Components/bsp/boards/CC430EM/bsp_drivers.c" name="bsp_drivers.c" rcbsApplicability="disable" resourcePath="/ez430_chronos/simpliciti/Components/bsp/boards/CC430EM/bsp_drivers.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.2018020710./ez430_chronos/simpliciti/Components/bsp/boards/CC430EM/bsp_drivers.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.2018020710./ez430_chronos/simpliciti/Components/bsp/boards/CC430EM/bsp_drivers.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.2018020710"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.1834157678./ez430_chronos/simpliciti/Components/bsp/drivers/code/bsp_leds.c" name="bsp_leds.c" rcbsApplicability="disable" resourcePath="/ez430_chronos/simpliciti/Components/bsp/drivers/code/bsp_leds.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.2018020710./ez430_chronos/simpliciti/Components/bsp/drivers/code/bsp_leds.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.2018020710./ez430_chronos/simpliciti/Components/bsp/drivers/code/bsp_leds.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.2018020710"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.1834157678./ez430_chronos/simpliciti/Components/bsp/drivers/code/bsp_buttons.c" name="bsp_buttons.c" rcbsApplicability="disable" resourcePath="/ez430_chronos/simpliciti/Components/bsp/drivers/code/bsp_buttons.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.2018020710./ez430_chronos/simpliciti/Components/bsp/drivers/code/bsp_buttons.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.2018020710./ez430_chronos/simpliciti/Components/bsp/drivers/code/bsp_buttons.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.2018020710"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.1834157678./ez430_chronos/simpliciti/Components/mrfi/radios/family5/mrfi_radio_interface.c" name="mrfi_radio_interface.c" rcbsApplicability="disable" resourcePath="/ez430_chronos/simpliciti/Components/mrfi/radios/family5/mrfi_radio_interface.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.2018020710./ez430_chronos/simpliciti/Components/mrfi/radios/family5/mrfi_radio_interface.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.2018020710./ez430_chronos/simpliciti/Components/mrfi/radios/family5/mrfi_radio_interface.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.2018020710"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.1834157678./ez430_chronos/bluerobin/BlueRobin_RX_868MHz.lib" name="BlueRobin_RX_868MHz.lib" rcbsApplicability="disable" resourcePath="/ez430_chronos/bluerobin/BlueRobin_RX_868MHz.lib" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.1111017585./ez430_chronos/bluerobin/BlueRobin_RX_868MHz.lib">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.1111017585./ez430_chronos/bluerobin/BlueRobin_RX_868MHz.lib" name="MSP430 Linker" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.1111017585"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.1834157678./ez430_chronos/bluerobin/BlueRobin_RX_433MHz.lib" name="BlueRobin_RX_433MHz.lib" rcbsApplicability="disable" resourcePath="/ez430_chronos/bluerobin/BlueRobin_RX_433MHz.lib" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.1111017585./ez430_chronos/bluerobin/BlueRobin_RX_433MHz.lib">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.1111017585./ez430_chronos/bluerobin/BlueRobin_RX_433MHz.lib" name="MSP430 Linker" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.1111017585"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="false" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.1834157678./ez430_chronos/bluerobin/BlueRobin_RX_915MHz.lib" name="BlueRobin_RX_915MHz.lib" rcbsApplicability="disable" resourcePath="/ez430_chronos/bluerobin/BlueRobin_RX_915MHz.lib" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.1111017585./ez430_chronos/bluerobin/BlueRobin_RX_915MHz.lib">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.1111017585./ez430_chronos/bluerobin/BlueRobin_RX_915MHz.lib" name="MSP430 Linker" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.1111017585"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.1834157678./ez430_chronos/simpliciti/CC430_End_Device_868MHz.lib" name="CC430_End_Device_868MHz.lib" rcbsApplicability="disable" resourcePath="/ez430_chronos/simpliciti/CC430_End_Device_868MHz.lib" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.1111017585./ez430_chronos/simpliciti/CC430_End_Device_868MHz.lib">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.1111017585./ez430_chronos/simpliciti/CC430_End_Device_868MHz.lib" name="MSP430 Linker" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.1111017585"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.1834157678./ez430_chronos/simpliciti/CC430_End_Device_433MHz.lib" name="CC430_End_Device_433MHz.lib" rcbsApplicability="disable" resourcePath="/ez430_chronos/simpliciti/CC430_End_Device_433MHz.lib" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.1111017585./ez430_chronos/simpliciti/CC430_End_Device_433MHz.lib">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.1111017585./ez430_chronos/simpliciti/CC430_End_Device_433MHz.lib" name="MSP430 Linker" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.1111017585"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.1834157678./ez430_chronos/simpliciti/CC430_End_Device_915MHz.lib" name="CC430_End_Device_915MHz.lib" rcbsApplicability="disable" resourcePath="/ez430_chronos/simpliciti/CC430_End_Device_915MHz.lib" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.1111017585./ez430_chronos/simpliciti/CC430_End_Device_915MHz.lib">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.1111017585./ez430_chronos/simpliciti/CC430_End_Device_915MHz.lib" name="MSP430 Linker" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.1111017585"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.1834157678./ez430_chronos/driver/ez430_chronos_drivers.lib" name="ez430_chronos_drivers.lib" rcbsApplicability="disable" resourcePath="/ez430_chronos/driver/ez430_chronos_drivers.lib" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.1111017585./ez430_chronos/driver/ez430_chronos_drivers.lib">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.1111017585./ez430_chronos/driver/ez430_chronos_drivers.lib" name="MSP430 Linker" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.1111017585"/>\r
+</resourceConfiguration>\r
+</configuration>\r
+<configuration artifactExtension="out" artifactName="ez430_chronos_433MHz" description="Other regions" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.1257141332" name="433MHz - Unrestricted CCS Platinum" parent="com.ti.ccstudio.buildDefinitions.MSP430.Debug" postannouncebuildStep="Create flash image: TI-TXT" postbuildStep="&quot;${CG_TOOL_ROOT}/bin/hex${CG_TOOL_SUFFIX}.exe&quot; --ti_txt &quot;${BuildArtifactFileName}&quot; -o &quot;${BuildArtifactFileBaseName}.txt&quot; -order MS -romwidth 16">\r
+<toolChain id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.DebugToolchain.1835336946" name="TI Code Generation Tools" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.DebugToolchain" targetTool="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.1210929185">\r
+<option id="com.ti.ccstudio.buildDefinitions.core.OPT_TAGS.1171183854" superClass="com.ti.ccstudio.buildDefinitions.core.OPT_TAGS" valueType="stringList">\r
+<listOptionValue builtIn="false" value="DEVICE_CONFIGURATION_ID=CC430F6137"/>\r
+<listOptionValue builtIn="false" value="DEVICE_ENDIANNESS=little"/>\r
+<listOptionValue builtIn="false" value="OUTPUT_FORMAT=COFF"/>\r
+<listOptionValue builtIn="false" value="CCS_MBS_VERSION=4.2.0"/>\r
+<listOptionValue builtIn="false" value="LINKER_COMMAND_FILE=lnk_cc430f6137.cmd"/>\r
+<listOptionValue builtIn="false" value="RUNTIME_SUPPORT_LIBRARY=rts430x.lib"/>\r
+<listOptionValue builtIn="false" value="PROJECT_KIND=com.ti.ccstudio.managedbuild.core.ProjectKind_Executable"/>\r
+<listOptionValue builtIn="false" value="IS_ASSEMBLY_ONLY=false"/>\r
+<listOptionValue builtIn="false" value="OUTPUT_TYPE=executable"/>\r
+</option>\r
+<option id="com.ti.ccstudio.buildDefinitions.core.OPT_CODEGEN_VERSION.1907935429" superClass="com.ti.ccstudio.buildDefinitions.core.OPT_CODEGEN_VERSION" value="3.3.1" valueType="string"/>\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.2087220484" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug">\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.DIAG_WARNING.125091283" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.DIAG_WARNING" valueType="stringList">\r
+<listOptionValue builtIn="false" value="225"/>\r
+</option>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.PRINTF_SUPPORT.1389077348" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.PRINTF_SUPPORT" value="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.PRINTF_SUPPORT.minimal" valueType="enumerated"/>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.SILICON_VERSION.392571941" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.SILICON_VERSION" value="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.SILICON_VERSION.mspx" valueType="enumerated"/>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.OPT_LEVEL.212186686" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.OPT_LEVEL" value="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.OPT_LEVEL.4" valueType="enumerated"/>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.DEFINE.1467740140" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.DEFINE" valueType="definedSymbols">\r
+<listOptionValue builtIn="false" value="__CCE__"/>\r
+<listOptionValue builtIn="false" value="ISM_LF"/>\r
+<listOptionValue builtIn="false" value="__CC430F6137__"/>\r
+<listOptionValue builtIn="false" value="MRFI_CC430"/>\r
+</option>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.INCLUDE_PATH.1973452792" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.INCLUDE_PATH" valueType="includePath">\r
+<listOptionValue builtIn="false" value="&quot;${CCS_INSTALL_ROOT}/msp430/include&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${CG_TOOL_ROOT}/include&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${CCE_INSTALL_ROOT}/msp430/include&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${workspace_loc:/ez430_chronos/include}&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${workspace_loc:/ez430_chronos/driver}&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${workspace_loc:/ez430_chronos/logic}&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${workspace_loc:/ez430_chronos/bluerobin}&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${workspace_loc:/ez430_chronos/simpliciti}&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${workspace_loc:/ez430_chronos/simpliciti/Applications/application/End Device}&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${workspace_loc:/ez430_chronos/simpliciti/Components/bsp}&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${workspace_loc:/ez430_chronos/simpliciti/Components/bsp/boards}&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${workspace_loc:/ez430_chronos/simpliciti/Components/bsp/boards/CC430EM}&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${workspace_loc:/ez430_chronos/simpliciti/Components/bsp/boards/CC430EM/bsp_external}&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${workspace_loc:/ez430_chronos/simpliciti/Components/bsp/drivers}&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${workspace_loc:/ez430_chronos/simpliciti/Components/bsp/drivers/code}&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${workspace_loc:/ez430_chronos/simpliciti/Components/bsp/mcus}&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${workspace_loc:/ez430_chronos/simpliciti/Components/mrfi}&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${workspace_loc:/ez430_chronos/simpliciti/Components/mrfi/radios}&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${workspace_loc:/ez430_chronos/simpliciti/Components/mrfi/radios/family5}&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${workspace_loc:/ez430_chronos/simpliciti/Components/mrfi/smartrf}&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${workspace_loc:/ez430_chronos/simpliciti/Components/nwk}&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${workspace_loc:/ez430_chronos/simpliciti/Components/nwk_applications}&quot;"/>\r
+</option>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.CALL_ASSUMPTIONS.355442185" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.CALL_ASSUMPTIONS" value="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.CALL_ASSUMPTIONS.0" valueType="enumerated"/>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.GEN_OPT_INFO.1404269002" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.GEN_OPT_INFO" value="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.GEN_OPT_INFO.2" valueType="enumerated"/>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.CMD_FILE.1976064282" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.CMD_FILE" valueType="stringList">\r
+<listOptionValue builtIn="false" value="&quot;${workspace_loc:/ez430_chronos/simpliciti/Applications/configuration/smpl_nwk_config.dat}&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${workspace_loc:/ez430_chronos/simpliciti/Applications/configuration/End Device/smpl_config.dat}&quot;"/>\r
+</option>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.OPT_FOR_SPEED.445549590" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.OPT_FOR_SPEED" value="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.OPT_FOR_SPEED.0" valueType="enumerated"/>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.AUTO_INLINE.1666991329" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.compilerID.AUTO_INLINE" value="0" valueType="string"/>\r
+</tool>\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.1210929185" name="MSP430 Linker" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug">\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.HEAP_SIZE.1564973086" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.HEAP_SIZE" value="80" valueType="string"/>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.STACK_SIZE.890946576" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.STACK_SIZE" value="80" valueType="string"/>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.USE_HW_MPY.1694064602" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.USE_HW_MPY" value="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.USE_HW_MPY.F5" valueType="enumerated"/>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.OUTPUT_FILE.2059640896" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.OUTPUT_FILE" value="&quot;ez430_chronos_433MHz.out&quot;" valueType="string"/>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.MAP_FILE.1431450887" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.MAP_FILE" value="&quot;ez430_chronos_433MHz.map&quot;" valueType="string"/>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.SEARCH_PATH.1867262408" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.SEARCH_PATH" valueType="stringList">\r
+<listOptionValue builtIn="false" value="&quot;${CCS_INSTALL_ROOT}/msp430/include&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${CG_TOOL_ROOT}/lib&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${CG_TOOL_ROOT}/include&quot;"/>\r
+<listOptionValue builtIn="false" value="&quot;${CCE_INSTALL_ROOT}/msp430/include&quot;"/>\r
+</option>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.LIBRARY.1364562881" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.LIBRARY" valueType="libs">\r
+<listOptionValue builtIn="false" value="&quot;rts430x.lib&quot;"/>\r
+</option>\r
+<option id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.generatedLinkerCommandFiles.1732299936" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.linkerID.generatedLinkerCommandFiles" valueType="libs">\r
+<listOptionValue builtIn="false" value="&quot;$(GEN_CMDS_QUOTED)&quot;"/>\r
+</option>\r
+</tool>\r
+<macros expandEnvironmentMacros="true"/>\r
+</toolChain>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.1257141332./ez430_chronos/simpliciti/Components/mrfi/radios/family5/mrfi_radio.c" name="mrfi_radio.c" rcbsApplicability="disable" resourcePath="/ez430_chronos/simpliciti/Components/mrfi/radios/family5/mrfi_radio.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.2087220484./ez430_chronos/simpliciti/Components/mrfi/radios/family5/mrfi_radio.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.2087220484./ez430_chronos/simpliciti/Components/mrfi/radios/family5/mrfi_radio.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.2087220484"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.1257141332./ez430_chronos/simpliciti/Components/bsp/boards/CC430EM/bsp_board.c" name="bsp_board.c" rcbsApplicability="disable" resourcePath="/ez430_chronos/simpliciti/Components/bsp/boards/CC430EM/bsp_board.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.2087220484./ez430_chronos/simpliciti/Components/bsp/boards/CC430EM/bsp_board.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.2087220484./ez430_chronos/simpliciti/Components/bsp/boards/CC430EM/bsp_board.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.2087220484"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.1257141332./ez430_chronos/simpliciti/Components/bsp/boards/CC430EM/bsp_drivers.c" name="bsp_drivers.c" rcbsApplicability="disable" resourcePath="/ez430_chronos/simpliciti/Components/bsp/boards/CC430EM/bsp_drivers.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.2087220484./ez430_chronos/simpliciti/Components/bsp/boards/CC430EM/bsp_drivers.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.2087220484./ez430_chronos/simpliciti/Components/bsp/boards/CC430EM/bsp_drivers.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.2087220484"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.1257141332./ez430_chronos/simpliciti/Components/bsp/drivers/code/bsp_leds.c" name="bsp_leds.c" rcbsApplicability="disable" resourcePath="/ez430_chronos/simpliciti/Components/bsp/drivers/code/bsp_leds.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.2087220484./ez430_chronos/simpliciti/Components/bsp/drivers/code/bsp_leds.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.2087220484./ez430_chronos/simpliciti/Components/bsp/drivers/code/bsp_leds.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.2087220484"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.1257141332./ez430_chronos/simpliciti/Components/bsp/drivers/code/bsp_buttons.c" name="bsp_buttons.c" rcbsApplicability="disable" resourcePath="/ez430_chronos/simpliciti/Components/bsp/drivers/code/bsp_buttons.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.2087220484./ez430_chronos/simpliciti/Components/bsp/drivers/code/bsp_buttons.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.2087220484./ez430_chronos/simpliciti/Components/bsp/drivers/code/bsp_buttons.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.2087220484"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.1257141332./ez430_chronos/simpliciti/Components/mrfi/radios/family5/mrfi_radio_interface.c" name="mrfi_radio_interface.c" rcbsApplicability="disable" resourcePath="/ez430_chronos/simpliciti/Components/mrfi/radios/family5/mrfi_radio_interface.c" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.2087220484./ez430_chronos/simpliciti/Components/mrfi/radios/family5/mrfi_radio_interface.c">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.2087220484./ez430_chronos/simpliciti/Components/mrfi/radios/family5/mrfi_radio_interface.c" name="MSP430 Compiler" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.compilerDebug.2087220484"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.1257141332./ez430_chronos/bluerobin/BlueRobin_RX_868MHz.lib" name="BlueRobin_RX_868MHz.lib" rcbsApplicability="disable" resourcePath="/ez430_chronos/bluerobin/BlueRobin_RX_868MHz.lib" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.1210929185./ez430_chronos/bluerobin/BlueRobin_RX_868MHz.lib">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.1210929185./ez430_chronos/bluerobin/BlueRobin_RX_868MHz.lib" name="MSP430 Linker" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.1210929185"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="false" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.1257141332./ez430_chronos/bluerobin/BlueRobin_RX_433MHz.lib" name="BlueRobin_RX_433MHz.lib" rcbsApplicability="disable" resourcePath="/ez430_chronos/bluerobin/BlueRobin_RX_433MHz.lib" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.1210929185./ez430_chronos/bluerobin/BlueRobin_RX_433MHz.lib">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.1210929185./ez430_chronos/bluerobin/BlueRobin_RX_433MHz.lib" name="MSP430 Linker" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.1210929185"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.1257141332./ez430_chronos/bluerobin/BlueRobin_RX_915MHz.lib" name="BlueRobin_RX_915MHz.lib" rcbsApplicability="disable" resourcePath="/ez430_chronos/bluerobin/BlueRobin_RX_915MHz.lib" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.1210929185./ez430_chronos/bluerobin/BlueRobin_RX_915MHz.lib">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.1210929185./ez430_chronos/bluerobin/BlueRobin_RX_915MHz.lib" name="MSP430 Linker" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.1210929185"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.1257141332./ez430_chronos/simpliciti/CC430_End_Device_433MHz.lib" name="CC430_End_Device_433MHz.lib" rcbsApplicability="disable" resourcePath="/ez430_chronos/simpliciti/CC430_End_Device_433MHz.lib" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.1210929185./ez430_chronos/simpliciti/CC430_End_Device_433MHz.lib">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.1210929185./ez430_chronos/simpliciti/CC430_End_Device_433MHz.lib" name="MSP430 Linker" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.1210929185"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.1257141332./ez430_chronos/simpliciti/CC430_End_Device_868MHz.lib" name="CC430_End_Device_868MHz.lib" rcbsApplicability="disable" resourcePath="/ez430_chronos/simpliciti/CC430_End_Device_868MHz.lib" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.1210929185./ez430_chronos/simpliciti/CC430_End_Device_868MHz.lib">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.1210929185./ez430_chronos/simpliciti/CC430_End_Device_868MHz.lib" name="MSP430 Linker" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.1210929185"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.1257141332./ez430_chronos/simpliciti/CC430_End_Device_915MHz.lib" name="CC430_End_Device_915MHz.lib" rcbsApplicability="disable" resourcePath="/ez430_chronos/simpliciti/CC430_End_Device_915MHz.lib" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.1210929185./ez430_chronos/simpliciti/CC430_End_Device_915MHz.lib">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.1210929185./ez430_chronos/simpliciti/CC430_End_Device_915MHz.lib" name="MSP430 Linker" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.1210929185"/>\r
+</resourceConfiguration>\r
+<resourceConfiguration exclude="true" id="com.ti.ccstudio.buildDefinitions.MSP430.Debug.1257141332./ez430_chronos/driver/ez430_chronos_drivers.lib" name="ez430_chronos_drivers.lib" rcbsApplicability="disable" resourcePath="/ez430_chronos/driver/ez430_chronos_drivers.lib" toolsToInvoke="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.1210929185./ez430_chronos/driver/ez430_chronos_drivers.lib">\r
+<tool id="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.1210929185./ez430_chronos/driver/ez430_chronos_drivers.lib" name="MSP430 Linker" superClass="com.ti.ccstudio.buildDefinitions.MSP430_3.3.exe.linkerDebug.1210929185"/>\r
+</resourceConfiguration>\r
+</configuration>\r
+<macros/>\r
+</project>\r
+</ManagedProjectBuildInfo>\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/.cdtproject b/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/.cdtproject
new file mode 100755 (executable)
index 0000000..fa82503
--- /dev/null
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>\r
+<?eclipse-cdt version="2.0"?>\r
+\r
+<cdtproject id="org.eclipse.cdt.managedbuilder.core.managedMake">\r
+<extension id="org.eclipse.cdt.managedbuilder.core.ManagedBuildManager" point="org.eclipse.cdt.core.ScannerInfoProvider"/>\r
+<extension id="com.ti.ccstudio.binaryparser.CoffParser" point="org.eclipse.cdt.core.BinaryParser"/>\r
+<data>\r
+<item id="org.eclipse.cdt.core.pathentry">\r
+<pathentry kind="src" path=""/>\r
+<pathentry kind="out" path=""/>\r
+<pathentry kind="con" path="org.eclipse.cdt.managedbuilder.MANAGED_CONTAINER"/>\r
+<pathentry kind="con" path="com.ti.ccstudio.managedbuild.core.CCS_CONTAINER"/>\r
+</item>\r
+</data>\r
+</cdtproject>\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/.project b/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/.project
new file mode 100755 (executable)
index 0000000..11546e0
--- /dev/null
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>\r
+<projectDescription>\r
+       <name>ez430_chronos</name>\r
+       <comment></comment>\r
+       <projects>\r
+       </projects>\r
+       <buildSpec>\r
+               <buildCommand>\r
+                       <name>org.eclipse.cdt.managedbuilder.core.genmakebuilder</name>\r
+                       <arguments>\r
+                       </arguments>\r
+               </buildCommand>\r
+       </buildSpec>\r
+       <natures>\r
+               <nature>org.eclipse.cdt.core.cnature</nature>\r
+               <nature>org.eclipse.cdt.managedbuilder.core.managedBuildNature</nature>\r
+               <nature>org.eclipse.cdt.core.ccnature</nature>\r
+               <nature>com.ti.ccstudio.managedbuild.core.ccsNature</nature>\r
+       </natures>\r
+</projectDescription>\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/.settings/org.eclipse.cdt.managedbuilder.core.prefs b/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/.settings/org.eclipse.cdt.managedbuilder.core.prefs
new file mode 100755 (executable)
index 0000000..9ede4df
--- /dev/null
@@ -0,0 +1,35 @@
+#Thu Oct 21 17:01:30 CEST 2010\r
+com.ti.ccstudio.buildDefinitions.MSP430.Debug.1112165763/internalBuilder/enabled=false\r
+com.ti.ccstudio.buildDefinitions.MSP430.Debug.1112165763/internalBuilder/ignoreErr=true\r
+com.ti.ccstudio.buildDefinitions.MSP430.Debug.1257141332/internalBuilder/enabled=false\r
+com.ti.ccstudio.buildDefinitions.MSP430.Debug.1257141332/internalBuilder/ignoreErr=true\r
+com.ti.ccstudio.buildDefinitions.MSP430.Debug.1482413833/internalBuilder/enabled=false\r
+com.ti.ccstudio.buildDefinitions.MSP430.Debug.1482413833/internalBuilder/ignoreErr=true\r
+com.ti.ccstudio.buildDefinitions.MSP430.Debug.1720680788/internalBuilder/enabled=false\r
+com.ti.ccstudio.buildDefinitions.MSP430.Debug.1720680788/internalBuilder/ignoreErr=true\r
+com.ti.ccstudio.buildDefinitions.MSP430.Debug.1834157678/internalBuilder/enabled=false\r
+com.ti.ccstudio.buildDefinitions.MSP430.Debug.1834157678/internalBuilder/ignoreErr=true\r
+com.ti.ccstudio.buildDefinitions.MSP430.Debug.2047404142/internalBuilder/enabled=false\r
+com.ti.ccstudio.buildDefinitions.MSP430.Debug.2047404142/internalBuilder/ignoreErr=true\r
+com.ti.ccstudio.buildDefinitions.MSP430.Debug.2101481428/internalBuilder/enabled=false\r
+com.ti.ccstudio.buildDefinitions.MSP430.Debug.2101481428/internalBuilder/ignoreErr=true\r
+com.ti.ccstudio.buildDefinitions.MSP430.Debug.518486332/internalBuilder/enabled=false\r
+com.ti.ccstudio.buildDefinitions.MSP430.Debug.518486332/internalBuilder/ignoreErr=true\r
+com.ti.ccstudio.buildDefinitions.MSP430.Debug.572603594/internalBuilder/enabled=false\r
+com.ti.ccstudio.buildDefinitions.MSP430.Debug.572603594/internalBuilder/ignoreErr=true\r
+com.ti.ccstudio.buildDefinitions.MSP430.Debug.577917970/internalBuilder/enabled=false\r
+com.ti.ccstudio.buildDefinitions.MSP430.Debug.577917970/internalBuilder/ignoreErr=true\r
+com.ti.ccstudio.buildDefinitions.MSP430.Debug.767845949/internalBuilder/enabled=false\r
+com.ti.ccstudio.buildDefinitions.MSP430.Debug.767845949/internalBuilder/ignoreErr=true\r
+com.ti.ccstudio.buildDefinitions.MSP430.Debug.82500526/internalBuilder/enabled=false\r
+com.ti.ccstudio.buildDefinitions.MSP430.Debug.82500526/internalBuilder/ignoreErr=true\r
+com.ti.ccstudio.buildDefinitions.MSP430.Debug.855263628/internalBuilder/enabled=false\r
+com.ti.ccstudio.buildDefinitions.MSP430.Debug.855263628/internalBuilder/ignoreErr=true\r
+eclipse.preferences.version=1\r
+environment/project=<?xml version\="1.0" encoding\="UTF-8"?>\r\n<environment/>\r\n\r
+environment/project/com.ti.ccstudio.buildDefinitions.MSP430.Debug.1257141332=<?xml version\="1.0" encoding\="UTF-8"?>\r\n<environment/>\r\n\r
+environment/project/com.ti.ccstudio.buildDefinitions.MSP430.Debug.1834157678=<?xml version\="1.0" encoding\="UTF-8"?>\r\n<environment/>\r\n\r
+environment/project/com.ti.ccstudio.buildDefinitions.MSP430.Debug.2047404142=<?xml version\="1.0" encoding\="UTF-8"?>\r\n<environment/>\r\n\r
+environment/project/com.ti.ccstudio.buildDefinitions.MSP430.Debug.2101481428=<?xml version\="1.0" encoding\="UTF-8"?>\r\n<environment/>\r\n\r
+environment/project/com.ti.ccstudio.buildDefinitions.MSP430.Debug.518486332=<?xml version\="1.0" encoding\="UTF-8"?>\r\n<environment/>\r\n\r
+environment/project/com.ti.ccstudio.buildDefinitions.MSP430.Debug.82500526=<?xml version\="1.0" encoding\="UTF-8"?>\r\n<environment/>\r\n\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/.settings/org.eclipse.ltk.core.refactoring.prefs b/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/.settings/org.eclipse.ltk.core.refactoring.prefs
new file mode 100755 (executable)
index 0000000..4a2a626
--- /dev/null
@@ -0,0 +1,3 @@
+#Tue Oct 12 16:47:51 CEST 2010\r
+eclipse.preferences.version=1\r
+org.eclipse.ltk.core.refactoring.enable.project.refactoring.history=false\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/CC430F6137.ccxml b/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/CC430F6137.ccxml
new file mode 100755 (executable)
index 0000000..f2be62d
--- /dev/null
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>\r
+<configurations XML_version="1.2" id="configurations_0">\r
+    <configuration XML_version="1.2" id="configuration_0">\r
+        <instance XML_version="1.2" desc="TI MSP430 USB1" href="connections\TIMSP430-USB.xml" id="TI MSP430 USB1" xml="TIMSP430-USB.xml" xmlpath="connections"/>\r
+        <connection XML_version="1.2" id="TI MSP430 USB1">\r
+            <instance XML_version="1.2" href="drivers\msp430_emu.xml" id="drivers" xml="msp430_emu.xml" xmlpath="drivers"/>\r
+            <platform XML_version="1.2" id="platform_0">\r
+                <instance XML_version="1.2" desc="CC430F6137" href="Devices\CC430F6137.xml" id="CC430F6137" xml="CC430F6137.xml" xmlpath="Devices"/>\r
+            </platform>\r
+        </connection>\r
+    </configuration>\r
+</configurations>\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/bluerobin/BlueRobin_RX_433MHz.lib b/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/bluerobin/BlueRobin_RX_433MHz.lib
new file mode 100755 (executable)
index 0000000..5c81259
Binary files /dev/null and b/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/bluerobin/BlueRobin_RX_433MHz.lib differ
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/bluerobin/BlueRobin_RX_868MHz.lib b/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/bluerobin/BlueRobin_RX_868MHz.lib
new file mode 100755 (executable)
index 0000000..d14e7de
Binary files /dev/null and b/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/bluerobin/BlueRobin_RX_868MHz.lib differ
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/bluerobin/BlueRobin_RX_915MHz.lib b/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/bluerobin/BlueRobin_RX_915MHz.lib
new file mode 100755 (executable)
index 0000000..3057022
Binary files /dev/null and b/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/bluerobin/BlueRobin_RX_915MHz.lib differ
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/bluerobin/BlueRobin_RX_API.h b/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/bluerobin/BlueRobin_RX_API.h
new file mode 100755 (executable)
index 0000000..049c99f
--- /dev/null
@@ -0,0 +1,157 @@
+// *************************************************************************************************\r
+//\r
+// Copyright 2009 BM innovations GmbH (www.bm-innovations.com), all rights reserved.\r
+//\r
+// This trial version of the "BlueRobin(TM) receiver library for the Texas Instruments\r
+// CC430 SoC" may be used for non-profit non-commercial purposes only. If you want to use\r
+// BlueRobin(TM) in a commercial project, please contact the copyright holder for a\r
+// separate license agreement.\r
+//\r
+// By using this trial version of the "BlueRobin(TM) receiver library for the Texas Instruments\r
+// CC430 SoC", you implicitly agree that you will not modify, adapt, disassemble, decompile,\r
+// reverse engineer, translate or otherwise attempt to discover the source code of the\r
+// "BlueRobin(TM) receiver library for the Texas Instruments CC430 SoC".\r
+//\r
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY\r
+// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\r
+// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\r
+//\r
+// IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\r
+// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\r
+// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\r
+// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\r
+// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\r
+// THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+//\r
+// Public header for eZ430-Chronos specific BlueRobin(TM) receiver library.\r
+//\r
+// The following BlueRobin(TM) profiles are supported by this build\r
+//   - heart rate (HR) transmitter\r
+//\r
+// The following number of channels is supported: 1\r
+//\r
+// *************************************************************************************************\r
+//\r
+// BlueRobin(TM) packet size\r
+// -------------------------\r
+//\r
+//              * average packet rate   1 packet/875 msec = ~1.14 packets/second\r
+//              * payload per packet    5 bytes\r
+//\r
+// BlueRobin(TM) frequency overview\r
+// (Please note: Settings apply for the transmitter side, i.e. the USB dongle)\r
+// ----------------------------------------------------------------------\r
+//\r
+// Bluerobin_RX_433MHz.lib (433MHz ISM band)\r
+//\r
+//              * frequency                             433.30 MHz - 434.00 MHz\r
+//              * deviation                             95 kHz\r
+//              * channels                              3\r
+//              * data rate                             250 kBaud\r
+//\r
+// Bluerobin_RX_868MHz.lib (868MHz ISM band)\r
+//\r
+//              * frequency                             868.25 MHz - 868.95 MHz\r
+//              * deviation                             95 kHz\r
+//              * channels                              3\r
+//              * data rate                             250 kBaud\r
+//\r
+//\r
+// Bluerobin_RX_915MHz.lib (915MHz ISM band)\r
+//\r
+//              * frequency                             914.35 MHz - 917.75 MHz\r
+//              * deviation                             95 kHz\r
+//              * channels                              34\r
+//              * data rate                             250 kBaud\r
+//\r
+// *************************************************************************************************\r
+\r
+#ifndef BRRX_API_H_\r
+#define BRRX_API_H_\r
+\r
+// *************************************************************************************************\r
+// Include section\r
+\r
+// *************************************************************************************************\r
+// Defines section\r
+\r
+// List of all possible channel states\r
+typedef enum\r
+{\r
+    TX_OFF = 0,                 // Powerdown mode\r
+    TX_ACTIVE,                  // Active mode\r
+    TX_SEARCH                   // Search mode\r
+} brtx_state_t;\r
+\r
+// Transmitter to channel assignment\r
+#define HR_CHANNEL           (0)\r
+\r
+// *************************************************************************************************\r
+// API section\r
+\r
+// ----------------------------------------------------------\r
+// Functions for initializing and controlling the library\r
+\r
+// Initialize several global variables.\r
+void BRRX_Init_v(void);\r
+\r
+// Set delay after which a channel will be switched off if no new data can be received.\r
+// Param1: Powerdown delay in packet intervals (875 ms)\r
+void BRRX_SetPowerdownDelay_v(u8 Delay_u8);\r
+\r
+// Set timeout when searching for a transmitter\r
+// Param1: Search timeout in seconds\r
+void BRRX_SetSearchTimeout_v(u8 Timeout_u8);\r
+\r
+// Set reduction of valid signal level in learn mode.\r
+// Param1: Reduction of signal level\r
+void BRRX_SetSignalLevelReduction_v(u8 Reduction_u8);\r
+\r
+// Set ID for a channel. To search for an unknown transmitter the ID has to be set to 0.\r
+// Can be only executed on channels currently in powerdown mode.\r
+// Param1: Channel index\r
+// Param2: New ID\r
+void BRRX_SetID_v(u8 Index_u8, u32 ID_u32);\r
+\r
+// Get current ID of channel.\r
+// Return: Current ID of channel\r
+// Param1: Channel index\r
+u32 BRRX_GetID_u32(u8 Index_u8);\r
+\r
+// Start reception on one or all channels.\r
+// Param1: Channel index (use 0xFF to start all channels)\r
+void BRRX_Start_v(u8 Index_u8);\r
+\r
+// Stop reception on one or all channels.\r
+// Param1: Channel index (0xFF for all channels)\r
+void BRRX_Stop_v(u8 Index_u8);\r
+\r
+// Get current state of a channel\r
+// Param1: Channel index\r
+brtx_state_t BRRX_GetState_t(u8 Index_u8);\r
+\r
+// ----------------------------------------------------------\r
+// eZ430-Chronos specific functions\r
+\r
+// Get current heart rate.\r
+// Return: Heart rate in bpm\r
+u8 BRRX_GetHeartRate_u8(void);\r
+\r
+// Get current distance.\r
+// Return: Distance in 10m steps.\r
+u16 BRRX_GetDistance_u16(void);\r
+\r
+// Get current speed.\r
+// Return: Speed in 0.1km/h steps. Trial version is limited to 25.5km/h.\r
+u8 BRRX_GetSpeed_u8(void);\r
+\r
+// ----------------------------------------------------------\r
+// Radio-related functions\r
+\r
+// RX packet end service function\r
+// Must be called by CC1101_VECTOR ISR\r
+void BlueRobin_RadioISR_v(void);\r
+\r
+#endif                          /*BRRX_API_H_ */\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/bluerobin/bm.h b/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/bluerobin/bm.h
new file mode 100755 (executable)
index 0000000..781b1e1
--- /dev/null
@@ -0,0 +1,480 @@
+// *************************************************************************************************\r
+//\r
+// Copyright 2009 BM innovations GmbH (www.bm-innovations.com), all rights reserved.\r
+//\r
+// This trial version of the "BlueRobin(TM) receiver library for the Texas Instruments\r
+// CC430 SoC" may be used for non-profit non-commercial purposes only. If you want to use\r
+// BlueRobin(TM) in a commercial project, please contact the copyright holder for a\r
+// separate license agreement.\r
+//\r
+// By using this trial version of the "BlueRobin(TM) receiver library for the Texas Instruments\r
+// CC430 SoC", you implicitly agree that you will not modify, adapt, disassemble, decompile,\r
+// reverse engineer, translate or otherwise attempt to discover the source code of the\r
+// "BlueRobin(TM) receiver library for the Texas Instruments CC430 SoC".\r
+//\r
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY\r
+// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\r
+// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\r
+//\r
+// IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\r
+// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\r
+// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\r
+// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\r
+// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\r
+// THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+// Standard definitions, have to be included in every source and header file.\r
+// *************************************************************************************************\r
+\r
+#ifndef __BM_H\r
+#define __BM_H\r
+\r
+#if (defined __IAR_SYSTEMS_ASM) || (defined __IAR_SYSTEMS_ASM__)\r
+#    define _ASSEMBLER_USED_\r
+#endif\r
+\r
+#ifndef _ASSEMBLER_USED_\r
+#    include <stddef.h>\r
+#endif\r
+\r
+#ifndef FALSE\r
+// the classic false\r
+#    define FALSE (0 == 1)\r
+#endif\r
+\r
+#ifndef TRUE\r
+// the classic true\r
+#    define TRUE  (1 == 1)\r
+#endif\r
+\r
+#ifndef USE_RAW_ATTR\r
+// per default this feature is disabled\r
+#    define USE_RAW_ATTR FALSE\r
+#endif\r
+\r
+// *************************************************************************************************\r
+// First Section: Basic Data Types\r
+// *************************************************************************************************\r
+\r
+// Fundamental #definitions\r
+// CPU target idents are used for target dependent compilations\r
+\r
+// Texas Instruments MSP430\r
+#define _TI_MSP430_  (16)\r
+\r
+// Find the currently running compiler\r
+// and make the related #define's\r
+\r
+// _IAR_TID_                target ID from IAR compilers\r
+// _CPU_TID_                remap to enum of processor target numbers\r
+// _CPU_8BIT_INT_           type for 8 bit int\r
+// _CPU_16BIT_INT_          type for 16 bit int\r
+// _CPU_32BIT_INT_          type for 32 bit int\r
+// _CPU_32BIT_FLOAT_        type for 32 bit float\r
+// _CPU_64BIT_FLOAT_        type for 64 bit float\r
+// INTERRUPT                declares an interrupt service routine without an entry in the vector\r
+// table\r
+// ISR(vector)              declares an interrupt service routine which is added in vector table at\r
+// offset vector\r
+// MONITOR                  declares a function atomic\r
+// INTERRUPTS_ENABLE        remap to the intrinsic for enable interrupts\r
+// INTERRUPTS_DISABLE       remap to the intrinsic for disable interrupts\r
+// NO_OPERATION             remap to the intrinsic for no operation\r
+// _CPU_DIRECTION_OUT_1_    if TRUE the direction register indicates with an 1: direction is output\r
+// _CPU_EDGE_HIGH_LOW_1_    if TRUE the edge select register indicates with an 1: trigger on high\r
+// low\r
+// NO_INIT                  declare a variable as not initialized\r
+// INLINE_FUNC              declare a function as inline for release builds\r
+\r
+#if ((defined __IAR_SYSTEMS_ICC) || (defined __IAR_SYSTEMS_ASM)) && (__IAR_SYSTEMS_ICC__ < 2)\r
+// Found IAR Compiler with classic IAR frontend\r
+#    ifndef _IAR_TID_\r
+#        define _IAR_TID_ ((__TID__ >> 8) & 0x7f)\r
+#    endif\r
+\r
+#    define INTERRUPT   interrupt\r
+#    define ISR(vector) interrupt[(vector)]\r
+#    define MONITOR     monitor\r
+\r
+#    if ((_IAR_TID_) == 43)\r
+// Found Texas Instruments MSP430 CPU\r
+#        define _CPU_TID_             _TI_MSP430_\r
+#        define _CPU_DIRECTION_OUT_1_ TRUE\r
+#        define _CPU_EDGE_HIGH_LOW_1_ TRUE\r
+#        define INTERRUPTS_ENABLE()   _EINT()\r
+// WA for HW bug, add a NOP\r
+#        define INTERRUPTS_DISABLE()  { _DINT(); _NOP(); }\r
+#        define NO_OPERATION()        _NOP()\r
+\r
+#    else\r
+#        error "Unknown IAR Compiler, the file bm.h has to be expanded !"\r
+#    endif\r
+\r
+#elif defined __IAR_SYSTEMS_ICC__\r
+// Found IAR Compiler with EDG frontend\r
+#    define _IAR_TID_ ((__TID__ >> 8) & 0x7f)\r
+\r
+#    if USE_RAW_ATTR == TRUE\r
+// Use the raw attribute in ISR's\r
+#        define _RAW __raw\r
+#    else\r
+// Empty define RAW as it is not used\r
+#        define _RAW\r
+#    endif\r
+#    define INTERRUPT   _RAW __interrupt\r
+#    define MONITOR     __monitor\r
+#    define NO_INIT     __no_init\r
+#    define INTERRUPTS_ENABLE()   __enable_interrupt()\r
+#    define INTERRUPTS_DISABLE()  __disable_interrupt()\r
+#    define NO_OPERATION()        __no_operation()\r
+\r
+#    ifndef DEBUG\r
+// Force inlining of function in release builds\r
+#        define INLINE_FUNC PRAGMA(inline = forced)\r
+#    else\r
+// Do not force inlining of function in debug builds\r
+#        define INLINE_FUNC\r
+#    endif\r
+\r
+#    if (!defined CODECHECK) && (!defined __DA_C__)\r
+// Define to a new way of using #pragmas in preprocessor\r
+#        define PRAGMA(x) _Pragma(# x)\r
+#        define ISR(x) PRAGMA(vector = (x)) INTERRUPT\r
+#    endif\r
+\r
+#    if ((_IAR_TID_) == 43)\r
+// Found Texas Instruments MSP430 CPU  (V2)\r
+#        define _CPU_TID_             _TI_MSP430_\r
+#        define _CPU_DIRECTION_OUT_1_ TRUE\r
+#        define _CPU_EDGE_HIGH_LOW_1_ TRUE\r
+#        define _CPU_64BIT_INT_       long long\r
+#        if __VER__ < 220\r
+// WA for HW bug, add a nop after DINT, Compiler has a bugfix since version 2.20\r
+#            undef  INTERRUPTS_DISABLE\r
+#            define INTERRUPTS_DISABLE()  { __disable_interrupt(); __no_operation(); }\r
+#        endif\r
+\r
+#    else\r
+#        error "Unknown new IAR Compiler, the file bm.h has to be expanded !"\r
+#    endif\r
+\r
+#elif defined __CCE__\r
+// Found CCE Compiler\r
+#    define INTERRUPT   __interrupt\r
+#    define MONITOR             // __monitor\r
+#    define NO_INIT     __no_init\r
+#    define INTERRUPTS_ENABLE()   __enable_interrupt()\r
+#    define INTERRUPTS_DISABLE()  __disable_interrupt()\r
+#    define NO_OPERATION()        __no_operation()\r
+\r
+#    ifndef DEBUG\r
+// Force inlining of function in release builds\r
+#        define INLINE_FUNC PRAGMA(inline = forced)\r
+#    else\r
+// Do not force inlining of function in debug builds\r
+#        define INLINE_FUNC\r
+#    endif\r
+\r
+// Found Texas Instruments MSP430 CPU  (V2)\r
+#    define _CPU_TID_             _TI_MSP430_\r
+#    define _CPU_DIRECTION_OUT_1_ TRUE\r
+#    define _CPU_EDGE_HIGH_LOW_1_ TRUE\r
+//#define _CPU_64BIT_INT_       long long\r
+\r
+//  #endif\r
+\r
+#else\r
+#    error "Unknown Compiler, the file bm.h has to be expanded !"\r
+#endif\r
+\r
+#ifndef _ASSEMBLER_USED_\r
+// Get the limits to autodetect the size of integral types\r
+#    include <limits.h>\r
+// Get floats to autodetect the size of float types\r
+#    include <float.h>\r
+\r
+// ***********************************************************************************************\r
+//\r
+// Common basic data types\r
+//\r
+// ***********************************************************************************************\r
+#    if UCHAR_MAX == 0xFFu\r
+#        define _CPU_8BIT_INT_ char\r
+#    else\r
+#        error "unable to get size of u8 automatically"\r
+#    endif\r
+\r
+#    if USHRT_MAX == 0xFFFFu\r
+#        define _CPU_16BIT_INT_ short\r
+#    elif UINT_MAX == 0xFFFFu\r
+#        define _CPU_16BIT_INT_ int\r
+#    else\r
+#        error "unable to get size of u16 automatically"\r
+#    endif\r
+\r
+#    if USHRT_MAX == 0xFFFFFFFFu\r
+#        define _CPU_32BIT_INT_ short\r
+#    elif UINT_MAX == 0xFFFFFFFFu\r
+#        define _CPU_32BIT_INT_ int\r
+#    elif ULONG_MAX == 0xFFFFFFFFu\r
+#        define _CPU_32BIT_INT_ long\r
+#    else\r
+#        error "unable to get size of u32 automatically"\r
+#    endif\r
+\r
+#    ifdef __IAR_SYSTEMS_ICC__\r
+#        if __IAR_SYSTEMS_ICC__ > 1\r
+#            define _CPU_32BIT_FLOAT_ float\r
+#            if __DOUBLE_SIZE__ == 8\r
+#                define _CPU_64BIT_FLOAT_ double\r
+#            endif\r
+#        endif\r
+#    endif\r
+\r
+#    ifndef _CPU_32BIT_FLOAT_\r
+#        if FLT_MANT_DIG == 24\r
+#            define _CPU_32BIT_FLOAT_ float\r
+#        elif DBL_MANT_DIG == 24\r
+#            define _CPU_32BIT_FLOAT_ double\r
+#        else\r
+#            error "unable to get size of f32 automatically"\r
+#        endif\r
+\r
+#        if DBL_MANT_DIG == 53\r
+#            define _CPU_64BIT_FLOAT_ double\r
+#        endif\r
+#    endif\r
+\r
+// ***********************************************************************************************\r
+//\r
+// Following lines #typedef the basic data types in a compiler independent way.\r
+//\r
+// ***********************************************************************************************\r
+\r
+#    ifdef _CPU_8BIT_INT_\r
+// unsigned 8 bit\r
+typedef unsigned _CPU_8BIT_INT_ u8;\r
+// unsigned 8 bit max value\r
+#        define U8_MAX (0xFFU)\r
+// signed 8 bit max value\r
+typedef signed _CPU_8BIT_INT_ s8;\r
+// signed 8 bit min value\r
+#        define S8_MIN (-127 - 1)\r
+// signed 8 bit max value\r
+#        define S8_MAX (127)\r
+#    endif\r
+\r
+#    ifdef _CPU_16BIT_INT_\r
+// unsigned 16 bit\r
+typedef unsigned _CPU_16BIT_INT_ u16;\r
+// unsigned 16 bit max value\r
+#        define U16_MAX (0xFFFFU)\r
+// signed 16 bit\r
+typedef signed _CPU_16BIT_INT_ s16;\r
+// signed 16 bit min value\r
+#        define S16_MIN (-32767 - 1)\r
+// signed 16 bit max value\r
+#        define S16_MAX (32767)\r
+#    endif\r
+\r
+#    ifdef _CPU_32BIT_INT_\r
+// unsigned 32 bit\r
+typedef unsigned _CPU_32BIT_INT_ u32;\r
+// unsigned 32 bit max value\r
+#        define U32_MAX (0xFFFFFFFFUL)\r
+// signed 32 bit\r
+typedef signed _CPU_32BIT_INT_ s32;\r
+// signed 32 bit min value\r
+#        define S32_MIN (-2147483647L - 1L)\r
+// signed 32 bit max value\r
+#        define S32_MAX (2147483647L)\r
+#    endif\r
+\r
+#    ifdef _CPU_64BIT_INT_\r
+// unsigned 64 bit\r
+typedef unsigned _CPU_64BIT_INT_ u64;\r
+// signed 64 bit\r
+typedef signed _CPU_64BIT_INT_ s64;\r
+#    endif\r
+\r
+#    ifdef _CPU_32BIT_FLOAT_\r
+// float 32 bit\r
+typedef _CPU_32BIT_FLOAT_ f32;\r
+// number of digits in mantissa of f32\r
+#        define F32_MANT_DIG   (24)\r
+// epsilon for f32\r
+#        define F32_EPSILON    (1.192092896e-07)\r
+// number of digits of precision of f32\r
+#        define F32_DIG        (6)\r
+// exponent min of f32\r
+#        define F32_MIN_EXP    (-125)\r
+// min positive value of f32\r
+#        define F32_MIN        (1.175494351e-38)\r
+// decimal exponent min of f32\r
+#        define F32_MIN_10_EXP (-37)\r
+// exponent max of f32\r
+#        define F32_MAX_EXP    (128)\r
+// max value of f32\r
+#        define F32_MAX        (3.402823466e+38)\r
+// decimal exponent max of f32\r
+#        define F32_MAX_10_EXP (38)\r
+#    endif\r
+\r
+#    ifdef _CPU_64BIT_FLOAT_\r
+// float 64 bit\r
+typedef _CPU_64BIT_FLOAT_ f64;\r
+// number of digits in mantissa of f64\r
+#        define F64_MANT_DIG   (53)\r
+// epsilon for f64\r
+#        define F64_EPSILON    (2.2204460492503131e-016)\r
+// number of digits of precision of f64\r
+#        define F64_DIG        (15)\r
+// exponent min of f64\r
+#        define F64_MIN_EXP    (-1021)\r
+// min positive value of f64\r
+#        define F64_MIN        (2.2250738585072014e-308)\r
+// decimal exponent min of f64\r
+#        define F64_MIN_10_EXP (-307)\r
+// exponent max of f64\r
+#        define F64_MAX_EXP    (1024)\r
+// max value of f64\r
+#        define F64_MAX        (1.7976931348623158e+308)\r
+// decimal exponent max of f64\r
+#        define F64_MAX_10_EXP (308)\r
+#    endif\r
+\r
+typedef unsigned char BYTE;\r
+typedef unsigned int WORD;\r
+typedef unsigned long DWORD;\r
+\r
+#endif                          // _ASSMEBLER_USED_\r
+\r
+// A macro that calculates the number of bits of a given type\r
+#ifndef BITSIZEOF\r
+#    define BITSIZEOF(type) (sizeof(type) * CHAR_BIT)\r
+#endif\r
+\r
+/* A macro that generates a bit mask according to a given bit number.\r
+ * Example:\r
+ * - BIT(0) expands to 1 (== 0x01)\r
+ * - BIT(3) expands to 8 (== 0x08)\r
+ */\r
+#define BIT(x) (1uL << (x))\r
+\r
+/* A macro that generates a bit mask according to a given bit number with a cast to type.\r
+ * The difference to BIT(X) is the additional type argument T that is used to cast the type of the\r
+ * constant 1 and the type of the result as well.\r
+ * Example:\r
+ * - BIT_T(u8,0)  expands to (u8)1  (== 0x01)\r
+ * - BIT_T(u32,3) expands to (u32)8 (== 0x08L)\r
+ */\r
+#define BIT_T(t, x) ((t)((t)1 << (x)))\r
+\r
+/* A macro to calculate the position of the highest bit.\r
+ * The result is same as LOG2 in case only one bit is set. Use with constant values only because\r
+ * of code size.\r
+ */\r
+#define BIT_HIGHEST(Input_u32) (     \\r
+        ((Input_u32) & BIT(31)) ? 31 : ( \\r
+            ((Input_u32) & BIT(30)) ? 30 : ( \\r
+                ((Input_u32) & BIT(29)) ? 29 : ( \\r
+                    ((Input_u32) & BIT(28)) ? 28 : ( \\r
+                        ((Input_u32) & BIT(27)) ? 27 : ( \\r
+                            ((Input_u32) & BIT(26)) ? 26 : ( \\r
+                                ((Input_u32) & BIT(25)) ? 25 : ( \\r
+                                    ((Input_u32) & BIT(24)) ? 24 : ( \\r
+                                        ((Input_u32) & BIT(23)) ? 23 : ( \\r
+                                            ((Input_u32) & BIT(22)) ? 22 : ( \\r
+                                                ((Input_u32) & BIT(21)) ? 21 : ( \\r
+                                                    ((Input_u32) & BIT(20)) ? 20 : ( \\r
+                                                        ((Input_u32) & BIT(19)) ? 19 : ( \\r
+                                                            ((Input_u32) & BIT(18)) ? 18 : ( \\r
+                                                                ((Input_u32) & BIT(17)) ? 17 : ( \\r
+                                                                    ((Input_u32) & BIT(16)) ? 16 : ( \\r
+                                                                        ((Input_u32) & \\r
+                                                                         BIT(15)) ? 15 : ( \\r
+                                                                            ((Input_u32) & \\r
+                                                                             BIT(14)) ? 14 : ( \\r
+                                                                                ((Input_u32) & \\r
+                                                                                 BIT(13)) ? 13 : ( \\r
+                                                                                    ((Input_u32) & \\r
+                                                                                     BIT(12)) ? 12 \\r
+                                                                                    : ( \\r
+                                                                                        ((Input_u32) \\r
+                                                                                         & BIT(11)) \\r
+                                                                                        ? 11 : ( \\r
+                                                                                            (( \\r
+                                                                                                 Input_u32) \\r
+                                                                                             & BIT( \\r
+                                                                                                 10)) ? 10 : ( \\r
+                                                                                                (( \\r
+                                                                                                     Input_u32) \\r
+                                                                                                 & \\r
+                                                                                                 BIT(9)) ?  9 : ( \\r
+                                                                                                    (( \\r
+                                                                                                         Input_u32) \\r
+                                                                                                     & \\r
+                                                                                                     BIT(8)) ?  8 : ( \\r
+                                                                                                        (( \\r
+                                                                                                             Input_u32) \\r
+                                                                                                         & \\r
+                                                                                                         BIT(7)) ?  7 : ( \\r
+                                                                                                            (( \\r
+                                                                                                                 Input_u32) \\r
+                                                                                                             & \\r
+                                                                                                             BIT(6)) ?  6 : ( \\r
+                                                                                                                (( \\r
+                                                                                                                     Input_u32) \\r
+                                                                                                                 & \\r
+                                                                                                                 BIT(5)) ?  5 : ( \\r
+                                                                                                                    (( \\r
+                                                                                                                         Input_u32) \\r
+                                                                                                                     & \\r
+                                                                                                                     BIT(4)) ?  4 : ( \\r
+                                                                                                                        (( \\r
+                                                                                                                             Input_u32) \\r
+                                                                                                                         & \\r
+                                                                                                                         BIT(3)) ?  3 : ( \\r
+                                                                                                                            (( \\r
+                                                                                                                                 Input_u32) \\r
+                                                                                                                             & \\r
+                                                                                                                             BIT(2)) ?  2 : ( \\r
+                                                                                                                                (( \\r
+                                                                                                                                     Input_u32) \\r
+                                                                                                                                 & \\r
+                                                                                                                                 BIT(1)) ?  1 : ( \\r
+                                                                                                                                    (( \\r
+                                                                                                                                         Input_u32) \\r
+                                                                                                                                     & \\r
+                                                                                                                                     BIT(0)) ?  0 :  -1uL))))))))))))))))))))))))))))))))\r
+\r
+#ifndef MONITOR\r
+#    define MONITOR\r
+#endif\r
+\r
+#ifndef NO_INIT\r
+#    define NO_INIT\r
+#endif\r
+\r
+#ifndef INTERRUPT\r
+#    define INTERRUPT\r
+#endif\r
+\r
+#ifndef ISR\r
+#    define ISR(ignore)\r
+#endif\r
+\r
+#ifndef INLINE_FUNC\r
+#    define INLINE_FUNC\r
+#endif\r
+\r
+#ifndef INTERRUPTS_ENABLE\r
+#    define INTERRUPTS_ENABLE()\r
+#endif\r
+\r
+#ifndef INTERRUPTS_DISABLE\r
+#    define INTERRUPTS_DISABLE()\r
+#endif\r
+\r
+#endif                          // __BM_H\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/change_record.txt b/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/change_record.txt
new file mode 100755 (executable)
index 0000000..e16bfa5
--- /dev/null
@@ -0,0 +1,38 @@
+V1.6 (21.11.2010)\r
+Fixed following bugs\r
+- rfsimpliciti.c/simpliciti_sync_decode_ap_cmd_callback(),\r
+- timer.c/TIMER0_A0_ISR(),                                                     LCD shows "done" after successfully received data\r
+- main.c/wakeup_event(),\r
+- rfbsl.c/sx_rfbsl()                                                           rfBSL requires two button presses in order to update watch \r
+- timer.c/Timer0_A3_Start()                                                    Fixed register read (Asynchronous)\r
+- timer.c/Timer0_A4_Delay()                                            Fixed register read (Asynchronous)\r
+                                                                                                       Avoid unwanted flag changes caused by interrupt methods\r
+                                                                                                       After timeout the accelerometer menu shows "----"\r
+- port.c/PORT2_ISR() and timer.c/TIMER0_A0_ISR()       Changes the menu if the pressed time from STAR or NUM button are between "short(50ms)" and "long(3s)" \r
+                                                                                                       The backlight stays 3 seconds on\r
+- display.c                                                                            Removed file display1.c. The content is now in display.c \r
+- display.h                                                                            Fixed LCD_UNIT_L1_PER_S_MASK bit\r
+\r
+Other changes:\r
+- adc12.c and adc12.h                                                  Removed commented function and #defines\r
+- battery.c                                                                                    Removed commented function\r
+- DCO settling time                                                                    Set to 375000 cycles\r
+__________________________________________________________________________________________________________________________________________________\r
+V1.5 (16.03.2010)\r
+Fixed following bugs\r
+- main.c/init_application()                                                    Changed XT1 drive level to highest to avoid ACLK noise when turning on backlight.\r
+- main.c/wakeup_event(), timer.c/TIMER0_A0_ISR()       Modified key lock procedure.\r
+- vti_ps.c/ps_get_temp()                                                       Negative °C are now converted correctly to Kelvin\r
+- altitude.c/mx_altitude()                                                     Enabled fast mode when changing altitude offset\r
+- ports.c/PORT2_ISR()                                                          Disabled stopwatch stop when watch buttons are locked\r
+\r
+Other changes\r
+- main.c/read_calibration_values()                                     Added range check for rf_frequoffset variable\r
+                                                                                                       Added bytes for altitude offset correction and s/w version\r
+- altitude.h, altitude.c                                                       Added initial altitude offset correction \r
+- SimpliciTI                                                                           Added SimpliciTI sources to project. Upgraded to Version 1.1.1.\r
+- RFBSL                                                                                                Added wireless update support\r
+- Button names                                                                         Changed button names from M1/M2/S1/S2/BL to STAR/NUM/UP/DOWN/BACKLIGHT\r
+__________________________________________________________________________________________________________________________________________________                                                                                                     \r
+V1.4 (22.11.2009)\r
+First version released to manufacturing.
\ No newline at end of file
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/driver/adc12.c b/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/driver/adc12.c
new file mode 100755 (executable)
index 0000000..07f13cc
--- /dev/null
@@ -0,0 +1,164 @@
+// *************************************************************************************************\r
+//\r
+//      Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//        Redistribution and use in source and binary forms, with or without\r
+//        modification, are permitted provided that the following conditions\r
+//        are met:\r
+//\r
+//          Redistributions of source code must retain the above copyright\r
+//          notice, this list of conditions and the following disclaimer.\r
+//\r
+//          Redistributions in binary form must reproduce the above copyright\r
+//          notice, this list of conditions and the following disclaimer in the\r
+//          documentation and/or other materials provided with the\r
+//          distribution.\r
+//\r
+//          Neither the name of Texas Instruments Incorporated nor the names of\r
+//          its contributors may be used to endorse or promote products derived\r
+//          from this software without specific prior written permission.\r
+//\r
+//        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+// ADC12 functions.\r
+// *************************************************************************************************\r
+\r
+// *************************************************************************************************\r
+// Include section\r
+\r
+// system\r
+#include <project.h>\r
+\r
+// driver\r
+#include "adc12.h"\r
+#include "timer.h"\r
+\r
+// *************************************************************************************************\r
+// Prototypes section\r
+\r
+// *************************************************************************************************\r
+// Defines section\r
+\r
+// *************************************************************************************************\r
+// Global Variable section\r
+u16 adc12_result;\r
+u8 adc12_data_ready;\r
+\r
+// *************************************************************************************************\r
+// Extern section\r
+\r
+// *************************************************************************************************\r
+// @fn          adc12_single_conversion\r
+// @brief       Init ADC12.      Do single conversion. Turn off ADC12.\r
+// @param       u16 ref                  Select reference\r
+//                              u16 sht          Sample-and-hold time\r
+//                              u16 channel      Channel of the conversion\r
+// @return      u16 adc12_result Return ADC result\r
+// *************************************************************************************************\r
+u16 adc12_single_conversion(u16 ref, u16 sht, u16 channel)\r
+{\r
+    // Initialize the shared reference module\r
+    REFCTL0 |= REFMSTR + ref + REFON;   // Enable internal reference (1.5V or 2.5V)\r
+\r
+    // Initialize ADC12_A\r
+    ADC12CTL0 = sht + ADC12ON;          // Set sample time\r
+    ADC12CTL1 = ADC12SHP;               // Enable sample timer\r
+    ADC12MCTL0 = ADC12SREF_1 + channel; // ADC input channel\r
+    ADC12IE = 0x001;                    // ADC_IFG upon conv result-ADCMEMO\r
+\r
+    // Wait 2 ticks (66us) to allow internal reference to settle\r
+    Timer0_A4_Delay(2);\r
+\r
+    // Start ADC12\r
+    ADC12CTL0 |= ADC12ENC;\r
+\r
+    // Clear data ready flag\r
+    adc12_data_ready = 0;\r
+\r
+    // Sampling and conversion start\r
+    ADC12CTL0 |= ADC12SC;\r
+\r
+    // Delay to get next ADC value\r
+    Timer0_A4_Delay(5);\r
+    while (!adc12_data_ready) ;\r
+\r
+    // Shut down ADC12\r
+    ADC12CTL0 &= ~(ADC12ENC | ADC12SC | sht);\r
+    ADC12CTL0 &= ~ADC12ON;\r
+\r
+    // Shut down reference voltage\r
+    REFCTL0 &= ~(REFMSTR + ref + REFON);\r
+\r
+    ADC12IE = 0;\r
+\r
+    // Return ADC result\r
+    return (adc12_result);\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          ADC12ISR\r
+// @brief       Store ADC12 conversion result. Set flag to indicate data ready.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+#pragma vector=ADC12_VECTOR\r
+__interrupt void ADC12ISR(void)\r
+{\r
+    switch (__even_in_range(ADC12IV, 34))\r
+    {\r
+        case 0:\r
+            break;                    // Vector  0:  No interrupt\r
+        case 2:\r
+            break;                    // Vector  2:  ADC overflow\r
+        case 4:\r
+            break;                    // Vector  4:  ADC timing overflow\r
+        case 6:                       // Vector  6:  ADC12IFG0\r
+            adc12_result = ADC12MEM0; // Move results, IFG is cleared\r
+            adc12_data_ready = 1;\r
+            _BIC_SR_IRQ(LPM3_bits);   // Exit active CPU\r
+            break;\r
+        case 8:\r
+            break;                    // Vector  8:  ADC12IFG1\r
+        case 10:\r
+            break;                    // Vector 10:  ADC12IFG2\r
+        case 12:\r
+            break;                    // Vector 12:  ADC12IFG3\r
+        case 14:\r
+            break;                    // Vector 14:  ADC12IFG4\r
+        case 16:\r
+            break;                    // Vector 16:  ADC12IFG5\r
+        case 18:\r
+            break;                    // Vector 18:  ADC12IFG6\r
+        case 20:\r
+            break;                    // Vector 20:  ADC12IFG7\r
+        case 22:\r
+            break;                    // Vector 22:  ADC12IFG8\r
+        case 24:\r
+            break;                    // Vector 24:  ADC12IFG9\r
+        case 26:\r
+            break;                    // Vector 26:  ADC12IFG10\r
+        case 28:\r
+            break;                    // Vector 28:  ADC12IFG11\r
+        case 30:\r
+            break;                    // Vector 30:  ADC12IFG12\r
+        case 32:\r
+            break;                    // Vector 32:  ADC12IFG13\r
+        case 34:\r
+            break;                    // Vector 34:  ADC12IFG14\r
+        default:\r
+            break;\r
+    }\r
+}\r
+\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/driver/adc12.h b/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/driver/adc12.h
new file mode 100755 (executable)
index 0000000..90fc327
--- /dev/null
@@ -0,0 +1,57 @@
+// *************************************************************************************************\r
+//\r
+//      Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//        Redistribution and use in source and binary forms, with or without\r
+//        modification, are permitted provided that the following conditions\r
+//        are met:\r
+//\r
+//          Redistributions of source code must retain the above copyright\r
+//          notice, this list of conditions and the following disclaimer.\r
+//\r
+//          Redistributions in binary form must reproduce the above copyright\r
+//          notice, this list of conditions and the following disclaimer in the\r
+//          documentation and/or other materials provided with the\r
+//          distribution.\r
+//\r
+//          Neither the name of Texas Instruments Incorporated nor the names of\r
+//          its contributors may be used to endorse or promote products derived\r
+//          from this software without specific prior written permission.\r
+//\r
+//        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+\r
+#ifndef ADC12_H_\r
+#define ADC12_H_\r
+\r
+// *************************************************************************************************\r
+// Include section\r
+\r
+// *************************************************************************************************\r
+// Prototypes section\r
+extern u16 adc12_single_conversion(u16 ref, u16 sht, u16 channel);\r
+\r
+// *************************************************************************************************\r
+// Defines section\r
+\r
+// *************************************************************************************************\r
+// Global Variable section\r
+extern u16 adc12_result;\r
+extern u8 adc12_data_ready;\r
+\r
+// *************************************************************************************************\r
+// Extern section\r
+\r
+#endif                          /*ADC12_H_ */\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/driver/buzzer.c b/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/driver/buzzer.c
new file mode 100755 (executable)
index 0000000..9ac581a
--- /dev/null
@@ -0,0 +1,220 @@
+// *************************************************************************************************\r
+//\r
+//      Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//        Redistribution and use in source and binary forms, with or without\r
+//        modification, are permitted provided that the following conditions\r
+//        are met:\r
+//\r
+//          Redistributions of source code must retain the above copyright\r
+//          notice, this list of conditions and the following disclaimer.\r
+//\r
+//          Redistributions in binary form must reproduce the above copyright\r
+//          notice, this list of conditions and the following disclaimer in the\r
+//          documentation and/or other materials provided with the\r
+//          distribution.\r
+//\r
+//          Neither the name of Texas Instruments Incorporated nor the names of\r
+//          its contributors may be used to endorse or promote products derived\r
+//          from this software without specific prior written permission.\r
+//\r
+//        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+// Buzzer functions.\r
+// *************************************************************************************************\r
+\r
+// *************************************************************************************************\r
+// Include section\r
+\r
+// system\r
+#include "project.h"\r
+\r
+// driver\r
+#include "buzzer.h"\r
+#include "timer.h"\r
+#include "display.h"\r
+\r
+// logic\r
+#include "alarm.h"\r
+\r
+// *************************************************************************************************\r
+// Prototypes section\r
+void toggle_buzzer(void);\r
+void countdown_buzzer(void);\r
+\r
+// *************************************************************************************************\r
+// Defines section\r
+\r
+// *************************************************************************************************\r
+// Global Variable section\r
+struct buzzer sBuzzer;\r
+\r
+// *************************************************************************************************\r
+// Extern section\r
+//extern u16 timer0_A3_ticks_g;\r
+\r
+// *************************************************************************************************\r
+// @fn          reset_buzzer\r
+// @brief       Init buzzer variables\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void reset_buzzer(void)\r
+{\r
+    sBuzzer.time = 0;\r
+    sBuzzer.state = BUZZER_OFF;\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          start_buzzer\r
+// @brief       Start buzzer output for a number of cylces\r
+// @param       u8 cycles               Keep buzzer output for number of cycles\r
+//                              u16 on_time         Output buzzer for "on_time" ACLK ticks\r
+//                              u16 off_time    Do not output buzzer for "off_time" ACLK ticks\r
+// @return      none\r
+// *************************************************************************************************\r
+void start_buzzer(u8 cycles, u16 on_time, u16 off_time)\r
+{\r
+    // Store new buzzer duration while buzzer is off\r
+    if (sBuzzer.time == 0)\r
+    {\r
+        sBuzzer.time = cycles;\r
+        sBuzzer.on_time = on_time;\r
+        sBuzzer.off_time = off_time;\r
+\r
+        // Need to init every time, because SimpliciTI claims same timer\r
+        // Reset TA1R, set up mode, TA1 runs from 32768Hz ACLK\r
+        TA1CTL = TACLR | MC_1 | TASSEL__ACLK;\r
+\r
+        // Set PWM frequency\r
+        TA1CCR0 = BUZZER_TIMER_STEPS;\r
+\r
+        // Enable IRQ, set output mode "toggle"\r
+        TA1CCTL0 = OUTMOD_4;\r
+\r
+        // Allow buzzer PWM output on P2.7\r
+        P2SEL |= BIT7;\r
+\r
+        // Activate Timer0_A3 periodic interrupts\r
+        fptr_Timer0_A3_function = toggle_buzzer;\r
+        Timer0_A3_Start(sBuzzer.on_time);\r
+\r
+        // Preload timer advance variable\r
+        sTimer.timer0_A3_ticks = sBuzzer.off_time;\r
+\r
+        // Start with buzzer output on\r
+        sBuzzer.state = BUZZER_ON_OUTPUT_ENABLED;\r
+    }\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          toggle_buzzer\r
+// @brief       Keeps track of buzzer on/off duty cycle\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void toggle_buzzer(void)\r
+{\r
+    // Turn off buzzer\r
+    if (sBuzzer.state == BUZZER_ON_OUTPUT_ENABLED)\r
+    {\r
+        // Stop PWM timer\r
+        TA1CTL &= ~(BIT4 | BIT5);\r
+\r
+        // Reset and disable buzzer PWM output\r
+        P2OUT &= ~BIT7;\r
+        P2SEL &= ~BIT7;\r
+\r
+        // Update buzzer state\r
+        sBuzzer.state = BUZZER_ON_OUTPUT_DISABLED;\r
+\r
+        // Reload Timer0_A4 IRQ to restart output\r
+        sTimer.timer0_A3_ticks = sBuzzer.on_time;\r
+    }\r
+    else                        // Turn on buzzer\r
+    {\r
+        // Decrement buzzer total cycles\r
+        countdown_buzzer();\r
+\r
+        // Reload Timer0_A4 to stop output if sBuzzer.time > 0\r
+        if (sBuzzer.state != BUZZER_OFF)\r
+        {\r
+            // Reset timer TA1\r
+            TA1R = 0;\r
+            TA1CTL |= MC_1;\r
+\r
+            // Enable buzzer PWM output\r
+            P2SEL |= BIT7;\r
+\r
+            // Update buzzer state\r
+            sBuzzer.state = BUZZER_ON_OUTPUT_ENABLED;\r
+\r
+            // Reload Timer0_A4 IRQ to turn off output\r
+            sTimer.timer0_A3_ticks = sBuzzer.off_time;\r
+        }\r
+    }\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          stop_buzzer\r
+// @brief       Stop buzzer output\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void stop_buzzer(void)\r
+{\r
+    // Stop PWM timer\r
+    TA1CTL &= ~(BIT4 | BIT5);\r
+\r
+    // Disable buzzer PWM output\r
+    P2OUT &= ~BIT7;\r
+    P2SEL &= ~BIT7;\r
+\r
+    // Clear PWM timer interrupt\r
+    TA1CCTL0 &= ~CCIE;\r
+\r
+    // Disable periodic start/stop interrupts\r
+    Timer0_A3_Stop();\r
+\r
+    // Clear variables\r
+    reset_buzzer();\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          is_buzzer\r
+// @brief       Check if buzzer is operating\r
+// @param       none\r
+// @return      u8              1 = Buzzer is operating, 0 = Buzzer is off\r
+// *************************************************************************************************\r
+u8 is_buzzer(void)\r
+{\r
+    return (sBuzzer.state != BUZZER_OFF);\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          countdown_buzzer\r
+// @brief       Decrement active buzzer time. Turn off buzzer if cycle end reached.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void countdown_buzzer(void)\r
+{\r
+    // Stop buzzer when reaching 0 cycles\r
+    if (--sBuzzer.time == 0)\r
+    {\r
+        stop_buzzer();\r
+    }\r
+}\r
+\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/driver/buzzer.h b/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/driver/buzzer.h
new file mode 100755 (executable)
index 0000000..59fbba9
--- /dev/null
@@ -0,0 +1,87 @@
+// *************************************************************************************************\r
+//\r
+//      Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//        Redistribution and use in source and binary forms, with or without\r
+//        modification, are permitted provided that the following conditions\r
+//        are met:\r
+//\r
+//          Redistributions of source code must retain the above copyright\r
+//          notice, this list of conditions and the following disclaimer.\r
+//\r
+//          Redistributions in binary form must reproduce the above copyright\r
+//          notice, this list of conditions and the following disclaimer in the\r
+//          documentation and/or other materials provided with the\r
+//          distribution.\r
+//\r
+//          Neither the name of Texas Instruments Incorporated nor the names of\r
+//          its contributors may be used to endorse or promote products derived\r
+//          from this software without specific prior written permission.\r
+//\r
+//        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+\r
+#ifndef BUZZER_H_\r
+#define BUZZER_H_\r
+\r
+// *************************************************************************************************\r
+// Include section\r
+\r
+// *************************************************************************************************\r
+// Prototypes section\r
+extern void reset_buzzer(void);\r
+extern void start_buzzer(u8 cycles, u16 on_time, u16 off_time);\r
+extern void stop_buzzer(void);\r
+extern void toggle_buzzer(void);\r
+extern u8 is_buzzer(void);\r
+extern void countdown_buzzer(void);\r
+\r
+// *************************************************************************************************\r
+// Defines section\r
+\r
+// Buzzer states\r
+#define BUZZER_OFF                                                      (0u)\r
+#define BUZZER_ON_OUTPUT_DISABLED                       (1u)\r
+#define BUZZER_ON_OUTPUT_ENABLED                        (2u)\r
+\r
+// Buzzer output signal frequency = 32,768kHz/(BUZZER_TIMER_STEPS+1)/2 = 2.7kHz\r
+#define BUZZER_TIMER_STEPS                                      (5u)\r
+\r
+// Buzzer on time\r
+#define BUZZER_ON_TICKS                                         (CONV_MS_TO_TICKS(20))\r
+\r
+// Buzzer off time\r
+#define BUZZER_OFF_TICKS                                        (CONV_MS_TO_TICKS(200))\r
+\r
+// *************************************************************************************************\r
+// Global Variable section\r
+struct buzzer\r
+{\r
+    // Keep output for "time" seconds\r
+    u8 time;\r
+\r
+    // On/off duty\r
+    u16 on_time;\r
+    u16 off_time;\r
+\r
+    // Current buzzer output state\r
+    u8 state;\r
+};\r
+extern struct buzzer sBuzzer;\r
+\r
+// *************************************************************************************************\r
+// Extern section\r
+\r
+#endif                          /*BUZZER_H_ */\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/driver/display.c b/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/driver/display.c
new file mode 100755 (executable)
index 0000000..46a5d70
--- /dev/null
@@ -0,0 +1,759 @@
+// *************************************************************************************************\r
+//\r
+//      Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//        Redistribution and use in source and binary forms, with or without\r
+//        modification, are permitted provided that the following conditions\r
+//        are met:\r
+//\r
+//          Redistributions of source code must retain the above copyright\r
+//          notice, this list of conditions and the following disclaimer.\r
+//\r
+//          Redistributions in binary form must reproduce the above copyright\r
+//          notice, this list of conditions and the following disclaimer in the\r
+//          documentation and/or other materials provided with the\r
+//          distribution.\r
+//\r
+//          Neither the name of Texas Instruments Incorporated nor the names of\r
+//          its contributors may be used to endorse or promote products derived\r
+//          from this software without specific prior written permission.\r
+//\r
+//        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+// Display functions.\r
+// *************************************************************************************************\r
+\r
+// *************************************************************************************************\r
+// Include section\r
+\r
+// system\r
+#include <project.h>\r
+#include <string.h>\r
+\r
+// driver\r
+#include "display.h"\r
+\r
+// logic\r
+#include "clock.h"\r
+#include "user.h"\r
+#include "date.h"\r
+#include "stopwatch.h"\r
+#include "temperature.h"\r
+\r
+// *************************************************************************************************\r
+// Prototypes section\r
+void write_lcd_mem(u8 * lcdmem, u8 bits, u8 bitmask, u8 state);\r
+void clear_line(u8 line);\r
+void display_symbol(u8 symbol, u8 mode);\r
+void display_char(u8 segment, u8 chr, u8 mode);\r
+void display_chars(u8 segments, u8 * str, u8 mode);\r
+\r
+// *************************************************************************************************\r
+// Defines section\r
+\r
+// *************************************************************************************************\r
+// Global Variable section\r
+\r
+// Table with memory bit assignment for digits "0" to "9" and characters "A" to "Z"\r
+const u8 lcd_font[] = {\r
+    SEG_A + SEG_B + SEG_C + SEG_D + SEG_E + SEG_F,         // Displays "0"\r
+    SEG_B + SEG_C,                                         // Displays "1"\r
+    SEG_A + SEG_B + SEG_D + SEG_E + SEG_G,                 // Displays "2"\r
+    SEG_A + SEG_B + SEG_C + SEG_D + SEG_G,                 // Displays "3"\r
+    SEG_B + SEG_C + SEG_F + SEG_G,                         // Displays "4"\r
+    SEG_A + SEG_C + SEG_D + SEG_F + SEG_G,                 // Displays "5"\r
+    SEG_A + SEG_C + SEG_D + SEG_E + SEG_F + SEG_G,         // Displays "6"\r
+    SEG_A + SEG_B + SEG_C,                                 // Displays "7"\r
+    SEG_A + SEG_B + SEG_C + SEG_D + SEG_E + SEG_F + SEG_G, // Displays "8"\r
+    SEG_A + SEG_B + SEG_C + SEG_D + SEG_F + SEG_G,         // Displays "9"\r
+    0,                                                     // Displays " "\r
+    0,                                                     // Displays " "\r
+    0,                                                     // Displays " "\r
+    0,                                                     // Displays " "\r
+    0,                                                     // Displays " "\r
+    SEG_D + SEG_E + SEG_G,                                 // Displays "c"\r
+    0,                                                     // Displays " "\r
+    SEG_A + SEG_B + SEG_C + SEG_E + SEG_F + SEG_G,         // Displays "A"\r
+    SEG_C + SEG_D + SEG_E + SEG_F + SEG_G,                 // Displays "b"\r
+    SEG_A + SEG_D + SEG_E + SEG_F,                         // Displays "C"\r
+    SEG_B + SEG_C + SEG_D + SEG_E + SEG_G,                 // Displays "d"\r
+    SEG_A + +SEG_D + SEG_E + SEG_F + SEG_G,                // Displays "E"\r
+    SEG_A + SEG_E + SEG_F + SEG_G,                         // Displays "F"\r
+    //  SEG_A+      SEG_C+SEG_D+SEG_E+SEG_F+SEG_G,       // Displays "G"\r
+    SEG_A + SEG_B + SEG_C + SEG_D + SEG_F + SEG_G,         // Displays "g"\r
+    SEG_B + SEG_C + SEG_E + SEG_F + SEG_G,                 // Displays "H"\r
+    SEG_E + SEG_F,                                         // Displays "I"\r
+    SEG_A + SEG_B + SEG_C + SEG_D,                         // Displays "J"\r
+    //              SEG_B+SEG_C+      SEG_E+SEG_F+SEG_G,     // Displays "k"\r
+    SEG_D + SEG_E + SEG_F + SEG_G,                         // Displays "k"\r
+    SEG_D + SEG_E + SEG_F,                                 // Displays "L"\r
+    SEG_A + SEG_B + SEG_C + SEG_E + SEG_F,                 // Displays "M"\r
+    SEG_C + SEG_E + SEG_G,                                 // Displays "n"\r
+    SEG_C + SEG_D + SEG_E + SEG_G,                         // Displays "o"\r
+    SEG_A + SEG_B + SEG_E + SEG_F + SEG_G,                 // Displays "P"\r
+    SEG_A + SEG_B + SEG_C + SEG_D + SEG_E + SEG_F,         // Displays "Q"\r
+    SEG_E + SEG_G,                                         // Displays "r"\r
+    SEG_A + SEG_C + SEG_D + SEG_F + SEG_G,                 // Displays "S"\r
+    SEG_D + SEG_E + SEG_F + SEG_G,                         // Displays "t"\r
+    SEG_C + SEG_D + SEG_E,                                 // Displays "u"\r
+    SEG_C + SEG_D + SEG_E,                                 // Displays "u"\r
+    SEG_G,                                                 // Displays "-"\r
+    SEG_B + SEG_C + +SEG_E + SEG_F + SEG_G,                // Displays "X"\r
+    SEG_B + SEG_C + SEG_D + SEG_F + SEG_G,                 // Displays "Y"\r
+    SEG_A + SEG_B + SEG_D + SEG_E + SEG_G,                 // Displays "Z"\r
+};\r
+\r
+// Table with memory address for each display element\r
+const u8 *segments_lcdmem[] = {\r
+    LCD_SYMB_AM_MEM,\r
+    LCD_SYMB_PM_MEM,\r
+    LCD_SYMB_ARROW_UP_MEM,\r
+    LCD_SYMB_ARROW_DOWN_MEM,\r
+    LCD_SYMB_PERCENT_MEM,\r
+    LCD_SYMB_TOTAL_MEM,\r
+    LCD_SYMB_AVERAGE_MEM,\r
+    LCD_SYMB_MAX_MEM,\r
+    LCD_SYMB_BATTERY_MEM,\r
+    LCD_UNIT_L1_FT_MEM,\r
+    LCD_UNIT_L1_K_MEM,\r
+    LCD_UNIT_L1_M_MEM,\r
+    LCD_UNIT_L1_I_MEM,\r
+    LCD_UNIT_L1_PER_S_MEM,\r
+    LCD_UNIT_L1_PER_H_MEM,\r
+    LCD_UNIT_L1_DEGREE_MEM,\r
+    LCD_UNIT_L2_KCAL_MEM,\r
+    LCD_UNIT_L2_KM_MEM,\r
+    LCD_UNIT_L2_MI_MEM,\r
+    LCD_ICON_HEART_MEM,\r
+    LCD_ICON_STOPWATCH_MEM,\r
+    LCD_ICON_RECORD_MEM,\r
+    LCD_ICON_ALARM_MEM,\r
+    LCD_ICON_BEEPER1_MEM,\r
+    LCD_ICON_BEEPER2_MEM,\r
+    LCD_ICON_BEEPER3_MEM,\r
+    LCD_SEG_L1_3_MEM,\r
+    LCD_SEG_L1_2_MEM,\r
+    LCD_SEG_L1_1_MEM,\r
+    LCD_SEG_L1_0_MEM,\r
+    LCD_SEG_L1_COL_MEM,\r
+    LCD_SEG_L1_DP1_MEM,\r
+    LCD_SEG_L1_DP0_MEM,\r
+    LCD_SEG_L2_5_MEM,\r
+    LCD_SEG_L2_4_MEM,\r
+    LCD_SEG_L2_3_MEM,\r
+    LCD_SEG_L2_2_MEM,\r
+    LCD_SEG_L2_1_MEM,\r
+    LCD_SEG_L2_0_MEM,\r
+    LCD_SEG_L2_COL1_MEM,\r
+    LCD_SEG_L2_COL0_MEM,\r
+    LCD_SEG_L2_DP_MEM,\r
+};\r
+\r
+// Table with bit mask for each display element\r
+const u8 segments_bitmask[] = {\r
+    LCD_SYMB_AM_MASK,\r
+    LCD_SYMB_PM_MASK,\r
+    LCD_SYMB_ARROW_UP_MASK,\r
+    LCD_SYMB_ARROW_DOWN_MASK,\r
+    LCD_SYMB_PERCENT_MASK,\r
+    LCD_SYMB_TOTAL_MASK,\r
+    LCD_SYMB_AVERAGE_MASK,\r
+    LCD_SYMB_MAX_MASK,\r
+    LCD_SYMB_BATTERY_MASK,\r
+    LCD_UNIT_L1_FT_MASK,\r
+    LCD_UNIT_L1_K_MASK,\r
+    LCD_UNIT_L1_M_MASK,\r
+    LCD_UNIT_L1_I_MASK,\r
+    LCD_UNIT_L1_PER_S_MASK,\r
+    LCD_UNIT_L1_PER_H_MASK,\r
+    LCD_UNIT_L1_DEGREE_MASK,\r
+    LCD_UNIT_L2_KCAL_MASK,\r
+    LCD_UNIT_L2_KM_MASK,\r
+    LCD_UNIT_L2_MI_MASK,\r
+    LCD_ICON_HEART_MASK,\r
+    LCD_ICON_STOPWATCH_MASK,\r
+    LCD_ICON_RECORD_MASK,\r
+    LCD_ICON_ALARM_MASK,\r
+    LCD_ICON_BEEPER1_MASK,\r
+    LCD_ICON_BEEPER2_MASK,\r
+    LCD_ICON_BEEPER3_MASK,\r
+    LCD_SEG_L1_3_MASK,\r
+    LCD_SEG_L1_2_MASK,\r
+    LCD_SEG_L1_1_MASK,\r
+    LCD_SEG_L1_0_MASK,\r
+    LCD_SEG_L1_COL_MASK,\r
+    LCD_SEG_L1_DP1_MASK,\r
+    LCD_SEG_L1_DP0_MASK,\r
+    LCD_SEG_L2_5_MASK,\r
+    LCD_SEG_L2_4_MASK,\r
+    LCD_SEG_L2_3_MASK,\r
+    LCD_SEG_L2_2_MASK,\r
+    LCD_SEG_L2_1_MASK,\r
+    LCD_SEG_L2_0_MASK,\r
+    LCD_SEG_L2_COL1_MASK,\r
+    LCD_SEG_L2_COL0_MASK,\r
+    LCD_SEG_L2_DP_MASK,\r
+};\r
+\r
+// Quick integer to array conversion table for most common integer values\r
+const u8 int_to_array_conversion_table[][3] = {\r
+    "000", "001", "002", "003", "004", "005", "006", "007", "008", "009", "010", "011", "012",\r
+    "013", "014", "015",\r
+    "016", "017", "018", "019", "020", "021", "022", "023", "024", "025", "026", "027", "028",\r
+    "029", "030", "031",\r
+    "032", "033", "034", "035", "036", "037", "038", "039", "040", "041", "042", "043", "044",\r
+    "045", "046", "047",\r
+    "048", "049", "050", "051", "052", "053", "054", "055", "056", "057", "058", "059", "060",\r
+    "061", "062", "063",\r
+    "064", "065", "066", "067", "068", "069", "070", "071", "072", "073", "074", "075", "076",\r
+    "077", "078", "079",\r
+    "080", "081", "082", "083", "084", "085", "086", "087", "088", "089", "090", "091", "092",\r
+    "093", "094", "095",\r
+    "096", "097", "098", "099", "100", "101", "102", "103", "104", "105", "106", "107", "108",\r
+    "109", "110", "111",\r
+    "112", "113", "114", "115", "116", "117", "118", "119", "120", "121", "122", "123", "124",\r
+    "125", "126", "127",\r
+    "128", "129", "130", "131", "132", "133", "134", "135", "136", "137", "138", "139", "140",\r
+    "141", "142", "143",\r
+    "144", "145", "146", "147", "148", "149", "150", "151", "152", "153", "154", "155", "156",\r
+    "157", "158", "159",\r
+    "160", "161", "162", "163", "164", "165", "166", "167", "168", "169", "170", "171", "172",\r
+    "173", "174", "175",\r
+    "176", "177", "178", "179", "180",\r
+};\r
+\r
+// Display flags\r
+volatile s_display_flags display;\r
+\r
+// Global return string for int_to_array function\r
+u8 int_to_array_str[8];\r
+\r
+// *************************************************************************************************\r
+// Extern section\r
+extern void (*fptr_lcd_function_line1)(u8 line, u8 update);\r
+extern void (*fptr_lcd_function_line2)(u8 line, u8 update);\r
+\r
+// *************************************************************************************************\r
+// @fn          lcd_init\r
+// @brief       Erase LCD memory. Init LCD peripheral.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void lcd_init(void)\r
+{\r
+    // Clear entire display memory\r
+    LCDBMEMCTL |= LCDCLRBM + LCDCLRM;\r
+\r
+    // LCD_FREQ = ACLK/16/8 = 256Hz\r
+    // Frame frequency = 256Hz/4 = 64Hz, LCD mux 4, LCD on\r
+    LCDBCTL0 = (LCDDIV0 + LCDDIV1 + LCDDIV2 + LCDDIV3) | (LCDPRE0 + LCDPRE1) | LCD4MUX | LCDON;\r
+\r
+    // LCB_BLK_FREQ = ACLK/8/4096 = 1Hz\r
+    LCDBBLKCTL = LCDBLKPRE0 | LCDBLKPRE1 | LCDBLKDIV0 | LCDBLKDIV1 | LCDBLKDIV2 | LCDBLKMOD0;\r
+\r
+    // I/O to COM outputs\r
+    P5SEL |= (BIT5 | BIT6 | BIT7);\r
+    P5DIR |= (BIT5 | BIT6 | BIT7);\r
+\r
+    // Activate LCD output\r
+    LCDBPCTL0 = 0xFFFF;         // Select LCD segments S0-S15\r
+    LCDBPCTL1 = 0x00FF;         // Select LCD segments S16-S22\r
+\r
+#ifdef USE_LCD_CHARGE_PUMP\r
+    // Charge pump voltage generated internally, internal bias (V2-V4) generation\r
+    LCDBVCTL = LCDCPEN | VLCD_2_72;\r
+#endif\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          clear_display_all\r
+// @brief       Erase LINE1 and LINE2 segments. Clear also function-specific content.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void clear_display_all(void)\r
+{\r
+    // Clear generic content\r
+    clear_line(LINE1);\r
+    clear_line(LINE2);\r
+\r
+    // Clean up function-specific content\r
+    fptr_lcd_function_line1(LINE1, DISPLAY_LINE_CLEAR);\r
+    fptr_lcd_function_line2(LINE2, DISPLAY_LINE_CLEAR);\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          clear_display\r
+// @brief       Erase LINE1 and LINE2 segments. Keep icons.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void clear_display(void)\r
+{\r
+    clear_line(LINE1);\r
+    clear_line(LINE2);\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          clear_line\r
+// @brief       Erase segments of a given line.\r
+// @param       u8 line LINE1, LINE2\r
+// @return      none\r
+// *************************************************************************************************\r
+void clear_line(u8 line)\r
+{\r
+    display_chars(switch_seg(line, LCD_SEG_L1_3_0, LCD_SEG_L2_5_0), NULL, SEG_OFF);\r
+    if (line == LINE1)\r
+    {\r
+        display_symbol(LCD_SEG_L1_DP1, SEG_OFF);\r
+        display_symbol(LCD_SEG_L1_DP0, SEG_OFF);\r
+        display_symbol(LCD_SEG_L1_COL, SEG_OFF);\r
+    }\r
+    else                        // line == LINE2\r
+    {\r
+        display_symbol(LCD_SEG_L2_DP, SEG_OFF);\r
+        display_symbol(LCD_SEG_L2_COL1, SEG_OFF);\r
+        display_symbol(LCD_SEG_L2_COL0, SEG_OFF);\r
+    }\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          write_segment\r
+// @brief       Write to one or multiple LCD segments\r
+// @param       lcdmem          Pointer to LCD byte memory\r
+//                              bits            Segments to address\r
+//                              bitmask         Bitmask for particular display item\r
+//                              mode            On, off or blink segments\r
+// @return\r
+// *************************************************************************************************\r
+void write_lcd_mem(u8 * lcdmem, u8 bits, u8 bitmask, u8 state)\r
+{\r
+    if (state == SEG_ON)\r
+    {\r
+        // Clear segments before writing\r
+        *lcdmem = (u8) (*lcdmem & ~bitmask);\r
+\r
+        // Set visible segments\r
+        *lcdmem = (u8) (*lcdmem | bits);\r
+    }\r
+    else if (state == SEG_OFF)\r
+    {\r
+        // Clear segments\r
+        *lcdmem = (u8) (*lcdmem & ~bitmask);\r
+    }\r
+    else if (state == SEG_ON_BLINK_ON)\r
+    {\r
+        // Clear visible / blink segments before writing\r
+        *lcdmem = (u8) (*lcdmem & ~bitmask);\r
+        *(lcdmem + 0x20) = (u8) (*(lcdmem + 0x20) & ~bitmask);\r
+\r
+        // Set visible / blink segments\r
+        *lcdmem = (u8) (*lcdmem | bits);\r
+        *(lcdmem + 0x20) = (u8) (*(lcdmem + 0x20) | bits);\r
+    }\r
+    else if (state == SEG_ON_BLINK_OFF)\r
+    {\r
+        // Clear visible segments before writing\r
+        *lcdmem = (u8) (*lcdmem & ~bitmask);\r
+\r
+        // Set visible segments\r
+        *lcdmem = (u8) (*lcdmem | bits);\r
+\r
+        // Clear blink segments\r
+        *(lcdmem + 0x20) = (u8) (*(lcdmem + 0x20) & ~bitmask);\r
+    }\r
+    else if (state == SEG_OFF_BLINK_OFF)\r
+    {\r
+        // Clear segments\r
+        *lcdmem = (u8) (*lcdmem & ~bitmask);\r
+\r
+        // Clear blink segments\r
+        *(lcdmem + 0x20) = (u8) (*(lcdmem + 0x20) & ~bitmask);\r
+    }\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          int_to_array\r
+// @brief       Generic integer to array routine. Converts integer n to string.\r
+//                              Default conversion result has leading zeros, e.g. "00123"\r
+//                              Option to convert leading '0' into whitespace (blanks)\r
+// @param       u32 n                   integer to convert\r
+//                              u8 digits               number of digits\r
+//                              u8 blanks               fill up result string with number of\r
+// whitespaces instead of leading zeros\r
+// @return      u8                              string\r
+// *************************************************************************************************\r
+u8 *int_to_array(u32 n, u8 digits, u8 blanks)\r
+{\r
+    u8 i;\r
+    u8 digits1 = digits;\r
+\r
+    // Preset result string\r
+    memcpy(int_to_array_str, "0000000", 7);\r
+\r
+    // Return empty string if number of digits is invalid (valid range for digits: 1-7)\r
+    if ((digits == 0) || (digits > 7))\r
+        return (int_to_array_str);\r
+\r
+    // Numbers 0 .. 180 can be copied from int_to_array_conversion_table without conversion\r
+    if (n <= 180)\r
+    {\r
+        if (digits >= 3)\r
+        {\r
+            memcpy(int_to_array_str + (digits - 3), int_to_array_conversion_table[n], 3);\r
+        }\r
+        else                    // digits == 1 || 2\r
+        {\r
+            memcpy(int_to_array_str, int_to_array_conversion_table[n] + (3 - digits), digits);\r
+        }\r
+    }\r
+    else                        // For n > 180 need to calculate string content\r
+    {\r
+        // Calculate digits from least to most significant number\r
+        do\r
+        {\r
+            int_to_array_str[digits - 1] = n % 10 + '0';\r
+            n /= 10;\r
+        }\r
+        while (--digits > 0);\r
+    }\r
+\r
+    // Remove specified number of leading '0', always keep last one\r
+    i = 0;\r
+    while ((int_to_array_str[i] == '0') && (i < digits1 - 1))\r
+    {\r
+        if (blanks > 0)\r
+        {\r
+            // Convert only specified number of leading '0'\r
+            int_to_array_str[i] = ' ';\r
+            blanks--;\r
+        }\r
+        i++;\r
+    }\r
+\r
+    return (int_to_array_str);\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          display_value\r
+// @brief       Generic decimal display routine. Used exclusively by set_value function.\r
+// @param       u8 segments                     LCD segments where value is displayed\r
+//                              u32 value                       Integer value to be displayed\r
+//                              u8 digits                       Number of digits to convert\r
+//                              u8 blanks                       Number of leadings blanks in\r
+// int_to_array result string\r
+// @return      none\r
+// *************************************************************************************************\r
+void display_value(u8 segments, u32 value, u8 digits, u8 blanks)\r
+{\r
+    u8 *str;\r
+\r
+    str = int_to_array(value, digits, blanks);\r
+\r
+    // Display string in blink mode\r
+    display_chars(segments, str, SEG_ON_BLINK_ON);\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          display_hours\r
+// @brief       Display hours in 24H / 12H time format.\r
+// @param       u8 segments     Segments where to display hour data\r
+//                              u32 value               Hour data\r
+//                              u8 digits               Must be "2"\r
+//                              u8 blanks               Must be "0"\r
+// @return      none\r
+// *************************************************************************************************\r
+void display_hours(u8 segments, u32 value, u8 digits, u8 blanks)\r
+{\r
+    u8 hours;\r
+\r
+    if (sys.flag.use_metric_units)\r
+    {\r
+        // Display hours in 24H time format\r
+        display_value(segments, (u16) value, digits, blanks);\r
+    }\r
+    else\r
+    {\r
+        // convert internal 24H time format to 12H time format\r
+        hours = convert_hour_to_12H_format(value);\r
+\r
+        // display hours in 12H time format\r
+        display_value(segments, hours, digits, blanks);\r
+        display_am_pm_symbol(value);\r
+    }\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          display_am_pm_symbol\r
+// @brief       Display AM or PM symbol.\r
+// @param       u8 hour         24H internal time format\r
+// @return      none\r
+// *************************************************************************************************\r
+void display_am_pm_symbol(u8 hour)\r
+{\r
+    // Display AM/PM symbol\r
+    if (is_hour_am(hour))\r
+    {\r
+        display_symbol(LCD_SYMB_AM, SEG_ON);\r
+    }\r
+    else\r
+    {\r
+        // Clear AM segments first - required when changing from AM to PM\r
+        display_symbol(LCD_SYMB_AM, SEG_OFF);\r
+        display_symbol(LCD_SYMB_PM, SEG_ON);\r
+    }\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          display_symbol\r
+// @brief       Switch symbol on or off on LCD.\r
+// @param       u8 symbol               A valid LCD symbol (index 0..42)\r
+//                              u8 state                SEG_ON, SEG_OFF, SEG_BLINK\r
+// @return      none\r
+// *************************************************************************************************\r
+void display_symbol(u8 symbol, u8 mode)\r
+{\r
+    u8 *lcdmem;\r
+    u8 bits;\r
+    u8 bitmask;\r
+\r
+    if (symbol <= LCD_SEG_L2_DP)\r
+    {\r
+        // Get LCD memory address for symbol from table\r
+        lcdmem = (u8 *) segments_lcdmem[symbol];\r
+\r
+        // Get bits for symbol from table\r
+        bits = segments_bitmask[symbol];\r
+\r
+        // Bitmask for symbols equals bits\r
+        bitmask = bits;\r
+\r
+        // Write LCD memory\r
+        write_lcd_mem(lcdmem, bits, bitmask, mode);\r
+    }\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          display_char\r
+// @brief       Write to 7-segment characters.\r
+// @param       u8 segment              A valid LCD segment\r
+//                              u8 chr                  Character to display\r
+//                              u8 mode         SEG_ON, SEG_OFF, SEG_BLINK\r
+// @return      none\r
+// *************************************************************************************************\r
+void display_char(u8 segment, u8 chr, u8 mode)\r
+{\r
+    u8 *lcdmem;                 // Pointer to LCD memory\r
+    u8 bitmask;                 // Bitmask for character\r
+    u8 bits, bits1;             // Bits to write\r
+\r
+    // Write to single 7-segment character\r
+    if ((segment >= LCD_SEG_L1_3) && (segment <= LCD_SEG_L2_DP))\r
+    {\r
+        // Get LCD memory address for segment from table\r
+        lcdmem = (u8 *) segments_lcdmem[segment];\r
+\r
+        // Get bitmask for character from table\r
+        bitmask = segments_bitmask[segment];\r
+\r
+        // Get bits from font set\r
+        if ((chr >= 0x30) && (chr <= 0x5A))\r
+        {\r
+            // Use font set\r
+            bits = lcd_font[chr - 0x30];\r
+        }\r
+        else if (chr == 0x2D)\r
+        {\r
+            // '-' not in font set\r
+            bits = BIT1;\r
+        }\r
+        else\r
+        {\r
+            // Other characters map to ' ' (blank)\r
+            bits = 0;\r
+        }\r
+\r
+        // When addressing LINE2 7-segment characters need to swap high- and low-nibble,\r
+        // because LCD COM/SEG assignment is mirrored against LINE1\r
+        if (segment >= LCD_SEG_L2_5)\r
+        {\r
+            bits1 = ((bits << 4) & 0xF0) | ((bits >> 4) & 0x0F);\r
+            bits = bits1;\r
+\r
+            // When addressing LCD_SEG_L2_5, need to convert ASCII '1' and 'L' to 1 bit,\r
+            // because LCD COM/SEG assignment is special for this incomplete character\r
+            if (segment == LCD_SEG_L2_5)\r
+            {\r
+                if ((chr == '1') || (chr == 'L'))\r
+                    bits = BIT7;\r
+            }\r
+        }\r
+\r
+        // Physically write to LCD memory\r
+        write_lcd_mem(lcdmem, bits, bitmask, mode);\r
+    }\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          display_chars\r
+// @brief       Write to consecutive 7-segment characters.\r
+// @param       u8 segments     LCD segment array\r
+//                              u8 * str                Pointer to a string\r
+//                              u8 mode             SEG_ON, SEG_OFF, SEG_BLINK\r
+// @return      none\r
+// *************************************************************************************************\r
+void display_chars(u8 segments, u8 * str, u8 mode)\r
+{\r
+    u8 i;\r
+    u8 length = 0;              // Write length\r
+    u8 char_start;              // Starting point for consecutive write\r
+\r
+    switch (segments)\r
+    {\r
+        // LINE1\r
+        case LCD_SEG_L1_3_0:\r
+            length = 4;\r
+            char_start = LCD_SEG_L1_3;\r
+            break;\r
+        case LCD_SEG_L1_2_0:\r
+            length = 3;\r
+            char_start = LCD_SEG_L1_2;\r
+            break;\r
+        case LCD_SEG_L1_1_0:\r
+            length = 2;\r
+            char_start = LCD_SEG_L1_1;\r
+            break;\r
+        case LCD_SEG_L1_3_1:\r
+            length = 3;\r
+            char_start = LCD_SEG_L1_3;\r
+            break;\r
+        case LCD_SEG_L1_3_2:\r
+            length = 2;\r
+            char_start = LCD_SEG_L1_3;\r
+            break;\r
+\r
+        // LINE2\r
+        case LCD_SEG_L2_5_0:\r
+            length = 6;\r
+            char_start = LCD_SEG_L2_5;\r
+            break;\r
+        case LCD_SEG_L2_4_0:\r
+            length = 5;\r
+            char_start = LCD_SEG_L2_4;\r
+            break;\r
+        case LCD_SEG_L2_3_0:\r
+            length = 4;\r
+            char_start = LCD_SEG_L2_3;\r
+            break;\r
+        case LCD_SEG_L2_2_0:\r
+            length = 3;\r
+            char_start = LCD_SEG_L2_2;\r
+            break;\r
+        case LCD_SEG_L2_1_0:\r
+            length = 2;\r
+            char_start = LCD_SEG_L2_1;\r
+            break;\r
+        case LCD_SEG_L2_5_4:\r
+            length = 2;\r
+            char_start = LCD_SEG_L2_5;\r
+            break;\r
+        case LCD_SEG_L2_5_2:\r
+            length = 4;\r
+            char_start = LCD_SEG_L2_5;\r
+            break;\r
+        case LCD_SEG_L2_3_2:\r
+            length = 2;\r
+            char_start = LCD_SEG_L2_3;\r
+            break;\r
+        case LCD_SEG_L2_4_2:\r
+            length = 3;\r
+            char_start = LCD_SEG_L2_4;\r
+            break;\r
+    }\r
+\r
+    // Write to consecutive digits\r
+    for (i = 0; i < length; i++)\r
+    {\r
+        // Use single character routine to write display memory\r
+        display_char(char_start + i, *(str + i), mode);\r
+    }\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          switch_seg\r
+// @brief       Returns index of 7-segment character. Required for display routines that can draw\r
+//                              information on both lines.\r
+// @param       u8 line             LINE1 or LINE2\r
+//                              u8 index1               Index of LINE1\r
+//                              u8 index2               Index of LINE2\r
+// @return      uint8\r
+// *************************************************************************************************\r
+u8 switch_seg(u8 line, u8 index1, u8 index2)\r
+{\r
+    if (line == LINE1)\r
+    {\r
+        return index1;\r
+    }\r
+    else                        // line == LINE2\r
+    {\r
+        return index2;\r
+    }\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          start_blink\r
+// @brief       Start blinking.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void start_blink(void)\r
+{\r
+    LCDBBLKCTL |= LCDBLKMOD0;\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          stop_blink\r
+// @brief       Stop blinking.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void stop_blink(void)\r
+{\r
+    LCDBBLKCTL &= ~LCDBLKMOD0;\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          stop_blink\r
+// @brief       Clear blinking memory.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void clear_blink_mem(void)\r
+{\r
+    LCDBMEMCTL |= LCDCLRBM;\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          set_blink_rate\r
+// @brief       Set blink rate register bits.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void set_blink_rate(u8 bits)\r
+{\r
+    LCDBBLKCTL &= ~(BIT7 | BIT6 | BIT5);\r
+    LCDBBLKCTL |= bits;\r
+}\r
+\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/driver/display.h b/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/driver/display.h
new file mode 100755 (executable)
index 0000000..3674a4e
--- /dev/null
@@ -0,0 +1,338 @@
+// *************************************************************************************************\r
+//\r
+//      Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//        Redistribution and use in source and binary forms, with or without\r
+//        modification, are permitted provided that the following conditions\r
+//        are met:\r
+//\r
+//          Redistributions of source code must retain the above copyright\r
+//          notice, this list of conditions and the following disclaimer.\r
+//\r
+//          Redistributions in binary form must reproduce the above copyright\r
+//          notice, this list of conditions and the following disclaimer in the\r
+//          documentation and/or other materials provided with the\r
+//          distribution.\r
+//\r
+//          Neither the name of Texas Instruments Incorporated nor the names of\r
+//          its contributors may be used to endorse or promote products derived\r
+//          from this software without specific prior written permission.\r
+//\r
+//        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+\r
+#ifndef __DISPLAY_H\r
+#define __DISPLAY_H\r
+\r
+// *************************************************************************************************\r
+// Include section\r
+\r
+#include <project.h>\r
+\r
+// *************************************************************************************************\r
+// Extern section\r
+\r
+// Constants defined in library\r
+extern const u8 lcd_font[];\r
+extern const u8 *segments_lcdmem[];\r
+extern const u8 segments_bitmask[];\r
+extern const u8 int_to_array_conversion_table[][3];\r
+\r
+// *************************************************************************************************\r
+// Global Variable section\r
+\r
+// Set of display flags\r
+typedef union\r
+{\r
+    struct\r
+    {\r
+        // Line1 + Line2 + Icons\r
+        u16 full_update : 1;            // 1 = Redraw all content\r
+        u16 partial_update : 1;         // 1 = Update changes\r
+\r
+        // Line only\r
+        u16 line1_full_update : 1;      // 1 = Redraw Line1 content\r
+        u16 line2_full_update : 1;      // 1 = Redraw Line2 content\r
+\r
+        // Logic module data update flags\r
+        u16 update_time : 1;            // 1 = Time was updated\r
+        u16 update_stopwatch : 1;       // 1 = Stopwatch was updated\r
+        u16 update_temperature : 1;     // 1 = Temperature was updated\r
+        u16 update_battery_voltage : 1; // 1 = Battery voltage was updated\r
+        u16 update_date : 1;            // 1 = Date was updated\r
+        u16 update_alarm : 1;           // 1 = Alarm time was updated\r
+        u16 update_acceleration : 1;    // 1 = Acceleration data was updated\r
+    } flag;\r
+    u16 all_flags;                      // Shortcut to all display flags (for reset)\r
+} s_display_flags;\r
+\r
+extern volatile s_display_flags display;\r
+\r
+// *************************************************************************************************\r
+// Defines section\r
+\r
+// Display function modes\r
+#define DISPLAY_LINE_UPDATE_FULL                (BIT0)\r
+#define DISPLAY_LINE_UPDATE_PARTIAL             (BIT1)\r
+#define DISPLAY_LINE_CLEAR                              (BIT2)\r
+\r
+// Definitions for line view style\r
+#define DISPLAY_DEFAULT_VIEW                    (0u)\r
+#define DISPLAY_ALTERNATIVE_VIEW                (1u)\r
+\r
+// Definitions for line access\r
+#define LINE1                                                   (1u)\r
+#define LINE2                                                   (2u)\r
+\r
+// LCD display modes\r
+#define SEG_OFF                                 (0u)\r
+#define SEG_ON                                  (1u)\r
+#define SEG_ON_BLINK_ON                 (2u)\r
+#define SEG_ON_BLINK_OFF                (3u)\r
+#define SEG_OFF_BLINK_OFF               (4u)\r
+\r
+// 7-segment character bit assignments\r
+#define SEG_A                   (BIT4)\r
+#define SEG_B                   (BIT5)\r
+#define SEG_C                   (BIT6)\r
+#define SEG_D                   (BIT7)\r
+#define SEG_E                   (BIT2)\r
+#define SEG_F                   (BIT0)\r
+#define SEG_G                   (BIT1)\r
+\r
+// ------------------------------------------\r
+// LCD symbols for easier access\r
+//\r
+// xxx_SEG_xxx          = Seven-segment character (sequence 5-4-3-2-1-0)\r
+// xxx_SYMB_xxx         = Display symbol, e.g. "AM" for ante meridiem\r
+// xxx_UNIT_xxx         = Display unit, e.g. "km/h" for kilometers per hour\r
+// xxx_ICON_xxx         = Display icon, e.g. heart to indicate reception of heart rate data\r
+// xxx_L1_xxx           = Item is part of Line1 information\r
+// xxx_L2_xxx           = Item is part of Line2 information\r
+\r
+// Symbols for Line1\r
+#define LCD_SYMB_AM                                     0\r
+#define LCD_SYMB_PM                                     1\r
+#define LCD_SYMB_ARROW_UP                       2\r
+#define LCD_SYMB_ARROW_DOWN                     3\r
+#define LCD_SYMB_PERCENT                        4\r
+\r
+// Symbols for Line2\r
+#define LCD_SYMB_TOTAL                          5\r
+#define LCD_SYMB_AVERAGE                        6\r
+#define LCD_SYMB_MAX                            7\r
+#define LCD_SYMB_BATTERY                        8\r
+\r
+// Units for Line1\r
+#define LCD_UNIT_L1_FT                          9\r
+#define LCD_UNIT_L1_K                           10\r
+#define LCD_UNIT_L1_M                           11\r
+#define LCD_UNIT_L1_I                           12\r
+#define LCD_UNIT_L1_PER_S                       13\r
+#define LCD_UNIT_L1_PER_H                       14\r
+#define LCD_UNIT_L1_DEGREE                      15\r
+\r
+// Units for Line2\r
+#define LCD_UNIT_L2_KCAL                        16\r
+#define LCD_UNIT_L2_KM                          17\r
+#define LCD_UNIT_L2_MI                          18\r
+\r
+// Icons\r
+#define LCD_ICON_HEART                          19\r
+#define LCD_ICON_STOPWATCH                      20\r
+#define LCD_ICON_RECORD                         21\r
+#define LCD_ICON_ALARM                          22\r
+#define LCD_ICON_BEEPER1                        23\r
+#define LCD_ICON_BEEPER2                        24\r
+#define LCD_ICON_BEEPER3                        25\r
+\r
+// Line1 7-segments\r
+#define LCD_SEG_L1_3                            26\r
+#define LCD_SEG_L1_2                            27\r
+#define LCD_SEG_L1_1                            28\r
+#define LCD_SEG_L1_0                            29\r
+#define LCD_SEG_L1_COL                          30\r
+#define LCD_SEG_L1_DP1                          31\r
+#define LCD_SEG_L1_DP0                          32\r
+\r
+// Line2 7-segments\r
+#define LCD_SEG_L2_5                            33\r
+#define LCD_SEG_L2_4                            34\r
+#define LCD_SEG_L2_3                            35\r
+#define LCD_SEG_L2_2                            36\r
+#define LCD_SEG_L2_1                            37\r
+#define LCD_SEG_L2_0                            38\r
+#define LCD_SEG_L2_COL1                         39\r
+#define LCD_SEG_L2_COL0                         40\r
+#define LCD_SEG_L2_DP                           41\r
+\r
+// Line1 7-segment arrays\r
+#define LCD_SEG_L1_3_0                          70\r
+#define LCD_SEG_L1_2_0                          71\r
+#define LCD_SEG_L1_1_0                          72\r
+#define LCD_SEG_L1_3_1                          73\r
+#define LCD_SEG_L1_3_2                          74\r
+\r
+// Line2 7-segment arrays\r
+#define LCD_SEG_L2_5_0                          90\r
+#define LCD_SEG_L2_4_0                          91\r
+#define LCD_SEG_L2_3_0                          92\r
+#define LCD_SEG_L2_2_0                          93\r
+#define LCD_SEG_L2_1_0                          94\r
+#define LCD_SEG_L2_5_2                          95\r
+#define LCD_SEG_L2_3_2                          96\r
+#define LCD_SEG_L2_5_4                          97\r
+#define LCD_SEG_L2_4_2                          98\r
+\r
+// LCD controller memory map\r
+#define LCD_MEM_1                               ((u8*)0x0A20)\r
+#define LCD_MEM_2                               ((u8*)0x0A21)\r
+#define LCD_MEM_3                               ((u8*)0x0A22)\r
+#define LCD_MEM_4                               ((u8*)0x0A23)\r
+#define LCD_MEM_5                               ((u8*)0x0A24)\r
+#define LCD_MEM_6                               ((u8*)0x0A25)\r
+#define LCD_MEM_7                               ((u8*)0x0A26)\r
+#define LCD_MEM_8                               ((u8*)0x0A27)\r
+#define LCD_MEM_9                               ((u8*)0x0A28)\r
+#define LCD_MEM_10                              ((u8*)0x0A29)\r
+#define LCD_MEM_11                              ((u8*)0x0A2A)\r
+#define LCD_MEM_12                              ((u8*)0x0A2B)\r
+\r
+// Memory assignment\r
+#define LCD_SEG_L1_0_MEM                        (LCD_MEM_6)\r
+#define LCD_SEG_L1_1_MEM                        (LCD_MEM_4)\r
+#define LCD_SEG_L1_2_MEM                        (LCD_MEM_3)\r
+#define LCD_SEG_L1_3_MEM                        (LCD_MEM_2)\r
+#define LCD_SEG_L1_COL_MEM                      (LCD_MEM_1)\r
+#define LCD_SEG_L1_DP1_MEM                      (LCD_MEM_1)\r
+#define LCD_SEG_L1_DP0_MEM                      (LCD_MEM_5)\r
+#define LCD_SEG_L2_0_MEM                        (LCD_MEM_8)\r
+#define LCD_SEG_L2_1_MEM                        (LCD_MEM_9)\r
+#define LCD_SEG_L2_2_MEM                        (LCD_MEM_10)\r
+#define LCD_SEG_L2_3_MEM                        (LCD_MEM_11)\r
+#define LCD_SEG_L2_4_MEM                        (LCD_MEM_12)\r
+#define LCD_SEG_L2_5_MEM                        (LCD_MEM_12)\r
+#define LCD_SEG_L2_COL1_MEM                     (LCD_MEM_1)\r
+#define LCD_SEG_L2_COL0_MEM                     (LCD_MEM_5)\r
+#define LCD_SEG_L2_DP_MEM                       (LCD_MEM_9)\r
+#define LCD_SYMB_AM_MEM                         (LCD_MEM_1)\r
+#define LCD_SYMB_PM_MEM                         (LCD_MEM_1)\r
+#define LCD_SYMB_ARROW_UP_MEM           (LCD_MEM_1)\r
+#define LCD_SYMB_ARROW_DOWN_MEM         (LCD_MEM_1)\r
+#define LCD_SYMB_PERCENT_MEM            (LCD_MEM_5)\r
+#define LCD_SYMB_TOTAL_MEM                      (LCD_MEM_11)\r
+#define LCD_SYMB_AVERAGE_MEM            (LCD_MEM_10)\r
+#define LCD_SYMB_MAX_MEM                        (LCD_MEM_8)\r
+#define LCD_SYMB_BATTERY_MEM            (LCD_MEM_7)\r
+#define LCD_UNIT_L1_FT_MEM                      (LCD_MEM_5)\r
+#define LCD_UNIT_L1_K_MEM                       (LCD_MEM_5)\r
+#define LCD_UNIT_L1_M_MEM                       (LCD_MEM_7)\r
+#define LCD_UNIT_L1_I_MEM                       (LCD_MEM_7)\r
+#define LCD_UNIT_L1_PER_S_MEM           (LCD_MEM_5)\r
+#define LCD_UNIT_L1_PER_H_MEM           (LCD_MEM_7)\r
+#define LCD_UNIT_L1_DEGREE_MEM          (LCD_MEM_5)\r
+#define LCD_UNIT_L2_KCAL_MEM            (LCD_MEM_7)\r
+#define LCD_UNIT_L2_KM_MEM                      (LCD_MEM_7)\r
+#define LCD_UNIT_L2_MI_MEM                      (LCD_MEM_7)\r
+#define LCD_ICON_HEART_MEM                      (LCD_MEM_2)\r
+#define LCD_ICON_STOPWATCH_MEM          (LCD_MEM_3)\r
+#define LCD_ICON_RECORD_MEM                     (LCD_MEM_1)\r
+#define LCD_ICON_ALARM_MEM                      (LCD_MEM_4)\r
+#define LCD_ICON_BEEPER1_MEM            (LCD_MEM_5)\r
+#define LCD_ICON_BEEPER2_MEM            (LCD_MEM_6)\r
+#define LCD_ICON_BEEPER3_MEM            (LCD_MEM_7)\r
+\r
+// Bit masks for write access\r
+#define LCD_SEG_L1_0_MASK                       (BIT2 + BIT1 + BIT0 + BIT7 + BIT6 + BIT5 + BIT4)\r
+#define LCD_SEG_L1_1_MASK                       (BIT2 + BIT1 + BIT0 + BIT7 + BIT6 + BIT5 + BIT4)\r
+#define LCD_SEG_L1_2_MASK                       (BIT2 + BIT1 + BIT0 + BIT7 + BIT6 + BIT5 + BIT4)\r
+#define LCD_SEG_L1_3_MASK                       (BIT2 + BIT1 + BIT0 + BIT7 + BIT6 + BIT5 + BIT4)\r
+#define LCD_SEG_L1_COL_MASK                     (BIT5)\r
+#define LCD_SEG_L1_DP1_MASK                     (BIT6)\r
+#define LCD_SEG_L1_DP0_MASK                     (BIT2)\r
+#define LCD_SEG_L2_0_MASK                       (BIT3 + BIT2 + BIT1 + BIT0 + BIT6 + BIT5 + BIT4)\r
+#define LCD_SEG_L2_1_MASK                       (BIT3 + BIT2 + BIT1 + BIT0 + BIT6 + BIT5 + BIT4)\r
+#define LCD_SEG_L2_2_MASK                       (BIT3 + BIT2 + BIT1 + BIT0 + BIT6 + BIT5 + BIT4)\r
+#define LCD_SEG_L2_3_MASK                       (BIT3 + BIT2 + BIT1 + BIT0 + BIT6 + BIT5 + BIT4)\r
+#define LCD_SEG_L2_4_MASK                       (BIT3 + BIT2 + BIT1 + BIT0 + BIT6 + BIT5 + BIT4)\r
+#define LCD_SEG_L2_5_MASK                       (BIT7)\r
+#define LCD_SEG_L2_COL1_MASK            (BIT4)\r
+#define LCD_SEG_L2_COL0_MASK            (BIT0)\r
+#define LCD_SEG_L2_DP_MASK                      (BIT7)\r
+#define LCD_SYMB_AM_MASK                        (BIT1 + BIT0)\r
+#define LCD_SYMB_PM_MASK                        (BIT0)\r
+#define LCD_SYMB_ARROW_UP_MASK          (BIT2)\r
+#define LCD_SYMB_ARROW_DOWN_MASK        (BIT3)\r
+#define LCD_SYMB_PERCENT_MASK           (BIT4)\r
+#define LCD_SYMB_TOTAL_MASK                     (BIT7)\r
+#define LCD_SYMB_AVERAGE_MASK           (BIT7)\r
+#define LCD_SYMB_MAX_MASK                       (BIT7)\r
+#define LCD_SYMB_BATTERY_MASK           (BIT7)\r
+#define LCD_UNIT_L1_FT_MASK                     (BIT5)\r
+#define LCD_UNIT_L1_K_MASK                      (BIT6)\r
+#define LCD_UNIT_L1_M_MASK                      (BIT1)\r
+#define LCD_UNIT_L1_I_MASK                      (BIT0)\r
+#define LCD_UNIT_L1_PER_S_MASK          (BIT7)\r
+#define LCD_UNIT_L1_PER_H_MASK          (BIT2)\r
+#define LCD_UNIT_L1_DEGREE_MASK         (BIT1)\r
+#define LCD_UNIT_L2_KCAL_MASK           (BIT4)\r
+#define LCD_UNIT_L2_KM_MASK                     (BIT5)\r
+#define LCD_UNIT_L2_MI_MASK                     (BIT6)\r
+#define LCD_ICON_HEART_MASK                     (BIT3)\r
+#define LCD_ICON_STOPWATCH_MASK         (BIT3)\r
+#define LCD_ICON_RECORD_MASK            (BIT7)\r
+#define LCD_ICON_ALARM_MASK                     (BIT3)\r
+#define LCD_ICON_BEEPER1_MASK           (BIT3)\r
+#define LCD_ICON_BEEPER2_MASK           (BIT3)\r
+#define LCD_ICON_BEEPER3_MASK           (BIT3)\r
+\r
+// *************************************************************************************************\r
+// API section\r
+\r
+// Physical LCD memory write\r
+extern void write_lcd_mem(u8 * lcdmem, u8 bits, u8 bitmask, u8 state);\r
+\r
+// Display init / clear\r
+extern void lcd_init(void);\r
+extern void clear_display(void);\r
+extern void clear_display_all(void);\r
+extern void clear_line(u8 line);\r
+\r
+// Blinking function\r
+extern void start_blink(void);\r
+extern void stop_blink(void);\r
+extern void clear_blink_mem(void);\r
+extern void set_blink_rate(u8 bits);\r
+\r
+// Character / symbol draw functions\r
+extern void display_char(u8 segment, u8 chr, u8 mode);\r
+extern void display_chars(u8 segments, u8 * str, u8 mode);\r
+extern void display_symbol(u8 symbol, u8 mode);\r
+\r
+// Time display function\r
+extern void DisplayTime(u8 updateMode);\r
+extern void display_am_pm_symbol(u8 timeAM);\r
+\r
+// Set_value display functions\r
+extern void display_value(u8 segments, u32 value, u8 digits, u8 blanks);\r
+extern void display_hours(u8 segments, u32 value, u8 digits, u8 blanks);\r
+\r
+// Integer to string conversion\r
+extern u8 *int_to_array(u32 n, u8 digits, u8 blanks);\r
+\r
+// Segment index helper function\r
+extern u8 switch_seg(u8 line, u8 index1, u8 index2);\r
+\r
+#endif     /*DISPLAY_H_ */\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/driver/ez430_chronos_drivers.lib b/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/driver/ez430_chronos_drivers.lib
new file mode 100755 (executable)
index 0000000..2601d5b
Binary files /dev/null and b/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/driver/ez430_chronos_drivers.lib differ
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/driver/pmm.c b/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/driver/pmm.c
new file mode 100755 (executable)
index 0000000..6d53a7c
--- /dev/null
@@ -0,0 +1,78 @@
+//****************************************************************************//\r
+// Function Library for setting the PMM\r
+//\r
+//  This file is used in conjunction with PMM.c to set the core\r
+//  voltage level of a device. To set a core voltage level, call\r
+//  SetVCore(level). See RF project(s) for example usage.\r
+//\r
+//  Original programm                                           Stefan Schauer\r
+//  Rev 1.1: changed VCoreUp to fit with recommended flow (09/04/2008)\r
+//\r
+//****************************************************************************//\r
+#include "cc430x613x.h"\r
+#include "pmm.h"\r
+\r
+//****************************************************************************//\r
+// Set VCore level\r
+// SetVCore level is called from the user API\r
+//****************************************************************************//\r
+void SetVCore(unsigned char level)                                   // Note: change level by one\r
+                                                                     // step only\r
+{\r
+    unsigned char actLevel;\r
+\r
+    do\r
+    {\r
+        actLevel = PMMCTL0_L & PMMCOREV_3;\r
+        if (actLevel < level)\r
+            SetVCoreUp(++actLevel);                                  // Set VCore (step by step)\r
+        if (actLevel > level)\r
+            SetVCoreDown(--actLevel);                                // Set VCore (step by step)\r
+    }\r
+    while (actLevel != level);\r
+}\r
+\r
+//****************************************************************************//\r
+// Set VCore up\r
+//****************************************************************************//\r
+void SetVCoreUp(unsigned char level)                                 // Note: change level by one\r
+                                                                     // step only\r
+{\r
+    // Open PMM module registers for write access\r
+    PMMCTL0_H = 0xA5;\r
+\r
+    // Set SVS/M high side to new level\r
+    SVSMHCTL = SVSHE + SVSHRVL0 * level + SVMHE + SVSMHRRL0 * level;\r
+\r
+    SVSMLCTL = SVSLE + SVMLE + SVSMLRRL0 * level;                    // Set SVM new Level\r
+    while ((PMMIFG & SVSMLDLYIFG) == 0) ;                            // Wait till SVM is settled\r
+                                                                     // (Delay)\r
+    PMMCTL0_L = PMMCOREV0 * level;                                   // Set VCore to x\r
+    PMMIFG &= ~(SVMLVLRIFG + SVMLIFG);                               // Clear already set flags\r
+    if ((PMMIFG & SVMLIFG))\r
+        while ((PMMIFG & SVMLVLRIFG) == 0) ;                         // Wait till level is reached\r
+\r
+    SVSMLCTL = SVSLE + SVSLRVL0 * level + SVMLE + SVSMLRRL0 * level; // Set SVS/M Low side to new\r
+                                                                     // level\r
+    PMMCTL0_H = 0x00;                                                // Lock PMM module registers\r
+                                                                     // for write access\r
+}\r
+\r
+//****************************************************************************//\r
+// Set VCore down\r
+//****************************************************************************//\r
+void SetVCoreDown(unsigned char level)\r
+{\r
+    PMMCTL0_H = 0xA5;                                                // Open PMM module registers\r
+                                                                     // for write access\r
+    SVSMLCTL = SVSLE + SVSLRVL0 * level + SVMLE + SVSMLRRL0 * level; // Set SVS/M Low side to new\r
+                                                                     // level\r
+    while ((PMMIFG & SVSMLDLYIFG) == 0) ;                            // Wait till SVM is settled\r
+                                                                     // (Delay)\r
+    PMMCTL0_L = (level * PMMCOREV0);                                 // Set VCore to 1.85 V for Max\r
+                                                                     // Speed.\r
+    PMMCTL0_H = 0x00;                                                // Lock PMM module registers\r
+                                                                     // for write access\r
+}\r
+\r
+//****************************************************************************//\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/driver/pmm.h b/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/driver/pmm.h
new file mode 100755 (executable)
index 0000000..170008f
--- /dev/null
@@ -0,0 +1,43 @@
+//====================================================================\r
+//    File: PMM.h\r
+//\r
+//    This file is used in conjunction with PMM.c to set the core\r
+//    voltage level of a device. To set a core voltage level, call\r
+//    SetVCore(level). See RF project(s) for example usage.\r
+//\r
+//    Version 1.0 first\r
+//    07/14/07\r
+//\r
+//====================================================================\r
+\r
+#ifndef __PMM\r
+#define __PMM\r
+\r
+//====================================================================\r
+\r
+/**\r
+ * Set the VCore to a new level\r
+ *\r
+ * \param level       PMM level ID\r
+ */\r
+void SetVCore(unsigned char level);\r
+\r
+//====================================================================\r
+\r
+/**\r
+ * Set the VCore to a new higher level\r
+ *\r
+ * \param level       PMM level ID\r
+ */\r
+void SetVCoreUp(unsigned char level);\r
+\r
+//====================================================================\r
+\r
+/**\r
+ * Set the VCore to a new Lower level\r
+ *\r
+ * \param level       PMM level ID\r
+ */\r
+void SetVCoreDown(unsigned char level);\r
+\r
+#endif                          /* __PMM */\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/driver/ports.c b/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/driver/ports.c
new file mode 100755 (executable)
index 0000000..cd086c3
--- /dev/null
@@ -0,0 +1,455 @@
+// *************************************************************************************************\r
+//\r
+//      Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//        Redistribution and use in source and binary forms, with or without\r
+//        modification, are permitted provided that the following conditions\r
+//        are met:\r
+//\r
+//          Redistributions of source code must retain the above copyright\r
+//          notice, this list of conditions and the following disclaimer.\r
+//\r
+//          Redistributions in binary form must reproduce the above copyright\r
+//          notice, this list of conditions and the following disclaimer in the\r
+//          documentation and/or other materials provided with the\r
+//          distribution.\r
+//\r
+//          Neither the name of Texas Instruments Incorporated nor the names of\r
+//          its contributors may be used to endorse or promote products derived\r
+//          from this software without specific prior written permission.\r
+//\r
+//        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+// Button entry functions.\r
+// *************************************************************************************************\r
+\r
+// *************************************************************************************************\r
+// Include section\r
+\r
+// system\r
+#include "project.h"\r
+\r
+// driver\r
+#include "ports.h"\r
+#include "buzzer.h"\r
+#include "vti_as.h"\r
+#include "vti_ps.h"\r
+#include "timer.h"\r
+#include "display.h"\r
+\r
+// logic\r
+#include "clock.h"\r
+#include "alarm.h"\r
+#include "rfsimpliciti.h"\r
+#include "simpliciti.h"\r
+#include "altitude.h"\r
+#include "stopwatch.h"\r
+\r
+// *************************************************************************************************\r
+// Prototypes section\r
+void button_repeat_on(u16 msec);\r
+void button_repeat_off(void);\r
+void button_repeat_function(void);\r
+\r
+// *************************************************************************************************\r
+// Defines section\r
+\r
+// Macro for button IRQ\r
+#define IRQ_TRIGGERED(flags, bit)               ((flags & bit) == bit)\r
+\r
+// *************************************************************************************************\r
+// Global Variable section\r
+volatile s_button_flags button;\r
+volatile struct struct_button sButton;\r
+\r
+// *************************************************************************************************\r
+// Extern section\r
+extern void (*fptr_Timer0_A3_function)(void);\r
+\r
+// *************************************************************************************************\r
+// @fn          init_buttons\r
+// @brief       Init and enable button interrupts.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void init_buttons(void)\r
+{\r
+    // Set button ports to input\r
+    BUTTONS_DIR &= ~ALL_BUTTONS;\r
+\r
+    // Enable internal pull-downs\r
+    BUTTONS_OUT &= ~ALL_BUTTONS;\r
+    BUTTONS_REN |= ALL_BUTTONS;\r
+\r
+    // IRQ triggers on rising edge\r
+    BUTTONS_IES &= ~ALL_BUTTONS;\r
+\r
+    // Reset IRQ flags\r
+    BUTTONS_IFG &= ~ALL_BUTTONS;\r
+\r
+    // Enable button interrupts\r
+    BUTTONS_IE |= ALL_BUTTONS;\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          PORT2_ISR\r
+// @brief       Interrupt service routine for\r
+//                                      - buttons\r
+//                                      - acceleration sensor CMA_INT\r
+//                                      - pressure sensor DRDY\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+#pragma vector=PORT2_VECTOR\r
+__interrupt void PORT2_ISR(void)\r
+{\r
+    // Clear flags\r
+    u8 int_flag, int_enable;\r
+    u8 buzzer = 0;\r
+    u8 simpliciti_button_event = 0;\r
+    static u8 simpliciti_button_repeat = 0;\r
+\r
+    // Remember interrupt enable bits\r
+    int_enable = BUTTONS_IE;\r
+\r
+    if ((!button.flag.star_long) && (!button.flag.num_long))\r
+    {\r
+        // Clear button flags\r
+        button.all_flags = 0;\r
+\r
+        // Store valid button interrupt flag\r
+        int_flag = BUTTONS_IFG & int_enable;\r
+\r
+        // ---------------------------------------------------\r
+        // While SimpliciTI stack is active, buttons behave differently:\r
+        //  - Store button events in SimpliciTI packet data\r
+        //  - Exit SimpliciTI when button DOWN was pressed\r
+        if (is_rf())\r
+        {\r
+            // Erase previous button press after a number of resends (increase number if link\r
+            // quality is low)\r
+            // This will create a series of packets containing the same button press\r
+            // Necessary because we have no acknowledge\r
+            // Filtering (edge detection) will be done by receiver software\r
+            if (simpliciti_button_repeat++ > 6)\r
+            {\r
+                simpliciti_data[0] &= ~0xF0;\r
+                simpliciti_button_repeat = 0;\r
+            }\r
+\r
+            if ((int_flag & BUTTON_STAR_PIN) == BUTTON_STAR_PIN)\r
+            {\r
+                simpliciti_data[0] |= SIMPLICITI_BUTTON_STAR;\r
+                simpliciti_button_event = 1;\r
+            }\r
+            else if ((int_flag & BUTTON_NUM_PIN) == BUTTON_NUM_PIN)\r
+            {\r
+                simpliciti_data[0] |= SIMPLICITI_BUTTON_NUM;\r
+                simpliciti_button_event = 1;\r
+            }\r
+            else if ((int_flag & BUTTON_UP_PIN) == BUTTON_UP_PIN)\r
+            {\r
+                simpliciti_data[0] |= SIMPLICITI_BUTTON_UP;\r
+                simpliciti_button_event = 1;\r
+            }\r
+            else if ((int_flag & BUTTON_DOWN_PIN) == BUTTON_DOWN_PIN)\r
+            {\r
+                simpliciti_flag |= SIMPLICITI_TRIGGER_STOP;\r
+            }\r
+\r
+            // Trigger packet sending inside SimpliciTI stack\r
+            if (simpliciti_button_event)\r
+                simpliciti_flag |= SIMPLICITI_TRIGGER_SEND_DATA;\r
+        }\r
+        else                    // Normal operation\r
+        {\r
+            // Debounce buttons\r
+            if ((int_flag & ALL_BUTTONS) != 0)\r
+            {\r
+                // Disable PORT2 IRQ\r
+                __disable_interrupt();\r
+                BUTTONS_IE = 0x00;\r
+                __enable_interrupt();\r
+\r
+                // Debounce delay 1\r
+                Timer0_A4_Delay(CONV_MS_TO_TICKS(BUTTONS_DEBOUNCE_TIME_IN));\r
+\r
+                // Reset inactivity detection\r
+                sTime.last_activity = sTime.system_time;\r
+            }\r
+\r
+            // ---------------------------------------------------\r
+            // STAR button IRQ\r
+            if (IRQ_TRIGGERED(int_flag, BUTTON_STAR_PIN))\r
+            {\r
+                // Filter bouncing noise\r
+                if (BUTTON_STAR_IS_PRESSED)\r
+                {\r
+                    button.flag.star = 1;\r
+                    button.flag.star_not_long = 0;\r
+                    // Generate button click\r
+                    buzzer = 1;\r
+                }\r
+                else if ((BUTTONS_IES & BUTTON_STAR_PIN) == BUTTON_STAR_PIN)\r
+                {\r
+                    button.flag.star = 1;\r
+                    button.flag.star_not_long = 0;\r
+                    BUTTONS_IES &= ~BUTTON_STAR_PIN;\r
+                }\r
+            }\r
+            // ---------------------------------------------------\r
+            // NUM button IRQ\r
+            else if (IRQ_TRIGGERED(int_flag, BUTTON_NUM_PIN))\r
+            {\r
+                // Filter bouncing noise\r
+                if (BUTTON_NUM_IS_PRESSED)\r
+                {\r
+                    button.flag.num = 1;\r
+                    button.flag.num_not_long = 0;\r
+                    // Generate button click\r
+                    buzzer = 1;\r
+                }\r
+                else if ((BUTTONS_IES & BUTTON_NUM_PIN) == BUTTON_NUM_PIN)\r
+                {\r
+                    button.flag.num = 1;\r
+                    button.flag.num_not_long = 0;\r
+                    BUTTONS_IES &= ~BUTTON_NUM_PIN;\r
+                }\r
+            }\r
+            // ---------------------------------------------------\r
+            // UP button IRQ\r
+            else if (IRQ_TRIGGERED(int_flag, BUTTON_UP_PIN))\r
+            {\r
+                // Filter bouncing noise\r
+                if (BUTTON_UP_IS_PRESSED)\r
+                {\r
+                    button.flag.up = 1;\r
+\r
+                    // Generate button click\r
+                    buzzer = 1;\r
+                }\r
+            }\r
+            // ---------------------------------------------------\r
+            // DOWN button IRQ\r
+            else if (IRQ_TRIGGERED(int_flag, BUTTON_DOWN_PIN))\r
+            {\r
+                // Filter bouncing noise\r
+                if (BUTTON_DOWN_IS_PRESSED)\r
+                {\r
+                    button.flag.down = 1;\r
+\r
+                    // Generate button click\r
+                    buzzer = 1;\r
+\r
+                    // Faster reaction for stopwatch stop button press\r
+                    if (is_stopwatch() && !sys.flag.lock_buttons)\r
+                    {\r
+                        stop_stopwatch();\r
+                        button.flag.down = 0;\r
+                    }\r
+                }\r
+            }\r
+            // ---------------------------------------------------\r
+            // B/L button IRQ\r
+            else if (IRQ_TRIGGERED(int_flag, BUTTON_BACKLIGHT_PIN))\r
+            {\r
+                // Filter bouncing noise\r
+                if (BUTTON_BACKLIGHT_IS_PRESSED)\r
+                {\r
+                    sButton.backlight_status = 1;\r
+                    sButton.backlight_timeout = 0;\r
+                    P2OUT |= BUTTON_BACKLIGHT_PIN;\r
+                    P2DIR |= BUTTON_BACKLIGHT_PIN;\r
+                }\r
+            }\r
+        }\r
+\r
+        // Trying to lock/unlock buttons?\r
+        if (button.flag.num && button.flag.down)\r
+        {\r
+            // No buzzer output\r
+            buzzer = 0;\r
+            button.all_flags = 0;\r
+        }\r
+\r
+        // Generate button click when button was activated\r
+        if (buzzer)\r
+        {\r
+            // Any button event stops active alarm\r
+            if (sAlarm.state == ALARM_ON)\r
+            {\r
+                stop_alarm();\r
+                button.all_flags = 0;\r
+            }\r
+            else if (!sys.flag.up_down_repeat_enabled)\r
+            {\r
+                start_buzzer(1, CONV_MS_TO_TICKS(20), CONV_MS_TO_TICKS(150));\r
+            }\r
+\r
+            // Debounce delay 2\r
+            Timer0_A4_Delay(CONV_MS_TO_TICKS(BUTTONS_DEBOUNCE_TIME_OUT));\r
+        }\r
+\r
+        // ---------------------------------------------------\r
+        // Acceleration sensor IRQ\r
+        if (IRQ_TRIGGERED(int_flag, AS_INT_PIN))\r
+        {\r
+            // Get data from sensor\r
+            request.flag.acceleration_measurement = 1;\r
+        }\r
+\r
+        // ---------------------------------------------------\r
+        // Pressure sensor IRQ\r
+        if (IRQ_TRIGGERED(int_flag, PS_INT_PIN))\r
+        {\r
+            // Get data from sensor\r
+            request.flag.altitude_measurement = 1;\r
+        }\r
+\r
+        // ---------------------------------------------------\r
+        // Safe long button event detection\r
+        if (button.flag.star || button.flag.num)\r
+        {\r
+            // Additional debounce delay to enable safe high detection - 50ms\r
+            Timer0_A4_Delay(CONV_MS_TO_TICKS(BUTTONS_DEBOUNCE_TIME_LEFT));\r
+\r
+            // Check if this button event is short enough\r
+            if (BUTTON_STAR_IS_PRESSED)\r
+            {\r
+                // Change interrupt edge to detect button release\r
+                BUTTONS_IES |= BUTTON_STAR_PIN;\r
+                button.flag.star = 0;\r
+                // This flag is used to detect if the user released the button before the\r
+                // time for a long button press (3s)\r
+                button.flag.star_not_long = 1;\r
+            }\r
+            if (BUTTON_NUM_IS_PRESSED)\r
+            {\r
+                // Change interrupt edge to detect button release\r
+                BUTTONS_IES |= BUTTON_NUM_PIN;\r
+                button.flag.num = 0;\r
+                // This flag is used to detect if the user released the button before the\r
+                // time for a long button press (3s)\r
+                button.flag.num_not_long = 1;\r
+            }\r
+        }\r
+\r
+    }\r
+    // Reenable PORT2 IRQ\r
+    __disable_interrupt();\r
+    BUTTONS_IFG = 0x00;\r
+    BUTTONS_IE = int_enable;\r
+    __enable_interrupt();\r
+\r
+    // Exit from LPM3/LPM4 on RETI\r
+    __bic_SR_register_on_exit(LPM4_bits);\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          button_repeat_on\r
+// @brief       Start button auto repeat timer.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void button_repeat_on(u16 msec)\r
+{\r
+    // Set button repeat flag\r
+    sys.flag.up_down_repeat_enabled = 1;\r
+\r
+    // Set Timer0_A3 function pointer to button repeat function\r
+    fptr_Timer0_A3_function = button_repeat_function;\r
+\r
+    // Timer0_A3 IRQ triggers every 200ms\r
+    Timer0_A3_Start(CONV_MS_TO_TICKS(msec));\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          button_repeat_off\r
+// @brief       Stop button auto repeat timer.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void button_repeat_off(void)\r
+{\r
+    // Clear button repeat flag\r
+    sys.flag.up_down_repeat_enabled = 0;\r
+\r
+    // Timer0_A3 IRQ repeats with 4Hz\r
+    Timer0_A3_Stop();\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          button_repeat_function\r
+// @brief       Check at regular intervals if button is pushed continuously\r
+//                              and trigger virtual button event.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void button_repeat_function(void)\r
+{\r
+    static u8 start_delay = 10; // Wait for 2 seconds before starting auto up/down\r
+    u8 repeat = 0;\r
+\r
+    // If buttons UP or DOWN are continuously high, repeatedly set button flag\r
+    if (BUTTON_UP_IS_PRESSED)\r
+    {\r
+        if (start_delay == 0)\r
+        {\r
+            // Generate a virtual button event\r
+            button.flag.up = 1;\r
+            repeat = 1;\r
+        }\r
+        else\r
+        {\r
+            start_delay--;\r
+        }\r
+    }\r
+    else if (BUTTON_DOWN_IS_PRESSED)\r
+    {\r
+        if (start_delay == 0)\r
+        {\r
+            // Generate a virtual button event\r
+            button.flag.down = 1;\r
+            repeat = 1;\r
+        }\r
+        else\r
+        {\r
+            start_delay--;\r
+        }\r
+    }\r
+    else\r
+    {\r
+        // Reset repeat counter\r
+        sButton.repeats = 0;\r
+        start_delay = 10;\r
+\r
+        // Enable blinking\r
+        start_blink();\r
+    }\r
+\r
+    // If virtual button event is generated, stop blinking and reset timeout counter\r
+    if (repeat)\r
+    {\r
+        // Increase repeat counter\r
+        sButton.repeats++;\r
+\r
+        // Reset inactivity detection counter\r
+        sTime.last_activity = sTime.system_time;\r
+\r
+        // Disable blinking\r
+        stop_blink();\r
+    }\r
+}\r
+\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/driver/ports.h b/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/driver/ports.h
new file mode 100755 (executable)
index 0000000..fcb731f
--- /dev/null
@@ -0,0 +1,130 @@
+// *************************************************************************************************\r
+//\r
+//      Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//        Redistribution and use in source and binary forms, with or without\r
+//        modification, are permitted provided that the following conditions\r
+//        are met:\r
+//\r
+//          Redistributions of source code must retain the above copyright\r
+//          notice, this list of conditions and the following disclaimer.\r
+//\r
+//          Redistributions in binary form must reproduce the above copyright\r
+//          notice, this list of conditions and the following disclaimer in the\r
+//          documentation and/or other materials provided with the\r
+//          distribution.\r
+//\r
+//          Neither the name of Texas Instruments Incorporated nor the names of\r
+//          its contributors may be used to endorse or promote products derived\r
+//          from this software without specific prior written permission.\r
+//\r
+//        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+\r
+#ifndef PORTS_H_\r
+#define PORTS_H_\r
+\r
+// *************************************************************************************************\r
+// Defines section\r
+\r
+// Port, pins and interrupt resources for buttons\r
+#define BUTTONS_IN              (P2IN)\r
+#define BUTTONS_OUT                             (P2OUT)\r
+#define BUTTONS_DIR             (P2DIR)\r
+#define BUTTONS_REN                             (P2REN)\r
+#define BUTTONS_IE              (P2IE)\r
+#define BUTTONS_IES             (P2IES)\r
+#define BUTTONS_IFG             (P2IFG)\r
+#define BUTTONS_IRQ_VECT2       (PORT2_VECTOR)\r
+\r
+// Button ports\r
+#define BUTTON_STAR_PIN         (BIT2)\r
+#define BUTTON_NUM_PIN          (BIT1)\r
+#define BUTTON_UP_PIN           (BIT4)\r
+#define BUTTON_DOWN_PIN         (BIT0)\r
+#define BUTTON_BACKLIGHT_PIN    (BIT3)\r
+#define ALL_BUTTONS                             (BUTTON_STAR_PIN + BUTTON_NUM_PIN + BUTTON_UP_PIN + \\r
+                                                 BUTTON_DOWN_PIN + BUTTON_BACKLIGHT_PIN)\r
+\r
+// Macros for button press detection\r
+#define BUTTON_STAR_IS_PRESSED          ((BUTTONS_IN & BUTTON_STAR_PIN) == BUTTON_STAR_PIN)\r
+#define BUTTON_NUM_IS_PRESSED           ((BUTTONS_IN & BUTTON_NUM_PIN) == BUTTON_NUM_PIN)\r
+#define BUTTON_UP_IS_PRESSED            ((BUTTONS_IN & BUTTON_UP_PIN) == BUTTON_UP_PIN)\r
+#define BUTTON_DOWN_IS_PRESSED          ((BUTTONS_IN & BUTTON_DOWN_PIN) == BUTTON_DOWN_PIN)\r
+#define BUTTON_BACKLIGHT_IS_PRESSED     ((BUTTONS_IN & BUTTON_BACKLIGHT_PIN) == \\r
+                                         BUTTON_BACKLIGHT_PIN)\r
+#define NO_BUTTON_IS_PRESSED            ((BUTTONS_IN & ALL_BUTTONS) == 0)\r
+\r
+// Macros for button release detection\r
+#define BUTTON_STAR_IS_RELEASED                 ((BUTTONS_IN & BUTTON_STAR_PIN) == 0)\r
+#define BUTTON_NUM_IS_RELEASED                  ((BUTTONS_IN & BUTTON_NUM_PIN) == 0)\r
+#define BUTTON_UP_IS_RELEASED                   (BUTTONS_IN & BUTTON_UP_PIN) == 0)\r
+#define BUTTON_DOWN_IS_RELEASED                 ((BUTTONS_IN & BUTTON_DOWN_PIN) == 0)\r
+#define BUTTON_BACKLIGHT_IS_RELEASED    ((BUTTONS_IN & BUTTON_BACKLIGHT_PIN) == 0)\r
+\r
+// Button debounce time (msec)\r
+#define BUTTONS_DEBOUNCE_TIME_IN        (5u)\r
+#define BUTTONS_DEBOUNCE_TIME_OUT       (250u)\r
+#define BUTTONS_DEBOUNCE_TIME_LEFT      (50u)\r
+\r
+// Detect if STAR / NUM button is held low continuously\r
+#define LEFT_BUTTON_LONG_TIME           (2u)\r
+\r
+// Backlight time  (sec)\r
+#define BACKLIGHT_TIME_ON                       (3u)\r
+\r
+// Leave set_value() function after some seconds of user inactivity\r
+#define INACTIVITY_TIME                 (30u)\r
+\r
+// Set of button flags\r
+typedef union\r
+{\r
+    struct\r
+    {\r
+        // Manual button events\r
+        u16 star : 1;           // Short STAR button press\r
+        u16 num : 1;            // Short NUM button press\r
+        u16 up : 1;             // Short UP button press\r
+        u16 down : 1;           // Short DOWN button press\r
+        u16 backlight : 1;      // Short BACKLIGHT button press\r
+        u16 star_long : 1;      // Long STAR button press\r
+        u16 num_long : 1;       // Long NUM button press\r
+        u16 star_not_long : 1;  // Between short and long STAR button press\r
+        u16 num_not_long : 1;   // Between short and long NUM button press\r
+    } flag;\r
+    u16 all_flags;              // Shortcut to all display flags (for reset)\r
+} s_button_flags;\r
+extern volatile s_button_flags button;\r
+\r
+struct struct_button\r
+{\r
+    u8 star_timeout;            // this variable is incremented each second if STAR button is still\r
+                                // pressed\r
+    u8 num_timeout;             // this variable is incremented each second if NUM button is still\r
+                                // pressed\r
+    u8 backlight_timeout;       // controls the timeout for the backlight\r
+    u8 backlight_status;        // 1 case backlight is on\r
+    s16 repeats;\r
+};\r
+extern volatile struct struct_button sButton;\r
+\r
+// *************************************************************************************************\r
+// Extern section\r
+extern void button_repeat_on(u16 msec);\r
+extern void button_repeat_off(void);\r
+extern void button_repeat_function(void);\r
+extern void init_buttons(void);\r
+\r
+#endif                          /*PORTS_H_ */\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/driver/radio.c b/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/driver/radio.c
new file mode 100755 (executable)
index 0000000..276d929
--- /dev/null
@@ -0,0 +1,187 @@
+// *************************************************************************************************\r
+//\r
+//      Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//        Redistribution and use in source and binary forms, with or without\r
+//        modification, are permitted provided that the following conditions\r
+//        are met:\r
+//\r
+//          Redistributions of source code must retain the above copyright\r
+//          notice, this list of conditions and the following disclaimer.\r
+//\r
+//          Redistributions in binary form must reproduce the above copyright\r
+//          notice, this list of conditions and the following disclaimer in the\r
+//          documentation and/or other materials provided with the\r
+//          distribution.\r
+//\r
+//          Neither the name of Texas Instruments Incorporated nor the names of\r
+//          its contributors may be used to endorse or promote products derived\r
+//          from this software without specific prior written permission.\r
+//\r
+//        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+// Radio core access functions. Taken from TI reference code for CC430.\r
+// *************************************************************************************************\r
+\r
+// system\r
+#include "project.h"\r
+\r
+// driver\r
+#include "rf1a.h"\r
+#include "timer.h"\r
+\r
+// logic\r
+#include "rfsimpliciti.h"\r
+#include "bluerobin.h"\r
+\r
+// *************************************************************************************************\r
+// Extern section\r
+\r
+// SimpliciTI CC430 radio ISR - located in SimpliciTi library\r
+extern void MRFI_RadioIsr(void);\r
+\r
+// BlueRobin CC430 radio ISR - located in BlueRobin library\r
+extern void BlueRobin_RadioISR_v(void);\r
+\r
+// *************************************************************************************************\r
+// @fn          radio_reset\r
+// @brief       Reset radio core.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void radio_reset(void)\r
+{\r
+    volatile u16 i;\r
+    u8 x;\r
+\r
+    // Reset radio core\r
+    Strobe(RF_SRES);\r
+    // Wait before checking IDLE\r
+    for (i = 0; i < 100; i++) ;\r
+    do\r
+    {\r
+        x = Strobe(RF_SIDLE);\r
+    }\r
+    while ((x & 0x70) != 0x00);\r
+\r
+    // Clear radio error register\r
+    RF1AIFERR = 0;\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          radio_powerdown\r
+// @brief       Put radio to SLEEP mode.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void radio_powerdown(void)\r
+{\r
+    // Chip bug: Radio does not come out of this SLEEP when put to sleep\r
+    // using the SPWD cmd. However, it does wakes up if SXOFF was used to\r
+    // put it to sleep.\r
+\r
+    // Powerdown radio\r
+    Strobe(RF_SIDLE);\r
+    Strobe(RF_SPWD);\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          radio_sxoff\r
+// @brief       Put radio to SLEEP mode (XTAL off only).\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void radio_sxoff(void)\r
+{\r
+    // Chip bug: Radio does not come out of this SLEEP when put to sleep\r
+    // using the SPWD cmd. However, it does wakes up if SXOFF was used to\r
+    // put it to sleep.\r
+\r
+    // Powerdown radio\r
+    Strobe(RF_SIDLE);\r
+    Strobe(RF_SXOFF);\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          open_radio\r
+// @brief       Prepare radio for RF communication.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void open_radio(void)\r
+{\r
+    // Reset radio core\r
+    radio_reset();\r
+\r
+    // Enable radio IRQ\r
+    RF1AIFG &= ~BIT4;           // Clear a pending interrupt\r
+    RF1AIE |= BIT4;             // Enable the interrupt\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          close_radio\r
+// @brief       Shutdown radio for RF communication.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void close_radio(void)\r
+{\r
+    // Disable radio IRQ\r
+    RF1AIFG = 0;\r
+    RF1AIE = 0;\r
+\r
+    // Reset radio core\r
+    radio_reset();\r
+\r
+    // Put radio to sleep\r
+    radio_powerdown();\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          GDOx_ISR\r
+// @brief       GDO0/2 ISR to detect received packet.\r
+//                              In BlueRobin mode:  capture packet end time and decode received\r
+// packet\r
+//                              In SimpliciTI mode: go to SimpliciTI handler\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+#pragma vector=CC1101_VECTOR\r
+__interrupt void radio_ISR(void)\r
+{\r
+    u8 rf1aivec = RF1AIV;\r
+\r
+    // Forward to SimpliciTI interrupt service routine\r
+    if (is_rf())\r
+    {\r
+        MRFI_RadioIsr();\r
+    }\r
+    else                                  // BlueRobin packet end interrupt service routine\r
+    {\r
+        if (rf1aivec == RF1AIV_RFIFG9)\r
+        {\r
+            if ((sBlueRobin.state == BLUEROBIN_SEARCHING) ||\r
+                (sBlueRobin.state == BLUEROBIN_CONNECTED))\r
+            {\r
+                BlueRobin_RadioISR_v();\r
+            }\r
+        }\r
+        else if (rf1aivec == RF1AIV_NONE) // RF1A interface interrupt (error etc.)\r
+        {\r
+            asm ("     nop"); // break here\r
+        }\r
+    }\r
+}\r
+\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/driver/radio.h b/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/driver/radio.h
new file mode 100755 (executable)
index 0000000..f4c1bb9
--- /dev/null
@@ -0,0 +1,48 @@
+// *************************************************************************************************\r
+//\r
+//      Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//        Redistribution and use in source and binary forms, with or without\r
+//        modification, are permitted provided that the following conditions\r
+//        are met:\r
+//\r
+//          Redistributions of source code must retain the above copyright\r
+//          notice, this list of conditions and the following disclaimer.\r
+//\r
+//          Redistributions in binary form must reproduce the above copyright\r
+//          notice, this list of conditions and the following disclaimer in the\r
+//          documentation and/or other materials provided with the\r
+//          distribution.\r
+//\r
+//          Neither the name of Texas Instruments Incorporated nor the names of\r
+//          its contributors may be used to endorse or promote products derived\r
+//          from this software without specific prior written permission.\r
+//\r
+//        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+\r
+#ifndef RADIO_H_\r
+#define RADIO_H_\r
+\r
+extern void radio_reset(void);\r
+extern void radio_powerdown(void);\r
+extern void radio_sxoff(void);\r
+extern void radio_idle(void);\r
+extern void open_radio(void);\r
+extern void close_radio(void);\r
+extern void pmm_set_high_current_mode(void);\r
+extern void pmm_set_low_current_mode(void);\r
+\r
+#endif                          /*RADIO_H_ */\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/driver/rf1a.c b/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/driver/rf1a.c
new file mode 100755 (executable)
index 0000000..9f3b5be
--- /dev/null
@@ -0,0 +1,233 @@
+// *************************************************************************************************\r
+//\r
+// Actual revision: $Revision: $\r
+// Revision label:  $Name: $\r
+// Revision state:  $State: $\r
+//\r
+// *************************************************************************************************\r
+// Radio core access functions. Taken from TI reference code for CC430.\r
+// *************************************************************************************************\r
+\r
+// *************************************************************************************************\r
+// Include section\r
+\r
+// system\r
+#include <project.h>\r
+\r
+// driver\r
+#include "rf1a.h"\r
+\r
+// *************************************************************************************************\r
+// Global section\r
+\r
+// *************************************************************************************************\r
+// Define section\r
+#define st(x)                                           do { x } while (__LINE__ == -1)\r
+#define ENTER_CRITICAL_SECTION(x)       st(x = __get_interrupt_state(); __disable_interrupt(); )\r
+#define EXIT_CRITICAL_SECTION(x)    __set_interrupt_state(x)\r
+\r
+// *************************************************************************************************\r
+// @fn          Strobe\r
+// @brief       Send command to radio.\r
+// @param       unsigned char strobe    Command to radio\r
+// @return      statusByte                              Radio core status\r
+// *************************************************************************************************\r
+unsigned char Strobe(unsigned char strobe)\r
+{\r
+    u8 statusByte = 0;\r
+    u16 int_state, gdo_state;\r
+\r
+    // Check for valid strobe command\r
+    if ((strobe == 0xBD) || ((strobe > RF_SRES) && (strobe < RF_SNOP)))\r
+    {\r
+        ENTER_CRITICAL_SECTION(int_state);\r
+\r
+        // Clear the Status read flag\r
+        RF1AIFCTL1 &= ~(RFSTATIFG);\r
+\r
+        // Wait for radio to be ready for next instruction\r
+        while (!(RF1AIFCTL1 & RFINSTRIFG)) ;\r
+\r
+        // Write the strobe instruction\r
+        if ((strobe > RF_SRES) && (strobe < RF_SNOP))\r
+        {\r
+\r
+            gdo_state = ReadSingleReg(IOCFG2);         // buffer IOCFG2 state\r
+            WriteSingleReg(IOCFG2, 0x29);              // c-ready to GDO2\r
+\r
+            RF1AINSTRB = strobe;\r
+            if ((RF1AIN & 0x04) == 0x04)               // chip at sleep mode\r
+            {\r
+                if ((strobe == RF_SXOFF) || (strobe == RF_SPWD) || (strobe == RF_SWOR))\r
+                {\r
+                }\r
+                else\r
+                {\r
+                    while ((RF1AIN & 0x04) == 0x04) ;  // c-ready ?\r
+                    __delay_cycles(9800);              // Delay for ~810usec at 12MHz CPU clock\r
+                }\r
+            }\r
+            WriteSingleReg(IOCFG2, gdo_state);         // restore IOCFG2 setting\r
+        }\r
+        else                                           // chip active mode\r
+        {\r
+            RF1AINSTRB = strobe;\r
+        }\r
+        statusByte = RF1ASTATB;\r
+        while (!(RF1AIFCTL1 & RFSTATIFG)) ;\r
+        EXIT_CRITICAL_SECTION(int_state);\r
+    }\r
+    return statusByte;\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          ResetRadioCore\r
+// @brief       Software reset radio core.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void ResetRadioCore(void)\r
+{\r
+    Strobe(RF_SRES);            // Reset the Radio Core\r
+    Strobe(RF_SNOP);            // Reset Radio Pointer\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          ReadSingleReg\r
+// @brief       Read byte from register.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+unsigned char ReadSingleReg(unsigned char addr)\r
+{\r
+    unsigned char x;\r
+    u16 int_state;\r
+\r
+    ENTER_CRITICAL_SECTION(int_state);\r
+\r
+    RF1AINSTR1B = (addr | RF_REGRD);\r
+    x = RF1ADOUT1B;\r
+\r
+    EXIT_CRITICAL_SECTION(int_state);\r
+\r
+    return x;\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          WriteSingleReg\r
+// @brief       Write byte to register.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void WriteSingleReg(unsigned char addr, unsigned char value)\r
+{\r
+    volatile unsigned int i;\r
+    u16 int_state;\r
+\r
+    ENTER_CRITICAL_SECTION(int_state);\r
+\r
+    while (!(RF1AIFCTL1 & RFINSTRIFG)) ;           // Wait for the Radio to be ready for the next\r
+                                                   // instruction\r
+\r
+    RF1AINSTRW = ((addr | RF_REGWR) << 8) + value; // Send address + Instruction\r
+    while (!(RFDINIFG & RF1AIFCTL1)) ;\r
+\r
+    i = RF1ADOUTB;                                 // Reset RFDOUTIFG flag which contains status\r
+                                                   // byte\r
+\r
+    EXIT_CRITICAL_SECTION(int_state);\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          ReadBurstReg\r
+// @brief       Read sequence of bytes from register.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void ReadBurstReg(unsigned char addr, unsigned char *buffer, unsigned char count)\r
+{\r
+    unsigned int i;\r
+    u16 int_state;\r
+\r
+    ENTER_CRITICAL_SECTION(int_state);\r
+\r
+    while (!(RF1AIFCTL1 & RFINSTRIFG)) ;     // Wait for the Radio to be ready for next instruction\r
+    RF1AINSTR1B = (addr | RF_REGRD);         // Send address + Instruction\r
+\r
+    for (i = 0; i < (count - 1); i++)\r
+    {\r
+        while (!(RFDOUTIFG & RF1AIFCTL1)) ;  // Wait for the Radio Core to update the RF1ADOUTB reg\r
+        buffer[i] = RF1ADOUT1B;              // Read DOUT from Radio Core + clears RFDOUTIFG\r
+        // Also initiates auo-read for next DOUT byte\r
+    }\r
+    buffer[count - 1] = RF1ADOUT0B;          // Store the last DOUT from Radio Core\r
+\r
+    EXIT_CRITICAL_SECTION(int_state);\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          WriteBurstReg\r
+// @brief       Write sequence of bytes to register.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void WriteBurstReg(unsigned char addr, unsigned char *buffer, unsigned char count)\r
+{\r
+    // Write Burst works wordwise not bytewise - bug known already\r
+    unsigned char i;\r
+    u16 int_state;\r
+\r
+    ENTER_CRITICAL_SECTION(int_state);\r
+\r
+    while (!(RF1AIFCTL1 & RFINSTRIFG)) ;               // Wait for the Radio to be ready for next\r
+                                                       // instruction\r
+    RF1AINSTRW = ((addr | RF_REGWR) << 8) + buffer[0]; // Send address + Instruction\r
+\r
+    for (i = 1; i < count; i++)\r
+    {\r
+        RF1ADINB = buffer[i];                          // Send data\r
+        while (!(RFDINIFG & RF1AIFCTL1)) ;             // Wait for TX to finish\r
+    }\r
+    i = RF1ADOUTB;                                     // Reset RFDOUTIFG flag which contains status\r
+                                                       // byte\r
+\r
+    EXIT_CRITICAL_SECTION(int_state);\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          WritePATable\r
+// @brief       Write data to power table\r
+// @param       unsigned char value             Value to write\r
+// @return      none\r
+// *************************************************************************************************\r
+void WritePATable(unsigned char value)\r
+{\r
+    unsigned char readbackPATableValue = 0;\r
+    u16 int_state;\r
+\r
+    ENTER_CRITICAL_SECTION(int_state);\r
+\r
+    while (readbackPATableValue != value)\r
+    {\r
+        while (!(RF1AIFCTL1 & RFINSTRIFG)) ;\r
+        RF1AINSTRW = 0x7E00 + value; // PA Table write (burst)\r
+\r
+        while (!(RF1AIFCTL1 & RFINSTRIFG)) ;\r
+        RF1AINSTRB = RF_SNOP;        // reset pointer\r
+\r
+        while (!(RF1AIFCTL1 & RFINSTRIFG)) ;\r
+        RF1AINSTRB = 0xFE;           // PA Table read (burst)\r
+\r
+        while (!(RF1AIFCTL1 & RFDINIFG)) ;\r
+        RF1ADINB = 0x00;             //dummy write\r
+\r
+        while (!(RF1AIFCTL1 & RFDOUTIFG)) ;\r
+        readbackPATableValue = RF1ADOUT0B;\r
+\r
+        while (!(RF1AIFCTL1 & RFINSTRIFG)) ;\r
+        RF1AINSTRB = RF_SNOP;\r
+    }\r
+\r
+    EXIT_CRITICAL_SECTION(int_state);\r
+}\r
+\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/driver/rf1a.h b/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/driver/rf1a.h
new file mode 100755 (executable)
index 0000000..f1acd1c
--- /dev/null
@@ -0,0 +1,20 @@
+// *************************************************************************************************\r
+//\r
+// Actual revision: $Revision: $\r
+// Revision label:  $Name: $\r
+// Revision state:  $State: $\r
+//\r
+// *************************************************************************************************\r
+// Radio core access functions. Taken from TI reference code for CC430.\r
+// *************************************************************************************************\r
+\r
+// *************************************************************************************************\r
+// Prototype section\r
+unsigned char Strobe(unsigned char strobe);\r
+unsigned char ReadSingleReg(unsigned char addr);\r
+void WriteSingleReg(unsigned char addr, unsigned char value);\r
+void ReadBurstReg(unsigned char addr, unsigned char *buffer, unsigned char count);\r
+void WriteBurstReg(unsigned char addr, unsigned char *buffer, unsigned char count);\r
+void ResetRadioCore(void);\r
+void WritePATable(unsigned char value);\r
+void WaitForXT2(void);\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/driver/timer.c b/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/driver/timer.c
new file mode 100755 (executable)
index 0000000..8cd2811
--- /dev/null
@@ -0,0 +1,576 @@
+// *************************************************************************************************\r
+//\r
+//      Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//        Redistribution and use in source and binary forms, with or without\r
+//        modification, are permitted provided that the following conditions\r
+//        are met:\r
+//\r
+//          Redistributions of source code must retain the above copyright\r
+//          notice, this list of conditions and the following disclaimer.\r
+//\r
+//          Redistributions in binary form must reproduce the above copyright\r
+//          notice, this list of conditions and the following disclaimer in the\r
+//          documentation and/or other materials provided with the\r
+//          distribution.\r
+//\r
+//          Neither the name of Texas Instruments Incorporated nor the names of\r
+//          its contributors may be used to endorse or promote products derived\r
+//          from this software without specific prior written permission.\r
+//\r
+//        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+// Timer service routines.\r
+// *************************************************************************************************\r
+\r
+// *************************************************************************************************\r
+// Include section\r
+\r
+// system\r
+#include "project.h"\r
+\r
+// driver\r
+#include "timer.h"\r
+#include "ports.h"\r
+#include "buzzer.h"\r
+#include "vti_ps.h"\r
+#include "vti_as.h"\r
+#include "display.h"\r
+\r
+// logic\r
+#include "clock.h"\r
+#include "battery.h"\r
+#include "stopwatch.h"\r
+#include "alarm.h"\r
+#include "altitude.h"\r
+#include "display.h"\r
+#include "rfsimpliciti.h"\r
+#include "simpliciti.h"\r
+#include "acceleration.h"\r
+#include "bluerobin.h"\r
+#include "temperature.h"\r
+\r
+// *************************************************************************************************\r
+// Prototypes section\r
+void Timer0_Init(void);\r
+void Timer0_Stop(void);\r
+void Timer0_A1_Start(void);\r
+void Timer0_A1_Stop(void);\r
+void Timer0_A3_Start(u16 ticks);\r
+void Timer0_A3_Stop(void);\r
+void Timer0_A4_Delay(u16 ticks);\r
+\r
+void (*fptr_Timer0_A3_function)(void);\r
+\r
+// *************************************************************************************************\r
+// Defines section\r
+\r
+// *************************************************************************************************\r
+// Global Variable section\r
+struct timer sTimer;\r
+\r
+// *************************************************************************************************\r
+// Extern section\r
+extern void BRRX_TimerTask_v(void);\r
+extern void to_lpm(void);\r
+\r
+// *************************************************************************************************\r
+// @fn          Timer0_Init\r
+// @brief       Set Timer0 to a period of 1 or 2 sec. IRQ TACCR0 is asserted when timer overflows.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void Timer0_Init(void)\r
+{\r
+    // Set interrupt frequency to 1Hz\r
+    TA0CCR0 = 32768 - 1;\r
+\r
+    // Enable timer interrupt\r
+    TA0CCTL0 |= CCIE;\r
+\r
+    // Clear and start timer now\r
+    // Continuous mode: Count to 0xFFFF and restart from 0 again - 1sec timing will be generated by\r
+    // ISR\r
+    TA0CTL |= TASSEL0 + MC1 + TACLR;\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          Timer0_Start\r
+// @brief       Start Timer0.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void Timer0_Start(void)\r
+{\r
+    // Start Timer0 in continuous mode\r
+    TA0CTL |= MC_2;\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          Timer0_Stop\r
+// @brief       Stop and reset Timer0.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void Timer0_Stop(void)\r
+{\r
+    // Stop Timer0\r
+    TA0CTL &= ~MC_2;\r
+\r
+    // Set Timer0 count register to 0x0000\r
+    TA0R = 0;\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          Timer0_A3_Start\r
+// @brief       Trigger IRQ every "ticks" microseconds\r
+// @param       ticks (1 tick = 1/32768 sec)\r
+// @return      none\r
+// *************************************************************************************************\r
+void Timer0_A3_Start(u16 ticks)\r
+{\r
+    u16 value = 0;\r
+\r
+    // Store timer ticks in global variable\r
+    sTimer.timer0_A3_ticks = ticks;\r
+\r
+    // Delay based on current counter value\r
+    // To make sure this value is correctly read\r
+    while (value != TA0R)\r
+        value = TA0R;\r
+    value += ticks;\r
+\r
+    // Update CCR\r
+    TA0CCR3 = value;\r
+\r
+    // Reset IRQ flag\r
+    TA0CCTL3 &= ~CCIFG;\r
+\r
+    // Enable timer interrupt\r
+    TA0CCTL3 |= CCIE;\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          Timer0_A3_Stop\r
+// @brief       Stop Timer0_A3.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void Timer0_A3_Stop(void)\r
+{\r
+    // Clear timer interrupt\r
+    TA0CCTL3 &= ~CCIE;\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          Timer0_A4_Delay\r
+// @brief       Wait for some microseconds\r
+// @param       ticks (1 tick = 1/32768 sec)\r
+// @return      none\r
+// *************************************************************************************************\r
+void Timer0_A4_Delay(u16 ticks)\r
+{\r
+    u16 value = 0;\r
+\r
+    // Exit immediately if Timer0 not running - otherwise we'll get stuck here\r
+    if ((TA0CTL & (BIT4 | BIT5)) == 0)\r
+        return;\r
+\r
+    // Disable timer interrupt\r
+    TA0CCTL4 &= ~CCIE;\r
+\r
+    // Clear delay_over flag\r
+    sys.flag.delay_over = 0;\r
+\r
+    // Add delay to current timer value\r
+    // To make sure this value is correctly read\r
+    while (value != TA0R)\r
+        value = TA0R;\r
+    value += ticks;\r
+\r
+    // Update CCR\r
+    TA0CCR4 = value;\r
+\r
+    // Reset IRQ flag\r
+    TA0CCTL4 &= ~CCIFG;\r
+\r
+    // Enable timer interrupt\r
+    TA0CCTL4 |= CCIE;\r
+\r
+    // Wait for timer IRQ\r
+    while (1)\r
+    {\r
+        // Delay in LPM\r
+        to_lpm();               // will also set GIE again\r
+\r
+#ifdef USE_WATCHDOG\r
+        // Service watchdog\r
+        WDTCTL = WDTPW + WDTIS__512K + WDTSSEL__ACLK + WDTCNTCL;\r
+#endif\r
+        // Redraw stopwatch display\r
+        if (is_stopwatch())\r
+            display_stopwatch(LINE2, DISPLAY_LINE_UPDATE_PARTIAL);\r
+\r
+        // Check stop condition\r
+        // disable interrupt to prevent flag's change caused by interrupt methods\r
+        __disable_interrupt();\r
+        if (sys.flag.delay_over)\r
+            break;\r
+    }\r
+    __enable_interrupt();\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          TIMER0_A0_ISR\r
+// @brief       IRQ handler for TIMER0_A0 IRQ\r
+//                              Timer0_A0       1/1sec clock tick                       (serviced by\r
+// function TIMER0_A0_ISR)\r
+//                              Timer0_A1\r
+//                                                               (serviced by function\r
+// TIMER0_A1_5_ISR)\r
+//                              Timer0_A2       1/100 sec Stopwatch                     (serviced by\r
+// function TIMER0_A1_5_ISR)\r
+//                              Timer0_A3       Configurable periodic IRQ       (serviced by\r
+// function TIMER0_A1_5_ISR)\r
+//                              Timer0_A4       One-time delay                          (serviced by\r
+// function TIMER0_A1_5_ISR)\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+#pragma vector = TIMER0_A0_VECTOR\r
+__interrupt void TIMER0_A0_ISR(void)\r
+{\r
+    static u8 button_lock_counter = 0;\r
+\r
+    // Disable IE\r
+    TA0CCTL0 &= ~CCIE;\r
+    // Reset IRQ flag\r
+    TA0CCTL0 &= ~CCIFG;\r
+    // Add 1 sec to TACCR0 register (IRQ will be asserted at 0x7FFF and 0xFFFF = 1 sec intervals)\r
+    TA0CCR0 += 32768;\r
+    // Enable IE\r
+    TA0CCTL0 |= CCIE;\r
+\r
+    // Add 1 second to global time\r
+    clock_tick();\r
+\r
+    // Set clock update flag\r
+    display.flag.update_time = 1;\r
+\r
+    // While SimpliciTI stack operates or BlueRobin searches, freeze system state\r
+    if (is_rf() || is_bluerobin_searching())\r
+    {\r
+        // SimpliciTI automatic timeout\r
+        if (sRFsmpl.timeout == 0)\r
+        {\r
+            simpliciti_flag |= SIMPLICITI_TRIGGER_STOP;\r
+        }\r
+        else\r
+        {\r
+            sRFsmpl.timeout--;\r
+        }\r
+\r
+        // switch message after received packet\r
+        if (sRFsmpl.mode == SIMPLICITI_SYNC)\r
+        {\r
+            if (sRFsmpl.display_sync_done == 0)\r
+            {\r
+                display_chars(LCD_SEG_L2_5_0, (u8 *) "  SYNC", SEG_ON);\r
+            }\r
+            else\r
+            {\r
+                sRFsmpl.display_sync_done--;\r
+            }\r
+        }\r
+        // Exit from LPM3 on RETI\r
+        _BIC_SR_IRQ(LPM3_bits);\r
+        return;\r
+    }\r
+\r
+    // -------------------------------------------------------------------\r
+    // Service modules that require 1/min processing\r
+    if (sTime.drawFlag >= 2)\r
+    {\r
+        // Measure battery voltage to keep track of remaining battery life\r
+        request.flag.voltage_measurement = 1;\r
+\r
+        // Check if alarm needs to be turned on\r
+        check_alarm();\r
+    }\r
+\r
+    // -------------------------------------------------------------------\r
+    // Service active modules that require 1/s processing\r
+\r
+    // Generate alarm signal\r
+    if (sAlarm.state == ALARM_ON)\r
+    {\r
+        // Decrement alarm duration counter\r
+        if (sAlarm.duration-- > 0)\r
+        {\r
+            request.flag.buzzer = 1;\r
+        }\r
+        else\r
+        {\r
+            sAlarm.duration = ALARM_ON_DURATION;\r
+            stop_alarm();\r
+        }\r
+    }\r
+\r
+    // Do a temperature measurement each second while menu item is active\r
+    if (is_temp_measurement())\r
+        request.flag.temperature_measurement = 1;\r
+\r
+    // Do a pressure measurement each second while menu item is active\r
+    if (is_altitude_measurement())\r
+    {\r
+        // Countdown altitude measurement timeout while menu item is active\r
+        sAlt.timeout--;\r
+\r
+        // Stop measurement when timeout has elapsed\r
+        if (sAlt.timeout == 0)\r
+        {\r
+            stop_altitude_measurement();\r
+            // Show ---- m/ft\r
+            display_chars(LCD_SEG_L1_3_0, (u8 *) "----", SEG_ON);\r
+            // Clear up/down arrow\r
+            display_symbol(LCD_SYMB_ARROW_UP, SEG_OFF);\r
+            display_symbol(LCD_SYMB_ARROW_DOWN, SEG_OFF);\r
+        }\r
+\r
+        // In case we missed the IRQ due to debouncing, get data now\r
+        if ((PS_INT_IN & PS_INT_PIN) == PS_INT_PIN)\r
+            request.flag.altitude_measurement = 1;\r
+    }\r
+\r
+    // Count down timeout\r
+    if (is_acceleration_measurement())\r
+    {\r
+        // Countdown acceleration measurement timeout\r
+        sAccel.timeout--;\r
+\r
+        // Stop measurement when timeout has elapsed\r
+        if (sAccel.timeout == 0)\r
+        {\r
+            as_stop();\r
+            // Show ----\r
+            display_chars(LCD_SEG_L1_3_0, (u8 *) "----", SEG_ON);\r
+            // Clear up/down arrow\r
+            display_symbol(LCD_SYMB_ARROW_UP, SEG_OFF);\r
+            display_symbol(LCD_SYMB_ARROW_DOWN, SEG_OFF);\r
+            display_symbol(LCD_SEG_L1_DP1, SEG_OFF);\r
+        }\r
+\r
+        // If DRDY is (still) high, request data again\r
+        if ((AS_INT_IN & AS_INT_PIN) == AS_INT_PIN)\r
+            request.flag.acceleration_measurement = 1;\r
+    }\r
+\r
+    // If BlueRobin transmitter is connected, get data from API\r
+    if (is_bluerobin())\r
+        get_bluerobin_data();\r
+\r
+    // If battery is low, decrement display counter\r
+    if (sys.flag.low_battery)\r
+    {\r
+        if (sBatt.lobatt_display-- == 0)\r
+        {\r
+            message.flag.prepare = 1;\r
+            message.flag.type_lobatt = 1;\r
+            sBatt.lobatt_display = BATTERY_LOW_MESSAGE_CYCLE;\r
+        }\r
+    }\r
+\r
+    // If a message has to be displayed, set display flag\r
+    if (message.all_flags)\r
+    {\r
+        if (message.flag.prepare)\r
+        {\r
+            message.flag.prepare = 0;\r
+            message.flag.show = 1;\r
+        }\r
+        else if (message.flag.erase)    // message cycle is over, so erase it\r
+        {\r
+            message.flag.erase = 0;\r
+            display.flag.full_update = 1;\r
+        }\r
+    }\r
+\r
+    // -------------------------------------------------------------------\r
+    // Check idle timeout, set timeout flag\r
+    if (sys.flag.idle_timeout_enabled)\r
+    {\r
+        if (sTime.system_time - sTime.last_activity > INACTIVITY_TIME)\r
+            sys.flag.idle_timeout = 1;  //setFlag(sysFlag_g, SYS_TIMEOUT_IDLE);\r
+    }\r
+\r
+    // -------------------------------------------------------------------\r
+    // Turn the Backlight off after timeout\r
+    if (sButton.backlight_status == 1)\r
+    {\r
+        if (sButton.backlight_timeout > BACKLIGHT_TIME_ON)\r
+        {\r
+            //turn off Backlight\r
+            P2OUT &= ~BUTTON_BACKLIGHT_PIN;\r
+            P2DIR &= ~BUTTON_BACKLIGHT_PIN;\r
+            sButton.backlight_timeout = 0;\r
+            sButton.backlight_status = 0;\r
+        }\r
+        else\r
+        {\r
+            sButton.backlight_timeout++;\r
+        }\r
+    }\r
+\r
+    // -------------------------------------------------------------------\r
+    // Detect continuous button high states\r
+\r
+    // Trying to lock/unlock buttons?\r
+    if (BUTTON_NUM_IS_PRESSED && BUTTON_DOWN_IS_PRESSED)\r
+    {\r
+        if (button_lock_counter++ > LEFT_BUTTON_LONG_TIME)\r
+        {\r
+            // Toggle lock / unlock buttons flag\r
+            sys.flag.lock_buttons = ~sys.flag.lock_buttons;\r
+\r
+            // Show "buttons are locked/unlocked" message synchronously with next second tick\r
+            message.flag.prepare = 1;\r
+            if (sys.flag.lock_buttons)\r
+                message.flag.type_locked = 1;\r
+            else\r
+                message.flag.type_unlocked = 1;\r
+\r
+            // Reset button lock counter\r
+            button_lock_counter = 0;\r
+        }\r
+    }\r
+    else                        // Trying to create a long button press?\r
+    {\r
+        // Reset button lock counter\r
+        button_lock_counter = 0;\r
+\r
+        if (BUTTON_STAR_IS_PRESSED)\r
+        {\r
+            sButton.star_timeout++;\r
+\r
+            // Check if button was held low for some seconds\r
+            if (sButton.star_timeout > LEFT_BUTTON_LONG_TIME)\r
+            {\r
+                button.flag.star_long = 1;\r
+                button.flag.star_not_long = 0;\r
+                sButton.star_timeout = 0;\r
+                // Return interrupt edge to normal value\r
+                BUTTONS_IES &= ~BUTTON_STAR_PIN;\r
+            }\r
+        }\r
+        else                    // there was a button press not long enough\r
+        {\r
+            sButton.star_timeout = 0;\r
+        }\r
+\r
+        if (BUTTON_NUM_IS_PRESSED)\r
+        {\r
+            sButton.num_timeout++;\r
+\r
+            // Check if button was held low for some seconds\r
+            if (sButton.num_timeout > LEFT_BUTTON_LONG_TIME)\r
+            {\r
+                button.flag.num_long = 1;\r
+                button.flag.num_not_long = 0;\r
+                sButton.num_timeout = 0;\r
+                // Return interrupt edge to normal value\r
+                BUTTONS_IES &= ~BUTTON_NUM_PIN;\r
+            }\r
+        }\r
+        else                    // there was a button press not long enough\r
+        {\r
+            sButton.num_timeout = 0;\r
+        }\r
+    }\r
+\r
+    // Exit from LPM3 on RETI\r
+    _BIC_SR_IRQ(LPM3_bits);\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          Timer0_A1_5_ISR\r
+// @brief       IRQ handler for timer IRQ.\r
+//                              Timer0_A0       1/1sec clock tick (serviced by function\r
+// TIMER0_A0_ISR)\r
+//                              Timer0_A1       BlueRobin timer\r
+//                              Timer0_A2       1/100 sec Stopwatch\r
+//                              Timer0_A3       Configurable periodic IRQ (used by button_repeat and\r
+// buzzer)\r
+//                              Timer0_A4       One-time delay\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+#pragma vector = TIMER0_A1_VECTOR\r
+__interrupt void TIMER0_A1_5_ISR(void)\r
+{\r
+    u16 value = 0;\r
+\r
+    switch (TA0IV)\r
+    {\r
+        // Timer0_A1    BlueRobin timer\r
+        case 0x02:             // Timer0_A1 handler\r
+            BRRX_TimerTask_v();\r
+            break;\r
+\r
+        // Timer0_A2    1/1 or 1/100 sec Stopwatch\r
+        case 0x04:             // Timer0_A2 handler\r
+            // Disable IE\r
+            TA0CCTL2 &= ~CCIE;\r
+            // Reset IRQ flag\r
+            TA0CCTL2 &= ~CCIFG;\r
+            // Load CCR register with next capture point\r
+            update_stopwatch_timer();\r
+            // Enable timer interrupt\r
+            TA0CCTL2 |= CCIE;\r
+            // Increase stopwatch counter\r
+            stopwatch_tick();\r
+            break;\r
+\r
+        // Timer0_A3    Configurable periodic IRQ (used by button_repeat and buzzer)\r
+        case 0x06:             // Disable IE\r
+            TA0CCTL3 &= ~CCIE;\r
+            // Reset IRQ flag\r
+            TA0CCTL3 &= ~CCIFG;\r
+            // Store new value in CCR\r
+            // To make sure this value is correctly read\r
+            while (value != TA0R)\r
+                value = TA0R;\r
+            value += sTimer.timer0_A3_ticks;\r
+            // Load CCR register with next capture point\r
+            TA0CCR3 = value;\r
+            // Enable timer interrupt\r
+            TA0CCTL3 |= CCIE;\r
+            // Call function handler\r
+            fptr_Timer0_A3_function();\r
+            break;\r
+\r
+        // Timer0_A4    One-time delay\r
+        case 0x08:             // Disable IE\r
+            TA0CCTL4 &= ~CCIE;\r
+            // Reset IRQ flag\r
+            TA0CCTL4 &= ~CCIFG;\r
+            // Set delay over flag\r
+            sys.flag.delay_over = 1;\r
+            break;\r
+    }\r
+\r
+    // Exit from LPM3 on RETI\r
+    _BIC_SR_IRQ(LPM3_bits);\r
+}\r
+\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/driver/timer.h b/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/driver/timer.h
new file mode 100755 (executable)
index 0000000..89e0e53
--- /dev/null
@@ -0,0 +1,71 @@
+// *************************************************************************************************\r
+//\r
+//      Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//        Redistribution and use in source and binary forms, with or without\r
+//        modification, are permitted provided that the following conditions\r
+//        are met:\r
+//\r
+//          Redistributions of source code must retain the above copyright\r
+//          notice, this list of conditions and the following disclaimer.\r
+//\r
+//          Redistributions in binary form must reproduce the above copyright\r
+//          notice, this list of conditions and the following disclaimer in the\r
+//          documentation and/or other materials provided with the\r
+//          distribution.\r
+//\r
+//          Neither the name of Texas Instruments Incorporated nor the names of\r
+//          its contributors may be used to endorse or promote products derived\r
+//          from this software without specific prior written permission.\r
+//\r
+//        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+\r
+#ifndef TIMER_H_\r
+#define TIMER_H_\r
+\r
+// *************************************************************************************************\r
+// Include section\r
+\r
+// *************************************************************************************************\r
+// Prototypes section\r
+extern void Timer0_Init(void);\r
+extern void Timer0_Start(void);\r
+extern void Timer0_Stop(void);\r
+extern void Timer0_A3_Start(u16 ticks);\r
+extern void Timer0_A3_Stop(void);\r
+extern void Timer0_A4_Delay(u16 ticks);\r
+\r
+extern void (*fptr_Timer0_A3_function)(void);\r
+\r
+// *************************************************************************************************\r
+// Defines section\r
+struct timer\r
+{\r
+    // Timer0_A3 periodic delay\r
+    u16 timer0_A3_ticks;\r
+};\r
+extern struct timer sTimer;\r
+\r
+// Trigger reset when all buttons are pressed\r
+#define BUTTON_RESET_SEC                (3u)\r
+\r
+// *************************************************************************************************\r
+// Global Variable section\r
+\r
+// *************************************************************************************************\r
+// Extern section\r
+\r
+#endif                          /*TIMER_H_ */\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/driver/vti_as.c b/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/driver/vti_as.c
new file mode 100755 (executable)
index 0000000..bede10d
--- /dev/null
@@ -0,0 +1,360 @@
+// *************************************************************************************************\r
+//\r
+//      Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//        Redistribution and use in source and binary forms, with or without\r
+//        modification, are permitted provided that the following conditions\r
+//        are met:\r
+//\r
+//          Redistributions of source code must retain the above copyright\r
+//          notice, this list of conditions and the following disclaimer.\r
+//\r
+//          Redistributions in binary form must reproduce the above copyright\r
+//          notice, this list of conditions and the following disclaimer in the\r
+//          documentation and/or other materials provided with the\r
+//          distribution.\r
+//\r
+//          Neither the name of Texas Instruments Incorporated nor the names of\r
+//          its contributors may be used to endorse or promote products derived\r
+//          from this software without specific prior written permission.\r
+//\r
+//        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+// VTI CMA3000-D0x acceleration sensor driver functions\r
+// *************************************************************************************************\r
+\r
+// *************************************************************************************************\r
+// Include section\r
+\r
+// system\r
+#include "project.h"\r
+\r
+// logic\r
+#include "simpliciti.h"\r
+\r
+// driver\r
+#include "vti_as.h"\r
+#include "timer.h"\r
+#include "display.h"\r
+\r
+// *************************************************************************************************\r
+// Prototypes section\r
+void as_start(void);\r
+void as_stop(void);\r
+u8 as_read_register(u8 bAddress);\r
+u8 as_write_register(u8 bAddress, u8 bData);\r
+\r
+// *************************************************************************************************\r
+// Defines section\r
+\r
+// =================================================================================================\r
+// CMA3000-D0x acceleration sensor configuration\r
+// =================================================================================================\r
+// DCO frequency division factor determining speed of the acceleration sensor SPI interface\r
+// Speed in Hz = 12MHz / AS_BR_DIVIDER (max. 500kHz)\r
+#define AS_BR_DIVIDER        (30u)\r
+\r
+// Acceleration measurement range in g\r
+// Valid ranges are: 2 and 8\r
+#define AS_RANGE             (2u)\r
+\r
+// Sample rate for acceleration values in Hz\r
+// Valid sample rates for 2g range are:     100, 400\r
+// Valid sample rates for 8g range are: 40, 100, 400\r
+#define AS_SAMPLE_RATE       (100u)\r
+\r
+// *************************************************************************************************\r
+// Global Variable section\r
+\r
+// Global flag for proper acceleration sensor operation\r
+u8 as_ok;\r
+\r
+// *************************************************************************************************\r
+// Extern section\r
+\r
+// *************************************************************************************************\r
+// @fn          as_init\r
+// @brief       Setup acceleration sensor connection, do not power up yet\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void as_init(void)\r
+{\r
+#ifdef AS_DISCONNECT\r
+    // Deactivate connection to acceleration sensor\r
+    AS_PWR_OUT &= ~AS_PWR_PIN;                             // Power off\r
+    AS_INT_OUT &= ~AS_INT_PIN;                             // Pin to low to avoid floating pins\r
+    AS_SPI_OUT &= ~(AS_SDO_PIN + AS_SDI_PIN + AS_SCK_PIN); // Pin to low to avoid floating pins\r
+    AS_CSN_OUT &= ~AS_CSN_PIN;                             // Pin to low to avoid floating pins\r
+    AS_INT_DIR |= AS_INT_PIN;                              // Pin to output to avoid floating pins\r
+    AS_SPI_DIR |= AS_SDO_PIN + AS_SDI_PIN + AS_SCK_PIN;    // Pin to output to avoid floating pins\r
+    AS_CSN_DIR |= AS_CSN_PIN;                              // Pin to output to avoid floating pins\r
+    AS_PWR_DIR |= AS_PWR_PIN;                              // Power pin to output direction\r
+#else\r
+    AS_INT_DIR &= ~AS_INT_PIN;                             // Input\r
+    AS_SPI_DIR &= ~AS_SDI_PIN;                             // Input\r
+    AS_SPI_DIR |= AS_SDO_PIN + AS_SCK_PIN;                 // Output\r
+    AS_SPI_SEL |= AS_SDO_PIN + AS_SDI_PIN + AS_SCK_PIN;    // Port pins to SDO, SDI and SCK function\r
+    AS_CSN_OUT |= AS_CSN_PIN;                              // CSN=1\r
+    AS_CSN_DIR |= AS_CSN_PIN;                              //\r
+    AS_PWR_OUT |= AS_PWR_PIN;                              // VDD=1\r
+    AS_PWR_DIR |= AS_PWR_PIN;                              //\r
+#endif\r
+\r
+    // Reset global sensor flag\r
+    as_ok = 1;\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          as_start\r
+// @brief       Power-up and initialize acceleration sensor\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void as_start(void)\r
+{\r
+    volatile u16 Counter_u16;\r
+    u8 bConfig;                                         //, bStatus;\r
+\r
+    // Initialize SPI interface to acceleration sensor\r
+    AS_SPI_CTL0 |= UCSYNC | UCMST | UCMSB               // SPI master, 8 data bits,  MSB first,\r
+        | UCCKPH;                                       //  clock idle low, data output on falling\r
+                                                        // edge\r
+    AS_SPI_CTL1 |= UCSSEL1;                             // SMCLK as clock source\r
+    AS_SPI_BR0 = AS_BR_DIVIDER;                         // Low byte of division factor for baud rate\r
+    AS_SPI_BR1 = 0x00;                                  // High byte of division factor for baud\r
+                                                        // rate\r
+    AS_SPI_CTL1 &= ~UCSWRST;                            // Start SPI hardware\r
+\r
+    // Initialize interrupt pin for data read out from acceleration sensor\r
+    AS_INT_IES &= ~AS_INT_PIN;                          // Interrupt on rising edge\r
+\r
+#ifdef AS_DISCONNECT\r
+    // Enable interrupt\r
+    AS_INT_DIR &= ~AS_INT_PIN;                          // Switch INT pin to input\r
+    AS_SPI_DIR &= ~AS_SDI_PIN;                          // Switch SDI pin to input\r
+    AS_SPI_REN |= AS_SDI_PIN;                           // Pulldown on SDI pin\r
+    AS_SPI_SEL |= AS_SDO_PIN + AS_SDI_PIN + AS_SCK_PIN; // Port pins to SDO, SDI and SCK function\r
+    AS_CSN_OUT |= AS_CSN_PIN;                           // Deselect acceleration sensor\r
+    AS_PWR_OUT |= AS_PWR_PIN;                           // Power on active high\r
+#endif\r
+\r
+    // Delay of >5ms required between switching on power and configuring sensor\r
+    Timer0_A4_Delay(CONV_MS_TO_TICKS(10));\r
+\r
+    // Initialize interrupt pin for data read out from acceleration sensor\r
+    AS_INT_IFG &= ~AS_INT_PIN;                          // Reset flag\r
+    AS_INT_IE |= AS_INT_PIN;                            // Enable interrupt\r
+\r
+    // Configure sensor and start to sample data\r
+#if (AS_RANGE == 2)\r
+    bConfig = 0x80;\r
+#    if (AS_SAMPLE_RATE == 100)\r
+    bConfig |= 0x02;\r
+#    elif (AS_SAMPLE_RATE == 400)\r
+    bConfig |= 0x04;\r
+#    else\r
+#        error "Sample rate not supported"\r
+#    endif\r
+#elif (AS_RANGE == 8)\r
+    bConfig = 0x00;\r
+#    if (AS_SAMPLE_RATE == 40)\r
+    bConfig |= 0x06;\r
+#    elif (AS_SAMPLE_RATE == 100)\r
+    bConfig |= 0x02;\r
+#    elif (AS_SAMPLE_RATE == 400)\r
+    bConfig |= 0x04;\r
+#    else\r
+#        error "Sample rate not supported"\r
+#    endif\r
+#else\r
+#    error "Measurement range not supported"\r
+#endif\r
+\r
+    // Reset sensor\r
+    as_write_register(0x04, 0x02);\r
+    as_write_register(0x04, 0x0A);\r
+    as_write_register(0x04, 0x04);\r
+\r
+    // Wait 5 ms before starting sensor output\r
+    Timer0_A4_Delay(CONV_MS_TO_TICKS(5));\r
+\r
+    // Set 2g measurement range, start to output data with 100Hz rate\r
+    as_write_register(0x02, bConfig);\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          as_stop\r
+// @brief       Power down acceleration sensor\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void as_stop(void)\r
+{\r
+    // Disable interrupt\r
+    AS_INT_IE &= ~AS_INT_PIN;                              // Disable interrupt\r
+\r
+#ifdef AS_DISCONNECT\r
+    // Power-down sensor\r
+    AS_PWR_OUT &= ~AS_PWR_PIN;                             // Power off\r
+    AS_INT_OUT &= ~AS_INT_PIN;                             // Pin to low to avoid floating pins\r
+    AS_SPI_OUT &= ~(AS_SDO_PIN + AS_SDI_PIN + AS_SCK_PIN); // Pins to low to avoid floating pins\r
+    AS_SPI_SEL &= ~(AS_SDO_PIN + AS_SDI_PIN + AS_SCK_PIN); // Port pins to I/O function\r
+    AS_CSN_OUT &= ~AS_CSN_PIN;                             // Pin to low to avoid floating pins\r
+    AS_INT_DIR |= AS_INT_PIN;                              // Pin to output to avoid floating pins\r
+    AS_SPI_DIR |= AS_SDO_PIN + AS_SDI_PIN + AS_SCK_PIN;    // Pins to output to avoid floating pins\r
+    AS_CSN_DIR |= AS_CSN_PIN;                              // Pin to output to avoid floating pins\r
+#else\r
+    // Reset sensor -> sensor to powerdown\r
+    as_write_register(0x04, 0x02);\r
+    as_write_register(0x04, 0x0A);\r
+    as_write_register(0x04, 0x04);\r
+#endif\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          as_read_register\r
+// @brief       Read a byte from the acceleration sensor\r
+// @param       u8 bAddress                     Register address\r
+// @return      u8 bResult                      Register content\r
+//                                                                      If the returned value is 0,\r
+// there was an error.\r
+// *************************************************************************************************\r
+u8 as_read_register(u8 bAddress)\r
+{\r
+    u8 bResult;\r
+    u16 timeout;\r
+\r
+    // Exit function if an error was detected previously\r
+    if (!as_ok)\r
+        return (0);\r
+\r
+    bAddress <<= 2;                                         // Address to be shifted left by 2 and\r
+                                                            // RW bit to be reset\r
+\r
+    AS_SPI_REN &= ~AS_SDI_PIN;                              // Pulldown on SDI pin not required\r
+    AS_CSN_OUT &= ~AS_CSN_PIN;                              // Select acceleration sensor\r
+\r
+    bResult = AS_RX_BUFFER;                                 // Read RX buffer just to clear\r
+                                                            // interrupt flag\r
+\r
+    AS_TX_BUFFER = bAddress;                                // Write address to TX buffer\r
+\r
+    timeout = SPI_TIMEOUT;\r
+    while (!(AS_IRQ_REG & AS_RX_IFG) && (--timeout > 0)) ;  // Wait until new data was written into\r
+                                                            // RX buffer\r
+    if (timeout == 0)\r
+    {\r
+        as_ok = 0;\r
+        return (0);\r
+    }\r
+    bResult = AS_RX_BUFFER;                                 // Read RX buffer just to clear\r
+                                                            // interrupt flag\r
+\r
+    AS_TX_BUFFER = 0;                                       // Write dummy data to TX buffer\r
+\r
+    timeout = SPI_TIMEOUT;\r
+    while (!(AS_IRQ_REG & AS_RX_IFG) && (--timeout > 0)) ;  // Wait until new data was written into\r
+                                                            // RX buffer\r
+    if (timeout == 0)\r
+    {\r
+        as_ok = 0;\r
+        return (0);\r
+    }\r
+    bResult = AS_RX_BUFFER;                                 // Read RX buffer\r
+\r
+    AS_CSN_OUT |= AS_CSN_PIN;                               // Deselect acceleration sensor\r
+    AS_SPI_REN |= AS_SDI_PIN;                               // Pulldown on SDI pin required again\r
+\r
+    // Return new data from RX buffer\r
+    return bResult;\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          as_write_register\r
+// @brief               Write a byte to the acceleration sensor\r
+// @param       u8 bAddress                     Register address\r
+//                              u8 bData                        Data to write\r
+// @return      u8 0 or bResult         Register content.\r
+//                                                                      If the returned value is 0,\r
+// there was an error.\r
+// *************************************************************************************************\r
+u8 as_write_register(u8 bAddress, u8 bData)\r
+{\r
+    u8 bResult;\r
+    u16 timeout;\r
+\r
+    // Exit function if an error was detected previously\r
+    if (!as_ok)\r
+        return (0);\r
+\r
+    bAddress <<= 2;                                         // Address to be shifted left by 1\r
+    bAddress |= BIT1;                                       // RW bit to be set\r
+\r
+    AS_SPI_REN &= ~AS_SDI_PIN;                              // Pulldown on SDI pin not required\r
+    AS_CSN_OUT &= ~AS_CSN_PIN;                              // Select acceleration sensor\r
+\r
+    bResult = AS_RX_BUFFER;                                 // Read RX buffer just to clear\r
+                                                            // interrupt flag\r
+\r
+    AS_TX_BUFFER = bAddress;                                // Write address to TX buffer\r
+\r
+    timeout = SPI_TIMEOUT;\r
+    while (!(AS_IRQ_REG & AS_RX_IFG) && (--timeout > 0)) ;  // Wait until new data was written into\r
+                                                            // RX buffer\r
+    if (timeout == 0)\r
+    {\r
+        as_ok = 0;\r
+        return (0);\r
+    }\r
+    bResult = AS_RX_BUFFER;                                 // Read RX buffer just to clear\r
+                                                            // interrupt flag\r
+\r
+    AS_TX_BUFFER = bData;                                   // Write data to TX buffer\r
+\r
+    timeout = SPI_TIMEOUT;\r
+    while (!(AS_IRQ_REG & AS_RX_IFG) && (--timeout > 0)) ;  // Wait until new data was written into\r
+                                                            // RX buffer\r
+    if (timeout == 0)\r
+    {\r
+        as_ok = 0;\r
+        return (0);\r
+    }\r
+    bResult = AS_RX_BUFFER;                                 // Read RX buffer\r
+\r
+    AS_CSN_OUT |= AS_CSN_PIN;                               // Deselect acceleration sensor\r
+    AS_SPI_REN |= AS_SDI_PIN;                               // Pulldown on SDI pin required again\r
+\r
+    return bResult;\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          as_get_data\r
+// @brief       Service routine to read acceleration values.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void as_get_data(u8 * data)\r
+{\r
+    // Exit if sensor is not powered up\r
+    if ((AS_PWR_OUT & AS_PWR_PIN) != AS_PWR_PIN)\r
+        return;\r
+\r
+    // Store X/Y/Z acceleration data in buffer\r
+    *(data + 0) = as_read_register(0x06);\r
+    *(data + 1) = as_read_register(0x07);\r
+    *(data + 2) = as_read_register(0x08);\r
+}\r
+\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/driver/vti_as.h b/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/driver/vti_as.h
new file mode 100755 (executable)
index 0000000..358a948
--- /dev/null
@@ -0,0 +1,106 @@
+// *************************************************************************************************\r
+//\r
+//      Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//        Redistribution and use in source and binary forms, with or without\r
+//        modification, are permitted provided that the following conditions\r
+//        are met:\r
+//\r
+//          Redistributions of source code must retain the above copyright\r
+//          notice, this list of conditions and the following disclaimer.\r
+//\r
+//          Redistributions in binary form must reproduce the above copyright\r
+//          notice, this list of conditions and the following disclaimer in the\r
+//          documentation and/or other materials provided with the\r
+//          distribution.\r
+//\r
+//          Neither the name of Texas Instruments Incorporated nor the names of\r
+//          its contributors may be used to endorse or promote products derived\r
+//          from this software without specific prior written permission.\r
+//\r
+//        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+\r
+#ifndef VTI_AS_H_\r
+#define VTI_AS_H_\r
+\r
+// *************************************************************************************************\r
+// Include section\r
+\r
+// *************************************************************************************************\r
+// Prototypes section\r
+extern void as_init(void);\r
+extern void as_start(void);\r
+extern void as_stop(void);\r
+extern u8 as_read_register(u8 bAddress);\r
+extern u8 as_write_register(u8 bAddress, u8 bData);\r
+extern void as_get_data(u8 * data);\r
+\r
+// *************************************************************************************************\r
+// Defines section\r
+\r
+// Disconnect power supply for acceleration sensor when not used\r
+#define AS_DISCONNECT\r
+\r
+// Port and pin resource for SPI interface to acceleration sensor\r
+// SDO=MOSI=P1.6, SDI=MISO=P1.5, SCK=P1.7\r
+#define AS_SPI_IN            (P1IN)\r
+#define AS_SPI_OUT           (P1OUT)\r
+#define AS_SPI_DIR           (P1DIR)\r
+#define AS_SPI_SEL           (P1SEL)\r
+#define AS_SPI_REN           (P1REN)\r
+#define AS_SDO_PIN           (BIT6)\r
+#define AS_SDI_PIN           (BIT5)\r
+#define AS_SCK_PIN           (BIT7)\r
+\r
+// CSN=PJ.1\r
+#define AS_CSN_OUT                       (PJOUT)\r
+#define AS_CSN_DIR                       (PJDIR)\r
+#define AS_CSN_PIN           (BIT1)\r
+\r
+#define AS_TX_BUFFER         (UCA0TXBUF)\r
+#define AS_RX_BUFFER         (UCA0RXBUF)\r
+#define AS_TX_IFG            (UCTXIFG)\r
+#define AS_RX_IFG            (UCRXIFG)\r
+#define AS_IRQ_REG           (UCA0IFG)\r
+#define AS_SPI_CTL0          (UCA0CTL0)\r
+#define AS_SPI_CTL1          (UCA0CTL1)\r
+#define AS_SPI_BR0           (UCA0BR0)\r
+#define AS_SPI_BR1           (UCA0BR1)\r
+\r
+// Port and pin resource for power-up of acceleration sensor, VDD=PJ.0\r
+#define AS_PWR_OUT           (PJOUT)\r
+#define AS_PWR_DIR           (PJDIR)\r
+#define AS_PWR_PIN           (BIT0)\r
+\r
+// Port, pin and interrupt resource for interrupt from acceleration sensor, CMA_INT=P2.5\r
+#define AS_INT_IN            (P2IN)\r
+#define AS_INT_OUT           (P2OUT)\r
+#define AS_INT_DIR           (P2DIR)\r
+#define AS_INT_IE            (P2IE)\r
+#define AS_INT_IES           (P2IES)\r
+#define AS_INT_IFG           (P2IFG)\r
+#define AS_INT_PIN           (BIT5)\r
+\r
+// SPI timeout to detect sensor failure\r
+#define SPI_TIMEOUT                      (1000u)\r
+\r
+// *************************************************************************************************\r
+// Global Variable section\r
+\r
+// *************************************************************************************************\r
+// Extern section\r
+\r
+#endif                          /*VTI_AS_H_ */\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/driver/vti_ps.c b/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/driver/vti_ps.c
new file mode 100755 (executable)
index 0000000..645f17e
--- /dev/null
@@ -0,0 +1,559 @@
+// *************************************************************************************************\r
+//\r
+//      Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//        Redistribution and use in source and binary forms, with or without\r
+//        modification, are permitted provided that the following conditions\r
+//        are met:\r
+//\r
+//          Redistributions of source code must retain the above copyright\r
+//          notice, this list of conditions and the following disclaimer.\r
+//\r
+//          Redistributions in binary form must reproduce the above copyright\r
+//          notice, this list of conditions and the following disclaimer in the\r
+//          documentation and/or other materials provided with the\r
+//          distribution.\r
+//\r
+//          Neither the name of Texas Instruments Incorporated nor the names of\r
+//          its contributors may be used to endorse or promote products derived\r
+//          from this software without specific prior written permission.\r
+//\r
+//        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+// VTI SCP1000-D0x pressure sensor driver functions\r
+// *************************************************************************************************\r
+\r
+// *************************************************************************************************\r
+// Include section\r
+\r
+// system\r
+#include "project.h"\r
+\r
+// driver\r
+#include "vti_ps.h"\r
+#include "timer.h"\r
+\r
+// *************************************************************************************************\r
+// Prototypes section\r
+u16 ps_read_register(u8 address, u8 mode);\r
+u8 ps_write_register(u8 address, u8 data);\r
+u8 ps_twi_read(u8 ack);\r
+void twi_delay(void);\r
+\r
+// *************************************************************************************************\r
+// Defines section\r
+\r
+// *************************************************************************************************\r
+// Global Variable section\r
+\r
+// VTI pressure (hPa) to altitude (m) conversion tables\r
+const s16 h0[17] =\r
+{ -153, 0, 111, 540, 989, 1457, 1949, 2466, 3012, 3591, 4206, 4865, 5574, 6344, 7185, 8117, 9164 };\r
+const u16 p0[17] =\r
+{ 1031, 1013, 1000, 950, 900, 850, 800, 750, 700, 650, 600, 550, 500, 450, 400, 350, 300 };\r
+\r
+float p[17];\r
+\r
+// Global flag for proper pressure sensor operation\r
+u8 ps_ok;\r
+\r
+// *************************************************************************************************\r
+// Extern section\r
+\r
+// *************************************************************************************************\r
+// @fn          ps_init\r
+// @brief       Init pressure sensor I/O\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void ps_init(void)\r
+{\r
+    volatile u8 success, status, eeprom, timeout;\r
+\r
+    PS_INT_DIR &= ~PS_INT_PIN;             // DRDY is input\r
+    PS_INT_IES &= ~PS_INT_PIN;             // Interrupt on DRDY rising edge\r
+    PS_TWI_OUT |= PS_SCL_PIN + PS_SDA_PIN; // SCL and SDA are outputs by default\r
+    PS_TWI_DIR |= PS_SCL_PIN + PS_SDA_PIN; // SCL and SDA are outputs by default\r
+\r
+    // Reset global ps_ok flag\r
+    ps_ok = 0;\r
+\r
+    // 100msec delay to allow VDD stabilisation\r
+    Timer0_A4_Delay(CONV_MS_TO_TICKS(100));\r
+\r
+    // Reset pressure sensor -> powerdown sensor\r
+    success = ps_write_register(0x06, 0x01);\r
+\r
+    // 100msec delay\r
+    Timer0_A4_Delay(CONV_MS_TO_TICKS(100));\r
+\r
+    // Check if STATUS register BIT0 is cleared\r
+    status = ps_read_register(0x07, PS_TWI_8BIT_ACCESS);\r
+    if (((status & BIT0) == 0) && (status != 0))\r
+    {\r
+        // Check EEPROM checksum in DATARD8 register\r
+        eeprom = ps_read_register(0x7F, PS_TWI_8BIT_ACCESS);\r
+        if (eeprom == 0x01)\r
+            ps_ok = 1;\r
+        else\r
+            ps_ok = 0;\r
+    }\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          ps_start\r
+// @brief       Init pressure sensor registers and start sampling\r
+// @param       none\r
+// @return      u8              1=Sensor started, 0=Sensor did not start\r
+// *************************************************************************************************\r
+void ps_start(void)\r
+{\r
+    // Start sampling data in ultra low power mode\r
+    ps_write_register(0x03, 0x0B);\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          ps_stop\r
+// @brief       Power down pressure sensor\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void ps_stop(void)\r
+{\r
+    // Put sensor to standby\r
+    ps_write_register(0x03, 0x00);\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          ps_twi_sda\r
+// @brief       Control SDA line\r
+// @param       u8 condition            PS_TWI_SEND_START, PS_TWI_SEND_RESTART, PS_TWI_SEND_STOP\r
+//                                                                      PS_TWI_CHECK_ACK\r
+// @return      u8                                      1=ACK, 0=NACK\r
+// *************************************************************************************************\r
+u8 ps_twi_sda(u8 condition)\r
+{\r
+    u8 sda = 0;\r
+\r
+    if (condition == PS_TWI_SEND_START)\r
+    {\r
+        PS_TWI_SDA_OUT;         // SDA is output\r
+        PS_TWI_SCL_HI;\r
+        twi_delay();\r
+        PS_TWI_SDA_LO;\r
+        twi_delay();\r
+        PS_TWI_SCL_LO;          // SCL 1-0 transition while SDA=0\r
+        twi_delay();\r
+    }\r
+    else if (condition == PS_TWI_SEND_RESTART)\r
+    {\r
+        PS_TWI_SDA_OUT;         // SDA is output\r
+        PS_TWI_SCL_LO;\r
+        PS_TWI_SDA_HI;\r
+        twi_delay();\r
+        PS_TWI_SCL_HI;\r
+        twi_delay();\r
+        PS_TWI_SDA_LO;\r
+        twi_delay();\r
+        PS_TWI_SCL_LO;\r
+        twi_delay();\r
+    }\r
+    else if (condition == PS_TWI_SEND_STOP)\r
+    {\r
+        PS_TWI_SDA_OUT;         // SDA is output\r
+        PS_TWI_SDA_LO;\r
+        twi_delay();\r
+        PS_TWI_SCL_LO;\r
+        twi_delay();\r
+        PS_TWI_SCL_HI;\r
+        twi_delay();\r
+        PS_TWI_SDA_HI;          // SDA 0-1 transition while SCL=1\r
+        twi_delay();\r
+    }\r
+    else if (condition == PS_TWI_CHECK_ACK)\r
+    {\r
+        PS_TWI_SDA_IN;          // SDA is input\r
+        PS_TWI_SCL_LO;\r
+        twi_delay();\r
+        PS_TWI_SCL_HI;\r
+        twi_delay();\r
+        sda = PS_TWI_IN & PS_SDA_PIN;\r
+        PS_TWI_SCL_LO;\r
+    }\r
+\r
+    // Return value will only be evaluated when checking device ACK\r
+    return (sda == 0);\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          twi_delay\r
+// @brief       Delay between TWI signal edges.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void twi_delay(void)\r
+{\r
+    asm ("     nop");\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          ps_twi_write\r
+// @brief       Clock out bits through SDA.\r
+// @param       u8 data         Byte to send\r
+// @return      none\r
+// *************************************************************************************************\r
+void ps_twi_write(u8 data)\r
+{\r
+    u8 i, mask;\r
+\r
+    // Set mask byte to 10000000b\r
+    mask = BIT0 << 7;\r
+\r
+    PS_TWI_SDA_OUT;             // SDA is output\r
+\r
+    for (i = 8; i > 0; i--)\r
+    {\r
+        PS_TWI_SCL_LO;          // SCL=0\r
+        if ((data & mask) == mask)\r
+        {\r
+            PS_TWI_SDA_HI;      // SDA=1\r
+        }\r
+        else\r
+        {\r
+            PS_TWI_SDA_LO;      // SDA=0\r
+        }\r
+        mask = mask >> 1;\r
+        twi_delay();\r
+        PS_TWI_SCL_HI;          // SCL=1\r
+        twi_delay();\r
+    }\r
+\r
+    PS_TWI_SCL_LO;              // SCL=0\r
+    PS_TWI_SDA_IN;              // SDA is input\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          ps_twi_read\r
+// @brief       Read bits from SDA\r
+// @param       u8 ack          1=Send ACK after read, 0=Send NACK after read\r
+// @return      u8                      Bits read\r
+// *************************************************************************************************\r
+u8 ps_twi_read(u8 ack)\r
+{\r
+    u8 i;\r
+    u8 data = 0;\r
+\r
+    PS_TWI_SDA_IN;              // SDA is input\r
+\r
+    for (i = 0; i < 8; i++)\r
+    {\r
+        PS_TWI_SCL_LO;          // SCL=0\r
+        twi_delay();\r
+        PS_TWI_SCL_HI;          // SCL=0\r
+        twi_delay();\r
+\r
+        // Shift captured bits to left\r
+        data = data << 1;\r
+\r
+        // Capture new bit\r
+        if ((PS_TWI_IN & PS_SDA_PIN) == PS_SDA_PIN)\r
+            data |= BIT0;\r
+    }\r
+\r
+    PS_TWI_SDA_OUT;             // SDA is output\r
+\r
+    // 1 aditional clock phase to generate master ACK\r
+    PS_TWI_SCL_LO;              // SCL=0\r
+    if (ack == 1)\r
+        PS_TWI_SDA_LO           // Send ack -> continue read\r
+        else\r
+            PS_TWI_SDA_HI       // Send nack -> stop read\r
+            twi_delay();\r
+    PS_TWI_SCL_HI;              // SCL=0\r
+    twi_delay();\r
+    PS_TWI_SCL_LO;\r
+\r
+    return (data);\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          as_write_register\r
+// @brief               Write a byte to the pressure sensor\r
+// @param       u8 address                      Register address\r
+//                              u8 data                 Data to write\r
+// @return      u8\r
+// *************************************************************************************************\r
+u8 ps_write_register(u8 address, u8 data)\r
+{\r
+    volatile u8 success;\r
+\r
+    ps_twi_sda(PS_TWI_SEND_START);            // Generate start condition\r
+\r
+    ps_twi_write((0x11 << 1) | PS_TWI_WRITE); // Send 7bit device address 0x11 + write bit '0'\r
+    success = ps_twi_sda(PS_TWI_CHECK_ACK);   // Check ACK from device\r
+    if (!success)\r
+        return (0);\r
+\r
+    ps_twi_write(address);                    // Send 8bit register address\r
+    success = ps_twi_sda(PS_TWI_CHECK_ACK);   // Check ACK from device\r
+    if (!success)\r
+        return (0);\r
+\r
+    ps_twi_write(data);                       // Send 8bit data to register\r
+    success = ps_twi_sda(PS_TWI_CHECK_ACK);   // Check ACK from device\r
+    // Slave does not send this ACK\r
+    // if (!success) return (0);\r
+\r
+    ps_twi_sda(PS_TWI_SEND_STOP);             // Generate stop condition\r
+\r
+    return (1);\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          ps_read_register\r
+// @brief       Read a byte from the pressure sensor\r
+// @param       u8 address              Register address\r
+//                              u8      mode            PS_TWI_8BIT_ACCESS, PS_TWI_16BIT_ACCESS\r
+// @return      u16                         Register content\r
+// *************************************************************************************************\r
+u16 ps_read_register(u8 address, u8 mode)\r
+{\r
+    u8 success;\r
+    u16 data = 0;\r
+\r
+    ps_twi_sda(PS_TWI_SEND_START);            // Generate start condition\r
+\r
+    ps_twi_write((0x11 << 1) | PS_TWI_WRITE); // Send 7bit device address 0x11 + write bit '0'\r
+    success = ps_twi_sda(PS_TWI_CHECK_ACK);   // Check ACK from device\r
+    if (!success)\r
+        return (0);\r
+\r
+    ps_twi_write(address);                    // Send 8bit register address\r
+    success = ps_twi_sda(PS_TWI_CHECK_ACK);   // Check ACK from device\r
+    if (!success)\r
+        return (0);\r
+\r
+    ps_twi_sda(PS_TWI_SEND_RESTART);          // Generate restart condition\r
+\r
+    ps_twi_write((0x11 << 1) | PS_TWI_READ);  // Send 7bit device address 0x11 + read bit '1'\r
+    success = ps_twi_sda(PS_TWI_CHECK_ACK);   // Check ACK from device\r
+    if (!success)\r
+        return (0);\r
+\r
+    if (mode == PS_TWI_16BIT_ACCESS)\r
+    {\r
+        data = ps_twi_read(1) << 8;           // Read MSB 8bit data from register\r
+        data |= ps_twi_read(0);               // Read LSB 8bit data from register\r
+    }\r
+    else\r
+    {\r
+        data = ps_twi_read(0);                // Read 8bit data from register\r
+    }\r
+\r
+    ps_twi_sda(PS_TWI_SEND_STOP);             // Generate stop condition\r
+\r
+    return (data);\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          ps_get_pa\r
+// @brief       Read out pressure. Format is Pa. Range is 30000 .. 120000 Pa.\r
+// @param       none\r
+// @return      u32             15-bit pressure sensor value (Pa)\r
+// *************************************************************************************************\r
+u32 ps_get_pa(void)\r
+{\r
+    volatile u32 data = 0;\r
+\r
+    // Get 3 MSB from DATARD8 register\r
+    data = ps_read_register(0x7F, PS_TWI_8BIT_ACCESS);\r
+    data = ((data & 0x07) << 8) << 8;\r
+\r
+    // Get 16 LSB from DATARD16 register\r
+    data |= ps_read_register(0x80, PS_TWI_16BIT_ACCESS);\r
+\r
+    // Convert decimal value to Pa\r
+    data = (data >> 2);\r
+\r
+    return (data);\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          ps_get_temp\r
+// @brief       Read out temperature.\r
+// @param       none\r
+// @return      u16             13-bit temperature value in xx.x K format\r
+// *************************************************************************************************\r
+u16 ps_get_temp(void)\r
+{\r
+    volatile u16 data = 0;\r
+    u16 temp = 0;\r
+    u8 is_negative = 0;\r
+    u16 kelvin;\r
+\r
+    // Get 13 bit from TEMPOUT register\r
+    data = ps_read_register(0x81, PS_TWI_16BIT_ACCESS);\r
+\r
+    // Convert negative temperatures\r
+    if ((data & BIT(13)) == BIT(13))\r
+    {\r
+        // Sign extend temperature\r
+        data |= 0xC000;\r
+        // Convert two's complement\r
+        data = ~data;\r
+        data += 1;\r
+        is_negative = 1;\r
+    }\r
+\r
+    temp = data / 2;\r
+\r
+    // Convert from °C to K\r
+    if (is_negative)\r
+        kelvin = 2732 - temp;\r
+    else\r
+        kelvin = temp + 2732;\r
+\r
+    return (kelvin);\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          init_pressure_table\r
+// @brief       Init pressure table with constants\r
+// @param       u32             p               Pressure (Pa)\r
+// @return      u16                             Altitude (m)\r
+// *************************************************************************************************\r
+void init_pressure_table(void)\r
+{\r
+    u8 i;\r
+\r
+    for (i = 0; i < 17; i++)\r
+        p[i] = p0[i];\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          update_pressure_table\r
+// @brief       Calculate pressure table for reference altitude.\r
+//                              Implemented straight from VTI reference code.\r
+// @param       s16             href    Reference height\r
+//                              u32             p_meas  Pressure (Pa)\r
+//                              u16             t_meas  Temperature (10*K)\r
+// @return      none\r
+// *************************************************************************************************\r
+void update_pressure_table(s16 href, u32 p_meas, u16 t_meas)\r
+{\r
+    const float Invt00 = 0.003470415;\r
+    const float coefp = 0.00006;\r
+    volatile float p_fact;\r
+    volatile float p_noll;\r
+    volatile float hnoll;\r
+    volatile float h_low = 0;\r
+    volatile float t0;\r
+    u8 i;\r
+\r
+    // Typecast arguments\r
+    volatile float fl_href = href;\r
+    volatile float fl_p_meas = (float)p_meas / 100;     // Convert from Pa to hPa\r
+    volatile float fl_t_meas = (float)t_meas / 10;      // Convert from 10 K to 1 K\r
+\r
+    t0 = fl_t_meas + (0.0065 * fl_href);\r
+\r
+    hnoll = fl_href / (t0 * Invt00);\r
+\r
+    for (i = 0; i <= 15; i++)\r
+    {\r
+        if (h0[i] > hnoll)\r
+            break;\r
+        h_low = h0[i];\r
+    }\r
+\r
+    p_noll =\r
+        (float)(hnoll -\r
+                h_low) *\r
+        (1 -\r
+         (hnoll -\r
+          (float)h0[i]) *\r
+         coefp) * ((float)p0[i] - (float)p0[i - 1]) / ((float)h0[i] - h_low) + (float)p0[i - 1];\r
+\r
+    // Calculate multiplicator\r
+    p_fact = fl_p_meas / p_noll;\r
+\r
+    // Apply correction factor to pressure table\r
+    for (i = 0; i <= 16; i++)\r
+    {\r
+        p[i] = p0[i] * p_fact;\r
+    }\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          conv_pa_to_meter\r
+// @brief       Convert pressure (Pa) to altitude (m) using a conversion table\r
+//                              Implemented straight from VTI reference code.\r
+// @param       u32             p_meas  Pressure (Pa)\r
+//                              u16             t_meas  Temperature (10*K)\r
+// @return      s16                             Altitude (m)\r
+// *************************************************************************************************\r
+s16 conv_pa_to_meter(u32 p_meas, u16 t_meas)\r
+{\r
+    const float coef2 = 0.0007;\r
+    const float Invt00 = 0.003470415;\r
+    volatile float hnoll;\r
+    volatile float t0;\r
+    volatile float p_low;\r
+    volatile float fl_h;\r
+    volatile s16 h;\r
+    u8 i;\r
+\r
+    // Typecast arguments\r
+    volatile float fl_p_meas = (float)p_meas / 100;     // Convert from Pa to hPa\r
+    volatile float fl_t_meas = (float)t_meas / 10;      // Convert from 10 K to 1 K\r
+\r
+    for (i = 0; i <= 16; i++)\r
+    {\r
+        if (p[i] < fl_p_meas)\r
+            break;\r
+        p_low = p[i];\r
+    }\r
+\r
+    if (i == 0)\r
+    {\r
+        hnoll = (float)(fl_p_meas - p[0]) / (p[1] - p[0]) * ((float)(h0[1] - h0[0]));\r
+    }\r
+    else if (i < 15)\r
+    {\r
+        hnoll =\r
+            (float)(fl_p_meas -\r
+                    p_low) *\r
+            (1 -\r
+             (fl_p_meas -\r
+              p[i]) * coef2) / (p[i] - p_low) * ((float)(h0[i] - h0[i - 1])) + h0[i - 1];\r
+    }\r
+    else if (i == 15)\r
+    {\r
+        hnoll =\r
+            (float)(fl_p_meas - p_low) / (p[i] - p_low) * ((float)(h0[i] - h0[i - 1])) + h0[i - 1];\r
+    }\r
+    else                        // i==16\r
+    {\r
+        hnoll = (float)(fl_p_meas - p[16]) / (p[16] - p[15]) * ((float)(h0[16] - h0[15])) + h0[16];\r
+    }\r
+\r
+    // Compensate temperature error\r
+    t0 = fl_t_meas / (1 - hnoll * Invt00 * 0.0065);\r
+    fl_h = Invt00 * t0 * hnoll;\r
+    h = (u16) fl_h;\r
+\r
+    return (h);\r
+}\r
+\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/driver/vti_ps.h b/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/driver/vti_ps.h
new file mode 100755 (executable)
index 0000000..e044695
--- /dev/null
@@ -0,0 +1,99 @@
+// *************************************************************************************************\r
+//\r
+//      Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//        Redistribution and use in source and binary forms, with or without\r
+//        modification, are permitted provided that the following conditions\r
+//        are met:\r
+//\r
+//          Redistributions of source code must retain the above copyright\r
+//          notice, this list of conditions and the following disclaimer.\r
+//\r
+//          Redistributions in binary form must reproduce the above copyright\r
+//          notice, this list of conditions and the following disclaimer in the\r
+//          documentation and/or other materials provided with the\r
+//          distribution.\r
+//\r
+//          Neither the name of Texas Instruments Incorporated nor the names of\r
+//          its contributors may be used to endorse or promote products derived\r
+//          from this software without specific prior written permission.\r
+//\r
+//        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+\r
+#ifndef VTI_PS_H_\r
+#define VTI_PS_H_\r
+\r
+// *************************************************************************************************\r
+// Include section\r
+\r
+// *************************************************************************************************\r
+// Prototypes section\r
+extern void ps_init(void);\r
+extern void ps_start(void);\r
+extern void ps_stop(void);\r
+extern u32 ps_get_pa(void);\r
+extern u16 ps_get_temp(void);\r
+extern void init_pressure_table(void);\r
+extern void update_pressure_table(s16 href, u32 p_meas, u16 t_meas);\r
+extern s16 conv_pa_to_meter(u32 p_meas, u16 t_meas);\r
+\r
+// *************************************************************************************************\r
+// Defines section\r
+\r
+// Port and pin resource for TWI interface to pressure sensor\r
+// SCL=PJ.3, SDA=PJ.2, DRDY=P2.6\r
+#define PS_TWI_IN            (PJIN)\r
+#define PS_TWI_OUT           (PJOUT)\r
+#define PS_TWI_DIR           (PJDIR)\r
+#define PS_TWI_REN           (PJREN)\r
+#define PS_SCL_PIN           (BIT3)\r
+#define PS_SDA_PIN           (BIT2)\r
+\r
+// Port, pin and interrupt resource for interrupt from acceleration sensor, DRDY=P2.6\r
+#define PS_INT_IN            (P2IN)\r
+#define PS_INT_OUT           (P2OUT)\r
+#define PS_INT_DIR           (P2DIR)\r
+#define PS_INT_IE            (P2IE)\r
+#define PS_INT_IES           (P2IES)\r
+#define PS_INT_IFG           (P2IFG)\r
+#define PS_INT_PIN           (BIT6)\r
+\r
+// TWI defines\r
+#define PS_TWI_WRITE            (0u)\r
+#define PS_TWI_READ                     (1u)\r
+\r
+#define PS_TWI_SEND_START       (0u)\r
+#define PS_TWI_SEND_RESTART     (1u)\r
+#define PS_TWI_SEND_STOP        (2u)\r
+#define PS_TWI_CHECK_ACK        (3u)\r
+\r
+#define PS_TWI_8BIT_ACCESS      (0u)\r
+#define PS_TWI_16BIT_ACCESS     (1u)\r
+\r
+#define PS_TWI_SCL_HI           { PS_TWI_OUT |=  PS_SCL_PIN; }\r
+#define PS_TWI_SCL_LO           { PS_TWI_OUT &= ~PS_SCL_PIN; }\r
+#define PS_TWI_SDA_HI           { PS_TWI_OUT |=  PS_SDA_PIN; }\r
+#define PS_TWI_SDA_LO           { PS_TWI_OUT &= ~PS_SDA_PIN; }\r
+#define PS_TWI_SDA_IN           { PS_TWI_OUT |=  PS_SDA_PIN; PS_TWI_DIR &= ~PS_SDA_PIN; }\r
+#define PS_TWI_SDA_OUT          { PS_TWI_DIR |=  PS_SDA_PIN; }\r
+\r
+// *************************************************************************************************\r
+// Global Variable section\r
+\r
+// *************************************************************************************************\r
+// Extern section\r
+\r
+#endif                          /*VTI_PS_H_ */\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/include/project.h b/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/include/project.h
new file mode 100755 (executable)
index 0000000..082ff44
--- /dev/null
@@ -0,0 +1,131 @@
+// *************************************************************************************************\r
+//\r
+//      Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//        Redistribution and use in source and binary forms, with or without\r
+//        modification, are permitted provided that the following conditions\r
+//        are met:\r
+//\r
+//          Redistributions of source code must retain the above copyright\r
+//          notice, this list of conditions and the following disclaimer.\r
+//\r
+//          Redistributions in binary form must reproduce the above copyright\r
+//          notice, this list of conditions and the following disclaimer in the\r
+//          documentation and/or other materials provided with the\r
+//          distribution.\r
+//\r
+//          Neither the name of Texas Instruments Incorporated nor the names of\r
+//          its contributors may be used to endorse or promote products derived\r
+//          from this software without specific prior written permission.\r
+//\r
+//        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+\r
+#ifndef PROJECT_H_\r
+#define PROJECT_H_\r
+\r
+// *************************************************************************************************\r
+// Include section\r
+#include <cc430x613x.h>\r
+#include <bm.h>\r
+\r
+// *************************************************************************************************\r
+// Defines section\r
+\r
+// Comment this to not use the LCD charge pump\r
+//#define USE_LCD_CHARGE_PUMP\r
+\r
+// Comment this define to build the application without watchdog support\r
+#define USE_WATCHDOG\r
+\r
+// Use/not use filter when measuring physical values\r
+#define FILTER_OFF                                              (0u)\r
+#define FILTER_ON                                               (1u)\r
+\r
+// *************************************************************************************************\r
+// Macro section\r
+\r
+// Conversion from usec to ACLK timer ticks\r
+#define CONV_US_TO_TICKS(usec)                          (((usec) * 32768) / 1000000)\r
+\r
+// Conversion from msec to ACLK timer ticks\r
+#define CONV_MS_TO_TICKS(msec)                          (((msec) * 32768) / 1000)\r
+\r
+// *************************************************************************************************\r
+// Typedef section\r
+\r
+typedef enum\r
+{\r
+    MENU_ITEM_NOT_VISIBLE = 0,            // Menu item is not visible\r
+    MENU_ITEM_VISIBLE                     // Menu item is visible\r
+} menu_t;\r
+\r
+// Set of system flags\r
+typedef union\r
+{\r
+    struct\r
+    {\r
+        u16 idle_timeout : 1;             // Timeout after inactivity\r
+        u16 idle_timeout_enabled : 1;     // When in set mode, timeout after a given period\r
+        u16 lock_buttons : 1;             // Lock buttons\r
+        u16 mask_buzzer : 1;              // Do not output buzz for next button event\r
+        u16 up_down_repeat_enabled : 1;   // While in set_value(), create virtual UP/DOWN button\r
+                                          // events\r
+        u16 low_battery : 1;              // 1 = Battery is low\r
+        u16 use_metric_units : 1;         // 1 = Use metric units, 0 = use English units\r
+        u16 delay_over : 1;               // 1 = Timer delay over\r
+    } flag;\r
+    u16 all_flags;                        // Shortcut to all display flags (for reset)\r
+} s_system_flags;\r
+extern volatile s_system_flags sys;\r
+\r
+// Set of request flags\r
+typedef union\r
+{\r
+    struct\r
+    {\r
+        u16 temperature_measurement : 1;  // 1 = Measure temperature\r
+        u16 voltage_measurement : 1;      // 1 = Measure voltage\r
+        u16 altitude_measurement : 1;     // 1 = Measure air pressure\r
+        u16 acceleration_measurement : 1; // 1 = Measure acceleration\r
+        u16 buzzer : 1;                   // 1 = Output buzzer\r
+    } flag;\r
+    u16 all_flags;                        // Shortcut to all display flags (for reset)\r
+} s_request_flags;\r
+extern volatile s_request_flags request;\r
+\r
+// Set of message flags\r
+typedef union\r
+{\r
+    struct\r
+    {\r
+        u16 prepare : 1;                  // 1 = Wait for clock tick, then set\r
+                                          // display.flag.show_message flag\r
+        u16 show : 1;                     // 1 = Display message now\r
+        u16 erase : 1;                    // 1 = Erase message\r
+        u16 type_locked : 1;              // 1 = Show "buttons are locked" in Line2\r
+        u16 type_unlocked : 1;            // 1 = Show "buttons are unlocked" in Line2\r
+        u16 type_lobatt : 1;              // 1 = Show "lobatt" text in Line2\r
+        u16 type_alarm_on : 1;            // 1 = Show "  on" text in Line1\r
+        u16 type_alarm_off : 1;           // 1 = Show " off" text in Line1\r
+    } flag;\r
+    u16 all_flags;                        // Shortcut to all message flags (for reset)\r
+} s_message_flags;\r
+extern volatile s_message_flags message;\r
+\r
+// *************************************************************************************************\r
+// Global Variable section\r
+\r
+#endif                                    /*PROJECT_H_ */\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/lnk_cc430f6137.cmd b/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/lnk_cc430f6137.cmd
new file mode 100755 (executable)
index 0000000..a5bdb4a
--- /dev/null
@@ -0,0 +1,200 @@
+/******************************************************************************/\r
+/* lnk_cc430f6137.cmd - LINKER COMMAND FILE FOR LINKING CC430F6137 PROGRAMS */\r
+/*                                                                            */\r
+/*  Ver | dd mmm yyyy | Who  | Description of changes                         */\r
+/* =====|=============|======|=============================================   */\r
+/*  0.01| 08 Mar 2004 | A.D. | First prototype                                */\r
+/*  0.02| 26 Mai 2004 | A.D. | Leading symbol underscores removed,            */\r
+/*      |             |      | Interrupt vector definition changed            */\r
+/*  0.03| 22 Jun 2004 | A.D. | File reformatted                               */\r
+/*                                                                            */\r
+/*   Usage:  lnk430 <obj files...>    -o <out file> -m <map file> lnk.cmd     */\r
+/*           cl430  <src files...> -z -o <out file> -m <map file> lnk.cmd     */\r
+/*                                                                            */\r
+/*----------------------------------------------------------------------------*/\r
+\r
+/* These linker options are for command line linking only.  For IDE linking,  */\r
+/* you should set your linker options in Project Properties                   */\r
+/* -c                                               LINK USING C CONVENTIONS  */\r
+/* -stack  0x0100                                   SOFTWARE STACK SIZE       */\r
+/* -heap   0x0100                                   HEAP AREA SIZE            */\r
+\r
+/*----------------------------------------------------------------------------*/\r
+/* 'Allocate' peripheral registers at given addresses                         */\r
+/*----------------------------------------------------------------------------*/\r
+\r
+/****************************************************************************/\r
+/* SPECIFY THE SYSTEM MEMORY MAP                                            */\r
+/****************************************************************************/\r
+\r
+MEMORY\r
+{\r
+    SFR                     : origin = 0x0000, length = 0x0010\r
+    PERIPHERALS_8BIT        : origin = 0x0010, length = 0x00F0\r
+    PERIPHERALS_16BIT       : origin = 0x0100, length = 0x0100\r
+    RAM                     : origin = 0x1C00, length = 0x0FFE\r
+    INFOA                   : origin = 0x1980, length = 0x0080\r
+    INFOB                   : origin = 0x1900, length = 0x0080\r
+    INFOC                   : origin = 0x1880, length = 0x0080\r
+    INFOD                   : origin = 0x1800, length = 0x0080\r
+    FLASH                   : origin = 0x8000, length = 0x7F80\r
+    INT00                   : origin = 0xFF80, length = 0x0002\r
+    INT01                   : origin = 0xFF82, length = 0x0002\r
+    INT02                   : origin = 0xFF84, length = 0x0002\r
+    INT03                   : origin = 0xFF86, length = 0x0002\r
+    INT04                   : origin = 0xFF88, length = 0x0002\r
+    INT05                   : origin = 0xFF8A, length = 0x0002\r
+    INT06                   : origin = 0xFF8C, length = 0x0002\r
+    INT07                   : origin = 0xFF8E, length = 0x0002\r
+    INT08                   : origin = 0xFF90, length = 0x0002\r
+    INT09                   : origin = 0xFF92, length = 0x0002\r
+    INT10                   : origin = 0xFF94, length = 0x0002\r
+    INT11                   : origin = 0xFF96, length = 0x0002\r
+    INT12                   : origin = 0xFF98, length = 0x0002\r
+    INT13                   : origin = 0xFF9A, length = 0x0002\r
+    INT14                   : origin = 0xFF9C, length = 0x0002\r
+    INT15                   : origin = 0xFF9E, length = 0x0002\r
+    INT16                   : origin = 0xFFA0, length = 0x0002\r
+    INT17                   : origin = 0xFFA2, length = 0x0002\r
+    INT18                   : origin = 0xFFA4, length = 0x0002\r
+    INT19                   : origin = 0xFFA6, length = 0x0002\r
+    INT20                   : origin = 0xFFA8, length = 0x0002\r
+    INT21                   : origin = 0xFFAA, length = 0x0002\r
+    INT22                   : origin = 0xFFAC, length = 0x0002\r
+    INT23                   : origin = 0xFFAE, length = 0x0002\r
+    INT24                   : origin = 0xFFB0, length = 0x0002\r
+    INT25                   : origin = 0xFFB2, length = 0x0002\r
+    INT26                   : origin = 0xFFB4, length = 0x0002\r
+    INT27                   : origin = 0xFFB6, length = 0x0002\r
+    INT28                   : origin = 0xFFB8, length = 0x0002\r
+    INT29                   : origin = 0xFFBA, length = 0x0002\r
+    INT30                   : origin = 0xFFBC, length = 0x0002\r
+    INT31                   : origin = 0xFFBE, length = 0x0002\r
+    INT32                   : origin = 0xFFC0, length = 0x0002\r
+    INT33                   : origin = 0xFFC2, length = 0x0002\r
+    INT34                   : origin = 0xFFC4, length = 0x0002\r
+    INT35                   : origin = 0xFFC6, length = 0x0002\r
+    INT36                   : origin = 0xFFC8, length = 0x0002\r
+    INT37                   : origin = 0xFFCA, length = 0x0002\r
+    INT38                   : origin = 0xFFCC, length = 0x0002\r
+    INT39                   : origin = 0xFFCE, length = 0x0002\r
+    INT40                   : origin = 0xFFD0, length = 0x0002\r
+    INT41                   : origin = 0xFFD2, length = 0x0002\r
+    INT42                   : origin = 0xFFD4, length = 0x0002\r
+    INT43                   : origin = 0xFFD6, length = 0x0002\r
+    INT44                   : origin = 0xFFD8, length = 0x0002\r
+    INT45                   : origin = 0xFFDA, length = 0x0002\r
+    INT46                   : origin = 0xFFDC, length = 0x0002\r
+    INT47                   : origin = 0xFFDE, length = 0x0002\r
+    INT48                   : origin = 0xFFE0, length = 0x0002\r
+    INT49                   : origin = 0xFFE2, length = 0x0002\r
+    INT50                   : origin = 0xFFE4, length = 0x0002\r
+    INT51                   : origin = 0xFFE6, length = 0x0002\r
+    INT52                   : origin = 0xFFE8, length = 0x0002\r
+    INT53                   : origin = 0xFFEA, length = 0x0002\r
+    INT54                   : origin = 0xFFEC, length = 0x0002\r
+    INT55                   : origin = 0xFFEE, length = 0x0002\r
+    INT56                   : origin = 0xFFF0, length = 0x0002\r
+    INT57                   : origin = 0xFFF2, length = 0x0002\r
+    INT58                   : origin = 0xFFF4, length = 0x0002\r
+    INT59                   : origin = 0xFFF6, length = 0x0002\r
+    INT60                   : origin = 0xFFF8, length = 0x0002\r
+    INT61                   : origin = 0xFFFA, length = 0x0002\r
+    INT62                   : origin = 0xFFFC, length = 0x0002\r
+    RESET                   : origin = 0xFFFE, length = 0x0002\r
+}\r
+\r
+/****************************************************************************/\r
+/* SPECIFY THE SECTIONS ALLOCATION INTO MEMORY                              */\r
+/****************************************************************************/\r
+\r
+SECTIONS\r
+{\r
+    .bss       : {} > RAM                /* GLOBAL & STATIC VARS              */\r
+    .sysmem    : {} > RAM                /* DYNAMIC MEMORY ALLOCATION AREA    */\r
+    .stack     : {} > RAM (HIGH)         /* SOFTWARE SYSTEM STACK             */\r
+\r
+    .text      : {} > FLASH              /* CODE                              */\r
+    .cinit     : {} > FLASH              /* INITIALIZATION TABLES             */\r
+    .const     : {} > FLASH              /* CONSTANT DATA                     */\r
+    .cio       : {} > RAM                /* C I/O BUFFER                      */\r
+\r
+    .pinit     : {} > FLASH              /* C++ CONSTRUCTOR TABLES            */\r
+\r
+    .infoA     : {} > INFOA              /* MSP430 INFO FLASH MEMORY SEGMENTS */\r
+    .infoB     : {} > INFOB\r
+    .infoC     : {} > INFOC\r
+    .infoD     : {} > INFOD\r
+\r
+    .int00   : {} > INT00                /* MSP430 INTERRUPT VECTORS          */\r
+    .int01   : {} > INT01\r
+    .int02   : {} > INT02\r
+    .int03   : {} > INT03\r
+    .int04   : {} > INT04\r
+    .int05   : {} > INT05\r
+    .int06   : {} > INT06\r
+    .int07   : {} > INT07\r
+    .int08   : {} > INT08\r
+    .int09   : {} > INT09\r
+    .int10   : {} > INT10\r
+    .int11   : {} > INT11\r
+    .int12   : {} > INT12\r
+    .int13   : {} > INT13\r
+    .int14   : {} > INT14\r
+    .int15   : {} > INT15\r
+    .int16   : {} > INT16\r
+    .int17   : {} > INT17\r
+    .int18   : {} > INT18\r
+    .int19   : {} > INT19\r
+    .int20   : {} > INT20\r
+    .int21   : {} > INT21\r
+    .int22   : {} > INT22\r
+    .int23   : {} > INT23\r
+    .int24   : {} > INT24\r
+    .int25   : {} > INT25\r
+    .int26   : {} > INT26\r
+    .int27   : {} > INT27\r
+    .int28   : {} > INT28\r
+    .int29   : {} > INT29\r
+    .int30   : {} > INT30\r
+    .int31   : {} > INT31\r
+    .int32   : {} > INT32\r
+    .int33   : {} > INT33\r
+    .int34   : {} > INT34\r
+    .int35   : {} > INT35\r
+    .int36   : {} > INT36\r
+    .int37   : {} > INT37\r
+    .int38   : {} > INT38\r
+    .int39   : {} > INT39\r
+    .int40   : {} > INT40\r
+    .int41   : {} > INT41\r
+    .int42   : {} > INT42\r
+    .int43   : {} > INT43\r
+    .int44   : {} > INT44\r
+    .int45   : {} > INT45\r
+    .int46   : {} > INT46\r
+    .int47   : {} > INT47\r
+    .int48   : {} > INT48\r
+    .int49   : {} > INT49\r
+    .int50   : {} > INT50\r
+    .int51   : {} > INT51\r
+    .int52   : {} > INT52\r
+    .int53   : {} > INT53\r
+    .int54   : {} > INT54\r
+    .int55   : {} > INT55\r
+    .int56   : {} > INT56\r
+    .int57   : {} > INT57\r
+    .int58   : {} > INT58\r
+    .int59   : {} > INT59\r
+    .int60   : {} > INT60\r
+    .int61   : {} > INT61\r
+    .int62   : {} > INT62\r
+    .reset   : {} > RESET              /* MSP430 RESET VECTOR               */ \r
+}\r
+\r
+/****************************************************************************/\r
+/* INCLUDE PERIPHERALS MEMORY MAP                                           */\r
+/****************************************************************************/\r
+\r
+-l cc430x613x.cmd\r
+\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/logic/acceleration.c b/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/logic/acceleration.c
new file mode 100755 (executable)
index 0000000..41db976
--- /dev/null
@@ -0,0 +1,270 @@
+// *************************************************************************************************\r
+//\r
+//      Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//        Redistribution and use in source and binary forms, with or without\r
+//        modification, are permitted provided that the following conditions\r
+//        are met:\r
+//\r
+//          Redistributions of source code must retain the above copyright\r
+//          notice, this list of conditions and the following disclaimer.\r
+//\r
+//          Redistributions in binary form must reproduce the above copyright\r
+//          notice, this list of conditions and the following disclaimer in the\r
+//          documentation and/or other materials provided with the\r
+//          distribution.\r
+//\r
+//          Neither the name of Texas Instruments Incorporated nor the names of\r
+//          its contributors may be used to endorse or promote products derived\r
+//          from this software without specific prior written permission.\r
+//\r
+//        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+// Temperature measurement functions.\r
+// *************************************************************************************************\r
+\r
+// *************************************************************************************************\r
+// Include section\r
+\r
+// system\r
+#include "project.h"\r
+\r
+// driver\r
+#include "display.h"\r
+#include "vti_as.h"\r
+\r
+// logic\r
+#include "acceleration.h"\r
+#include "simpliciti.h"\r
+#include "user.h"\r
+\r
+// *************************************************************************************************\r
+// Global Variable section\r
+struct accel sAccel;\r
+\r
+// Conversion values from data to mgrav taken from CMA3000-D0x datasheet (rev 0.4, table 4)\r
+const u16 mgrav_per_bit[7] = { 18, 36, 71, 143, 286, 571, 1142 };\r
+\r
+// *************************************************************************************************\r
+// Extern section\r
+\r
+// Global flag for proper acceleration sensor operation\r
+extern u8 as_ok;\r
+\r
+// *************************************************************************************************\r
+// @fn          reset_acceleration\r
+// @brief       Reset acceleration variables.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void reset_acceleration(void)\r
+{\r
+    // Start with Y-axis display\r
+    sAccel.view_style = DISPLAY_ACCEL_Y;\r
+\r
+    // Clear timeout counter\r
+    sAccel.timeout = 0;\r
+\r
+    // Default mode is off\r
+    sAccel.mode = ACCEL_MODE_OFF;\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          sx_acceleration\r
+// @brief       Acceleration direct function. Button UP switches between X/Y/Z values.\r
+// @param       u8 line         LINE2\r
+// @return      none\r
+// *************************************************************************************************\r
+void sx_acceleration(u8 line)\r
+{\r
+    if (++sAccel.view_style > 2)\r
+        sAccel.view_style = 0;\r
+\r
+    // Reset current acceleration value\r
+    sAccel.data = 0;\r
+\r
+    // Get data from sensor\r
+    as_get_data(sAccel.xyz);\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          acceleration_value_is_positive\r
+// @brief       Returns 1 if 2's complement number is positive\r
+// @param       u8 value        2's complement number\r
+// @return      u8                      1 = number is positive, 0 = number is negavtive\r
+// *************************************************************************************************\r
+u8 acceleration_value_is_positive(u8 value)\r
+{\r
+    return ((value & BIT7) == 0);\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          convert_acceleration_value_to_mgrav\r
+// @brief       Converts measured value to mgrav units\r
+// @param       u8 value        g data from sensor\r
+// @return      u16                     Acceleration (mgrav)\r
+// *************************************************************************************************\r
+u16 convert_acceleration_value_to_mgrav(u8 value)\r
+{\r
+    u16 result;\r
+    u8 i;\r
+\r
+    if (!acceleration_value_is_positive(value))\r
+    {\r
+        // Convert 2's complement negative number to positive number\r
+        value = ~value;\r
+        value += 1;\r
+    }\r
+\r
+    result = 0;\r
+    for (i = 0; i < 7; i++)\r
+    {\r
+        result += ((value & (BIT(i))) >> i) * mgrav_per_bit[i];\r
+    }\r
+\r
+    return (result);\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          is_acceleration_measurement\r
+// @brief       Returns 1 if acceleration is currently measured.\r
+// @param       none\r
+// @return      u8              1 = acceleration measurement ongoing\r
+// *************************************************************************************************\r
+u8 is_acceleration_measurement(void)\r
+{\r
+    return ((sAccel.mode == ACCEL_MODE_ON) && (sAccel.timeout > 0));\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          do_acceleration_measurement\r
+// @brief       Get sensor data and store in sAccel struct\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void do_acceleration_measurement(void)\r
+{\r
+    // Get data from sensor\r
+    as_get_data(sAccel.xyz);\r
+\r
+    // Set display update flag\r
+    display.flag.update_acceleration = 1;\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          display_acceleration\r
+// @brief       Display routine.\r
+// @param       u8 line                 LINE1\r
+//                              u8 update               DISPLAY_LINE_UPDATE_FULL, DISPLAY_LINE_CLEAR\r
+// @return      none\r
+// *************************************************************************************************\r
+void display_acceleration(u8 line, u8 update)\r
+{\r
+    u8 *str;\r
+    u8 raw_data;\r
+    u16 accel_data;\r
+\r
+    // Show warning if acceleration sensor was not initialised properly\r
+    if (!as_ok)\r
+    {\r
+        display_chars(LCD_SEG_L1_2_0, (u8 *) "ERR", SEG_ON);\r
+    }\r
+    else\r
+    {\r
+        // Redraw whole screen\r
+        if (update == DISPLAY_LINE_UPDATE_FULL)\r
+        {\r
+            {\r
+                // Start acceleration sensor\r
+                if (!is_acceleration_measurement())\r
+                {\r
+                    // Clear previous acceleration value\r
+                    sAccel.data = 0;\r
+\r
+                    // Start sensor\r
+                    as_start();\r
+\r
+                    // Set timeout counter\r
+                    sAccel.timeout = ACCEL_MEASUREMENT_TIMEOUT;\r
+\r
+                    // Set mode\r
+                    sAccel.mode = ACCEL_MODE_ON;\r
+\r
+                    // Start with Y-axis values\r
+                    sAccel.view_style = DISPLAY_ACCEL_Y;\r
+                }\r
+\r
+                // Display decimal point\r
+                display_symbol(LCD_SEG_L1_DP1, SEG_ON);\r
+            }\r
+        }\r
+        else if (update == DISPLAY_LINE_UPDATE_PARTIAL)\r
+        {\r
+            // Convert X/Y/Z values to mg\r
+            switch (sAccel.view_style)\r
+            {\r
+                case DISPLAY_ACCEL_X:\r
+                    raw_data = sAccel.xyz[0];\r
+                    display_char(LCD_SEG_L1_3, 'X', SEG_ON);\r
+                    break;\r
+                case DISPLAY_ACCEL_Y:\r
+                    raw_data = sAccel.xyz[1];\r
+                    display_char(LCD_SEG_L1_3, 'Y', SEG_ON);\r
+                    break;\r
+                default:\r
+                    raw_data = sAccel.xyz[2];\r
+                    display_char(LCD_SEG_L1_3, 'Z', SEG_ON);\r
+                    break;\r
+            }\r
+            accel_data = convert_acceleration_value_to_mgrav(raw_data) / 10;\r
+\r
+            // Filter acceleration\r
+            accel_data = (u16) ((accel_data * 0.2) + (sAccel.data * 0.8));\r
+\r
+            // Store average acceleration\r
+            sAccel.data = accel_data;\r
+\r
+            // Display acceleration in x.xx format\r
+            str = int_to_array(accel_data, 3, 0);\r
+            display_chars(LCD_SEG_L1_2_0, str, SEG_ON);\r
+\r
+            // Display sign\r
+            if (acceleration_value_is_positive(raw_data))\r
+            {\r
+                display_symbol(LCD_SYMB_ARROW_UP, SEG_ON);\r
+                display_symbol(LCD_SYMB_ARROW_DOWN, SEG_OFF);\r
+            }\r
+            else\r
+            {\r
+                display_symbol(LCD_SYMB_ARROW_UP, SEG_OFF);\r
+                display_symbol(LCD_SYMB_ARROW_DOWN, SEG_ON);\r
+            }\r
+        }\r
+        else if (update == DISPLAY_LINE_CLEAR)\r
+        {\r
+            // Stop acceleration sensor\r
+            as_stop();\r
+\r
+            // Clear mode\r
+            sAccel.mode = ACCEL_MODE_OFF;\r
+\r
+            // Clean up display\r
+            display_symbol(LCD_SEG_L1_DP1, SEG_OFF);\r
+            display_symbol(LCD_SYMB_ARROW_UP, SEG_OFF);\r
+            display_symbol(LCD_SYMB_ARROW_DOWN, SEG_OFF);\r
+        }\r
+    }\r
+}\r
+\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/logic/acceleration.h b/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/logic/acceleration.h
new file mode 100755 (executable)
index 0000000..14f3d43
--- /dev/null
@@ -0,0 +1,77 @@
+// *************************************************************************************************\r
+//\r
+//      Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//        Redistribution and use in source and binary forms, with or without\r
+//        modification, are permitted provided that the following conditions\r
+//        are met:\r
+//\r
+//          Redistributions of source code must retain the above copyright\r
+//          notice, this list of conditions and the following disclaimer.\r
+//\r
+//          Redistributions in binary form must reproduce the above copyright\r
+//          notice, this list of conditions and the following disclaimer in the\r
+//          documentation and/or other materials provided with the\r
+//          distribution.\r
+//\r
+//          Neither the name of Texas Instruments Incorporated nor the names of\r
+//          its contributors may be used to endorse or promote products derived\r
+//          from this software without specific prior written permission.\r
+//\r
+//        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+\r
+#ifndef ACCELERATION_H_\r
+#define ACCELERATION_H_\r
+\r
+// *************************************************************************************************\r
+// Include section\r
+\r
+// *************************************************************************************************\r
+// Prototypes section\r
+\r
+// *************************************************************************************************\r
+// Defines section\r
+#define DISPLAY_ACCEL_X         (0u)\r
+#define DISPLAY_ACCEL_Y         (1u)\r
+#define DISPLAY_ACCEL_Z         (2u)\r
+\r
+#define ACCEL_MODE_OFF          (0u)\r
+#define ACCEL_MODE_ON           (1u)\r
+\r
+// Stop acceleration measurement after 60 minutes to save battery\r
+#define ACCEL_MEASUREMENT_TIMEOUT               (60 * 60u)\r
+\r
+// *************************************************************************************************\r
+// Global Variable section\r
+struct accel\r
+{\r
+    u8 mode;                    // ACC_MODE_OFF, ACC_MODE_ON\r
+    u8 xyz[3];                  // Sensor raw data\r
+    u16 data;                   // Acceleration data in 10 * mgrav\r
+    u8 view_style;              // Display X/Y/Z values\r
+    u16 timeout;                // Timeout\r
+};\r
+extern struct accel sAccel;\r
+\r
+// *************************************************************************************************\r
+// Extern section\r
+extern void reset_acceleration(void);\r
+extern void sx_acceleration(u8 line);\r
+extern void display_acceleration(u8 line, u8 update);\r
+extern u8 is_acceleration_measurement(void);\r
+extern void do_acceleration_measurement(void);\r
+\r
+#endif                          /*ACCELERATION_H_ */\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/logic/alarm.c b/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/logic/alarm.c
new file mode 100755 (executable)
index 0000000..0bfdc94
--- /dev/null
@@ -0,0 +1,280 @@
+// *************************************************************************************************\r
+//\r
+//      Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//        Redistribution and use in source and binary forms, with or without\r
+//        modification, are permitted provided that the following conditions\r
+//        are met:\r
+//\r
+//          Redistributions of source code must retain the above copyright\r
+//          notice, this list of conditions and the following disclaimer.\r
+//\r
+//          Redistributions in binary form must reproduce the above copyright\r
+//          notice, this list of conditions and the following disclaimer in the\r
+//          documentation and/or other materials provided with the\r
+//          distribution.\r
+//\r
+//          Neither the name of Texas Instruments Incorporated nor the names of\r
+//          its contributors may be used to endorse or promote products derived\r
+//          from this software without specific prior written permission.\r
+//\r
+//        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+// Alarm routines.\r
+// *************************************************************************************************\r
+\r
+// *************************************************************************************************\r
+// Include section\r
+\r
+// system\r
+#include "project.h"\r
+\r
+// driver\r
+#include "display.h"\r
+#include "buzzer.h"\r
+#include "ports.h"\r
+\r
+// logic\r
+#include "alarm.h"\r
+#include "clock.h"\r
+#include "user.h"\r
+\r
+// *************************************************************************************************\r
+// Prototypes section\r
+\r
+// *************************************************************************************************\r
+// Defines section\r
+\r
+// *************************************************************************************************\r
+// Global Variable section\r
+struct alarm sAlarm;\r
+\r
+// *************************************************************************************************\r
+// Extern section\r
+\r
+// *************************************************************************************************\r
+// @fn          reset_alarm\r
+// @brief       Resets alarmData to 06:30\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void reset_alarm(void)\r
+{\r
+    // Default alarm time 06:30\r
+    sAlarm.hour = 06;\r
+    sAlarm.minute = 30;\r
+\r
+    // Alarm is initially off\r
+    sAlarm.duration = ALARM_ON_DURATION;\r
+    sAlarm.state = ALARM_DISABLED;\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          check_alarm\r
+// @brief       Check if current time matches alarm time\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void check_alarm(void)\r
+{\r
+    // Return if alarm is not enabled\r
+    if (sAlarm.state != ALARM_ENABLED)\r
+        return;\r
+\r
+    // Compare current time and alarm time\r
+    // Start with minutes - only 1/60 probability to match\r
+    if (sTime.minute == sAlarm.minute)\r
+    {\r
+        if (sTime.hour == sAlarm.hour)\r
+        {\r
+            // Indicate that alarm is on\r
+            sAlarm.state = ALARM_ON;\r
+        }\r
+    }\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          stop_alarm\r
+// @brief       Stop active alarm\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void stop_alarm(void)\r
+{\r
+    // Indicate that alarm is enabled, but not active\r
+    sAlarm.state = ALARM_ENABLED;\r
+\r
+    // Stop buzzer\r
+    stop_buzzer();\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          sx_alarm\r
+// @brief       Sx button turns alarm on/off.\r
+// @param       u8 line         LINE1\r
+// @return      none\r
+// *************************************************************************************************\r
+void sx_alarm(u8 line)\r
+{\r
+    // UP: Alarm on, off\r
+    if (button.flag.up)\r
+    {\r
+        // Toggle alarm state\r
+        if (sAlarm.state == ALARM_DISABLED)\r
+        {\r
+            sAlarm.state = ALARM_ENABLED;\r
+\r
+            // Show "  on" message\r
+            message.flag.prepare = 1;\r
+            message.flag.type_alarm_on = 1;\r
+        }\r
+        else if (sAlarm.state == ALARM_ENABLED)\r
+        {\r
+            sAlarm.state = ALARM_DISABLED;\r
+\r
+            // Show "  off" message\r
+            message.flag.prepare = 1;\r
+            message.flag.type_alarm_off = 1;\r
+        }\r
+    }\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          mx_alarm\r
+// @brief       Set alarm time.\r
+// @param       u8 line LINE1\r
+// @return      none\r
+// *************************************************************************************************\r
+void mx_alarm(u8 line)\r
+{\r
+    u8 select;\r
+    s32 hours;\r
+    s32 minutes;\r
+    u8 *str;\r
+\r
+    // Clear display\r
+    clear_display_all();\r
+\r
+    // Keep global values in case new values are discarded\r
+    hours = sAlarm.hour;\r
+    minutes = sAlarm.minute;\r
+\r
+    // Display HH:MM (LINE1)\r
+    str = int_to_array(hours, 2, 0);\r
+    display_chars(LCD_SEG_L1_3_2, str, SEG_ON);\r
+    display_symbol(LCD_SEG_L1_COL, SEG_ON);\r
+\r
+    str = int_to_array(minutes, 2, 0);\r
+    display_chars(LCD_SEG_L1_1_0, str, SEG_ON);\r
+\r
+    // Init value index\r
+    select = 0;\r
+\r
+    // Loop values until all are set or user breaks set\r
+    while (1)\r
+    {\r
+        // Idle timeout: exit without saving\r
+        if (sys.flag.idle_timeout)\r
+            break;\r
+\r
+        // STAR (short): save, then exit\r
+        if (button.flag.star)\r
+        {\r
+            // Store local variables in global alarm time\r
+            sAlarm.hour = hours;\r
+            sAlarm.minute = minutes;\r
+            // Set display update flag\r
+            display.flag.line1_full_update = 1;\r
+            break;\r
+        }\r
+\r
+        switch (select)\r
+        {\r
+            case 0:            // Set hour\r
+                set_value(&hours, 2, 0, 0, 23, SETVALUE_ROLLOVER_VALUE + SETVALUE_DISPLAY_VALUE +\r
+                          SETVALUE_NEXT_VALUE, LCD_SEG_L1_3_2,\r
+                          display_hours);\r
+                select = 1;\r
+                break;\r
+\r
+            case 1:            // Set minutes\r
+                set_value(&minutes, 2, 0, 0, 59, SETVALUE_ROLLOVER_VALUE + SETVALUE_DISPLAY_VALUE +\r
+                          SETVALUE_NEXT_VALUE, LCD_SEG_L1_1_0,\r
+                          display_value);\r
+                select = 0;\r
+                break;\r
+        }\r
+    }\r
+\r
+    // Clear button flag\r
+    button.all_flags = 0;\r
+\r
+    // Indicate to display function that new value is available\r
+    display.flag.update_alarm = 1;\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          display_alarm\r
+// @brief       Display alarm time. 24H / 12H time format.\r
+// @param       u8 line         LINE1, LINE2\r
+//                              u8 update       DISPLAY_LINE_UPDATE_FULL, DISPLAY_LINE_CLEAR\r
+// @return      none\r
+// *************************************************************************************************\r
+void display_alarm(u8 line, u8 update)\r
+{\r
+    u8 hour12;\r
+\r
+    if (update == DISPLAY_LINE_UPDATE_FULL)\r
+    {\r
+        if (sys.flag.use_metric_units)\r
+        {\r
+            // Display 24H alarm time "HH:MM"\r
+            display_chars(switch_seg(line, LCD_SEG_L1_3_2,\r
+                                     LCD_SEG_L2_3_2), int_to_array(sAlarm.hour, 2, 0), SEG_ON);\r
+        }\r
+        else\r
+        {\r
+            // Display 12H alarm time "HH:MM" + AM/PM\r
+            hour12 = convert_hour_to_12H_format(sAlarm.hour);\r
+            display_chars(switch_seg(line, LCD_SEG_L1_3_2,\r
+                                     LCD_SEG_L2_3_2), int_to_array(hour12, 2, 0), SEG_ON);\r
+\r
+            // Display AM/PM symbol\r
+            display_am_pm_symbol(sAlarm.hour);\r
+        }\r
+        display_chars(switch_seg(line, LCD_SEG_L1_1_0,\r
+                                 LCD_SEG_L2_1_0), int_to_array(sAlarm.minute, 2, 0), SEG_ON);\r
+        display_symbol(switch_seg(line, LCD_SEG_L1_COL, LCD_SEG_L2_COL0), SEG_ON);\r
+\r
+        // Show blinking alarm icon\r
+        display_symbol(LCD_ICON_ALARM, SEG_ON_BLINK_ON);\r
+    }\r
+    else if (update == DISPLAY_LINE_CLEAR)\r
+    {\r
+        // Clean up function-specific segments before leaving function\r
+        display_symbol(LCD_SYMB_AM, SEG_OFF);\r
+\r
+        // Clear / set alarm icon\r
+        if (sAlarm.state == ALARM_DISABLED)\r
+        {\r
+            display_symbol(LCD_ICON_ALARM, SEG_OFF_BLINK_OFF);\r
+        }\r
+        else\r
+        {\r
+            display_symbol(LCD_ICON_ALARM, SEG_ON_BLINK_OFF);\r
+        }\r
+    }\r
+}\r
+\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/logic/alarm.h b/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/logic/alarm.h
new file mode 100755 (executable)
index 0000000..87b036b
--- /dev/null
@@ -0,0 +1,75 @@
+// *************************************************************************************************\r
+//\r
+//      Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//        Redistribution and use in source and binary forms, with or without\r
+//        modification, are permitted provided that the following conditions\r
+//        are met:\r
+//\r
+//          Redistributions of source code must retain the above copyright\r
+//          notice, this list of conditions and the following disclaimer.\r
+//\r
+//          Redistributions in binary form must reproduce the above copyright\r
+//          notice, this list of conditions and the following disclaimer in the\r
+//          documentation and/or other materials provided with the\r
+//          distribution.\r
+//\r
+//          Neither the name of Texas Instruments Incorporated nor the names of\r
+//          its contributors may be used to endorse or promote products derived\r
+//          from this software without specific prior written permission.\r
+//\r
+//        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+\r
+// *************************************************************************************************\r
+// Include section\r
+\r
+// *************************************************************************************************\r
+// Prototypes section\r
+\r
+// internal functions\r
+extern void reset_alarm(void);\r
+extern void check_alarm(void);\r
+extern void stop_alarm(void);\r
+\r
+// menu functions\r
+extern void sx_alarm(u8 line);\r
+extern void mx_alarm(u8 line);\r
+extern void display_alarm(u8 line, u8 update);\r
+\r
+// *************************************************************************************************\r
+// Defines section\r
+\r
+// Alarm states\r
+#define ALARM_DISABLED          (0u)\r
+#define ALARM_ENABLED           (1u)\r
+#define ALARM_ON                        (2u)\r
+\r
+// Keep alarm for 10 on-off cycles\r
+#define ALARM_ON_DURATION       (10u)\r
+\r
+// *************************************************************************************************\r
+// Global Variable section\r
+struct alarm\r
+{\r
+    u8 state;                   // ALARM_DISABLED, ALARM_ENABLED, ALARM_ON\r
+    u8 duration;                // Alarm duration\r
+    u8 hour;                    // Alarm hour\r
+    u8 minute;                  // Alarm minute\r
+};\r
+extern struct alarm sAlarm;\r
+\r
+// *************************************************************************************************\r
+// Extern section\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/logic/altitude.c b/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/logic/altitude.c
new file mode 100755 (executable)
index 0000000..8837ea5
--- /dev/null
@@ -0,0 +1,420 @@
+// *************************************************************************************************\r
+//\r
+//      Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//        Redistribution and use in source and binary forms, with or without\r
+//        modification, are permitted provided that the following conditions\r
+//        are met:\r
+//\r
+//          Redistributions of source code must retain the above copyright\r
+//          notice, this list of conditions and the following disclaimer.\r
+//\r
+//          Redistributions in binary form must reproduce the above copyright\r
+//          notice, this list of conditions and the following disclaimer in the\r
+//          documentation and/or other materials provided with the\r
+//          distribution.\r
+//\r
+//          Neither the name of Texas Instruments Incorporated nor the names of\r
+//          its contributors may be used to endorse or promote products derived\r
+//          from this software without specific prior written permission.\r
+//\r
+//        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+// Altitude measurement functions.\r
+// *************************************************************************************************\r
+\r
+// *************************************************************************************************\r
+// Include section\r
+\r
+// system\r
+#include "project.h"\r
+\r
+// driver\r
+#include "altitude.h"\r
+#include "display.h"\r
+#include "vti_ps.h"\r
+#include "ports.h"\r
+#include "timer.h"\r
+\r
+// logic\r
+#include "user.h"\r
+\r
+// *************************************************************************************************\r
+// Prototypes section\r
+\r
+// *************************************************************************************************\r
+// Defines section\r
+\r
+// *************************************************************************************************\r
+// Global Variable section\r
+struct alt sAlt;\r
+\r
+// *************************************************************************************************\r
+// Extern section\r
+\r
+// Global flag for pressure sensor initialisation status\r
+extern u8 ps_ok;\r
+\r
+// *************************************************************************************************\r
+// @fn          reset_altitude_measurement\r
+// @brief       Reset altitude measurement.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void reset_altitude_measurement(void)\r
+{\r
+    // Menu item is not visible\r
+    sAlt.state = MENU_ITEM_NOT_VISIBLE;\r
+\r
+    // Clear timeout counter\r
+    sAlt.timeout = 0;\r
+\r
+    // Set default altitude value\r
+    sAlt.altitude = 0;\r
+\r
+    // Pressure sensor ok?\r
+    if (ps_ok)\r
+    {\r
+        // Initialise pressure table\r
+        init_pressure_table();\r
+\r
+        // Do single conversion\r
+        start_altitude_measurement();\r
+        stop_altitude_measurement();\r
+\r
+        // Apply calibration offset and recalculate pressure table\r
+        if (sAlt.altitude_offset != 0)\r
+        {\r
+            sAlt.altitude += sAlt.altitude_offset;\r
+            update_pressure_table(sAlt.altitude, sAlt.pressure, sAlt.temperature);\r
+        }\r
+    }\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          conv_m_to_ft\r
+// @brief       Convert meters to feet\r
+// @param       u16 m           Meters\r
+// @return      u16                     Feet\r
+// *************************************************************************************************\r
+s16 convert_m_to_ft(s16 m)\r
+{\r
+    return (((s32) 328 * m) / 100);\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          conv_ft_to_m\r
+// @brief       Convert feet to meters\r
+// @param       u16 ft          Feet\r
+// @return      u16                     Meters\r
+// *************************************************************************************************\r
+s16 convert_ft_to_m(s16 ft)\r
+{\r
+    return (((s32) ft * 61) / 200);\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          is_altitude_measurement\r
+// @brief       Altitude measurement check\r
+// @param       none\r
+// @return      u8              1=Measurement ongoing, 0=measurement off\r
+// *************************************************************************************************\r
+u8 is_altitude_measurement(void)\r
+{\r
+    return ((sAlt.state == MENU_ITEM_VISIBLE) && (sAlt.timeout > 0));\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          start_altitude_measurement\r
+// @brief       Start altitude measurement\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void start_altitude_measurement(void)\r
+{\r
+    // Show warning if pressure sensor was not initialised properly\r
+    if (!ps_ok)\r
+    {\r
+        display_chars(LCD_SEG_L1_2_0, (u8 *) "ERR", SEG_ON);\r
+        return;\r
+    }\r
+\r
+    // Start altitude measurement if timeout has elapsed\r
+    if (sAlt.timeout == 0)\r
+    {\r
+        // Enable DRDY IRQ on rising edge\r
+        PS_INT_IFG &= ~PS_INT_PIN;\r
+        PS_INT_IE |= PS_INT_PIN;\r
+\r
+        // Start pressure sensor\r
+        ps_start();\r
+\r
+        // Set timeout counter only if sensor status was OK\r
+        sAlt.timeout = ALTITUDE_MEASUREMENT_TIMEOUT;\r
+\r
+        // Get updated altitude\r
+        while ((PS_INT_IN & PS_INT_PIN) == 0) ;\r
+        do_altitude_measurement(FILTER_OFF);\r
+    }\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          stop_altitude_measurement\r
+// @brief       Stop altitude measurement\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void stop_altitude_measurement(void)\r
+{\r
+    // Return if pressure sensor was not initialised properly\r
+    if (!ps_ok)\r
+        return;\r
+\r
+    // Stop pressure sensor\r
+    ps_stop();\r
+\r
+    // Disable DRDY IRQ\r
+    PS_INT_IE &= ~PS_INT_PIN;\r
+    PS_INT_IFG &= ~PS_INT_PIN;\r
+\r
+    // Clear timeout counter\r
+    sAlt.timeout = 0;\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          do_altitude_measurement\r
+// @brief       Perform single altitude measurement\r
+// @param       u8 filter       Filter option\r
+// @return      none\r
+// *************************************************************************************************\r
+void do_altitude_measurement(u8 filter)\r
+{\r
+    volatile u32 pressure;\r
+\r
+    // If sensor is not ready, skip data read\r
+    if ((PS_INT_IN & PS_INT_PIN) == 0)\r
+        return;\r
+\r
+    // Get temperature (format is *10 K) from sensor\r
+    sAlt.temperature = ps_get_temp();\r
+\r
+    // Get pressure (format is 1Pa) from sensor\r
+    pressure = ps_get_pa();\r
+\r
+    // Store measured pressure value\r
+    if (filter == FILTER_OFF)   //sAlt.pressure == 0)\r
+    {\r
+        sAlt.pressure = pressure;\r
+    }\r
+    else\r
+    {\r
+        // Filter current pressure\r
+        pressure = (u32) ((pressure * 0.2) + (sAlt.pressure * 0.8));\r
+\r
+        // Store average pressure\r
+        sAlt.pressure = pressure;\r
+    }\r
+\r
+    // Convert pressure (Pa) and temperature (K) to altitude (m)\r
+    sAlt.altitude = conv_pa_to_meter(sAlt.pressure, sAlt.temperature);\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          sx_altitude\r
+// @brief       Altitude direct function.\r
+// @param       u8 line LINE1, LINE2\r
+// @return      none\r
+// *************************************************************************************************\r
+void sx_altitude(u8 line)\r
+{\r
+    // Function can be empty\r
+    // Restarting of altitude measurement will be done by subsequent full display update\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          mx_altitude\r
+// @brief       Mx button handler to set the altitude offset.\r
+// @param       u8 line         LINE1\r
+// @return      none\r
+// *************************************************************************************************\r
+void mx_altitude(u8 line)\r
+{\r
+    s32 altitude;\r
+    s32 limit_high, limit_low;\r
+\r
+    // Clear display\r
+    clear_display_all();\r
+\r
+    // Set lower and upper limits for offset correction\r
+    if (sys.flag.use_metric_units)\r
+    {\r
+        // Display "m" symbol\r
+        display_symbol(LCD_UNIT_L1_M, SEG_ON);\r
+\r
+        // Convert global variable to local variable\r
+        altitude = sAlt.altitude;\r
+\r
+        // Limits for set_value function\r
+        limit_low = -100;\r
+        limit_high = 4000;\r
+    }\r
+    else                        // English units\r
+    {\r
+        // Display "ft" symbol\r
+        display_symbol(LCD_UNIT_L1_FT, SEG_ON);\r
+\r
+        // Convert altitude in meters to feet\r
+        altitude = sAlt.altitude;\r
+\r
+        // Convert from meters to feet\r
+        altitude = convert_m_to_ft(altitude);\r
+\r
+        // Limits for set_value function\r
+        limit_low = -500;\r
+        limit_high = 9999;\r
+    }\r
+\r
+    // Loop values until all are set or user breaks set\r
+    while (1)\r
+    {\r
+        // Idle timeout: exit without saving\r
+        if (sys.flag.idle_timeout)\r
+            break;\r
+\r
+        // Button STAR (short): save, then exit\r
+        if (button.flag.star)\r
+        {\r
+            // When using English units, convert ft back to m before updating pressure table\r
+            if (!sys.flag.use_metric_units)\r
+                altitude = convert_ft_to_m((s16) altitude);\r
+\r
+            // Update pressure table\r
+            update_pressure_table((s16) altitude, sAlt.pressure, sAlt.temperature);\r
+\r
+            // Set display update flag\r
+            display.flag.line1_full_update = 1;\r
+\r
+            break;\r
+        }\r
+\r
+        // Set current altitude - offset is set when leaving function\r
+        set_value(&altitude, 4, 3, limit_low, limit_high, SETVALUE_DISPLAY_VALUE +\r
+                  SETVALUE_FAST_MODE + SETVALUE_DISPLAY_ARROWS, LCD_SEG_L1_3_0,\r
+                  display_value);\r
+    }\r
+\r
+    // Clear button flags\r
+    button.all_flags = 0;\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          display_altitude\r
+// @brief       Display routine. Supports display in meters and feet.\r
+// @param       u8 line                 LINE1\r
+//                              u8 update               DISPLAY_LINE_UPDATE_FULL,\r
+// DISPLAY_LINE_UPDATE_PARTIAL, DISPLAY_LINE_CLEAR\r
+// @return      none\r
+// *************************************************************************************************\r
+void display_altitude(u8 line, u8 update)\r
+{\r
+    u8 *str;\r
+    s16 ft;\r
+\r
+    // redraw whole screen\r
+    if (update == DISPLAY_LINE_UPDATE_FULL)\r
+    {\r
+        // Enable pressure measurement\r
+        sAlt.state = MENU_ITEM_VISIBLE;\r
+\r
+        // Start measurement\r
+        start_altitude_measurement();\r
+\r
+        if (sys.flag.use_metric_units)\r
+        {\r
+            // Display "m" symbol\r
+            display_symbol(LCD_UNIT_L1_M, SEG_ON);\r
+        }\r
+        else\r
+        {\r
+            // Display "ft" symbol\r
+            display_symbol(LCD_UNIT_L1_FT, SEG_ON);\r
+        }\r
+\r
+        // Display altitude\r
+        display_altitude(LINE1, DISPLAY_LINE_UPDATE_PARTIAL);\r
+    }\r
+    else if (update == DISPLAY_LINE_UPDATE_PARTIAL)\r
+    {\r
+        // Update display only while measurement is active\r
+        if (sAlt.timeout > 0)\r
+        {\r
+            if (sys.flag.use_metric_units)\r
+            {\r
+                // Display altitude in xxxx m format, allow 3 leading blank digits\r
+                if (sAlt.altitude >= 0)\r
+                {\r
+                    str = int_to_array(sAlt.altitude, 4, 3);\r
+                    display_symbol(LCD_SYMB_ARROW_UP, SEG_ON);\r
+                    display_symbol(LCD_SYMB_ARROW_DOWN, SEG_OFF);\r
+                }\r
+                else\r
+                {\r
+                    str = int_to_array(sAlt.altitude * (-1), 4, 3);\r
+                    display_symbol(LCD_SYMB_ARROW_UP, SEG_OFF);\r
+                    display_symbol(LCD_SYMB_ARROW_DOWN, SEG_ON);\r
+                }\r
+            }\r
+            else\r
+            {\r
+                // Convert from meters to feet\r
+                ft = convert_m_to_ft(sAlt.altitude);\r
+\r
+                // Limit to 9999ft (3047m)\r
+                if (ft > 9999)\r
+                    ft = 9999;\r
+\r
+                // Display altitude in xxxx ft format, allow 3 leading blank digits\r
+                if (ft >= 0)\r
+                {\r
+                    str = int_to_array(ft, 4, 3);\r
+                    display_symbol(LCD_SYMB_ARROW_UP, SEG_ON);\r
+                    display_symbol(LCD_SYMB_ARROW_DOWN, SEG_OFF);\r
+                }\r
+                else\r
+                {\r
+                    str = int_to_array(ft * (-1), 4, 3);\r
+                    display_symbol(LCD_SYMB_ARROW_UP, SEG_OFF);\r
+                    display_symbol(LCD_SYMB_ARROW_DOWN, SEG_ON);\r
+                }\r
+            }\r
+            display_chars(LCD_SEG_L1_3_0, str, SEG_ON);\r
+        }\r
+    }\r
+    else if (update == DISPLAY_LINE_CLEAR)\r
+    {\r
+        // Disable pressure measurement\r
+        sAlt.state = MENU_ITEM_NOT_VISIBLE;\r
+\r
+        // Stop measurement\r
+        stop_altitude_measurement();\r
+\r
+        // Clean up function-specific segments before leaving function\r
+        display_symbol(LCD_UNIT_L1_M, SEG_OFF);\r
+        display_symbol(LCD_UNIT_L1_FT, SEG_OFF);\r
+        display_symbol(LCD_SYMB_ARROW_UP, SEG_OFF);\r
+        display_symbol(LCD_SYMB_ARROW_DOWN, SEG_OFF);\r
+    }\r
+}\r
+\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/logic/altitude.h b/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/logic/altitude.h
new file mode 100755 (executable)
index 0000000..5778d44
--- /dev/null
@@ -0,0 +1,76 @@
+// *************************************************************************************************\r
+//\r
+//      Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//        Redistribution and use in source and binary forms, with or without\r
+//        modification, are permitted provided that the following conditions\r
+//        are met:\r
+//\r
+//          Redistributions of source code must retain the above copyright\r
+//          notice, this list of conditions and the following disclaimer.\r
+//\r
+//          Redistributions in binary form must reproduce the above copyright\r
+//          notice, this list of conditions and the following disclaimer in the\r
+//          documentation and/or other materials provided with the\r
+//          distribution.\r
+//\r
+//          Neither the name of Texas Instruments Incorporated nor the names of\r
+//          its contributors may be used to endorse or promote products derived\r
+//          from this software without specific prior written permission.\r
+//\r
+//        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+\r
+#ifndef ALTITUDE_H_\r
+#define ALTITUDE_H_\r
+\r
+// *************************************************************************************************\r
+// Include section\r
+\r
+// *************************************************************************************************\r
+// Prototypes section\r
+extern void reset_altitude_measurement(void);\r
+extern u8 is_altitude_measurement(void);\r
+extern void start_altitude_measurement(void);\r
+extern void stop_altitude_measurement(void);\r
+extern void do_altitude_measurement(u8 filter);\r
+\r
+// menu functions\r
+extern void sx_altitude(u8 line);\r
+extern void mx_altitude(u8 line);\r
+extern void display_altitude(u8 line, u8 update);\r
+\r
+// *************************************************************************************************\r
+// Defines section\r
+#define ALTITUDE_MEASUREMENT_TIMEOUT    (60 * 60u) // Stop altitude measurement after 60 minutes to\r
+                                                   // save battery\r
+\r
+// *************************************************************************************************\r
+// Global Variable section\r
+struct alt\r
+{\r
+    menu_t state;                                  // MENU_ITEM_NOT_VISIBLE, MENU_ITEM_VISIBLE\r
+    u32 pressure;                                  // Pressure (Pa)\r
+    u16 temperature;                               // Temperature (K)\r
+    s16 altitude;                                  // Altitude (m)\r
+    s16 altitude_offset;                           // Altitude offset stored during calibration\r
+    u16 timeout;                                   // Timeout\r
+};\r
+extern struct alt sAlt;\r
+\r
+// *************************************************************************************************\r
+// Extern section\r
+\r
+#endif                                             /*ALTITUDE_H_ */\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/logic/battery.c b/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/logic/battery.c
new file mode 100755 (executable)
index 0000000..78e0dcd
--- /dev/null
@@ -0,0 +1,184 @@
+// *************************************************************************************************\r
+//\r
+//      Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//        Redistribution and use in source and binary forms, with or without\r
+//        modification, are permitted provided that the following conditions\r
+//        are met:\r
+//\r
+//          Redistributions of source code must retain the above copyright\r
+//          notice, this list of conditions and the following disclaimer.\r
+//\r
+//          Redistributions in binary form must reproduce the above copyright\r
+//          notice, this list of conditions and the following disclaimer in the\r
+//          documentation and/or other materials provided with the\r
+//          distribution.\r
+//\r
+//          Neither the name of Texas Instruments Incorporated nor the names of\r
+//          its contributors may be used to endorse or promote products derived\r
+//          from this software without specific prior written permission.\r
+//\r
+//        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+// Battery voltage measurement functions.\r
+// *************************************************************************************************\r
+\r
+// *************************************************************************************************\r
+// Include section\r
+\r
+// system\r
+#include "project.h"\r
+\r
+// driver\r
+#include "display.h"\r
+#include "ports.h"\r
+#include "adc12.h"\r
+\r
+// logic\r
+#include "menu.h"\r
+#include "battery.h"\r
+\r
+// *************************************************************************************************\r
+// Prototypes section\r
+void reset_batt_measurement(void);\r
+void battery_measurement(void);\r
+\r
+// *************************************************************************************************\r
+// Defines section\r
+\r
+// *************************************************************************************************\r
+// Global Variable section\r
+struct batt sBatt;\r
+\r
+// *************************************************************************************************\r
+// Extern section\r
+extern void (*fptr_lcd_function_line2)(u8 line, u8 update);\r
+\r
+// *************************************************************************************************\r
+// @fn          reset_temp_measurement\r
+// @brief       Reset temperature measurement module.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void reset_batt_measurement(void)\r
+{\r
+    // Set flag to off\r
+    sBatt.state = MENU_ITEM_NOT_VISIBLE;\r
+\r
+    // Reset lobatt display counter\r
+    sBatt.lobatt_display = BATTERY_LOW_MESSAGE_CYCLE;\r
+\r
+    // Start with battery voltage of 3.00V\r
+    sBatt.voltage = 300;\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          battery_measurement\r
+// @brief       Init ADC12. Do single conversion of AVCC voltage. Turn off ADC12.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void battery_measurement(void)\r
+{\r
+    u16 voltage;\r
+\r
+    // Convert external battery voltage (ADC12INCH_11=AVCC-AVSS/2)\r
+    voltage = adc12_single_conversion(REFVSEL_1, ADC12SHT0_10, ADC12INCH_11);\r
+\r
+    // Convert ADC value to "x.xx V"\r
+    // Ideally we have A11=0->AVCC=0V ... A11=4095(2^12-1)->AVCC=4V\r
+    // --> (A11/4095)*4V=AVCC --> AVCC=(A11*4)/4095\r
+    voltage = (voltage * 2 * 2) / 41;\r
+\r
+    // Correct measured voltage with calibration value\r
+    voltage += sBatt.offset;\r
+\r
+    // Discard values that are clearly outside the measurement range\r
+    if (voltage > BATTERY_HIGH_THRESHOLD)\r
+    {\r
+        voltage = sBatt.voltage;\r
+    }\r
+\r
+    // Filter battery voltage\r
+    sBatt.voltage = ((voltage * 2) + (sBatt.voltage * 8)) / 10;\r
+\r
+    // If battery voltage falls below low battery threshold, set system flag and modify LINE2\r
+    // display function pointer\r
+    if (sBatt.voltage < BATTERY_LOW_THRESHOLD)\r
+    {\r
+        sys.flag.low_battery = 1;\r
+\r
+        // Set sticky battery icon\r
+        display_symbol(LCD_SYMB_BATTERY, SEG_ON);\r
+    }\r
+    else\r
+    {\r
+        sys.flag.low_battery = 0;\r
+\r
+        // Clear sticky battery icon\r
+        display_symbol(LCD_SYMB_BATTERY, SEG_OFF);\r
+    }\r
+    // Update LINE2\r
+    display.flag.line2_full_update = 1;\r
+\r
+    // Indicate to display function that new value is available\r
+    display.flag.update_battery_voltage = 1;\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          display_battery_V\r
+// @brief       Display routine for battery voltage.\r
+// @param       u8 line                 LINE2\r
+//                              u8 update               DISPLAY_LINE_UPDATE_FULL, DISPLAY_LINE_CLEAR\r
+// @return      none\r
+// *************************************************************************************************\r
+void display_battery_V(u8 line, u8 update)\r
+{\r
+    u8 *str;\r
+\r
+    // Redraw line\r
+    if (update == DISPLAY_LINE_UPDATE_FULL)\r
+    {\r
+        // Set battery and V icon\r
+        display_symbol(LCD_SYMB_BATTERY, SEG_ON);\r
+\r
+        // Menu item is visible\r
+        sBatt.state = MENU_ITEM_VISIBLE;\r
+\r
+        // Display result in xx.x format\r
+        str = int_to_array(sBatt.voltage, 3, 0);\r
+\r
+        display_chars(LCD_SEG_L2_2_0, str, SEG_ON);\r
+        display_symbol(LCD_SEG_L2_DP, SEG_ON);\r
+    }\r
+    else if (update == DISPLAY_LINE_UPDATE_PARTIAL)\r
+    {\r
+        // Display result in xx.x format\r
+        str = int_to_array(sBatt.voltage, 3, 0);\r
+\r
+        display_chars(LCD_SEG_L2_2_0, str, SEG_ON);\r
+\r
+        display.flag.update_battery_voltage = 0;\r
+    }\r
+    else if (update == DISPLAY_LINE_CLEAR)\r
+    {\r
+        // Menu item is not visible\r
+        sBatt.state = MENU_ITEM_NOT_VISIBLE;\r
+\r
+        // Clear function-specific symbols\r
+        display_symbol(LCD_SYMB_BATTERY, SEG_OFF);\r
+    }\r
+}\r
+\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/logic/battery.h b/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/logic/battery.h
new file mode 100755 (executable)
index 0000000..baf7608
--- /dev/null
@@ -0,0 +1,78 @@
+// *************************************************************************************************\r
+//\r
+//      Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//        Redistribution and use in source and binary forms, with or without\r
+//        modification, are permitted provided that the following conditions\r
+//        are met:\r
+//\r
+//          Redistributions of source code must retain the above copyright\r
+//          notice, this list of conditions and the following disclaimer.\r
+//\r
+//          Redistributions in binary form must reproduce the above copyright\r
+//          notice, this list of conditions and the following disclaimer in the\r
+//          documentation and/or other materials provided with the\r
+//          distribution.\r
+//\r
+//          Neither the name of Texas Instruments Incorporated nor the names of\r
+//          its contributors may be used to endorse or promote products derived\r
+//          from this software without specific prior written permission.\r
+//\r
+//        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+\r
+#ifndef BATTERY_H_\r
+#define BATTERY_H_\r
+\r
+// *************************************************************************************************\r
+// Include section\r
+\r
+// *************************************************************************************************\r
+// Prototypes section\r
+\r
+// Internal functions\r
+extern void reset_batt_measurement(void);\r
+extern void battery_measurement(void);\r
+\r
+// Menu functions\r
+extern void display_battery_V(u8 line, u8 update);\r
+\r
+// *************************************************************************************************\r
+// Defines section\r
+\r
+// Battery high voltage threshold\r
+#define BATTERY_HIGH_THRESHOLD                  (360u)\r
+\r
+// Battery end of life voltage threshold -> disable radio, show "lobatt" message\r
+#define BATTERY_LOW_THRESHOLD                   (240u)\r
+\r
+// Show "lobatt" message every n seconds\r
+#define BATTERY_LOW_MESSAGE_CYCLE               (15u)\r
+\r
+// *************************************************************************************************\r
+// Global Variable section\r
+struct batt\r
+{\r
+    menu_t state;               // MENU_ITEM_NOT_VISIBLE, MENU_ITEM_VISIBLE\r
+    u8 lobatt_display;          // Counter for alternating "lobatt" display\r
+    u16 voltage;                // Battery voltage\r
+    s16 offset;                 // Battery voltage offset\r
+};\r
+extern struct batt sBatt;\r
+\r
+// *************************************************************************************************\r
+// Extern section\r
+\r
+#endif                          /*BATTERY_H_ */\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/logic/bluerobin.c b/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/logic/bluerobin.c
new file mode 100755 (executable)
index 0000000..38273f2
--- /dev/null
@@ -0,0 +1,705 @@
+// *************************************************************************************************\r
+//\r
+//      Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//        Redistribution and use in source and binary forms, with or without\r
+//        modification, are permitted provided that the following conditions\r
+//        are met:\r
+//\r
+//          Redistributions of source code must retain the above copyright\r
+//          notice, this list of conditions and the following disclaimer.\r
+//\r
+//          Redistributions in binary form must reproduce the above copyright\r
+//          notice, this list of conditions and the following disclaimer in the\r
+//          documentation and/or other materials provided with the\r
+//          distribution.\r
+//\r
+//          Neither the name of Texas Instruments Incorporated nor the names of\r
+//          its contributors may be used to endorse or promote products derived\r
+//          from this software without specific prior written permission.\r
+//\r
+//        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+// BlueRobin functions.\r
+// *************************************************************************************************\r
+\r
+// *************************************************************************************************\r
+// Include section\r
+\r
+// system\r
+#include "project.h"\r
+\r
+// driver\r
+#include "display.h"\r
+#include "radio.h"\r
+#include "ports.h"\r
+#include "timer.h"\r
+#include "rf1a.h"\r
+\r
+// logic\r
+#include "BlueRobin_RX_API.h"\r
+#include "bluerobin.h"\r
+#include "rfsimpliciti.h"\r
+#include "user.h"\r
+\r
+// *************************************************************************************************\r
+// Prototypes section\r
+void display_calories(u8 line, u8 update);\r
+void display_distance(u8 line, u8 update);\r
+\r
+// *************************************************************************************************\r
+// Defines section\r
+\r
+// Set to TRUE if transmitter ID should be remembered when reconnecting\r
+// Transmitter ID can be cleared by pressing button STAR for more than 3 seconds\r
+#define REMEMBER_TX_ID                  (FALSE)\r
+\r
+// *************************************************************************************************\r
+// Global Variable section\r
+struct bluerobin sBlueRobin;\r
+\r
+// Display values for user gender selection\r
+const u8 selection_User_Gender[][4] = { "MALE", "FEMA" };\r
+\r
+// *************************************************************************************************\r
+// Extern section\r
+\r
+// Stop BlueRobin timer\r
+extern void BRRX__StopTimer_v(void);\r
+\r
+// Calibration value for FSCTRL0 register (corrects deviation of 26MHz crystal)\r
+extern u8 rf_frequoffset;\r
+\r
+// *************************************************************************************************\r
+// @fn          reset_bluerobin\r
+// @brief       Reset BlueRobin data.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void reset_bluerobin(void)\r
+{\r
+    // Reset state is no connection\r
+    sBlueRobin.state = BLUEROBIN_OFF;\r
+\r
+    // Reset value of chest strap ID is 0 --> connect to next best chest strap\r
+    sBlueRobin.cs_id = 0;\r
+\r
+    // No new data available\r
+    sBlueRobin.update = BLUEROBIN_NO_UPDATE;\r
+    sBlueRobin.heartrate = 0;\r
+    sBlueRobin.speed = 0;\r
+    sBlueRobin.distance = 0;\r
+    sBlueRobin.calories = 0;\r
+\r
+    // Set user data to default\r
+    sBlueRobin.user_sex = USER_SEX_MALE;\r
+    sBlueRobin.user_weight = 75;\r
+\r
+    // Display calories as default\r
+    sBlueRobin.caldist_view = 0;\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          mx_rfblue\r
+// @brief       BlueRobin sub menu.\r
+//                              Button STAR resets chest strap ID to 0 and searches for next chest\r
+// strap in range.\r
+// @param       u8 line LINE2\r
+// @return      none\r
+// *************************************************************************************************\r
+void mx_bluerobin(u8 line)\r
+{\r
+#if REMEMBER_TX_ID == TRUE\r
+    u8 i;\r
+\r
+    // Reset chest strap ID\r
+    sBlueRobin.cs_id = 0;\r
+\r
+    display_chars(LCD_SEG_L1_2_0, (u8 *) "CLR", SEG_ON);\r
+    for (i = 0; i < 4; i++)\r
+        Timer0_A4_Delay(CONV_MS_TO_TICKS(500));\r
+#endif\r
+\r
+    // Clear simulated button event\r
+    button.all_flags = 0;\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          sx_bluerobin\r
+// @brief       BlueRobin direct function. Button UP connects/disconnects with sender unit.\r
+// @param       u8 line         LINE1\r
+// @return      none\r
+// *************************************************************************************************\r
+void sx_bluerobin(u8 line)\r
+{\r
+    u8 stop = 0;\r
+\r
+    // Exit if battery voltage is too low for radio operation\r
+    if (sys.flag.low_battery)\r
+        return;\r
+\r
+    // Exit if SimpliciTI stack is active\r
+    if (is_rf())\r
+        return;\r
+\r
+    // UP: connect / disconnect transmitter\r
+    if (button.flag.up)\r
+    {\r
+        if (sBlueRobin.state == BLUEROBIN_OFF)\r
+        {\r
+            // Init BlueRobin timer and radio\r
+            open_radio();\r
+\r
+            // Initialize BR library\r
+            BRRX_Init_v();\r
+\r
+            // Set BR data transmission properties\r
+            BRRX_SetPowerdownDelay_v(10); // Power down channel after 10 consecutive lost data\r
+                                          // packets (~9 seconds)\r
+            BRRX_SetSearchTimeout_v(8);   // Stop searching after 8 seconds\r
+\r
+            // Sensitivity in learn mode reduced --> connect only to close transmitters\r
+            // Skip this part if chest strap id was set in a previous learn mode run\r
+#if REMEMBER_TX_ID == TRUE\r
+            if (sBlueRobin.cs_id == 0)\r
+                BRRX_SetSignalLevelReduction_v(5);\r
+\r
+#else\r
+            // Forget previously learned transmitter ID and connect to next close transmitter\r
+            sBlueRobin.cs_id = 0;\r
+            BRRX_SetSignalLevelReduction_v(5);\r
+#endif\r
+\r
+            // Apply frequency offset compensation to radio register FSCTRL0\r
+            // If calibration memory was erased, rf_frequoffset defaults to 0x00 and has no effect\r
+            WriteSingleReg(FSCTRL0, rf_frequoffset);\r
+\r
+            // New state is SEARCH\r
+            sBlueRobin.state = BLUEROBIN_SEARCHING;\r
+\r
+            // Blink RF icon to show searching\r
+            display_symbol(LCD_ICON_BEEPER1, SEG_ON_BLINK_ON);\r
+            display_symbol(LCD_ICON_BEEPER2, SEG_ON_BLINK_ON);\r
+            display_symbol(LCD_ICON_BEEPER3, SEG_ON_BLINK_ON);\r
+\r
+            // Turn on radio and establish connection if channel not already started\r
+            if (BRRX_GetState_t(HR_CHANNEL) == TX_OFF)\r
+            {\r
+                // Start in learn mode (connect to closest heart rate transmitter)\r
+                BRRX_SetID_v(HR_CHANNEL, sBlueRobin.cs_id);\r
+                BRRX_Start_v(HR_CHANNEL);\r
+\r
+                // Wait until learning phase is over\r
+                while (BRRX_GetState_t(HR_CHANNEL) == TX_SEARCH)\r
+                {\r
+                    Timer0_A4_Delay(CONV_MS_TO_TICKS(200));\r
+                }\r
+            }\r
+\r
+            // Check if connection attempt was successful\r
+            if (BRRX_GetState_t(HR_CHANNEL) == TX_ACTIVE)\r
+            {\r
+                // Successfully connected to transmitter\r
+                sBlueRobin.state = BLUEROBIN_CONNECTED;\r
+\r
+                // When in learn mode, copy chest strap ID\r
+                if (sBlueRobin.cs_id == 0)\r
+                {\r
+                    sBlueRobin.cs_id = BRRX_GetID_u32(HR_CHANNEL);\r
+                }\r
+\r
+                // Show steady RF icon to indicate established connection\r
+                display_symbol(LCD_ICON_BEEPER1, SEG_ON_BLINK_OFF);\r
+                display_symbol(LCD_ICON_BEEPER2, SEG_ON_BLINK_OFF);\r
+                display_symbol(LCD_ICON_BEEPER3, SEG_ON_BLINK_OFF);\r
+\r
+                // Show blinking icon\r
+                display_symbol(LCD_ICON_HEART, SEG_ON_BLINK_ON);\r
+            }\r
+            else                // Error -> Shutdown connection\r
+            {\r
+                stop = 1;\r
+            }\r
+        }\r
+        else if (sBlueRobin.state == BLUEROBIN_CONNECTED)\r
+        {\r
+            // Shutdown connection\r
+            stop = 1;\r
+        }\r
+    }\r
+\r
+    // Shutdown connection\r
+    if (stop)\r
+    {\r
+        stop_bluerobin();\r
+    }\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          display_selection_User_Gender\r
+// @brief       Display the configuration for gender in watch\r
+// @param       u8 segments                     LCD segments where value is displayed\r
+//                              u32 value                       Integer value to be displayed\r
+//                              u8 digits                       Number of digits to convert\r
+//                              u8 blanks                       Number of leadings blanks in\r
+// int_to_array result string\r
+// @return      none\r
+// *************************************************************************************************\r
+void display_selection_User_Gender(u8 segments, u32 index, u8 digits, u8 blanks)\r
+{\r
+    if (index < 2)\r
+        display_chars(segments, (u8 *) selection_User_Gender[index], SEG_ON_BLINK_ON);\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          mx_caldist\r
+// @brief       Calories/Distance sub menu. Mx enables setting of total calories, user sex and\r
+// weight.\r
+// @param       u8 line         LINE2\r
+// @return      none\r
+// *************************************************************************************************\r
+void mx_caldist(u8 line)\r
+{\r
+    u8 select;\r
+    s32 kcalories;\r
+    s32 weight;\r
+    s32 sex;\r
+\r
+    // Clear display\r
+    clear_display_all();\r
+\r
+    // Convert global variables to local variables\r
+    sex = sBlueRobin.user_sex;\r
+    kcalories = sBlueRobin.calories / 1000;\r
+    if (sys.flag.use_metric_units)\r
+        weight = sBlueRobin.user_weight;\r
+    else\r
+        weight = ((s32) sBlueRobin.user_weight * 2205) / 1000;  // Convert kg to lb\r
+\r
+    // Init value index\r
+    select = 0;\r
+\r
+    // Loop values until all are set or user breaks set\r
+    while (1)\r
+    {\r
+        // Idle timeout : exit without saving\r
+        if (sys.flag.idle_timeout)\r
+            break;\r
+\r
+        // Button STAR (short): save, then exit\r
+        if (button.flag.star)\r
+        {\r
+            // Store local variables in global structure\r
+            sBlueRobin.calories = kcalories * 1000;\r
+            sBlueRobin.user_sex = sex;\r
+            if (sys.flag.use_metric_units)\r
+                sBlueRobin.user_weight = weight;\r
+            else\r
+                sBlueRobin.user_weight = (weight * 1000) / 2205;\r
+\r
+            // Set display update flag\r
+            display.flag.line1_full_update = 1;\r
+\r
+            break;\r
+        }\r
+\r
+        switch (select)\r
+        {\r
+            case 0:            // Set calories\r
+                display_symbol(LCD_UNIT_L2_KCAL, SEG_ON);\r
+                set_value(&kcalories, 6, 5, 0, 199999, SETVALUE_DISPLAY_VALUE +\r
+                          SETVALUE_FAST_MODE + SETVALUE_NEXT_VALUE, LCD_SEG_L2_5_0,\r
+                          display_value);\r
+                display_symbol(LCD_UNIT_L2_KCAL, SEG_OFF);\r
+                clear_line(LINE2);\r
+                select = 1;\r
+                break;\r
+            case 1:            // Set user sex\r
+                set_value(\r
+                    &sex, 1, 0, 0, 1, SETVALUE_ROLLOVER_VALUE + SETVALUE_DISPLAY_SELECTION +\r
+                    SETVALUE_NEXT_VALUE, LCD_SEG_L2_3_0, display_selection_User_Gender);\r
+                select = 2;\r
+                break;\r
+            case 2:            // Set user weight\r
+                if (sys.flag.use_metric_units)\r
+                {\r
+                    display_chars(LCD_SEG_L2_1_0, (u8 *) "KG", SEG_ON);\r
+                    set_value(&weight, 3, 2, USER_WEIGHT_MIN_KG, USER_WEIGHT_MAX_KG,\r
+                              SETVALUE_DISPLAY_VALUE + SETVALUE_NEXT_VALUE, LCD_SEG_L2_4_2,\r
+                              display_value);\r
+                }\r
+                else\r
+                {\r
+                    display_chars(LCD_SEG_L2_1_0, (u8 *) "LB", SEG_ON);\r
+                    set_value(&weight, 3, 2, USER_WEIGHT_MIN_LB, USER_WEIGHT_MAX_LB,\r
+                              SETVALUE_DISPLAY_VALUE + SETVALUE_NEXT_VALUE, LCD_SEG_L2_4_2,\r
+                              display_value);\r
+                }\r
+                select = 0;\r
+                break;\r
+        }\r
+    }\r
+\r
+    // Clear button flags\r
+    button.all_flags = 0;\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          sx_caldist\r
+// @brief       Button DOWN toggles between calories and distance display.\r
+// @param       u8 line         LINE2\r
+// @return      none\r
+// *************************************************************************************************\r
+void sx_caldist(u8 line)\r
+{\r
+    // Clean up line\r
+    display_caldist(line, DISPLAY_LINE_CLEAR);\r
+\r
+    // Toggle display\r
+    if (sBlueRobin.caldist_view == 0)\r
+        sBlueRobin.caldist_view = 1;\r
+    else\r
+        sBlueRobin.caldist_view = 0;\r
+\r
+    // Draw line\r
+    display_caldist(line, DISPLAY_LINE_UPDATE_FULL);\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          display_heartrate\r
+// @brief       Heart rate display routine.\r
+// @param       u8 line LINE1\r
+//                              u8 update       DISPLAY_LINE_UPDATE_FULL,\r
+// DISPLAY_LINE_UPDATE_PARTIAL, DISPLAY_LINE_CLEAR\r
+// @return      none\r
+// *************************************************************************************************\r
+void display_heartrate(u8 line, u8 update)\r
+{\r
+    u8 *str;\r
+\r
+    if (update != DISPLAY_LINE_CLEAR)\r
+    {\r
+        if (is_bluerobin())\r
+        {\r
+            str = int_to_array(sBlueRobin.heartrate, 3, 2);\r
+            display_chars(LCD_SEG_L1_2_0, str, SEG_ON);\r
+        }\r
+        else\r
+        {\r
+            display_chars(LCD_SEG_L1_2_0, (u8 *) "---", SEG_ON);\r
+        }\r
+    }\r
+\r
+    // Redraw whole screen\r
+    if (!is_bluerobin())\r
+    {\r
+        if (update == DISPLAY_LINE_UPDATE_FULL)\r
+        {\r
+            display_symbol(LCD_ICON_HEART, SEG_ON);\r
+        }\r
+        else if (update == DISPLAY_LINE_CLEAR)\r
+        {\r
+            // Clear heart when not connected\r
+            display_symbol(LCD_ICON_HEART, SEG_OFF);\r
+        }\r
+    }\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          display_speed_kmh\r
+// @brief       Speed display routine. Supports kmh and mph.\r
+// @param       u8 line LINE1\r
+//                              u8 update       DISPLAY_LINE_UPDATE_PARTIAL,\r
+// DISPLAY_LINE_UPDATE_FULL, DISPLAY_LINE_CLEAR\r
+// @return      none\r
+// *************************************************************************************************\r
+void display_speed(u8 line, u8 update)\r
+{\r
+    u8 milesPerHour;\r
+    u8 *str;\r
+\r
+    // Speed resolution is 0.1 km/h\r
+    // Valid range is 0.0 .. 25.0 km/h\r
+\r
+    // Display resolution is 0.1km/h\r
+    // For speed less than 1 km/h, force "0.x" display\r
+    if (update != DISPLAY_LINE_CLEAR)\r
+    {\r
+        if (sys.flag.use_metric_units)\r
+        {\r
+            str = int_to_array(sBlueRobin.speed, 3, 1);\r
+        }\r
+        else\r
+        {\r
+            milesPerHour = (u16) (sBlueRobin.speed * 0.6214);\r
+            str = int_to_array(milesPerHour, 3, 1);\r
+        }\r
+        display_chars(LCD_SEG_L1_2_0, str, SEG_ON);\r
+    }\r
+\r
+    // Redraw whole screen\r
+    if (update == DISPLAY_LINE_UPDATE_FULL)\r
+    {\r
+        display_symbol(LCD_SEG_L1_DP0, SEG_ON);\r
+        if (sys.flag.use_metric_units)\r
+        {\r
+            display_symbol(LCD_UNIT_L1_K, SEG_ON);\r
+            display_symbol(LCD_UNIT_L1_M, SEG_ON);\r
+        }\r
+        else\r
+        {\r
+            display_symbol(LCD_UNIT_L1_M, SEG_ON);\r
+            display_symbol(LCD_UNIT_L1_I, SEG_ON);\r
+        }\r
+        display_symbol(LCD_UNIT_L1_PER_H, SEG_ON);\r
+    }\r
+    else if (update == DISPLAY_LINE_CLEAR)\r
+    {\r
+        display_symbol(LCD_SEG_L1_DP0, SEG_OFF);\r
+        display_symbol(LCD_UNIT_L1_K, SEG_OFF);\r
+        display_symbol(LCD_UNIT_L1_M, SEG_OFF);\r
+        display_symbol(LCD_UNIT_L1_M, SEG_OFF);\r
+        display_symbol(LCD_UNIT_L1_I, SEG_OFF);\r
+        display_symbol(LCD_UNIT_L1_PER_H, SEG_OFF);\r
+    }\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          display_distance\r
+// @brief       Distance display routine. Supports km and mi.\r
+// @param       u8 line         LINE2\r
+//                              u8 update       DISPLAY_LINE_UPDATE_PARTIAL,\r
+// DISPLAY_LINE_UPDATE_FULL, DISPLAY_LINE_CLEAR\r
+// @return      none\r
+// *************************************************************************************************\r
+void display_distance(u8 line, u8 update)\r
+{\r
+    u8 *str;\r
+    u32 miles;\r
+\r
+    if (update != DISPLAY_LINE_CLEAR)\r
+    {\r
+        if (sys.flag.use_metric_units)\r
+        {\r
+            // Display distance in x.xx km format (resolution is 10m) up to 2000.00 km\r
+            if (sBlueRobin.distance < 2000000)\r
+            {\r
+                // Convert decimal distance in meters to format "xxxx.xx" km\r
+                // If distance is less than 1000m, force display to "   0.xx"\r
+                // If distance is less than 100m, force display to "   0.0x"\r
+                str = int_to_array(sBlueRobin.distance / 10, 6, 3);\r
+            }\r
+            else\r
+            {\r
+                str = int_to_array(199999, 6, 3);\r
+            }\r
+        }\r
+        else\r
+        {\r
+            // Convert km to miles, take care for "0.xx mi" display\r
+            miles = (u32) (sBlueRobin.distance * 0.06214);\r
+\r
+            // Display distance in x.xx mi format (resolution is 1/100mi) up to 2000.00 mi\r
+            if (miles < 2000000)\r
+            {\r
+                // If distance is less than 1 mile, force display to "   0.xx"\r
+                // If distance is less than 1/10 mile, force display to "   0.0x"\r
+                str = int_to_array(miles, 6, 3);\r
+            }\r
+            else\r
+            {\r
+                // Display maximum value (1999.99 mi)\r
+                str = int_to_array(199999, 6, 3);\r
+            }\r
+        }\r
+        display_chars(LCD_SEG_L2_5_0, str, SEG_ON);\r
+    }\r
+\r
+    // Redraw whole screen\r
+    if (update == DISPLAY_LINE_UPDATE_FULL)\r
+    {\r
+        if (sys.flag.use_metric_units)\r
+        {\r
+            display_symbol(LCD_UNIT_L2_KM, SEG_ON);\r
+        }\r
+        else\r
+        {\r
+            display_symbol(LCD_UNIT_L2_MI, SEG_ON);\r
+        }\r
+        display_symbol(LCD_SEG_L2_DP, SEG_ON);\r
+    }\r
+    else if (update == DISPLAY_LINE_CLEAR)\r
+    {\r
+        display_symbol(LCD_UNIT_L2_KM, SEG_OFF);\r
+        display_symbol(LCD_UNIT_L2_MI, SEG_OFF);\r
+        display_symbol(LCD_SEG_L2_DP, SEG_OFF);\r
+    }\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          display_caldist\r
+// @brief       Shared calories/distance display routine.\r
+// @param       u8 line LINE2\r
+//                              u8 update       DISPLAY_LINE_UPDATE_PARTIAL,\r
+// DISPLAY_LINE_UPDATE_FULL, DISPLAY_LINE_CLEAR\r
+// @return      none\r
+// *************************************************************************************************\r
+void display_caldist(u8 line, u8 update)\r
+{\r
+    if (sBlueRobin.caldist_view == 0)\r
+        display_calories(line, update);\r
+    else\r
+        display_distance(line, update);\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          display_calories\r
+// @brief       Calories display routine.\r
+// @param       u8 line LINE2\r
+//                              u8 update       DISPLAY_LINE_UPDATE_PARTIAL,\r
+// DISPLAY_LINE_UPDATE_FULL, DISPLAY_LINE_CLEAR\r
+// @return      none\r
+// *************************************************************************************************\r
+void display_calories(u8 line, u8 update)\r
+{\r
+    u8 *str;\r
+\r
+    if (update != DISPLAY_LINE_CLEAR)\r
+    {\r
+        // Convert decimal calories to string\r
+        str = int_to_array(sBlueRobin.calories / 1000, 6, 5);\r
+        display_chars(LCD_SEG_L2_5_0, str, SEG_ON);\r
+    }\r
+\r
+    // Redraw whole screen\r
+    if (update == DISPLAY_LINE_UPDATE_FULL)\r
+    {\r
+        display_symbol(LCD_UNIT_L2_KCAL, SEG_ON);\r
+    }\r
+    else if (update == DISPLAY_LINE_CLEAR)\r
+    {\r
+        // Clean up symbols when leaving function\r
+        display_symbol(LCD_UNIT_L2_KCAL, SEG_OFF);\r
+    }\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          is_bluerobin\r
+// @brief       Returns TRUE if BlueRobin transmitter is connected.\r
+// @param       none\r
+// @return      u8\r
+// *************************************************************************************************\r
+u8 is_bluerobin(void)\r
+{\r
+    return (sBlueRobin.state == BLUEROBIN_CONNECTED);\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          is_bluerobin_searching\r
+// @brief       Returns TRUE if BlueRobin is searching for a transmitter.\r
+// @param       none\r
+// @return      u8\r
+// *************************************************************************************************\r
+u8 is_bluerobin_searching(void)\r
+{\r
+    return (sBlueRobin.state == BLUEROBIN_SEARCHING);\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          get_bluerobin_data\r
+// @brief       Read BlueRobin packet data from API.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void get_bluerobin_data(void)\r
+{\r
+    u16 calories;\r
+    brtx_state_t bChannelState;\r
+\r
+    // Check connection status\r
+    bChannelState = BRRX_GetState_t(HR_CHANNEL);\r
+\r
+    switch (bChannelState)\r
+    {\r
+        case TX_ACTIVE:        // Read heart rate data from BlueRobin API\r
+            sBlueRobin.heartrate = BRRX_GetHeartRate_u8();\r
+\r
+            // Read speed from BlueRobin API (only valid if sender is USB dongle)\r
+            sBlueRobin.speed = BRRX_GetSpeed_u8();\r
+\r
+            // Read distance from BlueRobin API (only valid if sender is USB dongle)\r
+            sBlueRobin.distance = BRRX_GetDistance_u16();\r
+            if (sBlueRobin.distance > 2000000)\r
+                sBlueRobin.distance = 0;\r
+\r
+            // Heart rate high enough for calorie measurement?\r
+            if (sBlueRobin.heartrate >= 65 && sBlueRobin.user_weight != 0)\r
+            {\r
+                calories = ((sBlueRobin.heartrate - 60) * sBlueRobin.user_weight) / 32;\r
+\r
+                // Calorie reduction for female user required?\r
+                if (sBlueRobin.user_sex == USER_SEX_FEMALE)\r
+                {\r
+                    calories -= calories / 4;\r
+                }\r
+\r
+                // Restart from 0 when reaching 199999 kcal\r
+                sBlueRobin.calories += calories;\r
+                if (sBlueRobin.calories > 200000000)\r
+                    sBlueRobin.calories = 0;\r
+            }\r
+            sBlueRobin.update = BLUEROBIN_NEW_DATA;\r
+            break;\r
+\r
+        case TX_OFF:           // Shutdown connection\r
+            stop_bluerobin();\r
+            break;\r
+\r
+        // BR_SEARCH, BR_LEARN, BR_PAUSE: Keep old values until we receive new data\r
+        default:\r
+            break;\r
+    }\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          stop_bluerobin\r
+// @brief       Stop communication and put peripherals in power-down mode.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void stop_bluerobin(void)\r
+{\r
+    // Reset connection status byte\r
+    sBlueRobin.state = BLUEROBIN_OFF;\r
+\r
+    // Stop channel\r
+    BRRX_Stop_v(HR_CHANNEL);\r
+\r
+    // Powerdown radio\r
+    close_radio();\r
+\r
+    // Force full display update to clear heart rate and speed data\r
+    sBlueRobin.heartrate = 0;\r
+    sBlueRobin.speed = 0;\r
+    sBlueRobin.distance = 0;\r
+    display.flag.full_update = 1;\r
+\r
+    // Clear heart and RF symbol\r
+    display_symbol(LCD_ICON_HEART, SEG_OFF_BLINK_OFF);\r
+    display_symbol(LCD_ICON_BEEPER1, SEG_OFF_BLINK_OFF);\r
+    display_symbol(LCD_ICON_BEEPER2, SEG_OFF_BLINK_OFF);\r
+    display_symbol(LCD_ICON_BEEPER3, SEG_OFF_BLINK_OFF);\r
+}\r
+\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/logic/bluerobin.h b/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/logic/bluerobin.h
new file mode 100755 (executable)
index 0000000..b545d11
--- /dev/null
@@ -0,0 +1,107 @@
+// *************************************************************************************************\r
+//\r
+//      Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//        Redistribution and use in source and binary forms, with or without\r
+//        modification, are permitted provided that the following conditions\r
+//        are met:\r
+//\r
+//          Redistributions of source code must retain the above copyright\r
+//          notice, this list of conditions and the following disclaimer.\r
+//\r
+//          Redistributions in binary form must reproduce the above copyright\r
+//          notice, this list of conditions and the following disclaimer in the\r
+//          documentation and/or other materials provided with the\r
+//          distribution.\r
+//\r
+//          Neither the name of Texas Instruments Incorporated nor the names of\r
+//          its contributors may be used to endorse or promote products derived\r
+//          from this software without specific prior written permission.\r
+//\r
+//        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+\r
+#ifndef BLUEROBIN_H_\r
+#define BLUEROBIN_H_\r
+\r
+// *************************************************************************************************\r
+// Include section\r
+#include <project.h>\r
+\r
+// *************************************************************************************************\r
+// Prototypes section\r
+extern void reset_bluerobin(void);\r
+extern void mx_bluerobin(u8 line);\r
+extern void sx_bluerobin(u8 line);\r
+extern void mx_caldist(u8 line);\r
+extern void display_heartrate(u8 line, u8 update);\r
+extern void display_speed(u8 line, u8 update);\r
+extern void sx_caldist(u8 line);\r
+extern void mx_caldist(u8 line);\r
+extern void display_caldist(u8 line, u8 update);\r
+extern u8 is_bluerobin(void);\r
+extern u8 is_bluerobin_searching(void);\r
+extern void get_bluerobin_data(void);\r
+extern void stop_bluerobin(void);\r
+\r
+// *************************************************************************************************\r
+// Defines section\r
+\r
+// BlueRobin connection states\r
+typedef enum\r
+{\r
+    BLUEROBIN_OFF = 0,          // Not connected\r
+    BLUEROBIN_SEARCHING,        // Searching for transmitter\r
+    BLUEROBIN_CONNECTED,        // Connected\r
+    BLUEROBIN_ERROR             // Error occurred while trying to connect or while connected\r
+} BlueRobin_state_t;\r
+\r
+// BlueRobin data update states\r
+typedef enum\r
+{\r
+    BLUEROBIN_NO_UPDATE = 0,    // No new data available\r
+    BLUEROBIN_NEW_DATA          // New data arrived\r
+} BlueRobin_update_t;\r
+\r
+#define USER_SEX_MALE                           0\r
+#define USER_SEX_FEMALE                         1\r
+#define USER_WEIGHT_MIN_KG                      30\r
+#define USER_WEIGHT_MAX_KG                      150\r
+#define USER_WEIGHT_MIN_LB                      70\r
+#define USER_WEIGHT_MAX_LB                      400\r
+\r
+// *************************************************************************************************\r
+// Global Variable section\r
+struct bluerobin\r
+{\r
+    BlueRobin_state_t state;    // BLUEROBIN_OFF, BLUEROBIN_SEARCHING, BLUEROBIN_CONNECTED,\r
+                                // BLUEROBIN_ERROR\r
+    BlueRobin_update_t update;  // BLUEROBIN_NO_UPDATE, BLUEROBIN_NEW_DATA\r
+    u32 cs_id;                  // Chest strap ID\r
+    u8 user_sex;                // User settings\r
+    u16 user_weight;\r
+    u8 heartrate;               // Heart rate (1 bpm)\r
+    u32 calories;               // Calories (1 kCal) - calculated from heart rate, user weight and\r
+                                // user sex\r
+    u8 speed;                   // Speed (0.1 km/h) - demo version range is 0.0 to 25.5km/h\r
+    u32 distance;               // Distance (1 m)\r
+    u8 caldist_view;            // 0=display calories, 1=display distance\r
+};\r
+extern struct bluerobin sBlueRobin;\r
+\r
+// *************************************************************************************************\r
+// Extern section\r
+\r
+#endif                          /*BLUEROBIN_H_ */\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/logic/clock.c b/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/logic/clock.c
new file mode 100755 (executable)
index 0000000..2eef524
--- /dev/null
@@ -0,0 +1,444 @@
+// *************************************************************************************************\r
+//\r
+//      Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//        Redistribution and use in source and binary forms, with or without\r
+//        modification, are permitted provided that the following conditions\r
+//        are met:\r
+//\r
+//          Redistributions of source code must retain the above copyright\r
+//          notice, this list of conditions and the following disclaimer.\r
+//\r
+//          Redistributions in binary form must reproduce the above copyright\r
+//          notice, this list of conditions and the following disclaimer in the\r
+//          documentation and/or other materials provided with the\r
+//          distribution.\r
+//\r
+//          Neither the name of Texas Instruments Incorporated nor the names of\r
+//          its contributors may be used to endorse or promote products derived\r
+//          from this software without specific prior written permission.\r
+//\r
+//        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+// Time functions.\r
+// *************************************************************************************************\r
+\r
+// *************************************************************************************************\r
+// Include section\r
+\r
+// system\r
+#include "project.h"\r
+\r
+// driver\r
+#include "ports.h"\r
+#include "display.h"\r
+#include "timer.h"\r
+\r
+// logic\r
+#include "menu.h"\r
+#include "clock.h"\r
+#include "user.h"\r
+#include "bluerobin.h"\r
+#include "date.h"\r
+\r
+// *************************************************************************************************\r
+// Prototypes section\r
+void reset_clock(void);\r
+void clock_tick(void);\r
+void mx_time(u8 line);\r
+void sx_time(u8 line);\r
+\r
+void calc_24H_to_12H(u8 * hours, u8 * timeAM);\r
+void conv_24H_to_12H(u8 * hours24, u8 * hours12, u8 * timeAMorPM);\r
+\r
+// *************************************************************************************************\r
+// Defines section\r
+\r
+// *************************************************************************************************\r
+// Global Variable section\r
+struct time sTime;\r
+\r
+// Display values for time format selection\r
+const u8 selection_Timeformat[][4] = {\r
+    "24H", "12H"\r
+};\r
+\r
+// *************************************************************************************************\r
+// Extern section\r
+extern void (*fptr_lcd_function_line1)(u8 line, u8 update);\r
+extern void (*fptr_lcd_function_line2)(u8 line, u8 update);\r
+\r
+// *************************************************************************************************\r
+// @fn          reset_clock\r
+// @brief       Resets clock time to 00:00:00, 24H time format.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void reset_clock(void)\r
+{\r
+    // Set global system time to 0\r
+    sTime.system_time = 0;\r
+\r
+    // Set main 24H time to start value\r
+    sTime.hour = 4;\r
+    sTime.minute = 30;\r
+    sTime.second = 0;\r
+\r
+    // Display style of both lines is default (HH:MM)\r
+    sTime.line1ViewStyle = DISPLAY_DEFAULT_VIEW;\r
+\r
+    // Reset timeout detection\r
+    sTime.last_activity = 0;\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          clock_tick\r
+// @brief       Add 1 second to system time and to display time\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void clock_tick(void)\r
+{\r
+    // Use sTime.drawFlag to minimize display updates\r
+    // sTime.drawFlag = 1: second\r
+    // sTime.drawFlag = 2: minute, second\r
+    // sTime.drawFlag = 3: hour, minute\r
+    sTime.drawFlag = 1;\r
+\r
+    // Increase global system time\r
+    sTime.system_time++;\r
+\r
+    // Add 1 second\r
+    sTime.second++;\r
+\r
+    // Add 1 minute\r
+    if (sTime.second == 60)\r
+    {\r
+        sTime.second = 0;\r
+        sTime.minute++;\r
+        sTime.drawFlag++;\r
+\r
+        // Add 1 hour\r
+        if (sTime.minute == 60)\r
+        {\r
+            sTime.minute = 0;\r
+            sTime.hour++;\r
+            sTime.drawFlag++;\r
+\r
+            // Add 1 day\r
+            if (sTime.hour == 24)\r
+            {\r
+                sTime.hour = 0;\r
+                add_day();\r
+            }\r
+        }\r
+    }\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          convert_hour_to_12H_format\r
+// @brief       Convert internal 24H time to 12H time.\r
+// @param       u8 hour         Hour in 24H format\r
+// @return      u8                      Hour in 12H format\r
+// *************************************************************************************************\r
+u8 convert_hour_to_12H_format(u8 hour)\r
+{\r
+    // 00:00 .. 11:59 --> AM 12:00 .. 11:59\r
+    if (hour == 0)\r
+        return (hour + 12);\r
+    else if (hour <= 12)\r
+        return (hour);\r
+    // 13:00 .. 23:59 --> PM 01:00 .. 11:59\r
+    else\r
+        return (hour - 12);\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          is_hour_am\r
+// @brief       Checks if internal 24H time is AM or PM\r
+// @param       u8 hour         Hour in 24H format\r
+// @return      u8                      1 = AM, 0 = PM\r
+// *************************************************************************************************\r
+u8 is_hour_am(u8 hour)\r
+{\r
+    // 00:00 .. 11:59 --> AM 12:00 .. 11:59\r
+    if (hour < 12)\r
+        return (1);\r
+    // 12:00 .. 23:59 --> PM 12:00 .. 11:59\r
+    else\r
+        return (0);\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          display_selection_Timeformat\r
+// @brief       Display time format 12H / 24H.\r
+// @param       u8 segments                     Target segments where to display information\r
+//                              u32 index                       0 or 1, index for value string\r
+//                              u8 digits                       Not used\r
+//                              u8 blanks                       Not used\r
+// @return      none\r
+// *************************************************************************************************\r
+void display_selection_Timeformat1(u8 segments, u32 index, u8 digits, u8 blanks)\r
+{\r
+    if (index < 2)\r
+        display_chars(segments, (u8 *) selection_Timeformat[index], SEG_ON_BLINK_ON);\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          mx_time\r
+// @brief       Clock set routine.\r
+// @param       u8 line         LINE1, LINE2\r
+// @return      none\r
+// *************************************************************************************************\r
+void mx_time(u8 line)\r
+{\r
+    u8 select;\r
+    s32 timeformat;\r
+    s16 timeformat1;\r
+    s32 hours;\r
+    s32 minutes;\r
+    s32 seconds;\r
+    u8 *str;\r
+\r
+    // Clear display\r
+    clear_display_all();\r
+\r
+    // Convert global time to local variables\r
+    // Global time keeps on ticking in background until it is overwritten\r
+    if (sys.flag.use_metric_units)\r
+    {\r
+        timeformat = TIMEFORMAT_24H;\r
+    }\r
+    else\r
+    {\r
+        timeformat = TIMEFORMAT_12H;\r
+    }\r
+    timeformat1 = timeformat;\r
+    hours = sTime.hour;\r
+    minutes = sTime.minute;\r
+    seconds = sTime.second;\r
+\r
+    // Init value index\r
+    select = 0;\r
+\r
+    // Loop values until all are set or user breaks set\r
+    while (1)\r
+    {\r
+        // Idle timeout: exit without saving\r
+        if (sys.flag.idle_timeout)\r
+        {\r
+            // Roll back time format\r
+            if (timeformat1 == TIMEFORMAT_24H)\r
+                sys.flag.use_metric_units = 1;\r
+            else\r
+                sys.flag.use_metric_units = 0;\r
+            display_symbol(LCD_SYMB_AM, SEG_OFF);\r
+            break;\r
+        }\r
+\r
+        // Button STAR (short): save, then exit\r
+        if (button.flag.star)\r
+        {\r
+            // Stop clock timer\r
+            Timer0_Stop();\r
+\r
+            // Store local variables in global clock time\r
+            sTime.hour = hours;\r
+            sTime.minute = minutes;\r
+            sTime.second = seconds;\r
+\r
+            // Start clock timer\r
+            Timer0_Start();\r
+\r
+            // Full display update is done when returning from function\r
+            display_symbol(LCD_SYMB_AM, SEG_OFF);\r
+            break;\r
+        }\r
+\r
+        switch (select)\r
+        {\r
+            case 0:            // Clear LINE1 and LINE2 and AM icon - required when coming back from\r
+                               // set_value(seconds)\r
+                clear_display();\r
+                display_symbol(LCD_SYMB_AM, SEG_OFF);\r
+\r
+                // Set 24H / 12H time format\r
+                set_value(\r
+                    &timeformat, 1, 0, 0, 1, SETVALUE_ROLLOVER_VALUE + SETVALUE_DISPLAY_SELECTION +\r
+                    SETVALUE_NEXT_VALUE, LCD_SEG_L1_3_1, display_selection_Timeformat1);\r
+\r
+                // Modify global time format variable immediately to update AM/PM icon correctly\r
+                if (timeformat == TIMEFORMAT_24H)\r
+                    sys.flag.use_metric_units = 1;\r
+                else\r
+                    sys.flag.use_metric_units = 0;\r
+                select = 1;\r
+                break;\r
+\r
+            case 1:            // Display HH:MM (LINE1) and .SS (LINE2)\r
+                str = int_to_array(hours, 2, 0);\r
+                display_chars(LCD_SEG_L1_3_2, str, SEG_ON);\r
+                display_symbol(LCD_SEG_L1_COL, SEG_ON);\r
+\r
+                str = int_to_array(minutes, 2, 0);\r
+                display_chars(LCD_SEG_L1_1_0, str, SEG_ON);\r
+\r
+                str = int_to_array(seconds, 2, 0);\r
+                display_chars(LCD_SEG_L2_1_0, str, SEG_ON);\r
+                display_symbol(LCD_SEG_L2_DP, SEG_ON);\r
+\r
+                // Set hours\r
+                set_value(&hours, 2, 0, 0, 23, SETVALUE_ROLLOVER_VALUE + SETVALUE_DISPLAY_VALUE +\r
+                          SETVALUE_NEXT_VALUE, LCD_SEG_L1_3_2,\r
+                          display_hours);\r
+                select = 2;\r
+                break;\r
+\r
+            case 2:            // Set minutes\r
+                set_value(&minutes, 2, 0, 0, 59, SETVALUE_ROLLOVER_VALUE + SETVALUE_DISPLAY_VALUE +\r
+                          SETVALUE_NEXT_VALUE, LCD_SEG_L1_1_0,\r
+                          display_value);\r
+                select = 3;\r
+                break;\r
+\r
+            case 3:            // Set seconds\r
+                set_value(&seconds, 2, 0, 0, 59, SETVALUE_ROLLOVER_VALUE + SETVALUE_DISPLAY_VALUE +\r
+                          SETVALUE_NEXT_VALUE, LCD_SEG_L2_1_0,\r
+                          display_value);\r
+                select = 0;\r
+                break;\r
+        }\r
+    }\r
+\r
+    // Clear button flags\r
+    button.all_flags = 0;\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          sx_time\r
+// @brief       Time user routine. Toggles view style between HH:MM and SS.\r
+// @param       line            LINE1\r
+// @return      none\r
+// *************************************************************************************************\r
+void sx_time(u8 line)\r
+{\r
+    // Toggle display view style\r
+    if (sTime.line1ViewStyle == DISPLAY_DEFAULT_VIEW)\r
+        sTime.line1ViewStyle = DISPLAY_ALTERNATIVE_VIEW;\r
+    else\r
+        sTime.line1ViewStyle = DISPLAY_DEFAULT_VIEW;\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          display_time\r
+// @brief       Clock display routine. Supports 24H and 12H time format.\r
+// @param       u8 line                 LINE1\r
+//                              u8 update               DISPLAY_LINE_UPDATE_FULL,\r
+// DISPLAY_LINE_UPDATE_PARTIAL\r
+// @return      none\r
+// *************************************************************************************************\r
+void display_time(u8 line, u8 update)\r
+{\r
+    u8 hour12;\r
+\r
+    // Partial update\r
+    if (update == DISPLAY_LINE_UPDATE_PARTIAL)\r
+    {\r
+        if (sTime.drawFlag != 0)\r
+        {\r
+            if (sTime.line1ViewStyle == DISPLAY_DEFAULT_VIEW)\r
+            {\r
+                switch (sTime.drawFlag)\r
+                {\r
+                    case 3:\r
+                        if (sys.flag.use_metric_units)\r
+                        {\r
+                            // Display 24H time "HH"\r
+                            display_chars(switch_seg(line, LCD_SEG_L1_3_2,\r
+                                                     LCD_SEG_L2_3_2), int_to_array(sTime.hour, 2,\r
+                                                                                   0), SEG_ON);\r
+                        }\r
+                        else\r
+                        {\r
+                            // Display 12H time "HH" + AM/PM\r
+                            hour12 = convert_hour_to_12H_format(sTime.hour);\r
+                            display_chars(switch_seg(line, LCD_SEG_L1_3_2,\r
+                                                     LCD_SEG_L2_3_2), int_to_array(hour12, 2,\r
+                                                                                   0), SEG_ON);\r
+                            display_am_pm_symbol(sTime.hour);\r
+                        }\r
+\r
+                    case 2:\r
+                        display_chars(switch_seg(line, LCD_SEG_L1_1_0,\r
+                                                 LCD_SEG_L2_1_0), int_to_array(sTime.minute, 2,\r
+                                                                               0), SEG_ON);\r
+                }\r
+            }\r
+            else\r
+            {\r
+                // Seconds are always updated\r
+                display_chars(switch_seg(line, LCD_SEG_L1_1_0,\r
+                                         LCD_SEG_L2_1_0), int_to_array(sTime.second, 2, 0), SEG_ON);\r
+            }\r
+        }\r
+    }\r
+    else if (update == DISPLAY_LINE_UPDATE_FULL)\r
+    {\r
+        // Full update\r
+        if (sTime.line1ViewStyle == DISPLAY_DEFAULT_VIEW)\r
+        {\r
+            // Display 24H/12H time\r
+            if (sys.flag.use_metric_units)\r
+            {\r
+                // Display 24H time "HH"\r
+                display_chars(switch_seg(line, LCD_SEG_L1_3_2,\r
+                                         LCD_SEG_L2_3_2), int_to_array(sTime.hour, 2, 0), SEG_ON);\r
+            }\r
+            else\r
+            {\r
+                // Display 12H time "HH" + AM/PM information\r
+                hour12 = convert_hour_to_12H_format(sTime.hour);\r
+                display_chars(switch_seg(line, LCD_SEG_L1_3_2,\r
+                                         LCD_SEG_L2_3_2), int_to_array(hour12, 2, 0), SEG_ON);\r
+                // Display AM/PM information\r
+                if (line == LINE1)\r
+                {\r
+                    display_am_pm_symbol(sTime.hour);\r
+                }\r
+            }\r
+\r
+            // Display minute\r
+            display_chars(switch_seg(line, LCD_SEG_L1_1_0,\r
+                                     LCD_SEG_L2_1_0), int_to_array(sTime.minute, 2, 0), SEG_ON);\r
+            display_symbol(switch_seg(line, LCD_SEG_L1_COL, LCD_SEG_L2_COL0), SEG_ON_BLINK_ON);\r
+        }\r
+        else\r
+        {\r
+            // Display seconds\r
+            display_chars(switch_seg(line, LCD_SEG_L1_1_0,\r
+                                     LCD_SEG_L2_1_0), int_to_array(sTime.second, 2, 0), SEG_ON);\r
+            display_symbol(switch_seg(line, LCD_SEG_L1_DP1, LCD_SEG_L2_DP), SEG_ON);\r
+        }\r
+    }\r
+    else if (update == DISPLAY_LINE_CLEAR)\r
+    {\r
+        display_symbol(switch_seg(line, LCD_SEG_L1_COL, LCD_SEG_L2_COL0), SEG_OFF_BLINK_OFF);\r
+        // Change display style to default (HH:MM)\r
+        sTime.line1ViewStyle = DISPLAY_DEFAULT_VIEW;\r
+        // Clean up AM/PM icon\r
+        display_symbol(LCD_SYMB_AM, SEG_OFF);\r
+    }\r
+}\r
+\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/logic/clock.h b/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/logic/clock.h
new file mode 100755 (executable)
index 0000000..9084b1b
--- /dev/null
@@ -0,0 +1,74 @@
+// *************************************************************************************************\r
+//\r
+//      Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//        Redistribution and use in source and binary forms, with or without\r
+//        modification, are permitted provided that the following conditions\r
+//        are met:\r
+//\r
+//          Redistributions of source code must retain the above copyright\r
+//          notice, this list of conditions and the following disclaimer.\r
+//\r
+//          Redistributions in binary form must reproduce the above copyright\r
+//          notice, this list of conditions and the following disclaimer in the\r
+//          documentation and/or other materials provided with the\r
+//          distribution.\r
+//\r
+//          Neither the name of Texas Instruments Incorporated nor the names of\r
+//          its contributors may be used to endorse or promote products derived\r
+//          from this software without specific prior written permission.\r
+//\r
+//        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+\r
+#ifndef CLOCK_H_\r
+#define CLOCK_H_\r
+\r
+// *************************************************************************************************\r
+// Defines section\r
+\r
+// Definitions for time format\r
+#define TIMEFORMAT_24H          (0u)\r
+#define TIMEFORMAT_12H          (1u)\r
+\r
+// *************************************************************************************************\r
+// Prototypes section\r
+extern void reset_clock(void);\r
+extern void sx_time(u8 line);\r
+extern void mx_time(u8 line);\r
+extern void clock_tick(void);\r
+extern void display_selection_Timeformat1(u8 segments, u32 index, u8 digits, u8 blanks);\r
+extern void display_time(u8 line, u8 update);\r
+\r
+// English units support\r
+extern void calc_24H_to_12H(u8 * hours, u8 * timeAM);\r
+extern u8 convert_hour_to_12H_format(u8 hour);\r
+extern u8 is_hour_am(u8 hour);\r
+\r
+// *************************************************************************************************\r
+// Global Variable section\r
+struct time\r
+{\r
+    u32 system_time;            // Global system time. Used to calculate last activity\r
+    u32 last_activity;          // Inactivity detection (exits set_value() function)\r
+    u8 drawFlag;                // Flag to minimize display updates\r
+    u8 line1ViewStyle;          // Viewing style\r
+    u8 hour;                    // Time data\r
+    u8 minute;                  // Time data\r
+    u8 second;                  // Time data\r
+};\r
+extern struct time sTime;\r
+\r
+#endif                          /*CLOCK_H_ */\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/logic/date.c b/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/logic/date.c
new file mode 100755 (executable)
index 0000000..e72ef3d
--- /dev/null
@@ -0,0 +1,354 @@
+// *************************************************************************************************\r
+//\r
+//      Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//        Redistribution and use in source and binary forms, with or without\r
+//        modification, are permitted provided that the following conditions\r
+//        are met:\r
+//\r
+//          Redistributions of source code must retain the above copyright\r
+//          notice, this list of conditions and the following disclaimer.\r
+//\r
+//          Redistributions in binary form must reproduce the above copyright\r
+//          notice, this list of conditions and the following disclaimer in the\r
+//          documentation and/or other materials provided with the\r
+//          distribution.\r
+//\r
+//          Neither the name of Texas Instruments Incorporated nor the names of\r
+//          its contributors may be used to endorse or promote products derived\r
+//          from this software without specific prior written permission.\r
+//\r
+//        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+// Date functions.\r
+// *************************************************************************************************\r
+\r
+// *************************************************************************************************\r
+// Include section\r
+\r
+// system\r
+#include "project.h"\r
+\r
+// driver\r
+#include "display.h"\r
+#include "ports.h"\r
+\r
+// logic\r
+#include "date.h"\r
+#include "user.h"\r
+\r
+// *************************************************************************************************\r
+// Prototypes section\r
+void reset_date(void);\r
+u8 get_numberOfDays(u8 month, u16 year);\r
+void add_day(void);\r
+void mx_date(u8 line);\r
+void sx_date(u8 line);\r
+void display_date(u8 line, u8 update);\r
+\r
+// *************************************************************************************************\r
+// Defines section\r
+\r
+// *************************************************************************************************\r
+// Global Variable section\r
+struct date sDate;\r
+\r
+// *************************************************************************************************\r
+// Extern section\r
+extern void (*fptr_lcd_function_line1)(u8 line, u8 update);\r
+extern void (*fptr_lcd_function_line2)(u8 line, u8 update);\r
+\r
+// *************************************************************************************************\r
+// @fn          reset_date\r
+// @brief       Reset date to start value.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void reset_date(void)\r
+{\r
+    // Set date\r
+    sDate.year = 2009;\r
+    sDate.month = 8;\r
+    sDate.day = 1;\r
+\r
+    // Show day and month on display\r
+    sDate.display = DISPLAY_DEFAULT_VIEW;\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          get_NumberOfDays\r
+// @brief       Return number of days for a given month\r
+// @param       month           month as char\r
+//                              year            year as int\r
+// @return                              day count for given month\r
+// *************************************************************************************************\r
+u8 get_numberOfDays(u8 month, u16 year)\r
+{\r
+    switch (month)\r
+    {\r
+        case 1:\r
+        case 3:\r
+        case 5:\r
+        case 7:\r
+        case 8:\r
+        case 10:\r
+        case 12:\r
+            return (31);\r
+\r
+        case 4:\r
+        case 6:\r
+        case 9:\r
+        case 11:\r
+            return (30);\r
+\r
+        // 1. A year that is divisible by 4 is a leap year. (Y % 4) == 0\r
+        // 2. Exception to rule 1: a year that is divisible by 100 is not a leap year. (Y % 100) !=\r
+        // 0\r
+        // 3. Exception to rule 2: a year that is divisible by 400 is a leap year. (Y % 400) == 0\r
+\r
+        case 2:\r
+            if ((year % 4 == 0) && ((year % 100 != 0) || (year % 400 == 0)))\r
+                return (29);\r
+            else\r
+                return (28);\r
+\r
+        default:\r
+            return (0);\r
+    }\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          add_day\r
+// @brief       Add one day to current date. Called when clock changes from 23:59 to 00:00\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void add_day(void)\r
+{\r
+    // Add 1 day\r
+    sDate.day++;\r
+\r
+    // Check if day overflows into next month\r
+    if (sDate.day > get_numberOfDays(sDate.month, sDate.year))\r
+    {\r
+        // Add 1 month and reset to day to 1\r
+        sDate.day = 1;\r
+        sDate.month++;\r
+\r
+        // Check if month overflows into next year\r
+        if (sDate.month > 12)\r
+        {\r
+            // Add 1 year and reset month and day to 1\r
+            sDate.day = 1;\r
+            sDate.month = 1;\r
+            sDate.year++;\r
+        }\r
+    }\r
+\r
+    // Indicate to display function that new value is available\r
+    display.flag.full_update = 1;\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          mx_date\r
+// @brief       Date set routine.\r
+// @param       line            LINE1, LINE2\r
+// @return      none\r
+// *************************************************************************************************\r
+void mx_date(u8 line)\r
+{\r
+    u8 select;\r
+    s32 day;\r
+    s32 month;\r
+    s32 year;\r
+    s16 max_days;\r
+    u8 *str;\r
+    u8 *str1;\r
+\r
+    // Clear display\r
+    clear_display_all();\r
+\r
+    // Convert global to local variables\r
+    day = sDate.day;\r
+    month = sDate.month;\r
+    year = sDate.year;\r
+\r
+    // Init value index\r
+    select = 0;\r
+\r
+    // Init display\r
+    // LINE1: DD.MM (metric units) or MM.DD (English units)\r
+    // LINE2: YYYY (will be drawn by set_value)\r
+\r
+    if (sys.flag.use_metric_units)\r
+    {\r
+        str = int_to_array(day, 2, 0);\r
+        display_chars(LCD_SEG_L1_3_2, str, SEG_ON);\r
+\r
+        str1 = int_to_array(month, 2, 0);\r
+        display_chars(LCD_SEG_L1_1_0, str1, SEG_ON);\r
+    }\r
+    else                        // English units\r
+    {\r
+        str = int_to_array(day, 2, 0);\r
+        display_chars(LCD_SEG_L1_1_0, str, SEG_ON);\r
+\r
+        str1 = int_to_array(month, 2, 0);\r
+        display_chars(LCD_SEG_L1_3_2, str1, SEG_ON);\r
+    }\r
+    display_symbol(LCD_SEG_L1_DP1, SEG_ON);\r
+\r
+    // Loop values until all are set or user breaks set\r
+    while (1)\r
+    {\r
+        // Idle timeout: exit without saving\r
+        if (sys.flag.idle_timeout)\r
+            break;\r
+\r
+        // Button STAR (short): save, then exit\r
+        if (button.flag.star)\r
+        {\r
+            // Copy local variables to global variables\r
+            sDate.day = day;\r
+            sDate.month = month;\r
+            sDate.year = year;\r
+\r
+            // Full display update is done when returning from function\r
+            break;\r
+        }\r
+\r
+        switch (select)\r
+        {\r
+            case 0:            // Set year\r
+                set_value(&year, 4, 0, 2008, 2100, SETVALUE_DISPLAY_VALUE + SETVALUE_NEXT_VALUE,\r
+                          LCD_SEG_L2_3_0,\r
+                          display_value);\r
+                select = 1;\r
+                break;\r
+            case 1:            // Set month\r
+                if (sys.flag.use_metric_units)\r
+                {\r
+                    set_value(\r
+                        &month, 2, 0, 1, 12, SETVALUE_ROLLOVER_VALUE + SETVALUE_DISPLAY_VALUE +\r
+                        SETVALUE_NEXT_VALUE, LCD_SEG_L1_1_0, display_value);\r
+                }\r
+                else           // English units\r
+                {\r
+                    set_value(\r
+                        &month, 2, 0, 1, 12, SETVALUE_ROLLOVER_VALUE + SETVALUE_DISPLAY_VALUE +\r
+                        SETVALUE_NEXT_VALUE, LCD_SEG_L1_3_2, display_value);\r
+                }\r
+                select = 2;\r
+                break;\r
+            case 2:            // Set day\r
+                if (sys.flag.use_metric_units)\r
+                {\r
+                    set_value(\r
+                        &day, 2, 0, 1, max_days, SETVALUE_ROLLOVER_VALUE + SETVALUE_DISPLAY_VALUE +\r
+                        SETVALUE_NEXT_VALUE, LCD_SEG_L1_3_2, display_value);\r
+                }\r
+                else           // English units\r
+                {\r
+                    set_value(\r
+                        &day, 2, 0, 1, max_days, SETVALUE_ROLLOVER_VALUE + SETVALUE_DISPLAY_VALUE +\r
+                        SETVALUE_NEXT_VALUE, LCD_SEG_L1_1_0, display_value);\r
+                }\r
+                select = 0;\r
+                break;\r
+        }\r
+\r
+        // Check if day is still valid, if not clamp to last day of current month\r
+        max_days = get_numberOfDays(month, year);\r
+        if (day > max_days)\r
+            day = max_days;\r
+    }\r
+\r
+    // Clear button flag\r
+    button.all_flags = 0;\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          sx_date\r
+// @brief       Date user routine. Toggles view between DD.MM and YYYY.\r
+// @param       line            LINE1, LINE2\r
+// @return      none\r
+// *************************************************************************************************\r
+void sx_date(u8 line)\r
+{\r
+    // Toggle display items\r
+    if (sDate.display == DISPLAY_DEFAULT_VIEW)\r
+        sDate.display = DISPLAY_ALTERNATIVE_VIEW;\r
+    else\r
+        sDate.display = DISPLAY_DEFAULT_VIEW;\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          display_date\r
+// @brief       Display date in DD.MM format (metric units) or MM.DD (English units).\r
+// @param       u8 line                 LINE1, LINE2\r
+//                              u8 update               DISPLAY_LINE_UPDATE_FULL,\r
+// DISPLAY_LINE_UPDATE_PARTIAL\r
+// @return      none\r
+// *************************************************************************************************\r
+void display_date(u8 line, u8 update)\r
+{\r
+    u8 *str;\r
+\r
+    if (update == DISPLAY_LINE_UPDATE_FULL)\r
+    {\r
+        if (sDate.display == DISPLAY_DEFAULT_VIEW)\r
+        {\r
+            // Convert day to string\r
+            str = int_to_array(sDate.day, 2, 0);\r
+            if (sys.flag.use_metric_units)\r
+            {\r
+                display_chars(switch_seg(line, LCD_SEG_L1_3_2, LCD_SEG_L2_3_2), str, SEG_ON);\r
+            }\r
+            else\r
+            {\r
+                display_chars(switch_seg(line, LCD_SEG_L1_1_0, LCD_SEG_L2_1_0), str, SEG_ON);\r
+            }\r
+\r
+            // Convert month to string\r
+            str = int_to_array(sDate.month, 2, 0);\r
+            if (sys.flag.use_metric_units)\r
+            {\r
+                display_chars(switch_seg(line, LCD_SEG_L1_1_0, LCD_SEG_L2_1_0), str, SEG_ON);\r
+            }\r
+            else\r
+            {\r
+                display_chars(switch_seg(line, LCD_SEG_L1_3_2, LCD_SEG_L2_3_2), str, SEG_ON);\r
+            }\r
+\r
+            // Display "." to separate day and month\r
+            display_symbol(switch_seg(line, LCD_SEG_L1_DP1, LCD_SEG_L2_DP), SEG_ON);\r
+        }\r
+        else\r
+        {\r
+            // Convert year to string\r
+            str = int_to_array(sDate.year, 4, 0);\r
+            display_chars(switch_seg(line, LCD_SEG_L1_3_0, LCD_SEG_L2_3_0), str, SEG_ON);\r
+\r
+            // Clear "."\r
+            display_symbol(switch_seg(line, LCD_SEG_L1_DP1, LCD_SEG_L2_DP), SEG_OFF);\r
+        }\r
+    }\r
+    else if (update == DISPLAY_LINE_CLEAR)\r
+    {\r
+        // Show day and month on display when coming around next time\r
+        sDate.display = DISPLAY_DEFAULT_VIEW;\r
+    }\r
+}\r
+\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/logic/date.h b/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/logic/date.h
new file mode 100755 (executable)
index 0000000..f3a65b8
--- /dev/null
@@ -0,0 +1,68 @@
+// *************************************************************************************************\r
+//\r
+//      Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//        Redistribution and use in source and binary forms, with or without\r
+//        modification, are permitted provided that the following conditions\r
+//        are met:\r
+//\r
+//          Redistributions of source code must retain the above copyright\r
+//          notice, this list of conditions and the following disclaimer.\r
+//\r
+//          Redistributions in binary form must reproduce the above copyright\r
+//          notice, this list of conditions and the following disclaimer in the\r
+//          documentation and/or other materials provided with the\r
+//          distribution.\r
+//\r
+//          Neither the name of Texas Instruments Incorporated nor the names of\r
+//          its contributors may be used to endorse or promote products derived\r
+//          from this software without specific prior written permission.\r
+//\r
+//        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+\r
+#ifndef DATE_H_\r
+#define DATE_H_\r
+\r
+// *************************************************************************************************\r
+// Include section\r
+\r
+// *************************************************************************************************\r
+// Prototypes section\r
+extern void reset_date(void);\r
+extern void add_day(void);\r
+extern void mx_date(u8 line);\r
+extern void sx_date(u8 line);\r
+extern void display_date(u8 line, u8 update);\r
+\r
+// *************************************************************************************************\r
+// Defines section\r
+\r
+// *************************************************************************************************\r
+// Global Variable section\r
+struct date\r
+{\r
+    u8 display;                 // Toggles view between DISPLAY_DEFAULT_VIEW = DD.MM and\r
+                                // DISPLAY_ALTERNATIVE_VIEW = YYYY\r
+    u8 day;\r
+    u8 month;\r
+    u16 year;\r
+};\r
+extern struct date sDate;\r
+\r
+// *************************************************************************************************\r
+// Extern section\r
+\r
+#endif                          /*DATE_H_ */\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/logic/menu.c b/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/logic/menu.c
new file mode 100755 (executable)
index 0000000..05a826a
--- /dev/null
@@ -0,0 +1,254 @@
+// *************************************************************************************************\r
+//\r
+//      Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//        Redistribution and use in source and binary forms, with or without\r
+//        modification, are permitted provided that the following conditions\r
+//        are met:\r
+//\r
+//          Redistributions of source code must retain the above copyright\r
+//          notice, this list of conditions and the following disclaimer.\r
+//\r
+//          Redistributions in binary form must reproduce the above copyright\r
+//          notice, this list of conditions and the following disclaimer in the\r
+//          documentation and/or other materials provided with the\r
+//          distribution.\r
+//\r
+//          Neither the name of Texas Instruments Incorporated nor the names of\r
+//          its contributors may be used to endorse or promote products derived\r
+//          from this software without specific prior written permission.\r
+//\r
+//        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+// Menu management functions.\r
+// *************************************************************************************************\r
+\r
+// *************************************************************************************************\r
+// Include section\r
+\r
+// system\r
+#include "project.h"\r
+\r
+// driver\r
+#include "display.h"\r
+\r
+// logic\r
+#include "menu.h"\r
+#include "user.h"\r
+#include "clock.h"\r
+#include "date.h"\r
+#include "alarm.h"\r
+#include "stopwatch.h"\r
+#include "temperature.h"\r
+#include "altitude.h"\r
+#include "battery.h"\r
+#include "bluerobin.h"\r
+#include "rfsimpliciti.h"\r
+#include "acceleration.h"\r
+#include "rfbsl.h"\r
+\r
+// *************************************************************************************************\r
+// Defines section\r
+#define FUNCTION(function)  function\r
+\r
+// *************************************************************************************************\r
+// Global Variable section\r
+const struct menu *ptrMenu_L1 = NULL;\r
+const struct menu *ptrMenu_L2 = NULL;\r
+\r
+// *************************************************************************************************\r
+// Global Variable section\r
+\r
+void display_nothing(u8 line, u8 update)\r
+{\r
+}\r
+\r
+u8 update_time(void)\r
+{\r
+    return (display.flag.update_time);\r
+}\r
+\r
+u8 update_stopwatch(void)\r
+{\r
+    return (display.flag.update_stopwatch);\r
+}\r
+\r
+u8 update_date(void)\r
+{\r
+    return (display.flag.update_date);\r
+}\r
+\r
+u8 update_alarm(void)\r
+{\r
+    return (display.flag.update_alarm);\r
+}\r
+\r
+u8 update_temperature(void)\r
+{\r
+    return (display.flag.update_temperature);\r
+}\r
+\r
+u8 update_battery_voltage(void)\r
+{\r
+    return (display.flag.update_battery_voltage);\r
+}\r
+\r
+u8 update_acceleration(void)\r
+{\r
+    return (display.flag.update_acceleration);\r
+}\r
+\r
+// *************************************************************************************************\r
+// User navigation ( [____] = default menu item after reset )\r
+//\r
+//      LINE1:  [Time] -> Alarm -> Temperature -> Altitude -> Heart rate -> Speed -> Acceleration\r
+//\r
+//      LINE2:  [Date] -> Stopwatch -> Battery  -> ACC -> PPT -> SYNC -> Calories/Distance --> RFBSL\r
+// *************************************************************************************************\r
+\r
+// Line1 - Time\r
+const struct menu menu_L1_Time = {\r
+    FUNCTION(sx_time),                // direct function\r
+    FUNCTION(mx_time),                // sub menu function\r
+    FUNCTION(display_time),           // display function\r
+    FUNCTION(update_time),            // new display data\r
+    &menu_L1_Alarm,\r
+};\r
+\r
+// Line1 - Alarm\r
+const struct menu menu_L1_Alarm = {\r
+    FUNCTION(sx_alarm),               // direct function\r
+    FUNCTION(mx_alarm),               // sub menu function\r
+    FUNCTION(display_alarm),          // display function\r
+    FUNCTION(update_alarm),           // new display data\r
+    &menu_L1_Temperature,\r
+};\r
+\r
+// Line1 - Temperature\r
+const struct menu menu_L1_Temperature = {\r
+    FUNCTION(dummy),                  // direct function\r
+    FUNCTION(mx_temperature),         // sub menu function\r
+    FUNCTION(display_temperature),    // display function\r
+    FUNCTION(update_temperature),     // new display data\r
+    &menu_L1_Altitude,\r
+};\r
+\r
+// Line1 - Altitude\r
+const struct menu menu_L1_Altitude = {\r
+    FUNCTION(sx_altitude),            // direct function\r
+    FUNCTION(mx_altitude),            // sub menu function\r
+    FUNCTION(display_altitude),       // display function\r
+    FUNCTION(update_time),            // new display data\r
+    &menu_L1_Heartrate,\r
+};\r
+\r
+// Line1 - Heart Rate\r
+const struct menu menu_L1_Heartrate = {\r
+    FUNCTION(sx_bluerobin),           // direct function\r
+    FUNCTION(mx_bluerobin),           // sub menu function\r
+    FUNCTION(display_heartrate),      // display function\r
+    FUNCTION(update_time),            // new display data\r
+    &menu_L1_Speed,\r
+};\r
+\r
+// Line1 - Speed\r
+const struct menu menu_L1_Speed = {\r
+    FUNCTION(dummy),                  // direct function\r
+    FUNCTION(dummy),                  // sub menu function\r
+    FUNCTION(display_speed),          // display function\r
+    FUNCTION(update_time),            // new display data\r
+    &menu_L1_Acceleration,\r
+};\r
+\r
+// Line1 - Acceleration\r
+const struct menu menu_L1_Acceleration = {\r
+    FUNCTION(sx_acceleration),        // direct function\r
+    FUNCTION(dummy),                  // sub menu function\r
+    FUNCTION(display_acceleration),   // display function\r
+    FUNCTION(update_acceleration),    // new display data\r
+    &menu_L1_Time,\r
+};\r
+\r
+// Line2 - Date\r
+const struct menu menu_L2_Date = {\r
+    FUNCTION(sx_date),                // direct function\r
+    FUNCTION(mx_date),                // sub menu function\r
+    FUNCTION(display_date),           // display function\r
+    FUNCTION(update_date),            // new display data\r
+    &menu_L2_Stopwatch,\r
+};\r
+\r
+// Line2 - Stopwatch\r
+const struct menu menu_L2_Stopwatch = {\r
+    FUNCTION(sx_stopwatch),           // direct function\r
+    FUNCTION(mx_stopwatch),           // sub menu function\r
+    FUNCTION(display_stopwatch),      // display function\r
+    FUNCTION(update_stopwatch),       // new display data\r
+    &menu_L2_Battery,\r
+};\r
+\r
+// Line2 - Battery\r
+const struct menu menu_L2_Battery = {\r
+    FUNCTION(dummy),                  // direct function\r
+    FUNCTION(dummy),                  // sub menu function\r
+    FUNCTION(display_battery_V),      // display function\r
+    FUNCTION(update_battery_voltage), // new display data\r
+    &menu_L2_Rf,\r
+};\r
+\r
+// Line2 - ACC (acceleration data + button events via SimpliciTI)\r
+const struct menu menu_L2_Rf = {\r
+    FUNCTION(sx_rf),                  // direct function\r
+    FUNCTION(dummy),                  // sub menu function\r
+    FUNCTION(display_rf),             // display function\r
+    FUNCTION(update_time),            // new display data\r
+    &menu_L2_Ppt,\r
+};\r
+\r
+// Line2 - PPT (button events via SimpliciTI)\r
+const struct menu menu_L2_Ppt = {\r
+    FUNCTION(sx_ppt),                 // direct function\r
+    FUNCTION(dummy),                  // sub menu function\r
+    FUNCTION(display_ppt),            // display function\r
+    FUNCTION(update_time),            // new display data\r
+    &menu_L2_Sync,\r
+};\r
+\r
+// Line2 - SXNC (synchronization/data download via SimpliciTI)\r
+const struct menu menu_L2_Sync = {\r
+    FUNCTION(sx_sync),                // direct function\r
+    FUNCTION(dummy),                  // sub menu function\r
+    FUNCTION(display_sync),           // display function\r
+    FUNCTION(update_time),            // new display data\r
+    &menu_L2_CalDist,\r
+};\r
+\r
+// Line2 - Calories/Distance\r
+const struct menu menu_L2_CalDist = {\r
+    FUNCTION(sx_caldist),             // direct function\r
+    FUNCTION(mx_caldist),             // sub menu function\r
+    FUNCTION(display_caldist),        // display function\r
+    FUNCTION(update_time),            // new display data\r
+    &menu_L2_RFBSL,\r
+};\r
+\r
+// Line2 - RFBSL\r
+const struct menu menu_L2_RFBSL = {\r
+    FUNCTION(sx_rfbsl),               // direct function\r
+    FUNCTION(dummy),                  // sub menu function\r
+    FUNCTION(display_rfbsl),          // display function\r
+    FUNCTION(update_time),            // new display data\r
+    &menu_L2_Date,\r
+};\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/logic/menu.h b/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/logic/menu.h
new file mode 100755 (executable)
index 0000000..befb3f6
--- /dev/null
@@ -0,0 +1,92 @@
+// *************************************************************************************************\r
+//\r
+//      Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//        Redistribution and use in source and binary forms, with or without\r
+//        modification, are permitted provided that the following conditions\r
+//        are met:\r
+//\r
+//          Redistributions of source code must retain the above copyright\r
+//          notice, this list of conditions and the following disclaimer.\r
+//\r
+//          Redistributions in binary form must reproduce the above copyright\r
+//          notice, this list of conditions and the following disclaimer in the\r
+//          documentation and/or other materials provided with the\r
+//          distribution.\r
+//\r
+//          Neither the name of Texas Instruments Incorporated nor the names of\r
+//          its contributors may be used to endorse or promote products derived\r
+//          from this software without specific prior written permission.\r
+//\r
+//        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+\r
+#ifndef MENU_H_\r
+#define MENU_H_\r
+\r
+// *************************************************************************************************\r
+// Include section\r
+\r
+// *************************************************************************************************\r
+// Prototypes section\r
+\r
+// *************************************************************************************************\r
+// Defines section\r
+\r
+struct menu\r
+{\r
+    // Pointer to direct function (start, stop etc)\r
+    void (*sx_function)(u8 line);\r
+    // Pointer to sub menu function (change settings, reset counter etc)\r
+    void (*mx_function)(u8 line);\r
+    // Pointer to display function\r
+    void (*display_function)(u8 line, u8 mode);\r
+    // Display update trigger\r
+    u8 (*display_update)(void);\r
+    // Pointer to next menu item\r
+    const struct menu *next;\r
+};\r
+\r
+// *************************************************************************************************\r
+// Global Variable section\r
+\r
+// *************************************************************************************************\r
+// Extern section\r
+\r
+// Line1 navigation\r
+extern const struct menu menu_L1_Time;\r
+extern const struct menu menu_L1_Alarm;\r
+extern const struct menu menu_L1_Altitude;\r
+extern const struct menu menu_L1_Temperature;\r
+extern const struct menu menu_L1_Altitude;\r
+extern const struct menu menu_L1_Heartrate;\r
+extern const struct menu menu_L1_Speed;\r
+extern const struct menu menu_L1_Acceleration;\r
+\r
+// Line2 navigation\r
+extern const struct menu menu_L2_Date;\r
+extern const struct menu menu_L2_Stopwatch;\r
+extern const struct menu menu_L2_Battery;\r
+extern const struct menu menu_L2_Rf;\r
+extern const struct menu menu_L2_Ppt;\r
+extern const struct menu menu_L2_Sync;\r
+extern const struct menu menu_L2_CalDist;\r
+extern const struct menu menu_L2_RFBSL;\r
+\r
+// Pointers to current menu item\r
+extern const struct menu *ptrMenu_L1;\r
+extern const struct menu *ptrMenu_L2;\r
+\r
+#endif                          /*MENU_H_ */\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/logic/rfbsl.c b/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/logic/rfbsl.c
new file mode 100755 (executable)
index 0000000..c32c980
--- /dev/null
@@ -0,0 +1,118 @@
+// *************************************************************************************************\r
+//\r
+//      Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//        Redistribution and use in source and binary forms, with or without\r
+//        modification, are permitted provided that the following conditions\r
+//        are met:\r
+//\r
+//          Redistributions of source code must retain the above copyright\r
+//          notice, this list of conditions and the following disclaimer.\r
+//\r
+//          Redistributions in binary form must reproduce the above copyright\r
+//          notice, this list of conditions and the following disclaimer in the\r
+//          documentation and/or other materials provided with the\r
+//          distribution.\r
+//\r
+//          Neither the name of Texas Instruments Incorporated nor the names of\r
+//          its contributors may be used to endorse or promote products derived\r
+//          from this software without specific prior written permission.\r
+//\r
+//        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+// Wireless Update functions.\r
+// *************************************************************************************************\r
+\r
+\r
+// *************************************************************************************************\r
+// Include section\r
+\r
+// system\r
+#include "project.h"\r
+\r
+// driver\r
+#include "display.h"\r
+#include "ports.h"\r
+\r
+// logic\r
+#include "rfbsl.h"\r
+#include "bluerobin.h"\r
+#include "rfsimpliciti.h"\r
+\r
+// *************************************************************************************************\r
+// Global Variable section\r
+u8 rfBSL_button_confirmation;\r
+\r
+// *************************************************************************************************\r
+// @fn          sx_rfbsl\r
+// @brief       This functions starts the RFBSL\r
+// @param       line            LINE1, LINE2\r
+// @return      none\r
+// *************************************************************************************************\r
+void sx_rfbsl(u8 line)\r
+{\r
+    // Exit if battery voltage is too low for radio operation\r
+    if (sys.flag.low_battery)\r
+        return;\r
+\r
+    // Exit if BlueRobin stack is active\r
+    if (is_bluerobin())\r
+        return;\r
+\r
+    // Exit if SimpliciTI stack is active\r
+    if (is_rf())\r
+        return;\r
+\r
+    rfBSL_button_confirmation++;\r
+\r
+    if (rfBSL_button_confirmation == 2)\r
+    {\r
+        // Before entering RFBSL clear the LINE1 Symbols\r
+        display_symbol(LCD_SYMB_AM, SEG_OFF);\r
+\r
+        clear_line(LINE1);\r
+\r
+        // Write RAM to indicate we will be downloading the RAM Updater first\r
+        display_chars(LCD_SEG_L2_5_0, (u8 *) " RFBSL", SEG_ON);\r
+        display_chars(LCD_SEG_L1_3_0, (u8 *) " RAM", SEG_ON);\r
+\r
+        // Call RFBSL\r
+        CALL_RFSBL();\r
+    }\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          display_rfbsl\r
+// @brief       RFBSL display routine.\r
+// @param       u8 line                 LINE2\r
+//                              u8 update               DISPLAY_LINE_UPDATE_FULL\r
+// @return      none\r
+// *************************************************************************************************\r
+void display_rfbsl(u8 line, u8 update)\r
+{\r
+    if (update == DISPLAY_LINE_UPDATE_FULL)\r
+    {\r
+        if (rfBSL_button_confirmation == 0)\r
+        {\r
+            display_chars(LCD_SEG_L2_5_0, (u8 *) " RFBSL", SEG_ON);\r
+        }\r
+        else if (rfBSL_button_confirmation < 2)\r
+        {\r
+            // Request one more button press to confirm rfBSL call\r
+            display_chars(LCD_SEG_L2_5_0, (u8 *) " CONF", SEG_ON);\r
+        }\r
+    }\r
+}\r
+\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/logic/rfbsl.h b/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/logic/rfbsl.h
new file mode 100755 (executable)
index 0000000..364749f
--- /dev/null
@@ -0,0 +1,55 @@
+// *************************************************************************************************\r
+//\r
+//      Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//        Redistribution and use in source and binary forms, with or without\r
+//        modification, are permitted provided that the following conditions\r
+//        are met:\r
+//\r
+//          Redistributions of source code must retain the above copyright\r
+//          notice, this list of conditions and the following disclaimer.\r
+//\r
+//          Redistributions in binary form must reproduce the above copyright\r
+//          notice, this list of conditions and the following disclaimer in the\r
+//          documentation and/or other materials provided with the\r
+//          distribution.\r
+//\r
+//          Neither the name of Texas Instruments Incorporated nor the names of\r
+//          its contributors may be used to endorse or promote products derived\r
+//          from this software without specific prior written permission.\r
+//\r
+//        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+\r
+#ifndef RFBSL_H_\r
+#define RFBSL_H_\r
+\r
+// *************************************************************************************************\r
+// Prototypes section\r
+extern void sx_rfbsl(u8 line);\r
+extern void display_rfbsl(u8 line, u8 update);\r
+\r
+// *************************************************************************************************\r
+// Defines section\r
+\r
+// Entry point of of the Flash Updater in BSL memory\r
+#define CALL_RFSBL()   ((void (*)()) 0x1000)()\r
+\r
+\r
+// *************************************************************************************************\r
+// Global Variable section\r
+extern u8 rfBSL_button_confirmation;\r
+\r
+#endif                          /*RFBSL_H_ */\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/logic/rfsimpliciti.c b/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/logic/rfsimpliciti.c
new file mode 100755 (executable)
index 0000000..d6ba6a3
--- /dev/null
@@ -0,0 +1,642 @@
+// *************************************************************************************************\r
+//\r
+//      Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//        Redistribution and use in source and binary forms, with or without\r
+//        modification, are permitted provided that the following conditions\r
+//        are met:\r
+//\r
+//          Redistributions of source code must retain the above copyright\r
+//          notice, this list of conditions and the following disclaimer.\r
+//\r
+//          Redistributions in binary form must reproduce the above copyright\r
+//          notice, this list of conditions and the following disclaimer in the\r
+//          documentation and/or other materials provided with the\r
+//          distribution.\r
+//\r
+//          Neither the name of Texas Instruments Incorporated nor the names of\r
+//          its contributors may be used to endorse or promote products derived\r
+//          from this software without specific prior written permission.\r
+//\r
+//        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+// SimpliciTI functions.\r
+// *************************************************************************************************\r
+\r
+// *************************************************************************************************\r
+// Include section\r
+\r
+// system\r
+#include "project.h"\r
+\r
+// driver\r
+#include "display.h"\r
+#include "vti_as.h"\r
+#include "ports.h"\r
+#include "timer.h"\r
+#include "radio.h"\r
+\r
+// logic\r
+#include "acceleration.h"\r
+#include "rfsimpliciti.h"\r
+#include "bluerobin.h"\r
+#include "simpliciti.h"\r
+#include "clock.h"\r
+#include "date.h"\r
+#include "alarm.h"\r
+#include "temperature.h"\r
+#include "vti_ps.h"\r
+#include "altitude.h"\r
+\r
+// *************************************************************************************************\r
+// Prototypes section\r
+void simpliciti_get_data_callback(void);\r
+void start_simpliciti_tx_only(simpliciti_mode_t mode);\r
+void start_simpliciti_sync(void);\r
+\r
+// *************************************************************************************************\r
+// Defines section\r
+\r
+// Each packet index requires 2 bytes, so we can have 9 packet indizes in 18 bytes usable payload\r
+#define BM_SYNC_BURST_PACKETS_IN_DATA           (9u)\r
+\r
+// *************************************************************************************************\r
+// Global Variable section\r
+struct RFsmpl sRFsmpl;\r
+\r
+// flag contains status information, trigger to send data and trigger to exit SimpliciTI\r
+unsigned char simpliciti_flag;\r
+\r
+// 4 data bytes to send\r
+unsigned char simpliciti_data[SIMPLICITI_MAX_PAYLOAD_LENGTH];\r
+\r
+// 4 byte device address overrides SimpliciTI end device address set in "smpl_config.dat"\r
+unsigned char simpliciti_ed_address[4];\r
+\r
+// Length of data\r
+unsigned char simpliciti_payload_length;\r
+\r
+// 1 = send one or more reply packets, 0 = no need to reply\r
+//unsigned char simpliciti_reply;\r
+unsigned char simpliciti_reply_count;\r
+\r
+// 1 = send packets sequentially from burst_start to burst_end, 2 = send packets addressed by their\r
+// index\r
+u8 burst_mode;\r
+\r
+// Start and end index of packets to send out\r
+u16 burst_start, burst_end;\r
+\r
+// Array containing requested packets\r
+u16 burst_packet[BM_SYNC_BURST_PACKETS_IN_DATA];\r
+\r
+// Current packet index\r
+u8 burst_packet_index;\r
+\r
+// *************************************************************************************************\r
+// Extern section\r
+extern void (*fptr_lcd_function_line1)(u8 line, u8 update);\r
+\r
+// *************************************************************************************************\r
+// @fn          reset_rf\r
+// @brief       Reset SimpliciTI data.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void reset_rf(void)\r
+{\r
+    // No connection\r
+    sRFsmpl.mode = SIMPLICITI_OFF;\r
+\r
+    // Standard packets are 4 bytes long\r
+    simpliciti_payload_length = 4;\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          sx_rf\r
+// @brief       Start SimpliciTI. Button DOWN connects/disconnects to access point.\r
+// @param       u8 line         LINE2\r
+// @return      none\r
+// *************************************************************************************************\r
+void sx_rf(u8 line)\r
+{\r
+    // Exit if battery voltage is too low for radio operation\r
+    if (sys.flag.low_battery)\r
+        return;\r
+\r
+    // Exit if BlueRobin stack is active\r
+    if (is_bluerobin())\r
+        return;\r
+\r
+    // Turn off the backlight\r
+    P2OUT &= ~BUTTON_BACKLIGHT_PIN;\r
+    P2DIR &= ~BUTTON_BACKLIGHT_PIN;\r
+\r
+    BUTTONS_IE &= ~BUTTON_BACKLIGHT_PIN;\r
+\r
+    // Start SimpliciTI in tx only mode\r
+    start_simpliciti_tx_only(SIMPLICITI_ACCELERATION);\r
+\r
+    BUTTONS_IE |= BUTTON_BACKLIGHT_PIN;\r
+\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          sx_ppt\r
+// @brief       Start SimpliciTI. Button DOWN connects/disconnects to access point.\r
+// @param       u8 line         LINE2\r
+// @return      none\r
+// *************************************************************************************************\r
+void sx_ppt(u8 line)\r
+{\r
+    // Exit if battery voltage is too low for radio operation\r
+    if (sys.flag.low_battery)\r
+        return;\r
+\r
+    // Exit if BlueRobin stack is active\r
+    if (is_bluerobin())\r
+        return;\r
+\r
+    // Turn off the backlight\r
+    P2OUT &= ~BUTTON_BACKLIGHT_PIN;\r
+    P2DIR &= ~BUTTON_BACKLIGHT_PIN;\r
+\r
+    BUTTONS_IE &= ~BUTTON_BACKLIGHT_PIN;\r
+\r
+    // Start SimpliciTI in tx only mode\r
+    start_simpliciti_tx_only(SIMPLICITI_BUTTONS);\r
+\r
+    BUTTONS_IE |= BUTTON_BACKLIGHT_PIN;\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          sx_sync\r
+// @brief       Start SimpliciTI. Button DOWN connects/disconnects to access point.\r
+// @param       u8 line         LINE2\r
+// @return      none\r
+// *************************************************************************************************\r
+void sx_sync(u8 line)\r
+{\r
+    // Exit if battery voltage is too low for radio operation\r
+    if (sys.flag.low_battery)\r
+        return;\r
+\r
+    // Exit if BlueRobin stack is active\r
+    if (is_bluerobin())\r
+        return;\r
+\r
+    // Turn off the backlight\r
+    P2OUT &= ~BUTTON_BACKLIGHT_PIN;\r
+    P2DIR &= ~BUTTON_BACKLIGHT_PIN;\r
+\r
+    BUTTONS_IE &= ~BUTTON_BACKLIGHT_PIN;\r
+\r
+    // Start SimpliciTI in sync mode\r
+    start_simpliciti_sync();\r
+\r
+    BUTTONS_IE |= BUTTON_BACKLIGHT_PIN;\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          start_simpliciti_tx_only\r
+// @brief       Start SimpliciTI (tx only).\r
+// @param       simpliciti_state_t              SIMPLICITI_ACCELERATION, SIMPLICITI_BUTTONS\r
+// @return      none\r
+// *************************************************************************************************\r
+void start_simpliciti_tx_only(simpliciti_mode_t mode)\r
+{\r
+    // Display time in line 1\r
+    clear_line(LINE1);\r
+    fptr_lcd_function_line1(LINE1, DISPLAY_LINE_CLEAR);\r
+    display_time(LINE1, DISPLAY_LINE_UPDATE_FULL);\r
+\r
+    // Preset simpliciti_data with mode (key or mouse click) and clear other data bytes\r
+    if (mode == SIMPLICITI_ACCELERATION)\r
+    {\r
+        simpliciti_data[0] = SIMPLICITI_MOUSE_EVENTS;\r
+    }\r
+    else\r
+    {\r
+        simpliciti_data[0] = SIMPLICITI_KEY_EVENTS;\r
+    }\r
+    simpliciti_data[1] = 0;\r
+    simpliciti_data[2] = 0;\r
+    simpliciti_data[3] = 0;\r
+\r
+    // Turn on beeper icon to show activity\r
+    display_symbol(LCD_ICON_BEEPER1, SEG_ON_BLINK_ON);\r
+    display_symbol(LCD_ICON_BEEPER2, SEG_ON_BLINK_ON);\r
+    display_symbol(LCD_ICON_BEEPER3, SEG_ON_BLINK_ON);\r
+\r
+    // Debounce button event\r
+    Timer0_A4_Delay(CONV_MS_TO_TICKS(BUTTONS_DEBOUNCE_TIME_OUT));\r
+\r
+    // Prepare radio for RF communication\r
+    open_radio();\r
+\r
+    // Set SimpliciTI mode\r
+    sRFsmpl.mode = mode;\r
+\r
+    // Set SimpliciTI timeout to save battery power\r
+    sRFsmpl.timeout = SIMPLICITI_TIMEOUT;\r
+\r
+    // Start SimpliciTI stack. Try to link to access point.\r
+    // Exit with timeout or by a button DOWN press.\r
+    if (simpliciti_link())\r
+    {\r
+        if (mode == SIMPLICITI_ACCELERATION)\r
+        {\r
+            // Start acceleration sensor\r
+            as_start();\r
+        }\r
+\r
+        // Enter TX only routine. This will transfer button events and/or acceleration data to\r
+        // access point.\r
+        simpliciti_main_tx_only();\r
+    }\r
+\r
+    // Set SimpliciTI state to OFF\r
+    sRFsmpl.mode = SIMPLICITI_OFF;\r
+\r
+    // Stop acceleration sensor\r
+    as_stop();\r
+\r
+    // Powerdown radio\r
+    close_radio();\r
+\r
+    // Clear last button events\r
+    Timer0_A4_Delay(CONV_MS_TO_TICKS(BUTTONS_DEBOUNCE_TIME_OUT));\r
+    BUTTONS_IFG = 0x00;\r
+    button.all_flags = 0;\r
+\r
+    // Clear icons\r
+    display_symbol(LCD_ICON_BEEPER1, SEG_OFF_BLINK_OFF);\r
+    display_symbol(LCD_ICON_BEEPER2, SEG_OFF_BLINK_OFF);\r
+    display_symbol(LCD_ICON_BEEPER3, SEG_OFF_BLINK_OFF);\r
+\r
+    // Clean up line 1\r
+    clear_line(LINE1);\r
+    display_time(LINE1, DISPLAY_LINE_CLEAR);\r
+\r
+    // Force full display update\r
+    display.flag.full_update = 1;\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          display_rf\r
+// @brief       SimpliciTI display routine.\r
+// @param       u8 line                 LINE2\r
+//                              u8 update               DISPLAY_LINE_UPDATE_FULL\r
+// @return      none\r
+// *************************************************************************************************\r
+void display_rf(u8 line, u8 update)\r
+{\r
+    if (update == DISPLAY_LINE_UPDATE_FULL)\r
+    {\r
+        display_chars(LCD_SEG_L2_5_0, (u8 *) "   ACC", SEG_ON);\r
+    }\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          display_ppt\r
+// @brief       SimpliciTI display routine.\r
+// @param       u8 line                 LINE2\r
+//                              u8 update               DISPLAY_LINE_UPDATE_FULL\r
+// @return      none\r
+// *************************************************************************************************\r
+void display_ppt(u8 line, u8 update)\r
+{\r
+    if (update == DISPLAY_LINE_UPDATE_FULL)\r
+    {\r
+        display_chars(LCD_SEG_L2_5_0, (u8 *) "   PPT", SEG_ON);\r
+    }\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          display_sync\r
+// @brief       SimpliciTI display routine.\r
+// @param       u8 line                 LINE2\r
+//                              u8 update               DISPLAY_LINE_UPDATE_FULL\r
+// @return      none\r
+// *************************************************************************************************\r
+void display_sync(u8 line, u8 update)\r
+{\r
+    if (update == DISPLAY_LINE_UPDATE_FULL)\r
+    {\r
+        display_chars(LCD_SEG_L2_5_0, (u8 *) "  SYNC", SEG_ON);\r
+    }\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          is_rf\r
+// @brief       Returns TRUE if SimpliciTI receiver is connected.\r
+// @param       none\r
+// @return      u8\r
+// *************************************************************************************************\r
+u8 is_rf(void)\r
+{\r
+    return (sRFsmpl.mode != SIMPLICITI_OFF);\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          simpliciti_get_ed_data_callback\r
+// @brief       Callback function to read end device data from acceleration sensor (if available)\r
+//                              and trigger sending. Can be also be used to transmit other data at\r
+// different packet rates.\r
+//                              Please observe the applicable duty limit in the chosen ISM band.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void simpliciti_get_ed_data_callback(void)\r
+{\r
+    static u8 packet_counter = 0;\r
+\r
+    if (sRFsmpl.mode == SIMPLICITI_ACCELERATION)\r
+    {\r
+        // Wait for next sample\r
+        Timer0_A4_Delay(CONV_MS_TO_TICKS(5));\r
+\r
+        // Read from sensor if DRDY pin indicates new data (set in PORT2 ISR)\r
+        if (request.flag.acceleration_measurement && ((AS_INT_IN & AS_INT_PIN) == AS_INT_PIN))\r
+        {\r
+            // Clear flag\r
+            request.flag.acceleration_measurement = 0;\r
+\r
+            // Get data from sensor\r
+            as_get_data(sAccel.xyz);\r
+\r
+            // Transmit only every 3rd data set (= 33 packets / second)\r
+            if (packet_counter++ > 1)\r
+            {\r
+                // Reset counter\r
+                packet_counter = 0;\r
+\r
+                // Store XYZ data in SimpliciTI variable\r
+                simpliciti_data[1] = sAccel.xyz[0];\r
+                simpliciti_data[2] = sAccel.xyz[1];\r
+                simpliciti_data[3] = sAccel.xyz[2];\r
+\r
+                // Trigger packet sending\r
+                simpliciti_flag |= SIMPLICITI_TRIGGER_SEND_DATA;\r
+            }\r
+        }\r
+    }\r
+    else                        // transmit only button events\r
+    {\r
+        // New button event is stored in data\r
+        if ((packet_counter == 0) && (simpliciti_data[0] & 0xF0) != 0)\r
+        {\r
+            packet_counter = 5;\r
+        }\r
+\r
+        // Send packet several times\r
+        if (packet_counter > 0)\r
+        {\r
+            // Clear button event when sending last packet\r
+            if (--packet_counter == 0)\r
+            {\r
+                simpliciti_data[0] &= ~0xF0;\r
+            }\r
+            else\r
+            {\r
+                // Trigger packet sending in regular intervals\r
+                Timer0_A4_Delay(CONV_MS_TO_TICKS(30));\r
+                simpliciti_flag |= SIMPLICITI_TRIGGER_SEND_DATA;\r
+            }\r
+        }\r
+        else\r
+        {\r
+            // Wait in LPM3 for next button press\r
+            _BIS_SR(LPM3_bits + GIE);\r
+            __no_operation();\r
+        }\r
+    }\r
+\r
+    // Update clock every 1/1 second\r
+    if (display.flag.update_time)\r
+    {\r
+        display_time(LINE1, DISPLAY_LINE_UPDATE_PARTIAL);\r
+        display.flag.update_time = 0;\r
+\r
+        // Service watchdog\r
+        WDTCTL = WDTPW + WDTIS__512K + WDTSSEL__ACLK + WDTCNTCL;\r
+    }\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          start_simpliciti_sync\r
+// @brief       Start SimpliciTI (sync mode).\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void start_simpliciti_sync(void)\r
+{\r
+    // Clear LINE1\r
+    clear_line(LINE1);\r
+    fptr_lcd_function_line1(LINE1, DISPLAY_LINE_CLEAR);\r
+\r
+    // Stop acceleration sensor\r
+    as_stop();\r
+\r
+    // Get updated altitude\r
+    start_altitude_measurement();\r
+    stop_altitude_measurement();\r
+\r
+    // Get updated temperature\r
+    temperature_measurement(FILTER_OFF);\r
+\r
+    // Turn on beeper icon to show activity\r
+    display_symbol(LCD_ICON_BEEPER1, SEG_ON_BLINK_ON);\r
+    display_symbol(LCD_ICON_BEEPER2, SEG_ON_BLINK_ON);\r
+    display_symbol(LCD_ICON_BEEPER3, SEG_ON_BLINK_ON);\r
+\r
+    // Debounce button event\r
+    Timer0_A4_Delay(CONV_MS_TO_TICKS(BUTTONS_DEBOUNCE_TIME_OUT));\r
+\r
+    // Prepare radio for RF communication\r
+    open_radio();\r
+\r
+    // Set SimpliciTI mode\r
+    sRFsmpl.mode = SIMPLICITI_SYNC;\r
+\r
+    // Set SimpliciTI timeout to save battery power\r
+    sRFsmpl.timeout = SIMPLICITI_TIMEOUT;\r
+\r
+    // Start SimpliciTI stack. Try to link to access point.\r
+    // Exit with timeout or by a button DOWN press.\r
+    if (simpliciti_link())\r
+    {\r
+        // Enter sync routine. This will send ready-to-receive packets at regular intervals to the\r
+        // access point.\r
+        // The access point replies with a command (NOP if no other command is set)\r
+        simpliciti_main_sync();\r
+    }\r
+\r
+    // Set SimpliciTI state to OFF\r
+    sRFsmpl.mode = SIMPLICITI_OFF;\r
+\r
+    // Powerdown radio\r
+    close_radio();\r
+\r
+    // Clear last button events\r
+    Timer0_A4_Delay(CONV_MS_TO_TICKS(BUTTONS_DEBOUNCE_TIME_OUT));\r
+    BUTTONS_IFG = 0x00;\r
+    button.all_flags = 0;\r
+\r
+    // Clear icons\r
+    display_symbol(LCD_ICON_BEEPER1, SEG_OFF_BLINK_OFF);\r
+    display_symbol(LCD_ICON_BEEPER2, SEG_OFF_BLINK_OFF);\r
+    display_symbol(LCD_ICON_BEEPER3, SEG_OFF_BLINK_OFF);\r
+\r
+    // Force full display update\r
+    display.flag.full_update = 1;\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          simpliciti_sync_decode_ap_cmd_callback\r
+// @brief       For SYNC mode only: Decode command from access point and trigger actions.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void simpliciti_sync_decode_ap_cmd_callback(void)\r
+{\r
+    u8 i;\r
+    s16 t1, offset;\r
+\r
+    // Default behaviour is to send no reply packets\r
+    simpliciti_reply_count = 0;\r
+\r
+    switch (simpliciti_data[0])\r
+    {\r
+        case SYNC_AP_CMD_NOP:\r
+            break;\r
+\r
+        case SYNC_AP_CMD_GET_STATUS: // Send watch parameters\r
+            simpliciti_data[0] = SYNC_ED_TYPE_STATUS;\r
+            // Send single reply packet\r
+            simpliciti_reply_count = 1;\r
+            break;\r
+\r
+        case SYNC_AP_CMD_SET_WATCH:  // Set watch parameters\r
+            sys.flag.use_metric_units = (simpliciti_data[1] >> 7) & 0x01;\r
+            sTime.hour = simpliciti_data[1] & 0x7F;\r
+            sTime.minute = simpliciti_data[2];\r
+            sTime.second = simpliciti_data[3];\r
+            sDate.year = (simpliciti_data[4] << 8) + simpliciti_data[5];\r
+            sDate.month = simpliciti_data[6];\r
+            sDate.day = simpliciti_data[7];\r
+            sAlarm.hour = simpliciti_data[8];\r
+            sAlarm.minute = simpliciti_data[9];\r
+            // Set temperature and temperature offset\r
+            t1 = (s16) ((simpliciti_data[10] << 8) + simpliciti_data[11]);\r
+            offset = t1 - (sTemp.degrees - sTemp.offset);\r
+            sTemp.offset = offset;\r
+            sTemp.degrees = t1;\r
+            // Set altitude\r
+            sAlt.altitude = (s16) ((simpliciti_data[12] << 8) + simpliciti_data[13]);\r
+            update_pressure_table(sAlt.altitude, sAlt.pressure, sAlt.temperature);\r
+\r
+            display_chars(LCD_SEG_L2_5_0, (u8 *) "  DONE", SEG_ON);\r
+            sRFsmpl.display_sync_done = 1;\r
+            break;\r
+\r
+        case SYNC_AP_CMD_GET_MEMORY_BLOCKS_MODE_1:\r
+            // Send sequential packets out in a burst\r
+            simpliciti_data[0] = SYNC_ED_TYPE_MEMORY;\r
+            // Get burst start and end packet\r
+            burst_start = (simpliciti_data[1] << 8) + simpliciti_data[2];\r
+            burst_end = (simpliciti_data[3] << 8) + simpliciti_data[4];\r
+            // Set burst mode\r
+            burst_mode = 1;\r
+            // Number of packets to send\r
+            simpliciti_reply_count = burst_end - burst_start;\r
+            break;\r
+\r
+        case SYNC_AP_CMD_GET_MEMORY_BLOCKS_MODE_2:\r
+            // Send specified packets out in a burst\r
+            simpliciti_data[0] = SYNC_ED_TYPE_MEMORY;\r
+            // Store the requested packets\r
+            for (i = 0; i < BM_SYNC_BURST_PACKETS_IN_DATA; i++)\r
+            {\r
+                burst_packet[i] = (simpliciti_data[i * 2 + 1] << 8) + simpliciti_data[i * 2 + 2];\r
+            }\r
+            // Set burst mode\r
+            burst_mode = 2;\r
+            // Number of packets to send\r
+            simpliciti_reply_count = BM_SYNC_BURST_PACKETS_IN_DATA;\r
+            break;\r
+\r
+        case SYNC_AP_CMD_ERASE_MEMORY: // Erase data logger memory\r
+            break;\r
+\r
+        case SYNC_AP_CMD_EXIT:         // Exit sync mode\r
+            simpliciti_flag |= SIMPLICITI_TRIGGER_STOP;\r
+            break;\r
+    }\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          simpliciti_sync_get_data_callback\r
+// @brief       For SYNC mode only: Access point has requested data. Copy this data into the TX\r
+// buffer now.\r
+// @param       u16 index               Index used for memory requests\r
+// @return      none\r
+// *************************************************************************************************\r
+void simpliciti_sync_get_data_callback(unsigned int index)\r
+{\r
+    u8 i;\r
+\r
+    // simpliciti_data[0] contains data type and needs to be returned to AP\r
+    switch (simpliciti_data[0])\r
+    {\r
+        case SYNC_ED_TYPE_STATUS: // Assemble status packet\r
+            simpliciti_data[1] = (sys.flag.use_metric_units << 7) | (sTime.hour & 0x7F);\r
+            simpliciti_data[2] = sTime.minute;\r
+            simpliciti_data[3] = sTime.second;\r
+            simpliciti_data[4] = sDate.year >> 8;\r
+            simpliciti_data[5] = sDate.year & 0xFF;\r
+            simpliciti_data[6] = sDate.month;\r
+            simpliciti_data[7] = sDate.day;\r
+            simpliciti_data[8] = sAlarm.hour;\r
+            simpliciti_data[9] = sAlarm.minute;\r
+            simpliciti_data[10] = sTemp.degrees >> 8;\r
+            simpliciti_data[11] = sTemp.degrees & 0xFF;\r
+            simpliciti_data[12] = sAlt.altitude >> 8;\r
+            simpliciti_data[13] = sAlt.altitude & 0xFF;\r
+            break;\r
+\r
+        case SYNC_ED_TYPE_MEMORY:\r
+            if (burst_mode == 1)\r
+            {\r
+                // Set burst packet address\r
+                simpliciti_data[1] = ((burst_start + index) >> 8) & 0xFF;\r
+                simpliciti_data[2] = (burst_start + index) & 0xFF;\r
+                // Assemble payload\r
+                for (i = 3; i < BM_SYNC_DATA_LENGTH; i++)\r
+                    simpliciti_data[i] = index;\r
+            }\r
+            else if (burst_mode == 2)\r
+            {\r
+                // Set burst packet address\r
+                simpliciti_data[1] = (burst_packet[index] >> 8) & 0xFF;\r
+                simpliciti_data[2] = burst_packet[index] & 0xFF;\r
+                // Assemble payload\r
+                for (i = 3; i < BM_SYNC_DATA_LENGTH; i++)\r
+                    simpliciti_data[i] = index;\r
+            }\r
+            break;\r
+    }\r
+}\r
+\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/logic/rfsimpliciti.h b/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/logic/rfsimpliciti.h
new file mode 100755 (executable)
index 0000000..cd02f41
--- /dev/null
@@ -0,0 +1,98 @@
+// *************************************************************************************************\r
+//\r
+//      Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//        Redistribution and use in source and binary forms, with or without\r
+//        modification, are permitted provided that the following conditions\r
+//        are met:\r
+//\r
+//          Redistributions of source code must retain the above copyright\r
+//          notice, this list of conditions and the following disclaimer.\r
+//\r
+//          Redistributions in binary form must reproduce the above copyright\r
+//          notice, this list of conditions and the following disclaimer in the\r
+//          documentation and/or other materials provided with the\r
+//          distribution.\r
+//\r
+//          Neither the name of Texas Instruments Incorporated nor the names of\r
+//          its contributors may be used to endorse or promote products derived\r
+//          from this software without specific prior written permission.\r
+//\r
+//        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+\r
+#ifndef RFSIMPLICITI_H_\r
+#define RFSIMPLICITI_H_\r
+\r
+// *************************************************************************************************\r
+// Include section\r
+\r
+// *************************************************************************************************\r
+// Prototypes section\r
+extern void reset_rf(void);\r
+extern void sx_rf(u8 line);\r
+extern void sx_ppt(u8 line);\r
+extern void sx_sync(u8 line);\r
+extern void display_rf(u8 line, u8 update);\r
+extern void display_ppt(u8 line, u8 update);\r
+extern void display_sync(u8 line, u8 update);\r
+extern void send_smpl_data(u16 data);\r
+extern u8 is_rf(void);\r
+\r
+// *************************************************************************************************\r
+// Defines section\r
+\r
+// SimpliciTI connection states\r
+typedef enum\r
+{\r
+    SIMPLICITI_OFF = 0,         // Not connected\r
+    SIMPLICITI_ACCELERATION,    // Transmitting acceleration data and button events\r
+    SIMPLICITI_BUTTONS,         // Transmitting button events\r
+    SIMPLICITI_SYNC             // Syncing\r
+} simpliciti_mode_t;\r
+\r
+// Stop SimpliciTI transmission after 60 minutes to save power\r
+#define SIMPLICITI_TIMEOUT                          (60 * 60u)\r
+\r
+// Button flags for SimpliciTI data\r
+#define SIMPLICITI_BUTTON_STAR                  (0x10)\r
+#define SIMPLICITI_BUTTON_NUM                   (0x20)\r
+#define SIMPLICITI_BUTTON_UP                    (0x30)\r
+\r
+// SimpliciTI mode flag\r
+#define SIMPLICITI_MOUSE_EVENTS                 (0x01)\r
+#define SIMPLICITI_KEY_EVENTS                   (0x02)\r
+\r
+// *************************************************************************************************\r
+// Global Variable section\r
+struct RFsmpl\r
+{\r
+    // SIMPLICITI_OFF, SIMPLICITI_ACCELERATION, SIMPLICITI_BUTTONS\r
+    simpliciti_mode_t mode;\r
+\r
+    // Timeout until SimpliciTI transmission is automatically stopped\r
+    u16 timeout;\r
+\r
+    // Variable to display\r
+    u8 display_sync_done;\r
+};\r
+extern struct RFsmpl sRFsmpl;\r
+\r
+extern unsigned char simpliciti_flag;\r
+\r
+// *************************************************************************************************\r
+// Extern section\r
+\r
+#endif                          /*RFSIMPLICITI_H_ */\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/logic/stopwatch.c b/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/logic/stopwatch.c
new file mode 100755 (executable)
index 0000000..ca61932
--- /dev/null
@@ -0,0 +1,443 @@
+// *************************************************************************************************\r
+//\r
+//      Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//        Redistribution and use in source and binary forms, with or without\r
+//        modification, are permitted provided that the following conditions\r
+//        are met:\r
+//\r
+//          Redistributions of source code must retain the above copyright\r
+//          notice, this list of conditions and the following disclaimer.\r
+//\r
+//          Redistributions in binary form must reproduce the above copyright\r
+//          notice, this list of conditions and the following disclaimer in the\r
+//          documentation and/or other materials provided with the\r
+//          distribution.\r
+//\r
+//          Neither the name of Texas Instruments Incorporated nor the names of\r
+//          its contributors may be used to endorse or promote products derived\r
+//          from this software without specific prior written permission.\r
+//\r
+//        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+// Stopwatch functions.\r
+// *************************************************************************************************\r
+\r
+// *************************************************************************************************\r
+// Include section\r
+\r
+// system\r
+#include "project.h"\r
+#include <string.h>\r
+\r
+// driver\r
+#include "stopwatch.h"\r
+#include "ports.h"\r
+#include "display.h"\r
+#include "timer.h"\r
+\r
+// logic\r
+#include "menu.h"\r
+\r
+// *************************************************************************************************\r
+// Prototypes section\r
+void start_stopwatch(void);\r
+void stop_stopwatch(void);\r
+void reset_stopwatch(void);\r
+void stopwatch_tick(void);\r
+void update_stopwatch_timer(void);\r
+void mx_stopwatch(u8 line);\r
+void sx_stopwatch(u8 line);\r
+void display_stopwatch(u8 line, u8 update);\r
+\r
+// *************************************************************************************************\r
+// Defines section\r
+\r
+// *************************************************************************************************\r
+// Global Variable section\r
+struct stopwatch sStopwatch;\r
+\r
+// *************************************************************************************************\r
+// Extern section\r
+\r
+// *************************************************************************************************\r
+// @fn          update_stopwatch_timer\r
+// @brief       Set new compare time for next 1/1Hz or 1/100Hz interrupt. Takes care for exact 1\r
+// second timing.\r
+// @param       ticks (1 tick = 1/32768 sec)\r
+// @return      none\r
+// *************************************************************************************************\r
+void update_stopwatch_timer(void)\r
+{\r
+    u16 value;\r
+\r
+    // Load CCR register with next capture time\r
+    if (sStopwatch.viewStyle == DISPLAY_DEFAULT_VIEW)\r
+    {\r
+        // Timer interrupts occur every 32768/100 = 328 ACLK\r
+        // --> stopwatch runs too slow (1 sec nominal != 100 interupts * 328 ACLK = 32800 ACLK =\r
+        // 1.00098 sec)\r
+        // --> ideally correct timer value every 10 ticks by (32768 - 32800)/10 = 3.2\r
+        // --> correct timer value every 10Hz by 3,\r
+        // --> correct timer value every 1Hz correct by 5\r
+        value = TA0CCR2 + STOPWATCH_100HZ_TICK;\r
+\r
+        if (sStopwatch.swtIs1Hz)\r
+        {\r
+            value -= 5;\r
+            sStopwatch.swtIs1Hz = 0;\r
+            sStopwatch.swtIs10Hz = 0;\r
+        }\r
+        else if (sStopwatch.swtIs10Hz)\r
+        {\r
+            value -= 3;\r
+            sStopwatch.swtIs10Hz = 0;\r
+        }\r
+    }\r
+    else                        // Alternative view\r
+    {\r
+        // Timer interrupts occur every 32768/1 = 32768 ACLK\r
+        value = TA0CCR2 + STOPWATCH_1HZ_TICK;\r
+    }\r
+\r
+    // Update CCR\r
+    TA0CCR2 = value;\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          stopwatch_tick\r
+// @brief       Called by 1/100Hz interrupt handler.\r
+//                              Increases stopwatch counter and triggers display update.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void stopwatch_tick(void)\r
+{\r
+    static u8 delay = 0;\r
+\r
+    // Default view (< 20 minutes): display and count MM:SS:hh\r
+    if (sStopwatch.viewStyle == DISPLAY_DEFAULT_VIEW)\r
+    {\r
+        // Add 1/100 sec\r
+        sStopwatch.time[7]++;\r
+\r
+        // Draw flag minimizes display update activity\r
+        //\r
+        // swt.drawFlag = 1: second L\r
+        // swt.drawFlag = 2: second H/L\r
+        // swt.drawFlag = 3: minutes L, second H/L\r
+        // swt.drawFlag = 4: minutes H/L, second H/L\r
+        // swt.drawFlag = 5: hours L, minutes H/L, second H/L\r
+        // swt.drawFlag = 6: hours H/L, minutes H/L, second H/L\r
+        // swt.drawFlag = 7: 1/10 sec, 1/100 sec\r
+        // swt.drawFlag = 8: 1/100 sec (every 17/100 sec to reduce display draw activity)\r
+        if (delay++ > 17)\r
+        {\r
+            sStopwatch.drawFlag = 8;\r
+            delay = 0;\r
+        }\r
+\r
+        // Add 1/10 sec\r
+        if (sStopwatch.time[7] == 0x3A)\r
+        {\r
+            sStopwatch.time[7] = '0';\r
+            sStopwatch.time[6]++;\r
+\r
+            // 1/10Hz trigger\r
+            sStopwatch.swtIs10Hz = 1;\r
+\r
+            // Update draw flag\r
+            sStopwatch.drawFlag = 7;\r
+        }\r
+    }\r
+    else                        // Alternative view (20 minutes .. 20 hours): display and count\r
+                                // HH:MM:SS\r
+    {\r
+        // Just add 1 second\r
+        sStopwatch.time[6] = 0x3A;\r
+    }\r
+\r
+    // Second overflow?\r
+    if (sStopwatch.time[6] == 0x3A)\r
+    {\r
+        // Reset draw flag\r
+        sStopwatch.drawFlag = 1;\r
+\r
+        // 1Hz trigger\r
+        sStopwatch.swtIs1Hz = 1;\r
+\r
+        // Add data\r
+        sStopwatch.time[6] = '0';\r
+        sStopwatch.time[5]++;                      // second  L (0 - 9)\r
+        if (sStopwatch.time[5] == 0x3A)\r
+        {\r
+            sStopwatch.drawFlag++;                 // 2\r
+            sStopwatch.time[5] = '0';\r
+            sStopwatch.time[4]++;                  // second  H (0 - 5)\r
+            if (sStopwatch.time[4] == '6')\r
+            {\r
+                sStopwatch.drawFlag++;             // 3\r
+                sStopwatch.time[4] = '0';\r
+                sStopwatch.time[3]++;              // minutes L (0 - 9)\r
+                if (sStopwatch.time[3] == 0x3A)\r
+                {\r
+                    sStopwatch.drawFlag++;         // 4\r
+                    sStopwatch.time[3] = '0';\r
+                    sStopwatch.time[2]++;          // minutes H (0 - 5)\r
+                    if (sStopwatch.time[2] == '2')\r
+                    {\r
+                        // SWT display changes from MM:SS:hh to HH:MM:SS when reaching 20 minutes\r
+                        sStopwatch.viewStyle = DISPLAY_ALTERNATIVE_VIEW;\r
+                        display_stopwatch(LINE2, DISPLAY_LINE_UPDATE_FULL);\r
+\r
+                    }\r
+                    else if (sStopwatch.time[2] == '6')\r
+                    {\r
+                        sStopwatch.drawFlag++;     // 5\r
+                        sStopwatch.time[2] = '0';\r
+                        sStopwatch.time[1]++;      // hours L (0-9)\r
+\r
+                        if (sStopwatch.time[1] == 0x3A)\r
+                        {\r
+                            sStopwatch.drawFlag++; // 6\r
+                            sStopwatch.time[1] = '0';\r
+                            sStopwatch.time[0]++;  // hours H (0-1)\r
+\r
+                            if (sStopwatch.time[0] == '2')\r
+                            {\r
+                                // When reaching 20 hours, start over\r
+                                reset_stopwatch();\r
+                                sStopwatch.state = STOPWATCH_RUN;\r
+                                display_stopwatch(LINE2, DISPLAY_LINE_UPDATE_FULL);\r
+                            }\r
+                        }\r
+                    }\r
+                }\r
+            }\r
+        }\r
+    }\r
+\r
+    // Always set display update flag\r
+    display.flag.update_stopwatch = 1;\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          reset_stopwatch\r
+// @brief       Clears stopwatch counter and sets stopwatch state to off.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void reset_stopwatch(void)\r
+{\r
+    // Clear counter\r
+    memcpy(sStopwatch.time, "00000000", sizeof(sStopwatch.time));\r
+\r
+    // Clear trigger\r
+    sStopwatch.swtIs10Hz = 0;   // 1/10Hz trigger\r
+    sStopwatch.swtIs1Hz = 0;    // 1Hz trigger\r
+\r
+    // Init stopwatch state 'Off'\r
+    sStopwatch.state = STOPWATCH_STOP;\r
+\r
+    // Default display style is MM:SS:HH\r
+    sStopwatch.viewStyle = DISPLAY_DEFAULT_VIEW;\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          is_stopwatch\r
+// @brief       Is stopwatch operating and visible?\r
+// @param       none\r
+// @return      1=STOPWATCH_RUN, 0=other states\r
+// *************************************************************************************************\r
+u8 is_stopwatch(void)\r
+{\r
+    return ((sStopwatch.state == STOPWATCH_RUN) && (ptrMenu_L2 == &menu_L2_Stopwatch));\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          start_stopwatch\r
+// @brief       Starts stopwatch timer interrupt and sets stopwatch state to on.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void start_stopwatch(void)\r
+{\r
+    // Set stopwatch run flag\r
+    sStopwatch.state = STOPWATCH_RUN;\r
+\r
+    // Init CCR register with current time\r
+    TA0CCR2 = TA0R;\r
+\r
+    // Load CCR register with next capture time\r
+    update_stopwatch_timer();\r
+\r
+    // Reset IRQ flag\r
+    TA0CCTL2 &= ~CCIFG;\r
+\r
+    // Enable timer interrupt\r
+    TA0CCTL2 |= CCIE;\r
+\r
+    // Set stopwatch icon\r
+    display_symbol(LCD_ICON_STOPWATCH, SEG_ON);\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          stop_stopwatch\r
+// @brief       Stops stopwatch timer interrupt and sets stopwatch state to off.\r
+//                              Does not reset stopwatch count.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void stop_stopwatch(void)\r
+{\r
+    // Clear timer interrupt enable\r
+    TA0CCTL2 &= ~CCIE;\r
+\r
+    // Clear stopwatch run flag\r
+    sStopwatch.state = STOPWATCH_STOP;\r
+\r
+    // Clear stopwatch icon\r
+    display_symbol(LCD_ICON_STOPWATCH, SEG_OFF);\r
+\r
+    // Call draw routine immediately\r
+    display_stopwatch(LINE2, DISPLAY_LINE_UPDATE_FULL);\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          mx_stopwatch\r
+// @brief       Stopwatch set routine. Mx stops stopwatch and resets count.\r
+// @param       u8 line LINE2\r
+// @return      none\r
+// *************************************************************************************************\r
+void mx_stopwatch(u8 line)\r
+{\r
+    // Stop stopwatch\r
+    stop_stopwatch();\r
+\r
+    // Reset stopwatch count\r
+    reset_stopwatch();\r
+\r
+    // Display "00:00:00"\r
+    display_stopwatch(line, DISPLAY_LINE_UPDATE_FULL);\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          sx_stopwatch\r
+// @brief       Stopwatch direct function. Button DOWN starts/stops stopwatch, but does not reset\r
+// count.\r
+// @param       u8 line LINE2\r
+// @return      none\r
+// *************************************************************************************************\r
+void sx_stopwatch(u8 line)\r
+{\r
+    // DOWN: RUN, STOP\r
+    if (button.flag.down)\r
+    {\r
+        if (sStopwatch.state == STOPWATCH_STOP)\r
+        {\r
+            // (Re)start stopwatch\r
+            start_stopwatch();\r
+        }\r
+        else\r
+        {\r
+            // Stop stopwatch\r
+            stop_stopwatch();\r
+        }\r
+\r
+    }\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          display_stopwatch\r
+// @brief       Stopwatch user routine. Sx starts/stops stopwatch, but does not reset count.\r
+// @param       u8 line LINE2\r
+//                              u8 update       DISPLAY_LINE_UPDATE_PARTIAL,\r
+// DISPLAY_LINE_UPDATE_FULL\r
+// @return      none\r
+// *************************************************************************************************\r
+void display_stopwatch(u8 line, u8 update)\r
+{\r
+    // Partial line update only\r
+    if (update == DISPLAY_LINE_UPDATE_PARTIAL)\r
+    {\r
+        if (display.flag.update_stopwatch)\r
+        {\r
+            if (sStopwatch.viewStyle == DISPLAY_DEFAULT_VIEW)\r
+            {\r
+                // Display MM:SS:hh\r
+\r
+                // Check draw flag to minimize workload\r
+                if (sStopwatch.drawFlag != 0)\r
+                {\r
+                    switch (sStopwatch.drawFlag)\r
+                    {\r
+                        case 4:\r
+                            display_char(LCD_SEG_L2_5, sStopwatch.time[2], SEG_ON);\r
+                        case 3:\r
+                            display_char(LCD_SEG_L2_4, sStopwatch.time[3], SEG_ON);\r
+                        case 2:\r
+                            display_char(LCD_SEG_L2_3, sStopwatch.time[4], SEG_ON);\r
+                        case 1:\r
+                            display_char(LCD_SEG_L2_2, sStopwatch.time[5], SEG_ON);\r
+                        case 7:\r
+                            display_char(LCD_SEG_L2_1, sStopwatch.time[6], SEG_ON);\r
+                        case 8:\r
+                            display_char(LCD_SEG_L2_0, sStopwatch.time[7], SEG_ON);\r
+                    }\r
+                }\r
+            }\r
+            else                // DISPLAY_ALTERNATIVE_VIEW\r
+            {\r
+                // Display HH:MM:SS\r
+                switch (sStopwatch.drawFlag)\r
+                {\r
+                    case 6:\r
+                        display_char(LCD_SEG_L2_5, sStopwatch.time[0], SEG_ON);\r
+                    case 5:\r
+                        display_char(LCD_SEG_L2_4, sStopwatch.time[1], SEG_ON);\r
+                    case 4:\r
+                        display_char(LCD_SEG_L2_3, sStopwatch.time[2], SEG_ON);\r
+                    case 3:\r
+                        display_char(LCD_SEG_L2_2, sStopwatch.time[3], SEG_ON);\r
+                    case 2:\r
+                        display_char(LCD_SEG_L2_1, sStopwatch.time[4], SEG_ON);\r
+                    case 1:\r
+                        display_char(LCD_SEG_L2_0, sStopwatch.time[5], SEG_ON);\r
+                }\r
+            }\r
+        }\r
+    }\r
+    // Redraw whole line\r
+    else if (update == DISPLAY_LINE_UPDATE_FULL)\r
+    {\r
+        if (sStopwatch.viewStyle == DISPLAY_DEFAULT_VIEW)\r
+        {\r
+            // Display MM:SS:hh\r
+            display_chars(LCD_SEG_L2_5_0, sStopwatch.time + 2, SEG_ON);\r
+        }\r
+        else                    // DISPLAY_ALTERNATIVE_VIEW\r
+        {\r
+            // Display HH:MM:SS\r
+            display_chars(LCD_SEG_L2_5_0, sStopwatch.time, SEG_ON);\r
+        }\r
+        display_symbol(LCD_SEG_L2_COL1, SEG_ON);\r
+        display_symbol(LCD_SEG_L2_COL0, SEG_ON);\r
+    }\r
+    else if (update == DISPLAY_LINE_CLEAR)\r
+    {\r
+        // Clean up symbols when leaving function\r
+    }\r
+}\r
+\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/logic/stopwatch.h b/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/logic/stopwatch.h
new file mode 100755 (executable)
index 0000000..3676491
--- /dev/null
@@ -0,0 +1,89 @@
+// *************************************************************************************************\r
+//\r
+//      Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//        Redistribution and use in source and binary forms, with or without\r
+//        modification, are permitted provided that the following conditions\r
+//        are met:\r
+//\r
+//          Redistributions of source code must retain the above copyright\r
+//          notice, this list of conditions and the following disclaimer.\r
+//\r
+//          Redistributions in binary form must reproduce the above copyright\r
+//          notice, this list of conditions and the following disclaimer in the\r
+//          documentation and/or other materials provided with the\r
+//          distribution.\r
+//\r
+//          Neither the name of Texas Instruments Incorporated nor the names of\r
+//          its contributors may be used to endorse or promote products derived\r
+//          from this software without specific prior written permission.\r
+//\r
+//        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+\r
+#ifndef STOPWATCH_H_\r
+#define STOPWATCH_H_\r
+\r
+// *************************************************************************************************\r
+// Include section\r
+#include <project.h>\r
+\r
+// *************************************************************************************************\r
+// Prototypes section\r
+extern void start_stopwatch(void);\r
+extern void stop_stopwatch(void);\r
+extern void reset_stopwatch(void);\r
+extern u8 is_stopwatch(void);\r
+extern void stopwatch_tick(void);\r
+extern void update_stopwatch_timer(void);\r
+extern void mx_stopwatch(u8 line);\r
+extern void sx_stopwatch(u8 line);\r
+extern void display_stopwatch(u8 line, u8 update);\r
+\r
+// *************************************************************************************************\r
+// Defines section\r
+#define STOPWATCH_1HZ_TICK                      (32768 / 1)\r
+#define STOPWATCH_100HZ_TICK            (32768 / 100)\r
+#define STOPWATCH_STOP                          (0u)\r
+#define STOPWATCH_RUN                           (1u)\r
+#define STOPWATCH_HIDE                          (2u)\r
+\r
+// *************************************************************************************************\r
+// Global Variable section\r
+struct stopwatch\r
+{\r
+    u8 state;\r
+    u8 drawFlag;\r
+    u8 swtIs1Hz;\r
+    u8 swtIs10Hz;\r
+\r
+    u8 time[8];                 // time[0]      hour H\r
+    // time[1]      hour L\r
+    // time[2]      minute H\r
+    // time[3]      minute L\r
+    // time[4]      second H\r
+    // time[5]      second L\r
+    // time[6]      1/10 sec\r
+    // time[7]      1/100 sec\r
+\r
+    // Display style\r
+    u8 viewStyle;\r
+};\r
+extern struct stopwatch sStopwatch;\r
+\r
+// *************************************************************************************************\r
+// Extern section\r
+\r
+#endif                          /*STOPWATCH_H_ */\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/logic/temperature.c b/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/logic/temperature.c
new file mode 100755 (executable)
index 0000000..8da9472
--- /dev/null
@@ -0,0 +1,332 @@
+// *************************************************************************************************\r
+//\r
+//      Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//        Redistribution and use in source and binary forms, with or without\r
+//        modification, are permitted provided that the following conditions\r
+//        are met:\r
+//\r
+//          Redistributions of source code must retain the above copyright\r
+//          notice, this list of conditions and the following disclaimer.\r
+//\r
+//          Redistributions in binary form must reproduce the above copyright\r
+//          notice, this list of conditions and the following disclaimer in the\r
+//          documentation and/or other materials provided with the\r
+//          distribution.\r
+//\r
+//          Neither the name of Texas Instruments Incorporated nor the names of\r
+//          its contributors may be used to endorse or promote products derived\r
+//          from this software without specific prior written permission.\r
+//\r
+//        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+// Temperature measurement functions.\r
+// *************************************************************************************************\r
+\r
+// *************************************************************************************************\r
+// Include section\r
+\r
+// system\r
+#include "project.h"\r
+\r
+// driver\r
+#include "temperature.h"\r
+#include "ports.h"\r
+#include "display.h"\r
+#include "adc12.h"\r
+#include "timer.h"\r
+\r
+// logic\r
+#include "user.h"\r
+\r
+// *************************************************************************************************\r
+// Prototypes section\r
+u8 is_temp_measurement(void);\r
+s16 convert_C_to_F(s16 value);\r
+s16 convert_F_to_C(s16 value);\r
+\r
+// *************************************************************************************************\r
+// Defines section\r
+\r
+// *************************************************************************************************\r
+// Global Variable section\r
+struct temp sTemp;\r
+\r
+// *************************************************************************************************\r
+// Extern section\r
+\r
+// *************************************************************************************************\r
+// @fn          reset_temp_measurement\r
+// @brief       Reset temperature measurement module.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void reset_temp_measurement(void)\r
+{\r
+    // Set flag to off\r
+    sTemp.state = MENU_ITEM_NOT_VISIBLE;\r
+\r
+    // Perform one temperature measurements with disabled filter\r
+    temperature_measurement(FILTER_OFF);\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          temperature_measurement\r
+// @brief       Init ADC12. Do single conversion of temperature sensor voltage. Turn off ADC12.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void temperature_measurement(u8 filter)\r
+{\r
+    u16 adc_result;\r
+    volatile s32 temperature;\r
+\r
+    // Convert internal temperature diode voltage\r
+    adc_result = adc12_single_conversion(REFVSEL_0, ADC12SHT0_8, ADC12INCH_10);\r
+\r
+    // Convert ADC value to "xx.x °C"\r
+    // Temperature in Celsius\r
+    // ((A10/4096*1500mV) - 680mV)*(1/2.25mV) = (A10/4096*667) - 302\r
+    // = (A10 - 1855) * (667 / 4096)\r
+    temperature = (((s32) ((s32) adc_result - 1855)) * 667 * 10) / 4096;\r
+\r
+    // Add temperature offset\r
+    temperature += sTemp.offset;\r
+\r
+    // Store measured temperature\r
+    if (filter == FILTER_ON)\r
+    {\r
+        // Change temperature in 0.1° steps towards measured value\r
+        if (temperature > sTemp.degrees)\r
+            sTemp.degrees += 1;\r
+        else if (temperature < sTemp.degrees)\r
+            sTemp.degrees -= 1;\r
+    }\r
+    else\r
+    {\r
+        // Override filter\r
+        sTemp.degrees = (s16) temperature;\r
+    }\r
+\r
+    // New data is available --> do display update\r
+    display.flag.update_temperature = 1;\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          convert_C_to_F\r
+// @brief       Convert °C to °F\r
+// @param       s16 value               Temperature in °C\r
+// @return      s16                     Temperature in °F\r
+// *************************************************************************************************\r
+s16 convert_C_to_F(s16 value)\r
+{\r
+    s16 DegF;\r
+\r
+    // Celsius in Fahrenheit = (( TCelsius × 9 ) / 5 ) + 32\r
+    DegF = ((value * 9 * 10) / 5 / 10) + 32 * 10;\r
+\r
+    return (DegF);\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          convert_F_to_C\r
+// @brief       Convert °F to °C\r
+// @param       s16 value               Temperature in 2.1 °F\r
+// @return      s16                     Temperature in 2.1 °C\r
+// *************************************************************************************************\r
+s16 convert_F_to_C(s16 value)\r
+{\r
+    s16 DegC;\r
+\r
+    // TCelsius =( TFahrenheit - 32 ) × 5 / 9\r
+    DegC = (((value - 320) * 5)) / 9;\r
+\r
+    return (DegC);\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          is_temp_measurement\r
+// @brief       Returns TRUE if temperature measurement is enabled.\r
+// @param       none\r
+// @return      u8\r
+// *************************************************************************************************\r
+u8 is_temp_measurement(void)\r
+{\r
+    return (sTemp.state == MENU_ITEM_VISIBLE);\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          mx_temperature\r
+// @brief       Mx button handler to set the temperature offset.\r
+// @param       u8 line         LINE1\r
+// @return      none\r
+// *************************************************************************************************\r
+void mx_temperature(u8 line)\r
+{\r
+    s32 temperature;\r
+    s16 temperature0;\r
+    volatile s16 temperature1;\r
+    volatile s16 offset;\r
+\r
+    // Clear display\r
+    clear_display_all();\r
+\r
+    // When using English units, convert internal °C to °F before handing over value to set_value\r
+    // function\r
+    if (!sys.flag.use_metric_units)\r
+    {\r
+        // Convert global variable to local variable\r
+        temperature = convert_C_to_F(sTemp.degrees);\r
+        temperature0 = sTemp.degrees;\r
+    }\r
+    else\r
+    {\r
+        // Convert global variable to local variable\r
+        temperature = sTemp.degrees;\r
+        temperature0 = temperature;\r
+    }\r
+\r
+    // Loop values until all are set or user breaks set\r
+    while (1)\r
+    {\r
+        // Idle timeout: exit without saving\r
+        if (sys.flag.idle_timeout)\r
+            break;\r
+\r
+        // Button STAR (short): save, then exit\r
+        if (button.flag.star)\r
+        {\r
+            // For English units, convert set °F to °C\r
+            if (!sys.flag.use_metric_units)\r
+            {\r
+                temperature1 = convert_F_to_C(temperature);\r
+            }\r
+            else\r
+            {\r
+                temperature1 = temperature;\r
+            }\r
+\r
+            // New offset is difference between old and new value\r
+            offset = temperature1 - temperature0;\r
+            sTemp.offset += offset;\r
+\r
+            // Force filter to new value\r
+            sTemp.degrees = temperature1;\r
+\r
+            // Set display update flag\r
+            display.flag.line1_full_update = 1;\r
+\r
+            break;\r
+        }\r
+\r
+        // Display °C or °F depending on unit system\r
+        if (sys.flag.use_metric_units)\r
+            display_char(LCD_SEG_L1_0, 'C', SEG_ON);\r
+        else\r
+            display_char(LCD_SEG_L1_0, 'F', SEG_ON);\r
+        display_symbol(LCD_SEG_L1_DP1, SEG_ON);\r
+        display_symbol(LCD_UNIT_L1_DEGREE, SEG_ON);\r
+\r
+        // Set current temperature - offset is set when leaving function\r
+        set_value(&temperature, 3, 1, -999, 999, SETVALUE_DISPLAY_VALUE + SETVALUE_DISPLAY_ARROWS,\r
+                  LCD_SEG_L1_3_1,\r
+                  display_value);\r
+    }\r
+\r
+    // Clear button flags\r
+    button.all_flags = 0;\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          display_temperature\r
+// @brief       Common display routine for metric and English units.\r
+// @param       u8 line                 LINE1\r
+//                              u8 update               DISPLAY_LINE_UPDATE_FULL, DISPLAY_LINE_CLEAR\r
+// @return      none\r
+// *************************************************************************************************\r
+void display_temperature(u8 line, u8 update)\r
+{\r
+    u8 *str;\r
+    s16 temperature;\r
+\r
+    // Redraw whole screen\r
+    if (update == DISPLAY_LINE_UPDATE_FULL)\r
+    {\r
+        // Menu item is visible\r
+        sTemp.state = MENU_ITEM_VISIBLE;\r
+\r
+        // Display °C / °F\r
+        display_symbol(LCD_SEG_L1_DP1, SEG_ON);\r
+        display_symbol(LCD_UNIT_L1_DEGREE, SEG_ON);\r
+        if (sys.flag.use_metric_units)\r
+            display_char(LCD_SEG_L1_0, 'C', SEG_ON);\r
+        else\r
+            display_char(LCD_SEG_L1_0, 'F', SEG_ON);\r
+\r
+        // Perform one temperature measurement with disabled filter\r
+        temperature_measurement(FILTER_OFF);\r
+\r
+        // Display temperature\r
+        display_temperature(LINE1, DISPLAY_LINE_UPDATE_PARTIAL);\r
+    }\r
+    else if (update == DISPLAY_LINE_UPDATE_PARTIAL)\r
+    {\r
+        // When using English units, convert °C to °F (temp*1.8+32)\r
+        if (!sys.flag.use_metric_units)\r
+        {\r
+            temperature = convert_C_to_F(sTemp.degrees);\r
+        }\r
+        else\r
+        {\r
+            temperature = sTemp.degrees;\r
+        }\r
+\r
+        // Indicate temperature sign through arrow up/down icon\r
+        if (temperature < 0)\r
+        {\r
+            // Convert negative to positive number\r
+            temperature = ~temperature;\r
+            temperature += 1;\r
+\r
+            display_symbol(LCD_SYMB_ARROW_UP, SEG_OFF);\r
+            display_symbol(LCD_SYMB_ARROW_DOWN, SEG_ON);\r
+        }\r
+        else                    // Temperature is >= 0\r
+        {\r
+            display_symbol(LCD_SYMB_ARROW_UP, SEG_ON);\r
+            display_symbol(LCD_SYMB_ARROW_DOWN, SEG_OFF);\r
+        }\r
+\r
+        // Limit min/max temperature to +/- 99.9 °C / °F\r
+        if (temperature > 999)\r
+            temperature = 999;\r
+\r
+        // Display result in xx.x format\r
+        str = int_to_array(temperature, 3, 1);\r
+        display_chars(LCD_SEG_L1_3_1, str, SEG_ON);\r
+    }\r
+    else if (update == DISPLAY_LINE_CLEAR)\r
+    {\r
+        // Menu item is not visible\r
+        sTemp.state = MENU_ITEM_NOT_VISIBLE;\r
+\r
+        // Clean up function-specific segments before leaving function\r
+        display_symbol(LCD_SYMB_ARROW_UP, SEG_OFF);\r
+        display_symbol(LCD_SYMB_ARROW_DOWN, SEG_OFF);\r
+        display_symbol(LCD_UNIT_L1_DEGREE, SEG_OFF);\r
+        display_symbol(LCD_SEG_L1_DP1, SEG_OFF);\r
+    }\r
+}\r
+\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/logic/temperature.h b/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/logic/temperature.h
new file mode 100755 (executable)
index 0000000..68a2138
--- /dev/null
@@ -0,0 +1,70 @@
+// *************************************************************************************************\r
+//\r
+//      Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//        Redistribution and use in source and binary forms, with or without\r
+//        modification, are permitted provided that the following conditions\r
+//        are met:\r
+//\r
+//          Redistributions of source code must retain the above copyright\r
+//          notice, this list of conditions and the following disclaimer.\r
+//\r
+//          Redistributions in binary form must reproduce the above copyright\r
+//          notice, this list of conditions and the following disclaimer in the\r
+//          documentation and/or other materials provided with the\r
+//          distribution.\r
+//\r
+//          Neither the name of Texas Instruments Incorporated nor the names of\r
+//          its contributors may be used to endorse or promote products derived\r
+//          from this software without specific prior written permission.\r
+//\r
+//        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+\r
+#ifndef TEMPERATURE_H_\r
+#define TEMPERATURE_H_\r
+\r
+// *************************************************************************************************\r
+// Include section\r
+\r
+// *************************************************************************************************\r
+// Prototypes section\r
+\r
+// internal functions\r
+extern void reset_temp_measurement(void);\r
+extern u8 is_temp_measurement(void);\r
+extern void temperature_measurement(u8 filter);\r
+\r
+// menu functions\r
+extern void mx_temperature(u8 line);\r
+extern void display_temperature(u8 line, u8 update);\r
+\r
+// *************************************************************************************************\r
+// Defines section\r
+\r
+// *************************************************************************************************\r
+// Global Variable section\r
+struct temp\r
+{\r
+    menu_t state;               // MENU_ITEM_NOT_VISIBLE, MENU_ITEM_VISIBLE\r
+    s16 degrees;                // Temperature (°C) in 2.1 format\r
+    s16 offset;                 // User set calibration value (°C) in 2.1 format\r
+};\r
+extern struct temp sTemp;\r
+\r
+// *************************************************************************************************\r
+// Extern section\r
+\r
+#endif                          /*TEMPERATURE_H_ */\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/logic/test.c b/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/logic/test.c
new file mode 100755 (executable)
index 0000000..3ef6dcd
--- /dev/null
@@ -0,0 +1,296 @@
+// *************************************************************************************************\r
+//\r
+//      Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//        Redistribution and use in source and binary forms, with or without\r
+//        modification, are permitted provided that the following conditions\r
+//        are met:\r
+//\r
+//          Redistributions of source code must retain the above copyright\r
+//          notice, this list of conditions and the following disclaimer.\r
+//\r
+//          Redistributions in binary form must reproduce the above copyright\r
+//          notice, this list of conditions and the following disclaimer in the\r
+//          documentation and/or other materials provided with the\r
+//          distribution.\r
+//\r
+//          Neither the name of Texas Instruments Incorporated nor the names of\r
+//          its contributors may be used to endorse or promote products derived\r
+//          from this software without specific prior written permission.\r
+//\r
+//        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+// Test functions.\r
+// *************************************************************************************************\r
+\r
+// *************************************************************************************************\r
+// Include section\r
+\r
+// system\r
+#include "project.h"\r
+\r
+// driver\r
+#include "display.h"\r
+#include "vti_as.h"\r
+#include "vti_ps.h"\r
+#include "ports.h"\r
+#include "timer.h"\r
+\r
+// logic\r
+#include "acceleration.h"\r
+#include "altitude.h"\r
+#include "temperature.h"\r
+#include "bluerobin.h"\r
+#include "test.h"\r
+\r
+// *************************************************************************************************\r
+// Global Variable section\r
+\r
+// *************************************************************************************************\r
+// Prototype section\r
+\r
+// *************************************************************************************************\r
+// @fn          test_mode\r
+// @brief       Manual test mode. Activated by holding buttons STAR and UP simultaneously.\r
+//                              Cancelled by any other button press.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void test_mode(void)\r
+{\r
+    u8 test_step, start_next_test;\r
+    u8 *str;\r
+    u8 i;\r
+\r
+    // Disable timer - no need for a clock tick\r
+    Timer0_Stop();\r
+\r
+    // Disable LCD charge pump while in standby mode\r
+    // This reduces current consumption by ca. 5µA to ca. 10µA\r
+    LCDBVCTL = 0;\r
+\r
+    // Show welcome screen\r
+    display_chars(LCD_SEG_L1_3_0, (u8 *) "0430", SEG_ON);\r
+    display_chars(LCD_SEG_L2_4_0, (u8 *) "CC430", SEG_ON);\r
+    display_symbol(LCD_SEG_L1_COL, SEG_ON);\r
+    display_symbol(LCD_ICON_HEART, SEG_ON);\r
+    display_symbol(LCD_ICON_STOPWATCH, SEG_ON);\r
+    display_symbol(LCD_ICON_RECORD, SEG_ON);\r
+    display_symbol(LCD_ICON_ALARM, SEG_ON);\r
+    display_symbol(LCD_ICON_BEEPER1, SEG_ON);\r
+    display_symbol(LCD_ICON_BEEPER2, SEG_ON);\r
+    display_symbol(LCD_ICON_BEEPER3, SEG_ON);\r
+    display_symbol(LCD_SYMB_ARROW_UP, SEG_ON);\r
+    display_symbol(LCD_SYMB_ARROW_DOWN, SEG_ON);\r
+    display_symbol(LCD_SYMB_AM, SEG_ON);\r
+\r
+    // Hold watchdog\r
+    WDTCTL = WDTPW + WDTHOLD;\r
+\r
+    // Wait for button press\r
+    _BIS_SR(LPM3_bits + GIE);\r
+    __no_operation();\r
+\r
+    // Clear display\r
+    display_all_off();\r
+\r
+#ifdef USE_LCD_CHARGE_PUMP\r
+    // Charge pump voltage generated internally, internal bias (V2-V4) generation\r
+    // This ensures that the contrast and LCD control is constant for the whole battery lifetime\r
+    LCDBVCTL = LCDCPEN | VLCD_2_72;\r
+#endif\r
+\r
+    // Renenable timer\r
+    Timer0_Start();\r
+\r
+    // Debounce button press\r
+    Timer0_A4_Delay(CONV_MS_TO_TICKS(100));\r
+\r
+    while (1)\r
+    {\r
+        // Check button event\r
+        if (BUTTON_STAR_IS_PRESSED && BUTTON_UP_IS_PRESSED)\r
+        {\r
+            // Start with test #0\r
+            test_step = 0;\r
+            start_next_test = 1;\r
+            while (1)\r
+            {\r
+                if (start_next_test)\r
+                {\r
+                    // Clean up previous test display\r
+                    display_all_off();\r
+\r
+                    start_next_test = 0;\r
+\r
+                    switch (test_step)\r
+                    {\r
+                        case 0: // All LCD segments on\r
+                            display_all_on();\r
+                            // Wait until buttons are off\r
+                            while (BUTTON_STAR_IS_PRESSED && BUTTON_UP_IS_PRESSED) ;\r
+                            break;\r
+                        case 1: // Altitude measurement\r
+                            display_altitude(LINE1, DISPLAY_LINE_UPDATE_FULL);\r
+                            for (i = 0; i < 2; i++)\r
+                            {\r
+                                while ((PS_INT_IN & PS_INT_PIN) == 0) ;\r
+                                do_altitude_measurement(FILTER_OFF);\r
+                                display_altitude(LINE1, DISPLAY_LINE_UPDATE_PARTIAL);\r
+                            }\r
+                            stop_altitude_measurement();\r
+                            break;\r
+                        case 2: // Temperature measurement\r
+                            display_temperature(LINE1, DISPLAY_LINE_UPDATE_FULL);\r
+                            for (i = 0; i < 4; i++)\r
+                            {\r
+                                Timer0_A4_Delay(CONV_MS_TO_TICKS(250));\r
+                                temperature_measurement(FILTER_OFF);\r
+                                display_temperature(LINE1, DISPLAY_LINE_UPDATE_PARTIAL);\r
+                            }\r
+                            break;\r
+                        case 3: // Acceleration measurement\r
+                            as_start();\r
+                            for (i = 0; i < 4; i++)\r
+                            {\r
+                                Timer0_A4_Delay(CONV_MS_TO_TICKS(250));\r
+                                as_get_data(sAccel.xyz);\r
+                                str = int_to_array(sAccel.xyz[0], 3, 0);\r
+                                display_chars(LCD_SEG_L1_2_0, str, SEG_ON);\r
+                                str = int_to_array(sAccel.xyz[2], 3, 0);\r
+                                display_chars(LCD_SEG_L2_2_0, str, SEG_ON);\r
+                            }\r
+                            as_stop();\r
+                            break;\r
+                        case 4: // BlueRobin test\r
+                            button.flag.up = 1;\r
+                            sx_bluerobin(LINE1);\r
+                            Timer0_A4_Delay(CONV_MS_TO_TICKS(100));\r
+                            get_bluerobin_data();\r
+                            display_heartrate(LINE1, DISPLAY_LINE_UPDATE_FULL);\r
+                            stop_bluerobin();\r
+                            break;\r
+                    }\r
+\r
+                    // Debounce button\r
+                    Timer0_A4_Delay(CONV_MS_TO_TICKS(200));\r
+                }\r
+\r
+                // Check button event\r
+                if (BUTTON_STAR_IS_PRESSED)\r
+                {\r
+                    test_step = 1;\r
+                    start_next_test = 1;\r
+                }\r
+                else if (BUTTON_NUM_IS_PRESSED)\r
+                {\r
+                    test_step = 2;\r
+                    start_next_test = 1;\r
+                }\r
+                else if (BUTTON_UP_IS_PRESSED)\r
+                {\r
+                    test_step = 3;\r
+                    start_next_test = 1;\r
+                }\r
+                else if (BUTTON_DOWN_IS_PRESSED)\r
+                {\r
+                    test_step = 4;\r
+                    start_next_test = 1;\r
+                }\r
+                else if (BUTTON_BACKLIGHT_IS_PRESSED)\r
+                {\r
+                    // Wait until button has been released (avoid restart)\r
+                    while (BUTTON_BACKLIGHT_IS_PRESSED) ;\r
+\r
+                    // Disable LCD and LCD charge pump\r
+                    LCDBCTL0 &= ~BIT0;\r
+                    LCDBVCTL = 0;\r
+\r
+                    // Debounce button press\r
+                    Timer0_A4_Delay(CONV_MS_TO_TICKS(500));\r
+\r
+                    // Disable timer - no need for a clock tick\r
+                    Timer0_Stop();\r
+\r
+                    // Hold watchdog\r
+                    WDTCTL = WDTPW + WDTHOLD;\r
+\r
+                    // Sleep until button is pressed (ca. 4µA current consumption)\r
+                    _BIS_SR(LPM4_bits + GIE);\r
+                    __no_operation();\r
+\r
+                    // Force watchdog reset for a clean restart\r
+                    WDTCTL = 1;\r
+                }\r
+\r
+#ifdef USE_WATCHDOG\r
+                // Service watchdog\r
+                WDTCTL = WDTPW + WDTIS__512K + WDTSSEL__ACLK + WDTCNTCL;\r
+#endif\r
+                // To LPM3\r
+                _BIS_SR(LPM3_bits + GIE);\r
+                __no_operation();\r
+            }\r
+        }\r
+        else\r
+        {\r
+            // Debounce button\r
+            Timer0_A4_Delay(CONV_MS_TO_TICKS(100));\r
+            button.all_flags = 0;\r
+\r
+            // Turn off backlight\r
+            P2OUT &= ~BUTTON_BACKLIGHT_PIN;\r
+            P2DIR &= ~BUTTON_BACKLIGHT_PIN;\r
+            break;\r
+        }\r
+    }\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          display_all_on\r
+// @brief       Turns on all LCD segments\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void display_all_on(void)\r
+{\r
+    u8 *lcdptr = (u8 *) 0x0A20;\r
+    u8 i;\r
+\r
+    for (i = 1; i <= 12; i++)\r
+    {\r
+        *lcdptr = 0xFF;\r
+        lcdptr++;\r
+    }\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          display_all_off\r
+// @brief       Turns off all LCD segments\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void display_all_off(void)\r
+{\r
+    u8 *lcdptr = (u8 *) 0x0A20;\r
+    u8 i;\r
+\r
+    for (i = 1; i <= 12; i++)\r
+    {\r
+        *lcdptr = 0x00;\r
+        lcdptr++;\r
+    }\r
+}\r
+\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/logic/test.h b/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/logic/test.h
new file mode 100755 (executable)
index 0000000..469426e
--- /dev/null
@@ -0,0 +1,47 @@
+// *************************************************************************************************\r
+//\r
+//      Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//        Redistribution and use in source and binary forms, with or without\r
+//        modification, are permitted provided that the following conditions\r
+//        are met:\r
+//\r
+//          Redistributions of source code must retain the above copyright\r
+//          notice, this list of conditions and the following disclaimer.\r
+//\r
+//          Redistributions in binary form must reproduce the above copyright\r
+//          notice, this list of conditions and the following disclaimer in the\r
+//          documentation and/or other materials provided with the\r
+//          distribution.\r
+//\r
+//          Neither the name of Texas Instruments Incorporated nor the names of\r
+//          its contributors may be used to endorse or promote products derived\r
+//          from this software without specific prior written permission.\r
+//\r
+//        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+// Test functions.\r
+// *************************************************************************************************\r
+\r
+#ifndef TEST_H_\r
+#define TEST_H_\r
+\r
+// *************************************************************************************************\r
+// Extern section\r
+extern void test_mode(void);\r
+extern void display_all_on(void);\r
+extern void display_all_off(void);\r
+\r
+#endif                          /*TEST_H_ */\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/logic/user.c b/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/logic/user.c
new file mode 100755 (executable)
index 0000000..3207cbf
--- /dev/null
@@ -0,0 +1,291 @@
+// *************************************************************************************************\r
+//\r
+//      Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//        Redistribution and use in source and binary forms, with or without\r
+//        modification, are permitted provided that the following conditions\r
+//        are met:\r
+//\r
+//          Redistributions of source code must retain the above copyright\r
+//          notice, this list of conditions and the following disclaimer.\r
+//\r
+//          Redistributions in binary form must reproduce the above copyright\r
+//          notice, this list of conditions and the following disclaimer in the\r
+//          documentation and/or other materials provided with the\r
+//          distribution.\r
+//\r
+//          Neither the name of Texas Instruments Incorporated nor the names of\r
+//          its contributors may be used to endorse or promote products derived\r
+//          from this software without specific prior written permission.\r
+//\r
+//        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+// Several user functions.\r
+// *************************************************************************************************\r
+\r
+// *************************************************************************************************\r
+// Include section\r
+\r
+// system\r
+#include "project.h"\r
+\r
+// driver\r
+#include "display.h"\r
+#include "buzzer.h"\r
+#include "ports.h"\r
+\r
+// logic\r
+#include "menu.h"\r
+#include "date.h"\r
+#include "clock.h"\r
+#include "user.h"\r
+#include "stopwatch.h"\r
+\r
+// *************************************************************************************************\r
+// Prototypes section\r
+\r
+// *************************************************************************************************\r
+// Defines section\r
+\r
+// *************************************************************************************************\r
+// Global Variable section\r
+\r
+// *************************************************************************************************\r
+// Extern section\r
+extern void idle_loop(void);\r
+\r
+// *************************************************************************************************\r
+// @fn          dummy\r
+// @brief       Dummy direct function.\r
+// @param       u8 line LINE1, LINE2\r
+// @return      none\r
+// *************************************************************************************************\r
+void dummy(u8 line)\r
+{\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          set_value\r
+// @brief       Generic value setting routine\r
+// @param       s32 * value                                                     Pointer to value to\r
+// set\r
+//                              u8digits\r
+//                                                        Number of digits\r
+//                              u8 blanks\r
+//                                                       Number of whitespaces before first valid\r
+// digit\r
+//                              s32 limitLow                                            Lower limit\r
+// of value\r
+//                              s32 limitHigh                                           Upper limit\r
+// of value\r
+//                              u16 mode\r
+//                              u8 segments\r
+//                                                     Segments where value should be drawn\r
+//                              fptr_setValue_display_function1         Value-specific display\r
+// routine\r
+// @return      none\r
+// *************************************************************************************************\r
+void set_value(s32 * value, u8 digits, u8 blanks, s32 limitLow, s32 limitHigh, u16 mode,\r
+               u8 segments,\r
+               void (*fptr_setValue_display_function1)(u8 segments, u32 value, u8 digits,\r
+                                                       u8 blanks))\r
+{\r
+    u8 update;\r
+    s16 stepValue = 1;\r
+    u8 doRound = 0;\r
+    u8 stopwatch_state;\r
+    u32 val;\r
+\r
+    // Clear button flags\r
+    button.all_flags = 0;\r
+\r
+    // Clear blink memory\r
+    clear_blink_mem();\r
+\r
+    // For safety only - buzzer on/off and button_repeat share same IRQ\r
+    stop_buzzer();\r
+\r
+    // Disable stopwatch display update while function is active\r
+    stopwatch_state = sStopwatch.state;\r
+    sStopwatch.state = STOPWATCH_HIDE;\r
+\r
+    // Init step size and repeat counter\r
+    sButton.repeats = 0;\r
+\r
+    // Initial display update\r
+    update = 1;\r
+\r
+    // Turn on 200ms button repeat function\r
+    button_repeat_on(200);\r
+\r
+    // Start blinking with with 2Hz\r
+    set_blink_rate(BIT6 + BIT5);\r
+\r
+    // Value set loop\r
+    while (1)\r
+    {\r
+        // Idle timeout: exit function\r
+        if (sys.flag.idle_timeout)\r
+            break;\r
+\r
+        // Button STAR (short) button: exit function\r
+        if (button.flag.star)\r
+            break;\r
+\r
+        // NUM button: exit function and goto to next value (if available)\r
+        if (button.flag.num)\r
+        {\r
+            if ((mode & SETVALUE_NEXT_VALUE) == SETVALUE_NEXT_VALUE)\r
+                break;\r
+        }\r
+\r
+        // UP button: increase value\r
+        if (button.flag.up)\r
+        {\r
+            // Increase value\r
+            *value = *value + stepValue;\r
+\r
+            // Check value limits\r
+            if (*value > limitHigh)\r
+            {\r
+                // Check if value can roll over, else stick to limit\r
+                if ((mode & SETVALUE_ROLLOVER_VALUE) == SETVALUE_ROLLOVER_VALUE)\r
+                    *value = limitLow;\r
+                else\r
+                    *value = limitHigh;\r
+\r
+                // Reset step size to default\r
+                stepValue = 1;\r
+            }\r
+\r
+            // Trigger display update\r
+            update = 1;\r
+\r
+            // Clear button flag\r
+            button.flag.up = 0;\r
+        }\r
+\r
+        // DOWN button: decrease value\r
+        if (button.flag.down)\r
+        {\r
+            // Decrease value\r
+            *value = *value - stepValue;\r
+\r
+            // Check value limits\r
+            if (*value < limitLow)\r
+            {\r
+                // Check if value can roll over, else stick to limit\r
+                if ((mode & SETVALUE_ROLLOVER_VALUE) == SETVALUE_ROLLOVER_VALUE)\r
+                    *value = limitHigh;\r
+                else\r
+                    *value = limitLow;\r
+\r
+                // Reset step size to default\r
+                stepValue = 1;\r
+            }\r
+\r
+            // Trigger display update\r
+            update = 1;\r
+\r
+            // Clear button flag\r
+            button.flag.down = 0;\r
+        }\r
+\r
+        // When fast mode is enabled, increase step size if Sx button is continuously\r
+        if ((mode & SETVALUE_FAST_MODE) == SETVALUE_FAST_MODE)\r
+        {\r
+            switch (sButton.repeats)\r
+            {\r
+                case 0:\r
+                    stepValue = 1;\r
+                    doRound = 0;\r
+                    break;\r
+                case 10:\r
+                case -10:\r
+                    stepValue = 10;\r
+                    doRound = 1;\r
+                    break;\r
+                case 20:\r
+                case -20:\r
+                    stepValue = 100;\r
+                    doRound = 1;\r
+                    break;\r
+                case 30:\r
+                case -30:\r
+                    stepValue = 1000;\r
+                    doRound = 1;\r
+                    break;\r
+            }\r
+\r
+            // Round value to avoid odd numbers on display\r
+            if (stepValue != 1 && doRound == 1)\r
+            {\r
+                *value -= *value % stepValue;\r
+                doRound = 0;\r
+            }\r
+        }\r
+\r
+        // Update display when there is new data\r
+        if (update)\r
+        {\r
+            // Display up or down arrow according to sign of value\r
+            if ((mode & SETVALUE_DISPLAY_ARROWS) == SETVALUE_DISPLAY_ARROWS)\r
+            {\r
+                if (*value >= 0)\r
+                {\r
+                    display_symbol(LCD_SYMB_ARROW_UP, SEG_ON);\r
+                    display_symbol(LCD_SYMB_ARROW_DOWN, SEG_OFF);\r
+                    val = *value;\r
+                }\r
+                else\r
+                {\r
+                    display_symbol(LCD_SYMB_ARROW_UP, SEG_OFF);\r
+                    display_symbol(LCD_SYMB_ARROW_DOWN, SEG_ON);\r
+                    val = *value * (-1);\r
+                }\r
+            }\r
+            else\r
+            {\r
+                val = *value;\r
+            }\r
+\r
+            // Display function can either display value directly, modify value before displaying\r
+            // or display a string referenced by the value\r
+            fptr_setValue_display_function1(segments, val, digits, blanks);\r
+\r
+            // Clear update flag\r
+            update = 0;\r
+        }\r
+\r
+        // Call idle loop to serve background tasks\r
+        idle_loop();\r
+\r
+    }\r
+\r
+    // Clear up and down arrows\r
+    display_symbol(LCD_SYMB_ARROW_UP, SEG_OFF);\r
+    display_symbol(LCD_SYMB_ARROW_DOWN, SEG_OFF);\r
+\r
+    // Set blinking rate to 1Hz and stop\r
+    set_blink_rate(BIT7 + BIT6 + BIT5);\r
+    clear_blink_mem();\r
+\r
+    // Turn off button repeat function\r
+    button_repeat_off();\r
+\r
+    // Enable stopwatch display updates again\r
+    sStopwatch.state = stopwatch_state;\r
+}\r
+\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/logic/user.h b/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/logic/user.h
new file mode 100755 (executable)
index 0000000..f48cea4
--- /dev/null
@@ -0,0 +1,59 @@
+// *************************************************************************************************\r
+//\r
+//      Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//        Redistribution and use in source and binary forms, with or without\r
+//        modification, are permitted provided that the following conditions\r
+//        are met:\r
+//\r
+//          Redistributions of source code must retain the above copyright\r
+//          notice, this list of conditions and the following disclaimer.\r
+//\r
+//          Redistributions in binary form must reproduce the above copyright\r
+//          notice, this list of conditions and the following disclaimer in the\r
+//          documentation and/or other materials provided with the\r
+//          distribution.\r
+//\r
+//          Neither the name of Texas Instruments Incorporated nor the names of\r
+//          its contributors may be used to endorse or promote products derived\r
+//          from this software without specific prior written permission.\r
+//\r
+//        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+\r
+#ifndef USER_H_\r
+#define USER_H_\r
+\r
+// *************************************************************************************************\r
+// Defines section\r
+#define SETVALUE_ROLLOVER_VALUE                         BIT0\r
+#define SETVALUE_DISPLAY_VALUE                          BIT1\r
+#define SETVALUE_DISPLAY_ARROWS                         BIT2\r
+#define SETVALUE_DISPLAY_SELECTION                      BIT3\r
+#define SETVALUE_FAST_MODE                                      BIT4\r
+#define SETVALUE_NEXT_VALUE                                     BIT5\r
+\r
+// *************************************************************************************************\r
+// Prototypes section\r
+extern u8 *select_view_style(u8 line, u8 * view1, u8 * view2);\r
+\r
+extern void (*fptr_setValue_display_function1)(u8 segments, u32 value, u8 digits, u8 blanks);\r
+extern void set_value(s32 * value, u8 digits, u8 blanks, s32 limitLow, s32 limitHigh, u16 mode,\r
+                      u8 segments,\r
+                      void (*fptr_setValue_display_function1)(u8 segments, u32 value, u8 digits,\r
+                                                              u8 blanks));\r
+extern void dummy(u8 line);\r
+\r
+#endif                          /*USER_H_ */\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/main.c b/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/main.c
new file mode 100755 (executable)
index 0000000..42eabaa
--- /dev/null
@@ -0,0 +1,743 @@
+// *************************************************************************************************\r
+//\r
+//      Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//        Redistribution and use in source and binary forms, with or without\r
+//        modification, are permitted provided that the following conditions\r
+//        are met:\r
+//\r
+//          Redistributions of source code must retain the above copyright\r
+//          notice, this list of conditions and the following disclaimer.\r
+//\r
+//          Redistributions in binary form must reproduce the above copyright\r
+//          notice, this list of conditions and the following disclaimer in the\r
+//          documentation and/or other materials provided with the\r
+//          distribution.\r
+//\r
+//          Neither the name of Texas Instruments Incorporated nor the names of\r
+//          its contributors may be used to endorse or promote products derived\r
+//          from this software without specific prior written permission.\r
+//\r
+//        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+//******************************************************************************\r
+//   eZ430-Chronos\r
+//\r
+//   Description: This is the standard software for the eZ430-Chronos\r
+//\r
+//   P.Francisco\r
+//   Version    1.6\r
+//   Texas Instruments, Inc\r
+//   November 2010\r
+//   Known working builds:\r
+//     IAR Embedded Workbench (Version: 5.10.4)\r
+//     Code Composer Studio (Version  4.2.0.10012)\r
+//******************************************************************************\r
+//Change Log (More detailed information can be found in change_record.txt):\r
+//******************************************************************************\r
+//Version:  1.6\r
+//Comments: Several bugs were fixed.\r
+//          LCD shows "done" after successfully received data\r
+//          rfBSL requires two button presses in order to update watch\r
+//          New method detects a long button press\r
+//          Removed file display1.c. The content is now in display.c\r
+//          Backlight of Chronos stays on for 3 sec after backlight button was pushed.\r
+//          After timeout the accelerometer menu shows "----"\r
+//\r
+//Version:  1.5\r
+//Comments: Changed XT1 drive level to highest\r
+//          Modified key lock procedure.\r
+//          Negative °C are now converted correctly to Kelvin\r
+//          Enabled fast mode when changing altitude offset\r
+//          Disabled stopwatch stop when watch buttons are locked\r
+//          Added SimpliciTI sources to project. Upgraded to Version 1.1.1.\r
+//          Changed button names from M1/M2/S1/S2/BL to STAR/NUM/UP/DOWN/BACKLIGHT\r
+//\r
+//Version:  1.4\r
+//Comments: Initial Release Version\r
+//**********************************************************************************\r
+\r
+// *************************************************************************************************\r
+// Initialization and control of application.\r
+// *************************************************************************************************\r
+\r
+// *************************************************************************************************\r
+// Include section\r
+\r
+// system\r
+#include "project.h"\r
+#include <string.h>\r
+\r
+// driver\r
+#include "clock.h"\r
+#include "display.h"\r
+#include "vti_as.h"\r
+#include "vti_ps.h"\r
+#include "radio.h"\r
+#include "buzzer.h"\r
+#include "ports.h"\r
+#include "timer.h"\r
+#include "pmm.h"\r
+#include "rf1a.h"\r
+\r
+// logic\r
+#include "menu.h"\r
+#include "date.h"\r
+#include "alarm.h"\r
+#include "stopwatch.h"\r
+#include "battery.h"\r
+#include "temperature.h"\r
+#include "altitude.h"\r
+#include "battery.h"\r
+#include "acceleration.h"\r
+#include "bluerobin.h"\r
+#include "rfsimpliciti.h"\r
+#include "simpliciti.h"\r
+#include "rfbsl.h"\r
+#include "test.h"\r
+\r
+// *************************************************************************************************\r
+// Prototypes section\r
+void init_application(void);\r
+void init_global_variables(void);\r
+void wakeup_event(void);\r
+void process_requests(void);\r
+void display_update(void);\r
+void idle_loop(void);\r
+void configure_ports(void);\r
+void read_calibration_values(void);\r
+\r
+// *************************************************************************************************\r
+// Defines section\r
+\r
+// Number of calibration data bytes in INFOA memory\r
+#define CALIBRATION_DATA_LENGTH         (13u)\r
+\r
+// *************************************************************************************************\r
+// Global Variable section\r
+\r
+// Variable holding system internal flags\r
+volatile s_system_flags sys;\r
+\r
+// Variable holding flags set by logic modules\r
+volatile s_request_flags request;\r
+\r
+// Variable holding message flags\r
+volatile s_message_flags message;\r
+\r
+// Global radio frequency offset taken from calibration memory\r
+// Compensates crystal deviation from 26MHz nominal value\r
+u8 rf_frequoffset;\r
+\r
+// Function pointers for LINE1 and LINE2 display function\r
+void (*fptr_lcd_function_line1)(u8 line, u8 update);\r
+void (*fptr_lcd_function_line2)(u8 line, u8 update);\r
+\r
+// *************************************************************************************************\r
+// Extern section\r
+\r
+extern void start_simpliciti_sync(void);\r
+\r
+extern u16 ps_read_register(u8 address, u8 mode);\r
+extern u8 ps_write_register(u8 address, u8 data);\r
+\r
+// *************************************************************************************************\r
+// @fn          main\r
+// @brief       Main routine\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+int main(void)\r
+{\r
+    // Init MCU\r
+    init_application();\r
+\r
+    // Assign initial value to global variables\r
+    init_global_variables();\r
+\r
+    // Branch to welcome screen\r
+    test_mode();\r
+\r
+    // Main control loop: wait in low power mode until some event needs to be processed\r
+    while (1)\r
+    {\r
+        // When idle go to LPM3\r
+        idle_loop();\r
+\r
+        // Process wake-up events\r
+        if (button.all_flags || sys.all_flags)\r
+            wakeup_event();\r
+\r
+        // Process actions requested by logic modules\r
+        if (request.all_flags)\r
+            process_requests();\r
+\r
+        // Before going to LPM3, update display\r
+        if (display.all_flags)\r
+            display_update();\r
+    }\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          init_application\r
+// @brief       Initialize the microcontroller.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void init_application(void)\r
+{\r
+    volatile unsigned char *ptr;\r
+\r
+    // ---------------------------------------------------------------------\r
+    // Enable watchdog\r
+\r
+    // Watchdog triggers after 16 seconds when not cleared\r
+#ifdef USE_WATCHDOG\r
+    WDTCTL = WDTPW + WDTIS__512K + WDTSSEL__ACLK;\r
+#else\r
+    WDTCTL = WDTPW + WDTHOLD;\r
+#endif\r
+\r
+    // ---------------------------------------------------------------------\r
+    // Configure PMM\r
+    SetVCore(3);\r
+\r
+    // Set global high power request enable\r
+    PMMCTL0_H = 0xA5;\r
+    PMMCTL0_L |= PMMHPMRE;\r
+    PMMCTL0_H = 0x00;\r
+\r
+    // ---------------------------------------------------------------------\r
+    // Enable 32kHz ACLK\r
+    P5SEL |= 0x03;              // Select XIN, XOUT on P5.0 and P5.1\r
+    UCSCTL6 &= ~XT1OFF;         // XT1 On, Highest drive strength\r
+    UCSCTL6 |= XCAP_3;          // Internal load cap\r
+\r
+    UCSCTL3 = SELA__XT1CLK;     // Select XT1 as FLL reference\r
+    UCSCTL4 = SELA__XT1CLK | SELS__DCOCLKDIV | SELM__DCOCLKDIV;\r
+\r
+    // ---------------------------------------------------------------------\r
+    // Configure CPU clock for 12MHz\r
+    _BIS_SR(SCG0);              // Disable the FLL control loop\r
+    UCSCTL0 = 0x0000;           // Set lowest possible DCOx, MODx\r
+    UCSCTL1 = DCORSEL_5;        // Select suitable range\r
+    UCSCTL2 = FLLD_1 + 0x16E;   // Set DCO Multiplier\r
+    _BIC_SR(SCG0);              // Enable the FLL control loop\r
+\r
+    // Worst-case settling time for the DCO when the DCO range bits have been\r
+    // changed is n x 32 x 32 x f_MCLK / f_FLL_reference. See UCS chapter in 5xx\r
+    // UG for optimization.\r
+    // 32 x 32 x 12 MHz / 32,768 Hz = 375000 = MCLK cycles for DCO to settle\r
+    __delay_cycles(375000);\r
+\r
+    // Loop until XT1 & DCO stabilizes, use do-while to insure that\r
+    // body is executed at least once\r
+    do\r
+    {\r
+        UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG + XT1HFOFFG + DCOFFG);\r
+        SFRIFG1 &= ~OFIFG;      // Clear fault flags\r
+    }\r
+    while ((SFRIFG1 & OFIFG));\r
+\r
+    // ---------------------------------------------------------------------\r
+    // Configure port mapping\r
+\r
+    // Disable all interrupts\r
+    __disable_interrupt();\r
+    // Get write-access to port mapping registers:\r
+    PMAPPWD = 0x02D52;\r
+    // Allow reconfiguration during runtime:\r
+    PMAPCTL = PMAPRECFG;\r
+\r
+    // P2.7 = TA0CCR1A or TA1CCR0A output (buzzer output)\r
+    ptr = &P2MAP0;\r
+    *(ptr + 7) = PM_TA1CCR0A;\r
+    P2OUT &= ~BIT7;\r
+    P2DIR |= BIT7;\r
+\r
+    // P1.5 = SPI MISO input\r
+    ptr = &P1MAP0;\r
+    *(ptr + 5) = PM_UCA0SOMI;\r
+    // P1.6 = SPI MOSI output\r
+    *(ptr + 6) = PM_UCA0SIMO;\r
+    // P1.7 = SPI CLK output\r
+    *(ptr + 7) = PM_UCA0CLK;\r
+\r
+    // Disable write-access to port mapping registers:\r
+    PMAPPWD = 0;\r
+    // Re-enable all interrupts\r
+    __enable_interrupt();\r
+\r
+    // ---------------------------------------------------------------------\r
+    // Configure ports\r
+\r
+    // ---------------------------------------------------------------------\r
+    // Reset radio core\r
+    radio_reset();\r
+    radio_powerdown();\r
+\r
+    // ---------------------------------------------------------------------\r
+    // Init acceleration sensor\r
+    as_init();\r
+\r
+    // ---------------------------------------------------------------------\r
+    // Init LCD\r
+    lcd_init();\r
+\r
+    // ---------------------------------------------------------------------\r
+    // Init buttons\r
+    init_buttons();\r
+\r
+    // ---------------------------------------------------------------------\r
+    // Configure Timer0 for use by the clock and delay functions\r
+    Timer0_Init();\r
+\r
+    // ---------------------------------------------------------------------\r
+    // Init pressure sensor\r
+    ps_init();\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          init_global_variables\r
+// @brief       Initialize global variables.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void init_global_variables(void)\r
+{\r
+    // --------------------------------------------\r
+    // Apply default settings\r
+\r
+    // set menu pointers to default menu items\r
+    ptrMenu_L1 = &menu_L1_Time;\r
+    //      ptrMenu_L1 = &menu_L1_Alarm;\r
+    //      ptrMenu_L1 = &menu_L1_Heartrate;\r
+    //      ptrMenu_L1 = &menu_L1_Speed;\r
+    //      ptrMenu_L1 = &menu_L1_Temperature;\r
+    //      ptrMenu_L1 = &menu_L1_Altitude;\r
+    //      ptrMenu_L1 = &menu_L1_Acceleration;\r
+    ptrMenu_L2 = &menu_L2_Date;\r
+    //      ptrMenu_L2 = &menu_L2_Stopwatch;\r
+    //      ptrMenu_L2 = &menu_L2_Rf;\r
+    //      ptrMenu_L2 = &menu_L2_Ppt;\r
+    //      ptrMenu_L2 = &menu_L2_Sync;\r
+    //      ptrMenu_L2 = &menu_L2_Distance;\r
+    //      ptrMenu_L2 = &menu_L2_Calories;\r
+    //      ptrMenu_L2 = &menu_L2_Battery;\r
+    //      ptrMenu_L2 = &menu_L2_RFBSL;\r
+\r
+    // Assign LINE1 and LINE2 display functions\r
+    fptr_lcd_function_line1 = ptrMenu_L1->display_function;\r
+    fptr_lcd_function_line2 = ptrMenu_L2->display_function;\r
+\r
+    // Init system flags\r
+    button.all_flags = 0;\r
+    sys.all_flags = 0;\r
+    request.all_flags = 0;\r
+    display.all_flags = 0;\r
+    message.all_flags = 0;\r
+\r
+    // Force full display update when starting up\r
+    display.flag.full_update = 1;\r
+\r
+#ifndef ISM_US\r
+    // Use metric units when displaying values\r
+    sys.flag.use_metric_units = 1;\r
+#endif\r
+\r
+    // Read calibration values from info memory\r
+    read_calibration_values();\r
+\r
+    // Set system time to default value\r
+    reset_clock();\r
+\r
+    // Set date to default value\r
+    reset_date();\r
+\r
+    // Set alarm time to default value\r
+    reset_alarm();\r
+\r
+    // Set buzzer to default value\r
+    reset_buzzer();\r
+\r
+    // Reset stopwatch\r
+    reset_stopwatch();\r
+\r
+    // Reset altitude measurement\r
+    reset_altitude_measurement();\r
+\r
+    // Reset acceleration measurement\r
+    reset_acceleration();\r
+\r
+    // Reset BlueRobin stack\r
+    reset_bluerobin();\r
+\r
+    // Reset SimpliciTI stack\r
+    reset_rf();\r
+\r
+    // Reset temperature measurement\r
+    reset_temp_measurement();\r
+\r
+    // Reset battery measurement\r
+    reset_batt_measurement();\r
+    battery_measurement();\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          wakeup_event\r
+// @brief       Process external / internal wakeup events.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void wakeup_event(void)\r
+{\r
+    // Enable idle timeout\r
+    sys.flag.idle_timeout_enabled = 1;\r
+\r
+    // If buttons are locked, only display "buttons are locked" message\r
+    if (button.all_flags && sys.flag.lock_buttons)\r
+    {\r
+        // Show "buttons are locked" message synchronously with next second tick\r
+        if (!(BUTTON_NUM_IS_PRESSED && BUTTON_DOWN_IS_PRESSED))\r
+        {\r
+            message.flag.prepare = 1;\r
+            message.flag.type_locked = 1;\r
+        }\r
+        // Clear buttons\r
+        button.all_flags = 0;\r
+    }\r
+    // Process long button press event (while button is held)\r
+    else if (button.flag.star_long)\r
+    {\r
+        // Clear button event\r
+        button.flag.star_long = 0;\r
+\r
+        // Call sub menu function\r
+        ptrMenu_L1->mx_function(LINE1);\r
+\r
+        // Set display update flag\r
+        display.flag.full_update = 1;\r
+    }\r
+    else if (button.flag.num_long)\r
+    {\r
+        // Clear button event\r
+        button.flag.num_long = 0;\r
+\r
+        // Call sub menu function\r
+        ptrMenu_L2->mx_function(LINE2);\r
+\r
+        // Set display update flag\r
+        display.flag.full_update = 1;\r
+    }\r
+    // Process single button press event (after button was released)\r
+    else if (button.all_flags)\r
+    {\r
+        // M1 button event ---------------------------------------------------------------------\r
+        // (Short) Advance to next menu item\r
+        if (button.flag.star)\r
+        {\r
+            // Clean up display before activating next menu item\r
+            fptr_lcd_function_line1(LINE1, DISPLAY_LINE_CLEAR);\r
+\r
+            // Go to next menu entry\r
+            ptrMenu_L1 = ptrMenu_L1->next;\r
+\r
+            // Assign new display function\r
+            fptr_lcd_function_line1 = ptrMenu_L1->display_function;\r
+\r
+            // Set Line1 display update flag\r
+            display.flag.line1_full_update = 1;\r
+\r
+            // Clear button flag\r
+            button.flag.star = 0;\r
+        }\r
+        // NUM button event ---------------------------------------------------------------------\r
+        // (Short) Advance to next menu item\r
+        else if (button.flag.num)\r
+        {\r
+            // Clear rfBSL confirmation flag\r
+            rfBSL_button_confirmation = 0;\r
+\r
+            // Clean up display before activating next menu item\r
+            fptr_lcd_function_line2(LINE2, DISPLAY_LINE_CLEAR);\r
+\r
+            // Go to next menu entry\r
+            ptrMenu_L2 = ptrMenu_L2->next;\r
+\r
+            // Assign new display function\r
+            fptr_lcd_function_line2 = ptrMenu_L2->display_function;\r
+\r
+            // Set Line2 display update flag\r
+            display.flag.line2_full_update = 1;\r
+\r
+            // Clear button flag\r
+            button.flag.num = 0;\r
+        }\r
+        // UP button event ---------------------------------------------------------------------\r
+        // Activate user function for Line1 menu item\r
+        else if (button.flag.up)\r
+        {\r
+            // Call direct function\r
+            ptrMenu_L1->sx_function(LINE1);\r
+\r
+            // Set Line1 display update flag\r
+            display.flag.line1_full_update = 1;\r
+\r
+            // Clear button flag\r
+            button.flag.up = 0;\r
+        }\r
+        // DOWN button event ---------------------------------------------------------------------\r
+        // Activate user function for Line2 menu item\r
+        else if (button.flag.down)\r
+        {\r
+            if (ptrMenu_L2 == &menu_L2_RFBSL)\r
+            {\r
+\r
+            }\r
+\r
+            // Call direct function\r
+            ptrMenu_L2->sx_function(LINE2);\r
+\r
+            // Set Line1 display update flag\r
+            display.flag.line2_full_update = 1;\r
+\r
+            // Clear button flag\r
+            button.flag.down = 0;\r
+        }\r
+    }\r
+    // Process internal events\r
+    if (sys.all_flags)\r
+    {\r
+        // Idle timeout ---------------------------------------------------------------------\r
+        if (sys.flag.idle_timeout)\r
+        {\r
+            // Clear timeout flag\r
+            sys.flag.idle_timeout = 0;\r
+\r
+            // Clear display\r
+            clear_display();\r
+\r
+            // Set display update flags\r
+            display.flag.full_update = 1;\r
+        }\r
+    }\r
+    // Disable idle timeout\r
+    sys.flag.idle_timeout_enabled = 0;\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          process_requests\r
+// @brief       Process requested actions outside ISR context.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void process_requests(void)\r
+{\r
+    // Do temperature measurement\r
+    if (request.flag.temperature_measurement)\r
+        temperature_measurement(FILTER_ON);\r
+\r
+    // Do pressure measurement\r
+    if (request.flag.altitude_measurement)\r
+        do_altitude_measurement(FILTER_ON);\r
+\r
+    // Do acceleration measurement\r
+    if (request.flag.acceleration_measurement)\r
+        do_acceleration_measurement();\r
+\r
+    // Do voltage measurement\r
+    if (request.flag.voltage_measurement)\r
+        battery_measurement();\r
+\r
+    // Generate alarm (two signals every second)\r
+    if (request.flag.buzzer)\r
+        start_buzzer(2, BUZZER_ON_TICKS, BUZZER_OFF_TICKS);\r
+\r
+    // Reset request flag\r
+    request.all_flags = 0;\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          display_update\r
+// @brief       Process display flags and call LCD update routines.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void display_update(void)\r
+{\r
+    u8 line;\r
+    u8 string[8];\r
+\r
+    // ---------------------------------------------------------------------\r
+    // Call Line1 display function\r
+    if (display.flag.full_update || display.flag.line1_full_update)\r
+    {\r
+        clear_line(LINE1);\r
+        fptr_lcd_function_line1(LINE1, DISPLAY_LINE_UPDATE_FULL);\r
+    } else if (ptrMenu_L1->display_update())\r
+    {\r
+        // Update line1 only when new data is available\r
+        fptr_lcd_function_line1(LINE1, DISPLAY_LINE_UPDATE_PARTIAL);\r
+    }\r
+\r
+    // ---------------------------------------------------------------------\r
+    // If message text should be displayed on Line2, skip normal update\r
+    if (message.flag.show)\r
+    {\r
+        line = LINE2;\r
+\r
+        // Select message to display\r
+        if (message.flag.type_locked)\r
+            memcpy(string, "  LO?T", 6);\r
+        else if (message.flag.type_unlocked)\r
+            memcpy(string, "  OPEN", 6);\r
+        else if (message.flag.type_lobatt)\r
+            memcpy(string, "LOBATT", 6);\r
+        else if (message.flag.type_alarm_on)\r
+        {\r
+            memcpy(string, "  ON", 4);\r
+            line = LINE1;\r
+        } else if (message.flag.type_alarm_off)\r
+        {\r
+            memcpy(string, " OFF", 4);\r
+            line = LINE1;\r
+        }\r
+        // Clear previous content\r
+        clear_line(line);\r
+        fptr_lcd_function_line2(line, DISPLAY_LINE_CLEAR);\r
+\r
+        if (line == LINE2)\r
+            display_chars(LCD_SEG_L2_5_0, string, SEG_ON);\r
+        else\r
+            display_chars(LCD_SEG_L1_3_0, string, SEG_ON);\r
+\r
+        // Next second tick erases message and repaints original screen content\r
+        message.all_flags = 0;\r
+        message.flag.erase = 1;\r
+    }\r
+    // ---------------------------------------------------------------------\r
+    // Call Line2 display function\r
+    else if (display.flag.full_update || display.flag.line2_full_update)\r
+    {\r
+        clear_line(LINE2);\r
+        fptr_lcd_function_line2(LINE2, DISPLAY_LINE_UPDATE_FULL);\r
+    } else if (ptrMenu_L2->display_update() && !message.all_flags)\r
+    {\r
+        // Update line2 only when new data is available\r
+        fptr_lcd_function_line2(LINE2, DISPLAY_LINE_UPDATE_PARTIAL);\r
+    }\r
+    // ---------------------------------------------------------------------\r
+    // Restore blinking icons (blinking memory is cleared when calling set_value)\r
+    if (display.flag.full_update)\r
+    {\r
+        if (is_bluerobin() == BLUEROBIN_CONNECTED)\r
+        {\r
+            // Turn on beeper icon to show activity\r
+            display_symbol(LCD_ICON_BEEPER1, SEG_ON_BLINK_OFF);\r
+            display_symbol(LCD_ICON_BEEPER2, SEG_ON_BLINK_OFF);\r
+            display_symbol(LCD_ICON_BEEPER3, SEG_ON_BLINK_OFF);\r
+        }\r
+    }\r
+    // Clear display flag\r
+    display.all_flags = 0;\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          to_lpm\r
+// @brief       Go to LPM0/3.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void to_lpm(void)\r
+{\r
+    // Go to LPM3\r
+    _BIS_SR(LPM3_bits + GIE);\r
+    __no_operation();\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          idle_loop\r
+// @brief       Go to LPM. Service watchdog timer when waking up.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void idle_loop(void)\r
+{\r
+    // To low power mode\r
+    to_lpm();\r
+\r
+#ifdef USE_WATCHDOG\r
+    // Service watchdog\r
+    WDTCTL = WDTPW + WDTIS__512K + WDTSSEL__ACLK + WDTCNTCL;\r
+#endif\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          read_calibration_values\r
+// @brief       Read calibration values for temperature measurement, voltage measurement\r
+//                              and radio from INFO memory.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void read_calibration_values(void)\r
+{\r
+    u8 cal_data[CALIBRATION_DATA_LENGTH]; // Temporary storage for constants\r
+    u8 i;\r
+    u8 *flash_mem;                        // Memory pointer\r
+\r
+    // Read calibration data from Info D memory\r
+    flash_mem = (u8 *) 0x1800;\r
+    for (i = 0; i < CALIBRATION_DATA_LENGTH; i++)\r
+    {\r
+        cal_data[i] = *flash_mem++;\r
+    }\r
+\r
+    if (cal_data[0] == 0xFF)\r
+    {\r
+        // If no values are available (i.e. INFO D memory has been erased by user), assign\r
+        // experimentally derived values\r
+        rf_frequoffset = 4;\r
+        sTemp.offset = -250;\r
+        sBatt.offset = -10;\r
+        simpliciti_ed_address[0] = 0x79;\r
+        simpliciti_ed_address[1] = 0x56;\r
+        simpliciti_ed_address[2] = 0x34;\r
+        simpliciti_ed_address[3] = 0x12;\r
+        sAlt.altitude_offset = 0;\r
+    } else\r
+    {\r
+        // Assign calibration data to global variables\r
+        rf_frequoffset = cal_data[1];\r
+        // Range check for calibrated FREQEST value (-20 .. + 20 is ok, else use default value)\r
+        if ((rf_frequoffset > 20) && (rf_frequoffset < (256 - 20)))\r
+        {\r
+            rf_frequoffset = 0;\r
+        }\r
+        sTemp.offset = (s16) ((cal_data[2] << 8) + cal_data[3]);\r
+        sBatt.offset = (s16) ((cal_data[4] << 8) + cal_data[5]);\r
+        simpliciti_ed_address[0] = cal_data[6];\r
+        simpliciti_ed_address[1] = cal_data[7];\r
+        simpliciti_ed_address[2] = cal_data[8];\r
+        simpliciti_ed_address[3] = cal_data[9];\r
+        // S/W version byte set during calibration?\r
+        if (cal_data[12] != 0xFF)\r
+        {\r
+            sAlt.altitude_offset = (s16) ((cal_data[10] << 8) + cal_data[11]);\r
+        } else\r
+        {\r
+            sAlt.altitude_offset = 0;\r
+        }\r
+    }\r
+}\r
+\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/simpliciti/Applications/application/End Device/main_ED_BM.c b/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/simpliciti/Applications/application/End Device/main_ED_BM.c
new file mode 100755 (executable)
index 0000000..3c3a5bb
--- /dev/null
@@ -0,0 +1,261 @@
+/**********************************************************************************************\r
+ * Copyright 2007-2009 Texas Instruments Incorporated. All rights reserved.\r
+ *\r
+ * IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+ * the terms of a software license agreement between the user who downloaded the software,\r
+ * his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+ * "License"). You may not use this Software unless you agree to abide by the terms of the\r
+ * License. The License limits your use, and you acknowledge, that the Software may not be\r
+ * modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+ * or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+ * transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+ * you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+ * perform, display or sell this Software and/or its documentation for any purpose.\r
+ *\r
+ * YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+ * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+ * WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+ * IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+ * NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+ * THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+ * INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+ * DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+ * THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+ *\r
+ * Should you have any questions regarding your right to use this Software,\r
+ * contact Texas Instruments Incorporated at www.TI.com.\r
+ **************************************************************************************************/\r
+\r
+// *************************************************************************************************\r
+// Include section\r
+#include "bsp.h"\r
+#include "mrfi.h"\r
+#include "nwk_types.h"\r
+#include "nwk_api.h"\r
+#include "bsp_leds.h"\r
+#include "bsp_buttons.h"\r
+#include "simpliciti.h"\r
+\r
+\r
+// *************************************************************************************************\r
+// Defines section\r
+#define TIMEOUT                                 (10u)\r
+\r
+// Conversion from msec to ACLK timer ticks\r
+#define CONV_MS_TO_TICKS(msec)                          (((msec) * 32768) / 1000)\r
+\r
+// U16\r
+typedef unsigned short u16;\r
+\r
+// *************************************************************************************************\r
+// Prototypes section\r
+\r
+\r
+// *************************************************************************************************\r
+// Extern section\r
+extern uint8_t sInit_done;\r
+\r
+// SimpliciTI has no low power delay function, so we have to use ours\r
+extern void Timer0_A4_Delay(u16 ticks);\r
+\r
+\r
+// *************************************************************************************************\r
+// Global Variable section\r
+static linkID_t sLinkID1;\r
+\r
+\r
+\r
+// *************************************************************************************************\r
+// @fn          simpliciti_link\r
+// @brief       Init hardware and try to link to access point.\r
+// @param       none\r
+// @return      unsigned char          0 = Could not link, timeout or external cancel.\r
+//                                                                     1 = Linked successful.\r
+// *************************************************************************************************\r
+unsigned char simpliciti_link(void)\r
+{\r
+    uint8_t timeout;\r
+    addr_t lAddr;\r
+    uint8_t i;\r
+    uint8_t pwr;\r
+\r
+    // Configure timer\r
+    BSP_InitBoard();\r
+\r
+    // Change network address to value set in calling function\r
+    for (i = 0; i < NET_ADDR_SIZE; i++)\r
+    {\r
+        lAddr.addr[i] = simpliciti_ed_address[i];\r
+    }\r
+    SMPL_Ioctl(IOCTL_OBJ_ADDR, IOCTL_ACT_SET, &lAddr);\r
+\r
+    // Set flag\r
+    simpliciti_flag = SIMPLICITI_STATUS_LINKING;\r
+\r
+    /* Keep trying to join (a side effect of successful initialization) until\r
+     * successful. Toggle LEDS to indicate that joining has not occurred.\r
+     */\r
+    timeout = 0;\r
+    while (SMPL_SUCCESS != SMPL_Init(0))\r
+    {\r
+        NWK_DELAY(1000);\r
+\r
+        // Service watchdog\r
+        WDTCTL = WDTPW + WDTIS__512K + WDTSSEL__ACLK + WDTCNTCL;\r
+\r
+        // Stop connecting after defined numbers of seconds (15)\r
+        if (timeout++ > TIMEOUT)\r
+        {\r
+            // Clean up SimpliciTI stack to enable restarting\r
+            sInit_done = 0;\r
+            simpliciti_flag = SIMPLICITI_STATUS_ERROR;\r
+            return (0);\r
+        }\r
+\r
+        // Break when flag bit SIMPLICITI_TRIGGER_STOP is set\r
+        if (getFlag(simpliciti_flag, SIMPLICITI_TRIGGER_STOP))\r
+        {\r
+            // Clean up SimpliciTI stack to enable restarting\r
+            sInit_done = 0;\r
+            return (0);\r
+        }\r
+    }\r
+\r
+    // Set output power to +3.3dmB\r
+    pwr = IOCTL_LEVEL_2;\r
+    SMPL_Ioctl(IOCTL_OBJ_RADIO, IOCTL_ACT_RADIO_SETPWR, &pwr);\r
+\r
+    /* Unconditional link to AP which is listening due to successful join. */\r
+    timeout = 0;\r
+    while (SMPL_SUCCESS != SMPL_Link(&sLinkID1))\r
+    {\r
+        NWK_DELAY(1000);\r
+\r
+        // Service watchdog\r
+        WDTCTL = WDTPW + WDTIS__512K + WDTSSEL__ACLK + WDTCNTCL;\r
+\r
+        // Stop linking after timeout\r
+        if (timeout++ > TIMEOUT)\r
+        {\r
+            // Clean up SimpliciTI stack to enable restarting\r
+            sInit_done = 0;\r
+            simpliciti_flag = SIMPLICITI_STATUS_ERROR;\r
+            return (0);\r
+        }\r
+\r
+        // Exit when flag bit SIMPLICITI_TRIGGER_STOP is set\r
+        if (getFlag(simpliciti_flag, SIMPLICITI_TRIGGER_STOP))\r
+        {\r
+            // Clean up SimpliciTI stack to enable restarting\r
+            sInit_done = 0;\r
+            return (0);\r
+        }\r
+    }\r
+    simpliciti_flag = SIMPLICITI_STATUS_LINKED;\r
+\r
+    return (1);\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          simpliciti_main_tx_only\r
+// @brief       Get data through callback. Transfer data when external trigger is set.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void simpliciti_main_tx_only(void)\r
+{\r
+    while (1)\r
+    {\r
+        // Get end device data from callback function\r
+        simpliciti_get_ed_data_callback();\r
+\r
+        // Send data when flag bit SIMPLICITI_TRIGGER_SEND_DATA is set\r
+        if (getFlag(simpliciti_flag, SIMPLICITI_TRIGGER_SEND_DATA))\r
+        {\r
+            // Get radio ready. Wakes up in IDLE state.\r
+            SMPL_Ioctl(IOCTL_OBJ_RADIO, IOCTL_ACT_RADIO_AWAKE, 0);\r
+\r
+            // Acceleration / button events packets are 4 bytes long\r
+            SMPL_SendOpt(sLinkID1, simpliciti_data, 4, SMPL_TXOPTION_NONE);\r
+\r
+            // Put radio back to SLEEP state\r
+            SMPL_Ioctl(IOCTL_OBJ_RADIO, IOCTL_ACT_RADIO_SLEEP, 0);\r
+\r
+            clearFlag(simpliciti_flag, SIMPLICITI_TRIGGER_SEND_DATA);\r
+        }\r
+\r
+        // Exit when flag bit SIMPLICITI_TRIGGER_STOP is set\r
+        if (getFlag(simpliciti_flag, SIMPLICITI_TRIGGER_STOP))\r
+        {\r
+            // Clean up SimpliciTI stack to enable restarting\r
+            sInit_done = 0;\r
+            break;\r
+        }\r
+    }\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          simpliciti_main_sync\r
+// @brief       Send ready-to-receive packets in regular intervals. Listen shortly for host reply.\r
+//                             Decode received host command and trigger action.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void simpliciti_main_sync(void)\r
+{\r
+    uint8_t len, i;\r
+    uint8_t ed_data[2];\r
+\r
+    while (1)\r
+    {\r
+        // Sleep 0.5sec between ready-to-receive packets\r
+        // SimpliciTI has no low power delay function, so we have to use ours\r
+        Timer0_A4_Delay(CONV_MS_TO_TICKS(500));\r
+\r
+        // Get radio ready. Radio wakes up in IDLE state.\r
+        SMPL_Ioctl(IOCTL_OBJ_RADIO, IOCTL_ACT_RADIO_AWAKE, 0);\r
+\r
+        // Send 2 byte long ready-to-receive packet to stimulate host reply\r
+        ed_data[0] = SYNC_ED_TYPE_R2R;\r
+        ed_data[1] = 0xCB;\r
+        SMPL_SendOpt(sLinkID1, ed_data, 2, SMPL_TXOPTION_NONE);\r
+\r
+        // Wait shortly for host reply\r
+        SMPL_Ioctl(IOCTL_OBJ_RADIO, IOCTL_ACT_RADIO_RXON, 0);\r
+        NWK_DELAY(10);\r
+\r
+        // Check if a command packet was received\r
+        while (SMPL_Receive(sLinkID1, simpliciti_data, &len) == SMPL_SUCCESS)\r
+        {\r
+            // Decode received data\r
+            if (len > 0)\r
+            {\r
+                // Use callback function in application to decode data and react\r
+                simpliciti_sync_decode_ap_cmd_callback();\r
+\r
+                // Get reply data and send out reply packet burst (19 bytes each)\r
+                for (i = 0; i < simpliciti_reply_count; i++)\r
+                {\r
+                    NWK_DELAY(10);\r
+                    simpliciti_sync_get_data_callback(i);\r
+                    SMPL_SendOpt(sLinkID1, simpliciti_data, BM_SYNC_DATA_LENGTH, SMPL_TXOPTION_NONE);\r
+                }\r
+            }\r
+        }\r
+\r
+        // Put radio back to sleep\r
+        SMPL_Ioctl(IOCTL_OBJ_RADIO, IOCTL_ACT_RADIO_SLEEP, 0);\r
+\r
+        // Service watchdog\r
+        WDTCTL = WDTPW + WDTIS__512K + WDTSSEL__ACLK + WDTCNTCL;\r
+\r
+        // Exit when flag bit SIMPLICITI_TRIGGER_STOP is set\r
+        if (getFlag(simpliciti_flag, SIMPLICITI_TRIGGER_STOP))\r
+        {\r
+            // Clean up SimpliciTI stack to enable restarting\r
+            sInit_done = 0;\r
+            break;\r
+        }\r
+    }\r
+}\r
+\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/simpliciti/Applications/configuration/End Device/smpl_config.dat b/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/simpliciti/Applications/configuration/End Device/smpl_config.dat
new file mode 100755 (executable)
index 0000000..59bfa8a
--- /dev/null
@@ -0,0 +1,72 @@
+#\r
+#  Filename:       smpl_config.dat\r
+#  Revised:        $Date: 2008-11-18 16:54:54 -0800 (Tue, 18 Nov 2008) $\r
+#  Revision:       $Revision: 18453 $\r
+#  Author:         $Author: lfriedman $\r
+#\r
+#  Description:    This file supports the SimpliciTI Customer Configuration for End Devices.\r
+#\r
+#  Copyright 2008-2009 Texas Instruments Incorporated. All rights reserved.\r
+#\r
+#  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+#  the terms of a software license agreement between the user who downloaded the software,\r
+#  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+#  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+#  License. The License limits your use, and you acknowledge, that the Software may not be\r
+#  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+#  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+#  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+#  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+#  perform, display or sell this Software and/or its documentation for any purpose.\r
+#\r
+#  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+#  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+#  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+#  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+#  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+#  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+#  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+#  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+#  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+#\r
+#  Should you have any questions regarding your right to use this Software,\r
+#  contact Texas Instruments Incorporated at www.TI.com.\r
+\r
+\r
+# Number of connections supported. Each connection supports bi-directional\r
+# communication.  Access Points and Range Extenders can set this to 0 if they\r
+# do not host End Device objects.\r
+#--define=NUM_CONNECTIONS=2\r
+# [BM] Only allow 1 connection to RF access point\r
+--define=NUM_CONNECTIONS=1\r
+\r
+# Size of low level queues for sent and received frames. Affects RAM usage\r
+\r
+# AP needs larger input frame queue if it is supporting store-and-forward\r
+# clients because the forwarded messages are held here.\r
+--define=SIZE_INFRAME_Q=2\r
+\r
+# The output frame queue can be small since Tx is done synchronously. Actually\r
+# 1 is probably enough. If an Access Point device is also hosting an End Device \r
+# that sends to a sleeping peer the output queue should be larger -- the waiting \r
+# frames in this case are held here. In that case the output frame queue should \r
+# be bigger.\r
+--define=SIZE_OUTFRAME_Q=2\r
+\r
+# This device's address. The first byte is used as a filter on the CC1100/CC2500\r
+# radios so THE FIRST BYTE MUST NOT BE either 0x00 or 0xFF. Also, for these radios\r
+# on End Devices the first byte should be the least significant byte so the filtering\r
+# is maximally effective. Otherwise the frame has to be processed by the MCU before it\r
+# is recognized as not intended for the device. APs and REs run in promiscuous mode so\r
+# the filtering is not done. This macro intializes a static const array of unsigned\r
+# characters of length NET_ADDR_SIZE (found in nwk_types.h). The quotes (") are\r
+# necessary below unless the spaces are removed.\r
+--define=THIS_DEVICE_ADDRESS="{0x79, 0x56, 0x34, 0x12}"\r
+\r
+--define=END_DEVICE\r
+\r
+# For polling End Devices we need to specify that they do so. Uncomment the \r
+# macro definition below if this is a polling device. This field is used \r
+# by the Access Point to know whether to reserve store-and-forward support \r
+# for the polling End Device during the Join exchange.\r
+# --define=RX_POLLS\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/simpliciti/Applications/configuration/smpl_nwk_config.dat b/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/simpliciti/Applications/configuration/smpl_nwk_config.dat
new file mode 100755 (executable)
index 0000000..d14b792
--- /dev/null
@@ -0,0 +1,77 @@
+#\r
+#  Filename:       smpl_nwk_config.dat\r
+#  Revised:        $Date: 2009-02-07 14:21:07 -0700 (Sat, 07 Feb 2009) $\r
+#  Revision:       $Revision: 19010 $\r
+#  Author:         $Author: lfriedman $\r
+#\r
+#  Description:    This file supports the SimpliciTI Customer Configuration for overall network.\r
+#\r
+#  Copyright 2009 Texas Instruments Incorporated. All rights reserved.\r
+#\r
+#  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+#  the terms of a software license agreement between the user who downloaded the software,\r
+#  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+#  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+#  License. The License limits your use, and you acknowledge, that the Software may not be\r
+#  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+#  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+#  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+#  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+#  perform, display or sell this Software and/or its documentation for any purpose.\r
+#\r
+#  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+#  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+#  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+#  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+#  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+#  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+#  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+#  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+#  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+#\r
+#  Should you have any questions regarding your right to use this Software,\r
+#  contact Texas Instruments Incorporated at www.TI.com.\r
+\r
+\r
+# Max hop count\r
+--define=MAX_HOPS=3\r
+\r
+# Max hops away from and AP. Keeps hop count and therefore replay\r
+# storms down for sending to and from polling End Devices. Also used\r
+# when joining since the EDs can't be more than 1 hop away.\r
+--define=MAX_HOPS_FROM_AP=1\r
+\r
+# Maximum size of Network application payload. Do not change unless\r
+# protocol changes are reflected in different maximum network\r
+# application payload size.\r
+--define=MAX_NWK_PAYLOAD=9\r
+\r
+# Maximum size of application payload\r
+#--define=MAX_APP_PAYLOAD=10\r
+# [BM] Need to increase max payload for sync application\r
+--define=MAX_APP_PAYLOAD=19\r
+\r
+# Default Link token\r
+--define=DEFAULT_LINK_TOKEN=0x01020304\r
+\r
+# Default Join token\r
+--define=DEFAULT_JOIN_TOKEN=0x05060708\r
+\r
+# Define Frequency Agility as active for this build\r
+# [BM] No need for frequency hopping\r
+#--define=FREQUENCY_AGILITY\r
+\r
+# Enable application autoacknowledge support. Requires extended API as well\r
+--define=APP_AUTO_ACK\r
+\r
+# Enable Extended API\r
+--define=EXTENDED_API\r
+\r
+# Remove '#' corruption to enable security. \r
+#--define=SMPL_SECURE\r
+\r
+# Remove '#' to enable NV object support\r
+#--define=NVOBJECT_SUPPORT\r
+\r
+# Insert '#' to disable software timer\r
+--define=SW_TIMER\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/simpliciti/CC430_End_Device_433MHz.lib b/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/simpliciti/CC430_End_Device_433MHz.lib
new file mode 100755 (executable)
index 0000000..39953df
Binary files /dev/null and b/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/simpliciti/CC430_End_Device_433MHz.lib differ
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/simpliciti/CC430_End_Device_868MHz.lib b/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/simpliciti/CC430_End_Device_868MHz.lib
new file mode 100755 (executable)
index 0000000..dd55c0e
Binary files /dev/null and b/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/simpliciti/CC430_End_Device_868MHz.lib differ
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/simpliciti/CC430_End_Device_915MHz.lib b/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/simpliciti/CC430_End_Device_915MHz.lib
new file mode 100755 (executable)
index 0000000..9363600
Binary files /dev/null and b/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/simpliciti/CC430_End_Device_915MHz.lib differ
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/simpliciti/Components/bsp/boards/CC430EM/bsp_board.c b/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/simpliciti/Components/bsp/boards/CC430EM/bsp_board.c
new file mode 100755 (executable)
index 0000000..27f627b
--- /dev/null
@@ -0,0 +1,309 @@
+/**************************************************************************************************\r
+*  Filename:       bsp_board.c\r
+*  Revised:        $Date: 2009-10-11 16:48:20 -0700 (Sun, 11 Oct 2009) $\r
+*  Revision:       $Revision: 20896 $\r
+*\r
+*  Copyright 2008-2009 Texas Instruments Incorporated.  All rights reserved.\r
+*\r
+*  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+*  the terms of a software license agreement between the user who downloaded the software,\r
+*  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+*  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+*  License. The License limits your use, and you acknowledge, that the Software may not be\r
+*  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+*  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+*  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+*  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+*  perform, display or sell this Software and/or its documentation for any purpose.\r
+*\r
+*  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+*  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+*  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+*  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+*  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+*  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+*  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+*  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+*  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+*\r
+*  Should you have any questions regarding your right to use this Software,\r
+*  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+/* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+ *   BSP (Board Support Package)\r
+ *   Target : Texas Instruments CC430EM\r
+ *   Top-level board code file.\r
+ * =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+ */\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                            Includes\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#include "bsp.h"\r
+#include "bsp_config.h"\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                            Prototypes\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+static void SetVCore(uint8_t level);\r
+static void SetVCoreUp(uint8_t level);\r
+static void SetVCoreDown(uint8_t level);\r
+static void Bsp_SetVCore(void);\r
+static void Bsp_SetClocks(void);\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                            Defines\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#define BSP_TIMER_CLK_MHZ   12                                       /* 12 MHz MCLKC and SMCLK */\r
+#define BSP_DELAY_MAX_USEC  (0xFFFF / BSP_TIMER_CLK_MHZ)\r
+\r
+/**************************************************************************************************\r
+ * @fn          SetVCore\r
+ *\r
+ * @brief       SetVCore level is called from the user API. Change level by one step only.\r
+ *\r
+ * @param       level - VcCore level\r
+ *\r
+ * @return      none\r
+ **************************************************************************************************\r
+ */\r
+\r
+static void SetVCore(uint8_t level)\r
+{\r
+    uint8_t actLevel;\r
+\r
+    do {\r
+        actLevel = PMMCTL0_L & PMMCOREV_3;\r
+        if (actLevel < level)\r
+            SetVCoreUp(++actLevel);                                  /* Set VCore (step by step) */\r
+        if (actLevel > level)\r
+            SetVCoreDown(--actLevel);                                /* Set VCore (step by step) */\r
+    } while (actLevel != level);\r
+}\r
+\r
+/**************************************************************************************************\r
+ * @fn          SetVCoreUp\r
+ *\r
+ * @brief       Set VCore up. Change level by one step only.\r
+ *\r
+ * @param       level - VcCore level\r
+ *\r
+ * @return      none\r
+ *************************************************************************************************\r
+ */\r
+\r
+static void SetVCoreUp(uint8_t level)\r
+{\r
+    PMMCTL0_H = 0xA5;                                                /* Open PMM module registers\r
+                                                                      *for write access */\r
+\r
+    SVSMHCTL = SVSHE + SVSHRVL0 * level + SVMHE + SVSMHRRL0 * level; /* Set SVS/M high side to new\r
+                                                                      *level */\r
+\r
+    SVSMLCTL = SVSLE + SVMLE + SVSMLRRL0 * level;                    /* Set SVM new Level */\r
+    while ((PMMIFG & SVSMLDLYIFG) == 0) ;                            /* Wait till SVM is settled\r
+                                                                      *(Delay) */\r
+    PMMCTL0_L = PMMCOREV0 * level;                                   /* Set VCore to x */\r
+    PMMIFG &= ~(SVMLVLRIFG + SVMLIFG);                               /* Clear already set flags */\r
+    if ((PMMIFG & SVMLIFG))\r
+        while ((PMMIFG & SVMLVLRIFG) == 0) ;                         /* Wait till level is reached\r
+                                                                      **/\r
+\r
+    SVSMLCTL = SVSLE + SVSLRVL0 * level + SVMLE + SVSMLRRL0 * level; /* Set SVS/M Low side to new\r
+                                                                      *level */\r
+    PMMCTL0_H = 0x00;                                                /* Lock PMM module registers\r
+                                                                      *for write access */\r
+}\r
+\r
+/**************************************************************************************************\r
+ * @fn          SetVCoreDown\r
+ *\r
+ * @brief       Set VCore down\r
+ *\r
+ * @param       level - VcCore level\r
+ *\r
+ * @return      none\r
+ **************************************************************************************************\r
+ */\r
+\r
+static void SetVCoreDown(uint8_t level)\r
+{\r
+    PMMCTL0_H = 0xA5;                                                /* Open PMM module registers\r
+                                                                      *for write access */\r
+    SVSMLCTL = SVSLE + SVSLRVL0 * level + SVMLE + SVSMLRRL0 * level; /* Set SVS/M Low side to new\r
+                                                                      *level */\r
+    while ((PMMIFG & SVSMLDLYIFG) == 0) ;                            /* Wait till SVM is settled\r
+                                                                      *(Delay) */\r
+    PMMCTL0_L = (level * PMMCOREV0);                                 /* Set VCore to 1.85 V for Max\r
+                                                                      *Speed. */\r
+    PMMCTL0_H = 0x00;                                                /* Lock PMM module registers\r
+                                                                      *for write access */\r
+}\r
+\r
+/**************************************************************************************************\r
+ * @fn          Bsp_SetVCore\r
+ *\r
+ * @brief       Setup the core voltage.\r
+ *\r
+ * @param       none\r
+ *\r
+ * @return      none\r
+ **************************************************************************************************\r
+ */\r
+\r
+static void Bsp_SetVCore(void)\r
+{\r
+    SetVCore(3);\r
+}\r
+\r
+/**************************************************************************************************\r
+ * @fn          Bsp_SetClocks\r
+ *\r
+ * @brief       Set up system clocks.\r
+ *\r
+ * @param       none\r
+ *\r
+ * @return      none\r
+ **************************************************************************************************\r
+ */\r
+\r
+static void Bsp_SetClocks(void)\r
+{\r
+    /* Configure CPU clock for 12MHz */\r
+\r
+    /* If clock settings are changed, remember to update BSP_TIMER_CLK_MHZ.\r
+     * Otherwise, all timer settings would be incorrect.\r
+     */\r
+    UCSCTL3 |= SELREF_2;                    /* Set DCO FLL reference = REFO */\r
+    UCSCTL4 |= SELA_2;                      /* Set ACLK = REFO */\r
+\r
+    __bis_SR_register(SCG0);                /* Disable the FLL control loop */\r
+    UCSCTL0 = 0x0000;                       /* Set lowest possible DCOx, MODx */\r
+    UCSCTL1 = DCORSEL_5;                    /* Select DCO range 24MHz operation */\r
+    UCSCTL2 = FLLD_1 + 374;                 /* Set DCO Multiplier for 12MHz\r
+                                             * (N + 1) * FLLRef = Fdco\r
+                                             * (374 + 1) * 32768 = 12MHz\r
+                                             * Set FLL Div = fDCOCLK/2 */\r
+    __bic_SR_register(SCG0);                /* Enable the FLL control loop */\r
+\r
+    /* Worst-case settling time for the DCO when the DCO range bits have been\r
+     * changed is n x 32 x 32 x f_MCLK / f_FLL_reference.\r
+     * 32 x 32 x 12 MHz / 32,768 Hz = 375000 = MCLK cycles for DCO to settle\r
+     */\r
+    __delay_cycles(375000);\r
+\r
+    /* Loop until XT1,XT2 & DCO fault flag is cleared */\r
+    do\r
+    {\r
+        UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG + DCOFFG);\r
+        /* Clear XT2,XT1,DCO fault flags */\r
+        SFRIFG1 &= ~OFIFG;                  /* Clear fault flags */\r
+    } while (SFRIFG1 & OFIFG);              /* Test oscillator fault flag */\r
+\r
+    /* Select REFO as ACLK source and DCOCLK as MCLK and SMCLK source */\r
+    UCSCTL4 = SELA__REFOCLK | SELS__DCOCLKDIV | SELM__DCOCLKDIV;\r
+}\r
+\r
+/**************************************************************************************************\r
+ * @fn          BSP_EARLY_INIT\r
+ *\r
+ * @brief       This function is called by start-up code before doing the normal initialization\r
+ *              of data segments. If the return value is zero, initialization is not performed.\r
+ *              The global macro label "BSP_EARLY_INIT" gets #defined in the bsp_msp430_defs.h\r
+ *              file, according to the specific compiler environment (CCE or IAR). In the CCE\r
+ *              environment this macro invokes "_system_pre_init()" and in the IAR environment\r
+ *              this macro invokes "__low_level_init()".\r
+ *\r
+ * @param       None\r
+ *\r
+ * @return      0 - don't intialize data segments / 1 - do initialization\r
+ *************************************************************************************************\r
+ */\r
+BSP_EARLY_INIT(void)\r
+{\r
+    /* Disable watchdog timer */\r
+    WDTCTL = WDTPW | WDTHOLD;\r
+\r
+    /* Setup Vcore */\r
+    Bsp_SetVCore();\r
+\r
+    /* Configure System clocks */\r
+    Bsp_SetClocks();\r
+\r
+    /* Return 1 - run seg_init */\r
+    return (1);\r
+}\r
+\r
+/**************************************************************************************************\r
+ * @fn          BSP_InitBoard\r
+ *\r
+ * @brief       Initialize the board.\r
+ *\r
+ * @param       none\r
+ *\r
+ * @return      none\r
+ **************************************************************************************************\r
+ */\r
+\r
+void BSP_InitBoard(void)\r
+{\r
+    /* Configure TimerA for use by the delay function */\r
+\r
+    /* Reset the timer */\r
+    //TA0CTL |= TACLR; /* Set the TACLR  */\r
+\r
+    /* Clear all settings */\r
+    //TA0CTL = 0x0;\r
+\r
+    /* Select the clk source to be - SMCLK (Sub-Main CLK)*/\r
+    //TA0CTL |= TASSEL_2;\r
+\r
+    // [BM] We need to use TA1 for delay function, because TA0 is already occupied\r
+    TA1CTL |= TACLR; /* Set the TACLR  */\r
+    TA1CTL = 0x0;\r
+    TA1CTL |= TASSEL_2;\r
+}\r
+\r
+/**************************************************************************************************\r
+ * @fn          BSP_Delay\r
+ *\r
+ * @brief       Delay for the requested amount of time.\r
+ *\r
+ * @param       # of microseconds to delay.\r
+ *\r
+ * @return      none\r
+ **************************************************************************************************\r
+ */\r
+\r
+void BSP_Delay(uint16_t usec)\r
+{\r
+    BSP_ASSERT(usec < BSP_DELAY_MAX_USEC);\r
+\r
+    //TA0R = 0; /* initial count  */\r
+    //TA0CCR0 = BSP_TIMER_CLK_MHZ*usec; /* compare count. (delay in ticks) */\r
+\r
+    /* Start the timer in UP mode */\r
+    //TA0CTL |= MC_1;\r
+\r
+    /* Loop till compare interrupt flag is set */\r
+    //while(!(TA0CCTL0 & CCIFG));\r
+\r
+    /* Stop the timer */\r
+    //TA0CTL &= ~(MC_1);\r
+\r
+    /* Clear the interrupt flag */\r
+    //TA0CCTL0 &= ~CCIFG;\r
+\r
+    // [BM] We need to use TA1 for delay function, because TA0 is already occupied\r
+    TA1R = 0;\r
+    TA1CCR0 = BSP_TIMER_CLK_MHZ * usec;\r
+    TA1CTL |= MC_1;\r
+    while (!(TA1CCTL0 & CCIFG)) ;\r
+    TA1CTL &= ~(MC_1);\r
+    TA1CCTL0 &= ~CCIFG;\r
+}\r
+\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/simpliciti/Components/bsp/boards/CC430EM/bsp_board_defs.h b/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/simpliciti/Components/bsp/boards/CC430EM/bsp_board_defs.h
new file mode 100755 (executable)
index 0000000..ed67c36
--- /dev/null
@@ -0,0 +1,83 @@
+/**************************************************************************************************\r
+*  Revised:        $Date: 2007-07-06 11:19:00 -0700 (Fri, 06 Jul 2007) $\r
+*  Revision:       $Revision: 13579 $\r
+*\r
+*  Copyright 2007 Texas Instruments Incorporated.  All rights reserved.\r
+*\r
+*  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+*  the terms of a software license agreement between the user who downloaded the software,\r
+*  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+*  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+*  License. The License limits your use, and you acknowledge, that the Software may not be\r
+*  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+*  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+*  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+*  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+*  perform, display or sell this Software and/or its documentation for any purpose.\r
+*\r
+*  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+*  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+*  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+*  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+*  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+*  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+*  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+*  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+*  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+*\r
+*  Should you have any questions regarding your right to use this Software,\r
+*  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+/* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+ *   BSP (Board Support Package)\r
+ *   Target : Texas Instruments CC430EM\r
+ *   Board definition file.\r
+ * =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+ */\r
+\r
+#ifndef BSP_BOARD_DEFS_H\r
+#define BSP_BOARD_DEFS_H\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                     Board Unique Define\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#define BSP_BOARD_CC430EM\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                           Mcu\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#include "mcus/bsp_msp430_defs.h"\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                          Clock\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#include "bsp_config.h"\r
+#define __bsp_CLOCK_MHZ__         BSP_CONFIG_CLOCK_MHZ\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                     Board Initialization\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#define BSP_BOARD_C               "bsp_board.c"\r
+#define BSP_INIT_BOARD()          BSP_InitBoard()\r
+#define BSP_DELAY_USECS(x)        BSP_Delay(x)\r
+\r
+void BSP_InitBoard(void);\r
+void BSP_Delay(uint16_t usec);\r
+\r
+/* ************************************************************************************************\r
+ *                                   Compile Time Integrity Checks\r
+ * ************************************************************************************************\r
+ */\r
+\r
+/**************************************************************************************************\r
+ */\r
+#endif\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/simpliciti/Components/bsp/boards/CC430EM/bsp_button_defs.h b/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/simpliciti/Components/bsp/boards/CC430EM/bsp_button_defs.h
new file mode 100755 (executable)
index 0000000..beac8c7
--- /dev/null
@@ -0,0 +1,92 @@
+/**************************************************************************************************\r
+*  Revised:        $Date: 2007-07-06 11:19:00 -0700 (Fri, 06 Jul 2007) $\r
+*  Revision:       $Revision: 13579 $\r
+*\r
+*  Copyright 2007 Texas Instruments Incorporated.  All rights reserved.\r
+*\r
+*  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+*  the terms of a software license agreement between the user who downloaded the software,\r
+*  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+*  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+*  License. The License limits your use, and you acknowledge, that the Software may not be\r
+*  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+*  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+*  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+*  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+*  perform, display or sell this Software and/or its documentation for any purpose.\r
+*\r
+*  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+*  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+*  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+*  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+*  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+*  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+*  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+*  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+*  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+*\r
+*  Should you have any questions regarding your right to use this Software,\r
+*  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+/* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+ *   BSP (Board Support Package)\r
+ *   Target : Texas Instruments CC430EM\r
+ *   Button definition file.\r
+ * =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+ */\r
+\r
+#ifndef BSP_BUTTON_DEFS_H\r
+#define BSP_BUTTON_DEFS_H\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                           Includes\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#include "bsp_board_defs.h"\r
+#include "bsp_macros.h"\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                      Button Configuration\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#define __bsp_NUM_BUTTONS__                   1\r
+#define __bsp_BUTTON_DEBOUNCE_WAIT__(expr)    st( \\r
+        int i; for (i = 0; i < 500; i++){ if (!(expr)) i = 0; })\r
+\r
+\r
+/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+ *                 BUTTON #1\r
+ * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+ *   Schematic   :  S2\r
+ *   Description :  Push Button\r
+ *   Polarity    :  Active Low\r
+ *   GPIO        :  P1.7\r
+ * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+ */\r
+#define __bsp_BUTTON1_BIT__             7\r
+#define __bsp_BUTTON1_PORT__            P1IN\r
+#define __bsp_BUTTON1_IS_ACTIVE_LOW__   1\r
+\r
+\r
+/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+ *          Extended Configuration\r
+ * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+ */\r
+/* Enable the internal PullUp for button #1. */\r
+#define __bsp_BUTTON_EXTENDED_CONFIG__() st(P1OUT |= BV(__bsp_BUTTON1_BIT__);   /* PullUp */ \\r
+                                            P1REN |= BV(__bsp_BUTTON1_BIT__); ) /* Enable PullUp */\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                Include Generic Button Macros\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#include "code/bsp_generic_buttons.h"\r
+\r
+\r
+/**************************************************************************************************\r
+ */\r
+#endif\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/simpliciti/Components/bsp/boards/CC430EM/bsp_config.h b/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/simpliciti/Components/bsp/boards/CC430EM/bsp_config.h
new file mode 100755 (executable)
index 0000000..fd29193
--- /dev/null
@@ -0,0 +1,47 @@
+/**************************************************************************************************\r
+*  Revised:        $Date: 2007-07-06 11:19:00 -0700 (Fri, 06 Jul 2007) $\r
+*  Revision:       $Revision: 13579 $\r
+*\r
+*  Copyright 2007 Texas Instruments Incorporated.  All rights reserved.\r
+*\r
+*  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+*  the terms of a software license agreement between the user who downloaded the software,\r
+*  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+*  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+*  License. The License limits your use, and you acknowledge, that the Software may not be\r
+*  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+*  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+*  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+*  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+*  perform, display or sell this Software and/or its documentation for any purpose.\r
+*\r
+*  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+*  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+*  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+*  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+*  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+*  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+*  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+*  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+*  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+*\r
+*  Should you have any questions regarding your right to use this Software,\r
+*  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+/* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+ *   BSP (Board Support Package)\r
+ *   Target : Texas Instruments CC430EM\r
+ *   Board configuration file.\r
+ * =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+ */\r
+\r
+#ifndef BSP_CONFIG_H\r
+#define BSP_CONFIG_H\r
+\r
+\r
+/* Nothing needed for this platform. */\r
+\r
+/**************************************************************************************************\r
+ */\r
+#endif\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/simpliciti/Components/bsp/boards/CC430EM/bsp_driver_defs.h b/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/simpliciti/Components/bsp/boards/CC430EM/bsp_driver_defs.h
new file mode 100755 (executable)
index 0000000..2dc5732
--- /dev/null
@@ -0,0 +1,54 @@
+/**************************************************************************************************\r
+*  Revised:        $Date: 2007-07-06 11:19:00 -0700 (Fri, 06 Jul 2007) $\r
+*  Revision:       $Revision: 13579 $\r
+*\r
+*  Copyright 2007 Texas Instruments Incorporated.  All rights reserved.\r
+*\r
+*  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+*  the terms of a software license agreement between the user who downloaded the software,\r
+*  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+*  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+*  License. The License limits your use, and you acknowledge, that the Software may not be\r
+*  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+*  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+*  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+*  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+*  perform, display or sell this Software and/or its documentation for any purpose.\r
+*\r
+*  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+*  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+*  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+*  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+*  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+*  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+*  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+*  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+*  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+*\r
+*  Should you have any questions regarding your right to use this Software,\r
+*  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+/* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+ *   BSP (Board Support Package)\r
+ *   Target : Texas Instruments CC430EM\r
+ *   Driver definition file.\r
+ * =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+ */\r
+\r
+#ifndef BSP_DRIVER_DEFS_H\r
+#define BSP_DRIVER_DEFS_H\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                     Driver Initialization\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#define BSP_DRIVERS_C               "bsp_drivers.c"\r
+#define BSP_INIT_DRIVERS()          BSP_InitDrivers()\r
+void BSP_InitDrivers(void);\r
+\r
+\r
+/**************************************************************************************************\r
+ */\r
+#endif\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/simpliciti/Components/bsp/boards/CC430EM/bsp_drivers.c b/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/simpliciti/Components/bsp/boards/CC430EM/bsp_drivers.c
new file mode 100755 (executable)
index 0000000..0e08bb2
--- /dev/null
@@ -0,0 +1,88 @@
+/**************************************************************************************************\r
+*  Revised:        $Date: 2007-07-06 11:19:00 -0700 (Fri, 06 Jul 2007) $\r
+*  Revision:       $Revision: 13579 $\r
+*\r
+*  Copyright 2007 Texas Instruments Incorporated.  All rights reserved.\r
+*\r
+*  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+*  the terms of a software license agreement between the user who downloaded the software,\r
+*  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+*  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+*  License. The License limits your use, and you acknowledge, that the Software may not be\r
+*  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+*  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+*  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+*  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+*  perform, display or sell this Software and/or its documentation for any purpose.\r
+*\r
+*  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+*  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+*  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+*  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+*  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+*  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+*  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+*  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+*  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+*\r
+*  Should you have any questions regarding your right to use this Software,\r
+*  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+/* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+ *   BSP (Board Support Package)\r
+ *   Target : Texas Instruments CC430EM\r
+ *   Top-level driver file.\r
+ * =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+ */\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                            Includes\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#include "bsp_driver_defs.h"\r
+#include "bsp_leds.h"\r
+#include "bsp_buttons.h"\r
+#include "bsp_config.h"\r
+\r
+\r
+/**************************************************************************************************\r
+ * @fn          BSP_InitDrivers\r
+ *\r
+ * @brief       Initialize all enabled BSP drivers.\r
+ *\r
+ * @param       none\r
+ *\r
+ * @return      none\r
+ **************************************************************************************************\r
+ */\r
+\r
+void BSP_InitDrivers(void)\r
+{\r
+#if (!defined BSP_NO_LEDS)\r
+    BSP_InitLeds();\r
+#endif\r
+\r
+#if (!defined BSP_NO_BUTTONS)\r
+    BSP_InitButtons();\r
+#endif\r
+}\r
+\r
+/* ================================================================================================\r
+ *                                        C Code Includes\r
+ * ================================================================================================\r
+ */\r
+#ifndef BSP_NO_LEDS\r
+#    include "drivers/code/bsp_leds.c"\r
+#endif\r
+\r
+#ifndef BSP_NO_BUTTONS\r
+#    include "drivers/code/bsp_buttons.c"\r
+#endif\r
+\r
+\r
+/**************************************************************************************************\r
+ */\r
+\r
+\r
+\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/simpliciti/Components/bsp/boards/CC430EM/bsp_external/mrfi_board_defs.h b/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/simpliciti/Components/bsp/boards/CC430EM/bsp_external/mrfi_board_defs.h
new file mode 100755 (executable)
index 0000000..4e8ff55
--- /dev/null
@@ -0,0 +1,81 @@
+/**************************************************************************************************\r
+*  Revised:        $Date: 2007-07-06 11:19:00 -0700 (Fri, 06 Jul 2007) $\r
+*  Revision:       $Revision: 13579 $\r
+*\r
+*  Copyright 2007 Texas Instruments Incorporated.  All rights reserved.\r
+*\r
+*  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+*  the terms of a software license agreement between the user who downloaded the software,\r
+*  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+*  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+*  License. The License limits your use, and you acknowledge, that the Software may not be\r
+*  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+*  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+*  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+*  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+*  perform, display or sell this Software and/or its documentation for any purpose.\r
+*\r
+*  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+*  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+*  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+*  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+*  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+*  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+*  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+*  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+*  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+*\r
+*  Should you have any questions regarding your right to use this Software,\r
+*  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+/* ~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=\r
+ *   MRFI (Minimal RF Interface)\r
+ *   Board definition file.\r
+ *   Target : Texas Instruments CC430EM\r
+ *   Radios : CC430\r
+ * ~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=\r
+ */\r
+\r
+#ifndef MRFI_BOARD_DEFS_H\r
+#define MRFI_BOARD_DEFS_H\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                           Includes\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#include "bsp.h"\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                           Defines\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                        Radio Selection\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#if (!defined MRFI_CC430)\r
+#    error "ERROR: A compatible radio must be specified for the CC430EM board."\r
+#endif\r
+\r
+\r
+/* Radio Interface critical section macros */\r
+typedef bspIState_t mrfiRIFIState_t;\r
+#define MRFI_RIF_ENTER_CRITICAL_SECTION(x)    BSP_ENTER_CRITICAL_SECTION(x)\r
+#define MRFI_RIF_EXIT_CRITICAL_SECTION(x)     BSP_EXIT_CRITICAL_SECTION(x)\r
+\r
+\r
+/**************************************************************************************************\r
+ *                                  Compile Time Integrity Checks\r
+ **************************************************************************************************\r
+ */\r
+#ifndef BSP_BOARD_CC430EM\r
+#    error "ERROR: Mismatch between specified board and MRFI configuration."\r
+#endif\r
+\r
+\r
+/**************************************************************************************************\r
+ */\r
+#endif\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/simpliciti/Components/bsp/boards/CC430EM/bsp_led_defs.h b/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/simpliciti/Components/bsp/boards/CC430EM/bsp_led_defs.h
new file mode 100755 (executable)
index 0000000..e213c25
--- /dev/null
@@ -0,0 +1,97 @@
+/**************************************************************************************************\r
+*  Revised:        $Date: 2007-07-06 11:19:00 -0700 (Fri, 06 Jul 2007) $\r
+*  Revision:       $Revision: 13579 $\r
+*\r
+*  Copyright 2007 Texas Instruments Incorporated.  All rights reserved.\r
+*\r
+*  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+*  the terms of a software license agreement between the user who downloaded the software,\r
+*  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+*  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+*  License. The License limits your use, and you acknowledge, that the Software may not be\r
+*  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+*  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+*  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+*  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+*  perform, display or sell this Software and/or its documentation for any purpose.\r
+*\r
+*  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+*  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+*  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+*  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+*  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+*  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+*  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+*  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+*  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+*\r
+*  Should you have any questions regarding your right to use this Software,\r
+*  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+/* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+ *   BSP (Board Support Package)\r
+ *   Target : Texas Instruments CC430EM\r
+ *   LED definition file.\r
+ * =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+ */\r
+\r
+#ifndef BSP_LED_DEFS_H\r
+#define BSP_LED_DEFS_H\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                           Includes\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#include "bsp_board_defs.h"\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                      Configuration\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#define __bsp_NUM_LEDS__               2\r
+#define __bsp_LED_BLINK_LOOP_COUNT__   0x34000\r
+\r
+\r
+/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+ *                 LED #1\r
+ * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+ *   Schematic :  LED1\r
+ *   Color     :  Green\r
+ *   Polarity  :  Active High\r
+ *   GPIO      :  P1.0\r
+ * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+ */\r
+#define __bsp_LED1_BIT__            0\r
+#define __bsp_LED1_PORT__           P1OUT\r
+#define __bsp_LED1_DDR__            P1DIR\r
+#define __bsp_LED1_IS_ACTIVE_LOW__  0\r
+\r
+\r
+/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+ *                 LED #2\r
+ * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+ *   Schematic :  LED2\r
+ *   Color     :  Green\r
+ *   Polarity  :  Active High\r
+ *   GPIO      :  P3.6\r
+ * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+ */\r
+#define __bsp_LED2_BIT__            6\r
+#define __bsp_LED2_PORT__           P3OUT\r
+#define __bsp_LED2_DDR__            P3DIR\r
+#define __bsp_LED2_IS_ACTIVE_LOW__  0\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                 Include Generic LED Macros\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#include "code/bsp_generic_leds.h"\r
+\r
+\r
+/**************************************************************************************************\r
+ */\r
+#endif\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/simpliciti/Components/bsp/bsp.c b/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/simpliciti/Components/bsp/bsp.c
new file mode 100755 (executable)
index 0000000..c0bedd3
--- /dev/null
@@ -0,0 +1,102 @@
+/**************************************************************************************************\r
+*  Revised:        $Date: 2007-07-06 11:19:00 -0700 (Fri, 06 Jul 2007) $\r
+*  Revision:       $Revision: 13579 $\r
+*\r
+*  Copyright 2007 Texas Instruments Incorporated.  All rights reserved.\r
+*\r
+*  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+*  the terms of a software license agreement between the user who downloaded the software,\r
+*  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+*  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+*  License. The License limits your use, and you acknowledge, that the Software may not be\r
+*  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+*  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+*  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+*  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+*  perform, display or sell this Software and/or its documentation for any purpose.\r
+*\r
+*  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+*  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+*  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+*  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+*  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+*  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+*  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+*  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+*  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+*\r
+*  Should you have any questions regarding your right to use this Software,\r
+*  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+/* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+ *   BSP (Board Support Package)\r
+ *   Top-level BSP code file.\r
+ * =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+ */\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                            Includes\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#include "bsp.h"\r
+#include "bsp_driver_defs.h"\r
+\r
+\r
+/**************************************************************************************************\r
+ * @fn          BSP_Init\r
+ *\r
+ * @brief       Initialize the board and drivers.\r
+ *\r
+ * @param       none\r
+ *\r
+ * @return      none\r
+ **************************************************************************************************\r
+ */\r
+\r
+void BSP_Init(void)\r
+{\r
+    BSP_INIT_BOARD();\r
+    BSP_INIT_DRIVERS();\r
+\r
+    /*-------------------------------------------------------------\r
+     *  Run time integrity checks.  Perform only if asserts\r
+     *  are enabled.\r
+     */\r
+#ifdef BSP_ASSERTS_ARE_ON\r
+    /* verify endianess is correctly specified */\r
+    {\r
+        uint16_t test = 0x00AA;                                   /* first storage byte of 'test' is\r
+                                                                   *non-zero for little endian */\r
+        BSP_ASSERT(!(*((uint8_t *)&test)) == !BSP_LITTLE_ENDIAN); /* endianess mismatch */\r
+    }\r
+#endif\r
+}\r
+\r
+/* ================================================================================================\r
+ *                                        C Code Includes\r
+ * ================================================================================================\r
+ */\r
+#ifdef BSP_BOARD_C\r
+#    include BSP_BOARD_C\r
+#endif\r
+\r
+#ifdef BSP_DRIVERS_C\r
+#    include BSP_DRIVERS_C\r
+#endif\r
+\r
+\r
+/* ************************************************************************************************\r
+ *                                   Compile Time Integrity Checks\r
+ * ************************************************************************************************\r
+ */\r
+BSP_STATIC_ASSERT(sizeof(uint8_t) == 1);\r
+BSP_STATIC_ASSERT(sizeof(int8_t) == 1);\r
+BSP_STATIC_ASSERT(sizeof(uint16_t) == 2);\r
+BSP_STATIC_ASSERT(sizeof(int16_t) == 2);\r
+BSP_STATIC_ASSERT(sizeof(uint32_t) == 4);\r
+BSP_STATIC_ASSERT(sizeof(int32_t) == 4);\r
+\r
+\r
+/**************************************************************************************************\r
+ */\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/simpliciti/Components/bsp/bsp.h b/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/simpliciti/Components/bsp/bsp.h
new file mode 100755 (executable)
index 0000000..d249d39
--- /dev/null
@@ -0,0 +1,184 @@
+/**************************************************************************************************\r
+*  Revised:        $Date: 2007-07-06 11:19:00 -0700 (Fri, 06 Jul 2007) $\r
+*  Revision:       $Revision: 13579 $\r
+*\r
+*  Copyright 2007 Texas Instruments Incorporated.  All rights reserved.\r
+*\r
+*  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+*  the terms of a software license agreement between the user who downloaded the software,\r
+*  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+*  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+*  License. The License limits your use, and you acknowledge, that the Software may not be\r
+*  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+*  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+*  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+*  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+*  perform, display or sell this Software and/or its documentation for any purpose.\r
+*\r
+*  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+*  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+*  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+*  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+*  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+*  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+*  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+*  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+*  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+*\r
+*  Should you have any questions regarding your right to use this Software,\r
+*  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+/* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+ *   BSP (Board Support Package)\r
+ *   Include file for core BSP services.\r
+ * =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+ */\r
+\r
+#ifndef BSP_H\r
+#define BSP_H\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                           Includes\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#include "bsp_board_defs.h"\r
+#include "bsp_macros.h"\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                          BSP Defines\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#define BSP\r
+#define BSP_VER       100  /* BSP version 1.00a */\r
+#define BSP_SUBVER    a\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                            Clock\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#define BSP_CLOCK_MHZ   __bsp_CLOCK_MHZ__\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                            Memory\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#ifndef __bsp_LITTLE_ENDIAN__\r
+#    error ERROR: Endianess not defined\r
+#endif\r
+\r
+#define BSP_LITTLE_ENDIAN   __bsp_LITTLE_ENDIAN__\r
+\r
+#define CODE    __bsp_CODE_MEMSPACE__\r
+#define XDATA   __bsp_XDATA_MEMSPACE__\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                            Interrupts\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#define BSP_ISR_FUNCTION(func, vect)     __bsp_ISR_FUNCTION__(func, vect)\r
+\r
+#define BSP_ENABLE_INTERRUPTS()         __bsp_ENABLE_INTERRUPTS__()\r
+#define BSP_DISABLE_INTERRUPTS()        __bsp_DISABLE_INTERRUPTS__()\r
+#define BSP_INTERRUPTS_ARE_ENABLED()    __bsp_INTERRUPTS_ARE_ENABLED__()\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                         Critical Sections\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+typedef __bsp_ISTATE_T__ bspIState_t;\r
+\r
+#define BSP_ENTER_CRITICAL_SECTION(x)   st(x = __bsp_GET_ISTATE__(); __bsp_DISABLE_INTERRUPTS__(); )\r
+#define BSP_EXIT_CRITICAL_SECTION(x)    __bsp_RESTORE_ISTATE__(x)\r
+#define BSP_CRITICAL_STATEMENT(x)       st(bspIState_t s;                    \\r
+                                           BSP_ENTER_CRITICAL_SECTION(s);    \\r
+                                           x;                                \\r
+                                           BSP_EXIT_CRITICAL_SECTION(s); )\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                           Asserts\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+\r
+/*\r
+ *  BSP_ASSERT( expression ) - The given expression must evaluate as "true" or else the assert\r
+ *  handler is called.  From here, the call stack feature of the debugger can pinpoint where\r
+ * the problem occurred.\r
+ *\r
+ *  BSP_FORCE_ASSERT() - If asserts are in use, immediately calls the assert handler.\r
+ *\r
+ *  BSP_ASSERTS_ARE_ON - can use #ifdef to see if asserts are enabled\r
+ *\r
+ *  Asserts can be disabled for optimum performance and minimum code size (ideal for\r
+ *  finalized, debugged production code).\r
+ */\r
+\r
+#if (!defined BSP_NO_DEBUG)\r
+#    ifndef BSP_ASSERT_HANDLER\r
+#        define BSP_ASSERT_HANDLER()      st(__bsp_DISABLE_INTERRUPTS__();  while (1) ; )\r
+#    endif\r
+#    define BSP_ASSERT(expr)          st(if (!(expr)) BSP_ASSERT_HANDLER(); )\r
+#    define BSP_FORCE_ASSERT()        BSP_ASSERT_HANDLER()\r
+#    define BSP_ASSERTS_ARE_ON\r
+#else\r
+#    define BSP_ASSERT(expr)      /* empty */\r
+#    define BSP_FORCE_ASSERT()    /* empty */\r
+#endif\r
+\r
+/* static assert */\r
+#define BSP_STATIC_ASSERT(expr)   void bspDummyPrototype(char dummy[1 / ((expr) != 0)])\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                           Prototypes\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+void BSP_Init(void);\r
+\r
+/**************************************************************************************************\r
+ */\r
+\r
+/****************************************************************************************\r
+*                                 BEGIN ENDIAN SUPPORT\r
+*\r
+* Security encrypt/decrypt operates on unsigned long quantities. These must match on\r
+* source and destination platforms. These macros enforce the standard conversions.\r
+* Currently all platforms (CC2520/CC2x30 and MSP430) are little endian.\r
+*\r
+*******************   Network order for encryption is LITTLE ENDIAN   ******************\r
+*\r
+****************************************************************************************/\r
+\r
+#if (BSP_LITTLE_ENDIAN != 0)\r
+#    define   ntohs(x)    (x)\r
+#    define   htons(x)    (x)\r
+\r
+#    define   ntohl(x)    (x)\r
+#    define   htonl(x)    (x)\r
+\r
+#else\r
+\r
+#    define   ntohs(x)    (((x >> 8) & 0xFF) | ((x & 0xFF) << 8))\r
+#    define   htons(x)    (((x >> 8) & 0xFF) | ((x & 0xFF) << 8))\r
+\r
+#    define   ntohl(x)    (((x >> 24) & 0xFF) | ((x >> 8) & 0xFF00) | \\r
+                           ((x & 0xFF00) << 8) | ((x & 0xFF) << 24)   \\r
+                           )\r
+#    define   htonl(x)    (((x >> 24) & 0xFF) | ((x >> 8) & 0xFF00) | \\r
+                           ((x & 0xFF00) << 8) | ((x & 0xFF) << 24)   \\r
+                           )\r
+\r
+#endif  /* (BSP_LITTLE_ENDIAN != 0) */\r
+\r
+/***************************************************************************************\r
+*                                 END ENDIAN SUPPORT\r
+***************************************************************************************/\r
+\r
+\r
+\r
+#endif\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/simpliciti/Components/bsp/bsp_macros.h b/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/simpliciti/Components/bsp/bsp_macros.h
new file mode 100755 (executable)
index 0000000..60392ba
--- /dev/null
@@ -0,0 +1,79 @@
+/**************************************************************************************************\r
+*  Revised:        $Date: 2007-07-06 11:19:00 -0700 (Fri, 06 Jul 2007) $\r
+*  Revision:       $Revision: 13579 $\r
+*\r
+*  Copyright 2007 Texas Instruments Incorporated.  All rights reserved.\r
+*\r
+*  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+*  the terms of a software license agreement between the user who downloaded the software,\r
+*  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+*  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+*  License. The License limits your use, and you acknowledge, that the Software may not be\r
+*  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+*  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+*  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+*  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+*  perform, display or sell this Software and/or its documentation for any purpose.\r
+*\r
+*  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+*  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+*  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+*  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+*  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+*  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+*  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+*  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+*  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+*\r
+*  Should you have any questions regarding your right to use this Software,\r
+*  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+/* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+ *   BSP (Board Support Package)\r
+ *   Include file for BSP utility macros.\r
+ * =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+ */\r
+\r
+#ifndef BSP_MACROS_H\r
+#define BSP_MACROS_H\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                          Macros\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+/* bit value */\r
+#ifndef BV\r
+#    define BV(n)      (1 << (n))\r
+#endif\r
+\r
+/*\r
+ *  This macro is for use by other macros to form a fully valid C statement.\r
+ *  Without this, the if/else conditionals could show unexpected behavior.\r
+ *\r
+ *  For example, use...\r
+ *    #define SET_REGS()  st( ioreg1 = 0; ioreg2 = 0; )\r
+ *  instead of ...\r
+ *    #define SET_REGS()  { ioreg1 = 0; ioreg2 = 0; }\r
+ *  or\r
+ *    #define  SET_REGS()    ioreg1 = 0; ioreg2 = 0;\r
+ *  The last macro would not behave as expected in the if/else construct.\r
+ *  The second to last macro will cause a compiler error in certain uses\r
+ *  of if/else construct\r
+ *\r
+ *  It is not necessary, or recommended, to use this macro where there is\r
+ *  already a valid C statement.  For example, the following is redundant...\r
+ *    #define CALL_FUNC()   st(  func();  )\r
+ *  This should simply be...\r
+ *    #define CALL_FUNC()   func()\r
+ *\r
+ * (The while condition below evaluates false without generating a\r
+ *  constant-controlling-loop type of warning on most compilers.)\r
+ */\r
+#define st(x)      do { x } while (__LINE__ == -1)\r
+\r
+\r
+/**************************************************************************************************\r
+ */\r
+#endif\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/simpliciti/Components/bsp/drivers/bsp_buttons.h b/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/simpliciti/Components/bsp/drivers/bsp_buttons.h
new file mode 100755 (executable)
index 0000000..6ec3d99
--- /dev/null
@@ -0,0 +1,90 @@
+/**************************************************************************************************\r
+*  Revised:        $Date: 2007-07-06 11:19:00 -0700 (Fri, 06 Jul 2007) $\r
+*  Revision:       $Revision: 13579 $\r
+*\r
+*  Copyright 2007 Texas Instruments Incorporated. All rights reserved.\r
+*\r
+*  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+*  the terms of a software license agreement between the user who downloaded the software,\r
+*  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+*  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+*  License. The License limits your use, and you acknowledge, that the Software may not be\r
+*  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+*  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+*  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+*  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+*  perform, display or sell this Software and/or its documentation for any purpose.\r
+*\r
+*  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+*  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+*  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+*  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+*  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+*  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+*  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+*  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+*  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+*\r
+*  Should you have any questions regarding your right to use this Software,\r
+*  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+/* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+ *   BSP (Board Support Package)\r
+ *   Button driver include file.\r
+ * =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+ */\r
+\r
+#ifndef BSP_BUTTONS_H\r
+#define BSP_BUTTONS_H\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                           Includes\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#include "bsp_button_defs.h"\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                           Defines\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#define BSP_NUM_BUTTONS                   __bsp_NUM_BUTTONS__\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                            Macros\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#define BSP_BUTTON_DEBOUNCE_WAIT(expr)    __bsp_BUTTON_DEBOUNCE_WAIT__(expr)\r
+\r
+#define BSP_BUTTON1()   __bsp_BUTTON1__()\r
+#define BSP_BUTTON2()   __bsp_BUTTON2__()\r
+#define BSP_BUTTON3()   __bsp_BUTTON3__()\r
+#define BSP_BUTTON4()   __bsp_BUTTON4__()\r
+#define BSP_BUTTON5()   __bsp_BUTTON5__()\r
+#define BSP_BUTTON6()   __bsp_BUTTON6__()\r
+#define BSP_BUTTON7()   __bsp_BUTTON7__()\r
+#define BSP_BUTTON8()   __bsp_BUTTON8__()\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                        Prototypes\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+void BSP_InitButtons(void);\r
+\r
+\r
+/* ************************************************************************************************\r
+ *                                   Compile Time Integrity Checks\r
+ * ************************************************************************************************\r
+ */\r
+#ifdef BSP_NO_BUTTONS\r
+#    error "ERROR: The button driver is disabled.  This file should not be included."\r
+#endif\r
+\r
+\r
+/**************************************************************************************************\r
+ */\r
+#endif\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/simpliciti/Components/bsp/drivers/bsp_leds.h b/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/simpliciti/Components/bsp/drivers/bsp_leds.h
new file mode 100755 (executable)
index 0000000..2d0195e
--- /dev/null
@@ -0,0 +1,133 @@
+/**************************************************************************************************\r
+*  Revised:        $Date: 2007-07-06 11:19:00 -0700 (Fri, 06 Jul 2007) $\r
+*  Revision:       $Revision: 13579 $\r
+*\r
+*  Copyright 2007 Texas Instruments Incorporated.  All rights reserved.\r
+*\r
+*  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+*  the terms of a software license agreement between the user who downloaded the software,\r
+*  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+*  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+*  License. The License limits your use, and you acknowledge, that the Software may not be\r
+*  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+*  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+*  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+*  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+*  perform, display or sell this Software and/or its documentation for any purpose.\r
+*\r
+*  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+*  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+*  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+*  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+*  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+*  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+*  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+*  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+*  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+*\r
+*  Should you have any questions regarding your right to use this Software,\r
+*  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+/* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+ *   BSP (Board Support Package)\r
+ *   LED driver include file.\r
+ * =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+ */\r
+\r
+#ifndef BSP_LEDS_H\r
+#define BSP_LEDS_H\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                           Includes\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#include "bsp_led_defs.h"\r
+#include "bsp_macros.h"\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                             Defines\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#define BSP_NUM_LEDS            __bsp_NUM_LEDS__\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                              Macros\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+\r
+/* blink delay loop */\r
+#define BSP_LED_BLINK_DELAY()   st({ volatile uint32_t i; \\r
+                                     for (i = 0; i < __bsp_LED_BLINK_LOOP_COUNT__; i++){ }; })\r
+\r
+/* LED1 */\r
+#define BSP_TURN_ON_LED1()      __bsp_LED1_TURN_ON__()\r
+#define BSP_TURN_OFF_LED1()     __bsp_LED1_TURN_OFF__()\r
+#define BSP_TOGGLE_LED1()       __bsp_LED1_TOGGLE__()\r
+#define BSP_LED1_IS_ON()        __bsp_LED1_IS_ON__()\r
+\r
+/* LED2 */\r
+#define BSP_TURN_ON_LED2()      __bsp_LED2_TURN_ON__()\r
+#define BSP_TURN_OFF_LED2()     __bsp_LED2_TURN_OFF__()\r
+#define BSP_TOGGLE_LED2()       __bsp_LED2_TOGGLE__()\r
+#define BSP_LED2_IS_ON()        __bsp_LED2_IS_ON__()\r
+\r
+/* LED3 */\r
+#define BSP_TURN_ON_LED3()      __bsp_LED3_TURN_ON__()\r
+#define BSP_TURN_OFF_LED3()     __bsp_LED3_TURN_OFF__()\r
+#define BSP_TOGGLE_LED3()       __bsp_LED3_TOGGLE__()\r
+#define BSP_LED3_IS_ON()        __bsp_LED3_IS_ON__()\r
+\r
+/* LED4 */\r
+#define BSP_TURN_ON_LED4()      __bsp_LED4_TURN_ON__()\r
+#define BSP_TURN_OFF_LED4()     __bsp_LED4_TURN_OFF__()\r
+#define BSP_TOGGLE_LED4()       __bsp_LED4_TOGGLE__()\r
+#define BSP_LED4_IS_ON()        __bsp_LED4_IS_ON__()\r
+\r
+/* LED5 */\r
+#define BSP_TURN_ON_LED5()      __bsp_LED5_TURN_ON__()\r
+#define BSP_TURN_OFF_LED5()     __bsp_LED5_TURN_OFF__()\r
+#define BSP_TOGGLE_LED5()       __bsp_LED5_TOGGLE__()\r
+#define BSP_LED5_IS_ON()        __bsp_LED5_IS_ON__()\r
+\r
+/* LED6 */\r
+#define BSP_TURN_ON_LED6()      __bsp_LED6_TURN_ON__()\r
+#define BSP_TURN_OFF_LED6()     __bsp_LED6_TURN_OFF__()\r
+#define BSP_TOGGLE_LED6()       __bsp_LED6_TOGGLE__()\r
+#define BSP_LED6_IS_ON()        __bsp_LED6_IS_ON__()\r
+\r
+/* LED7 */\r
+#define BSP_TURN_ON_LED7()      __bsp_LED7_TURN_ON__()\r
+#define BSP_TURN_OFF_LED7()     __bsp_LED7_TURN_OFF__()\r
+#define BSP_TOGGLE_LED7()       __bsp_LED7_TOGGLE__()\r
+#define BSP_LED7_IS_ON()        __bsp_LED7_IS_ON__()\r
+\r
+/* LED8 */\r
+#define BSP_TURN_ON_LED8()      __bsp_LED8_TURN_ON__()\r
+#define BSP_TURN_OFF_LED8()     __bsp_LED8_TURN_OFF__()\r
+#define BSP_TOGGLE_LED8()       __bsp_LED8_TOGGLE__()\r
+#define BSP_LED8_IS_ON()        __bsp_LED8_IS_ON__()\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                        Prototypes\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+void BSP_InitLeds(void);\r
+\r
+\r
+\r
+/* ************************************************************************************************\r
+ *                                   Compile Time Integrity Checks\r
+ * ************************************************************************************************\r
+ */\r
+#ifdef BSP_NO_LEDS\r
+#    error "ERROR: The LED driver is disabled.  This file should not be included."\r
+#endif\r
+\r
+/**************************************************************************************************\r
+ */\r
+#endif\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/simpliciti/Components/bsp/drivers/code/bsp_buttons.c b/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/simpliciti/Components/bsp/drivers/code/bsp_buttons.c
new file mode 100755 (executable)
index 0000000..bff3d5d
--- /dev/null
@@ -0,0 +1,97 @@
+/**************************************************************************************************\r
+*  Revised:        $Date: 2007-07-06 11:19:00 -0700 (Fri, 06 Jul 2007) $\r
+*  Revision:       $Revision: 13579 $\r
+*\r
+*  Copyright 2007 Texas Instruments Incorporated.  All rights reserved.\r
+*\r
+*  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+*  the terms of a software license agreement between the user who downloaded the software,\r
+*  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+*  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+*  License. The License limits your use, and you acknowledge, that the Software may not be\r
+*  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+*  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+*  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+*  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+*  perform, display or sell this Software and/or its documentation for any purpose.\r
+*\r
+*  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+*  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+*  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+*  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+*  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+*  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+*  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+*  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+*  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+*\r
+*  Should you have any questions regarding your right to use this Software,\r
+*  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+/* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+ *   BSP (Board Support Package)\r
+ *   Generic button driver code file.\r
+ * =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+ */\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                            Includes\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#include "bsp_buttons.h"\r
+#include "bsp_button_defs.h"\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                             Macros\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#define BSP_CONFIG_BUTTON1()    __bsp_BUTTON1_CONFIG__()\r
+#define BSP_CONFIG_BUTTON2()    __bsp_BUTTON2_CONFIG__()\r
+#define BSP_CONFIG_BUTTON3()    __bsp_BUTTON3_CONFIG__()\r
+#define BSP_CONFIG_BUTTON4()    __bsp_BUTTON4_CONFIG__()\r
+#define BSP_CONFIG_BUTTON5()    __bsp_BUTTON5_CONFIG__()\r
+#define BSP_CONFIG_BUTTON6()    __bsp_BUTTON6_CONFIG__()\r
+#define BSP_CONFIG_BUTTON7()    __bsp_BUTTON7_CONFIG__()\r
+#define BSP_CONFIG_BUTTON8()    __bsp_BUTTON8_CONFIG__()\r
+\r
+#ifdef __bsp_BUTTON_EXTENDED_CONFIG__\r
+#    define BSP_BUTTON_EXTENDED_CONFIG()  __bsp_BUTTON_EXTENDED_CONFIG__()\r
+#else\r
+#    define BSP_BUTTON_EXTENDED_CONFIG()\r
+#endif\r
+\r
+\r
+/**************************************************************************************************\r
+ * @fn          BSP_InitButtons\r
+ *\r
+ * @brief       Initialize button hardware and driver code.\r
+ *\r
+ * @param       none\r
+ *\r
+ * @return      none\r
+ **************************************************************************************************\r
+ */\r
+\r
+void BSP_InitButtons(void)\r
+{\r
+    /* configure LEDs */\r
+    BSP_CONFIG_BUTTON1();\r
+    BSP_CONFIG_BUTTON2();\r
+    BSP_CONFIG_BUTTON3();\r
+    BSP_CONFIG_BUTTON4();\r
+    BSP_CONFIG_BUTTON5();\r
+    BSP_CONFIG_BUTTON6();\r
+    BSP_CONFIG_BUTTON7();\r
+    BSP_CONFIG_BUTTON8();\r
+\r
+    /* peform extended configuration if needed */\r
+    BSP_BUTTON_EXTENDED_CONFIG();\r
+}\r
+\r
+/**************************************************************************************************\r
+ */\r
+\r
+\r
+\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/simpliciti/Components/bsp/drivers/code/bsp_generic_buttons.h b/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/simpliciti/Components/bsp/drivers/code/bsp_generic_buttons.h
new file mode 100755 (executable)
index 0000000..5a244bd
--- /dev/null
@@ -0,0 +1,211 @@
+/**************************************************************************************************\r
+*  Revised:        $Date: 2007-07-06 11:19:00 -0700 (Fri, 06 Jul 2007) $\r
+*  Revision:       $Revision: 13579 $\r
+*\r
+*  Copyright 2007 Texas Instruments Incorporated.  All rights reserved.\r
+*\r
+*  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+*  the terms of a software license agreement between the user who downloaded the software,\r
+*  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+*  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+*  License. The License limits your use, and you acknowledge, that the Software may not be\r
+*  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+*  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+*  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+*  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+*  perform, display or sell this Software and/or its documentation for any purpose.\r
+*\r
+*  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+*  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+*  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+*  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+*  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+*  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+*  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+*  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+*  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+*\r
+*  Should you have any questions regarding your right to use this Software,\r
+*  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+/* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+ *   BSP (Board Support Package)\r
+ *   Generic button macro include file.\r
+ * =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+ */\r
+\r
+#ifndef BSP_GENERIC_BUTTONS_H\r
+#define BSP_GENERIC_BUTTONS_H\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                           Includes\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#include "bsp_board_defs.h"\r
+#include "bsp_macros.h"\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                            Macros\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#define __bsp_BUTTON__(port, bit, low)    ((low) ? (!((port) & BV(bit))) : ((port) & BV(bit)))\r
+\r
+\r
+/* ------------------------- populate BUTTON #1 macros ------------------------- */\r
+#define __bsp_NUM_BUTTON1_DEFINES__  ((defined __bsp_BUTTON1_PORT__)  + \\r
+                                      (defined __bsp_BUTTON1_BIT__)   + \\r
+                                      (defined __bsp_BUTTON1_IS_ACTIVE_LOW__))\r
+#if (__bsp_NUM_BUTTON1_DEFINES__ == 3)\r
+#    define __bsp_BUTTON1__()           __bsp_BUTTON__(__bsp_BUTTON1_PORT__, __bsp_BUTTON1_BIT__, \\r
+                                                       __bsp_BUTTON1_IS_ACTIVE_LOW__)\r
+#    define __bsp_BUTTON1_CONFIG__() /* nothing required */\r
+#elif (__bsp_NUM_BUTTON1_DEFINES__ == 0)\r
+#    define __bsp_BUTTON1__()           /* no button */ 0\r
+#    define __bsp_BUTTON1_CONFIG__() /* no button */\r
+#else\r
+#    error "ERROR: Incomplete number of macros for BUTTON1."\r
+#endif\r
+\r
+/* ------------------------- populate BUTTON #2 macros ------------------------- */\r
+#define __bsp_NUM_BUTTON2_DEFINES__  ((defined __bsp_BUTTON2_PORT__)  + \\r
+                                      (defined __bsp_BUTTON2_BIT__)   + \\r
+                                      (defined __bsp_BUTTON2_IS_ACTIVE_LOW__))\r
+#if (__bsp_NUM_BUTTON2_DEFINES__ == 3)\r
+#    define __bsp_BUTTON2__()           __bsp_BUTTON__(__bsp_BUTTON2_PORT__, __bsp_BUTTON2_BIT__, \\r
+                                                       __bsp_BUTTON2_IS_ACTIVE_LOW__)\r
+#    define __bsp_BUTTON2_CONFIG__() /* nothing required */\r
+#elif (__bsp_NUM_BUTTON2_DEFINES__ == 0)\r
+#    define __bsp_BUTTON2__()           /* no button */ 0\r
+#    define __bsp_BUTTON2_CONFIG__() /* no button */\r
+#else\r
+#    error "ERROR: Incomplete number of macros for BUTTON2."\r
+#endif\r
+\r
+/* ------------------------- populate BUTTON #3 macros ------------------------- */\r
+#define __bsp_NUM_BUTTON3_DEFINES__  ((defined __bsp_BUTTON3_PORT__)  + \\r
+                                      (defined __bsp_BUTTON3_BIT__)   + \\r
+                                      (defined __bsp_BUTTON3_IS_ACTIVE_LOW__))\r
+#if (__bsp_NUM_BUTTON3_DEFINES__ == 3)\r
+#    define __bsp_BUTTON3__()           __bsp_BUTTON__(__bsp_BUTTON3_PORT__, __bsp_BUTTON3_BIT__, \\r
+                                                       __bsp_BUTTON3_IS_ACTIVE_LOW__)\r
+#    define __bsp_BUTTON3_CONFIG__() /* nothing required */\r
+#elif (__bsp_NUM_BUTTON3_DEFINES__ == 0)\r
+#    define __bsp_BUTTON3__()           /* no button */ 0\r
+#    define __bsp_BUTTON3_CONFIG__() /* no button */\r
+#else\r
+#    error "ERROR: Incomplete number of macros for BUTTON3."\r
+#endif\r
+\r
+/* ------------------------- populate BUTTON #4 macros ------------------------- */\r
+#define __bsp_NUM_BUTTON4_DEFINES__  ((defined __bsp_BUTTON4_PORT__)  + \\r
+                                      (defined __bsp_BUTTON4_BIT__)   + \\r
+                                      (defined __bsp_BUTTON4_IS_ACTIVE_LOW__))\r
+#if (__bsp_NUM_BUTTON4_DEFINES__ == 3)\r
+#    define __bsp_BUTTON4__()           __bsp_BUTTON__(__bsp_BUTTON4_PORT__, __bsp_BUTTON4_BIT__, \\r
+                                                       __bsp_BUTTON4_IS_ACTIVE_LOW__)\r
+#    define __bsp_BUTTON4_CONFIG__() /* nothing required */\r
+#elif (__bsp_NUM_BUTTON4_DEFINES__ == 0)\r
+#    define __bsp_BUTTON4__()           /* no button */ 0\r
+#    define __bsp_BUTTON4_CONFIG__() /* no button */\r
+#else\r
+#    error "ERROR: Incomplete number of macros for BUTTON4."\r
+#endif\r
+\r
+/* ------------------------- populate BUTTON #5 macros ------------------------- */\r
+#define __bsp_NUM_BUTTON5_DEFINES__  ((defined __bsp_BUTTON5_PORT__)  + \\r
+                                      (defined __bsp_BUTTON5_BIT__)   + \\r
+                                      (defined __bsp_BUTTON5_IS_ACTIVE_LOW__))\r
+#if (__bsp_NUM_BUTTON5_DEFINES__ == 3)\r
+#    define __bsp_BUTTON5__()           __bsp_BUTTON__(__bsp_BUTTON5_PORT__, __bsp_BUTTON5_BIT__, \\r
+                                                       __bsp_BUTTON5_IS_ACTIVE_LOW__)\r
+#    define __bsp_BUTTON5_CONFIG__() /* nothing required */\r
+#elif (__bsp_NUM_BUTTON5_DEFINES__ == 0)\r
+#    define __bsp_BUTTON5__()           /* no button */ 0\r
+#    define __bsp_BUTTON5_CONFIG__() /* no button */\r
+#else\r
+#    error "ERROR: Incomplete number of macros for BUTTON5."\r
+#endif\r
+\r
+/* ------------------------- populate BUTTON #6 macros ------------------------- */\r
+#define __bsp_NUM_BUTTON6_DEFINES__  ((defined __bsp_BUTTON6_PORT__)  + \\r
+                                      (defined __bsp_BUTTON6_BIT__)   + \\r
+                                      (defined __bsp_BUTTON6_IS_ACTIVE_LOW__))\r
+#if (__bsp_NUM_BUTTON6_DEFINES__ == 3)\r
+#    define __bsp_BUTTON6__()           __bsp_BUTTON__(__bsp_BUTTON6_PORT__, __bsp_BUTTON6_BIT__, \\r
+                                                       __bsp_BUTTON6_IS_ACTIVE_LOW__)\r
+#    define __bsp_BUTTON6_CONFIG__() /* nothing required */\r
+#elif (__bsp_NUM_BUTTON6_DEFINES__ == 0)\r
+#    define __bsp_BUTTON6__()           /* no button */ 0\r
+#    define __bsp_BUTTON6_CONFIG__() /* no button */\r
+#else\r
+#    error "ERROR: Incomplete number of macros for BUTTON6."\r
+#endif\r
+\r
+/* ------------------------- populate BUTTON #7 macros ------------------------- */\r
+#define __bsp_NUM_BUTTON7_DEFINES__  ((defined __bsp_BUTTON7_PORT__)  + \\r
+                                      (defined __bsp_BUTTON7_BIT__)   + \\r
+                                      (defined __bsp_BUTTON7_IS_ACTIVE_LOW__))\r
+#if (__bsp_NUM_BUTTON7_DEFINES__ == 3)\r
+#    define __bsp_BUTTON7__()           __bsp_BUTTON__(__bsp_BUTTON7_PORT__, __bsp_BUTTON7_BIT__, \\r
+                                                       __bsp_BUTTON7_IS_ACTIVE_LOW__)\r
+#    define __bsp_BUTTON7_CONFIG__() /* nothing required */\r
+#elif (__bsp_NUM_BUTTON7_DEFINES__ == 0)\r
+#    define __bsp_BUTTON7__()           /* no button */ 0\r
+#    define __bsp_BUTTON7_CONFIG__() /* no button */\r
+#else\r
+#    error "ERROR: Incomplete number of macros for BUTTON7."\r
+#endif\r
+\r
+/* ------------------------- populate BUTTON #8 macros ------------------------- */\r
+#define __bsp_NUM_BUTTON8_DEFINES__  ((defined __bsp_BUTTON8_PORT__)  + \\r
+                                      (defined __bsp_BUTTON8_BIT__)   + \\r
+                                      (defined __bsp_BUTTON8_IS_ACTIVE_LOW__))\r
+#if (__bsp_NUM_BUTTON8_DEFINES__ == 3)\r
+#    define __bsp_BUTTON8__()           __bsp_BUTTON__(__bsp_BUTTON8_PORT__, __bsp_BUTTON8_BIT__, \\r
+                                                       __bsp_BUTTON8_IS_ACTIVE_LOW__)\r
+#    define __bsp_BUTTON8_CONFIG__() /* nothing required */\r
+#elif (__bsp_NUM_BUTTON8_DEFINES__ == 0)\r
+#    define __bsp_BUTTON8__()           /* no button */ 0\r
+#    define __bsp_BUTTON8_CONFIG__() /* no button */\r
+#else\r
+#    error "ERROR: Incomplete number of macros for BUTTON8."\r
+#endif\r
+\r
+\r
+/* ************************************************************************************************\r
+ *                                   Compile Time Integrity Checks\r
+ * ************************************************************************************************\r
+ */\r
+\r
+/* -------------------- number of buttons defined -------------------- */\r
+#ifndef __bsp_NUM_BUTTONS__\r
+#    error "ERROR: Number of buttons is not specified."\r
+#else\r
+#    if ((__bsp_NUM_BUTTONS__ > 8) || (__bsp_NUM_BUTTONS__ < 0))\r
+#        error "ERROR: Unsupported number of buttons specified.  Maximum is eight."\r
+#    endif\r
+#endif\r
+\r
+#if (((__bsp_NUM_BUTTON1_DEFINES__ != 0) + \\r
+    (__bsp_NUM_BUTTON2_DEFINES__ != 0) + \\r
+    (__bsp_NUM_BUTTON3_DEFINES__ != 0) + \\r
+    (__bsp_NUM_BUTTON4_DEFINES__ != 0) + \\r
+    (__bsp_NUM_BUTTON5_DEFINES__ != 0) + \\r
+    (__bsp_NUM_BUTTON6_DEFINES__ != 0) + \\r
+    (__bsp_NUM_BUTTON7_DEFINES__ != 0) + \\r
+    (__bsp_NUM_BUTTON8_DEFINES__ != 0)) != __bsp_NUM_BUTTONS__)\r
+#    error "ERROR: Inconsistency between defined macros and specified number of buttons."\r
+#endif\r
+\r
+/* -------------------- debounce macro -------------------- */\r
+#ifndef __bsp_BUTTON_DEBOUNCE_WAIT__\r
+#    error "ERROR: Debounce delay macro is missing."\r
+#endif\r
+\r
+\r
+/**************************************************************************************************\r
+ */\r
+#endif\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/simpliciti/Components/bsp/drivers/code/bsp_generic_leds.h b/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/simpliciti/Components/bsp/drivers/code/bsp_generic_leds.h
new file mode 100755 (executable)
index 0000000..f356d46
--- /dev/null
@@ -0,0 +1,358 @@
+/**************************************************************************************************\r
+*  Revised:        $Date: 2007-07-06 11:19:00 -0700 (Fri, 06 Jul 2007) $\r
+*  Revision:       $Revision: 13579 $\r
+*\r
+*  Copyright 2007 Texas Instruments Incorporated.  All rights reserved.\r
+*\r
+*  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+*  the terms of a software license agreement between the user who downloaded the software,\r
+*  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+*  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+*  License. The License limits your use, and you acknowledge, that the Software may not be\r
+*  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+*  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+*  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+*  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+*  perform, display or sell this Software and/or its documentation for any purpose.\r
+*\r
+*  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+*  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+*  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+*  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+*  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+*  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+*  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+*  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+*  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+*\r
+*  Should you have any questions regarding your right to use this Software,\r
+*  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+/* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+ *   BSP (Board Support Package)\r
+ *   Generic LED macro include file.\r
+ * =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+ */\r
+\r
+#ifndef BSP_GENERIC_LEDS_H\r
+#define BSP_GENERIC_LEDS_H\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                          Includes\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#include "bsp_macros.h"\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                           Macros\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+\r
+/*\r
+ *  Note : The conditionals in the following macros evaulate compile time constants.\r
+ *         Any compiler worth its salt will optimize these conditionals out for the\r
+ *         smallest possible code.\r
+ */\r
+\r
+#define __bsp_LED_TURN_ON__(bit, port, ddr, low)  \\r
+    st(if (low){ port &= ~BV(bit); } else { port |= BV(bit); })\r
+\r
+#define __bsp_LED_TURN_OFF__(bit, port, ddr, low)  \\r
+    st(if (low){ port |= BV(bit); } else { port &= ~BV(bit); })\r
+\r
+#define __bsp_LED_IS_ON__(bit, port, ddr, low)  \\r
+    ((low) ? (!((port) & BV(bit))) : ((port) & BV(bit)))\r
+\r
+#define __bsp_LED_TOGGLE__(bit, port, ddr, low)     st(port ^= BV(bit); )\r
+#define __bsp_LED_CONFIG__(bit, port, ddr, low)     st(ddr |= BV(bit); )\r
+\r
+\r
+\r
+/* ------------------------- populate LED1 macros ------------------------- */\r
+#define __bsp_NUM_LED1_DEFINES__  ((defined __bsp_LED1_BIT__)  + \\r
+                                   (defined __bsp_LED1_PORT__) + \\r
+                                   (defined __bsp_LED1_DDR__)  + \\r
+                                   (defined __bsp_LED1_IS_ACTIVE_LOW__))\r
+#if (__bsp_NUM_LED1_DEFINES__ == 4)\r
+#    define __bsp_LED1_TURN_ON__()    __bsp_LED_TURN_ON__(__bsp_LED1_BIT__, __bsp_LED1_PORT__, \\r
+                                                          __bsp_LED1_DDR__, \\r
+                                                          __bsp_LED1_IS_ACTIVE_LOW__)\r
+#    define __bsp_LED1_TURN_OFF__()   __bsp_LED_TURN_OFF__(__bsp_LED1_BIT__, __bsp_LED1_PORT__, \\r
+                                                           __bsp_LED1_DDR__, \\r
+                                                           __bsp_LED1_IS_ACTIVE_LOW__)\r
+#    define __bsp_LED1_TOGGLE__()     __bsp_LED_TOGGLE__(__bsp_LED1_BIT__, __bsp_LED1_PORT__, \\r
+                                                         __bsp_LED1_DDR__, \\r
+                                                         __bsp_LED1_IS_ACTIVE_LOW__)\r
+#    define __bsp_LED1_IS_ON__()      __bsp_LED_IS_ON__(__bsp_LED1_BIT__, __bsp_LED1_PORT__, \\r
+                                                        __bsp_LED1_DDR__, \\r
+                                                        __bsp_LED1_IS_ACTIVE_LOW__)\r
+#    define __bsp_LED1_CONFIG__()     __bsp_LED_CONFIG__(__bsp_LED1_BIT__, __bsp_LED1_PORT__, \\r
+                                                         __bsp_LED1_DDR__, \\r
+                                                         __bsp_LED1_IS_ACTIVE_LOW__)\r
+#elif (__bsp_NUM_LED1_DEFINES__ == 0)\r
+#    define __bsp_LED1_TURN_ON__()  /* no LED */\r
+#    define __bsp_LED1_TURN_OFF__() /* no LED */\r
+#    define __bsp_LED1_TOGGLE__()   /* no LED */\r
+#    define __bsp_LED1_IS_ON__()      /* no LED */ 0\r
+#    define __bsp_LED1_CONFIG__()   /* no LED */\r
+#else\r
+#    error "ERROR: Incomplete number of macros for LED1."\r
+#endif\r
+\r
+\r
+/* ------------------------- populate LED2 macros ------------------------- */\r
+#define __bsp_NUM_LED2_DEFINES__  ((defined __bsp_LED2_BIT__)  + \\r
+                                   (defined __bsp_LED2_PORT__) + \\r
+                                   (defined __bsp_LED2_DDR__)  + \\r
+                                   (defined __bsp_LED2_IS_ACTIVE_LOW__))\r
+#if (__bsp_NUM_LED2_DEFINES__ == 4)\r
+#    define __bsp_LED2_TURN_ON__()    __bsp_LED_TURN_ON__(__bsp_LED2_BIT__, __bsp_LED2_PORT__, \\r
+                                                          __bsp_LED2_DDR__, \\r
+                                                          __bsp_LED2_IS_ACTIVE_LOW__)\r
+#    define __bsp_LED2_TURN_OFF__()   __bsp_LED_TURN_OFF__(__bsp_LED2_BIT__, __bsp_LED2_PORT__, \\r
+                                                           __bsp_LED2_DDR__, \\r
+                                                           __bsp_LED2_IS_ACTIVE_LOW__)\r
+#    define __bsp_LED2_TOGGLE__()     __bsp_LED_TOGGLE__(__bsp_LED2_BIT__, __bsp_LED2_PORT__, \\r
+                                                         __bsp_LED2_DDR__, \\r
+                                                         __bsp_LED2_IS_ACTIVE_LOW__)\r
+#    define __bsp_LED2_IS_ON__()      __bsp_LED_IS_ON__(__bsp_LED2_BIT__, __bsp_LED2_PORT__, \\r
+                                                        __bsp_LED2_DDR__, \\r
+                                                        __bsp_LED2_IS_ACTIVE_LOW__)\r
+#    define __bsp_LED2_CONFIG__()     __bsp_LED_CONFIG__(__bsp_LED2_BIT__, __bsp_LED2_PORT__, \\r
+                                                         __bsp_LED2_DDR__, \\r
+                                                         __bsp_LED2_IS_ACTIVE_LOW__)\r
+#elif (__bsp_NUM_LED2_DEFINES__ == 0)\r
+#    define __bsp_LED2_TURN_ON__()  /* no LED */\r
+#    define __bsp_LED2_TURN_OFF__() /* no LED */\r
+#    define __bsp_LED2_TOGGLE__()   /* no LED */\r
+#    define __bsp_LED2_IS_ON__()      /* no LED */ 0\r
+#    define __bsp_LED2_CONFIG__()   /* no LED */\r
+#else\r
+#    error "ERROR: Incomplete number of macros for LED2."\r
+#endif\r
+\r
+\r
+/* ------------------------- populate LED3 macros ------------------------- */\r
+#define __bsp_NUM_LED3_DEFINES__  ((defined __bsp_LED3_BIT__)  + \\r
+                                   (defined __bsp_LED3_PORT__) + \\r
+                                   (defined __bsp_LED3_DDR__)  + \\r
+                                   (defined __bsp_LED3_IS_ACTIVE_LOW__))\r
+#if (__bsp_NUM_LED3_DEFINES__ == 4)\r
+#    define __bsp_LED3_TURN_ON__()    __bsp_LED_TURN_ON__(__bsp_LED3_BIT__, __bsp_LED3_PORT__, \\r
+                                                          __bsp_LED3_DDR__, \\r
+                                                          __bsp_LED3_IS_ACTIVE_LOW__)\r
+#    define __bsp_LED3_TURN_OFF__()   __bsp_LED_TURN_OFF__(__bsp_LED3_BIT__, __bsp_LED3_PORT__, \\r
+                                                           __bsp_LED3_DDR__, \\r
+                                                           __bsp_LED3_IS_ACTIVE_LOW__)\r
+#    define __bsp_LED3_TOGGLE__()     __bsp_LED_TOGGLE__(__bsp_LED3_BIT__, __bsp_LED3_PORT__, \\r
+                                                         __bsp_LED3_DDR__, \\r
+                                                         __bsp_LED3_IS_ACTIVE_LOW__)\r
+#    define __bsp_LED3_IS_ON__()      __bsp_LED_IS_ON__(__bsp_LED3_BIT__, __bsp_LED3_PORT__, \\r
+                                                        __bsp_LED3_DDR__, \\r
+                                                        __bsp_LED3_IS_ACTIVE_LOW__)\r
+#    define __bsp_LED3_CONFIG__()     __bsp_LED_CONFIG__(__bsp_LED3_BIT__, __bsp_LED3_PORT__, \\r
+                                                         __bsp_LED3_DDR__, \\r
+                                                         __bsp_LED3_IS_ACTIVE_LOW__)\r
+#elif (__bsp_NUM_LED3_DEFINES__ == 0)\r
+#    define __bsp_LED3_TURN_ON__()  /* no LED */\r
+#    define __bsp_LED3_TURN_OFF__() /* no LED */\r
+#    define __bsp_LED3_TOGGLE__()   /* no LED */\r
+#    define __bsp_LED3_IS_ON__()      /* no LED */ 0\r
+#    define __bsp_LED3_CONFIG__()   /* no LED */\r
+#else\r
+#    error "ERROR: Incomplete number of macros for LED3."\r
+#endif\r
+\r
+\r
+/* ------------------------- populate LED4 macros ------------------------- */\r
+#define __bsp_NUM_LED4_DEFINES__  ((defined __bsp_LED4_BIT__)  + \\r
+                                   (defined __bsp_LED4_PORT__) + \\r
+                                   (defined __bsp_LED4_DDR__)  + \\r
+                                   (defined __bsp_LED4_IS_ACTIVE_LOW__))\r
+#if (__bsp_NUM_LED4_DEFINES__ == 4)\r
+#    define __bsp_LED4_TURN_ON__()    __bsp_LED_TURN_ON__(__bsp_LED4_BIT__, __bsp_LED4_PORT__, \\r
+                                                          __bsp_LED4_DDR__, \\r
+                                                          __bsp_LED4_IS_ACTIVE_LOW__)\r
+#    define __bsp_LED4_TURN_OFF__()   __bsp_LED_TURN_OFF__(__bsp_LED4_BIT__, __bsp_LED4_PORT__, \\r
+                                                           __bsp_LED4_DDR__, \\r
+                                                           __bsp_LED4_IS_ACTIVE_LOW__)\r
+#    define __bsp_LED4_TOGGLE__()     __bsp_LED_TOGGLE__(__bsp_LED4_BIT__, __bsp_LED4_PORT__, \\r
+                                                         __bsp_LED4_DDR__, \\r
+                                                         __bsp_LED4_IS_ACTIVE_LOW__)\r
+#    define __bsp_LED4_IS_ON__()      __bsp_LED_IS_ON__(__bsp_LED4_BIT__, __bsp_LED4_PORT__, \\r
+                                                        __bsp_LED4_DDR__, \\r
+                                                        __bsp_LED4_IS_ACTIVE_LOW__)\r
+#    define __bsp_LED4_CONFIG__()     __bsp_LED_CONFIG__(__bsp_LED4_BIT__, __bsp_LED4_PORT__, \\r
+                                                         __bsp_LED4_DDR__, \\r
+                                                         __bsp_LED4_IS_ACTIVE_LOW__)\r
+#elif (__bsp_NUM_LED4_DEFINES__ == 0)\r
+#    define __bsp_LED4_TURN_ON__()  /* no LED */\r
+#    define __bsp_LED4_TURN_OFF__() /* no LED */\r
+#    define __bsp_LED4_TOGGLE__()   /* no LED */\r
+#    define __bsp_LED4_IS_ON__()      /* no LED */ 0\r
+#    define __bsp_LED4_CONFIG__()   /* no LED */\r
+#else\r
+#    error "ERROR: Incomplete number of macros for LED4."\r
+#endif\r
+\r
+/* ------------------------- populate LED5 macros ------------------------- */\r
+#define __bsp_NUM_LED5_DEFINES__  ((defined __bsp_LED5_BIT__)  + \\r
+                                   (defined __bsp_LED5_PORT__) + \\r
+                                   (defined __bsp_LED5_DDR__)  + \\r
+                                   (defined __bsp_LED5_IS_ACTIVE_LOW__))\r
+#if (__bsp_NUM_LED5_DEFINES__ == 4)\r
+#    define __bsp_LED5_TURN_ON__()    __bsp_LED_TURN_ON__(__bsp_LED5_BIT__, __bsp_LED5_PORT__, \\r
+                                                          __bsp_LED5_DDR__, \\r
+                                                          __bsp_LED5_IS_ACTIVE_LOW__)\r
+#    define __bsp_LED5_TURN_OFF__()   __bsp_LED_TURN_OFF__(__bsp_LED5_BIT__, __bsp_LED5_PORT__, \\r
+                                                           __bsp_LED5_DDR__, \\r
+                                                           __bsp_LED5_IS_ACTIVE_LOW__)\r
+#    define __bsp_LED5_TOGGLE__()     __bsp_LED_TOGGLE__(__bsp_LED5_BIT__, __bsp_LED5_PORT__, \\r
+                                                         __bsp_LED5_DDR__, \\r
+                                                         __bsp_LED5_IS_ACTIVE_LOW__)\r
+#    define __bsp_LED5_IS_ON__()      __bsp_LED_IS_ON__(__bsp_LED5_BIT__, __bsp_LED5_PORT__, \\r
+                                                        __bsp_LED5_DDR__, \\r
+                                                        __bsp_LED5_IS_ACTIVE_LOW__)\r
+#    define __bsp_LED5_CONFIG__()     __bsp_LED_CONFIG__(__bsp_LED5_BIT__, __bsp_LED5_PORT__, \\r
+                                                         __bsp_LED5_DDR__, \\r
+                                                         __bsp_LED5_IS_ACTIVE_LOW__)\r
+#elif (__bsp_NUM_LED5_DEFINES__ == 0)\r
+#    define __bsp_LED5_TURN_ON__()  /* no LED */\r
+#    define __bsp_LED5_TURN_OFF__() /* no LED */\r
+#    define __bsp_LED5_TOGGLE__()   /* no LED */\r
+#    define __bsp_LED5_IS_ON__()      /* no LED */ 0\r
+#    define __bsp_LED5_CONFIG__()   /* no LED */\r
+#else\r
+#    error "ERROR: Incomplete number of macros for LED5."\r
+#endif\r
+\r
+/* ------------------------- populate LED6 macros ------------------------- */\r
+#define __bsp_NUM_LED6_DEFINES__  ((defined __bsp_LED6_BIT__)  + \\r
+                                   (defined __bsp_LED6_PORT__) + \\r
+                                   (defined __bsp_LED6_DDR__)  + \\r
+                                   (defined __bsp_LED6_IS_ACTIVE_LOW__))\r
+#if (__bsp_NUM_LED6_DEFINES__ == 4)\r
+#    define __bsp_LED6_TURN_ON__()    __bsp_LED_TURN_ON__(__bsp_LED6_BIT__, __bsp_LED6_PORT__, \\r
+                                                          __bsp_LED6_DDR__, \\r
+                                                          __bsp_LED6_IS_ACTIVE_LOW__)\r
+#    define __bsp_LED6_TURN_OFF__()   __bsp_LED_TURN_OFF__(__bsp_LED6_BIT__, __bsp_LED6_PORT__, \\r
+                                                           __bsp_LED6_DDR__, \\r
+                                                           __bsp_LED6_IS_ACTIVE_LOW__)\r
+#    define __bsp_LED6_TOGGLE__()     __bsp_LED_TOGGLE__(__bsp_LED6_BIT__, __bsp_LED6_PORT__, \\r
+                                                         __bsp_LED6_DDR__, \\r
+                                                         __bsp_LED6_IS_ACTIVE_LOW__)\r
+#    define __bsp_LED6_IS_ON__()      __bsp_LED_IS_ON__(__bsp_LED6_BIT__, __bsp_LED6_PORT__, \\r
+                                                        __bsp_LED6_DDR__, \\r
+                                                        __bsp_LED6_IS_ACTIVE_LOW__)\r
+#    define __bsp_LED6_CONFIG__()     __bsp_LED_CONFIG__(__bsp_LED6_BIT__, __bsp_LED6_PORT__, \\r
+                                                         __bsp_LED6_DDR__, \\r
+                                                         __bsp_LED6_IS_ACTIVE_LOW__)\r
+#elif (__bsp_NUM_LED6_DEFINES__ == 0)\r
+#    define __bsp_LED6_TURN_ON__()  /* no LED */\r
+#    define __bsp_LED6_TURN_OFF__() /* no LED */\r
+#    define __bsp_LED6_TOGGLE__()   /* no LED */\r
+#    define __bsp_LED6_IS_ON__()      /* no LED */ 0\r
+#    define __bsp_LED6_CONFIG__()   /* no LED */\r
+#else\r
+#    error "ERROR: Incomplete number of macros for LED6."\r
+#endif\r
+\r
+/* ------------------------- populate LED7 macros ------------------------- */\r
+#define __bsp_NUM_LED7_DEFINES__  ((defined __bsp_LED7_BIT__)  + \\r
+                                   (defined __bsp_LED7_PORT__) + \\r
+                                   (defined __bsp_LED7_DDR__)  + \\r
+                                   (defined __bsp_LED7_IS_ACTIVE_LOW__))\r
+#if (__bsp_NUM_LED7_DEFINES__ == 4)\r
+#    define __bsp_LED7_TURN_ON__()    __bsp_LED_TURN_ON__(__bsp_LED7_BIT__, __bsp_LED7_PORT__, \\r
+                                                          __bsp_LED7_DDR__, \\r
+                                                          __bsp_LED7_IS_ACTIVE_LOW__)\r
+#    define __bsp_LED7_TURN_OFF__()   __bsp_LED_TURN_OFF__(__bsp_LED7_BIT__, __bsp_LED7_PORT__, \\r
+                                                           __bsp_LED7_DDR__, \\r
+                                                           __bsp_LED7_IS_ACTIVE_LOW__)\r
+#    define __bsp_LED7_TOGGLE__()     __bsp_LED_TOGGLE__(__bsp_LED7_BIT__, __bsp_LED7_PORT__, \\r
+                                                         __bsp_LED7_DDR__, \\r
+                                                         __bsp_LED7_IS_ACTIVE_LOW__)\r
+#    define __bsp_LED7_IS_ON__()      __bsp_LED_IS_ON__(__bsp_LED7_BIT__, __bsp_LED7_PORT__, \\r
+                                                        __bsp_LED7_DDR__, \\r
+                                                        __bsp_LED7_IS_ACTIVE_LOW__)\r
+#    define __bsp_LED7_CONFIG__()     __bsp_LED_CONFIG__(__bsp_LED7_BIT__, __bsp_LED7_PORT__, \\r
+                                                         __bsp_LED7_DDR__, \\r
+                                                         __bsp_LED7_IS_ACTIVE_LOW__)\r
+#elif (__bsp_NUM_LED7_DEFINES__ == 0)\r
+#    define __bsp_LED7_TURN_ON__()  /* no LED */\r
+#    define __bsp_LED7_TURN_OFF__() /* no LED */\r
+#    define __bsp_LED7_TOGGLE__()   /* no LED */\r
+#    define __bsp_LED7_IS_ON__()      /* no LED */ 0\r
+#    define __bsp_LED7_CONFIG__()   /* no LED */\r
+#else\r
+#    error "ERROR: Incomplete number of macros for LED7."\r
+#endif\r
+\r
+/* ------------------------- populate LED8 macros ------------------------- */\r
+#define __bsp_NUM_LED8_DEFINES__  ((defined __bsp_LED8_BIT__)  + \\r
+                                   (defined __bsp_LED8_PORT__) + \\r
+                                   (defined __bsp_LED8_DDR__)  + \\r
+                                   (defined __bsp_LED8_IS_ACTIVE_LOW__))\r
+#if (__bsp_NUM_LED8_DEFINES__ == 4)\r
+#    define __bsp_LED8_TURN_ON__()    __bsp_LED_TURN_ON__(__bsp_LED8_BIT__, __bsp_LED8_PORT__, \\r
+                                                          __bsp_LED8_DDR__, \\r
+                                                          __bsp_LED8_IS_ACTIVE_LOW__)\r
+#    define __bsp_LED8_TURN_OFF__()   __bsp_LED_TURN_OFF__(__bsp_LED8_BIT__, __bsp_LED8_PORT__, \\r
+                                                           __bsp_LED8_DDR__, \\r
+                                                           __bsp_LED8_IS_ACTIVE_LOW__)\r
+#    define __bsp_LED8_TOGGLE__()     __bsp_LED_TOGGLE__(__bsp_LED8_BIT__, __bsp_LED8_PORT__, \\r
+                                                         __bsp_LED8_DDR__, \\r
+                                                         __bsp_LED8_IS_ACTIVE_LOW__)\r
+#    define __bsp_LED8_IS_ON__()      __bsp_LED_IS_ON__(__bsp_LED8_BIT__, __bsp_LED8_PORT__, \\r
+                                                        __bsp_LED8_DDR__, \\r
+                                                        __bsp_LED8_IS_ACTIVE_LOW__)\r
+#    define __bsp_LED8_CONFIG__()     __bsp_LED_CONFIG__(__bsp_LED8_BIT__, __bsp_LED8_PORT__, \\r
+                                                         __bsp_LED8_DDR__, \\r
+                                                         __bsp_LED8_IS_ACTIVE_LOW__)\r
+#elif (__bsp_NUM_LED8_DEFINES__ == 0)\r
+#    define __bsp_LED8_TURN_ON__()  /* no LED */\r
+#    define __bsp_LED8_TURN_OFF__() /* no LED */\r
+#    define __bsp_LED8_TOGGLE__()   /* no LED */\r
+#    define __bsp_LED8_IS_ON__()      /* no LED */ 0\r
+#    define __bsp_LED8_CONFIG__()   /* no LED */\r
+#else\r
+#    error "ERROR: Incomplete number of macros for LED8."\r
+#endif\r
+\r
+\r
+/* ************************************************************************************************\r
+ *                                   Compile Time Integrity Checks\r
+ * ************************************************************************************************\r
+ */\r
+\r
+/* -------------------- number of LEDs defined -------------------- */\r
+#ifndef __bsp_NUM_LEDS__\r
+#    error "ERROR: Number of LEDs is not specified."\r
+#else\r
+#    if ((__bsp_NUM_LEDS__ > 8) || (__bsp_NUM_LEDS__ < 0))\r
+#        error "ERROR: Unsupported number of LEDs specified.  Maximum is eight."\r
+#    endif\r
+#endif\r
+\r
+#if (((__bsp_NUM_LED1_DEFINES__ != 0) + \\r
+    (__bsp_NUM_LED2_DEFINES__ != 0) + \\r
+    (__bsp_NUM_LED3_DEFINES__ != 0) + \\r
+    (__bsp_NUM_LED4_DEFINES__ != 0) + \\r
+    (__bsp_NUM_LED5_DEFINES__ != 0) + \\r
+    (__bsp_NUM_LED6_DEFINES__ != 0) + \\r
+    (__bsp_NUM_LED7_DEFINES__ != 0) + \\r
+    (__bsp_NUM_LED8_DEFINES__ != 0)) != __bsp_NUM_LEDS__)\r
+#    error "ERROR: Inconsistency between defined macros and specified number of LEDs."\r
+#endif\r
+\r
+/* -------------------- blink delay loop count -------------------- */\r
+#ifndef __bsp_LED_BLINK_LOOP_COUNT__\r
+#    error "ERROR: Blink delay count is missing."\r
+#endif\r
+\r
+/**************************************************************************************************\r
+ */\r
+#endif\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/simpliciti/Components/bsp/drivers/code/bsp_leds.c b/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/simpliciti/Components/bsp/drivers/code/bsp_leds.c
new file mode 100755 (executable)
index 0000000..eac9f5f
--- /dev/null
@@ -0,0 +1,107 @@
+/**************************************************************************************************\r
+*  Revised:        $Date: 2007-07-06 11:19:00 -0700 (Fri, 06 Jul 2007) $\r
+*  Revision:       $Revision: 13579 $\r
+*\r
+*  Copyright 2007 Texas Instruments Incorporated.  All rights reserved.\r
+*\r
+*  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+*  the terms of a software license agreement between the user who downloaded the software,\r
+*  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+*  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+*  License. The License limits your use, and you acknowledge, that the Software may not be\r
+*  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+*  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+*  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+*  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+*  perform, display or sell this Software and/or its documentation for any purpose.\r
+*\r
+*  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+*  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+*  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+*  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+*  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+*  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+*  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+*  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+*  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+*\r
+*  Should you have any questions regarding your right to use this Software,\r
+*  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+/* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+ *   BSP (Board Support Package)\r
+ *   Generic LED driver code file.\r
+ * =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+ */\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                            Includes\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#include "bsp_leds.h"\r
+#include "bsp_led_defs.h"\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                             Macros\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#define BSP_CONFIG_LED1()    __bsp_LED1_CONFIG__()\r
+#define BSP_CONFIG_LED2()    __bsp_LED2_CONFIG__()\r
+#define BSP_CONFIG_LED3()    __bsp_LED3_CONFIG__()\r
+#define BSP_CONFIG_LED4()    __bsp_LED4_CONFIG__()\r
+#define BSP_CONFIG_LED5()    __bsp_LED5_CONFIG__()\r
+#define BSP_CONFIG_LED6()    __bsp_LED6_CONFIG__()\r
+#define BSP_CONFIG_LED7()    __bsp_LED7_CONFIG__()\r
+#define BSP_CONFIG_LED8()    __bsp_LED8_CONFIG__()\r
+\r
+#ifdef __bsp_LED_EXTENDED_CONFIG__\r
+#    define BSP_LED_EXTENDED_CONFIG()  __bsp_LED_EXTENDED_CONFIG__()\r
+#else\r
+#    define BSP_LED_EXTENDED_CONFIG()\r
+#endif\r
+\r
+\r
+/**************************************************************************************************\r
+ * @fn          BSP_InitLeds\r
+ *\r
+ * @brief       Initialize LED hardware and driver.\r
+ *\r
+ * @param       none\r
+ *\r
+ * @return      none\r
+ **************************************************************************************************\r
+ */\r
+\r
+void BSP_InitLeds(void)\r
+{\r
+    /* configure LEDs */\r
+    BSP_CONFIG_LED1();\r
+    BSP_CONFIG_LED2();\r
+    BSP_CONFIG_LED3();\r
+    BSP_CONFIG_LED4();\r
+    BSP_CONFIG_LED5();\r
+    BSP_CONFIG_LED6();\r
+    BSP_CONFIG_LED7();\r
+    BSP_CONFIG_LED8();\r
+\r
+    /* peform extended configuration if needed */\r
+    BSP_LED_EXTENDED_CONFIG();\r
+\r
+    /* turn all LEDs off as power-up default */\r
+    BSP_TURN_OFF_LED1();\r
+    BSP_TURN_OFF_LED2();\r
+    BSP_TURN_OFF_LED3();\r
+    BSP_TURN_OFF_LED4();\r
+    BSP_TURN_OFF_LED5();\r
+    BSP_TURN_OFF_LED6();\r
+    BSP_TURN_OFF_LED7();\r
+    BSP_TURN_OFF_LED8();\r
+}\r
+\r
+/**************************************************************************************************\r
+ */\r
+\r
+\r
+\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/simpliciti/Components/bsp/mcus/bsp_msp430_defs.h b/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/simpliciti/Components/bsp/mcus/bsp_msp430_defs.h
new file mode 100755 (executable)
index 0000000..9e08426
--- /dev/null
@@ -0,0 +1,142 @@
+/**************************************************************************************************\r
+*  Filename:       bsp_msp430_defs.h\r
+*  Revised:        $Date: 2009-10-11 18:52:46 -0700 (Sun, 11 Oct 2009) $\r
+*  Revision:       $Revision: 20897 $\r
+*\r
+*  Copyright 2007-2009 Texas Instruments Incorporated.  All rights reserved.\r
+*\r
+*  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+*  the terms of a software license agreement between the user who downloaded the software,\r
+*  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+*  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+*  License. The License limits your use, and you acknowledge, that the Software may not be\r
+*  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+*  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+*  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+*  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+*  perform, display or sell this Software and/or its documentation for any purpose.\r
+*\r
+*  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+*  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+*  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+*  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+*  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+*  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+*  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+*  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+*  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+*\r
+*  Should you have any questions regarding your right to use this Software,\r
+*  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+/* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+ *   BSP (Board Support Package)\r
+ *   MCU : Texas Instruments MSP430 family\r
+ *   Microcontroller definition file.\r
+ * =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+ */\r
+\r
+#ifndef BSP_MSP430_DEFS_H\r
+#define BSP_MSP430_DEFS_H\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                          Defines\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#define BSP_MCU_MSP430\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                     Compiler Abstraction\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+\r
+/* ---------------------- IAR Compiler ---------------------- */\r
+#ifdef __IAR_SYSTEMS_ICC__\r
+#    define BSP_COMPILER_IAR\r
+\r
+#    if (__VER__ < 342)\r
+#        error "ERROR: This IAR compiler port requires at least revision v3.42A."\r
+\r
+/*\r
+ *  Compiler versions previous to v3.42A do not have the universal msp430.h include file.\r
+ *  To use an earlier version of the compiler, replace the above #error statement with\r
+ *  the appropriate, device specific #include statement.\r
+ */\r
+#    endif\r
+\r
+/* Workaround for release v3.42A - the msp430.h file did not include support for some devices */\r
+#    if ((__VER__ == 342) && (__SUBVERSION__ == 'A')) && \\r
+    (defined (__MSP430F1610__) || defined (__MSP430F1611__) || defined (__MSP430F1612__))\r
+#        include <msp430x16x.h>\r
+#    else\r
+#        include <msp430.h>\r
+#    endif\r
+\r
+#    define __bsp_ISTATE_T__            istate_t\r
+#    define __bsp_ISR_FUNCTION__(f, v)   __bsp_QUOTED_PRAGMA__(vector = v) __interrupt void f(void); \\r
+    __bsp_QUOTED_PRAGMA__(vector = v) __interrupt void f(void)\r
+\r
+/* Initialization call provided in IAR environment before standard C-startup */\r
+#    include <intrinsics.h>\r
+#    define BSP_EARLY_INIT(void) __intrinsic int __low_level_init(void)\r
+\r
+/* ---------------------- Code Composer ---------------------- */\r
+#elif (defined __TI_COMPILER_VERSION__) && (defined __MSP430__)\r
+#    define BSP_COMPILER_CODE_COMPOSER\r
+\r
+/* At time of 1.1.0 release, CC430 support not in msp430.h */\r
+#    if (__CC430F6137__)\r
+#        include <cc430x613x.h>\r
+#    else\r
+#        include <msp430.h>\r
+#    endif\r
+\r
+#    define __bsp_ISTATE_T__            unsigned short\r
+#    define __bsp_ISR_FUNCTION__(f, v)   __bsp_QUOTED_PRAGMA__(vector = v) __interrupt void f(void)\r
+\r
+/* Initialization call provided in CCE environment before standard C-startup */\r
+// [BM] Cannot have a second low level init! Already done by application!\r
+//#define BSP_EARLY_INIT(void)  int _system_pre_init(void)\r
+\r
+/* ------------------ Unrecognized Compiler ------------------ */\r
+#else\r
+#    error "ERROR: Unknown compiler."\r
+#endif\r
+\r
+#if (defined BSP_COMPILER_IAR) || (defined BSP_COMPILER_CODE_COMPOSER)\r
+#    include <intrinsics.h>\r
+#    define __bsp_ENABLE_INTERRUPTS__()       __enable_interrupt()\r
+#    define __bsp_DISABLE_INTERRUPTS__()      __disable_interrupt()\r
+#    define __bsp_INTERRUPTS_ARE_ENABLED__()  (__get_SR_register() & GIE)\r
+\r
+#    define __bsp_GET_ISTATE__()              __get_interrupt_state()\r
+#    define __bsp_RESTORE_ISTATE__(x)         __set_interrupt_state(x)\r
+\r
+#    define __bsp_QUOTED_PRAGMA__(x)          _Pragma(# x)\r
+\r
+#endif\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                          Common\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#define __bsp_LITTLE_ENDIAN__   1\r
+#define __bsp_CODE_MEMSPACE__   /* blank */\r
+#define __bsp_XDATA_MEMSPACE__  /* blank */\r
+\r
+typedef   signed char int8_t;\r
+typedef   signed short int16_t;\r
+typedef   signed long int32_t;\r
+\r
+typedef   unsigned char uint8_t;\r
+typedef   unsigned short uint16_t;\r
+typedef   unsigned long uint32_t;\r
+\r
+#ifndef NULL\r
+#    define NULL 0\r
+#endif\r
+\r
+/**************************************************************************************************\r
+ */\r
+#endif\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/simpliciti/Components/mrfi/mrfi.c b/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/simpliciti/Components/mrfi/mrfi.c
new file mode 100755 (executable)
index 0000000..a8b40cf
--- /dev/null
@@ -0,0 +1,87 @@
+/**************************************************************************************************\r
+*  Revised:        $Date: 2007-07-06 11:19:00 -0700 (Fri, 06 Jul 2007) $\r
+*  Revision:       $Revision: 13579 $\r
+*\r
+*  Copyright 2007 Texas Instruments Incorporated.  All rights reserved.\r
+*\r
+*  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+*  the terms of a software license agreement between the user who downloaded the software,\r
+*  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+*  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+*  License. The License limits your use, and you acknowledge, that the Software may not be\r
+*  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+*  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+*  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+*  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+*  perform, display or sell this Software and/or its documentation for any purpose.\r
+*\r
+*  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+*  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+*  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+*  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+*  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+*  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+*  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+*  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+*  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+*\r
+*  Should you have any questions regarding your right to use this Software,\r
+*  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+/* ~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=\r
+ *   MRFI (Minimal RF Interface)\r
+ *   Top-level code file.\r
+ * ~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=\r
+ */\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                          Includes\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#include "mrfi_defs.h"\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                       C Code Includes\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+\r
+/* ----- Radio Family 1 ----- */\r
+#if (defined MRFI_RADIO_FAMILY1)\r
+#    include "radios/family1/mrfi_radio.c"\r
+#    include "radios/family1/mrfi_spi.c"\r
+#    include "radios/common/mrfi_f1f2.c"\r
+#    include "bsp_external/mrfi_board.c"\r
+\r
+/* ----- Radio Family 2 ----- */\r
+#elif (defined MRFI_RADIO_FAMILY2)\r
+#    include "radios/family2/mrfi_radio.c"\r
+#    include "radios/common/mrfi_f1f2.c"\r
+\r
+/* ----- Radio Family 3 ----- */\r
+#elif (defined MRFI_RADIO_FAMILY3)\r
+#    include "bsp_external/mrfi_board.c"\r
+#    include "radios/family3/mrfi_spi.c"\r
+#    include "radios/family3/mrfi_radio.c"\r
+\r
+/* ----- Radio Family 4 ----- */\r
+#elif (defined MRFI_RADIO_FAMILY4)\r
+#    include "radios/family4/mrfi_radio.c"\r
+\r
+/* ----- Radio Family 5 ----- */\r
+#elif (defined MRFI_RADIO_FAMILY5)\r
+#    include "radios/family5/mrfi_radio.c"\r
+#    include "radios/family5/mrfi_radio_interface.c"\r
+\r
+/* ----- Radio Family 6 ----- */\r
+#elif (defined MRFI_RADIO_FAMILY6)\r
+#    include "radios/family6/mrfi_radio.c"\r
+\r
+#else\r
+#    error "ERROR: Radio family is not defined."\r
+#endif\r
+\r
+\r
+/**************************************************************************************************\r
+ */\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/simpliciti/Components/mrfi/mrfi.h b/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/simpliciti/Components/mrfi/mrfi.h
new file mode 100755 (executable)
index 0000000..a976435
--- /dev/null
@@ -0,0 +1,190 @@
+/**************************************************************************************************\r
+*  Revised:        $Date: 2007-07-06 11:19:00 -0700 (Fri, 06 Jul 2007) $\r
+*  Revision:       $Revision: 13579 $\r
+*\r
+*  Copyright 2007 Texas Instruments Incorporated.  All rights reserved.\r
+*\r
+*  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+*  the terms of a software license agreement between the user who downloaded the software,\r
+*  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+*  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+*  License. The License limits your use, and you acknowledge, that the Software may not be\r
+*  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+*  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+*  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+*  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+*  perform, display or sell this Software and/or its documentation for any purpose.\r
+*\r
+*  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+*  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+*  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+*  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+*  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+*  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+*  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+*  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+*  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+*\r
+*  Should you have any questions regarding your right to use this Software,\r
+*  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+/* ~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=\r
+ *   MRFI (Minimal RF Interface)\r
+ *   Include file for all MRFI services.\r
+ * ~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=\r
+ */\r
+\r
+#ifndef MRFI_H\r
+#define MRFI_H\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                          Includes\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#include "bsp.h"\r
+#include "mrfi_defs.h"\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                          Defines\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#define MRFI_NUM_LOGICAL_CHANS           __mrfi_NUM_LOGICAL_CHANS__\r
+\r
+#define MRFI_NUM_POWER_SETTINGS          __mrfi_NUM_POWER_SETTINGS__\r
+\r
+/* return values for MRFI_Transmit */\r
+#define MRFI_TX_RESULT_SUCCESS        0\r
+#define MRFI_TX_RESULT_FAILED         1\r
+\r
+/* transmit type parameter for MRFI_Transmit */\r
+#define MRFI_TX_TYPE_FORCED           0\r
+#define MRFI_TX_TYPE_CCA              1\r
+\r
+/* Network header size definition */\r
+\r
+/* *********************************  NOTE  ****************************************\r
+ * There is a dependency here that really shouldn't exist. A reimplementation\r
+ * is necessary to avoid it.\r
+ *\r
+ * MRFI allocates the frame buffer which means it needs to know at compile time\r
+ * how big the buffer is. This means in must know the NWK header size, the\r
+ * maximum NWK and User application payload sizes and whether Security is enabled.\r
+ * ********************************************************************************\r
+ */\r
+#ifndef SMPL_SECURE\r
+#    define  NWK_HDR_SIZE   3\r
+#    define  NWK_PAYLOAD    MAX_NWK_PAYLOAD\r
+#else\r
+#    define  NWK_HDR_SIZE   6\r
+#    define  NWK_PAYLOAD    (MAX_NWK_PAYLOAD + 4)\r
+#endif\r
+\r
+/* if external code has defined a maximum payload, use that instead of default */\r
+#ifdef MAX_APP_PAYLOAD\r
+#    ifndef MAX_NWK_PAYLOAD\r
+#        error ERROR: MAX_NWK_PAYLOAD not defined\r
+#    endif\r
+#    if MAX_APP_PAYLOAD < NWK_PAYLOAD\r
+#        define MAX_PAYLOAD  NWK_PAYLOAD\r
+#    else\r
+#        define MAX_PAYLOAD  MAX_APP_PAYLOAD\r
+#    endif\r
+#    define MRFI_MAX_PAYLOAD_SIZE  (MAX_PAYLOAD + NWK_HDR_SIZE) /* SimpliciTI payload size plus six\r
+                                                                 *byte overhead */\r
+#endif\r
+\r
+\r
+/* frame definitions */\r
+#define MRFI_ADDR_SIZE              __mrfi_ADDR_SIZE__\r
+#ifndef MRFI_MAX_PAYLOAD_SIZE\r
+#    define MRFI_MAX_PAYLOAD_SIZE       __mrfi_MAX_PAYLOAD_SIZE__\r
+#endif\r
+#define MRFI_MAX_FRAME_SIZE         (MRFI_MAX_PAYLOAD_SIZE + __mrfi_FRAME_OVERHEAD_SIZE__)\r
+#define MRFI_RX_METRICS_SIZE        __mrfi_RX_METRICS_SIZE__\r
+#define MRFI_RX_METRICS_RSSI_OFS    __mrfi_RX_METRICS_RSSI_OFS__\r
+#define MRFI_RX_METRICS_CRC_LQI_OFS __mrfi_RX_METRICS_CRC_LQI_OFS__\r
+\r
+/* Radio States */\r
+#define MRFI_RADIO_STATE_UNKNOWN  0\r
+#define MRFI_RADIO_STATE_OFF      1\r
+#define MRFI_RADIO_STATE_IDLE     2\r
+#define MRFI_RADIO_STATE_RX       3\r
+\r
+/* Platform constant used to calculate worst-case for an application\r
+ * acknowledgment delay. Used in the NWK_REPLY_DELAY() macro.\r
+ *\r
+ *\r
+ *                                    processing time on peer\r
+ |   round trip\r
+ |   |      max number of replays\r
+ |   |      |             number of backoff opportunities\r
+ |   |      |             |         average number of backoffs\r
+ |   |      |             |         |                                    */\r
+#define   PLATFORM_FACTOR_CONSTANT   (2 + 2 * \\r
+                                      (MAX_HOPS * \\r
+                                       (MRFI_CCA_RETRIES * (8 * MRFI_BACKOFF_PERIOD_USECS) / 1000)))\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                          Macros\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#define MRFI_GET_PAYLOAD_LEN(p)         __mrfi_GET_PAYLOAD_LEN__(p)\r
+#define MRFI_SET_PAYLOAD_LEN(p, x)       __mrfi_SET_PAYLOAD_LEN__(p, x)\r
+\r
+#define MRFI_P_DST_ADDR(p)              __mrfi_P_DST_ADDR__(p)\r
+#define MRFI_P_SRC_ADDR(p)              __mrfi_P_SRC_ADDR__(p)\r
+#define MRFI_P_PAYLOAD(p)               __mrfi_P_PAYLOAD__(p)\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                          Typdefs\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+typedef struct\r
+{\r
+    uint8_t frame[MRFI_MAX_FRAME_SIZE];\r
+    uint8_t rxMetrics[MRFI_RX_METRICS_SIZE];\r
+} mrfiPacket_t;\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                         Prototypes\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+void MRFI_Init(void);\r
+\r
+uint8_t MRFI_Transmit(mrfiPacket_t *, uint8_t);\r
+void MRFI_Receive(mrfiPacket_t *);\r
+void MRFI_RxCompleteISR(void);    /* populated by code using MRFI */\r
+uint8_t MRFI_GetRadioState(void);\r
+void MRFI_RxOn(void);\r
+void MRFI_RxIdle(void);\r
+int8_t MRFI_Rssi(void);\r
+\r
+void MRFI_SetLogicalChannel(uint8_t);\r
+uint8_t MRFI_SetRxAddrFilter(uint8_t *);\r
+void MRFI_EnableRxAddrFilter(void);\r
+void MRFI_DisableRxAddrFilter(void);\r
+void MRFI_Sleep(void);\r
+void MRFI_WakeUp(void);\r
+uint8_t MRFI_RandomByte(void);\r
+\r
+void MRFI_DelayMs(uint16_t);\r
+void MRFI_ReplyDelay(void);\r
+void MRFI_PostKillSem(void);\r
+\r
+void MRFI_SetRFPwr(uint8_t);\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                       Global Constants\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+extern const uint8_t mrfiBroadcastAddr[];\r
+\r
+\r
+/**************************************************************************************************\r
+ */\r
+#endif\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/simpliciti/Components/mrfi/mrfi_defs.h b/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/simpliciti/Components/mrfi/mrfi_defs.h
new file mode 100755 (executable)
index 0000000..60d1d72
--- /dev/null
@@ -0,0 +1,233 @@
+/**************************************************************************************************\r
+*  Revised:        $Date: 2009-01-13 16:32:00 -0700 (Wed, 13 Jan 2009) $\r
+*  Revision:       $Revision: 18768 $\r
+*\r
+*  Copyright 2007-2009 Texas Instruments Incorporated.  All rights reserved.\r
+*\r
+*  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+*  the terms of a software license agreement between the user who downloaded the software,\r
+*  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+*  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+*  License. The License limits your use, and you acknowledge, that the Software may not be\r
+*  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+*  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+*  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+*  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+*  perform, display or sell this Software and/or its documentation for any purpose.\r
+*\r
+*  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+*  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+*  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+*  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+*  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+*  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+*  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+*  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+*  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+*\r
+*  Should you have any questions regarding your right to use this Software,\r
+*  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+/* ~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=\r
+ *   MRFI (Minimal RF Interface)\r
+ *   Definition and abstraction for radio targets.\r
+ * ~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=\r
+ */\r
+#ifndef MRFI_DEFS_H\r
+#define MRFI_DEFS_H\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                          Includes\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#include "bsp.h"\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                       Common Defines\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#define MRFI_CCA_RETRIES        4\r
+\r
+#define MRFI_ASSERT(x)          BSP_ASSERT(x)\r
+#define MRFI_FORCE_ASSERT()     BSP_FORCE_ASSERT()\r
+#define MRFI_ASSERTS_ARE_ON     BSP_ASSERTS_ARE_ON\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                    Radio Family Assigment\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+\r
+/* ------ Radio Family 1 ------ */\r
+#if (defined MRFI_CC1100) /* Sub 1 GHz RF Transceiver */ || \\r
+    (defined MRFI_CC1101) /* Sub 1 GHz RF Transceiver */ || \\r
+    (defined MRFI_CC1100E_470) /* Sub 1 GHz RF Transceiver (CC1100E Asia) */ || \\r
+    (defined MRFI_CC1100E_950) /* Sub 1 GHz RF Transceiver (CC1100E Asia) */ || \\r
+    (defined MRFI_CC2500)   /* 2.4 GHz RF Transceiver */\r
+#    define MRFI_RADIO_FAMILY1\r
+\r
+/* ------ Radio Family 2 ------ */\r
+#elif (defined MRFI_CC1110) /* Sub 1 GHz SoC */                     || \\r
+    (defined MRFI_CC1111) /* Sub 1 GHz SoC with USB controller */ || \\r
+    (defined MRFI_CC2510) /* 2.4 GHz SoC */                       || \\r
+    (defined MRFI_CC2511)   /* 2.4 GHz SoC with USB controller */\r
+#    define MRFI_RADIO_FAMILY2\r
+\r
+/* ------ Radio Family 3 ------ */\r
+#elif (defined MRFI_CC2420) /* 2.4 GHz IEEE 802.15.4 RF Transceiver */ || \\r
+    (defined MRFI_CC2520)   /* 2.4 GHz IEEE 802.15.4 RF Transceiver */\r
+\r
+#    define MRFI_RADIO_FAMILY3\r
+\r
+/* ------ Radio Family 4 ------ */\r
+#elif (defined MRFI_CC2430) /* 2.4 GHz IEEE 802.15.4 SoC */ || \\r
+    (defined MRFI_CC2431)   /* 2.4 GHz IEEE 802.15.4 SoC */\r
+#    define MRFI_RADIO_FAMILY4\r
+\r
+/* ------ Radio Family 5 ------ */\r
+#elif (defined MRFI_CC430)  /* Sub 1 GHz MSP SoC */\r
+#    define MRFI_RADIO_FAMILY5\r
+\r
+/* ------ Radio Family 6 ------ */\r
+#elif (defined MRFI_CC2530) /* 2.4 GHz IEEE 802.15.4 SoC */\r
+\r
+#    define MRFI_RADIO_FAMILY6\r
+\r
+#else\r
+#    error "ERROR: Unknown or missing radio selection."\r
+#endif\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                Radio Family 1 / Radio Family 2 / Radio Family 5\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#if (defined MRFI_RADIO_FAMILY1) || (defined MRFI_RADIO_FAMILY2) || (defined MRFI_RADIO_FAMILY5)\r
+\r
+#    define __mrfi_LENGTH_FIELD_SIZE__      1\r
+#    define __mrfi_ADDR_SIZE__              4\r
+#    define __mrfi_MAX_PAYLOAD_SIZE__       20\r
+\r
+#    define __mrfi_RX_METRICS_SIZE__        2\r
+#    define __mrfi_RX_METRICS_RSSI_OFS__    0\r
+#    define __mrfi_RX_METRICS_CRC_LQI_OFS__ 1\r
+#    define __mrfi_RX_METRICS_CRC_OK_MASK__ 0x80\r
+#    define __mrfi_RX_METRICS_LQI_MASK__    0x7F\r
+\r
+#    define __mrfi_NUM_LOGICAL_CHANS__      4\r
+#    define __mrfi_NUM_POWER_SETTINGS__     3\r
+\r
+#    define __mrfi_BACKOFF_PERIOD_USECS__   250\r
+\r
+#    define __mrfi_LENGTH_FIELD_OFS__       0\r
+#    define __mrfi_DST_ADDR_OFS__           (__mrfi_LENGTH_FIELD_OFS__ + __mrfi_LENGTH_FIELD_SIZE__)\r
+#    define __mrfi_SRC_ADDR_OFS__           (__mrfi_DST_ADDR_OFS__ + __mrfi_ADDR_SIZE__)\r
+#    define __mrfi_PAYLOAD_OFS__            (__mrfi_SRC_ADDR_OFS__ + __mrfi_ADDR_SIZE__)\r
+\r
+#    define __mrfi_HEADER_SIZE__            (2 * __mrfi_ADDR_SIZE__)\r
+#    define __mrfi_FRAME_OVERHEAD_SIZE__    (__mrfi_LENGTH_FIELD_SIZE__ + __mrfi_HEADER_SIZE__)\r
+\r
+#    define __mrfi_GET_PAYLOAD_LEN__(p)     ((p)->frame[__mrfi_LENGTH_FIELD_OFS__] - \\r
+                                             __mrfi_HEADER_SIZE__)\r
+#    define __mrfi_SET_PAYLOAD_LEN__(p, x)   st( \\r
+        (p)->frame[__mrfi_LENGTH_FIELD_OFS__] = x + __mrfi_HEADER_SIZE__; )\r
+\r
+#endif\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                Radio Family 3 / Radio Family 4 / Radio Family 6\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#if (defined MRFI_RADIO_FAMILY3) || (defined MRFI_RADIO_FAMILY4) || (defined MRFI_RADIO_FAMILY6)\r
+\r
+#    define __mrfi_LENGTH_FIELD_SIZE__      1\r
+#    define __mrfi_FCF_SIZE__               2\r
+#    define __mrfi_DSN_SIZE__               1\r
+#    define __mrfi_ADDR_SIZE__              4\r
+#    define __mrfi_MAX_PAYLOAD_SIZE__       20\r
+\r
+#    define __mrfi_RX_METRICS_SIZE__        2\r
+#    define __mrfi_RX_METRICS_RSSI_OFS__    0\r
+#    define __mrfi_RX_METRICS_CRC_LQI_OFS__ 1\r
+#    define __mrfi_RX_METRICS_CRC_OK_MASK__ 0x80\r
+#    define __mrfi_RX_METRICS_LQI_MASK__    0x7F\r
+\r
+#    define __mrfi_NUM_LOGICAL_CHANS__      4\r
+#    define __mrfi_NUM_POWER_SETTINGS__     3\r
+\r
+#    define __mrfi_BACKOFF_PERIOD_USECS__   250\r
+\r
+#    define __mrfi_LENGTH_FIELD_OFS__       0\r
+#    define __mrfi_FCF_OFS__                (__mrfi_LENGTH_FIELD_OFS__ + \\r
+                                             __mrfi_LENGTH_FIELD_SIZE__)\r
+#    define __mrfi_DSN_OFS__                (__mrfi_FCF_OFS__          +  __mrfi_FCF_SIZE__)\r
+#    define __mrfi_DST_ADDR_OFS__           (__mrfi_DSN_OFS__          +  __mrfi_DSN_SIZE__)\r
+#    define __mrfi_SRC_ADDR_OFS__           (__mrfi_DST_ADDR_OFS__     +  __mrfi_ADDR_SIZE__)\r
+#    define __mrfi_PAYLOAD_OFS__            (__mrfi_SRC_ADDR_OFS__     +  __mrfi_ADDR_SIZE__)\r
+\r
+#    define __mrfi_HEADER_SIZE__            ((2 * \\r
+                                              __mrfi_ADDR_SIZE__) + __mrfi_FCF_SIZE__ + \\r
+                                             __mrfi_DSN_SIZE__)\r
+#    define __mrfi_FRAME_OVERHEAD_SIZE__    (__mrfi_LENGTH_FIELD_SIZE__ + __mrfi_HEADER_SIZE__)\r
+\r
+#    define __mrfi_GET_PAYLOAD_LEN__(p)     ((p)->frame[__mrfi_LENGTH_FIELD_OFS__] - \\r
+                                             __mrfi_HEADER_SIZE__)\r
+#    define __mrfi_SET_PAYLOAD_LEN__(p, x)   st( \\r
+        (p)->frame[__mrfi_LENGTH_FIELD_OFS__] = x + __mrfi_HEADER_SIZE__; )\r
+\r
+#endif\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                   Radio Family Commonality\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#define __mrfi_P_DST_ADDR__(p)          (&((p)->frame[__mrfi_DST_ADDR_OFS__]))\r
+#define __mrfi_P_SRC_ADDR__(p)          (&((p)->frame[__mrfi_SRC_ADDR_OFS__]))\r
+#define __mrfi_P_PAYLOAD__(p)           (&((p)->frame[__mrfi_PAYLOAD_OFS__]))\r
+\r
+\r
+/* ************************************************************************************************\r
+ *                                   Compile Time Integrity Checks\r
+ * ************************************************************************************************\r
+ */\r
+\r
+/* verify that only one supported radio is selected */\r
+#define MRFI_NUM_SUPPORTED_RADIOS_SELECTED   ((defined MRFI_CC1100) + \\r
+                                              (defined MRFI_CC1101) + \\r
+                                              (defined MRFI_CC1110) + \\r
+                                              (defined MRFI_CC1111) + \\r
+                                              (defined MRFI_CC1100E_470) + \\r
+                                              (defined MRFI_CC1100E_950) + \\r
+                                              (defined MRFI_CC2500) + \\r
+                                              (defined MRFI_CC2510) + \\r
+                                              (defined MRFI_CC2511) + \\r
+                                              (defined MRFI_CC2430) + \\r
+                                              (defined MRFI_CC2431) + \\r
+                                              (defined MRFI_CC2520) + \\r
+                                              (defined MRFI_CC430)  + \\r
+                                              (defined MRFI_CC2530))\r
+#if (MRFI_NUM_SUPPORTED_RADIOS_SELECTED == 0)\r
+#    error "ERROR: A valid radio is not selected."\r
+#elif (MRFI_NUM_SUPPORTED_RADIOS_SELECTED > 1)\r
+#    error "ERROR: More than one radio is selected."\r
+#endif\r
+\r
+/* verify that a radio family is selected */\r
+#if (!defined MRFI_RADIO_FAMILY1) && \\r
+    (!defined MRFI_RADIO_FAMILY2) && \\r
+    (!defined MRFI_RADIO_FAMILY3) && \\r
+    (!defined MRFI_RADIO_FAMILY4) && \\r
+    (!defined MRFI_RADIO_FAMILY5) && \\r
+    (!defined MRFI_RADIO_FAMILY6)\r
+#    error "ERROR: A radio family has not been assigned."\r
+#endif\r
+\r
+\r
+/**************************************************************************************************\r
+ */\r
+#endif\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/simpliciti/Components/mrfi/radios/family5/mrfi_radio.c b/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/simpliciti/Components/mrfi/radios/family5/mrfi_radio.c
new file mode 100755 (executable)
index 0000000..5569553
--- /dev/null
@@ -0,0 +1,1824 @@
+/**************************************************************************************************\r
+*  Revised:        $Date: 2009-11-23 07:50:43 -0800 (Mon, 23 Nov 2009) $\r
+*  Revision:       $Revision: 21225 $\r
+*\r
+*  Copyright 2008-2009 Texas Instruments Incorporated.  All rights reserved.\r
+*\r
+*  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+*  the terms of a software license agreement between the user who downloaded the software,\r
+*  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+*  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+*  License. The License limits your use, and you acknowledge, that the Software may not be\r
+*  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+*  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+*  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+*  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+*  perform, display or sell this Software and/or its documentation for any purpose.\r
+*\r
+*  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS?\r
+*  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+*  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+*  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+*  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+*  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+*  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+*  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+*  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+*\r
+*  Should you have any questions regarding your right to use this Software,\r
+*  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+/* ~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=\r
+ *   MRFI (Minimal RF Interface)\r
+ *   Radios: CC430\r
+ *   Primary code file for supported radios.\r
+ * ~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=\r
+ */\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                          Includes\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#include <string.h>\r
+#include "mrfi.h"\r
+#include "bsp.h"\r
+#include "bsp_macros.h"\r
+#include "bsp_external/mrfi_board_defs.h"\r
+#include "mrfi_defs.h"\r
+#include "mrfi_radio_interface.h"\r
+#include "smartrf/CC430/smartrf_CC430.h"\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                    Global Constants\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+const uint8_t mrfiBroadcastAddr[] = { 0xFF, 0xFF, 0xFF, 0xFF };\r
+\r
+/* verify number of table entries matches the corresponding #define */\r
+BSP_STATIC_ASSERT(MRFI_ADDR_SIZE ==\r
+                  ((sizeof(mrfiBroadcastAddr) /\r
+                    sizeof(mrfiBroadcastAddr[0])) * sizeof(mrfiBroadcastAddr[0])));\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                          Defines\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#if (defined MRFI_CC430)\r
+#    define MRFI_RSSI_OFFSET    74 /* no units */\r
+#else\r
+#    error "ERROR: RSSI offset value not defined for this radio"\r
+#endif\r
+\r
+#define MRFI_LENGTH_FIELD_OFS               __mrfi_LENGTH_FIELD_OFS__\r
+#define MRFI_LENGTH_FIELD_SIZE              __mrfi_LENGTH_FIELD_SIZE__\r
+#define MRFI_HEADER_SIZE                    __mrfi_HEADER_SIZE__\r
+#define MRFI_FRAME_BODY_OFS                 __mrfi_DST_ADDR_OFS__\r
+#define MRFI_BACKOFF_PERIOD_USECS           __mrfi_BACKOFF_PERIOD_USECS__\r
+\r
+#define MRFI_RANDOM_OFFSET                   67\r
+#define MRFI_RANDOM_MULTIPLIER              109\r
+#define MRFI_MIN_SMPL_FRAME_SIZE            (MRFI_HEADER_SIZE + NWK_HDR_SIZE)\r
+\r
+/* rx metrics definitions, known as appended "packet status bytes" in datasheet parlance */\r
+#define MRFI_RX_METRICS_CRC_OK_MASK         __mrfi_RX_METRICS_CRC_OK_MASK__\r
+#define MRFI_RX_METRICS_LQI_MASK            __mrfi_RX_METRICS_LQI_MASK__\r
+\r
+\r
+/* ---------- Radio Abstraction ---------- */\r
+\r
+#define MRFI_RADIO_PARTNUM          0x00\r
+#define MRFI_RADIO_VERSION          0x06\r
+\r
+/* GDO0 == PA_PD signal */\r
+#define MRFI_SETTING_IOCFG0     27\r
+\r
+/* GDO1 == RSSI_VALID signal */\r
+#define MRFI_SETTING_IOCFG1     30\r
+\r
+/* Main Radio Control State Machine control configuration:\r
+ * Auto Calibrate - when going from IDLE to RX/TX\r
+ * XOSC is OFF in Sleep state.\r
+ */\r
+#define MRFI_SETTING_MCSM0      (0x10)\r
+\r
+/* Main Radio Control State Machine control configuration:\r
+ * - Remain RX state after RX\r
+ * - Go to IDLE after TX\r
+ * - RSSI below threshold and NOT receiving.\r
+ */\r
+#define MRFI_SETTING_MCSM1      0x3C\r
+\r
+/*\r
+ *  Packet Length - Setting for maximum allowed packet length.\r
+ *  The PKTLEN setting does not include the length field but maximum frame size does.\r
+ *  Subtract length field size from maximum frame size to get value for PKTLEN.\r
+ */\r
+#define MRFI_SETTING_PKTLEN     (MRFI_MAX_FRAME_SIZE - MRFI_LENGTH_FIELD_SIZE)\r
+\r
+/* Packet automation control - Original value except WHITE_DATA is extracted from SmartRF setting.\r
+ **/\r
+#define MRFI_SETTING_PKTCTRL0   (0x05 | (SMARTRF_SETTING_PKTCTRL0 & BV(6)))\r
+\r
+/* FIFO threshold - this register has fields that need to be configured for the CC1101 */\r
+#define MRFI_SETTING_FIFOTHR    (0x07 | (SMARTRF_SETTING_FIFOTHR & (BV(4) | BV(5) | BV(6) | BV(7))))\r
+\r
+/* Max time we can be in a critical section within the delay function.\r
+ * This could be fine-tuned by observing the overhead is calling the bsp delay\r
+ * function. The overhead should be very small compared to this value.\r
+ */\r
+#define MRFI_MAX_DELAY_US 16 /* usec */\r
+\r
+/* Packet automation control - base value is power up value whick has APPEND_STATUS enabled; no CRC\r
+ *autoflush */\r
+#define PKTCTRL1_BASE_VALUE         BV(2)\r
+#define PKTCTRL1_ADDR_FILTER_OFF    PKTCTRL1_BASE_VALUE\r
+#define PKTCTRL1_ADDR_FILTER_ON     (PKTCTRL1_BASE_VALUE | (BV(0) | BV(1)))\r
+\r
+#ifdef MRFI_ASSERTS_ARE_ON\r
+#    define RX_FILTER_ADDR_INITIAL_VALUE  0xFF\r
+#endif\r
+\r
+/* The SW timer is calibrated by adjusting the call to the microsecond delay\r
+ * routine. This allows maximum calibration control with repects to the longer\r
+ * times requested by applicationsd and decouples internal from external calls\r
+ * to the microsecond routine which can be calibrated independently.\r
+ */\r
+#if defined(SW_TIMER)\r
+#    define APP_USEC_VALUE    1000\r
+#else\r
+#    define APP_USEC_VALUE    1000\r
+#endif\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                           Macros\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#define MRFI_ENABLE_SYNC_PIN_INT()                  (RF1AIE |= BV(9))\r
+#define MRFI_DISABLE_SYNC_PIN_INT()                 (RF1AIE &= ~BV(9))\r
+#define MRFI_CLEAR_SYNC_PIN_INT_FLAG()              (RF1AIFG &= ~BV(9))\r
+#define MRFI_SYNC_PIN_INT_IS_ENABLED()              (RF1AIE & BV(9))\r
+#define MRFI_SYNC_PIN_IS_HIGH()                     (RF1AIN & BV(9))\r
+#define MRFI_SYNC_PIN_INT_FLAG_IS_SET()             (RF1AIFG & BV(9))\r
+\r
+\r
+#define MRFI_CLEAR_PAPD_PIN_INT_FLAG()              (RF1AIFG &= ~BV(0))\r
+#define MRFI_PAPD_PIN_IS_HIGH()                     (RF1AIN & BV(0))\r
+#define MRFI_PAPD_INT_FLAG_IS_SET()                 (RF1AIFG & BV(0))\r
+\r
+\r
+/* RSSI valid signal is available on the GDO_1 */\r
+#define MRFI_RSSI_VALID_WAIT()  while (!(RF1AIN & BV(1))) ;\r
+\r
+\r
+/* Abstract radio interface calls. Could use these later to\r
+ * merge code from similar radio but different interface.\r
+ */\r
+#define MRFI_STROBE(cmd)                      mrfiRadioInterfaceCmdStrobe(cmd)\r
+#define MRFI_RADIO_REG_READ(reg)              mrfiRadioInterfaceReadReg(reg)\r
+#define MRFI_RADIO_REG_WRITE(reg, value)      mrfiRadioInterfaceWriteReg(reg, value)\r
+#define MRFI_RADIO_WRITE_TX_FIFO(pData, len)  mrfiRadioInterfaceWriteTxFifo(pData, len)\r
+#define MRFI_RADIO_READ_RX_FIFO(pData, len)   mrfiRadioInterfaceReadRxFifo(pData, len)\r
+\r
+\r
+#define MRFI_STROBE_IDLE_AND_WAIT()              \\r
+    {                                                \\r
+        MRFI_STROBE(SIDLE);                          \\r
+        /* Wait for XOSC to be stable and radio in IDLE state */ \\r
+        while (MRFI_STROBE(SNOP) & 0xF0) ;           \\r
+    }\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                    Local Constants\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+const uint8_t mrfiRadioCfg[][2] =\r
+{\r
+    /* internal radio configuration */\r
+    {  IOCFG0,    MRFI_SETTING_IOCFG0       }, /* Configure GDO_0 to output PA_PD signal (low during\r
+                                                *TX, high otherwise). */\r
+    {  IOCFG1,    MRFI_SETTING_IOCFG1       }, /* Configure GDO_1 to output RSSI_VALID signal (high\r
+                                                *when RSSI is valid, low otherwise). */\r
+    {  MCSM1,     MRFI_SETTING_MCSM1        }, /* CCA mode, RX_OFF_MODE and TX_OFF_MODE */\r
+    {  MCSM0,     MRFI_SETTING_MCSM0        }, /* AUTO_CAL and XOSC state in sleep */\r
+    {  PKTLEN,    MRFI_SETTING_PKTLEN       },\r
+    {  PKTCTRL0,  MRFI_SETTING_PKTCTRL0     },\r
+    {  FIFOTHR,   MRFI_SETTING_FIFOTHR      },\r
+\r
+    /* imported SmartRF radio configuration */\r
+\r
+    {  FSCTRL1,   SMARTRF_SETTING_FSCTRL1   },\r
+    {  FSCTRL0,   SMARTRF_SETTING_FSCTRL0   },\r
+    {  FREQ2,     SMARTRF_SETTING_FREQ2     },\r
+    {  FREQ1,     SMARTRF_SETTING_FREQ1     },\r
+    {  FREQ0,     SMARTRF_SETTING_FREQ0     },\r
+    {  MDMCFG4,   SMARTRF_SETTING_MDMCFG4   },\r
+    {  MDMCFG3,   SMARTRF_SETTING_MDMCFG3   },\r
+    {  MDMCFG2,   SMARTRF_SETTING_MDMCFG2   },\r
+    {  MDMCFG1,   SMARTRF_SETTING_MDMCFG1   },\r
+    {  MDMCFG0,   SMARTRF_SETTING_MDMCFG0   },\r
+    {  DEVIATN,   SMARTRF_SETTING_DEVIATN   },\r
+    {  FOCCFG,    SMARTRF_SETTING_FOCCFG    },\r
+    {  BSCFG,     SMARTRF_SETTING_BSCFG     },\r
+    {  AGCCTRL2,  SMARTRF_SETTING_AGCCTRL2  },\r
+    {  AGCCTRL1,  SMARTRF_SETTING_AGCCTRL1  },\r
+    {  AGCCTRL0,  SMARTRF_SETTING_AGCCTRL0  },\r
+    {  FREND1,    SMARTRF_SETTING_FREND1    },\r
+    {  FREND0,    SMARTRF_SETTING_FREND0    },\r
+    {  FSCAL3,    SMARTRF_SETTING_FSCAL3    },\r
+    {  FSCAL2,    SMARTRF_SETTING_FSCAL2    },\r
+    {  FSCAL1,    SMARTRF_SETTING_FSCAL1    },\r
+    {  FSCAL0,    SMARTRF_SETTING_FSCAL0    },\r
+    {  TEST2,     SMARTRF_SETTING_TEST2     },\r
+    {  TEST1,     SMARTRF_SETTING_TEST1     },\r
+    {  TEST0,     SMARTRF_SETTING_TEST0     },\r
+};\r
+\r
+\r
+/*\r
+ *  Logical channel table - this table translates logical channel into\r
+ *  actual radio channel number.  Channel 0, the default channel, is\r
+ *  determined by the channel exported from SmartRF Studio.  The other\r
+ *  table entries are derived from that default.  Each derived channel is\r
+ *  masked with 0xFF to prevent generation of an illegal channel number.\r
+ *\r
+ *  This table is easily customized.  Just replace or add entries as needed.\r
+ *  If the number of entries changes, the corresponding #define must also\r
+ *  be adjusted.  It is located in mrfi_defs.h and is called __mrfi_NUM_LOGICAL_CHANS__.\r
+ *  The static assert below ensures that there is no mismatch.\r
+ */\r
+// [BM] Changed channel assignment to comply with local regulations\r
+#ifdef ISM_EU\r
+static const uint8_t mrfiLogicalChanTable[] =\r
+{\r
+    0,\r
+    50,\r
+    80,\r
+    110\r
+};\r
+#else\r
+#    ifdef ISM_US\r
+static const uint8_t mrfiLogicalChanTable[] =\r
+{\r
+    20,\r
+    50,\r
+    80,\r
+    110\r
+};\r
+#    else\r
+#        ifdef ISM_LF\r
+static const uint8_t mrfiLogicalChanTable[] =\r
+{\r
+    0,\r
+    50,\r
+    80,\r
+    110\r
+};\r
+#        else\r
+#            error "Wrong ISM band specified (valid are ISM_LF, ISM_EU and ISM_US)"\r
+#        endif\r
+#    endif\r
+#endif\r
+//static const uint8_t mrfiLogicalChanTable[] =\r
+//{\r
+//  SMARTRF_SETTING_CHANNR,\r
+//  50,\r
+//  80,\r
+//  110\r
+//};\r
+/* verify number of table entries matches the corresponding #define */\r
+BSP_STATIC_ASSERT(__mrfi_NUM_LOGICAL_CHANS__ ==\r
+                  ((sizeof(mrfiLogicalChanTable) /\r
+                    sizeof(mrfiLogicalChanTable[0])) * sizeof(mrfiLogicalChanTable[0])));\r
+\r
+/*\r
+ *  RF Power setting table - this table translates logical power value\r
+ *  to radio register setting.  The logical power value is used directly\r
+ *  as an index into the power setting table. The values in the table are\r
+ *  from low to high. The default settings set 3 values: -20 dBm, -10 dBm,\r
+ *  and 0 dBm. The default at startup is the highest value. Note that these\r
+ *  are approximate depending on the radio. Information is taken from the\r
+ *  data sheet.\r
+ *\r
+ *  This table is easily customized.  Just replace or add entries as needed.\r
+ *  If the number of entries changes, the corresponding #define must also\r
+ *  be adjusted.  It is located in mrfi_defs.h and is called __mrfi_NUM_POWER_SETTINGS__.\r
+ *  The static assert below ensures that there is no mismatch.\r
+ *\r
+ * For the CC430 use the CC1100 values.\r
+ */\r
+static const uint8_t mrfiRFPowerTable[] =\r
+{\r
+    // [BM] Changed default output power to comply with dongle settings\r
+    0x0F,\r
+    0x27,\r
+    // [BM] Increase output power from -0.3dBm to +1.4dBm (433MHz) / +1.1dBm (868MHz) / +1.3dBm\r
+    // (915MHz) to compensate antenna loss\r
+#ifdef ISM_EU\r
+    0x8C\r
+#else\r
+#    ifdef ISM_US\r
+    0x8B\r
+#    else\r
+#        ifdef ISM_LF\r
+    0x8D\r
+#        else\r
+#            error "Wrong ISM band specified (valid are ISM_LF, ISM_EU and ISM_US)"\r
+#        endif\r
+#    endif\r
+#endif\r
+};\r
+//static const uint8_t mrfiRFPowerTable[] =\r
+//{\r
+//  0x0D,\r
+//  0x34,\r
+//  0x8E\r
+//};\r
+\r
+/* verify number of table entries matches the corresponding #define */\r
+BSP_STATIC_ASSERT(__mrfi_NUM_POWER_SETTINGS__ ==\r
+                  ((sizeof(mrfiRFPowerTable) /\r
+                    sizeof(mrfiRFPowerTable[0])) * sizeof(mrfiRFPowerTable[0])));\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                       Local Prototypes\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+static void Mrfi_SyncPinRxIsr(void);\r
+static void Mrfi_RxModeOn(void);\r
+static void Mrfi_RandomBackoffDelay(void);\r
+static void Mrfi_RxModeOff(void);\r
+static void Mrfi_DelayUsec(uint16_t howLong);\r
+static void Mrfi_DelayUsecSem(uint16_t howLong);\r
+static int8_t Mrfi_CalculateRssi(uint8_t rawValue);\r
+static uint8_t Mrfi_RxAddrIsFiltered(uint8_t * pAddr);\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                       Local Variables\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+static uint8_t mrfiRadioState  = MRFI_RADIO_STATE_UNKNOWN;\r
+static mrfiPacket_t mrfiIncomingPacket;\r
+static uint8_t mrfiRndSeed = 0;\r
+\r
+/* reply delay support */\r
+static volatile uint8_t sKillSem = 0;\r
+static volatile uint8_t sReplyDelayContext = 0;\r
+static uint16_t sReplyDelayScalar = 0;\r
+static uint16_t sBackoffHelper = 0;\r
+\r
+static uint8_t mrfiRxFilterEnabled = 0;\r
+static uint8_t mrfiRxFilterAddr[MRFI_ADDR_SIZE] = { RX_FILTER_ADDR_INITIAL_VALUE };\r
+\r
+/* These counters are only for diagnostic purpose */\r
+static uint32_t crcFail = 0;\r
+static uint32_t crcPass = 0;\r
+static uint32_t noFrame = 0;\r
+\r
+// [BM] Radio frequency offset read from calibration memory\r
+// Compensates crystal deviation from 26MHz nominal value\r
+extern unsigned char rf_frequoffset;\r
+\r
+/**************************************************************************************************\r
+ * @fn          MRFI_Init\r
+ *\r
+ * @brief       Initialize MRFI.\r
+ *\r
+ * @param       none\r
+ *\r
+ * @return      none\r
+ **************************************************************************************************\r
+ */\r
+\r
+void MRFI_Init(void)\r
+{\r
+    /* ------------------------------------------------------------------\r
+     *    Radio power-up reset\r
+     *   ----------------------\r
+     */\r
+    memset(&mrfiIncomingPacket, 0x0, sizeof(mrfiIncomingPacket));\r
+\r
+    /* Initialize the radio interface */\r
+    mrfiRadioInterfaceInit();\r
+\r
+    /* Strobe Reset: Resets the radio and puts it in SLEEP state. */\r
+    MRFI_STROBE(SRES);\r
+\r
+    /* verify the correct radio is installed */\r
+    MRFI_ASSERT(MRFI_RADIO_REG_READ(PARTNUM) == MRFI_RADIO_PARTNUM);    /* incorrect radio specified\r
+                                                                         **/\r
+    MRFI_ASSERT(MRFI_RADIO_REG_READ(VERSION) == MRFI_RADIO_VERSION);    /* incorrect radio specified\r
+                                                                         * */\r
+\r
+    /* Put radio in Idle state */\r
+    MRFI_STROBE_IDLE_AND_WAIT();\r
+\r
+\r
+    /* ------------------------------------------------------------------\r
+     *    Configure radio\r
+     *   -----------------\r
+     */\r
+\r
+    /* Configure Radio interrupts:\r
+     *\r
+     * RF1AIN_0 => Programmed to PA_PD signal.\r
+     *             Configure it to interrupt on falling edge.\r
+     *\r
+     * RF1AIN_1 => Programmed to RSSI Valid signal.\r
+     *             No need to configure for interrupt. This value will be read\r
+     *             through polling.\r
+     *\r
+     * RF1AIN_9 => Rising edge indicates SYNC sent/received and\r
+     *             Falling edge indicates end of packet.\r
+     *             Configure it to interrupt on falling edge.\r
+     */\r
+\r
+    /* Select Interrupt edge for PA_PD and SYNC signal:\r
+     * Interrupt Edge select register: 1 == Interrupt on High to Low transition.\r
+     */\r
+    RF1AIES = BV(0) | BV(9);\r
+\r
+    /* Write the power output to the PA_TABLE and verify the write operation.  */\r
+    {\r
+        uint8_t readbackPATableValue = 0;\r
+        bspIState_t s;\r
+\r
+        BSP_ENTER_CRITICAL_SECTION(s);\r
+\r
+        while (!(RF1AIFCTL1 & RFINSTRIFG)) ;\r
+        RF1AINSTRW = 0x7E51;                /* PA Table write (burst) */\r
+\r
+        while (!(RF1AIFCTL1 & RFINSTRIFG)) ;\r
+        RF1AINSTRB = RF_SNOP;               /* reset pointer */\r
+\r
+        while (!(RF1AIFCTL1 & RFINSTRIFG)) ;\r
+        RF1AINSTRB = 0xFE;                  /* PA Table read (burst) */\r
+\r
+        while (!(RF1AIFCTL1 & RFDINIFG)) ;\r
+        RF1ADINB    = 0x00;                 /* dummy write */\r
+\r
+        while (!(RF1AIFCTL1 & RFDOUTIFG)) ;\r
+        readbackPATableValue = RF1ADOUT0B;\r
+\r
+        MRFI_ASSERT(readbackPATableValue == 0x51);\r
+\r
+        while (!(RF1AIFCTL1 & RFINSTRIFG)) ;\r
+        RF1AINSTRB = RF_SNOP;\r
+\r
+        BSP_EXIT_CRITICAL_SECTION(s);\r
+    }\r
+\r
+    /* initialize radio registers */\r
+    {\r
+        uint8_t i;\r
+\r
+        for (i = 0; i < (sizeof(mrfiRadioCfg) / sizeof(mrfiRadioCfg[0])); i++)\r
+        {\r
+            MRFI_RADIO_REG_WRITE(mrfiRadioCfg[i][0], mrfiRadioCfg[i][1]);\r
+        }\r
+    }\r
+\r
+    /* Confirm that the values were written correctly.\r
+     */\r
+    {\r
+        uint8_t i;\r
+\r
+        for (i = 0; i < (sizeof(mrfiRadioCfg) / sizeof(mrfiRadioCfg[0])); i++)\r
+        {\r
+            MRFI_ASSERT(mrfiRadioCfg[i][1] == MRFI_RADIO_REG_READ(mrfiRadioCfg[i][0]));\r
+        }\r
+    }\r
+\r
+    // [BM] Apply global frequency offset to FSCTRL0\r
+    MRFI_STROBE_IDLE_AND_WAIT();\r
+    MRFI_RADIO_REG_WRITE(FSCTRL0, rf_frequoffset);\r
+\r
+    /* set default channel */\r
+    MRFI_SetLogicalChannel(0);\r
+\r
+    /* Set default power level */\r
+    MRFI_SetRFPwr(MRFI_NUM_POWER_SETTINGS - 1);\r
+\r
+    /* Generate Random seed:\r
+     * We will use the RSSI value to generate our random seed.\r
+     */\r
+\r
+    /* Put the radio in RX state */\r
+    MRFI_STROBE(SRX);\r
+\r
+    /* delay for the rssi to be valid */\r
+    MRFI_RSSI_VALID_WAIT();\r
+\r
+    {\r
+        uint8_t i;\r
+        for (i = 0; i < 16; i++)\r
+        {\r
+            /* use most random bit of rssi to populate the random seed */\r
+            mrfiRndSeed = (mrfiRndSeed << 1) | (MRFI_RADIO_REG_READ(RSSI) & 0x01);\r
+        }\r
+    }\r
+\r
+    /* Force the seed to be non-zero by setting one bit, just in case... */\r
+    mrfiRndSeed |= 0x0080;\r
+\r
+    /* Turn off RF. */\r
+    Mrfi_RxModeOff();\r
+\r
+    /* Strobe Power Down (SPWD): puts the radio in SLEEP state. */\r
+\r
+    /* Chip bug: Radio does not come out of this SLEEP when put to sleep\r
+     * using the SPWD cmd. However, it does wakes up if SXOFF was used to\r
+     * put it to sleep.\r
+     */\r
+    MRFI_STROBE(SXOFF);\r
+\r
+    /* Initial radio state is IDLE state */\r
+    mrfiRadioState = MRFI_RADIO_STATE_OFF;\r
+\r
+    /*****************************************************************************************\r
+     *                            Compute reply delay scalar\r
+     *\r
+     * Formula from data sheet for all the narrow band radios is:\r
+     *\r
+     *                (256 + DATAR_Mantissa) * 2^(DATAR_Exponent)\r
+     * DATA_RATE =    ------------------------------------------ * f(xosc)\r
+     *                                    2^28\r
+     *\r
+     * To try and keep some accuracy we change the exponent of the denominator\r
+     * to (28 - (exponent from the configuration register)) so we do a division\r
+     * by a smaller number. We find the power of 2 by shifting.\r
+     *\r
+     * The maximum delay needed depends on the MAX_APP_PAYLOAD parameter. Figure\r
+     * out how many bits that will be when overhead is included. Bits/bits-per-second\r
+     * is seconds to transmit (or receive) the maximum frame. We multiply this number\r
+     * by 1000 to find the time in milliseconds. We then additionally multiply by\r
+     * 10 so we can add 5 and divide by 10 later, thus rounding up to the number of\r
+     * milliseconds. This last won't matter for slow transmissions but for faster ones\r
+     * we want to err on the side of being conservative and making sure the radio is on\r
+     * to receive the reply. The semaphore monitor will shut it down. The delay adds in\r
+     * a fudge factor that includes processing time on peer plus lags in Rx and processing\r
+     * time on receiver's side.\r
+     *\r
+     * Note that we assume a 26 MHz clock for the radio...\r
+     * ***************************************************************************************\r
+     */\r
+#define   MRFI_RADIO_OSC_FREQ         26000000\r
+#define   PHY_PREAMBLE_SYNC_BYTES     8\r
+\r
+    {\r
+        uint32_t dataRate, bits;\r
+        uint16_t exponent, mantissa;\r
+\r
+        /* mantissa is in MDMCFG3 */\r
+        mantissa = 256 + SMARTRF_SETTING_MDMCFG3;\r
+\r
+        /* exponent is lower nibble of MDMCFG4. */\r
+        exponent = 28 - (SMARTRF_SETTING_MDMCFG4 & 0x0F);\r
+\r
+        /* we can now get data rate */\r
+        dataRate = mantissa * (MRFI_RADIO_OSC_FREQ >> exponent);\r
+\r
+        bits = ((uint32_t)((PHY_PREAMBLE_SYNC_BYTES + MRFI_MAX_FRAME_SIZE) * 8)) * 10000;\r
+\r
+        /* processing on the peer + the Tx/Rx time plus more */\r
+        sReplyDelayScalar = PLATFORM_FACTOR_CONSTANT + (((bits / dataRate) + 5) / 10);\r
+\r
+        /* This helper value is used to scale the backoffs during CCA. At very\r
+         * low data rates we need to backoff longer to prevent continual sampling\r
+         * of valid frames which take longer to send at lower rates. Use the scalar\r
+         * we just calculated divided by 32. With the backoff algorithm backing\r
+         * off up to 16 periods this will result in waiting up to about 1/2 the total\r
+         * scalar value. For high data rates this does not contribute at all. Value\r
+         * is in microseconds.\r
+         */\r
+        sBackoffHelper = MRFI_BACKOFF_PERIOD_USECS + (sReplyDelayScalar >> 5) * 1000;\r
+    }\r
+\r
+    /* Clean out buffer to protect against spurious frames */\r
+    memset(mrfiIncomingPacket.frame, 0x00, sizeof(mrfiIncomingPacket.frame));\r
+    memset(mrfiIncomingPacket.rxMetrics, 0x00, sizeof(mrfiIncomingPacket.rxMetrics));\r
+\r
+    /* enable global interrupts */\r
+    BSP_ENABLE_INTERRUPTS();\r
+}\r
+\r
+/**************************************************************************************************\r
+ * @fn          MRFI_Transmit\r
+ *\r
+ * @brief       Transmit a packet using CCA algorithm.\r
+ *\r
+ * @param       pPacket - pointer to packet to transmit\r
+ *\r
+ * @return      Return code indicates success or failure of transmit:\r
+ *                  MRFI_TX_RESULT_SUCCESS - transmit succeeded\r
+ *                  MRFI_TX_RESULT_FAILED  - transmit failed because CCA failed\r
+ **************************************************************************************************\r
+ */\r
+\r
+uint8_t MRFI_Transmit(mrfiPacket_t * pPacket, uint8_t txType)\r
+{\r
+    uint8_t ccaRetries;\r
+    uint8_t txBufLen;\r
+    uint8_t returnValue = MRFI_TX_RESULT_SUCCESS;\r
+\r
+    /* radio must be awake to transmit */\r
+    MRFI_ASSERT(mrfiRadioState != MRFI_RADIO_STATE_OFF);\r
+\r
+    /* Turn off reciever. We can ignore/drop incoming packets during transmit. */\r
+    Mrfi_RxModeOff();\r
+\r
+    /* compute number of bytes to write to transmit FIFO */\r
+    txBufLen = pPacket->frame[MRFI_LENGTH_FIELD_OFS] + MRFI_LENGTH_FIELD_SIZE;\r
+\r
+    /* ------------------------------------------------------------------\r
+     *    Write packet to transmit FIFO\r
+     *   --------------------------------\r
+     */\r
+    MRFI_RADIO_WRITE_TX_FIFO(&(pPacket->frame[0]), txBufLen);\r
+\r
+\r
+    /* ------------------------------------------------------------------\r
+     *    Immediate transmit\r
+     *   ---------------------\r
+     */\r
+    if (txType == MRFI_TX_TYPE_FORCED)\r
+    {\r
+        /* Issue the TX strobe. */\r
+        MRFI_STROBE(STX);\r
+\r
+        /* Wait for transmit to complete */\r
+        while (!MRFI_SYNC_PIN_INT_FLAG_IS_SET()) ;\r
+\r
+        /* Clear the interrupt flag */\r
+        MRFI_CLEAR_SYNC_PIN_INT_FLAG();\r
+    }\r
+    else\r
+    {\r
+        /* ------------------------------------------------------------------\r
+         *    CCA transmit\r
+         *   ---------------\r
+         */\r
+\r
+        MRFI_ASSERT(txType == MRFI_TX_TYPE_CCA);\r
+\r
+        /* set number of CCA retries */\r
+        ccaRetries = MRFI_CCA_RETRIES;\r
+\r
+\r
+        /* ===============================================================================\r
+         *    Main Loop\r
+         *  =============\r
+         */\r
+        for (;;)\r
+        {\r
+            /* Radio must be in RX mode for CCA to happen.\r
+             * Otherwise it will transmit without CCA happening.\r
+             */\r
+\r
+            /* Can not use the Mrfi_RxModeOn() function here since it turns on the\r
+             * Rx interrupt, which we don't want in this case.\r
+             */\r
+            MRFI_STROBE(SRX);\r
+\r
+            /* wait for the rssi to be valid. */\r
+            MRFI_RSSI_VALID_WAIT();\r
+\r
+            /*\r
+             *  Clear the PA_PD pin interrupt flag.  This flag, not the interrupt itself,\r
+             *  is used to capture the transition that indicates a transmit was started.\r
+             *  The pin level cannot be used to indicate transmit success as timing may\r
+             *  prevent the transition from being detected.  The interrupt latch captures\r
+             *  the event regardless of timing.\r
+             */\r
+            MRFI_CLEAR_PAPD_PIN_INT_FLAG();\r
+\r
+            /* send strobe to initiate transmit */\r
+            MRFI_STROBE(STX);\r
+\r
+            /* Delay long enough for the PA_PD signal to indicate a\r
+             * successful transmit. This is the 250 XOSC periods\r
+             * (9.6 us for a 26 MHz crystal).\r
+             * Found out that we need a delay of atleast 25 us on CC1100 to see\r
+             * the PA_PD signal change. Hence keeping the same for CC430\r
+             */\r
+            Mrfi_DelayUsec(25);\r
+\r
+\r
+            /* PA_PD signal goes from HIGH to LOW when going from RX to TX state.\r
+             * This transition is trapped as a falling edge interrupt flag\r
+             * to indicate that CCA passed and the transmit has started.\r
+             */\r
+            if (MRFI_PAPD_INT_FLAG_IS_SET())\r
+            {\r
+                /* ------------------------------------------------------------------\r
+                 *    Clear Channel Assessment passed.\r
+                 *   ----------------------------------\r
+                 */\r
+\r
+                /* Clear the PA_PD int flag */\r
+                MRFI_CLEAR_PAPD_PIN_INT_FLAG();\r
+\r
+                /* PA_PD signal stays LOW while in TX state and goes back to HIGH when\r
+                 * the radio transitions to RX state.\r
+                 */\r
+                /* wait for transmit to complete */\r
+                while (!MRFI_PAPD_PIN_IS_HIGH()) ;\r
+\r
+                /* transmit done, break */\r
+                break;\r
+            }\r
+            else\r
+            {\r
+                /* ------------------------------------------------------------------\r
+                 *    Clear Channel Assessment failed.\r
+                 *   ----------------------------------\r
+                 */\r
+\r
+                /* Turn off radio and save some power during backoff */\r
+\r
+                /* NOTE: Can't use Mrfi_RxModeOff() - since it tries to update the\r
+                 * sync signal status which we are not using during the TX operation.\r
+                 */\r
+                MRFI_STROBE_IDLE_AND_WAIT();\r
+\r
+                /* flush the receive FIFO of any residual data */\r
+                MRFI_STROBE(SFRX);\r
+\r
+                /* Retry ? */\r
+                if (ccaRetries != 0)\r
+                {\r
+                    /* delay for a random number of backoffs */\r
+                    Mrfi_RandomBackoffDelay();\r
+\r
+                    /* decrement CCA retries before loop continues */\r
+                    ccaRetries--;\r
+                }\r
+                else /* No CCA retries are left, abort */\r
+                {\r
+                    /* set return value for failed transmit and break */\r
+                    returnValue = MRFI_TX_RESULT_FAILED;\r
+                    break;\r
+                }\r
+            }        /* CCA Failed */\r
+        }            /* CCA loop */\r
+    }                /* txType is CCA */\r
+\r
+\r
+    /* Done with TX. Clean up time... */\r
+\r
+    /* Radio is already in IDLE state */\r
+\r
+    /*\r
+     * Flush the transmit FIFO.  It must be flushed so that\r
+     * the next transmit can start with a clean slate.\r
+     */\r
+    MRFI_STROBE(SFTX);\r
+\r
+    /* If the radio was in RX state when transmit was attempted,\r
+     * put it back to Rx On state.\r
+     */\r
+    if (mrfiRadioState == MRFI_RADIO_STATE_RX)\r
+    {\r
+        Mrfi_RxModeOn();\r
+    }\r
+\r
+    return (returnValue);\r
+}\r
+\r
+/**************************************************************************************************\r
+ * @fn          MRFI_Receive\r
+ *\r
+ * @brief       Copies last packet received to the location specified.\r
+ *              This function is meant to be called after the ISR informs\r
+ *              higher level code that there is a newly received packet.\r
+ *\r
+ * @param       pPacket - pointer to location of where to copy received packet\r
+ *\r
+ * @return      none\r
+ **************************************************************************************************\r
+ */\r
+\r
+void MRFI_Receive(mrfiPacket_t * pPacket)\r
+{\r
+    *pPacket = mrfiIncomingPacket;\r
+}\r
+\r
+/**************************************************************************************************\r
+ * @fn          Mrfi_SyncPinRxIsr\r
+ *\r
+ * @brief       This interrupt is called when the SYNC signal transition from high to low.\r
+ *              The sync signal is routed to the sync pin which is a GPIO pin.  This high-to-low\r
+ *              transition signifies a receive has completed.  The SYNC signal also goes from\r
+ *              high to low when a transmit completes.   This is protected against within the\r
+ *              transmit function by disabling sync pin interrupts until transmit completes.\r
+ *\r
+ * @param       none\r
+ *\r
+ * @return      none\r
+ **************************************************************************************************\r
+ */\r
+\r
+static void Mrfi_SyncPinRxIsr(void)\r
+{\r
+    uint8_t frameLen = 0x00;\r
+    uint8_t rxBytes;\r
+\r
+    /* We should receive this interrupt only in RX state\r
+     * Should never receive it if RX was turned On only for\r
+     * some internal mrfi processing like - during CCA.\r
+     * Otherwise something is terribly wrong.\r
+     */\r
+    MRFI_ASSERT(mrfiRadioState == MRFI_RADIO_STATE_RX);\r
+\r
+    /* ------------------------------------------------------------------\r
+     *    Get RXBYTES\r
+     *   -------------\r
+     */\r
+\r
+    /*\r
+     *  Read the RXBYTES register from the radio.\r
+     *  Bit description of RXBYTES register:\r
+     *    bit 7     - RXFIFO_OVERFLOW, set if receive overflow occurred\r
+     *    bits 6:0  - NUM_BYTES, number of bytes in receive FIFO\r
+     *\r
+     *  Due a chip bug, the RXBYTES register must read the same value twice\r
+     *  in a row to guarantee an accurate value.\r
+     */\r
+    {\r
+        uint8_t rxBytesVerify;\r
+\r
+        rxBytesVerify = MRFI_RADIO_REG_READ(RXBYTES);\r
+\r
+        do\r
+        {\r
+            rxBytes = rxBytesVerify;\r
+            rxBytesVerify = MRFI_RADIO_REG_READ(RXBYTES);\r
+        }\r
+        while (rxBytes != rxBytesVerify);\r
+    }\r
+\r
+\r
+    /* ------------------------------------------------------------------\r
+     *    FIFO empty?\r
+     *   -------------\r
+     */\r
+\r
+    /*\r
+     *  See if the receive FIFIO is empty before attempting to read from it.\r
+     *  It is possible nothing the FIFO is empty even though the interrupt fired.\r
+     *  This can happen if address check is enabled and a non-matching packet is\r
+     *  received.  In that case, the radio automatically removes the packet from\r
+     *  the FIFO.\r
+     */\r
+    if (rxBytes == 0)\r
+    {\r
+        /* receive FIFO is empty - do nothing, skip to end */\r
+    }\r
+    else\r
+    {\r
+        /* receive FIFO is not empty, continue processing */\r
+\r
+        /* ------------------------------------------------------------------\r
+         *    Process frame length\r
+         *   ----------------------\r
+         */\r
+\r
+        /* read the first byte from FIFO - the packet length */\r
+        MRFI_RADIO_READ_RX_FIFO(&frameLen, MRFI_LENGTH_FIELD_SIZE);\r
+\r
+\r
+        /*\r
+         *  Make sure that the frame length just read corresponds to number of bytes in the buffer.\r
+         *  If these do not match up something is wrong.\r
+         *\r
+         *  This can happen for several reasons:\r
+         *   1) Incoming packet has an incorrect format or is corrupted.\r
+         *   2) The receive FIFO overflowed.  Overflow is indicated by the high\r
+         *      bit of rxBytes.  This guarantees the value of rxBytes value will not\r
+         *      match the number of bytes in the FIFO for overflow condition.\r
+         *   3) Interrupts were blocked for an abnormally long time which\r
+         *      allowed a following packet to at least start filling the\r
+         *      receive FIFO.  In this case, all received and partially received\r
+         *      packets will be lost - the packet in the FIFO and the packet coming in.\r
+         *      This is the price the user pays if they implement a giant\r
+         *      critical section.\r
+         *   4) A failed transmit forced radio to IDLE state to flush the transmit FIFO.\r
+         *      This could cause an active receive to be cut short.\r
+         *\r
+         *  Also check the sanity of the length to guard against rogue frames.\r
+         */\r
+        if ((rxBytes != (frameLen + MRFI_LENGTH_FIELD_SIZE + MRFI_RX_METRICS_SIZE))           ||\r
+            ((frameLen + MRFI_LENGTH_FIELD_SIZE) > MRFI_MAX_FRAME_SIZE) ||\r
+            (frameLen < MRFI_MIN_SMPL_FRAME_SIZE)\r
+            )\r
+        {\r
+            bspIState_t s;\r
+            noFrame++;\r
+\r
+            /* mismatch between bytes-in-FIFO and frame length */\r
+\r
+            /*\r
+             *  Flush receive FIFO to reset receive.  Must go to IDLE state to do this.\r
+             *  The critical section guarantees a transmit does not occur while cleaning up.\r
+             */\r
+            BSP_ENTER_CRITICAL_SECTION(s);\r
+            MRFI_STROBE_IDLE_AND_WAIT();\r
+            MRFI_STROBE(SFRX);\r
+            MRFI_STROBE(SRX);\r
+            BSP_EXIT_CRITICAL_SECTION(s);\r
+\r
+            /* flush complete, skip to end */\r
+        }\r
+        else\r
+        {\r
+            /* bytes-in-FIFO and frame length match up - continue processing */\r
+\r
+            /* ------------------------------------------------------------------\r
+             *    Get packet\r
+             *   ------------\r
+             */\r
+\r
+            /* clean out buffer to help protect against spurious frames */\r
+            memset(mrfiIncomingPacket.frame, 0x00, sizeof(mrfiIncomingPacket.frame));\r
+\r
+            /* set length field */\r
+            mrfiIncomingPacket.frame[MRFI_LENGTH_FIELD_OFS] = frameLen;\r
+\r
+            /* get packet from FIFO */\r
+            MRFI_RADIO_READ_RX_FIFO(&(mrfiIncomingPacket.frame[MRFI_FRAME_BODY_OFS]), frameLen);\r
+\r
+            /* get receive metrics from FIFO */\r
+            MRFI_RADIO_READ_RX_FIFO(&(mrfiIncomingPacket.rxMetrics[0]), MRFI_RX_METRICS_SIZE);\r
+\r
+\r
+            /* ------------------------------------------------------------------\r
+             *    CRC check\r
+             *   ------------\r
+             */\r
+\r
+            /*\r
+             *  Note!  Automatic CRC check is not, and must not, be enabled.  This feature\r
+             *  flushes the *entire* receive FIFO when CRC fails.  If this feature is\r
+             *  enabled it is possible to be reading from the FIFO and have a second\r
+             *  receive occur that fails CRC and automatically flushes the receive FIFO.\r
+             *  This could cause reads from an empty receive FIFO which puts the radio\r
+             *  into an undefined state.\r
+             */\r
+\r
+            /* determine if CRC failed */\r
+            if (!(mrfiIncomingPacket.rxMetrics[MRFI_RX_METRICS_CRC_LQI_OFS] &\r
+                  MRFI_RX_METRICS_CRC_OK_MASK))\r
+            {\r
+                /* CRC failed - do nothing, skip to end */\r
+                crcFail++;\r
+            }\r
+            else\r
+            {\r
+                /* CRC passed - continue processing */\r
+                crcPass++;\r
+\r
+                /* ------------------------------------------------------------------\r
+                 *    Filtering\r
+                 *   -----------\r
+                 */\r
+\r
+                /* if address is not filtered, receive is successful */\r
+                if (!Mrfi_RxAddrIsFiltered(MRFI_P_DST_ADDR(&mrfiIncomingPacket)))\r
+                {\r
+                    {\r
+                        /* ------------------------------------------------------------------\r
+                         *    Receive successful\r
+                         *   --------------------\r
+                         */\r
+\r
+                        /* Convert the raw RSSI value and do offset compensation for this radio */\r
+                        mrfiIncomingPacket.rxMetrics[MRFI_RX_METRICS_RSSI_OFS] =\r
+                            Mrfi_CalculateRssi(mrfiIncomingPacket.rxMetrics[\r
+                                                   MRFI_RX_METRICS_RSSI_OFS]);\r
+\r
+                        /* Remove the CRC valid bit from the LQI byte */\r
+                        mrfiIncomingPacket.rxMetrics[MRFI_RX_METRICS_CRC_LQI_OFS] =\r
+                            (mrfiIncomingPacket.rxMetrics[MRFI_RX_METRICS_CRC_LQI_OFS] &\r
+                             MRFI_RX_METRICS_LQI_MASK);\r
+\r
+\r
+                        /* call external, higher level "receive complete" processing routine */\r
+                        MRFI_RxCompleteISR();\r
+                    }\r
+                }\r
+            }\r
+        }\r
+    }\r
+\r
+    /* ------------------------------------------------------------------\r
+     *    End of function\r
+     *   -------------------\r
+     */\r
+\r
+}\r
+\r
+/**************************************************************************************************\r
+ * @fn          Mrfi_RxModeOn\r
+ *\r
+ * @brief       Put radio into receive mode.\r
+ *\r
+ * @param       none\r
+ *\r
+ * @return      none\r
+ **************************************************************************************************\r
+ */\r
+\r
+static void Mrfi_RxModeOn(void)\r
+{\r
+    /* clear any residual receive interrupt */\r
+    MRFI_CLEAR_SYNC_PIN_INT_FLAG();\r
+\r
+    /* send strobe to enter receive mode */\r
+    MRFI_STROBE(SRX);\r
+\r
+    /* enable receive interrupts */\r
+    MRFI_ENABLE_SYNC_PIN_INT();\r
+}\r
+\r
+/**************************************************************************************************\r
+ * @fn          MRFI_RxOn\r
+ *\r
+ * @brief       Turn on the receiver.  No harm is done if this function is called when\r
+ *              receiver is already on.\r
+ *\r
+ * @param       none\r
+ *\r
+ * @return      none\r
+ **************************************************************************************************\r
+ */\r
+\r
+void MRFI_RxOn(void)\r
+{\r
+    /* radio must be awake before we can move it to RX state */\r
+    MRFI_ASSERT(mrfiRadioState != MRFI_RADIO_STATE_OFF);\r
+\r
+    /* if radio is off, turn it on */\r
+    if (mrfiRadioState != MRFI_RADIO_STATE_RX)\r
+    {\r
+        mrfiRadioState = MRFI_RADIO_STATE_RX;\r
+        Mrfi_RxModeOn();\r
+    }\r
+}\r
+\r
+/**************************************************************************************************\r
+ * @fn          Mrfi_RxModeOff\r
+ *\r
+ * @brief       -\r
+ *\r
+ * @param       none\r
+ *\r
+ * @return      none\r
+ **************************************************************************************************\r
+ */\r
+\r
+static void Mrfi_RxModeOff(void)\r
+{\r
+    /* disable receive interrupts */\r
+    MRFI_DISABLE_SYNC_PIN_INT();\r
+\r
+    /* turn off radio */\r
+    MRFI_STROBE_IDLE_AND_WAIT();\r
+\r
+    /* flush the receive FIFO of any residual data */\r
+    MRFI_STROBE(SFRX);\r
+\r
+    /* clear receive interrupt */\r
+    MRFI_CLEAR_SYNC_PIN_INT_FLAG();\r
+}\r
+\r
+/**************************************************************************************************\r
+ * @fn          MRFI_RxIdle\r
+ *\r
+ * @brief       Put radio in idle mode (receiver if off).  No harm is done this function is\r
+ *              called when radio is already idle.\r
+ *\r
+ * @param       none\r
+ *\r
+ * @return      none\r
+ **************************************************************************************************\r
+ */\r
+\r
+void MRFI_RxIdle(void)\r
+{\r
+    /* radio must be awake to move it to idle mode */\r
+    MRFI_ASSERT(mrfiRadioState != MRFI_RADIO_STATE_OFF);\r
+\r
+    /* if radio is on, turn it off */\r
+    if (mrfiRadioState == MRFI_RADIO_STATE_RX)\r
+    {\r
+        Mrfi_RxModeOff();\r
+        mrfiRadioState = MRFI_RADIO_STATE_IDLE;\r
+    }\r
+}\r
+\r
+/**************************************************************************************************\r
+ * @fn          MRFI_Sleep\r
+ *\r
+ * @brief       Request radio go to sleep.\r
+ *\r
+ * @param       none\r
+ *\r
+ * @return      none\r
+ **************************************************************************************************\r
+ */\r
+\r
+void MRFI_Sleep(void)\r
+{\r
+    bspIState_t s;\r
+\r
+    /* Critical section necessary for watertight testing and\r
+     * setting of state variables.\r
+     */\r
+    BSP_ENTER_CRITICAL_SECTION(s);\r
+\r
+    /* If radio is not asleep, put it to sleep */\r
+    if (mrfiRadioState != MRFI_RADIO_STATE_OFF)\r
+    {\r
+        /* go to idle so radio is in a known state before sleeping */\r
+        MRFI_RxIdle();\r
+\r
+        /* Strobe Power Down (SPWD): puts the radio in SLEEP state. */\r
+\r
+        /* Chip bug: Radio does not come out of this SLEEP when put to sleep\r
+         * using the SPWD cmd. However, it does wakes up if SXOFF was used to\r
+         * put it to sleep.\r
+         */\r
+        MRFI_STROBE(SXOFF);\r
+\r
+        /* Our new state is OFF */\r
+        mrfiRadioState = MRFI_RADIO_STATE_OFF;\r
+    }\r
+\r
+    BSP_EXIT_CRITICAL_SECTION(s);\r
+}\r
+\r
+/**************************************************************************************************\r
+ * @fn          MRFI_WakeUp\r
+ *\r
+ * @brief       Wake up radio from sleep state.\r
+ *\r
+ * @param       none\r
+ *\r
+ * @return      none\r
+ **************************************************************************************************\r
+ */\r
+\r
+void MRFI_WakeUp(void)\r
+{\r
+    /* if radio is already awake, just ignore wakeup request */\r
+    if (mrfiRadioState != MRFI_RADIO_STATE_OFF)\r
+    {\r
+        return;\r
+    }\r
+\r
+    MRFI_STROBE_IDLE_AND_WAIT();\r
+\r
+    /* enter idle mode */\r
+    mrfiRadioState = MRFI_RADIO_STATE_IDLE;\r
+}\r
+\r
+/**************************************************************************************************\r
+ * @fn          MRFI_RadioIsr\r
+ *\r
+ * @brief       Radio Interface interrupts as well as Radio interrupts are\r
+ *              mapped to this interrupt vector.\r
+ *\r
+ * @param       -\r
+ *\r
+ * @return      -\r
+ **************************************************************************************************\r
+ */\r
+// [BM] Changed because CC1101_VECTOR ISR is declared of source code and this handler is called\r
+// indirect\r
+//BSP_ISR_FUNCTION( MRFI_RadioIsr, CC1101_VECTOR )\r
+void MRFI_RadioIsr(void)\r
+{\r
+    uint16_t coreIntSource = RF1AIV;          /* Radio Core      interrupt register */\r
+    uint16_t interfaceIntSource = RF1AIFIV;   /* Radio Interface interrupt register */\r
+\r
+    /* Interface interrupt */\r
+    if (interfaceIntSource)\r
+    {\r
+        if (interfaceIntSource == RF1AIFIV_RFERRIFG)\r
+        {\r
+            uint16_t interfaceError = RF1AIFERRV;\r
+\r
+            if (interfaceError == RF1AIFERRV_LVERR)\r
+            {\r
+                /* Low core voltage error */\r
+            }\r
+            else if (interfaceError == RF1AIFERRV_OPERR)\r
+            {\r
+                /* Operand error */\r
+            }\r
+            else if (interfaceError == RF1AIFERRV_OUTERR)\r
+            {\r
+                /* output data not available error */\r
+            }\r
+            else if (interfaceError == RF1AIFERRV_OPOVERR)\r
+            {\r
+                /* Operand overwrite error */\r
+            }\r
+            else\r
+            {\r
+                /* Can't possibly happen. If interface error flag was set,\r
+                 * then one of the interface errors must be set.\r
+                 */\r
+                MRFI_FORCE_ASSERT();\r
+            }\r
+\r
+            /* Assert anyways. No error handling implemented. */\r
+            MRFI_FORCE_ASSERT();\r
+        }\r
+        else\r
+        {\r
+            /* Not expecting any other interface interrupts (data in/out, status/instr in, fifo\r
+             *rx/tx) */\r
+            MRFI_FORCE_ASSERT();\r
+        }\r
+    }\r
+\r
+    /* Radio Core interrupt */\r
+    if (coreIntSource)\r
+    {\r
+        /* Check for SYNC interrupt */\r
+        if (coreIntSource == RF1AIV_RFIFG9)\r
+        {\r
+            if (MRFI_SYNC_PIN_INT_IS_ENABLED())\r
+            {\r
+                /*  clear the sync pin interrupt, run sync pin ISR */\r
+\r
+                /*\r
+                 *  NOTE!  The following macro clears the interrupt flag but it also *must*\r
+                 *  reset the interrupt capture.  In other words, if a second interrupt\r
+                 *  occurs after the flag is cleared it must be processed, i.e. this interrupt\r
+                 *  exits then immediately starts again.  Most microcontrollers handle this\r
+                 *  naturally but it must be verified for every target.\r
+                 */\r
+                MRFI_CLEAR_SYNC_PIN_INT_FLAG();\r
+\r
+                Mrfi_SyncPinRxIsr();\r
+            }\r
+            else\r
+            {\r
+                /* Fatal error. SYNC interrupt is not supposed to happen at this time. */\r
+                MRFI_FORCE_ASSERT();\r
+            }\r
+        }\r
+        else\r
+        {\r
+            /* Fatal error. No other Radio interurpt is enabled. */\r
+            MRFI_FORCE_ASSERT();\r
+        }\r
+    }\r
+}\r
+\r
+/**************************************************************************************************\r
+ * @fn          MRFI_Rssi\r
+ *\r
+ * @brief       Returns "live" RSSI value\r
+ *\r
+ * @param       none\r
+ *\r
+ * @return      RSSI value in units of dBm.\r
+ **************************************************************************************************\r
+ */\r
+\r
+int8_t MRFI_Rssi(void)\r
+{\r
+    uint8_t regValue;\r
+\r
+    /* Radio must be in RX state to measure rssi. */\r
+    MRFI_ASSERT(mrfiRadioState == MRFI_RADIO_STATE_RX);\r
+\r
+    /* Wait for the RSSI to be valid:\r
+     * Just having the Radio ON is not enough to read\r
+     * the correct RSSI value. The Radio must in RX mode for\r
+     * a certain duration. This duration depends on\r
+     * the baud rate and the received signal strength itself.\r
+     */\r
+    MRFI_RSSI_VALID_WAIT();\r
+\r
+    /* Read the RSSI value */\r
+    regValue = MRFI_RADIO_REG_READ(RSSI);\r
+\r
+    /* convert and do offset compensation */\r
+    return (Mrfi_CalculateRssi(regValue));\r
+}\r
+\r
+/**************************************************************************************************\r
+ * @fn          Mrfi_CalculateRssi\r
+ *\r
+ * @brief       Does binary to decimal conversion and offset compensation.\r
+ *\r
+ * @param       none\r
+ *\r
+ * @return      RSSI value in units of dBm.\r
+ **************************************************************************************************\r
+ */\r
+\r
+int8_t Mrfi_CalculateRssi(uint8_t rawValue)\r
+{\r
+    int16_t rssi;\r
+\r
+    /* The raw value is in 2's complement and in half db steps. Convert it to\r
+     * decimal taking into account the offset value.\r
+     */\r
+    if (rawValue >= 128)\r
+    {\r
+        rssi = (int16_t)(rawValue - 256) / 2 - MRFI_RSSI_OFFSET;\r
+    }\r
+    else\r
+    {\r
+        rssi = (rawValue / 2) - MRFI_RSSI_OFFSET;\r
+    }\r
+\r
+    /* Restrict this value to least value can be held in an 8 bit signed int */\r
+    if (rssi < -128)\r
+    {\r
+        rssi = -128;\r
+    }\r
+\r
+    return rssi;\r
+}\r
+\r
+/**************************************************************************************************\r
+ * @fn          MRFI_RandomByte\r
+ *\r
+ * @brief       Returns a random byte. This is a pseudo-random number generator.\r
+ *              The generated sequence will repeat every 256 values.\r
+ *              The sequence itself depends on the initial seed value.\r
+ *\r
+ * @param       none\r
+ *\r
+ * @return      a random byte\r
+ **************************************************************************************************\r
+ */\r
+\r
+uint8_t MRFI_RandomByte(void)\r
+{\r
+    mrfiRndSeed = (mrfiRndSeed * MRFI_RANDOM_MULTIPLIER) + MRFI_RANDOM_OFFSET;\r
+\r
+    return mrfiRndSeed;\r
+}\r
+\r
+/**************************************************************************************************\r
+ * @fn          Mrfi_RandomBackoffDelay\r
+ *\r
+ * @brief       -\r
+ *\r
+ * @param       none\r
+ *\r
+ * @return      none\r
+ **************************************************************************************************\r
+ */\r
+\r
+static void Mrfi_RandomBackoffDelay(void)\r
+{\r
+    uint8_t backoffs;\r
+    uint8_t i;\r
+\r
+    /* calculate random value for backoffs - 1 to 16 */\r
+    backoffs = (MRFI_RandomByte() & 0x0F) + 1;\r
+\r
+    /* delay for randomly computed number of backoff periods */\r
+    for (i = 0; i < backoffs; i++)\r
+    {\r
+        Mrfi_DelayUsec(sBackoffHelper);\r
+    }\r
+}\r
+\r
+/****************************************************************************************************\r
+ * @fn          Mrfi_DelayUsec\r
+ *\r
+ * @brief       Execute a delay loop using HW timer. The macro actually used to do the delay\r
+ *              is not thread-safe. This routine makes the delay execution thread-safe by breaking\r
+ *              up the requested delay up into small chunks and executing each chunk as a critical\r
+ *              section. The chunk size is choosen to be the smallest value used by MRFI. The delay\r
+ *              is only approximate because of the overhead computations. It errs on the side of\r
+ *              being too long.\r
+ *\r
+ * input parameters\r
+ * @param   howLong - number of microseconds to delay\r
+ *\r
+ * @return      none\r
+ ****************************************************************************************************\r
+ */\r
+\r
+static void Mrfi_DelayUsec(uint16_t howLong)\r
+{\r
+    bspIState_t s;\r
+    uint16_t count = howLong / MRFI_MAX_DELAY_US;\r
+\r
+    if (howLong)\r
+    {\r
+        do\r
+        {\r
+            BSP_ENTER_CRITICAL_SECTION(s);\r
+            BSP_DELAY_USECS(MRFI_MAX_DELAY_US);\r
+            BSP_EXIT_CRITICAL_SECTION(s);\r
+        } while (count--);\r
+    }\r
+\r
+    return;\r
+}\r
+\r
+/****************************************************************************************************\r
+ * @fn          Mrfi_DelayUsecSem\r
+ *\r
+ * @brief       Execute a delay loop using a HW timer. See comments for Mrfi_DelayUsec().\r
+ *              Delay specified number of microseconds checking semaphore for\r
+ *              early-out. Run in a separate thread when the reply delay is\r
+ *              invoked. Cleaner then trying to make MRFI_DelayUsec() thread-safe\r
+ *              and reentrant.\r
+ *\r
+ * input parameters\r
+ * @param   howLong - number of microseconds to delay\r
+ *\r
+ * @return      none\r
+ ****************************************************************************************************\r
+ */\r
+\r
+static void Mrfi_DelayUsecSem(uint16_t howLong)\r
+{\r
+    bspIState_t s;\r
+    uint16_t count = howLong / MRFI_MAX_DELAY_US;\r
+\r
+    if (howLong)\r
+    {\r
+        do\r
+        {\r
+            BSP_ENTER_CRITICAL_SECTION(s);\r
+            BSP_DELAY_USECS(MRFI_MAX_DELAY_US);\r
+            BSP_EXIT_CRITICAL_SECTION(s);\r
+            if (sKillSem)\r
+            {\r
+                break;\r
+            }\r
+        } while (count--);\r
+    }\r
+\r
+    return;\r
+}\r
+\r
+/**************************************************************************************************\r
+ * @fn          MRFI_DelayMs\r
+ *\r
+ * @brief       Delay the specified number of milliseconds.\r
+ *\r
+ * @param       milliseconds - delay time\r
+ *\r
+ * @return      none\r
+ **************************************************************************************************\r
+ */\r
+\r
+void MRFI_DelayMs(uint16_t milliseconds)\r
+{\r
+    while (milliseconds)\r
+    {\r
+        Mrfi_DelayUsec(APP_USEC_VALUE);\r
+        milliseconds--;\r
+    }\r
+}\r
+\r
+/**************************************************************************************************\r
+ * @fn          MRFI_ReplyDelay\r
+ *\r
+ * @brief       Delay number of milliseconds scaled by data rate. Check semaphore for\r
+ *              early-out. Run in a separate thread when the reply delay is\r
+ *              invoked. Cleaner then trying to make MRFI_DelayMs() thread-safe\r
+ *              and reentrant.\r
+ *\r
+ * @param       none\r
+ *\r
+ * @return      none\r
+ **************************************************************************************************\r
+ */\r
+\r
+void MRFI_ReplyDelay(void)\r
+{\r
+    bspIState_t s;\r
+    uint16_t milliseconds = sReplyDelayScalar;\r
+\r
+    BSP_ENTER_CRITICAL_SECTION(s);\r
+    sReplyDelayContext = 1;\r
+    BSP_EXIT_CRITICAL_SECTION(s);\r
+\r
+    while (milliseconds)\r
+    {\r
+        Mrfi_DelayUsecSem(APP_USEC_VALUE);\r
+        if (sKillSem)\r
+        {\r
+            break;\r
+        }\r
+        milliseconds--;\r
+    }\r
+\r
+    BSP_ENTER_CRITICAL_SECTION(s);\r
+    sKillSem           = 0;\r
+    sReplyDelayContext = 0;\r
+    BSP_EXIT_CRITICAL_SECTION(s);\r
+}\r
+\r
+/**************************************************************************************************\r
+ * @fn          MRFI_PostKillSem\r
+ *\r
+ * @brief       Post to the loop-kill semaphore that will be checked by the iteration loops\r
+ *              that control the delay thread.\r
+ *\r
+ * @param       none\r
+ *\r
+ * @return      none\r
+ **************************************************************************************************\r
+ */\r
+\r
+void MRFI_PostKillSem(void)\r
+{\r
+\r
+    if (sReplyDelayContext)\r
+    {\r
+        sKillSem = 1;\r
+    }\r
+\r
+    return;\r
+}\r
+\r
+/**************************************************************************************************\r
+ * @fn          MRFI_GetRadioState\r
+ *\r
+ * @brief       Returns the current radio state.\r
+ *\r
+ * @param       none\r
+ *\r
+ * @return      radio state - off/idle/rx\r
+ **************************************************************************************************\r
+ */\r
+\r
+uint8_t MRFI_GetRadioState(void)\r
+{\r
+    return mrfiRadioState;\r
+}\r
+\r
+/**************************************************************************************************\r
+ * @fn          MRFI_SetLogicalChannel\r
+ *\r
+ * @brief       Set logical channel.\r
+ *\r
+ * @param       chan - logical channel number\r
+ *\r
+ * @return      none\r
+ **************************************************************************************************\r
+ */\r
+\r
+void MRFI_SetLogicalChannel(uint8_t chan)\r
+{\r
+    /* logical channel is not valid? */\r
+    MRFI_ASSERT(chan < MRFI_NUM_LOGICAL_CHANS);\r
+\r
+    /* make sure radio is off before changing channels */\r
+    Mrfi_RxModeOff();\r
+\r
+    MRFI_RADIO_REG_WRITE(CHANNR, mrfiLogicalChanTable[chan]);\r
+\r
+    /* turn radio back on if it was on before channel change */\r
+    if (mrfiRadioState == MRFI_RADIO_STATE_RX)\r
+    {\r
+        Mrfi_RxModeOn();\r
+    }\r
+}\r
+\r
+/**************************************************************************************************\r
+ * @fn          MRFI_SetRFPwr\r
+ *\r
+ * @brief       Set ouput RF power level.\r
+ *\r
+ * @param       level - power level to be set\r
+ *\r
+ * @return      none\r
+ **************************************************************************************************\r
+ */\r
+\r
+void MRFI_SetRFPwr(uint8_t level)\r
+{\r
+    /* Power level is not valid? */\r
+    MRFI_ASSERT(level < MRFI_NUM_POWER_SETTINGS);\r
+\r
+    MRFI_RADIO_REG_WRITE(PATABLE, mrfiRFPowerTable[level]);\r
+\r
+    return;\r
+}\r
+\r
+/**************************************************************************************************\r
+ * @fn          MRFI_SetRxAddrFilter\r
+ *\r
+ * @brief       Set the address used for filtering received packets.\r
+ *\r
+ * @param       pAddr - pointer to address to use for filtering\r
+ *\r
+ * @return      zero     : successfully set filter address\r
+ *              non-zero : illegal address\r
+ **************************************************************************************************\r
+ */\r
+\r
+uint8_t MRFI_SetRxAddrFilter(uint8_t * pAddr)\r
+{\r
+    /*\r
+     *  If first byte of filter address match fir byte of broadcast address,\r
+     *  there is a conflict with hardware filtering.\r
+     */\r
+    if (pAddr[0] == mrfiBroadcastAddr[0])\r
+    {\r
+        /* unable to set filter address */\r
+        return (1);\r
+    }\r
+\r
+    /*\r
+     *  Set the hardware address register.  The hardware address filtering only recognizes\r
+     *  a single byte but this does provide at least some automatic hardware filtering.\r
+     */\r
+    MRFI_RADIO_REG_WRITE(ADDR, pAddr[0]);\r
+\r
+    /* save a copy of the filter address */\r
+    {\r
+        uint8_t i;\r
+\r
+        for (i = 0; i < MRFI_ADDR_SIZE; i++)\r
+        {\r
+            mrfiRxFilterAddr[i] = pAddr[i];\r
+        }\r
+    }\r
+\r
+    /* successfully set filter address */\r
+    return (0);\r
+}\r
+\r
+/**************************************************************************************************\r
+ * @fn          MRFI_EnableRxAddrFilter\r
+ *\r
+ * @brief       Enable received packet filtering.\r
+ *\r
+ * @param       none\r
+ *\r
+ * @return      none\r
+ **************************************************************************************************\r
+ */\r
+\r
+void MRFI_EnableRxAddrFilter(void)\r
+{\r
+    MRFI_ASSERT(mrfiRxFilterAddr[0] != mrfiBroadcastAddr[0]); /* filter address must be set before\r
+                                                               *enabling filter */\r
+\r
+    /* set flag to indicate filtering is enabled */\r
+    mrfiRxFilterEnabled = 1;\r
+\r
+    /* enable hardware filtering on the radio */\r
+    MRFI_RADIO_REG_WRITE(PKTCTRL1, PKTCTRL1_ADDR_FILTER_ON);\r
+}\r
+\r
+/**************************************************************************************************\r
+ * @fn          MRFI_DisableRxAddrFilter\r
+ *\r
+ * @brief       Disable received packet filtering.\r
+ *\r
+ * @param       pAddr - pointer to address to test for filtering\r
+ *\r
+ * @return      none\r
+ **************************************************************************************************\r
+ */\r
+\r
+void MRFI_DisableRxAddrFilter(void)\r
+{\r
+    /* clear flag that indicates filtering is enabled */\r
+    mrfiRxFilterEnabled = 0;\r
+\r
+    /* disable hardware filtering on the radio */\r
+    MRFI_RADIO_REG_WRITE(PKTCTRL1, PKTCTRL1_ADDR_FILTER_OFF);\r
+}\r
+\r
+/**************************************************************************************************\r
+ * @fn          Mrfi_RxAddrIsFiltered\r
+ *\r
+ * @brief       Determine if address is filtered.\r
+ *\r
+ * @param       none\r
+ *\r
+ * @return      zero     : address is not filtered\r
+ *              non-zero : address is filtered\r
+ **************************************************************************************************\r
+ */\r
+\r
+uint8_t Mrfi_RxAddrIsFiltered(uint8_t * pAddr)\r
+{\r
+    uint8_t i;\r
+    uint8_t addrByte;\r
+    uint8_t filterAddrMatches;\r
+    uint8_t broadcastAddrMatches;\r
+\r
+    /* first check to see if filtering is even enabled */\r
+    if (!mrfiRxFilterEnabled)\r
+    {\r
+        /*\r
+         *  Filtering is not enabled, so by definition the address is\r
+         *  not filtered.  Return zero to indicate address is not filtered.\r
+         */\r
+        return (0);\r
+    }\r
+\r
+    /* clear address byte match counts */\r
+    filterAddrMatches    = 0;\r
+    broadcastAddrMatches = 0;\r
+\r
+    /* loop through address to see if there is a match to filter address of broadcast address */\r
+    for (i = 0; i < MRFI_ADDR_SIZE; i++)\r
+    {\r
+        /* get byte from address to check */\r
+        addrByte = pAddr[i];\r
+\r
+        /* compare byte to filter address byte */\r
+        if (addrByte == mrfiRxFilterAddr[i])\r
+        {\r
+            filterAddrMatches++;\r
+        }\r
+        if (addrByte == mrfiBroadcastAddr[i])\r
+        {\r
+            broadcastAddrMatches++;\r
+        }\r
+    }\r
+\r
+    /*\r
+     *  If address is *not* filtered, either the "filter address match count" or\r
+     *  the "broadcast address match count" will equal the total number of bytes\r
+     *  in the address.\r
+     */\r
+    if ((broadcastAddrMatches == MRFI_ADDR_SIZE) || (filterAddrMatches == MRFI_ADDR_SIZE))\r
+    {\r
+        /* address *not* filtered, return zero */\r
+        return (0);\r
+    }\r
+    else\r
+    {\r
+        /* address filtered, return non-zero */\r
+        return (1);\r
+    }\r
+}\r
+\r
+/**************************************************************************************************\r
+ *                                  Compile Time Integrity Checks\r
+ **************************************************************************************************\r
+ */\r
+\r
+/* calculate maximum value for PKTLEN and verify it directly */\r
+#define MRFI_RADIO_TX_FIFO_SIZE     64  /* from datasheet */\r
+#define MRFI_RADIO_MAX_PKTLEN       (MRFI_RADIO_TX_FIFO_SIZE - MRFI_LENGTH_FIELD_SIZE - \\r
+                                     MRFI_RX_METRICS_SIZE)\r
+#if (MRFI_RADIO_MAX_PKTLEN != 61)\r
+#    error "ERROR:  The maximum value for PKTLEN is not correct."\r
+#endif\r
+\r
+/* verify setting for PKTLEN does not exceed maximum */\r
+#if (MRFI_SETTING_PKTLEN > MRFI_RADIO_MAX_PKTLEN)\r
+#    error \\r
+    "ERROR:  Maximum possible value for PKTLEN exceeded.  Decrease value of maximum payload."\r
+#endif\r
+\r
+/* verify largest possible packet fits within FIFO buffer */\r
+#if ((MRFI_MAX_FRAME_SIZE + MRFI_RX_METRICS_SIZE) > MRFI_RADIO_TX_FIFO_SIZE)\r
+#    error \\r
+    "ERROR:  Maximum possible packet length exceeds FIFO buffer.  Decrease value of maximum payload."\r
+#endif\r
+\r
+/* verify that the SmartRF file supplied is compatible */\r
+#if ((!defined SMARTRF_RADIO_CC430))\r
+#    error "ERROR:  The SmartRF export file is not compatible."\r
+#endif\r
+\r
+/*\r
+ *  These asserts happen if there is extraneous compiler padding of arrays.\r
+ *  Modify compiler settings for no padding, or, if that is not possible,\r
+ *  comment out the offending asserts.\r
+ */\r
+BSP_STATIC_ASSERT(sizeof(mrfiRadioCfg) ==\r
+                  ((sizeof(mrfiRadioCfg) / sizeof(mrfiRadioCfg[0])) * sizeof(mrfiRadioCfg[0])));\r
+\r
+\r
+/*\r
+ *  These asserts happen if there is extraneous compiler padding of arrays.\r
+ *  Modify compiler settings for no padding, or, if that is not possible,\r
+ *  comment out the offending asserts.\r
+ */\r
+BSP_STATIC_ASSERT(sizeof(mrfiLogicalChanTable) ==\r
+                  ((sizeof(mrfiLogicalChanTable) /\r
+                    sizeof(mrfiLogicalChanTable[0])) * sizeof(mrfiLogicalChanTable[0])));\r
+BSP_STATIC_ASSERT(sizeof(mrfiBroadcastAddr) ==\r
+                  ((sizeof(mrfiBroadcastAddr) /\r
+                    sizeof(mrfiBroadcastAddr[0])) * sizeof(mrfiBroadcastAddr[0])));\r
+\r
+/**************************************************************************************************\r
+ */\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/simpliciti/Components/mrfi/radios/family5/mrfi_radio_interface.c b/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/simpliciti/Components/mrfi/radios/family5/mrfi_radio_interface.c
new file mode 100755 (executable)
index 0000000..a8a85f6
--- /dev/null
@@ -0,0 +1,373 @@
+/**************************************************************************************************\r
+*  Revised:        $Date: 2009-11-23 07:50:43 -0800 (Mon, 23 Nov 2009) $\r
+*  Revision:       $Revision: 21225 $\r
+*\r
+*  Copyright 2008-2009 Texas Instruments Incorporated.  All rights reserved.\r
+*\r
+*  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+*  the terms of a software license agreement between the user who downloaded the software,\r
+*  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+*  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+*  License. The License limits your use, and you acknowledge, that the Software may not be\r
+*  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+*  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+*  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+*  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+*  perform, display or sell this Software and/or its documentation for any purpose.\r
+*\r
+*  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS?\r
+*  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+*  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+*  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+*  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+*  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+*  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+*  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+*  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+*\r
+*  Should you have any questions regarding your right to use this Software,\r
+*  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+/* ~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=\r
+ *   MRFI (Minimal RF Interface)\r
+ *   Radios: CC430\r
+ *   Radio Interface (RIF) code.\r
+ * ~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=\r
+ */\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                          Includes\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#include "mrfi_radio_interface.h"\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                            Defines\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                            Macros\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#define MRFI_RADIO_STATUS_READ_CLEAR()  RF1AIFCTL1 &= ~(RFSTATIFG);\r
+\r
+#define MRFI_RADIO_STATUS_READ_WAIT()  while (!(RF1AIFCTL1 & RFSTATIFG)) ;\r
+#define MRFI_RADIO_INST_WRITE_WAIT()   while (!(RF1AIFCTL1 & RFINSTRIFG)) ;\r
+#define MRFI_RADIO_DATA_WRITE_WAIT()   while (!(RF1AIFCTL1 & RFDINIFG)) ;\r
+#define MRFI_RADIO_DATA_READ_WAIT()    while (!(RF1AIFCTL1 & RFDOUTIFG)) ;\r
+\r
+#define MRFI_RIF_DEBUG\r
+#ifdef MRFI_RIF_DEBUG\r
+#    define MRFI_RIF_ASSERT(x)      BSP_ASSERT(x)\r
+#else\r
+#    define MRFI_RIF_ASSERT(x)\r
+#endif\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                       Local Prototypes\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+\r
+\r
+/**************************************************************************************************\r
+ * @fn          mrfiRadioInterfaceInit\r
+ *\r
+ * @brief       Initialize the Radio Interface\r
+ *\r
+ * @param       none\r
+ *\r
+ * @return      none\r
+ **************************************************************************************************\r
+ */\r
+\r
+void mrfiRadioInterfaceInit(void)\r
+{\r
+    /* Enable interrupt on interface error.\r
+     * The code behaves differently between different runs on the debugger, and seemingly fails\r
+     * due to error flags on the bench. The code does not fail, however, on functional tests.\r
+     * This points to problems with the debugger that need to be sorted through carefully.\r
+     * For the time being, remove the following line, since it will likely cause operational\r
+     * failures.\r
+     */\r
+    // RF1AIFCTL1 |= RFERRIE;\r
+}\r
+\r
+/**************************************************************************************************\r
+ * @fn          mrfiRadioInterfaceCmdStrobe\r
+ *\r
+ * @brief       Send command strobe to the radio.  Returns status byte read during transfer\r
+ *              of strobe command.\r
+ *\r
+ * @param       addr - address of register to strobe\r
+ *\r
+ * @return      status byte of radio\r
+ **************************************************************************************************\r
+ */\r
+\r
+uint8_t mrfiRadioInterfaceCmdStrobe(uint8_t addr)\r
+{\r
+    uint8_t statusByte, gdoState;\r
+    mrfiRIFIState_t s;\r
+\r
+    /* Check for invalid address.\r
+     * 0xBD is for SNOP with MSP set to read the bytes available in RX FIFO.\r
+     */\r
+    MRFI_RIF_ASSERT((addr == 0xBD) || (addr >= RF_SRES) && (addr <= RF_SNOP));\r
+\r
+    /* Lock out access to Radio IF */\r
+    MRFI_RIF_ENTER_CRITICAL_SECTION(s);\r
+\r
+    /* Clear the Status read flag */\r
+    MRFI_RADIO_STATUS_READ_CLEAR();\r
+\r
+    /* Wait for radio to be ready for next instruction */\r
+    MRFI_RADIO_INST_WRITE_WAIT();\r
+\r
+    if ((addr > RF_SRES) && (addr < RF_SNOP))\r
+    {\r
+        /* buffer IOCFG2 state */\r
+        gdoState = MRFI_RADIO_REG_READ(IOCFG2);\r
+\r
+        /* c-ready to GDO2 */\r
+        MRFI_RADIO_REG_WRITE(IOCFG2, 0x29);\r
+\r
+        RF1AINSTRB = addr;\r
+\r
+        /* chip at sleep mode */\r
+        if ((RF1AIN & 0x04) == 0x04)\r
+        {\r
+            if ((addr == RF_SXOFF) || (addr == RF_SPWD) || (addr == RF_SWOR))\r
+            {\r
+                /* Do nothing */\r
+            }\r
+            else\r
+            {\r
+                /* c-ready */\r
+                while ((RF1AIN & 0x04) == 0x04) ;\r
+\r
+                /* Delay should be 760us */\r
+                Mrfi_DelayUsec(760);\r
+            }\r
+        }\r
+\r
+        /* restore IOCFG2 setting */\r
+        MRFI_RADIO_REG_WRITE(IOCFG2, gdoState);\r
+    }\r
+    else\r
+    {\r
+        /* chip active mode */\r
+        RF1AINSTRB = addr;\r
+    }\r
+\r
+    /* Read status byte */\r
+    statusByte = RF1ASTAT0B;\r
+\r
+    /* Allow access to Radio IF */\r
+    MRFI_RIF_EXIT_CRITICAL_SECTION(s);\r
+\r
+    /* return the status byte */\r
+    return statusByte;\r
+}\r
+\r
+/**************************************************************************************************\r
+ * @fn          mrfiRadioInterfaceReadReg\r
+ *\r
+ * @brief       Read value from radio register.\r
+ *\r
+ * @param       addr - address of register\r
+ *\r
+ * @return      register value\r
+ **************************************************************************************************\r
+ */\r
+\r
+uint8_t mrfiRadioInterfaceReadReg(uint8_t addr)\r
+{\r
+    mrfiRIFIState_t s;\r
+    uint8_t regValue;\r
+\r
+    /* Check for valid range. 0x3E is for PATABLE access */\r
+    MRFI_RIF_ASSERT((addr <= 0x3B) || (addr == 0x3E));\r
+\r
+    /* Lock out access to Radio IF */\r
+    MRFI_RIF_ENTER_CRITICAL_SECTION(s);\r
+\r
+    /* Wait for radio to be ready for next instruction */\r
+    MRFI_RADIO_INST_WRITE_WAIT();\r
+\r
+    if ((addr <= 0x2E) || (addr == 0x3E))\r
+    {\r
+        /* Write cmd: read the Configuration register */\r
+        RF1AINSTR1B = (0x80 | addr);\r
+    }\r
+    else\r
+    {\r
+        /* Write cmd: read the Status register */\r
+        RF1AINSTR1B = (0xC0 | addr);\r
+    }\r
+\r
+    /* Read out the register value */\r
+    regValue   = RF1ADOUT1B; //auto read\r
+\r
+    /* Allow access to Radio IF */\r
+    MRFI_RIF_EXIT_CRITICAL_SECTION(s);\r
+\r
+    return (regValue);\r
+}\r
+\r
+/**************************************************************************************************\r
+ * @fn          mrfiRadioInterfaceWriteReg\r
+ *\r
+ * @brief       Write value to radio register.\r
+ *\r
+ * @param       addr  - address of register\r
+ * @param       value - register value to write\r
+ *\r
+ * @return      none\r
+ **************************************************************************************************\r
+ */\r
+\r
+void mrfiRadioInterfaceWriteReg(uint8_t addr, uint8_t value)\r
+{\r
+    mrfiRIFIState_t s;\r
+\r
+    /* Check for valid range. 0x3E is for PATABLE access */\r
+    MRFI_RIF_ASSERT((addr <= 0x2E) || (addr == 0x3E));\r
+\r
+    /* Lock out access to Radio IF */\r
+    MRFI_RIF_ENTER_CRITICAL_SECTION(s);\r
+\r
+    /* Wait for radio to be ready for next instruction */\r
+    MRFI_RADIO_INST_WRITE_WAIT();\r
+\r
+    /* Write cmd: 'write to register' */\r
+    RF1AINSTRB = (0x00 | addr);\r
+\r
+    /* Wait for radio to be ready to accept the data */\r
+    MRFI_RADIO_DATA_WRITE_WAIT();\r
+\r
+    /* Write the register value */\r
+    RF1ADINB   = value;        /* value to be written to the radio register */\r
+\r
+    /* Allow access to Radio IF */\r
+    MRFI_RIF_EXIT_CRITICAL_SECTION(s);\r
+}\r
+\r
+/**************************************************************************************************\r
+ * @fn          mrfiRadioInterfaceWriteTxFifo\r
+ *\r
+ * @brief       Write data to radio transmit FIFO.\r
+ *\r
+ * @param       pData - pointer for storing write data\r
+ * @param       len   - length of data in bytes\r
+ *\r
+ * @return      none\r
+ **************************************************************************************************\r
+ */\r
+\r
+void mrfiRadioInterfaceWriteTxFifo(uint8_t * pData, uint8_t len)\r
+{\r
+    mrfiRIFIState_t s;\r
+\r
+    MRFI_RIF_ASSERT(len != 0); /* zero length is not allowed */\r
+\r
+    /* Lock out access to Radio IF */\r
+    MRFI_RIF_ENTER_CRITICAL_SECTION(s);\r
+\r
+    /* Wait for radio to be ready for next instruction */\r
+    MRFI_RADIO_INST_WRITE_WAIT();\r
+\r
+    /* Write cmd: TXFIFOWR */\r
+    RF1AINSTRB = 0x7F;\r
+\r
+    do\r
+    {\r
+        /* Wait for radio to be ready to accept the data */\r
+        MRFI_RADIO_DATA_WRITE_WAIT();\r
+\r
+        /* Write one byte to FIFO */\r
+        RF1ADINB   = *pData;\r
+\r
+        pData++;\r
+        len--;\r
+\r
+    } while (len);\r
+\r
+    /* Allow access to Radio IF */\r
+    MRFI_RIF_EXIT_CRITICAL_SECTION(s);\r
+}\r
+\r
+/**************************************************************************************************\r
+ * @fn          mrfiRadioInterfaceReadRxFifo\r
+ *\r
+ * @brief       Read data from radio receive FIFO.\r
+ *\r
+ * @param       pData - pointer for storing read data\r
+ * @param       len   - length of data in bytes\r
+ *\r
+ * @return      none\r
+ **************************************************************************************************\r
+ */\r
+uint8_t method = 2;\r
+void mrfiRadioInterfaceReadRxFifo(uint8_t * pData, uint8_t len)\r
+{\r
+    mrfiRIFIState_t s;\r
+\r
+    MRFI_RIF_ASSERT(len != 0); /* zero length is not allowed */\r
+\r
+    /* Lock out access to Radio IF */\r
+    MRFI_RIF_ENTER_CRITICAL_SECTION(s);\r
+\r
+    if (method == 1)\r
+    {\r
+        /* Wait for radio to be ready for next instruction */\r
+        MRFI_RADIO_INST_WRITE_WAIT();\r
+\r
+        /* Write cmd: RXFIFORD */\r
+        RF1AINSTRB = 0xFF;\r
+\r
+        do\r
+        {\r
+            /* dummy write */\r
+            RF1ADINB = 0;\r
+\r
+            /* Wait for data to be available for reading */\r
+            MRFI_RADIO_DATA_READ_WAIT();\r
+\r
+            /* Read one byte from FIFO */\r
+            *pData = RF1ADOUT0B;\r
+\r
+            pData++;\r
+            len--;\r
+\r
+        } while (len);\r
+    }\r
+\r
+    if (method == 2)\r
+    {\r
+        do\r
+        {\r
+            /* Wait for radio to be ready for next instruction */\r
+            MRFI_RADIO_INST_WRITE_WAIT();\r
+\r
+            /* Write cmd: SNGLRXRD */\r
+            RF1AINSTR1B = 0xBF;\r
+\r
+            /* Read byte from FIFO */\r
+            *pData  = RF1ADOUT1B; //auto read register\r
+\r
+            pData++;\r
+            len--;\r
+\r
+        } while (len);\r
+    }\r
+\r
+    /* Allow access to Radio IF */\r
+    MRFI_RIF_EXIT_CRITICAL_SECTION(s);\r
+}\r
+\r
+/**************************************************************************************************\r
+ */\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/simpliciti/Components/mrfi/radios/family5/mrfi_radio_interface.h b/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/simpliciti/Components/mrfi/radios/family5/mrfi_radio_interface.h
new file mode 100755 (executable)
index 0000000..ae46724
--- /dev/null
@@ -0,0 +1,151 @@
+/**************************************************************************************************\r
+*  Revised:        $Date: 2007-07-06 11:19:00 -0700 (Fri, 06 Jul 2007) $\r
+*  Revision:       $Revision: 13579 $\r
+*\r
+*  Copyright 2007 Texas Instruments Incorporated.  All rights reserved.\r
+*\r
+*  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+*  the terms of a software license agreement between the user who downloaded the software,\r
+*  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+*  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+*  License. The License limits your use, and you acknowledge, that the Software may not be\r
+*  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+*  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+*  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+*  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+*  perform, display or sell this Software and/or its documentation for any purpose.\r
+*\r
+*  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+*  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+*  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+*  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+*  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+*  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+*  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+*  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+*  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+*\r
+*  Should you have any questions regarding your right to use this Software,\r
+*  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+/* ~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=\r
+ *   MRFI (Minimal RF Interface)\r
+ *   Radio interface code for CC430\r
+ * ~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=\r
+ */\r
+\r
+#ifndef MRFI_RADIO_INTERFACE_H\r
+#define MRFI_RADIO_INTERFACE_H\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                         Includes\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#include "bsp.h"\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                          Defines\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+\r
+/* configuration registers */\r
+#define IOCFG2      0x00      /*  IOCFG2   - GDO2 output pin configuration  */\r
+#define IOCFG1      0x01      /*  IOCFG1   - GDO1 output pin configuration  */\r
+#define IOCFG0      0x02      /*  IOCFG1   - GDO0 output pin configuration  */\r
+#define FIFOTHR     0x03      /*  FIFOTHR  - RX FIFO and TX FIFO thresholds */\r
+#define SYNC1       0x04      /*  SYNC1    - Sync word, high byte */\r
+#define SYNC0       0x05      /*  SYNC0    - Sync word, low byte */\r
+#define PKTLEN      0x06      /*  PKTLEN   - Packet length */\r
+#define PKTCTRL1    0x07      /*  PKTCTRL1 - Packet automation control */\r
+#define PKTCTRL0    0x08      /*  PKTCTRL0 - Packet automation control */\r
+#define ADDR        0x09      /*  ADDR     - Device address */\r
+#define CHANNR      0x0A      /*  CHANNR   - Channel number */\r
+#define FSCTRL1     0x0B      /*  FSCTRL1  - Frequency synthesizer control */\r
+#define FSCTRL0     0x0C      /*  FSCTRL0  - Frequency synthesizer control */\r
+#define FREQ2       0x0D      /*  FREQ2    - Frequency control word, high byte */\r
+#define FREQ1       0x0E      /*  FREQ1    - Frequency control word, middle byte */\r
+#define FREQ0       0x0F      /*  FREQ0    - Frequency control word, low byte */\r
+#define MDMCFG4     0x10      /*  MDMCFG4  - Modem configuration */\r
+#define MDMCFG3     0x11      /*  MDMCFG3  - Modem configuration */\r
+#define MDMCFG2     0x12      /*  MDMCFG2  - Modem configuration */\r
+#define MDMCFG1     0x13      /*  MDMCFG1  - Modem configuration */\r
+#define MDMCFG0     0x14      /*  MDMCFG0  - Modem configuration */\r
+#define DEVIATN     0x15      /*  DEVIATN  - Modem deviation setting */\r
+#define MCSM2       0x16      /*  MCSM2    - Main Radio Control State Machine configuration */\r
+#define MCSM1       0x17      /*  MCSM1    - Main Radio Control State Machine configuration */\r
+#define MCSM0       0x18      /*  MCSM0    - Main Radio Control State Machine configuration */\r
+#define FOCCFG      0x19      /*  FOCCFG   - Frequency Offset Compensation configuration */\r
+#define BSCFG       0x1A      /*  BSCFG    - Bit Synchronization configuration */\r
+#define AGCCTRL2    0x1B      /*  AGCCTRL2 - AGC control */\r
+#define AGCCTRL1    0x1C      /*  AGCCTRL1 - AGC control */\r
+#define AGCCTRL0    0x1D      /*  AGCCTRL0 - AGC control */\r
+#define WOREVT1     0x1E      /*  WOREVT1  - High byte Event0 timeout */\r
+#define WOREVT0     0x1F      /*  WOREVT0  - Low byte Event0 timeout */\r
+#define WORCTRL     0x20      /*  WORCTRL  - Wake On Radio control */\r
+#define FREND1      0x21      /*  FREND1   - Front end RX configuration */\r
+#define FREND0      0x22      /*  FREDN0   - Front end TX configuration */\r
+#define FSCAL3      0x23      /*  FSCAL3   - Frequency synthesizer calibration */\r
+#define FSCAL2      0x24      /*  FSCAL2   - Frequency synthesizer calibration */\r
+#define FSCAL1      0x25      /*  FSCAL1   - Frequency synthesizer calibration */\r
+#define FSCAL0      0x26      /*  FSCAL0   - Frequency synthesizer calibration */\r
+#define RCCTRL1     0x27      /*  RCCTRL1  - RC oscillator configuration */\r
+#define RCCTRL0     0x28      /*  RCCTRL0  - RC oscillator configuration */\r
+#define FSTEST      0x29      /*  FSTEST   - Frequency synthesizer calibration control */\r
+#define PTEST       0x2A      /*  PTEST    - Production test */\r
+#define AGCTEST     0x2B      /*  AGCTEST  - AGC test */\r
+#define TEST2       0x2C      /*  TEST2    - Various test settings */\r
+#define TEST1       0x2D      /*  TEST1    - Various test settings */\r
+#define TEST0       0x2E      /*  TEST0    - Various test settings */\r
+\r
+/* status registers */\r
+#define PARTNUM     0x30      /*  PARTNUM    - Chip ID */\r
+#define VERSION     0x31      /*  VERSION    - Chip ID */\r
+#define FREQEST     0x32      /*  FREQEST    \96 Frequency Offset Estimate from demodulator */\r
+#define LQI         0x33      /*  LQI        \96 Demodulator estimate for Link Quality */\r
+#define RSSI        0x34      /*  RSSI       \96 Received signal strength indication */\r
+#define MARCSTATE   0x35      /*  MARCSTATE  \96 Main Radio Control State Machine state */\r
+#define WORTIME1    0x36      /*  WORTIME1   \96 High byte of WOR time */\r
+#define WORTIME0    0x37      /*  WORTIME0   \96 Low byte of WOR time */\r
+#define PKTSTATUS   0x38      /*  PKTSTATUS  \96 Current GDOx status and packet status */\r
+#define VCO_VC_DAC  0x39      /*  VCO_VC_DAC \96 Current setting from PLL calibration module */\r
+#define TXBYTES     0x3A      /*  TXBYTES    \96 Underflow and number of bytes */\r
+#define RXBYTES     0x3B      /*  RXBYTES    \96 Overflow and number of bytes */\r
+\r
+/* burst write registers */\r
+#define PATABLE     0x3E      /*  PATABLE - PA control settings table */\r
+\r
+/* command strobe registers */\r
+#define SRES        0x30      /*  SRES    - Reset chip. */\r
+#define SFSTXON     0x31      /*  SFSTXON - Enable and calibrate frequency synthesizer. */\r
+#define SXOFF       0x32      /*  SXOFF   - Turn off crystal oscillator. */\r
+#define SCAL        0x33      /*  SCAL    - Calibrate frequency synthesizer and turn it off. */\r
+#define SRX         0x34      /*  SRX     - Enable RX. Perform calibration if enabled. */\r
+#define STX         0x35      /*  STX     - Enable TX. If in RX state, only enable TX if CCA passes.\r
+                               **/\r
+#define SIDLE       0x36      /*  SIDLE   - Exit RX / TX, turn off frequency synthesizer. */\r
+#define SRSVD       0x37      /*  SRVSD   - Reserved.  Do not use. */\r
+#define SWOR        0x38      /*  SWOR    - Start automatic RX polling sequence (Wake-on-Radio) */\r
+#define SPWD        0x39      /*  SPWD    - Enter power down mode when CSn goes high. */\r
+#define SFRX        0x3A      /*  SFRX    - Flush the RX FIFO buffer. */\r
+#define SFTX        0x3B      /*  SFTX    - Flush the TX FIFO buffer. */\r
+#define SWORRST     0x3C      /*  SWORRST - Reset real time clock. */\r
+#define SNOP        0x3D      /*  SNOP    - No operation. Returns status byte. */\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                         Prototypes\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+void mrfiRadioInterfaceInit(void);\r
+void mrfiRadioInterfaceWriteReg(uint8_t addr, uint8_t value);\r
+void mrfiRadioInterfaceWriteTxFifo(uint8_t * pWriteData, uint8_t len);\r
+void mrfiRadioInterfaceReadRxFifo(uint8_t * pReadData, uint8_t len);\r
+\r
+uint8_t mrfiRadioInterfaceCmdStrobe(uint8_t addr);\r
+uint8_t mrfiRadioInterfaceReadReg(uint8_t addr);\r
+\r
+/**************************************************************************************************\r
+ */\r
+#endif\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/simpliciti/Components/mrfi/smartrf/CC430/smartrf_CC430.h b/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/simpliciti/Components/mrfi/smartrf/CC430/smartrf_CC430.h
new file mode 100755 (executable)
index 0000000..e699f6c
--- /dev/null
@@ -0,0 +1,170 @@
+/***************************************************************\r
+*  SmartRF Studio(tm) Export\r
+*\r
+*  Radio register settings specifed with C-code\r
+*  compatible #define statements.\r
+*\r
+***************************************************************/\r
+\r
+#ifndef SMARTRF_CC430_H\r
+#define SMARTRF_CC430_H\r
+\r
+// [BM] Modified radio settings for 433MHz, 868MHz, 915MHz\r
+\r
+// ISM_LF configuration\r
+//\r
+// Chipcon\r
+// Product = CC1101\r
+// Chip version = A   (VERSION = 0x04)\r
+// Crystal accuracy = 10 ppm\r
+// X-tal frequency = 26 MHz\r
+// RF output power = 0 dBm\r
+// RX filterbandwidth = 232.142857 kHz\r
+// Deviation = 32 kHz\r
+// Datarate = 76.766968 kBaud\r
+// Modulation = (1) GFSK\r
+// Manchester enable = (0) Manchester disabled\r
+// RF Frequency = 433.92 MHz\r
+// Channel spacing = 199.951172 kHz\r
+// Channel number = 0\r
+// Optimization = -\r
+// Sync mode = (3) 30/32 sync word bits detected\r
+// Format of RX/TX data = (0) Normal mode, use FIFOs for RX and TX\r
+// CRC operation = (1) CRC calculation in TX and CRC check in RX enabled\r
+// Forward Error Correction = (0) FEC disabled\r
+// Length configuration = (1) Variable length packets, packet length configured by the first\r
+// received byte after sync word.\r
+// Packetlength = 255\r
+// Preamble count = (2)  4 bytes\r
+// Append status = 1\r
+// Address check = (0) No address check\r
+// FIFO autoflush = 0\r
+// Device address = 0\r
+// GDO0 signal selection = ( 6) Asserts when sync word has been sent / received, and de-asserts at\r
+// the end of the packet\r
+// GDO2 signal selection = (41) CHIP_RDY\r
+\r
+// ISM_EU configuration\r
+//\r
+// Chipcon\r
+// Product = CC1101\r
+// Chip version = A   (VERSION = 0x04)\r
+// Crystal accuracy = 10 ppm\r
+// X-tal frequency = 26 MHz\r
+// RF output power = 0 dBm\r
+// RX filterbandwidth = 232.142857 kHz\r
+// Deviation = 32 kHz\r
+// Datarate = 76.766968 kBaud\r
+// Modulation = (1) GFSK\r
+// Manchester enable = (0) Manchester disabled\r
+// RF Frequency = 869.524963 MHz\r
+// Channel spacing = 199.951172 kHz\r
+// Channel number = 0\r
+// Optimization = -\r
+// Sync mode = (3) 30/32 sync word bits detected\r
+// Format of RX/TX data = (0) Normal mode, use FIFOs for RX and TX\r
+// CRC operation = (1) CRC calculation in TX and CRC check in RX enabled\r
+// Forward Error Correction = (0) FEC disabled\r
+// Length configuration = (1) Variable length packets, packet length configured by the first\r
+// received byte after sync word.\r
+// Packetlength = 255\r
+// Preamble count = (2)  4 bytes\r
+// Append status = 1\r
+// Address check = (0) No address check\r
+// FIFO autoflush = 0\r
+// Device address = 0\r
+// GDO0 signal selection = ( 6) Asserts when sync word has been sent / received, and de-asserts at\r
+// the end of the packet\r
+// GDO2 signal selection = (41) CHIP_RDY\r
+\r
+// ISM_US configuration\r
+//\r
+// Chipcon\r
+// Product = CC1101\r
+// Chip version = A   (VERSION = 0x04)\r
+// Crystal accuracy = 10 ppm\r
+// X-tal frequency = 26 MHz\r
+// RF output power = 0 dBm\r
+// RX filterbandwidth = 232.142857 kHz\r
+// Deviation = 32 kHz\r
+// Datarate = 76.766968 kBaud\r
+// Modulation = (1) GFSK\r
+// Manchester enable = (0) Manchester disabled\r
+// RF Frequency = 905.998993 MHz\r
+// Channel spacing = 199.951172 kHz\r
+// Channel number = 0\r
+// Optimization = -\r
+// Sync mode = (3) 30/32 sync word bits detected\r
+// Format of RX/TX data = (0) Normal mode, use FIFOs for RX and TX\r
+// CRC operation = (1) CRC calculation in TX and CRC check in RX enabled\r
+// Forward Error Correction = (0) FEC disabled\r
+// Length configuration = (1) Variable length packets, packet length configured by the first\r
+// received byte after sync word.\r
+// Packetlength = 255\r
+// Preamble count = (2)  4 bytes\r
+// Append status = 1\r
+// Address check = (0) No address check\r
+// FIFO autoflush = 0\r
+// Device address = 0\r
+// GDO0 signal selection = ( 6) Asserts when sync word has been sent / received, and de-asserts at\r
+// the end of the packet\r
+// GDO2 signal selection = (41) CHIP_RDY\r
+\r
+#define SMARTRF_RADIO_CC430\r
+\r
+#define SMARTRF_SETTING_FSCTRL1    0x08\r
+#define SMARTRF_SETTING_FSCTRL0    0x00\r
+#ifdef ISM_EU\r
+// 869.525MHz\r
+#    define SMARTRF_SETTING_FREQ2      0x21\r
+#    define SMARTRF_SETTING_FREQ1      0x71\r
+#    define SMARTRF_SETTING_FREQ0      0x7A\r
+#else\r
+#    ifdef ISM_US\r
+// 902MHz (CHANNR=20->906MHz)\r
+#        define SMARTRF_SETTING_FREQ2      0x22\r
+#        define SMARTRF_SETTING_FREQ1      0xB1\r
+#        define SMARTRF_SETTING_FREQ0      0x3B\r
+#    else\r
+#        ifdef ISM_LF\r
+// 433.92MHz\r
+#            define SMARTRF_SETTING_FREQ2      0x10\r
+#            define SMARTRF_SETTING_FREQ1      0xB0\r
+#            define SMARTRF_SETTING_FREQ0      0x71\r
+#        else\r
+#            error "Wrong ISM band specified (valid are ISM_LF, ISM_EU and ISM_US)"\r
+#        endif // ISM_LF\r
+#    endif     // ISM_US\r
+#endif         // ISM_EU\r
+#define SMARTRF_SETTING_MDMCFG4    0x7B\r
+#define SMARTRF_SETTING_MDMCFG3    0x83\r
+#define SMARTRF_SETTING_MDMCFG2    0x13\r
+#define SMARTRF_SETTING_MDMCFG1    0x22\r
+#define SMARTRF_SETTING_MDMCFG0    0xF8\r
+#define SMARTRF_SETTING_CHANNR     0x00\r
+#define SMARTRF_SETTING_DEVIATN    0x42\r
+#define SMARTRF_SETTING_FREND1     0xB6\r
+#define SMARTRF_SETTING_FREND0     0x10\r
+#define SMARTRF_SETTING_MCSM0      0x18\r
+#define SMARTRF_SETTING_FOCCFG     0x1D\r
+#define SMARTRF_SETTING_BSCFG      0x1C\r
+#define SMARTRF_SETTING_AGCCTRL2   0xC7\r
+#define SMARTRF_SETTING_AGCCTRL1   0x00\r
+#define SMARTRF_SETTING_AGCCTRL0   0xB2\r
+#define SMARTRF_SETTING_FSCAL3     0xEA\r
+#define SMARTRF_SETTING_FSCAL2     0x2A\r
+#define SMARTRF_SETTING_FSCAL1     0x00\r
+#define SMARTRF_SETTING_FSCAL0     0x1F\r
+#define SMARTRF_SETTING_FSTEST     0x59\r
+#define SMARTRF_SETTING_TEST2      0x81\r
+#define SMARTRF_SETTING_TEST1      0x35\r
+#define SMARTRF_SETTING_TEST0      0x09\r
+#define SMARTRF_SETTING_FIFOTHR    0x47\r
+#define SMARTRF_SETTING_IOCFG2     0x29\r
+#define SMARTRF_SETTING_IOCFG0D    0x06\r
+#define SMARTRF_SETTING_PKTCTRL1   0x04\r
+#define SMARTRF_SETTING_PKTCTRL0   0x05\r
+#define SMARTRF_SETTING_ADDR       0x00\r
+#define SMARTRF_SETTING_PKTLEN     0xFF\r
+\r
+#endif // SMARTRF_CC430_H\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/simpliciti/Components/nwk/nwk.c b/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/simpliciti/Components/nwk/nwk.c
new file mode 100755 (executable)
index 0000000..526df8d
--- /dev/null
@@ -0,0 +1,1112 @@
+/**************************************************************************************************\r
+*  Filename:       nwk.c\r
+*  Revised:        $Date: 2009-03-11 15:29:07 -0700 (Wed, 11 Mar 2009) $\r
+*  Revision:       $Revision: 19382 $\r
+*  Author          $Author: lfriedman $\r
+*\r
+*  Description:    This file supports the SimpliciTI network layer.\r
+*\r
+*  Copyright 2007-2009 Texas Instruments Incorporated. All rights reserved.\r
+*\r
+*  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+*  the terms of a software license agreement between the user who downloaded the software,\r
+*  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+*  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+*  License. The License limits your use, and you acknowledge, that the Software may not be\r
+*  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+*  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+*  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+*  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+*  perform, display or sell this Software and/or its documentation for any purpose.\r
+*\r
+*  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+*  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+*  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+*  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+*  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+*  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+*  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+*  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+*  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+*\r
+*  Should you have any questions regarding your right to use this Software,\r
+*  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+/******************************************************************************\r
+ * INCLUDES\r
+ */\r
+#include <string.h>\r
+#include "bsp.h"\r
+#include "mrfi.h"\r
+#include "nwk_types.h"\r
+#include "nwk_frame.h"\r
+#include "nwk.h"\r
+#include "nwk_app.h"\r
+#include "nwk_globals.h"\r
+#include "nwk_QMgmt.h"\r
+\r
+/******************************************************************************\r
+ * MACROS\r
+ */\r
+/************************* NETWORK MANIFEST CONSTANT SANITY CHECKS ****************************/\r
+#if !defined(ACCESS_POINT) && !defined(RANGE_EXTENDER) && !defined(END_DEVICE)\r
+#    error ERROR: No SimpliciTI device type defined\r
+#endif\r
+\r
+#if defined(END_DEVICE) && !defined(RX_POLLS)\r
+#    define RX_USER\r
+#endif\r
+\r
+#ifndef MAX_HOPS\r
+#    define MAX_HOPS  3\r
+#elif MAX_HOPS > 4\r
+#    error ERROR: MAX_HOPS must be 4 or fewer\r
+#endif\r
+\r
+#ifndef MAX_APP_PAYLOAD\r
+#    error ERROR: MAX_APP_PAYLOAD must be defined\r
+#endif\r
+\r
+#if (MAX_PAYLOAD < MAX_FREQ_APP_FRAME)\r
+#    error ERROR: Application payload size too small for Frequency frame\r
+#endif\r
+\r
+#if (MAX_PAYLOAD < MAX_JOIN_APP_FRAME)\r
+#    error ERROR: Application payload size too small for Join frame\r
+#endif\r
+\r
+#if (MAX_PAYLOAD < MAX_LINK_APP_FRAME)\r
+#    error ERROR: Application payload size too small for Link frame\r
+#endif\r
+\r
+#if (MAX_PAYLOAD < MAX_MGMT_APP_FRAME)\r
+#    error ERROR: Application payload size too small for Management frame\r
+#endif\r
+\r
+#if (MAX_PAYLOAD < MAX_SEC_APP_FRAME)\r
+#    error ERROR: Application payload size too small for Security frame\r
+#endif\r
+\r
+#if (MAX_PAYLOAD < MAX_PING_APP_FRAME)\r
+#    error ERROR: Application payload size too small for Ping frame\r
+#endif\r
+\r
+#if NWK_FREQ_TBL_SIZE < 1\r
+#    error ERROR: NWK_FREQ_TBL_SIZE must be > 0\r
+#endif\r
+\r
+/************************* END NETWORK MANIFEST CONSTANT SANITY CHECKS ************************/\r
+\r
+/******************************************************************************\r
+ * CONSTANTS AND DEFINES\r
+ */\r
+#define SYS_NUM_CONNECTIONS   (NUM_CONNECTIONS + 1)\r
+\r
+/* Increment this if the persistentContext_t structure is changed. It will help\r
+ * detect the upgrade context: any saved values will have a version with a\r
+ * lower number.\r
+ */\r
+#define  CONNTABLEINFO_STRUCTURE_VERSION   1\r
+\r
+#define  SIZEOF_NV_OBJ   sizeof(sPersistInfo)\r
+\r
+/******************************************************************************\r
+ * TYPEDEFS\r
+ */\r
+\r
+/* This structure aggregates eveything necessary to save if we want to restore\r
+ * the connection information later.\r
+ */\r
+typedef struct\r
+{\r
+    const uint8_t structureVersion;  /* to dectect upgrades... */\r
+    uint8_t numConnections;          /* count includes the UUD port/link ID */\r
+\r
+    /* The next two are used to detect overlapping port assignments. When _sending_ a\r
+     * link frame the local port is assigned from the top down. When sending a _reply_\r
+     * the assignment is bottom up. Overlapping assignments are rejected. That said it\r
+     * is extremely unlikely that this will ever happen. If it does the test implemented\r
+     * here is overly cautious (it will reject assignments when it needn't). But we leave\r
+     * it that way on the assumption that it will never happen anyway.\r
+     */\r
+    uint8_t curNextLinkPort;\r
+    uint8_t curMaxReplyPort;\r
+    linkID_t nextLinkID;\r
+#ifdef ACCESS_POINT\r
+    sfInfo_t sSandFContext;\r
+#endif\r
+    /* Connection table entries last... */\r
+    connInfo_t connStruct[SYS_NUM_CONNECTIONS];\r
+} persistentContext_t;\r
+\r
+/******************************************************************************\r
+ * LOCAL VARIABLES\r
+ */\r
+\r
+/* This will be overwritten if we restore the structure from NV for example.\r
+ * Note that restoring will not permit overwriting the version element as it\r
+ * is declared 'const'.\r
+ */\r
+static persistentContext_t sPersistInfo = {CONNTABLEINFO_STRUCTURE_VERSION};\r
+\r
+/******************************************************************************\r
+ * LOCAL FUNCTIONS\r
+ */\r
+static uint8_t map_lid2idx(linkID_t, uint8_t *);\r
+static void initializeConnection(connInfo_t *);\r
+\r
+/******************************************************************************\r
+ * GLOBAL VARIABLES\r
+ */\r
+\r
+/******************************************************************************\r
+ * GLOBAL FUNCTIONS\r
+ */\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_nwkInit\r
+ *\r
+ * @brief       Initialize NWK conext.\r
+ *\r
+ * input parameters\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   Status of operation.\r
+ */\r
+\r
+smplStatus_t nwk_nwkInit(uint8_t (*f)(linkID_t))\r
+{\r
+    // [BM] Added variable\r
+    uint8_t i;\r
+\r
+    /* Truly ugly initialization because CCE won't initialize properly. Must\r
+     * skip first const element. Yuk.\r
+     */\r
+    memset((((uint8_t *)&sPersistInfo) + 1), 0x0, (sizeof(sPersistInfo) - 1));\r
+    /* OK. The zeroed elements are set. Now go back and do fixups...  */\r
+\r
+    sPersistInfo.numConnections   = SYS_NUM_CONNECTIONS;\r
+    sPersistInfo.curNextLinkPort  = SMPL_PORT_USER_MAX;\r
+    sPersistInfo.curMaxReplyPort  = PORT_BASE_NUMBER;\r
+    sPersistInfo.nextLinkID       = 1;\r
+\r
+    /* initialize globals */\r
+    nwk_globalsInit();\r
+\r
+    /* initialize frame processing */\r
+    nwk_frameInit(f);\r
+\r
+    /* initialize queue manager */\r
+    nwk_QInit();\r
+\r
+    /* initialize each network application. */\r
+    nwk_freqInit();\r
+    nwk_pingInit();\r
+    nwk_joinInit(f);\r
+    nwk_mgmtInit();\r
+    nwk_linkInit();\r
+    nwk_securityInit();\r
+\r
+    // [BM] Workaround to enable stack restarting\r
+    for (i = 0; i < SYS_NUM_CONNECTIONS; ++i)\r
+    {\r
+        sPersistInfo.connStruct[i].connState = CONNSTATE_FREE;\r
+    }\r
+\r
+    /* set up the last connection as the broadcast port mapped to the broadcast Link ID */\r
+    if (CONNSTATE_FREE == sPersistInfo.connStruct[NUM_CONNECTIONS].connState)\r
+    {\r
+        sPersistInfo.connStruct[NUM_CONNECTIONS].connState   = CONNSTATE_CONNECTED;\r
+        sPersistInfo.connStruct[NUM_CONNECTIONS].hops2target = MAX_HOPS;\r
+        sPersistInfo.connStruct[NUM_CONNECTIONS].portRx      = SMPL_PORT_USER_BCAST;\r
+        sPersistInfo.connStruct[NUM_CONNECTIONS].portTx      = SMPL_PORT_USER_BCAST;\r
+        sPersistInfo.connStruct[NUM_CONNECTIONS].thisLinkID  = SMPL_LINKID_USER_UUD;\r
+        /* set peer address to broadcast so it is used when Application sends to the broadcast Link\r
+         *ID */\r
+        memcpy(sPersistInfo.connStruct[NUM_CONNECTIONS].peerAddr,\r
+               nwk_getBCastAddress(), NET_ADDR_SIZE);\r
+    }\r
+\r
+    return SMPL_SUCCESS;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_getNextConnection\r
+ *\r
+ * @brief       Return the next free connection structure if on is available.\r
+ *\r
+ * input parameters\r
+ *\r
+ * output parameters\r
+ *      The returned structure has the Rx port number populated based on the\r
+ *      free strucure found. This is the port queried when the app wants to\r
+ *      do a receive.\r
+ *\r
+ * @return   pointer to the new connInfo_t structure. NULL if there is\r
+ *           no room in connection structure array.\r
+ */\r
+\r
+connInfo_t *nwk_getNextConnection()\r
+{\r
+    uint8_t i;\r
+\r
+    for (i = 0; i < SYS_NUM_CONNECTIONS; ++i)\r
+    {\r
+        if (sPersistInfo.connStruct[i].connState == CONNSTATE_CONNECTED)\r
+        {\r
+            continue;\r
+        }\r
+        break;\r
+    }\r
+\r
+    if (SYS_NUM_CONNECTIONS == i)\r
+    {\r
+        return (connInfo_t *)0;\r
+    }\r
+\r
+    initializeConnection(&sPersistInfo.connStruct[i]);\r
+\r
+    return &sPersistInfo.connStruct[i];\r
+}\r
+\r
+/************************************************************************************\r
+ * @fn          initializeConnection\r
+ *\r
+ * @brief       Initialize some elements of a Connection table entry.\r
+ *\r
+ * input parameters\r
+ * @param   pCInfo  - pointer to Connection Table entry to initialize. The file\r
+ *                    scope variable holding the next link ID value is also updated.\r
+ *\r
+ * output parameters\r
+ * @param   pCInfo  - certain elements are set to specific values.\r
+ *\r
+ *\r
+ * @return   void\r
+ */\r
+\r
+static void initializeConnection(connInfo_t *pCInfo)\r
+{\r
+    linkID_t *locLID = &sPersistInfo.nextLinkID;\r
+    uint8_t tmp;\r
+\r
+    /* this element will be populated during the exchange with the peer. */\r
+    pCInfo->portTx = 0;\r
+\r
+    pCInfo->connState  =  CONNSTATE_CONNECTED;\r
+    pCInfo->thisLinkID = *locLID;\r
+\r
+    /* Generate the next Link ID. This isn't foolproof. If the count wraps\r
+     * we can end up with confusing duplicates. We can protect aginst using\r
+     * one that is already in use but we can't protect against a stale Link ID\r
+     * remembered by an application that doesn't know its connection has been\r
+     * torn down. The test for 0 will hopefully never be true (indicating a wrap).\r
+     */\r
+    (*locLID)++;\r
+\r
+    while (!*locLID || (*locLID == SMPL_LINKID_USER_UUD) || map_lid2idx(*locLID, &tmp))\r
+    {\r
+        (*locLID)++;\r
+    }\r
+\r
+    return;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_freeConnection\r
+ *\r
+ * @brief       Return the connection structure to the free pool. Currently\r
+ *              this routine is only called when a link freame is sent and\r
+ *              no reply is received so the freeing steps are pretty simple.\r
+ *              But eventually this will be more complex so this place-holder\r
+ *              is introduced.\r
+ *\r
+ * input parameters\r
+ * @param   pCInfo    - pointer to entry to be freed\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   None.\r
+ */\r
+\r
+void nwk_freeConnection(connInfo_t *pCInfo)\r
+{\r
+#if NUM_CONNECTIONS > 0\r
+    pCInfo->connState = CONNSTATE_FREE;\r
+#endif\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_getConnInfo\r
+ *\r
+ * @brief       Return the connection info structure to which the input Link ID maps.\r
+ *\r
+ * input parameters\r
+ * @param   port    - port for which mapping desired\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   pointer to connInfo_t structure found. NULL if no mapping\r
+ *           found or entry not valid.\r
+ */\r
+\r
+connInfo_t *nwk_getConnInfo(linkID_t linkID)\r
+{\r
+    uint8_t idx, rc;\r
+\r
+    rc = map_lid2idx(linkID, &idx);\r
+\r
+    return (rc &&\r
+            (CONNSTATE_CONNECTED ==\r
+    sPersistInfo.connStruct[idx].connState)) ? &sPersistInfo.connStruct[idx] : (connInfo_t *)0;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_isLinkDuplicate\r
+ *\r
+ * @brief       Help determine if the link has already been established.. Defense\r
+ *              against duplicate link frames. This file owns the data structure\r
+ *              so the comparison is done here.\r
+ *\r
+ * input parameters\r
+ * @param   addr       - pointer to address of linker in question\r
+ * @param   remotePort - remote port number provided by linker\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   Returns pointer to connection entry if the address and remote Port\r
+ *           match an existing entry, otherwise 0.\r
+ */\r
+\r
+connInfo_t *nwk_isLinkDuplicate(uint8_t *addr, uint8_t remotePort)\r
+{\r
+#if NUM_CONNECTIONS > 0\r
+    uint8_t i;\r
+    connInfo_t   *ptr = sPersistInfo.connStruct;\r
+\r
+    for (i = 0; i < NUM_CONNECTIONS; ++i, ++ptr)\r
+    {\r
+        if (CONNSTATE_CONNECTED == ptr->connState)\r
+        {\r
+            if (!(memcmp(ptr->peerAddr, addr, NET_ADDR_SIZE)) &&\r
+                (ptr->portTx == remotePort))\r
+            {\r
+                return ptr;\r
+            }\r
+        }\r
+    }\r
+#endif\r
+\r
+    return (connInfo_t *)NULL;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_findAddressMatch\r
+ *\r
+ * @brief       Used to look for an address match in the Connection table.\r
+ *              Match is based on source address in frame.\r
+ *\r
+ * input parameters\r
+ * @param   frame    - pointer to frame in question\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   Returns non-zero if a match is found, otherwise 0.\r
+ */\r
+\r
+uint8_t nwk_findAddressMatch(mrfiPacket_t *frame)\r
+{\r
+#if NUM_CONNECTIONS > 0\r
+    uint8_t i;\r
+    connInfo_t   *ptr = sPersistInfo.connStruct;\r
+\r
+    for (i = 0; i < NUM_CONNECTIONS; ++i, ++ptr)\r
+    {\r
+\r
+        if (CONNSTATE_CONNECTED == ptr->connState)\r
+        {\r
+            if (!(memcmp(ptr->peerAddr, MRFI_P_SRC_ADDR(frame), NET_ADDR_SIZE)))\r
+            {\r
+                return 1;\r
+            }\r
+        }\r
+    }\r
+#endif\r
+\r
+    return 0;\r
+}\r
+\r
+#ifdef ACCESS_POINT\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_getSFInfoPtr\r
+ *\r
+ * @brief       Get pointer to store-and-forward information object kept in the\r
+ *              NV object aggregate.\r
+ *\r
+ * input parameters\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   Returns pointer to the store-nad-forward object.\r
+ */\r
+\r
+sfInfo_t *nwk_getSFInfoPtr(void)\r
+{\r
+    return &sPersistInfo.sSandFContext;\r
+}\r
+\r
+#    if defined(AP_IS_DATA_HUB)\r
+\r
+/***************************************************************************************\r
+ * @fn          nwk_saveJoinedDevice\r
+ *\r
+ * @brief       Save the address of a joining device on the Connection Table expecting\r
+ *              a Link frame to follow. Only for when AP is a data hub. We want to\r
+ *              use the space already allocated for a connection able entry instead\r
+ *              of having redundant arrays for alread-joined devices in the data hub\r
+ *              case.\r
+ *\r
+ * input parameters\r
+ * @param   frame  - pointer to frame containing address or joining device.\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   Returns non-zero if this is a new device and it is saved. Returns\r
+ *           0 if device already there or there is no room in the Connection\r
+ *           Table.\r
+ */\r
+\r
+uint8_t nwk_saveJoinedDevice(mrfiPacket_t *frame)\r
+{\r
+    uint8_t i;\r
+    connInfo_t *avail = 0;\r
+    connInfo_t *ptr   = sPersistInfo.connStruct;\r
+\r
+    for (i = 0; i < NUM_CONNECTIONS; ++i, ++ptr)\r
+    {\r
+        if ((ptr->connState == CONNSTATE_CONNECTED) || (ptr->connState == CONNSTATE_JOINED))\r
+        {\r
+            if (!memcmp(ptr->peerAddr, MRFI_P_SRC_ADDR(frame), NET_ADDR_SIZE))\r
+            {\r
+                return 0;\r
+            }\r
+        }\r
+        else\r
+        {\r
+            avail = ptr;\r
+        }\r
+    }\r
+\r
+    if (!avail)\r
+    {\r
+        return 0;\r
+    }\r
+\r
+    avail->connState = CONNSTATE_JOINED;\r
+    memcpy(avail->peerAddr, MRFI_P_SRC_ADDR(frame), NET_ADDR_SIZE);\r
+\r
+    return 1;\r
+}\r
+\r
+/***********************************************************************************\r
+ * @fn          nwk_findAlreadyJoined\r
+ *\r
+ * @brief       Used when AP is a data hub to look for an address match in the\r
+ *              Connection table for a device that is already enterd in the joined\r
+ *              state. This means that the Connection Table resource is already\r
+ *              allocated so the link-listen doesn't have to do it again. Match is\r
+ *              based on source address in frame. Thsi shoudl only be called from\r
+ *              the Link-listen context during the link frame reply.\r
+ *\r
+ *              If found the Connection Table entry is initialized as if it were\r
+ *              found using the nwk_getNextConnection() method.\r
+ *\r
+ * input parameters\r
+ * @param   frame    - pointer to frame in question\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   Returns pointer to Connection Table entry if match is found, otherwise\r
+ *           0. This call will only fail if the Connection Table was full when the\r
+ *           device tried to join initially.\r
+ */\r
+\r
+connInfo_t *nwk_findAlreadyJoined(mrfiPacket_t *frame)\r
+{\r
+    uint8_t i;\r
+    connInfo_t *ptr = sPersistInfo.connStruct;\r
+\r
+    for (i = 0; i < NUM_CONNECTIONS; ++i, ++ptr)\r
+    {\r
+        /* Look for an entry in the JOINED state */\r
+        if (CONNSTATE_JOINED == ptr->connState)\r
+        {\r
+            /* Is this it? */\r
+            if (!(memcmp(&ptr->peerAddr, MRFI_P_SRC_ADDR(frame), NET_ADDR_SIZE)))\r
+            {\r
+                /* Yes. Initilize tabel entry and return the pointer. */\r
+                initializeConnection(ptr);\r
+                return ptr;\r
+            }\r
+        }\r
+    }\r
+\r
+    /* Nothing found... */\r
+    return (connInfo_t *)NULL;\r
+}\r
+\r
+#    endif /* AP_IS_DATA_HUB */\r
+#endif     /* ACCESS_POINT */\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_checkConnInfo\r
+ *\r
+ * @brief       Do a sanity/validity check on the connection info\r
+ *\r
+ * input parameters\r
+ * @param   ptr     - pointer to a valid connection info structure to validate\r
+ * @param   which   - Tx or Rx port checked\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   Status of operation.\r
+ */\r
+\r
+smplStatus_t nwk_checkConnInfo(connInfo_t *ptr, uint8_t which)\r
+{\r
+    uint8_t port;\r
+\r
+    /* make sure port isn't null and that the entry is active */\r
+    port = (CHK_RX == which) ? ptr->portRx : ptr->portTx;\r
+    if (!port || (CONNSTATE_FREE == ptr->connState))\r
+    {\r
+        return SMPL_BAD_PARAM;\r
+    }\r
+\r
+    /* validate port number */\r
+    if (port < PORT_BASE_NUMBER)\r
+    {\r
+        return SMPL_BAD_PARAM;\r
+    }\r
+\r
+    return SMPL_SUCCESS;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_isConnectionValid\r
+ *\r
+ * @brief       Do a sanity/validity check on the frame target address by\r
+ *              validating frame against connection info\r
+ *\r
+ * input parameters\r
+ * @param   frame   - pointer to frame in question\r
+ *\r
+ * output parameters\r
+ * @param   lid   - link ID of found connection\r
+ *\r
+ * @return   0 if connection specified in frame is not valid, otherwise non-zero.\r
+ */\r
+\r
+uint8_t nwk_isConnectionValid(mrfiPacket_t *frame, linkID_t *lid)\r
+{\r
+    uint8_t i;\r
+    connInfo_t   *ptr  = sPersistInfo.connStruct;\r
+    uint8_t port = GET_FROM_FRAME(MRFI_P_PAYLOAD(frame), F_PORT_OS);\r
+\r
+    for (i = 0; i < SYS_NUM_CONNECTIONS; ++i, ++ptr)\r
+    {\r
+        if (CONNSTATE_CONNECTED == ptr->connState)\r
+        {\r
+            /* check port first since we're done if the port is the user bcast port. */\r
+            if (port == ptr->portRx)\r
+            {\r
+                /* yep...ports match. */\r
+                if ((SMPL_PORT_USER_BCAST == port) ||\r
+                    !(memcmp(ptr->peerAddr, MRFI_P_SRC_ADDR(frame), NET_ADDR_SIZE)))\r
+                {\r
+                    uint8_t rc = 1;\r
+\r
+                    /* we're done. */\r
+                    *lid = ptr->thisLinkID;\r
+#ifdef APP_AUTO_ACK\r
+                    /* can't ack the broadcast port... */\r
+                    if (!(SMPL_PORT_USER_BCAST == port))\r
+                    {\r
+                        if (GET_FROM_FRAME(MRFI_P_PAYLOAD(frame), F_ACK_REQ))\r
+                        {\r
+                            /* Ack requested. Send ack now */\r
+                            nwk_sendAckReply(frame, ptr->portTx);\r
+                        }\r
+                        else if (GET_FROM_FRAME(MRFI_P_PAYLOAD(frame), F_ACK_RPLY))\r
+                        {\r
+                            /* This is a reply. Signal that it was received by resetting the\r
+                             * saved transaction ID in the connection object if they match. The\r
+                             * main thread is polling this value. The setting here is in the\r
+                             * Rx ISR thread.\r
+                             */\r
+                            if (ptr->ackTID == GET_FROM_FRAME(MRFI_P_PAYLOAD(frame), F_TRACTID_OS))\r
+                            {\r
+                                ptr->ackTID = 0;\r
+                            }\r
+\r
+                            /* This causes the frame to be dropped. All ack frames are\r
+                             * dropped.\r
+                             */\r
+                            rc = 0;\r
+                        }\r
+                    }\r
+#endif              /* APP_AUTO_ACK */\r
+\r
+                    /* Unconditionally kill the reply delay semaphore. This used to be done\r
+                     * unconditionally in the calling routine.\r
+                     */\r
+                    MRFI_PostKillSem();\r
+                    return rc;\r
+                }\r
+            }\r
+        }\r
+    }\r
+\r
+    /* no matches */\r
+    return 0;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_allocateLocalRxPort\r
+ *\r
+ * @brief       Allocate a local port on which to receive frames from a peer.\r
+ *\r
+ *              Allocation differs depending on whether the allocation is for\r
+ *              a link reply frame or a link frame. In the former case we\r
+ *              know the address of the peer so we can ensure allocating a\r
+ *              unique port number for that address. The same port number can be\r
+ *              used mulitple times for distinct peers. Allocations are done from\r
+ *              the bottom of the namespace upward.\r
+ *\r
+ *              If allocation is for a link frame we do not yet know the peer\r
+ *              address so we must ensure the port number is unique now.\r
+ *              Allocations are done from the top of the namespace downward.\r
+ *\r
+ *              The two allocation methods track the extreme values used in each\r
+ *              case to detect overlap, i.e., exhausted namespace. This can only\r
+ *              happen if the number of connections supported is greater than the\r
+ *              total namespace available.\r
+ *\r
+ * input parameters\r
+ * @param   which   - Sending a link frame or a link reply frame\r
+ * @param   newPtr  - pointer to connection info structure to be populated\r
+ *\r
+ * output parameters\r
+ * @param   newPtr->portRx  - element is populated with port number.\r
+ *\r
+ * @return   Non-zero if port number assigned. 0 if no port available.\r
+ */\r
+\r
+uint8_t nwk_allocateLocalRxPort(uint8_t which, connInfo_t *newPtr)\r
+{\r
+#if NUM_CONNECTIONS > 0\r
+    uint8_t num, i;\r
+    uint8_t marker[NUM_CONNECTIONS];\r
+    connInfo_t *ptr = sPersistInfo.connStruct;\r
+\r
+    memset(&marker, 0x0, sizeof(marker));\r
+\r
+    for (i = 0; i < NUM_CONNECTIONS; ++i, ++ptr)\r
+    {\r
+        /* Mark the port number as used unless it's a statically allocated port */\r
+        if ((ptr != newPtr) && (CONNSTATE_CONNECTED == ptr->connState) &&\r
+            (ptr->portRx <= SMPL_PORT_USER_MAX))\r
+        {\r
+            if (LINK_SEND == which)\r
+            {\r
+                if (ptr->portRx > sPersistInfo.curNextLinkPort)\r
+                {\r
+                    marker[SMPL_PORT_USER_MAX - ptr->portRx] = 1;\r
+                }\r
+            }\r
+            else if (!memcmp(ptr->peerAddr, newPtr->peerAddr, NET_ADDR_SIZE))\r
+            {\r
+                marker[ptr->portRx - PORT_BASE_NUMBER] = 1;\r
+            }\r
+        }\r
+    }\r
+\r
+    num = 0;\r
+    for (i = 0; i < NUM_CONNECTIONS; ++i)\r
+    {\r
+        if (!marker[i])\r
+        {\r
+            if (LINK_REPLY == which)\r
+            {\r
+                num = PORT_BASE_NUMBER + i;\r
+            }\r
+            else\r
+            {\r
+                num = SMPL_PORT_USER_MAX - i;\r
+            }\r
+            break;\r
+        }\r
+    }\r
+\r
+    if (LINK_REPLY == which)\r
+    {\r
+        /* if the number we have doesn't overlap the assignment of ports used\r
+         * for sending link frames, use it.\r
+         */\r
+        if (num <= sPersistInfo.curNextLinkPort)\r
+        {\r
+            if (num > sPersistInfo.curMaxReplyPort)\r
+            {\r
+                /* remember maximum port number used */\r
+                sPersistInfo.curMaxReplyPort = num;\r
+            }\r
+        }\r
+        else\r
+        {\r
+            /* the port number we need has already been used in the other context. It may or\r
+             * may not have been used for the same address but we don't bother to check...we\r
+             * just reject the asignment. This is the overly cautious part but is extermely\r
+             * unlikely to ever occur.\r
+             */\r
+            num = 0;\r
+        }\r
+    }\r
+    else\r
+    {\r
+        /* if the number we have doesn't overlap the assignment of ports used\r
+         * for sending link frame replies, use it.\r
+         */\r
+        if (num >= sPersistInfo.curMaxReplyPort)\r
+        {\r
+            if (num == sPersistInfo.curNextLinkPort)\r
+            {\r
+                sPersistInfo.curNextLinkPort--;\r
+            }\r
+        }\r
+        else\r
+        {\r
+            /* the port number we need has already been used in the other context. It may or\r
+             * may not have been used for the same address but we don't bother to check...we\r
+             * just reject the asignment. This is the overly cautious part but is extermely\r
+             * unlikely to ever occur.\r
+             */\r
+            num = 0;\r
+        }\r
+    }\r
+\r
+    newPtr->portRx = num;\r
+\r
+    return num;\r
+#else\r
+    return 0;\r
+#endif  /* NUM_CONNECTIONS > 0 */\r
+\r
+}\r
+\r
+/*******************************************************************************\r
+ * @fn          nwk_isValidReply\r
+ *\r
+ * @brief       Examine a frame to see if it is a valid reply when compared with\r
+ *              expected parameters.\r
+ *\r
+ * input parameters\r
+ * @param   frame      - pointer to frmae being examined\r
+ * @param   tid        - expected transaction ID in application payload\r
+ * @param   infoOffset - offset to payload information containing reply hint\r
+ * @param   tidOffset  - offset to transaction ID in payload\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   reply category:\r
+ *               SMPL_NOT_REPLY: not a reply\r
+ *               SMPL_MY_REPLY : a reply that matches input parameters\r
+ *               SMPL_A_REPLY  : a reply but does not match input parameters\r
+ */\r
+\r
+uint8_t nwk_isValidReply(mrfiPacket_t *frame, uint8_t tid, uint8_t infoOffset, uint8_t tidOffset)\r
+{\r
+    uint8_t rc = SMPL_NOT_REPLY;\r
+\r
+    if ((*(MRFI_P_PAYLOAD(frame) + F_APP_PAYLOAD_OS + infoOffset) & NWK_APP_REPLY_BIT))\r
+    {\r
+        if ((*(MRFI_P_PAYLOAD(frame) + F_APP_PAYLOAD_OS + tidOffset) == tid) &&\r
+            !memcmp(MRFI_P_DST_ADDR(frame), nwk_getMyAddress(), NET_ADDR_SIZE))\r
+        {\r
+            rc = SMPL_MY_REPLY;\r
+        }\r
+        else\r
+        {\r
+            rc = SMPL_A_REPLY;\r
+        }\r
+    }\r
+\r
+    return rc;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          map_lid2idx\r
+ *\r
+ * @brief       Map link ID to index into connection table.\r
+ *\r
+ * input parameters\r
+ * @param   lid   - Link ID to be matched\r
+ *\r
+ * output parameters\r
+ * @param   idx   - populated with index into connection table\r
+ *\r
+ * @return   Non-zero if Link ID found and output is valid else 0.\r
+ */\r
+\r
+static uint8_t map_lid2idx(linkID_t lid, uint8_t *idx)\r
+{\r
+    uint8_t i;\r
+    connInfo_t *ptr = sPersistInfo.connStruct;\r
+\r
+    for (i = 0; i < SYS_NUM_CONNECTIONS; ++i, ++ptr)\r
+    {\r
+        if ((CONNSTATE_CONNECTED == ptr->connState) && (ptr->thisLinkID == lid))\r
+        {\r
+            *idx = i;\r
+            return 1;\r
+        }\r
+    }\r
+\r
+    return 0;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_findPeer\r
+ *\r
+ * @brief       Find connection entry for a peer\r
+ *\r
+ * input parameters\r
+ * @param   peerAddr   - address of peer\r
+ * @param   peerPort   - port on which this device was sending to peer.\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   Pointer to matching connection table entry else 0.\r
+ */\r
+\r
+connInfo_t *nwk_findPeer(addr_t *peerAddr, uint8_t peerPort)\r
+{\r
+    uint8_t i;\r
+    connInfo_t *ptr = sPersistInfo.connStruct;\r
+\r
+    for (i = 0; i < SYS_NUM_CONNECTIONS; ++i, ++ptr)\r
+    {\r
+        if (CONNSTATE_CONNECTED == ptr->connState)\r
+        {\r
+            if (!memcmp(peerAddr, ptr->peerAddr, NET_ADDR_SIZE))\r
+            {\r
+                if (peerPort == ptr->portTx)\r
+                {\r
+                    return ptr;\r
+                }\r
+            }\r
+        }\r
+    }\r
+\r
+    return (connInfo_t *)NULL;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_checkAppMsgTID\r
+ *\r
+ * @brief       Compare received TID to last-seen TID to decide whether the\r
+ *              received message is a duplicate or we missed some.\r
+ *\r
+ * input parameters\r
+ * @param   lastTID   - last-seen TID\r
+ * @param   appMsgTID - TID from current application payload.\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   Returns zero if message with supplied TID should be discarded.\r
+ *           Otherwise returns non-zero. In this case the message should be\r
+ *           processed. The last-seen TID should be updated with the current\r
+ *           application payload TID.\r
+ *\r
+ */\r
+\r
+uint8_t nwk_checkAppMsgTID(appPTid_t lastTID, appPTid_t appMsgTID)\r
+{\r
+    uint8_t rc = 0;\r
+\r
+    /* If the values are equal this is a duplicate. We're done. */\r
+    if (lastTID != appMsgTID)\r
+    {\r
+        /* Is the new TID bigger? */\r
+        if (appMsgTID > lastTID)\r
+        {\r
+            /* In this case the current payload is OK unless we've received a late\r
+             * (duplicate) message that occurred just before the TID wrapped. This is\r
+             * considered a duplicate and we should discard it.\r
+             */\r
+            if (!(DUP_TID_AFTER_WRAP(lastTID, appMsgTID)))\r
+            {\r
+                rc = 1;\r
+            }\r
+        }\r
+        else\r
+        {\r
+            /* New TID is smaller. Accept the payload if this is the wrap case or we missed\r
+             * the specific wrap frame but are still within the range in which we assume\r
+             * we missed it. Otherwise is a genuine late frame so we should ignore it.\r
+             */\r
+            if (CHECK_TID_WRAP(lastTID, appMsgTID))\r
+            {\r
+                rc = 1;\r
+            }\r
+        }\r
+    }\r
+\r
+    return rc;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_getNumObjectFromMsg\r
+ *\r
+ * @brief       Get a numeric object from a message buffer. Take care of\r
+ *              alignment and endianess issues.\r
+ *\r
+ * input parameters\r
+ * @param   src     - pointer to object location in message buffer\r
+ * @param   objSize - size of numeric object\r
+ *\r
+ * output parameters\r
+ * @param   dest - pointer to numeric type variable receiving the object\r
+ *                 contains aligned number in correct endian order on return.\r
+ *\r
+ * @return   void. There is no warning if there is no case for the supplied\r
+ *                 object size. A simple copy is then done. Alignment is\r
+ *                 guaranteed only for object size cases defined (and\r
+ *                 vacuously size 1).\r
+ *\r
+ */\r
+\r
+void nwk_getNumObjectFromMsg(void *src, void *dest, uint8_t objSize)\r
+{\r
+    /* Take care of alignment */\r
+    memmove(dest, src, objSize);\r
+\r
+    /* Take care of endianess */\r
+    switch (objSize)\r
+    {\r
+        case 2:\r
+            *((uint16_t *)dest) = ntohs(*((uint16_t *)dest));\r
+            break;\r
+\r
+        case 4:\r
+            *((uint32_t *)dest) = ntohl(*((uint32_t *)dest));\r
+            break;\r
+    }\r
+\r
+    return;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_putNumObjectIntoMsg\r
+ *\r
+ * @brief       Put a numeric object into a message buffer. Take care of\r
+ *              alignment and endianess issues.\r
+ *\r
+ * input parameters\r
+ * @param   src     - pointer to numeric type variable providing the object\r
+ * @param   objSize - size of numeric object. Fuction works for object size 1.\r
+ *\r
+ * output parameters\r
+ * @param   dest - pointer to object location in message buffer where the\r
+ *                 correct endian order representation will be placed.\r
+ *\r
+ * @return   void. There is no warning if there is no case for the supplied\r
+ *                 object size. A simple copy is then done.\r
+ *\r
+ */\r
+\r
+void nwk_putNumObjectIntoMsg(void *src, void *dest, uint8_t objSize)\r
+{\r
+\r
+    uint8_t *ptr;\r
+    uint16_t u16;\r
+    uint32_t u32;\r
+\r
+    /* Take care of endianess */\r
+    switch (objSize)\r
+    {\r
+        case 1:\r
+            ptr = (uint8_t *)src;\r
+            break;\r
+\r
+        case 2:\r
+            u16 = htons(*((uint16_t *)src));\r
+            ptr = (uint8_t *)&u16;\r
+            break;\r
+\r
+        case 4:\r
+            u32 = htonl(*((uint32_t *)src));\r
+            ptr = (uint8_t *)&u32;\r
+            break;\r
+\r
+        default:\r
+            ptr = (uint8_t *)src;\r
+            break;\r
+    }\r
+\r
+    /* Take care of alignment */\r
+    memmove(dest, ptr, objSize);\r
+\r
+    return;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_NVObj\r
+ *\r
+ * @brief       GET and SET support for NV object (connection context).\r
+ *\r
+ * input parameters\r
+ * @param   action  - GET or SET\r
+ * @param   val     - (GET/SET) pointer to NV IOCTL object.\r
+ *                    (SET) NV length and version values to be used for sanity\r
+ *                    checks.\r
+ *\r
+ * output parameters\r
+ * @param   val     - (GET) Version number of NV object, size of NV object and\r
+ *                          pointer to the connection context memory.\r
+ *                  - (SET) Pointer to the connection context memory.\r
+ *\r
+ * @return   SMPL_SUCCESS\r
+ *           SMPL_BAD_PARAM   Object version or size do not conform on a SET call\r
+ *                            or illegal action specified.\r
+ */\r
+\r
+smplStatus_t nwk_NVObj(ioctlAction_t action, ioctlNVObj_t *val)\r
+{\r
+#ifdef NVOBJECT_SUPPORT\r
+    smplStatus_t rc = SMPL_SUCCESS;\r
+\r
+    if (IOCTL_ACT_GET == action)\r
+    {\r
+        /* Populate helper objects */\r
+        val->objLen     = SIZEOF_NV_OBJ;\r
+        val->objVersion = sPersistInfo.structureVersion;\r
+        /* Set pointer to connection context if address of pointer is not null */\r
+        if (val->objPtr)\r
+        {\r
+            *(val->objPtr) = (uint8_t *)&sPersistInfo;\r
+        }\r
+    }\r
+    else\r
+    {\r
+        rc = SMPL_BAD_PARAM;\r
+    }\r
+\r
+    return rc;\r
+#else  /* NVOBJECT_SUPPORT */\r
+    return SMPL_BAD_PARAM;\r
+#endif\r
+}\r
+\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/simpliciti/Components/nwk/nwk.h b/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/simpliciti/Components/nwk/nwk.h
new file mode 100755 (executable)
index 0000000..4fffc01
--- /dev/null
@@ -0,0 +1,164 @@
+/**************************************************************************************************\r
+*  Filename:       nwk.h\r
+*  Revised:        $Date: 2008-12-01 11:58:33 -0800 (Mon, 01 Dec 2008) $\r
+*  Revision:       $Revision: 18551 $\r
+*  Author:         $Author: lfriedman $\r
+*\r
+*  Description:    This header file supports the SimpliciTI network layer.\r
+*\r
+*  Copyright 2004-2007 Texas Instruments Incorporated. All rights reserved.\r
+*\r
+*  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+*  the terms of a software license agreement between the user who downloaded the software,\r
+*  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+*  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+*  License. The License limits your use, and you acknowledge, that the Software may not be\r
+*  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+*  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+*  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+*  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+*  perform, display or sell this Software and/or its documentation for any purpose.\r
+*\r
+*  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+*  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+*  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+*  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+*  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+*  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+*  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+*  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+*  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+*\r
+*  Should you have any questions regarding your right to use this Software,\r
+*  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+#ifndef NWK_H\r
+#define NWK_H\r
+\r
+\r
+/* well known ports*/\r
+#define SMPL_PORT_PING          0x01\r
+#define SMPL_PORT_LINK          0x02\r
+#define SMPL_PORT_JOIN          0x03\r
+#define SMPL_PORT_SECURITY      0x04\r
+#define SMPL_PORT_FREQ          0x05\r
+#define SMPL_PORT_MGMT          0x06\r
+\r
+#define SMPL_PORT_NWK_BCAST     0x1F\r
+#define SMPL_PORT_USER_BCAST    0x3F\r
+\r
+/* Unconnected User Datagram Link ID */\r
+#define SMPL_LINKID_USER_UUD    ((linkID_t) ~0)\r
+\r
+#define PORT_BASE_NUMBER        0x20\r
+\r
+/* Reserve the top of the User port namespace below the broadcast\r
+ * address for static allocation.\r
+ */\r
+#define PORT_USER_STATIC_NUM    1\r
+#define SMPL_PORT_STATIC_MAX    0x3E\r
+#define SMPL_PORT_USER_MAX      (SMPL_PORT_STATIC_MAX - PORT_USER_STATIC_NUM)\r
+\r
+\r
+/* to check connection info sanity */\r
+#define CHK_RX   0\r
+#define CHK_TX   1\r
+\r
+/* return types for validating a reply frame */\r
+#define SMPL_MY_REPLY    0\r
+#define SMPL_A_REPLY     1\r
+#define SMPL_NOT_REPLY   2\r
+\r
+/* when allocating local Rx port it depends on whether the allocation\r
+ * is being done as a result of a link or a link reply\r
+ */\r
+#define LINK_SEND   1\r
+#define LINK_REPLY  2\r
+\r
+#define  CONNSTATE_FREE       (0x00)\r
+#define  CONNSTATE_JOINED     (0x01)\r
+#define  CONNSTATE_CONNECTED  (0x02)\r
+\r
+typedef struct\r
+{\r
+    volatile uint8_t connState;\r
+    uint8_t hops2target;\r
+#ifdef APP_AUTO_ACK\r
+    volatile uint8_t ackTID;\r
+#endif\r
+    uint8_t peerAddr[NET_ADDR_SIZE];\r
+    rxMetrics_t sigInfo;\r
+    uint8_t portRx;\r
+    uint8_t portTx;\r
+    linkID_t thisLinkID;\r
+#ifdef SMPL_SECURE\r
+    uint32_t connTxCTR;\r
+    uint32_t connRxCTR;\r
+#endif\r
+} connInfo_t;\r
+\r
+/****************************************************************************************\r
+ *                         Application Payload TID support\r
+ *\r
+ * Sometimes the receiving application uses a payload TID to determine if either it\r
+ * missed frames (received TID > (last-seen TID+1)) or is seeing a duplicate (received\r
+ * TID <= last-seen TID). Typically the TID simply increments for each successive frame.\r
+ * But when the count wraps there is a problem. The received TID should always be one\r
+ * more than the last TID. If it's equal, it's a duplicate. If it's less it's late. If\r
+ * it's one more it's the one we expect. If it's more than 1 more then we missed frames.\r
+ * Simple increments work for the wrap arithmetically. If the received TID is 0 and the last\r
+ * seen ID is the biggest number in the world -- 0xFF... depending on type we can detect\r
+ * the wrap. But if the receiver misses the 0 TID value for any reason or the biggest\r
+ * number in the world TID is missed then susbequent testing for missed or duplicate\r
+ * frames can get confused. We resolve this by allowing some leeway in the wrap testing.\r
+ * this testing is assisted by the following macros. Setting TID_VALID_WINDOW to 0\r
+ * will enforce a no leniency policy. In this case you'd better not miss either the\r
+ * biggest number or the 0. The CHECK_TID_WRAP macro is only needed if the received\r
+ * TID is less than the last-seen TID. The DUP_TID_AFTER_WRAP macro is only needed if the\r
+ * received TID is greater than 1 more than the last-seen TID.\r
+ ***************************************************************************************/\r
+#define MAX_APT           ((appPTid_t) ~0)   /* max value of application payload TID type */\r
+#define TID_VALID_WINDOW  2                  /* window around max and 0 */\r
+\r
+#define CHECK_TID_WRAP(lastTID, newTID)   ((lastTID >= (MAX_APT - TID_VALID_WINDOW)) &&  \\r
+                                           (newTID <= TID_VALID_WINDOW)                  \\r
+                                           )\r
+#define DUP_TID_AFTER_WRAP(lastTID, newTID)     ((newTID >= (MAX_APT - TID_VALID_WINDOW)) &&  \\r
+                                                 (lastTID <= TID_VALID_WINDOW)                  \\r
+                                                 )\r
+\r
+/* prototypes */\r
+smplStatus_t nwk_nwkInit(uint8_t (*)(linkID_t));\r
+connInfo_t   *nwk_getNextConnection(void);\r
+void nwk_freeConnection(connInfo_t *);\r
+uint8_t nwk_getNextClientPort(void);\r
+connInfo_t   *nwk_getConnInfo(linkID_t port);\r
+\r
+connInfo_t   *nwk_isLinkDuplicate(uint8_t *, uint8_t);\r
+uint8_t nwk_findAddressMatch(mrfiPacket_t *);\r
+\r
+smplStatus_t nwk_checkConnInfo(connInfo_t *, uint8_t);\r
+uint8_t nwk_isConnectionValid(mrfiPacket_t *, linkID_t *);\r
+\r
+uint8_t nwk_allocateLocalRxPort(uint8_t, connInfo_t *);\r
+uint8_t nwk_isValidReply(mrfiPacket_t *, uint8_t, uint8_t, uint8_t);\r
+connInfo_t   *nwk_findPeer(addr_t *, uint8_t);\r
+smplStatus_t nwk_NVObj(ioctlAction_t, ioctlNVObj_t *);\r
+\r
+\r
+uint8_t nwk_checkAppMsgTID(appPTid_t, appPTid_t);\r
+void nwk_getNumObjectFromMsg(void *, void *, uint8_t);\r
+void nwk_putNumObjectIntoMsg(void *, void *, uint8_t);\r
+#ifdef ACCESS_POINT\r
+sfInfo_t     *nwk_getSFInfoPtr(void);\r
+\r
+#    ifdef AP_IS_DATA_HUB\r
+uint8_t nwk_saveJoinedDevice(mrfiPacket_t *);\r
+connInfo_t   *nwk_findAlreadyJoined(mrfiPacket_t *);\r
+\r
+#    endif\r
+#endif\r
+\r
+\r
+#endif\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/simpliciti/Components/nwk/nwk_QMgmt.c b/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/simpliciti/Components/nwk/nwk_QMgmt.c
new file mode 100755 (executable)
index 0000000..721cad7
--- /dev/null
@@ -0,0 +1,422 @@
+/**************************************************************************************************\r
+*  Filename:       nwk_QMgmt.c\r
+*  Revised:        $Date: 2009-03-10 17:01:56 -0700 (Tue, 10 Mar 2009) $\r
+*  Revision:       $Revision: 19372 $\r
+*  Author:         $Author: lfriedman $\r
+*\r
+*  Description:    This file supports the SimpliciTI input and output frame queues\r
+*\r
+*  Copyright 2007-2008 Texas Instruments Incorporated. All rights reserved.\r
+*\r
+*  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+*  the terms of a software license agreement between the user who downloaded the software,\r
+*  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+*  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+*  License. The License limits your use, and you acknowledge, that the Software may not be\r
+*  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+*  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+*  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+*  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+*  perform, display or sell this Software and/or its documentation for any purpose.\r
+*\r
+*  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+*  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+*  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+*  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+*  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+*  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+*  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+*  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+*  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+*\r
+*  Should you have any questions regarding your right to use this Software,\r
+*  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+\r
+/******************************************************************************\r
+ * INCLUDES\r
+ */\r
+#include <intrinsics.h>\r
+#include <string.h>\r
+#include "bsp.h"\r
+#include "mrfi.h"\r
+#include "nwk_types.h"\r
+#include "nwk.h"\r
+#include "nwk_frame.h"\r
+#include "nwk_QMgmt.h"\r
+#include "nwk_mgmt.h"     /* need offsets for poll frames */\r
+\r
+/******************************************************************************\r
+ * MACROS\r
+ */\r
+\r
+/******************************************************************************\r
+ * CONSTANTS AND DEFINES\r
+ */\r
+\r
+/******************************************************************************\r
+ * TYPEDEFS\r
+ */\r
+\r
+/******************************************************************************\r
+ * LOCAL VARIABLES\r
+ */\r
+\r
+#if SIZE_INFRAME_Q > 0\r
+static frameInfo_t sInFrameQ[SIZE_INFRAME_Q];\r
+#else\r
+static frameInfo_t  *sInFrameQ = NULL;\r
+#endif  /* SIZE_INFRAME_Q > 0 */\r
+\r
+static frameInfo_t sOutFrameQ[SIZE_OUTFRAME_Q];\r
+\r
+/******************************************************************************\r
+ * LOCAL FUNCTIONS\r
+ */\r
+\r
+/******************************************************************************\r
+ * GLOBAL VARIABLES\r
+ */\r
+\r
+/******************************************************************************\r
+ * GLOBAL FUNCTIONS\r
+ */\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_QInit\r
+ *\r
+ * @brief     Initialize the input and output frame queues to hold no packets.\r
+ *\r
+ * input parameters\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   void\r
+ */\r
+\r
+void nwk_QInit(void)\r
+{\r
+#if SIZE_INFRAME_Q > 0\r
+    memset(sInFrameQ, 0, sizeof(sInFrameQ));\r
+#endif  // SIZE_INFRAME_Q > 0\r
+    memset(sOutFrameQ, 0, sizeof(sOutFrameQ));\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_QfindSlot\r
+ *\r
+ * @brief       Finds a slot to use to retrieve the frame from the radio. It\r
+ *              uses a LRU cast-out scheme. It is possible that this routine\r
+ *              finds no slot. This can happen if the queue is of size 1 or 2\r
+ *              and the Rx interrupt occurs during a retrieval call from an\r
+ *              application. There are meta-states for frames as the application\r
+ *              looks for the oldest frame on the port being requested.\r
+ *\r
+ *              This routine is running in interrupt context.\r
+ *\r
+ * input parameters\r
+ * @param   which   - INQ or OUTQ to search\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return      Pointer to oldest available frame in the queue\r
+ */\r
+\r
+frameInfo_t *nwk_QfindSlot(uint8_t which)\r
+{\r
+    frameInfo_t *pFI, *oldest = 0, *newFI = 0;\r
+    uint8_t i, num, newOrder = 0, orderTest;\r
+\r
+    if (INQ == which)\r
+    {\r
+        pFI  = sInFrameQ;\r
+        num  = SIZE_INFRAME_Q;\r
+    }\r
+    else\r
+    {\r
+        pFI  = sOutFrameQ;\r
+        num  = SIZE_OUTFRAME_Q;\r
+    }\r
+\r
+    orderTest = num + 1;\r
+\r
+    for (i = 0; i < num; ++i, ++pFI)\r
+    {\r
+        /* if frame is available it's a candidate. */\r
+        if (pFI->fi_usage != FI_AVAILABLE)\r
+        {\r
+            if (INQ == which) /* TODO: do cast-out for Tx as well */\r
+            {\r
+\r
+                /* need to know the number of occupied slots so we know the age value\r
+                 * for the unoccupied slot (if there is one).\r
+                 */\r
+                newOrder++;\r
+\r
+                /* make sure nwk_retrieveFrame() is not processing this frame */\r
+                if (FI_INUSE_TRANSITION == pFI->fi_usage)\r
+                {\r
+                    continue;\r
+                }\r
+                /* is this frame older than any we've seen? */\r
+                if (orderTest > pFI->orderStamp)\r
+                {\r
+                    /* yes. */\r
+                    oldest    = pFI;\r
+                    orderTest = pFI->orderStamp;\r
+                }\r
+            }\r
+        }\r
+        else\r
+        {\r
+            if (OUTQ == which) /* TODO: do cast-out for Tx as well */\r
+            {\r
+                return pFI;\r
+            }\r
+            newFI = pFI;\r
+        }\r
+    }\r
+\r
+    /* did we find anything? */\r
+    if (!newFI)\r
+    {\r
+        /* queue was full. cast-out happens here...unless... */\r
+        if (!oldest)\r
+        {\r
+            /* This can happen if the queue is only of size 1 or 2 and all\r
+             * the frames are in transition when the Rx interrupt occurs.\r
+             */\r
+            return (frameInfo_t *)0;\r
+        }\r
+        newFI = oldest;\r
+        nwk_QadjustOrder(which, newFI->orderStamp);\r
+        newFI->orderStamp = i;\r
+    }\r
+    else\r
+    {\r
+        /* mark the available slot. */\r
+        newFI->orderStamp = ++newOrder;\r
+    }\r
+\r
+    return newFI;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_QadjustOrder\r
+ *\r
+ * @brief       Adjusts the age of everyone in the queue newer than the frame\r
+ *              being removed.\r
+ *\r
+ * input parameters\r
+ * @param   which   - INQ or OUTQ to adjust\r
+ * @param   stamp   - value of frame being removed\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return      void\r
+ */\r
+\r
+void nwk_QadjustOrder(uint8_t which, uint8_t stamp)\r
+{\r
+    frameInfo_t *pFI;\r
+    uint8_t i, num;\r
+    bspIState_t intState;\r
+\r
+    if (INQ == which)\r
+    {\r
+        pFI  = sInFrameQ;\r
+        num  = SIZE_INFRAME_Q;\r
+    }\r
+    else\r
+    {\r
+        /*    pFI  = sOutFrameQ;\r
+         *    num  = SIZE_OUTFRAME_Q; */\r
+        return;\r
+    }\r
+\r
+    BSP_ENTER_CRITICAL_SECTION(intState);\r
+\r
+    for (i = 0; i < num; ++i, ++pFI)\r
+    {\r
+        if ((pFI->fi_usage != FI_AVAILABLE) && (pFI->orderStamp > stamp))\r
+        {\r
+            pFI->orderStamp--;\r
+        }\r
+    }\r
+\r
+    BSP_EXIT_CRITICAL_SECTION(intState);\r
+\r
+    return;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_QfindOldest\r
+ *\r
+ * @brief       Look through frame queue and find the oldest available frame\r
+ *              in the context in question. Supports connection-based (user),\r
+ *              non-connection based (NWK applications), and the special case\r
+ *              of store-and-forward.\r
+ *\r
+ * input parameters\r
+ * @param   which      - INQ or OUTQ to adjust\r
+ * @param   rcvContext - context information for finding the oldest\r
+ * @param   usage      - normal usage or store-and-forward usage\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return      Pointer to frame that is the oldsest on the requested port, or\r
+ *              0 if there are none.\r
+ */\r
+\r
+frameInfo_t *nwk_QfindOldest(uint8_t which, rcvContext_t *rcv, uint8_t fi_usage)\r
+{\r
+    uint8_t i, oldest, num, port;\r
+    uint8_t uType, addr12Compare;\r
+    bspIState_t intState;\r
+    frameInfo_t *fPtr = 0, *wPtr;\r
+    connInfo_t  *pCInfo = 0;\r
+    uint8_t     *pAddr1, *pAddr2, *pAddr3 = 0;\r
+\r
+    if (INQ == which)\r
+    {\r
+        wPtr   = sInFrameQ;\r
+        num    = SIZE_INFRAME_Q;\r
+        oldest = SIZE_INFRAME_Q + 1;\r
+    }\r
+    else\r
+    {\r
+        /*    pFI  = sOutFrameQ;\r
+         *    num  = SIZE_OUTFRAME_Q; */\r
+        return 0;\r
+    }\r
+\r
+    if (RCV_APP_LID == rcv->type)\r
+    {\r
+        pCInfo = nwk_getConnInfo(rcv->t.lid);\r
+        if (!pCInfo)\r
+        {\r
+            return (frameInfo_t *)0;\r
+        }\r
+        port   = pCInfo->portRx;\r
+        pAddr2 = pCInfo->peerAddr;\r
+    }\r
+    else if (RCV_NWK_PORT == rcv->type)\r
+    {\r
+        port = rcv->t.port;\r
+    }\r
+#ifdef ACCESS_POINT\r
+    else if (RCV_RAW_POLL_FRAME == rcv->type)\r
+    {\r
+        port   = *(MRFI_P_PAYLOAD(rcv->t.pkt) + F_APP_PAYLOAD_OS + M_POLL_PORT_OS);\r
+        pAddr2 = MRFI_P_SRC_ADDR(rcv->t.pkt);\r
+        pAddr3 = MRFI_P_PAYLOAD(rcv->t.pkt) + F_APP_PAYLOAD_OS + M_POLL_ADDR_OS;\r
+    }\r
+#endif\r
+    else\r
+    {\r
+        return (frameInfo_t *)0;\r
+    }\r
+\r
+    uType = (USAGE_NORMAL == fi_usage) ? FI_INUSE_UNTIL_DEL : FI_INUSE_UNTIL_FWD;\r
+\r
+    for (i = 0; i < num; ++i, ++wPtr)\r
+    {\r
+\r
+        BSP_ENTER_CRITICAL_SECTION(intState);    /* protect the frame states */\r
+\r
+        /* only check entries in use and waiting for this port */\r
+        if (uType == wPtr->fi_usage)\r
+        {\r
+            wPtr->fi_usage = FI_INUSE_TRANSITION;\r
+\r
+            BSP_EXIT_CRITICAL_SECTION(intState); /* release hold */\r
+            /* message sent to this device? */\r
+            if (GET_FROM_FRAME(MRFI_P_PAYLOAD(&wPtr->mrfiPkt), F_PORT_OS) == port)\r
+            {\r
+                /* Port matches. If the port of interest is a NWK applicaiton we're a\r
+                 * match...the NWK applications are not connection-based. If it is a\r
+                 * NWK application we need to check the source address for disambiguation.\r
+                 * Also need to check source address if it's a raw frame lookup (S&F frame)\r
+                 */\r
+                if (RCV_APP_LID == rcv->type)\r
+                {\r
+                    if (SMPL_PORT_USER_BCAST == port)\r
+                    {\r
+                        /* guarantee a match... */\r
+                        pAddr1 = pCInfo->peerAddr;\r
+                    }\r
+                    else\r
+                    {\r
+                        pAddr1 = MRFI_P_SRC_ADDR(&wPtr->mrfiPkt);\r
+                    }\r
+                }\r
+#ifdef ACCESS_POINT\r
+                else if (RCV_RAW_POLL_FRAME == rcv->type)\r
+                {\r
+                    pAddr1 = MRFI_P_DST_ADDR(&wPtr->mrfiPkt);\r
+                }\r
+#endif\r
+\r
+                addr12Compare = memcmp(pAddr1, pAddr2, NET_ADDR_SIZE);\r
+                if ((RCV_NWK_PORT == rcv->type) ||\r
+                    (!pAddr3 && !addr12Compare) ||\r
+                    (pAddr3 && !memcmp(pAddr3, MRFI_P_SRC_ADDR(&wPtr->mrfiPkt), NET_ADDR_SIZE))\r
+                    )\r
+                {\r
+                    if (wPtr->orderStamp < oldest)\r
+                    {\r
+                        if (fPtr)\r
+                        {\r
+                            /* restore previous oldest one */\r
+                            fPtr->fi_usage = uType;\r
+                        }\r
+                        oldest = wPtr->orderStamp;\r
+                        fPtr   = wPtr;\r
+                        continue;\r
+                    }\r
+                    else\r
+                    {\r
+                        /* not oldest. restore state */\r
+                        wPtr->fi_usage = uType;\r
+                    }\r
+                }\r
+                else\r
+                {\r
+                    /* not a match. restore state */\r
+                    wPtr->fi_usage = uType;\r
+                }\r
+            }\r
+            else\r
+            {\r
+                /* wrong port. restore state */\r
+                wPtr->fi_usage = uType;\r
+            }\r
+        }\r
+        else\r
+        {\r
+            BSP_EXIT_CRITICAL_SECTION(intState);\r
+        }\r
+    }\r
+\r
+    return fPtr;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_getQ\r
+ *\r
+ * @brief       Get location of teh specified frame queue.\r
+ *\r
+ * input parameters\r
+ * @param   which   - INQ or OUTQ to get\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return      Pointer to frame queue\r
+ */\r
+\r
+frameInfo_t *nwk_getQ(uint8_t which)\r
+{\r
+    return (INQ == which) ? sInFrameQ : sOutFrameQ;\r
+}\r
+\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/simpliciti/Components/nwk/nwk_QMgmt.h b/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/simpliciti/Components/nwk/nwk_QMgmt.h
new file mode 100755 (executable)
index 0000000..c66e141
--- /dev/null
@@ -0,0 +1,54 @@
+/**************************************************************************************************\r
+*  Filename:       nwk_QMgmt.h\r
+*  Revised:        $Date: 2009-01-17 15:14:16 -0800 (Sat, 17 Jan 2009) $\r
+*  Revision:       $Revision: 18788 $\r
+*  Author:         $Author: rlord $\r
+*\r
+*  Description:    This header file supports the SimpliciTI input and output frame queues.\r
+*\r
+*  Copyright 2007-2009 Texas Instruments Incorporated. All rights reserved.\r
+*\r
+*  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+*  the terms of a software license agreement between the user who downloaded the software,\r
+*  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+*  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+*  License. The License limits your use, and you acknowledge, that the Software may not be\r
+*  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+*  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+*  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+*  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+*  perform, display or sell this Software and/or its documentation for any purpose.\r
+*\r
+*  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+*  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+*  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+*  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+*  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+*  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+*  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+*  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+*  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+*\r
+*  Should you have any questions regarding your right to use this Software,\r
+*  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+#ifndef NWK_QMGMT_H\r
+#define NWK_QMGMT_H\r
+\r
+\r
+#define  INQ   1\r
+#define  OUTQ  2\r
+\r
+#define  USAGE_NORMAL  1\r
+#define  USAGE_FWD     2\r
+\r
+/* prototypes */\r
+void nwk_QInit(void);\r
+\r
+frameInfo_t *nwk_QfindSlot(uint8_t);\r
+void nwk_QadjustOrder(uint8_t, uint8_t);\r
+frameInfo_t *nwk_QfindOldest(uint8_t, rcvContext_t *, uint8_t);\r
+frameInfo_t *nwk_getQ(uint8_t);\r
+\r
+#endif  /* NWK_QMGMT_H */\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/simpliciti/Components/nwk/nwk_api.c b/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/simpliciti/Components/nwk/nwk_api.c
new file mode 100755 (executable)
index 0000000..caa6093
--- /dev/null
@@ -0,0 +1,876 @@
+/**************************************************************************************************\r
+*  Filename:       nwk_api.c\r
+*  Revised:        $Date: 2009-01-28 18:27:38 -0800 (Wed, 28 Jan 2009) $\r
+*  Revision:       $Revision: 18875 $\r
+*  Author:         $Author: lfriedman $\r
+*\r
+*  Description:    This file supports the SimpliciTI appliction layer API.\r
+*\r
+*  Copyright 2007-2009 Texas Instruments Incorporated. All rights reserved.\r
+*\r
+*  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+*  the terms of a software license agreement between the user who downloaded the software,\r
+*  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+*  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+*  License. The License limits your use, and you acknowledge, that the Software may not be\r
+*  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+*  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+*  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+*  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+*  perform, display or sell this Software and/or its documentation for any purpose.\r
+*\r
+*  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+*  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+*  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+*  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+*  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+*  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+*  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+*  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+*  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+*\r
+*  Should you have any questions regarding your right to use this Software,\r
+*  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+/******************************************************************************\r
+ * INCLUDES\r
+ */\r
+\r
+#include <string.h>\r
+#include "bsp.h"\r
+#include "mrfi.h"\r
+#include "nwk_types.h"\r
+#include "nwk_api.h"\r
+#include "nwk_frame.h"\r
+#include "nwk.h"\r
+#include "nwk_app.h"\r
+#include "mrfi.h"\r
+#include "nwk_globals.h"\r
+#include "nwk_freq.h"\r
+\r
+/******************************************************************************\r
+ * MACROS\r
+ */\r
+\r
+/******************************************************************************\r
+ * CONSTANTS AND DEFINES\r
+ */\r
+\r
+/* These defines are in support an application listening for a link frame to\r
+ * terminate after some amount of time. The intention is that this guard be\r
+ * the exception. The intention of the SimpliciTI design is that the\r
+ * temporal contiguity between the listen and the reception of the link frame\r
+ * from the peer be very tight. The SMPL_LinkListen() should be termninated\r
+ * by the reception of the link frame. But in case it does not receive the frame\r
+ * the support below allows intervention by the application.\r
+ */\r
+\r
+/* The intention is for user to modify just the following single value */\r
+#define LINKLISTEN_MILLISECONDS_2_WAIT    (5000)\r
+\r
+#define LINKLISTEN_POLL_PERIOD_MS         (10)\r
+#define LINKLISTEN_POLL_COUNT             ((LINKLISTEN_MILLISECONDS_2_WAIT) / \\r
+                                           (LINKLISTEN_POLL_PERIOD_MS))\r
+\r
+/******************************************************************************\r
+ * TYPEDEFS\r
+ */\r
+\r
+/******************************************************************************\r
+ * LOCAL VARIABLES\r
+ */\r
+// [BM] Workaround to enable multiple stack restarts\r
+// static uint8_t sInit_done = 0;\r
+uint8_t sInit_done = 0;\r
+\r
+/******************************************************************************\r
+ * LOCAL FUNCTIONS\r
+ */\r
+static uint8_t ioctlPreInitAccessIsOK(ioctlObject_t);\r
+\r
+/******************************************************************************\r
+ * GLOBAL VARIABLES\r
+ */\r
+\r
+/******************************************************************************\r
+ * GLOBAL FUNCTIONS\r
+ */\r
+\r
+/***********************************************************************************\r
+ * @fn          SMPL_Init\r
+ *\r
+ * @brief       Initialize the SimpliciTI stack.\r
+ *\r
+ * input parameters\r
+ * @param   f  - Pointer to call back function. Function called by NWK when\r
+ *               user application frame received. The callback is done in the\r
+ *               ISR thread. Argument is Link ID associated with frame. Function\r
+ *               returns 0 if frame is to be kept by NWK, otherwise 1. Frame\r
+ *               should be kept if application will do a SMPL_Receive() in the\r
+ *               user thread (recommended). Pointer may be NULL.\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   Status of operation:\r
+ *             SMPL_SUCCESS\r
+ *             SMPL_NO_JOIN     No Join reply. AP possibly not yet up.\r
+ *             SMPL_NO_CHANNEL  Only if Frequency Agility enabled. Channel scan\r
+ *                              failed. AP possibly not yet up.\r
+ */\r
+\r
+smplStatus_t SMPL_Init(uint8_t (*f)(linkID_t))\r
+{\r
+    smplStatus_t rc;\r
+\r
+    if (!sInit_done)\r
+    {\r
+        /* set up radio. */\r
+        MRFI_Init();\r
+\r
+        /* initialize network */\r
+        if ((rc = nwk_nwkInit(f)) != SMPL_SUCCESS)\r
+        {\r
+            return rc;\r
+        }\r
+\r
+        MRFI_WakeUp();\r
+#if defined(FREQUENCY_AGILITY)\r
+        {\r
+            freqEntry_t chan;\r
+\r
+            chan.logicalChan = 0;\r
+            /* ok to set default channel explicitly now that MRFI initialized. */\r
+            nwk_setChannel(&chan);\r
+        }\r
+#endif\r
+        /* don't turn Rx on if we're an end device that isn't always on. */\r
+#if !defined(END_DEVICE)\r
+        MRFI_RxOn();\r
+#endif\r
+\r
+#if defined(END_DEVICE)\r
+        /* All except End Devices are in promiscuous mode */\r
+        MRFI_SetRxAddrFilter((uint8_t *)nwk_getMyAddress());\r
+        MRFI_EnableRxAddrFilter();\r
+#endif\r
+    }\r
+    sInit_done = 1;\r
+\r
+    /* Join. if no AP or Join fails that status is returned. */\r
+    rc = nwk_join();\r
+\r
+    return rc;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          SMPL_LinkListen\r
+ *\r
+ * @brief       Listen for a link frame from a 'client' device.\r
+ *\r
+ * input parameters\r
+ *\r
+ * output parameters\r
+ * @param   linkID     - pointer to Link ID to be used by application to\r
+ *                       read and write to the linked peer.\r
+ *\r
+ * @return   status of operation.\r
+ *             SMPL_SUCCESS\r
+ *             SMPL_TIMEOUT  No link frame received during listen interval.\r
+ *                            Interval set in #defines above. linkID not valid.\r
+ *\r
+ */\r
+\r
+smplStatus_t SMPL_LinkListen(linkID_t *linkID)\r
+{\r
+    uint8_t radioState = MRFI_GetRadioState();\r
+    uint16_t i;\r
+    linkID_t locLinkID;\r
+\r
+    /* Set the context. We want to reject any link frames received if\r
+     * we're not listening. For example if we're an AP we are in\r
+     * promiscuous mode and we'll see any broadcast link frames.\r
+     */\r
+    nwk_setListenContext(LINK_LISTEN_ON);\r
+\r
+    NWK_CHECK_FOR_SETRX(radioState);\r
+\r
+    for (i = 0; i < LINKLISTEN_POLL_COUNT; ++i)\r
+    {\r
+        /* check the semaphore. local port is assigned when the reply is sent. */\r
+        if ((locLinkID = nwk_getLocalLinkID()))\r
+        {\r
+            break;\r
+        }\r
+        NWK_DELAY(LINKLISTEN_POLL_PERIOD_MS);\r
+    }\r
+\r
+    NWK_CHECK_FOR_RESTORE_STATE(radioState);\r
+\r
+    /* If the listen is terminated without hearing a message and setting a\r
+     * link ID the listen context must be explicitly turned off.\r
+     */\r
+    if (!(locLinkID))\r
+    {\r
+        nwk_setListenContext(LINK_LISTEN_OFF);\r
+        return SMPL_TIMEOUT;\r
+    }\r
+\r
+    *linkID = locLinkID;\r
+\r
+    return SMPL_SUCCESS;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          SMPL_Send\r
+ *\r
+ * @brief       Send a message to a peer application. Old API kept for\r
+ *              backward compatibility. Calls the new SMPL_SendOpt() with\r
+ *              no options.\r
+ *\r
+ * input parameters\r
+ * @param   lid     - Link ID (port) from application\r
+ * @param   msg     - pointer to message from app to be sent\r
+ * @param   len     - length of enclosed message\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   Status of operation. On a filaure the frame buffer is discarded\r
+ *           and the Send call must be redone by the app.\r
+ *             SMPL_SUCCESS\r
+ *             SMPL_BAD_PARAM    No valid Connection Table entry for Link ID\r
+ *                               Data in Connection Table entry bad\r
+ *                               No message or message too long\r
+ *             SMPL_NOMEM        No room in output frame queue\r
+ *             SMPL_TX_CCA_FAIL  CCA failure.\r
+ */\r
+\r
+smplStatus_t SMPL_Send(linkID_t lid, uint8_t *msg, uint8_t len)\r
+{\r
+    return SMPL_SendOpt(lid, msg, len, SMPL_TXOPTION_NONE);\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          SMPL_SendOpt\r
+ *\r
+ * @brief       Send a message to a peer application.\r
+ *\r
+ * input parameters\r
+ * @param   lid     - Link ID (port) from application\r
+ * @param   msg     - pointer to message from app to be sent\r
+ * @param   len     - length of enclosed message\r
+ * @param   options - Transmit options (bit map)\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   Status of operation. On a filaure the frame buffer is discarded\r
+ *           and the Send call must be redone by the app.\r
+ *             SMPL_SUCCESS\r
+ *             SMPL_BAD_PARAM    No valid Connection Table entry for Link ID\r
+ *                               Data in Connection Table entry bad\r
+ *                               No message or message too long\r
+ *             SMPL_NOMEM        No room in output frame queue\r
+ *             SMPL_TX_CCA_FAIL  CCA failure.\r
+ *             SMPL_NO_ACK       If application auto acknowledgement enabled\r
+ *                               and no acknowledgement is received\r
+ */\r
+\r
+smplStatus_t SMPL_SendOpt(linkID_t lid, uint8_t *msg, uint8_t len, txOpt_t options)\r
+{\r
+    frameInfo_t  *pFrameInfo;\r
+    connInfo_t   *pCInfo     = nwk_getConnInfo(lid);\r
+    smplStatus_t rc         = SMPL_BAD_PARAM;\r
+    uint8_t radioState = MRFI_GetRadioState();\r
+    uint8_t ackreq     = 0;\r
+\r
+#if defined(ACCESS_POINT)\r
+    uint8_t loc;\r
+#endif\r
+\r
+    /* we have the connection info for this Link ID. make sure it is valid. */\r
+    if (!pCInfo || ((rc = nwk_checkConnInfo(pCInfo, CHK_TX)) != SMPL_SUCCESS))\r
+    {\r
+        return rc;\r
+    }\r
+\r
+    /* parameter sanity check... */\r
+    if (!msg || (len > MAX_APP_PAYLOAD))\r
+    {\r
+        return rc;\r
+    }\r
+\r
+    /* Build an outgoing message frame destined for the port from the\r
+     * connection info using the destination address also from the\r
+     * connection info.\r
+     */\r
+    if (SMPL_TXOPTION_NONE == options)\r
+    {\r
+        pFrameInfo = nwk_buildFrame(pCInfo->portTx, msg, len, pCInfo->hops2target);\r
+    }\r
+#if defined(APP_AUTO_ACK)\r
+    else if (options & SMPL_TXOPTION_ACKREQ)\r
+    {\r
+        if (SMPL_LINKID_USER_UUD != lid)\r
+        {\r
+            pFrameInfo = nwk_buildAckReqFrame(pCInfo->portTx, msg, len, pCInfo->hops2target,\r
+                                              &pCInfo->ackTID);\r
+            ackreq     = 1;\r
+        }\r
+        else\r
+        {\r
+            /* can't request an ack on the UUD link ID */\r
+            return SMPL_BAD_PARAM;\r
+        }\r
+    }\r
+#endif  /* APP_AUTO_ACK */\r
+    else\r
+    {\r
+        return SMPL_BAD_PARAM;\r
+    }\r
+\r
+    if (!pFrameInfo)\r
+    {\r
+        return SMPL_NOMEM;\r
+    }\r
+    memcpy(MRFI_P_DST_ADDR(&pFrameInfo->mrfiPkt), pCInfo->peerAddr, NET_ADDR_SIZE);\r
+\r
+#if defined(SMPL_SECURE)\r
+    {\r
+        uint32_t *pUL = 0;\r
+\r
+        if (pCInfo->thisLinkID != SMPL_LINKID_USER_UUD)\r
+        {\r
+            pUL = &pCInfo->connTxCTR;\r
+        }\r
+        nwk_setSecureFrame(&pFrameInfo->mrfiPkt, len, pUL);\r
+    }\r
+#endif  /* SMPL_SECURE */\r
+\r
+#if defined(ACCESS_POINT)\r
+\r
+    /* If we are an AP trying to send to a polling device, don't do it.\r
+     * See if the target is a store-and-forward client.\r
+     */\r
+    if (nwk_isSandFClient(MRFI_P_DST_ADDR(&pFrameInfo->mrfiPkt), &loc))\r
+    {\r
+        pFrameInfo->fi_usage = FI_INUSE_UNTIL_FWD;\r
+        return SMPL_SUCCESS;\r
+    }\r
+    else\r
+#endif  /* ACCESS_POINT */\r
+    {\r
+        rc = nwk_sendFrame(pFrameInfo, MRFI_TX_TYPE_CCA);\r
+    }\r
+\r
+#if !defined(APP_AUTO_ACK)\r
+    /* save a little code space with this #if */\r
+    (void) ackreq;  /* keep compiler happy */\r
+    return rc;\r
+#else\r
+    /* we're done if the send failed or no ack requested. */\r
+    if (SMPL_SUCCESS != rc || !ackreq)\r
+    {\r
+        return rc;\r
+    }\r
+\r
+    NWK_CHECK_FOR_SETRX(radioState);\r
+    NWK_REPLY_DELAY();\r
+    NWK_CHECK_FOR_RESTORE_STATE(radioState);\r
+\r
+    {\r
+        bspIState_t intState;\r
+\r
+        /* If the saved TID hasn't been reset then we never got the ack. */\r
+        BSP_ENTER_CRITICAL_SECTION(intState);\r
+        if (pCInfo->ackTID)\r
+        {\r
+            pCInfo->ackTID = 0;\r
+            rc = SMPL_NO_ACK;\r
+        }\r
+        BSP_EXIT_CRITICAL_SECTION(intState);\r
+    }\r
+\r
+    return rc;\r
+#endif  /* APP_AUTO_ACK */\r
+}\r
+\r
+/**************************************************************************************\r
+ * @fn          SMPL_Receive\r
+ *\r
+ * @brief       Receive a message from a peer application.\r
+ *\r
+ * input parameters\r
+ * @param   lid     - Link ID (port) from application\r
+ *\r
+ *\r
+ * output parameters\r
+ * @param   msg     - pointer to where received message should be copied.\r
+ *                    buffer should be of size == MAX_APP_PAYLOAD\r
+ * @param   len     - pointer to receive length of received message\r
+ *\r
+ * @return    Status of operation.\r
+ *            Caller should not use the value returned in 'len' to decide\r
+ *            whether there is a frame or not. It could be useful to the\r
+ *            Caller to distinguish between no frame and a frame with no data.\r
+ *            For example, in the polling case a frame with no application payload\r
+ *            is the way the AP conveys that there are no frames waiting.\r
+ *\r
+ *              SMPL_SUCCESS\r
+ *\r
+ *              SMPL_BAD_PARAM  No valid Connection Table entry for Link ID\r
+ *                              Data in Connection Table entry bad\r
+ *              SMPL_NO_FRAME   No frame received.\r
+ *              SMPL_NO_PAYLOAD Frame received with no payload (not necessarily\r
+ *                              an error and could be deduced by application\r
+ *                              because the returned length will be 0)\r
+ *\r
+ *            Polling device only:\r
+ *\r
+ *              SMPL_TIMEOUT        No response from Access Point\r
+ *              SMPL_NO_AP_ADDRESS  Access Point address unknown\r
+ *              SMPL_TX_CCA_FAIL    Could not send poll frame\r
+ *              SMPL_NOMEM          No memory in output frame queue\r
+ *              SMPL_NO_CHANNEL     Frequency Agility enabled and could not find channel\r
+ */\r
+\r
+smplStatus_t SMPL_Receive(linkID_t lid, uint8_t *msg, uint8_t *len)\r
+{\r
+    connInfo_t  *pCInfo = nwk_getConnInfo(lid);\r
+    smplStatus_t rc = SMPL_BAD_PARAM;\r
+    rcvContext_t rcv;\r
+\r
+    if (!pCInfo || ((rc = nwk_checkConnInfo(pCInfo, CHK_RX)) != SMPL_SUCCESS))\r
+    {\r
+        return rc;\r
+    }\r
+\r
+    rcv.type  = RCV_APP_LID;\r
+    rcv.t.lid = lid;\r
+\r
+#if defined(RX_POLLS)\r
+    {\r
+        uint8_t numChans  = 1;\r
+#    if defined(FREQUENCY_AGILITY)\r
+        freqEntry_t chans[NWK_FREQ_TBL_SIZE];\r
+        uint8_t scannedB4 = 0;\r
+#    endif\r
+\r
+        do\r
+        {\r
+            uint8_t radioState = MRFI_GetRadioState();\r
+\r
+            /* I'm polling. Do the poll to stimulate the sending of a frame. If the\r
+             * frame has application length of 0 it means there were no frames.  If\r
+             * no reply is received infer that the channel is changed. We then need\r
+             * to scan and then retry the poll on each channel returned.\r
+             */\r
+            if (SMPL_SUCCESS != (rc = nwk_poll(pCInfo->portRx, pCInfo->peerAddr)))\r
+            {\r
+                /* for some reason couldn't send the poll out. */\r
+                return rc;\r
+            }\r
+\r
+            /* do this before code block below which may reset it. */\r
+            numChans--;\r
+\r
+            /* Wait until there's a frame. if the len is 0 then return SMPL_NO_FRAME\r
+             * to the caller. In the poll case the AP always sends something.\r
+             */\r
+            NWK_CHECK_FOR_SETRX(radioState);\r
+            NWK_REPLY_DELAY();\r
+            NWK_CHECK_FOR_RESTORE_STATE(radioState);\r
+\r
+            /* TODO: deal with pending */\r
+            rc = nwk_retrieveFrame(&rcv, msg, len, 0, 0);\r
+\r
+#    if defined(FREQUENCY_AGILITY)\r
+            if (SMPL_SUCCESS == rc)\r
+            {\r
+                /* we received something... */\r
+                return (*len) ? SMPL_SUCCESS : SMPL_NO_PAYLOAD;\r
+            }\r
+\r
+            /* No reply. scan for other channel(s) if we haven't already. Then set\r
+             * one and try again.\r
+             */\r
+            if (!scannedB4)\r
+            {\r
+                numChans  = nwk_scanForChannels(chans);\r
+                scannedB4 = 1;\r
+            }\r
+            if (numChans)\r
+            {\r
+                nwk_setChannel(&chans[numChans - 1]);\r
+            }\r
+#    else /*  FREQUENCY_AGILITY */\r
+            return (*len) ? rc : ((SMPL_SUCCESS == rc) ? SMPL_NO_PAYLOAD : SMPL_TIMEOUT);\r
+#    endif\r
+        } while (numChans);\r
+    }\r
+\r
+#    if defined(FREQUENCY_AGILITY)\r
+    return SMPL_NO_CHANNEL;\r
+#    endif\r
+\r
+#else     /* RX_POLLS */\r
+    return nwk_retrieveFrame(&rcv, msg, len, 0, 0);\r
+#endif  /* RX_POLLS */\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          SMPL_Link\r
+ *\r
+ * @brief       Link to a peer.\r
+ *\r
+ * input parameters\r
+ *\r
+ * output parameters\r
+ * @param   lid     - pointer to where we should write the link ID to which the\r
+ *                    application will read and write.\r
+ *\r
+ * @return   Status of operation.\r
+ *             SMPL_SUCCESS\r
+ *             SMPL_NOMEM         No room to allocate local Rx port, no more\r
+ *                                room in Connection Table, or no room in\r
+ *                                output frame queue.\r
+ *             SMPL_NO_LINK       No reply frame during wait window.\r
+ *             SMPL_TX_CCA_FAIL   Could not send Link frame.\r
+ */\r
+\r
+smplStatus_t SMPL_Link(linkID_t *lid)\r
+{\r
+    return nwk_link(lid);\r
+}\r
+\r
+#if defined(EXTENDED_API)\r
+\r
+/**************************************************************************************\r
+ * @fn          SMPL_Unlink\r
+ *\r
+ * @brief       Tear down connection to a peer.\r
+ *\r
+ * input parameters\r
+ * @param   lid     - Link ID whose connection is to be terminated.\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   Status of operation. The Connection Table entry for the Link ID\r
+ *           is always freed successfuly. The returned status value is the\r
+ *           status of the _peer's_ connection tear-down as a result of the\r
+ *           message sent here.\r
+ *           SMPL_SUCCESS         Local and remote connection destroyed.\r
+ *           SMPL_BAD_PARAM       No local connection table entry for this Link ID\r
+ *           SMPL_TIMEOUT         No reply from peer.\r
+ *           SMPL_NO_PEER_UNLINK  Peer did not have a Connection Table entry for me.\r
+ */\r
+\r
+smplStatus_t SMPL_Unlink(linkID_t lid)\r
+{\r
+    return nwk_unlink(lid);\r
+}\r
+\r
+/**************************************************************************************\r
+ * @fn          SMPL_Ping\r
+ *\r
+ * @brief       Ping a peer. Synchronous call. Although a link ID is used it is the\r
+ *              NWK Ping application that is pinged, not the peer of this Link ID. The\r
+ *              peer is not expected to be the responder to the frame sent from here.\r
+ *              This API is a proxy for a real ping since the application doesn't\r
+ *              have direct access to SimpliciTI device addresses. Kind of hokey but a\r
+ *              useful keep-alive mechanism without having to support it with\r
+ *              user application service.\r
+ *\r
+ * input parameters\r
+ * @param   lid  - The link ID whose peer device address is used to direct the NWK Ping\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   Status of operation.\r
+ */\r
+\r
+smplStatus_t SMPL_Ping(linkID_t lid)\r
+{\r
+    return nwk_ping(lid);\r
+}\r
+\r
+/**************************************************************************************\r
+ * @fn          SMPL_Commission\r
+ *\r
+ * @brief       Commission a connection.\r
+ *\r
+ * input parameters\r
+ * @param   peerAddr  - Pointer to address of the peer for this connection\r
+ * @param    locPort  - Port on which to listen for messages from the peer\r
+ * @param    rmtPort  - Port on which to send messages to the peer.\r
+ * @param        lid  - Pointer to Link ID object. If content of location is\r
+ *                      non-zero on input the value is placed in the Connection\r
+ *                      object.\r
+ *\r
+ * output parameters\r
+ * @param        lid  - Pointer to Link ID object. If content of location is zero\r
+ *                      on input the value in the Connection object is stored there.\r
+ *\r
+ * @return   SMPL_SUCCESS\r
+ *           SMPL_NOMEM     - No room left in Connection table.\r
+ *           SMPL_BAD_PARAM - A pointer to a Link object was not supplied.\r
+ */\r
+\r
+smplStatus_t SMPL_Commission(addr_t *peerAddr, uint8_t locPort, uint8_t rmtPort, linkID_t *lid)\r
+{\r
+    connInfo_t   *pCInfo = nwk_getNextConnection();\r
+    smplStatus_t rc     = SMPL_BAD_PARAM;\r
+\r
+    do {\r
+        if (pCInfo)\r
+        {\r
+            /* sanity checks... */\r
+\r
+            /* Check port info. */\r
+            if ((locPort > SMPL_PORT_STATIC_MAX) ||\r
+                (locPort < (SMPL_PORT_STATIC_MAX - PORT_USER_STATIC_NUM + 1)))\r
+            {\r
+                continue;\r
+            }\r
+\r
+            if ((rmtPort > SMPL_PORT_STATIC_MAX) ||\r
+                (rmtPort < (SMPL_PORT_STATIC_MAX - PORT_USER_STATIC_NUM + 1)))\r
+            {\r
+                continue;\r
+            }\r
+\r
+            /* Must supply a pointer to the Link ID object */\r
+            if (!lid)\r
+            {\r
+                /* No Link ID pointer supplied */\r
+                continue;\r
+            }\r
+\r
+            /* we're sane */\r
+\r
+            /* Use the value generated at connection object assign time. */\r
+            *lid = pCInfo->thisLinkID;\r
+\r
+            /* store peer's address */\r
+            memcpy(pCInfo->peerAddr, peerAddr, NET_ADDR_SIZE);\r
+\r
+            /* store port info */\r
+            pCInfo->portRx = locPort;\r
+            pCInfo->portTx = rmtPort;\r
+\r
+            pCInfo->hops2target = MAX_HOPS;\r
+\r
+            rc = SMPL_SUCCESS;\r
+        }\r
+        else\r
+        {\r
+            /* No room in Connection table */\r
+            rc = SMPL_NOMEM;\r
+        }\r
+    } while (0);\r
+\r
+    if ((SMPL_SUCCESS != rc) && pCInfo)\r
+    {\r
+        nwk_freeConnection(pCInfo);\r
+    }\r
+\r
+    return rc;\r
+}\r
+\r
+#endif   /* EXTENDED_API */\r
+\r
+/******************************************************************************\r
+ * @fn          SMPL_Ioctl\r
+ *\r
+ * @brief       This routine supplies the SimpliciTI IOCTL support.\r
+ *\r
+ * input parameters\r
+ * @param   object   - The IOCTL target object\r
+ * @param   action   - The IOCTL target action on the object\r
+ * @param   val      - pointer to value. exact forn depends on object type.\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   Status of action. Value depends on object, action, and result.\r
+ *\r
+ *           SMPL_BAD_PARAM is returned if this API is called before\r
+ *                          initialization and the object is not one of\r
+ *                          the valid exceptions.\r
+ */\r
+\r
+smplStatus_t SMPL_Ioctl(ioctlObject_t object, ioctlAction_t action, void *val)\r
+{\r
+    smplStatus_t rc;\r
+\r
+    /* if init hasn't occurred see if access is still valid */\r
+    if (!sInit_done && !ioctlPreInitAccessIsOK(object))\r
+    {\r
+        return SMPL_BAD_PARAM;\r
+    }\r
+\r
+    switch (object)\r
+    {\r
+#if defined(EXTENDED_API)\r
+        case IOCTL_OBJ_TOKEN:\r
+        {\r
+            ioctlToken_t *t = (ioctlToken_t *)val;\r
+\r
+            rc = SMPL_SUCCESS;\r
+            if (TT_LINK == t->tokenType)\r
+            {\r
+                if (IOCTL_ACT_SET == action)\r
+                {\r
+                    nwk_setLinkToken(t->token.linkToken);\r
+                }\r
+                else if (IOCTL_ACT_GET == action)\r
+                {\r
+                    nwk_getLinkToken(&t->token.linkToken);\r
+                }\r
+                else\r
+                {\r
+                    rc = SMPL_BAD_PARAM;\r
+                }\r
+            }\r
+            else if (TT_JOIN == t->tokenType)\r
+            {\r
+                if (IOCTL_ACT_SET == action)\r
+                {\r
+                    nwk_setJoinToken(t->token.joinToken);\r
+                }\r
+                else if (IOCTL_ACT_GET == action)\r
+                {\r
+                    nwk_getJoinToken(&t->token.joinToken);\r
+                }\r
+                else\r
+                {\r
+                    rc = SMPL_BAD_PARAM;\r
+                }\r
+            }\r
+            else\r
+            {\r
+                rc = SMPL_BAD_PARAM;\r
+            }\r
+        }\r
+        break;\r
+\r
+        case IOCTL_OBJ_NVOBJ:\r
+            rc = nwk_NVObj(action, (ioctlNVObj_t *)val);\r
+            break;\r
+#endif  /* EXTENDED_API */\r
+\r
+        case IOCTL_OBJ_CONNOBJ:\r
+            rc = nwk_connectionControl(action, val);\r
+            break;\r
+\r
+        case IOCTL_OBJ_ADDR:\r
+            if ((IOCTL_ACT_GET == action) || (IOCTL_ACT_SET == action))\r
+            {\r
+                rc = nwk_deviceAddress(action, (addr_t *)val);\r
+            }\r
+            else\r
+            {\r
+                rc = SMPL_BAD_PARAM;\r
+            }\r
+            break;\r
+\r
+        case IOCTL_OBJ_RAW_IO:\r
+            if (IOCTL_ACT_WRITE == action)\r
+            {\r
+                rc = nwk_rawSend((ioctlRawSend_t *)val);\r
+            }\r
+            else if (IOCTL_ACT_READ == action)\r
+            {\r
+                rc = nwk_rawReceive((ioctlRawReceive_t *)val);\r
+            }\r
+            else\r
+            {\r
+                rc = SMPL_BAD_PARAM;\r
+            }\r
+            break;\r
+\r
+        case IOCTL_OBJ_RADIO:\r
+            rc = nwk_radioControl(action, val);\r
+            break;\r
+\r
+#if defined(ACCESS_POINT)\r
+        case IOCTL_OBJ_AP_JOIN:\r
+            rc = nwk_joinContext(action);\r
+            break;\r
+#endif\r
+#if defined(FREQUENCY_AGILITY)\r
+        case IOCTL_OBJ_FREQ:\r
+            rc = nwk_freqControl(action, val);\r
+            break;\r
+#endif\r
+        case IOCTL_OBJ_FWVER:\r
+            if (IOCTL_ACT_GET == action)\r
+            {\r
+                memcpy(val, nwk_getFWVersion(), SMPL_FWVERSION_SIZE);\r
+                rc = SMPL_SUCCESS;\r
+            }\r
+            else\r
+            {\r
+                rc = SMPL_BAD_PARAM;\r
+            }\r
+            break;\r
+\r
+        case IOCTL_OBJ_PROTOVER:\r
+            if (IOCTL_ACT_GET == action)\r
+            {\r
+                *((uint8_t *)val) = nwk_getProtocolVersion();\r
+                rc = SMPL_SUCCESS;\r
+            }\r
+            else\r
+            {\r
+                rc = SMPL_BAD_PARAM;\r
+            }\r
+            break;\r
+\r
+        default:\r
+            rc = SMPL_BAD_PARAM;\r
+            break;\r
+    }\r
+\r
+    return rc;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          ioctlPreInitAccessIsOK\r
+ *\r
+ * @brief       Is the request legal yet? Most requests are not legal before\r
+ *              SMPL_Init().\r
+ *\r
+ * input parameters\r
+ * @param   object   - The IOCTL target object\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   Returns non-zero if request should be honored for further\r
+ *           processing, otherwise returns 0. This function does not\r
+ *           determine of the object-action pair are valid. It only knows\r
+ *           about exceptions, i.e., those that are valid before the\r
+ *           SMPL_Init() call.\r
+ *\r
+ */\r
+\r
+static uint8_t ioctlPreInitAccessIsOK(ioctlObject_t object)\r
+{\r
+    uint8_t rc;\r
+\r
+    /* Currently the only legal pre-init accesses are the address and\r
+     * the token objects.\r
+     */\r
+    switch (object)\r
+    {\r
+        case IOCTL_OBJ_ADDR:\r
+        case IOCTL_OBJ_TOKEN:\r
+            rc = 1; /* legal */\r
+            break;\r
+\r
+        default:\r
+            rc = 0; /* not legal when init not done */\r
+            break;\r
+    }\r
+\r
+    return rc;\r
+}\r
+\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/simpliciti/Components/nwk/nwk_api.h b/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/simpliciti/Components/nwk/nwk_api.h
new file mode 100755 (executable)
index 0000000..104f031
--- /dev/null
@@ -0,0 +1,58 @@
+/**************************************************************************************************\r
+*  Filename:       nwk_api.h\r
+*  Revised:        $Date: 2008-11-24 12:09:31 -0800 (Mon, 24 Nov 2008) $\r
+*  Revision:       $Revision: 18508 $\r
+*  Author:         $Author: lfriedman $\r
+*\r
+*  Description:    This header file supports the SimpliciTI appliction layer API.\r
+*\r
+*  Copyright 2004-2007 Texas Instruments Incorporated. All rights reserved.\r
+*\r
+*  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+*  the terms of a software license agreement between the user who downloaded the software,\r
+*  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+*  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+*  License. The License limits your use, and you acknowledge, that the Software may not be\r
+*  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+*  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+*  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+*  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+*  perform, display or sell this Software and/or its documentation for any purpose.\r
+*\r
+*  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+*  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+*  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+*  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+*  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+*  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+*  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+*  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+*  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+*\r
+*  Should you have any questions regarding your right to use this Software,\r
+*  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+#ifndef NWK_API_H\r
+#define NWK_API_H\r
+\r
+/* Tx options (bit map) */\r
+#define  SMPL_TXOPTION_NONE       ((txOpt_t)0x00)\r
+#define  SMPL_TXOPTION_ACKREQ     ((txOpt_t)0x01)\r
+\r
+smplStatus_t SMPL_Init(uint8_t (*)(linkID_t));\r
+smplStatus_t SMPL_Link(linkID_t *);\r
+smplStatus_t SMPL_LinkListen(linkID_t *);\r
+smplStatus_t SMPL_Send(linkID_t lid, uint8_t *msg, uint8_t len);\r
+\r
+smplStatus_t SMPL_SendOpt(linkID_t lid, uint8_t * msg, uint8_t len, txOpt_t);\r
+smplStatus_t SMPL_Receive(linkID_t lid, uint8_t *msg, uint8_t *len);\r
+\r
+smplStatus_t SMPL_Ioctl(ioctlObject_t, ioctlAction_t, void *);\r
+#ifdef EXTENDED_API\r
+smplStatus_t SMPL_Ping(linkID_t);\r
+smplStatus_t SMPL_Unlink(linkID_t);\r
+smplStatus_t SMPL_Commission(addr_t *, uint8_t, uint8_t, linkID_t *);\r
+#endif  /* EXTENDED_API */\r
+\r
+#endif\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/simpliciti/Components/nwk/nwk_app.h b/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/simpliciti/Components/nwk/nwk_app.h
new file mode 100755 (executable)
index 0000000..4aa942b
--- /dev/null
@@ -0,0 +1,53 @@
+\r
+/**************************************************************************************************\r
+*  Filename:       nwk_app.h\r
+*  Revised:        $Date: 2007-07-10 11:21:35 -0700 (Tue, 10 Jul 2007) $\r
+*  Revision:       $Revision: 14865 $\r
+*  Author:         $Author: lfriedman $\r
+*\r
+*  Description:    This header file is for convenience and includes the headers for all the\r
+*                 network applications.\r
+*\r
+*  Copyright 2004-2007 Texas Instruments Incorporated. All rights reserved.\r
+*\r
+*  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+*  the terms of a software license agreement between the user who downloaded the software,\r
+*  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+*  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+*  License. The License limits your use, and you acknowledge, that the Software may not be\r
+*  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+*  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+*  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+*  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+*  perform, display or sell this Software and/or its documentation for any purpose.\r
+*\r
+*  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+*  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+*  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+*  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+*  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+*  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+*  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+*  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+*  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+*\r
+*  Should you have any questions regarding your right to use this Software,\r
+*  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+\r
+\r
+\r
+#ifndef NWK_APP_H\r
+#define NWK_APP_H\r
+\r
+#include "nwk_freq.h"\r
+#include "nwk_ping.h"\r
+#include "nwk_link.h"\r
+#include "nwk_mgmt.h"\r
+#include "nwk_join.h"\r
+#include "nwk_security.h"\r
+#include "nwk_ioctl.h"\r
+\r
+#endif\r
+\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/simpliciti/Components/nwk/nwk_frame.c b/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/simpliciti/Components/nwk/nwk_frame.c
new file mode 100755 (executable)
index 0000000..1726d13
--- /dev/null
@@ -0,0 +1,984 @@
+/**************************************************************************************************\r
+*  Filename:       nwk_frame.c\r
+*  Revised:        $Date: 2009-03-10 16:21:40 -0700 (Tue, 10 Mar 2009) $\r
+*  Revision:       $Revision: 19368 $\r
+*  Author          $Author: lfriedman $\r
+*\r
+*  Description:    This file supports the SimpliciTI frame handling functions.\r
+*\r
+*  Copyright 2007-2009 Texas Instruments Incorporated. All rights reserved.\r
+*\r
+*  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+*  the terms of a software license agreement between the user who downloaded the software,\r
+*  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+*  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+*  License. The License limits your use, and you acknowledge, that the Software may not be\r
+*  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+*  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+*  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+*  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+*  perform, display or sell this Software and/or its documentation for any purpose.\r
+*\r
+*  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+*  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+*  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+*  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+*  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+*  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+*  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+*  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+*  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+*\r
+*  Should you have any questions regarding your right to use this Software,\r
+*  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+\r
+/******************************************************************************\r
+ * INCLUDES\r
+ */\r
+\r
+#include <string.h>\r
+#include "bsp.h"\r
+#include "mrfi.h"\r
+#include "nwk_types.h"\r
+#include "nwk_frame.h"\r
+#include "nwk.h"\r
+#include "nwk_app.h"\r
+#include "nwk_QMgmt.h"\r
+#include "nwk_globals.h"\r
+#include "nwk_mgmt.h"\r
+#include "nwk_security.h"\r
+\r
+/******************************************************************************\r
+ * MACROS\r
+ */\r
+\r
+/******************************************************************************\r
+ * CONSTANTS AND DEFINES\r
+ */\r
+\r
+/******************************************************************************\r
+ * TYPEDEFS\r
+ */\r
+\r
+/******************************************************************************\r
+ * LOCAL VARIABLES\r
+ */\r
+\r
+#if SIZE_INFRAME_Q > 0\r
+/* array of function pointers to handle NWK application frames */\r
+static fhStatus_t(*const func[]) (mrfiPacket_t *) = { nwk_processPing,\r
+                                                      nwk_processLink,\r
+                                                      nwk_processJoin,\r
+                                                      nwk_processSecurity,\r
+                                                      nwk_processFreq,\r
+                                                      nwk_processMgmt};\r
+#endif  /* SIZE_INFRAME_Q > 0 */\r
+\r
+static uint8_t sTRACTID = 0;\r
+\r
+static addr_t const *sMyAddr = NULL;\r
+\r
+static uint8_t sMyRxType = 0, sMyTxType = 0;\r
+\r
+#if !defined(RX_POLLS)\r
+static uint8_t (*spCallback)(linkID_t) = NULL;\r
+#endif\r
+\r
+/******************************************************************************\r
+ * LOCAL FUNCTIONS\r
+ */\r
+\r
+#if SIZE_INFRAME_Q > 0\r
+/* local helper functions for Rx devices */\r
+static void dispatchFrame(frameInfo_t *);\r
+\r
+#    if !defined(END_DEVICE)\r
+#        if defined(ACCESS_POINT)\r
+/* only Access Points need to worry about duplicate S&F frames */\r
+uint8_t isDupSandFFrame(mrfiPacket_t *);\r
+\r
+#        endif /* ACCESS_POINT */\r
+#    endif     /* !END_DEVICE */\r
+#endif         /* SIZE_INFRAME_Q > 0 */\r
+\r
+/******************************************************************************\r
+ * GLOBAL VARIABLES\r
+ */\r
+\r
+/******************************************************************************\r
+ * GLOBAL FUNCTIONS\r
+ */\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_frameInit\r
+ *\r
+ * @brief       Initialize network context.\r
+ *\r
+ * input parameters\r
+ *       pF - Pointer to callback function. If none intended should be NULL.\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return    void\r
+ */\r
+\r
+void nwk_frameInit(uint8_t (*pF)(linkID_t))\r
+{\r
+\r
+    /****** Fill static values for the DEVICEINFO byte that will go in each frame *****\r
+     * Rx type when frame originates from this device. Set in nwk_buildFrame()\r
+     * Tx type when frame sent from this device. Set in nwk_sendframe() */\r
+#if !defined(END_DEVICE)\r
+    sMyRxType = F_RX_TYPE_USER_CTL;\r
+#    if defined(ACCESS_POINT)\r
+    sMyTxType = F_TX_DEVICE_AP;\r
+#    else\r
+    sMyTxType = F_TX_DEVICE_RE;\r
+#    endif\r
+#else\r
+    sMyTxType = F_TX_DEVICE_ED;\r
+#    if defined(RX_POLLS)\r
+    sMyRxType = F_RX_TYPE_POLLS;\r
+#    endif\r
+#    if defined(RX_USER)\r
+    sMyRxType = F_RX_TYPE_USER_CTL;\r
+#    endif\r
+#endif\r
+    /****** DONE fill static values for the DEVICEINFO byte that will go in each frame ******/\r
+\r
+#if !defined(RX_POLLS)\r
+    spCallback = pF;\r
+#else\r
+    (void) pF;\r
+#endif\r
+\r
+    sMyAddr = nwk_getMyAddress();\r
+\r
+    while (!(sTRACTID = MRFI_RandomByte())) ;\r
+\r
+    return;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_buildFrame\r
+ *\r
+ * @brief       Builds an output frame for the port and message enclosed.\r
+ *              This routine prepends the frame header and populates the\r
+ *              frame in the output queue.\r
+ *\r
+ * input parameters\r
+ * @param   port    - port from application\r
+ * @param   msg     - pointer to message from app to be sent\r
+ * @param   len     - length of enclosed message\r
+ * @param   hops    - number of hops allowed. this is less than MAX_HOPS\r
+ *                    whenever the frame is being sent to the AP. this is to\r
+ *                    help mitigate the (short) broadcast storms\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   pointer to frameInfo_t structure created. NULL if there is\r
+ *           no room in output queue.\r
+ */\r
+\r
+frameInfo_t *nwk_buildFrame(uint8_t port, uint8_t *msg, uint8_t len, uint8_t hops)\r
+{\r
+    frameInfo_t  *fInfoPtr;\r
+\r
+    if (!(fInfoPtr = nwk_QfindSlot(OUTQ)))\r
+    {\r
+        return (frameInfo_t *)NULL;\r
+    }\r
+\r
+    MRFI_SET_PAYLOAD_LEN(&fInfoPtr->mrfiPkt, len + F_APP_PAYLOAD_OS);\r
+\r
+    PUT_INTO_FRAME(MRFI_P_PAYLOAD(&fInfoPtr->mrfiPkt), F_ENCRYPT_OS, 0);\r
+    PUT_INTO_FRAME(MRFI_P_PAYLOAD(&fInfoPtr->mrfiPkt), F_PORT_OS, port);\r
+    PUT_INTO_FRAME(MRFI_P_PAYLOAD(&fInfoPtr->mrfiPkt), F_TRACTID_OS, sTRACTID);\r
+    while (!(++sTRACTID)) ;  /* transaction ID can't be 0 */\r
+    PUT_INTO_FRAME(MRFI_P_PAYLOAD(&fInfoPtr->mrfiPkt), F_RX_TYPE, sMyRxType);\r
+    PUT_INTO_FRAME(MRFI_P_PAYLOAD(&fInfoPtr->mrfiPkt), F_HOP_COUNT, hops);\r
+\r
+    /* reset ack-relevant bits */\r
+    PUT_INTO_FRAME(MRFI_P_PAYLOAD(&fInfoPtr->mrfiPkt), F_ACK_REQ, 0);\r
+    PUT_INTO_FRAME(MRFI_P_PAYLOAD(&fInfoPtr->mrfiPkt), F_ACK_RPLY, 0);\r
+\r
+    /* reset forwarding bit */\r
+    PUT_INTO_FRAME(MRFI_P_PAYLOAD(&fInfoPtr->mrfiPkt), F_FWD_FRAME, 0);\r
+\r
+    memcpy(MRFI_P_PAYLOAD(&fInfoPtr->mrfiPkt) + F_APP_PAYLOAD_OS, msg, len);\r
+    memcpy(MRFI_P_SRC_ADDR(&fInfoPtr->mrfiPkt), sMyAddr, NET_ADDR_SIZE);\r
+\r
+    return fInfoPtr;\r
+}\r
+\r
+#if defined(APP_AUTO_ACK)\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_buildAckReqFrame\r
+ *\r
+ * @brief       Builds an output frame for the port and message enclosed.\r
+ *              This routine prepends the frame header and populates the\r
+ *              frame in the output queue. The frame is set to request that\r
+ *              an ack frame be sent by the peer.\r
+ *\r
+ * input parameters\r
+ * @param   port    - port from application\r
+ * @param   msg     - pointer to message from app to be sent\r
+ * @param   len     - length of enclosed message\r
+ * @param   hops    - number of hops allowed. this is less than MAX_HOPS\r
+ *                    whenever the frame is being sent to the AP. this is to\r
+ *                    help mitigate the (short) broadcast storms\r
+ * @param   tid     - Transaction ID to insert in NWK header used to match\r
+ *                    the ack reply.\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   pointer to frameInfo_t structure created. NULL if there is\r
+ *           no room in output queue.\r
+ */\r
+\r
+frameInfo_t *nwk_buildAckReqFrame(uint8_t port, uint8_t *msg, uint8_t len, uint8_t hops,\r
+                                  volatile uint8_t *tid)\r
+{\r
+    frameInfo_t *fInfoPtr;\r
+\r
+    /* Build a normal frame first. */\r
+    if (!(fInfoPtr = nwk_buildFrame(port, msg, len, hops)))\r
+    {\r
+        return (frameInfo_t *)NULL;\r
+    }\r
+\r
+    /* save TID  */\r
+    *tid = GET_FROM_FRAME(MRFI_P_PAYLOAD(&fInfoPtr->mrfiPkt), F_TRACTID_OS);\r
+    /* Set REQ_ACK bit */\r
+    PUT_INTO_FRAME(MRFI_P_PAYLOAD(&fInfoPtr->mrfiPkt), F_ACK_REQ, F_ACK_REQ_TYPE);\r
+\r
+    return fInfoPtr;\r
+}\r
+\r
+#endif  /* APP_AUTO_ACK */\r
+\r
+#if SIZE_INFRAME_Q > 0\r
+\r
+/******************************************************************************\r
+ * @fn          MRFI_RxCompleteISR\r
+ *\r
+ * @brief       Here on Rx interrupt from radio. Process received frame from the\r
+ *              radio Rx FIFO.\r
+ *\r
+ * input parameters\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return      void\r
+ */\r
+\r
+void MRFI_RxCompleteISR()\r
+{\r
+    frameInfo_t  *fInfoPtr;\r
+\r
+    /* room for more? */\r
+    if (fInfoPtr = nwk_QfindSlot(INQ))\r
+    {\r
+        MRFI_Receive(&fInfoPtr->mrfiPkt);\r
+\r
+        dispatchFrame(fInfoPtr);\r
+    }\r
+\r
+    return;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_retrieveFrame\r
+ *\r
+ * @brief       Retrieve frame from Rx frame queue. Invoked by application-level\r
+ *              code either app through SMPL_Receive() or IOCTL through raw Rx. This\r
+ *              should run in a user thread, not an ISR thread.\r
+ *\r
+ * input parameters\r
+ * @param    port    - port on which to get a frame\r
+ *\r
+ * output parameters\r
+ * @param    msg     - pointer to where app payload should be copied. Buffer\r
+ *                     allocated should be == MAX_APP_PAYLOAD.\r
+ *\r
+ * @param    len      - pointer to where payload length should be stored. Caller\r
+ *                      can check for non-zero when polling the port. initialized\r
+ *                      to 0 even if no frame is retrieved.\r
+ * @param    srcAddr  - if non-NULL, a pointer to where to copy the source address\r
+ *                      of the retrieved message.\r
+ * @param    hopCount - if non-NULL, a pointer to where to copy the hop count\r
+ *                      of the retrieved message.\r
+ *\r
+ * @return    SMPL_SUCCESS\r
+ *            SMPL_NO_FRAME  - no frame found for specified destination\r
+ *            SMPL_BAD_PARAM - no valid connection info for the Link ID\r
+ *\r
+ */\r
+\r
+smplStatus_t nwk_retrieveFrame(rcvContext_t *rcv, uint8_t *msg, uint8_t *len, addr_t *srcAddr,\r
+                               uint8_t *hopCount)\r
+{\r
+    frameInfo_t *fPtr;\r
+    uint8_t done;\r
+\r
+    do {\r
+        /* look for a frame on requested port. */\r
+        *len = 0;\r
+        done = 1;\r
+\r
+        fPtr = nwk_QfindOldest(INQ, rcv, USAGE_NORMAL);\r
+        if (fPtr)\r
+        {\r
+            connInfo_t  *pCInfo = 0;\r
+\r
+            if (RCV_APP_LID == rcv->type)\r
+            {\r
+                pCInfo = nwk_getConnInfo(rcv->t.lid);\r
+                if (!pCInfo)\r
+                {\r
+                    return SMPL_BAD_PARAM;\r
+                }\r
+#    if defined(SMPL_SECURE)\r
+                /* decrypt here...we have all the context we need. */\r
+                {\r
+                    uint32_t ctr  = pCInfo->connRxCTR;\r
+                    uint32_t *pctr = &ctr;\r
+                    uint8_t len  = MRFI_GET_PAYLOAD_LEN(&fPtr->mrfiPkt) - F_SEC_CTR_OS;\r
+\r
+                    if (pCInfo->thisLinkID == SMPL_LINKID_USER_UUD)\r
+                    {\r
+                        pctr = NULL;\r
+                    }\r
+#        if defined(RX_POLLS)\r
+                    else if ((F_APP_PAYLOAD_OS - F_SEC_CTR_OS) == len)\r
+                    {\r
+                        /* This was an empty poll reply frame generated by the AP.\r
+                         * It uses the single-byte CTR value like network applications.\r
+                         * We do not want to use the application layer counter in this case.\r
+                         */\r
+                        pctr = NULL;\r
+                    }\r
+#        endif\r
+                    if (nwk_getSecureFrame(&fPtr->mrfiPkt, len, pctr))\r
+                    {\r
+                        if (pctr)\r
+                        {\r
+                            /* Update connection's counter. */\r
+                            pCInfo->connRxCTR = ctr;\r
+                        }\r
+                    }\r
+                    else\r
+                    {\r
+                        /* Frame bogus. Check for another frame. */\r
+                        done = 0;\r
+                        continue;\r
+                    }\r
+                }\r
+#    endif      /* SMPL_SECURE */\r
+            }\r
+\r
+            /* it's on the requested port. */\r
+            *len = MRFI_GET_PAYLOAD_LEN(&fPtr->mrfiPkt) - F_APP_PAYLOAD_OS;\r
+            memcpy(msg, MRFI_P_PAYLOAD(&fPtr->mrfiPkt) + F_APP_PAYLOAD_OS, *len);\r
+            /* save signal info */\r
+            if (pCInfo)\r
+            {\r
+                /* Save Rx metrics... */\r
+                pCInfo->sigInfo.rssi = fPtr->mrfiPkt.rxMetrics[MRFI_RX_METRICS_RSSI_OFS];\r
+                pCInfo->sigInfo.lqi  = fPtr->mrfiPkt.rxMetrics[MRFI_RX_METRICS_CRC_LQI_OFS];\r
+            }\r
+            if (srcAddr)\r
+            {\r
+                /* copy source address if requested */\r
+                memcpy(srcAddr, MRFI_P_SRC_ADDR(&fPtr->mrfiPkt), NET_ADDR_SIZE);\r
+            }\r
+            if (hopCount)\r
+            {\r
+                /* copy hop count if requested */\r
+                *hopCount = GET_FROM_FRAME(MRFI_P_PAYLOAD(&fPtr->mrfiPkt), F_HOP_COUNT);\r
+            }\r
+            /* input frame no longer needed. free it. */\r
+            nwk_QadjustOrder(INQ, fPtr->orderStamp);\r
+\r
+            fPtr->fi_usage = FI_AVAILABLE;\r
+            return SMPL_SUCCESS;\r
+        }\r
+    } while (!done);\r
+\r
+    return SMPL_NO_FRAME;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          dispatchFrame\r
+ *\r
+ * @brief       Received frame looks OK so far. Dispatch to either NWK app by\r
+ *              invoking the handler or the user's app by simply leaving the\r
+ *              frame in the queue and letting the app poll the port.\r
+ *\r
+ * input parameters\r
+ * @param   fiPtr    - frameInfo_t pointer to received frame\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   void\r
+ */\r
+\r
+static void dispatchFrame(frameInfo_t *fiPtr)\r
+{\r
+    uint8_t port       = GET_FROM_FRAME(MRFI_P_PAYLOAD(&fiPtr->mrfiPkt), F_PORT_OS);\r
+    uint8_t nwkAppSize = sizeof(func) / sizeof(func[0]);\r
+    fhStatus_t rc;\r
+    linkID_t lid;\r
+\r
+#    if defined(ACCESS_POINT)\r
+    uint8_t loc;\r
+#    endif\r
+#    if !defined(END_DEVICE)\r
+    uint8_t isForMe;\r
+#    endif\r
+\r
+    /* be sure it's not an echo... */\r
+    if (!memcmp(MRFI_P_SRC_ADDR(&fiPtr->mrfiPkt), sMyAddr, NET_ADDR_SIZE))\r
+    {\r
+        fiPtr->fi_usage = FI_AVAILABLE;\r
+        return;\r
+    }\r
+\r
+    /* Make sure encyrption bit conforms to our security support context. */\r
+#    if defined(SMPL_SECURE)\r
+    if (!(GET_FROM_FRAME(MRFI_P_PAYLOAD(&fiPtr->mrfiPkt), F_ENCRYPT_OS)))\r
+    {\r
+        /* Encyrption bit is not on when when it should be */\r
+        fiPtr->fi_usage = FI_AVAILABLE;\r
+        return;\r
+    }\r
+#    else\r
+    if (GET_FROM_FRAME(MRFI_P_PAYLOAD(&fiPtr->mrfiPkt), F_ENCRYPT_OS))\r
+    {\r
+        /* Encyrption bit is on when when it should not be */\r
+        fiPtr->fi_usage = FI_AVAILABLE;\r
+        return;\r
+    }\r
+#    endif /* SMPL_SECURE */\r
+\r
+    /* If it's a network application port dispatch to service routine. Dispose\r
+     * of frame depending on return code.\r
+     */\r
+    if (port && (port <= nwkAppSize))\r
+    {\r
+#    if defined(SMPL_SECURE)\r
+        /* Non-connection-based frame. We can decode here if it was encrypted */\r
+        if (!nwk_getSecureFrame(&fiPtr->mrfiPkt, MRFI_GET_PAYLOAD_LEN(&fiPtr->mrfiPkt) -\r
+                                F_SEC_CTR_OS, 0))\r
+        {\r
+            fiPtr->fi_usage = FI_AVAILABLE;\r
+            return;\r
+        }\r
+#    endif\r
+        rc = func[port - 1](&fiPtr->mrfiPkt);\r
+        if (FHS_KEEP == rc)\r
+        {\r
+            fiPtr->fi_usage = FI_INUSE_UNTIL_DEL;\r
+        }\r
+#    if !defined(END_DEVICE)\r
+        else if (FHS_REPLAY == rc)\r
+        {\r
+            /* an AP or an RE could be relaying a NWK application frame... */\r
+            nwk_replayFrame(fiPtr);\r
+        }\r
+#    endif\r
+        else /* rc == FHS_RELEASE (default...) */\r
+        {\r
+            fiPtr->fi_usage = FI_AVAILABLE;\r
+        }\r
+        return;\r
+    }\r
+    /* sanity check */\r
+    else if ((port != SMPL_PORT_USER_BCAST) &&\r
+             ((port < PORT_BASE_NUMBER) || (port > SMPL_PORT_STATIC_MAX)))\r
+    {\r
+        /* bogus port. drop frame */\r
+        fiPtr->fi_usage = FI_AVAILABLE;\r
+        return;\r
+    }\r
+\r
+    /* At this point we know the target is a user app. If this is an end device\r
+     * and we got this far save the frame and we're done. If we're an AP there\r
+     * are 3 cases: it's for us, it's for s store-and-forward client, or we need\r
+     * to replay the frame. If we're and RE and the frame didn't come from an RE\r
+     * and it's not for us, replay the frame.\r
+     */\r
+\r
+#    if defined(END_DEVICE)\r
+\r
+    /* If we're s polling end device we only accept application frames from\r
+     * the AP. This prevents duplicate reception if we happen to be on when\r
+     * a linked peer sends.\r
+     */\r
+#        if defined(RX_POLLS)\r
+    if (F_TX_DEVICE_ED != GET_FROM_FRAME(MRFI_P_PAYLOAD(&fiPtr->mrfiPkt), F_TX_DEVICE))\r
+    {\r
+        if (nwk_isConnectionValid(&fiPtr->mrfiPkt, &lid))\r
+        {\r
+            fiPtr->fi_usage = FI_INUSE_UNTIL_DEL;\r
+        }\r
+        else\r
+        {\r
+            fiPtr->fi_usage = FI_AVAILABLE;\r
+        }\r
+    }\r
+    else\r
+    {\r
+        fiPtr->fi_usage = FI_AVAILABLE;\r
+    }\r
+#        else\r
+    /* it's destined for a user app. */\r
+    if (nwk_isConnectionValid(&fiPtr->mrfiPkt, &lid))\r
+    {\r
+        fiPtr->fi_usage = FI_INUSE_UNTIL_DEL;\r
+        if (spCallback && spCallback(lid))\r
+        {\r
+            fiPtr->fi_usage = FI_AVAILABLE;\r
+            return;\r
+        }\r
+    }\r
+    else\r
+    {\r
+        fiPtr->fi_usage = FI_AVAILABLE;\r
+    }\r
+#        endif /* RX_POLLS */\r
+\r
+#    else /* END_DEVICE */\r
+\r
+    /* We have an issue if the frame is broadcast to the UUD port. The AP (or RE) must\r
+     * handle this frame as if it were the target in case there is an application\r
+     * running that is listening on that port. But if it's a broadcast it must also be\r
+     * replayed. It isn't enough just to test for the UUD port because it could be a\r
+     * directed frame to another device. We must check explicitly for broadcast\r
+     * destination address.\r
+     */\r
+    isForMe = !memcmp(sMyAddr, MRFI_P_DST_ADDR(&fiPtr->mrfiPkt), NET_ADDR_SIZE);\r
+    if (isForMe ||\r
+        ((port == SMPL_PORT_USER_BCAST) &&\r
+    !memcmp(nwk_getBCastAddress(), MRFI_P_DST_ADDR(&fiPtr->mrfiPkt), NET_ADDR_SIZE)))\r
+    {\r
+        /* The folllowing test will succeed for the UUD port regardless of the\r
+         * source address.\r
+         */\r
+        if (nwk_isConnectionValid(&fiPtr->mrfiPkt, &lid))\r
+        {\r
+            /* If this is for the UUD port and we are here then the device is either\r
+             * an AP or an RE. In either case it must replay the UUD port frame if the\r
+             * frame is not "for me". But it also must handle it since it could have a\r
+             * UUD-listening application. Do the reply first and let the subsequent code\r
+             * correctly set the frame usage state. Note that the routine return can be\r
+             * from this code block. If not it will drop through to the bottom without\r
+             * doing a replay.\r
+             */\r
+            /* Do I need to replay it? */\r
+            if (!isForMe)\r
+            {\r
+                /* must be a broadcast for the UUD port */\r
+                nwk_replayFrame(fiPtr);\r
+            }\r
+            /* OK. Now I handle it... */\r
+            fiPtr->fi_usage = FI_INUSE_UNTIL_DEL;\r
+            if (spCallback && spCallback(lid))\r
+            {\r
+                fiPtr->fi_usage = FI_AVAILABLE;\r
+                return;\r
+            }\r
+        }\r
+        else\r
+        {\r
+            fiPtr->fi_usage = FI_AVAILABLE;\r
+        }\r
+    }\r
+#        if defined(ACCESS_POINT)\r
+\r
+    /* Check to see if we need to save this for a S and F client. Otherwise,\r
+     * if it's not for us, get rid of it.\r
+     */\r
+    else if (nwk_isSandFClient(MRFI_P_DST_ADDR(&fiPtr->mrfiPkt), &loc))\r
+    {\r
+        /* Don't bother if it is a duplicate frame or if it's a forwarded frame\r
+         * echoed back from an RE.\r
+         */\r
+        if (!isDupSandFFrame(&fiPtr->mrfiPkt) &&\r
+            !(GET_FROM_FRAME(MRFI_P_PAYLOAD(&fiPtr->mrfiPkt), F_FWD_FRAME))\r
+            )\r
+        {\r
+#            if defined(APP_AUTO_ACK)\r
+            /* Make sure ack request bit is off. Sender will have gone away. */\r
+            PUT_INTO_FRAME(MRFI_P_PAYLOAD(&fiPtr->mrfiPkt), F_ACK_REQ, 0);\r
+#            endif\r
+            fiPtr->fi_usage = FI_INUSE_UNTIL_FWD;\r
+        }\r
+        else\r
+        {\r
+            fiPtr->fi_usage = FI_AVAILABLE;\r
+        }\r
+    }\r
+    else if (GET_FROM_FRAME(MRFI_P_PAYLOAD(&fiPtr->mrfiPkt), F_TX_DEVICE) == F_TX_DEVICE_AP)\r
+    {\r
+        /* I'm an AP and this frame came from an AP. Don't replay. */\r
+        fiPtr->fi_usage = FI_AVAILABLE;\r
+    }\r
+#        elif defined(RANGE_EXTENDER)\r
+    else if (GET_FROM_FRAME(MRFI_P_PAYLOAD(&fiPtr->mrfiPkt), F_TX_DEVICE) == F_TX_DEVICE_RE)\r
+    {\r
+        /* I'm an RE and this frame came from an RE. Don't replay. */\r
+        fiPtr->fi_usage = FI_AVAILABLE;\r
+    }\r
+#        endif\r
+    else\r
+    {\r
+        /* It's not for me and I'm either an AP or I'm an RE and the frame\r
+         * didn't come from an RE. Replay the frame.\r
+         */\r
+        nwk_replayFrame(fiPtr);\r
+    }\r
+#    endif /* !END_DEVICE */\r
+    return;\r
+}\r
+\r
+#endif   /* SIZE_INFRAME_Q > 0 */\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_sendFrame\r
+ *\r
+ * @brief       Send a frame by copying it to the radio Tx FIFO.\r
+ *\r
+ * input parameters\r
+ * @param   pFrameInfo   - pointer to frame to be sent\r
+ * @param   txOption     - do CCA or force frame out.\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return    SMPL_SUCCESS\r
+ *            SMPL_TX_CCA_FAIL Tx failed because of CCA failure.\r
+ *                             Tx FIFO flushed in this case.\r
+ */\r
+\r
+smplStatus_t nwk_sendFrame(frameInfo_t *pFrameInfo, uint8_t txOption)\r
+{\r
+    smplStatus_t rc;\r
+\r
+    /* set the type of device sending the frame in the header */\r
+    PUT_INTO_FRAME(MRFI_P_PAYLOAD(&pFrameInfo->mrfiPkt), F_TX_DEVICE, sMyTxType);\r
+\r
+    if (MRFI_TX_RESULT_SUCCESS == MRFI_Transmit(&pFrameInfo->mrfiPkt, txOption))\r
+    {\r
+        rc = SMPL_SUCCESS;\r
+    }\r
+    else\r
+    {\r
+        /* Tx failed -- probably CCA. free up frame buffer. We do not have NWK\r
+         * level retries. Let application do it.\r
+         */\r
+        rc = SMPL_TX_CCA_FAIL;\r
+    }\r
+\r
+    /* TX is done. free up the frame buffer */\r
+    pFrameInfo->fi_usage = FI_AVAILABLE;\r
+\r
+    return rc;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_getMyRxType\r
+ *\r
+ * @brief       Get my Rx type. Used to help populate the hops count in the\r
+ *              frame header to try and limit the broadcast storm. Info is\r
+ *              exchanged when linking.\r
+ *\r
+ * input parameters\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return      The address LSB.\r
+ */\r
+\r
+uint8_t nwk_getMyRxType(void)\r
+{\r
+    return sMyRxType;\r
+}\r
+\r
+#if defined(APP_AUTO_ACK)\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_sendAckReply\r
+ *\r
+ * @brief       Send an acknowledgement reply frame.\r
+ *\r
+ * input parameters\r
+ * @param   frame   - pointer to frame with ack request.\r
+ * @param   port    - port on whcih reply expected.\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return      void\r
+ */\r
+\r
+void nwk_sendAckReply(mrfiPacket_t *frame, uint8_t port)\r
+{\r
+    mrfiPacket_t dFrame;\r
+    uint8_t tid = GET_FROM_FRAME(MRFI_P_PAYLOAD(frame), F_TRACTID_OS);\r
+\r
+    /* set the type of device sending the frame in the header */\r
+    PUT_INTO_FRAME(MRFI_P_PAYLOAD(&dFrame), F_TX_DEVICE, sMyTxType);\r
+\r
+    /* set the listen type of device sending the frame in the header. */\r
+    PUT_INTO_FRAME(MRFI_P_PAYLOAD(&dFrame), F_RX_TYPE, sMyRxType);\r
+\r
+    /* destination address from received frame */\r
+    memcpy(MRFI_P_DST_ADDR(&dFrame), MRFI_P_SRC_ADDR(frame), NET_ADDR_SIZE);\r
+\r
+    /* source address */\r
+    memcpy(MRFI_P_SRC_ADDR(&dFrame), sMyAddr, NET_ADDR_SIZE);\r
+\r
+    /* port is the source the Tx port from the connection object */\r
+    PUT_INTO_FRAME(MRFI_P_PAYLOAD(&dFrame), F_PORT_OS, port);\r
+\r
+    /* frame length... */\r
+    MRFI_SET_PAYLOAD_LEN(&dFrame, F_APP_PAYLOAD_OS);\r
+\r
+    /* transaction ID taken from source frame */\r
+    PUT_INTO_FRAME(MRFI_P_PAYLOAD(&dFrame), F_TRACTID_OS, tid);\r
+\r
+    /* hop count... */\r
+    PUT_INTO_FRAME(MRFI_P_PAYLOAD(&dFrame), F_HOP_COUNT, MAX_HOPS);\r
+\r
+    /* set ACK field */\r
+    PUT_INTO_FRAME(MRFI_P_PAYLOAD(&dFrame), F_ACK_RPLY, F_ACK_RPLY_TYPE);\r
+    PUT_INTO_FRAME(MRFI_P_PAYLOAD(&dFrame), F_ACK_REQ, 0);\r
+\r
+    /* This is not a forwarded frame */\r
+    PUT_INTO_FRAME(MRFI_P_PAYLOAD(&dFrame), F_FWD_FRAME, 0);\r
+\r
+    /* Encryption state */\r
+#    if !defined(SMPL_SECURE)\r
+    PUT_INTO_FRAME(MRFI_P_PAYLOAD(&dFrame), F_ENCRYPT_OS, 0);\r
+#    else\r
+    PUT_INTO_FRAME(MRFI_P_PAYLOAD(&dFrame), F_ENCRYPT_OS, F_ENCRYPT_OS_MSK);\r
+    nwk_setSecureFrame(&dFrame, 0, 0);\r
+#    endif\r
+\r
+    MRFI_Transmit(&dFrame, MRFI_TX_TYPE_FORCED);\r
+\r
+    return;\r
+}\r
+\r
+#endif /* APP_AUTO_ACK */\r
+\r
+#if !defined(END_DEVICE)\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_replayFrame\r
+ *\r
+ * @brief       Deal with hop count on a Range Extender or Access Point replay.\r
+ *              Queue entry usage always left as available when done.\r
+ *\r
+ * input parameters\r
+ * @param   pFrameInfo   - pointer to frame information structure\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return      void\r
+ */\r
+\r
+void nwk_replayFrame(frameInfo_t *pFrameInfo)\r
+{\r
+    uint8_t hops = GET_FROM_FRAME(MRFI_P_PAYLOAD(&pFrameInfo->mrfiPkt), F_HOP_COUNT);\r
+\r
+    /* if hops are zero, drop frame. othewise send it. */\r
+    if (hops--)\r
+    {\r
+        PUT_INTO_FRAME(MRFI_P_PAYLOAD(&pFrameInfo->mrfiPkt), F_HOP_COUNT, hops);\r
+\r
+        /* Don't care if the Tx fails because of TO. Either someone else\r
+         * will retransmit or the application itself will recover.\r
+         */\r
+#    if defined(SMPL_SECURE)\r
+\r
+        /* If the frame was targeted to a NWK port it was decrypted on spec in\r
+         * the 'dispatchFrame()' method. It must be re-encypted in this case.\r
+         */\r
+        if (GET_FROM_FRAME(MRFI_P_PAYLOAD(&pFrameInfo->mrfiPkt), F_PORT_OS) <= SMPL_PORT_NWK_BCAST)\r
+        {\r
+            nwk_setSecureFrame(&pFrameInfo->mrfiPkt, MRFI_GET_PAYLOAD_LEN(\r
+                                   &pFrameInfo->mrfiPkt) - F_APP_PAYLOAD_OS, 0);\r
+        }\r
+#    endif\r
+        MRFI_DelayMs(1);\r
+        nwk_sendFrame(pFrameInfo, MRFI_TX_TYPE_CCA);\r
+    }\r
+    else\r
+    {\r
+        pFrameInfo->fi_usage = FI_AVAILABLE;\r
+    }\r
+    return;\r
+}\r
+\r
+#    if defined(ACCESS_POINT)\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_getSandFFrame\r
+ *\r
+ * @brief       Get any frame waiting for the client on the port supplied in\r
+ *              the frame payload.\r
+ *              TODO: support returning NWK application frames always. the\r
+ *              port requested in the call should be an user application port.\r
+ *              NWK app ports will never be in the called frame.\r
+ *              TODO: deal with broadcast NWK frames from AP.\r
+ *\r
+ * input parameters\r
+ * @param   frame   - pointer to frame in question\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return      pointer to frame if there is one, otherwise 0.\r
+ */\r
+\r
+frameInfo_t *nwk_getSandFFrame(mrfiPacket_t *frame, uint8_t osPort)\r
+{\r
+    uint8_t i, port = *(MRFI_P_PAYLOAD(frame) + F_APP_PAYLOAD_OS + osPort);\r
+    frameInfo_t *fiPtr;\r
+    rcvContext_t rcv;\r
+\r
+    rcv.type  = RCV_RAW_POLL_FRAME;\r
+    rcv.t.pkt = frame;\r
+    /* check the input queue for messages sent by others. */\r
+    if (fiPtr = nwk_QfindOldest(INQ, &rcv, USAGE_FWD))\r
+    {\r
+        return fiPtr;\r
+    }\r
+\r
+    /* Check the output queue to see if we ourselves need to send anything.\r
+     * TODO: use the cast-out scheme for output queue so this routine finds\r
+     * the oldest in either queue.\r
+     */\r
+    fiPtr = nwk_getQ(OUTQ);\r
+    for (i = 0; i < SIZE_OUTFRAME_Q; ++i, fiPtr++)\r
+    {\r
+        if (FI_INUSE_UNTIL_FWD == fiPtr->fi_usage)\r
+        {\r
+            if (!memcmp(MRFI_P_DST_ADDR(&fiPtr->mrfiPkt), MRFI_P_SRC_ADDR(frame), NET_ADDR_SIZE))\r
+            {\r
+                if (GET_FROM_FRAME(MRFI_P_PAYLOAD(&fiPtr->mrfiPkt), F_PORT_OS) == port)\r
+                {\r
+                    return fiPtr;\r
+                }\r
+            }\r
+        }\r
+    }\r
+    return 0;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_SendEmptyPollRspFrame\r
+ *\r
+ * @brief       There are no frames waiting for the requester on the specified\r
+ *              port. Send a frame back to that port with no payload.\r
+ *\r
+ * input parameters\r
+ * @param   frame   - pointer to frame in question\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return      void\r
+ */\r
+\r
+void nwk_SendEmptyPollRspFrame(mrfiPacket_t *frame)\r
+{\r
+    mrfiPacket_t dFrame;\r
+    uint8_t port = *(MRFI_P_PAYLOAD(frame) + F_APP_PAYLOAD_OS + M_POLL_PORT_OS);\r
+\r
+    /* set the type of device sending the frame in the header. we know it's an AP */\r
+    PUT_INTO_FRAME(MRFI_P_PAYLOAD(&dFrame), F_TX_DEVICE, F_TX_DEVICE_AP);\r
+\r
+    /* set the listen type of device sending the frame in the header. we know it's\r
+     * an AP is is probably always on...but use the static variable anyway.\r
+     */\r
+    PUT_INTO_FRAME(MRFI_P_PAYLOAD(&dFrame), F_RX_TYPE, sMyRxType);\r
+    /* destination address from received frame (polling device) */\r
+    memcpy(MRFI_P_DST_ADDR(&dFrame), MRFI_P_SRC_ADDR(frame), NET_ADDR_SIZE);\r
+    /* source address */\r
+    memcpy(MRFI_P_SRC_ADDR(&dFrame), MRFI_P_PAYLOAD(\r
+               frame) + F_APP_PAYLOAD_OS + M_POLL_ADDR_OS, NET_ADDR_SIZE);\r
+    /* port is the port requested */\r
+    PUT_INTO_FRAME(MRFI_P_PAYLOAD(&dFrame), F_PORT_OS, port);\r
+    /* frame length... */\r
+    MRFI_SET_PAYLOAD_LEN(&dFrame, F_APP_PAYLOAD_OS);\r
+    /* transaction ID... */\r
+    PUT_INTO_FRAME(MRFI_P_PAYLOAD(&dFrame), F_TRACTID_OS, sTRACTID);\r
+    sTRACTID++;\r
+    /* hop count... */\r
+    PUT_INTO_FRAME(MRFI_P_PAYLOAD(&dFrame), F_HOP_COUNT, MAX_HOPS_FROM_AP);\r
+\r
+    /* Ack fields */\r
+    PUT_INTO_FRAME(MRFI_P_PAYLOAD(&dFrame), F_ACK_RPLY, 0);\r
+    PUT_INTO_FRAME(MRFI_P_PAYLOAD(&dFrame), F_ACK_REQ, 0);\r
+\r
+    /* This is logically a forwarded frame */\r
+    PUT_INTO_FRAME(MRFI_P_PAYLOAD(&dFrame), F_FWD_FRAME, F_FRAME_FWD_TYPE);\r
+\r
+    /* Encryption state */\r
+#        if !defined(SMPL_SECURE)\r
+    PUT_INTO_FRAME(MRFI_P_PAYLOAD(&dFrame), F_ENCRYPT_OS, 0);\r
+#        else\r
+    PUT_INTO_FRAME(MRFI_P_PAYLOAD(&dFrame), F_ENCRYPT_OS, F_ENCRYPT_OS_MSK);\r
+    nwk_setSecureFrame(&dFrame, 0, 0);\r
+#        endif\r
+\r
+    MRFI_Transmit(&dFrame, MRFI_TX_TYPE_FORCED);\r
+\r
+    return;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          isDupSandFFrame\r
+ *\r
+ * @brief       Have we already stored this frame on behalf of a client?\r
+ *\r
+ * input parameters\r
+ * @param   frame   - pointer to frame in question\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return      Returns 1 if the frame is a duplicate, otherwise 0.\r
+ */\r
+\r
+uint8_t isDupSandFFrame(mrfiPacket_t *frame)\r
+{\r
+    uint8_t i, plLen = MRFI_GET_PAYLOAD_LEN(frame);\r
+    frameInfo_t *fiPtr;\r
+\r
+    /* check the input queue for duplicate S&F frame. */\r
+    fiPtr = nwk_getQ(INQ);\r
+    for (i = 0; i < SIZE_INFRAME_Q; ++i, fiPtr++)\r
+    {\r
+        if (FI_INUSE_UNTIL_FWD == fiPtr->fi_usage)\r
+        {\r
+            /* compare everything except the DEVICE INFO byte. */\r
+            if (MRFI_GET_PAYLOAD_LEN(&fiPtr->mrfiPkt) == plLen                                   &&\r
+                !memcmp(MRFI_P_DST_ADDR(&fiPtr->mrfiPkt), MRFI_P_DST_ADDR(frame), NET_ADDR_SIZE) &&\r
+                !memcmp(MRFI_P_SRC_ADDR(&fiPtr->mrfiPkt), MRFI_P_SRC_ADDR(frame), NET_ADDR_SIZE) &&\r
+                !memcmp(MRFI_P_PAYLOAD(&fiPtr->mrfiPkt), MRFI_P_PAYLOAD(frame), 1)               &&\r
+                !memcmp(MRFI_P_PAYLOAD(&fiPtr->mrfiPkt) + F_TRACTID_OS, MRFI_P_PAYLOAD(frame) +\r
+                        F_TRACTID_OS, plLen - F_TRACTID_OS)\r
+                )\r
+            {\r
+                return 1;\r
+            }\r
+        }\r
+    }\r
+    return 0;\r
+}\r
+\r
+#    endif /* ACCESS_POINT */\r
+\r
+#endif     /* !END_DEVICE */\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/simpliciti/Components/nwk/nwk_frame.h b/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/simpliciti/Components/nwk/nwk_frame.h
new file mode 100755 (executable)
index 0000000..f169911
--- /dev/null
@@ -0,0 +1,155 @@
+/**************************************************************************************************\r
+*  Filename:       nwk_frame.h\r
+*  Revised:        $Date: 2008-12-23 13:49:41 -0800 (Tue, 23 Dec 2008) $\r
+*  Revision:       $Revision: 18651 $\r
+*  Author:         $Author: lfriedman $\r
+*\r
+*  Description:    This header file supports the SimpliciTI frame handling functions.\r
+*\r
+*  Copyright 2004-2007 Texas Instruments Incorporated. All rights reserved.\r
+*\r
+*  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+*  the terms of a software license agreement between the user who downloaded the software,\r
+*  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+*  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+*  License. The License limits your use, and you acknowledge, that the Software may not be\r
+*  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+*  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+*  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+*  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+*  perform, display or sell this Software and/or its documentation for any purpose.\r
+*\r
+*  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+*  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+*  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+*  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+*  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+*  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+*  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+*  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+*  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+*\r
+*  Should you have any questions regarding your right to use this Software,\r
+*  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+\r
+#ifndef NWK_FRAME_H\r
+#define NWK_FRAME_H\r
+\r
+/* Frame field defines and masks. Mask name must be field name with '_MSK' appended\r
+ * so the GET and PUT macros work correctly -- they use token pasting. Offset values\r
+ * are with respect to the MRFI payload and not the entire frame.\r
+ */\r
+#define F_PORT_OS         0\r
+#define F_PORT_OS_MSK     (0x3F)\r
+#define F_ENCRYPT_OS      0\r
+#define F_ENCRYPT_OS_MSK  (0x40)\r
+#define F_FWD_FRAME       0\r
+#define F_FWD_FRAME_MSK   (0x80)\r
+#define F_RX_TYPE         1\r
+#define F_RX_TYPE_MSK     (0x40)\r
+#define F_ACK_REQ         1\r
+#define F_ACK_REQ_MSK     (0x80)\r
+#define F_ACK_RPLY        1\r
+#define F_ACK_RPLY_MSK    (0x08)\r
+#define F_TX_DEVICE       1\r
+#define F_TX_DEVICE_MSK   (0x30)\r
+#define F_HOP_COUNT       1\r
+#define F_HOP_COUNT_MSK   (0x07)\r
+#define F_TRACTID_OS      2\r
+#define F_TRACTID_OS_MSK  (0xFF)\r
+#define SMPL_NWK_HDR_SIZE 3\r
+\r
+#ifdef SMPL_SECURE\r
+\r
+#    define F_SECURE_OS       3\r
+\r
+#    define F_SEC_CTR_OS      3       /* counter hint */\r
+#    define F_SEC_CTR_OS_MSK  (0xFF)\r
+#    define F_SEC_ICHK_OS     4       /* Message integrity check */\r
+#    define F_SEC_ICHK_OS_MSK (0xFF)\r
+#    define F_SEC_MAC_OS      5       /* Message authentication code */\r
+#    define F_SEC_MAC_OS_MSK  (0xFF)\r
+\r
+#else\r
+\r
+#    define F_SECURE_OS       0\r
+\r
+#endif  /* SMPL_SECURE */\r
+\r
+#define F_APP_PAYLOAD_OS  (SMPL_NWK_HDR_SIZE + F_SECURE_OS)\r
+\r
+/* sub field details. they are in the correct bit locations (already shifted) */\r
+#define F_RX_TYPE_USER_CTL       0x00 /* does not poll... */\r
+#define F_RX_TYPE_POLLS          0x40 /* polls for held messages */\r
+\r
+#define F_ACK_REQ_TYPE           0x80\r
+#define F_ACK_RPLY_TYPE          0x08\r
+#define F_FRAME_FWD_TYPE         0x80\r
+#define F_FRAME_ENCRYPT_TYPE     0x40\r
+\r
+/* device type fields */\r
+#define F_TX_DEVICE_ED           0x00 /* End Device */\r
+#define F_TX_DEVICE_RE           0x10 /* Range Extender */\r
+#define F_TX_DEVICE_AP           0x20 /* Access Point */\r
+\r
+/* macro to get a field from a frame buffer */\r
+#define GET_FROM_FRAME(b, f)  ((b)[f] & (f##_MSK))\r
+\r
+/* Macro to put a value 'v' into a frame buffer 'b'. 'v' value must already be shifted\r
+ * if necessary. 'b' is a byte array\r
+ */\r
+#define PUT_INTO_FRAME(b, f, v)  do {(b)[f] = ((b)[f] & ~(f##_MSK)) | (v); } while (0)\r
+\r
+\r
+/*       ****   frame information objects\r
+ * info kept on each frame object\r
+ */\r
+#define   FI_AVAILABLE         0      /* entry available for use */\r
+#define   FI_INUSE_UNTIL_DEL   1      /* in use. will be explicitly reclaimed */\r
+#define   FI_INUSE_UNTIL_TX    2      /* in use. will be reclaimed after Tx */\r
+#define   FI_INUSE_UNTIL_FWD   3      /* in use until forwarded by AP */\r
+#define   FI_INUSE_TRANSITION  4      /* being retrieved. do not delete in Rx ISR thread. */\r
+\r
+typedef struct\r
+{\r
+    uint8_t rssi;\r
+    uint8_t lqi;\r
+} sigInfo_t;\r
+\r
+typedef struct\r
+{\r
+    volatile uint8_t fi_usage;\r
+    uint8_t orderStamp;\r
+    mrfiPacket_t mrfiPkt;\r
+} frameInfo_t;\r
+\r
+\r
+/* prototypes */\r
+frameInfo_t  *nwk_buildFrame(uint8_t, uint8_t * msg, uint8_t len, uint8_t hops);\r
+#ifdef APP_AUTO_ACK\r
+frameInfo_t  *nwk_buildAckReqFrame(uint8_t, uint8_t *, uint8_t, uint8_t, volatile uint8_t *);\r
+#endif\r
+void nwk_receiveFrame(void);\r
+\r
+void nwk_frameInit(uint8_t (*)(linkID_t));\r
+smplStatus_t nwk_retrieveFrame(rcvContext_t *, uint8_t *, uint8_t *, addr_t *, uint8_t *);\r
+smplStatus_t nwk_sendFrame(frameInfo_t *, uint8_t txOption);\r
+\r
+frameInfo_t  *nwk_getSandFFrame(mrfiPacket_t *, uint8_t);\r
+uint8_t nwk_getMyRxType(void);\r
+void nwk_SendEmptyPollRspFrame(mrfiPacket_t *);\r
+\r
+#ifdef APP_AUTO_ACK\r
+void nwk_sendAckReply(mrfiPacket_t *, uint8_t);\r
+#endif\r
+\r
+#ifndef END_DEVICE\r
+/* only APs and REs repeat frames */\r
+void nwk_replayFrame(frameInfo_t *);\r
+\r
+#endif\r
+\r
+\r
+#endif\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/simpliciti/Components/nwk/nwk_globals.c b/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/simpliciti/Components/nwk/nwk_globals.c
new file mode 100755 (executable)
index 0000000..b63cf67
--- /dev/null
@@ -0,0 +1,267 @@
+/**************************************************************************************************\r
+*  Filename:       nwk_globals.c\r
+*  Revised:        $Date: 2009-10-27 20:48:11 -0700 (Tue, 27 Oct 2009) $\r
+*  Revision:       $Revision: 20995 $\r
+*\r
+*  Description:    This file manages global NWK data.\r
+*\r
+*  Copyright 2007-2009 Texas Instruments Incorporated. All rights reserved.\r
+*\r
+*  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+*  the terms of a software license agreement between the user who downloaded the software,\r
+*  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+*  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+*  License. The License limits your use, and you acknowledge, that the Software may not be\r
+*  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+*  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+*  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+*  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+*  perform, display or sell this Software and/or its documentation for any purpose.\r
+*\r
+*  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+*  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+*  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+*  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+*  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+*  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+*  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+*  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+*  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+*\r
+*  Should you have any questions regarding your right to use this Software,\r
+*  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+\r
+/******************************************************************************\r
+ * INCLUDES\r
+ */\r
+#include <string.h>\r
+#include "bsp.h"\r
+#include "mrfi.h"\r
+#include "nwk_types.h"\r
+#include "nwk_globals.h"\r
+\r
+/******************************************************************************\r
+ * MACROS\r
+ */\r
+\r
+/******************************************************************************\r
+ * CONSTANTS AND DEFINES\r
+ */\r
+\r
+/******************************************************************************\r
+ * TYPEDEFS\r
+ */\r
+\r
+/******************************************************************************\r
+ * LOCAL VARIABLES\r
+ */\r
+static const addr_t sMyROMAddress = THIS_DEVICE_ADDRESS;\r
+static addr_t sAPAddress;\r
+static addr_t sMyRAMAddress;\r
+static uint8_t sRAMAddressIsSet = 0;\r
+\r
+/* Version number set as a 4 byte quantity. Each byte is a revision number\r
+ * in the form w.x.y.z. The subfields are each limited to values 0x0-0xFF.\r
+ */\r
+static const smplVersionInfo_t sVersionInfo = {\r
+    0x02,                                              /* protocol version */\r
+    0x01,                                              /* major revision number */\r
+    0x01,                                              /* minor revision number */\r
+    0x01,                                              /* maintenance release number */\r
+    0x00                                               /* special release */\r
+};\r
+\r
+/******************************************************************************\r
+ * LOCAL FUNCTIONS\r
+ */\r
+\r
+/******************************************************************************\r
+ * GLOBAL VARIABLES\r
+ */\r
+\r
+/******************************************************************************\r
+ * GLOBAL FUNCTIONS\r
+ */\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_globalsInit\r
+ *\r
+ * @brief       Initialization of global symbols\r
+ *\r
+ * input parameters\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   void\r
+ */\r
+\r
+void nwk_globalsInit(void)\r
+{\r
+\r
+    memset(&sAPAddress, 0x00, sizeof(addr_t));\r
+\r
+    /* populate RAM address from ROM default if it hasn't laready been set\r
+     * using the IOCTL interface.\r
+     */\r
+    if (!sRAMAddressIsSet)\r
+    {\r
+        memcpy(&sMyRAMAddress, &sMyROMAddress, sizeof(addr_t));\r
+        sRAMAddressIsSet = 1; /* RAM address is now valid */\r
+    }\r
+\r
+    return;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_getMyAddress\r
+ *\r
+ * @brief       Return a pointer to my address. It comes either from ROM as\r
+ *              set in the configuration file or it was set using the IOCTL\r
+ *              interface -- probably from random bytes.\r
+ *\r
+ * input parameters\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   pointer to a constant address type object.\r
+ */\r
+\r
+addr_t const *nwk_getMyAddress(void)\r
+{\r
+    /* This call supports returning a valid pointer before either the\r
+     * initialization or external setting of the address. But caller needs\r
+     * to be careful -- if this routine is called immediately it will return\r
+     * the ROM address. If the application then sets the address using the\r
+     * IOCTL before doing the SMPL_Init() the original pointer is no longer\r
+     * valid as it points to the wrong address.\r
+     */\r
+    return sRAMAddressIsSet ? &sMyRAMAddress : &sMyROMAddress;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_getFWVersion\r
+ *\r
+ * @brief       Return a pointer to the current firmware version string.\r
+ *\r
+ * input parameters\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   pointer to a constant uint16_t object.\r
+ */\r
+\r
+uint8_t const *nwk_getFWVersion()\r
+{\r
+    return sVersionInfo.fwVerString;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_getProtocolVersion\r
+ *\r
+ * @brief       Return the current protocol version.\r
+ *\r
+ * input parameters\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   Protocol version.\r
+ */\r
+\r
+uint8_t nwk_getProtocolVersion(void)\r
+{\r
+    return sVersionInfo.protocolVersion;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_setMyAddress\r
+ *\r
+ * @brief       Set my address object if it hasn't already been set. This call\r
+ *              is referenced by the IOCTL support used to change the device\r
+ *              address. It is effective only if the address has not already\r
+ *              been set.\r
+ *\r
+ * input parameters\r
+ *\r
+ * @param   addr  - pointer to the address object to be used to set my address.\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   Returns non-zero if request is respected, otherwise returns 0.\r
+ */\r
+\r
+uint8_t nwk_setMyAddress(addr_t *addr)\r
+{\r
+    uint8_t rc = 0;\r
+\r
+    if (!sRAMAddressIsSet)\r
+    {\r
+        memcpy(&sMyRAMAddress, addr, sizeof(addr_t));\r
+        sRAMAddressIsSet = 1; /* RAM address is now valid */\r
+        rc = 1;\r
+    }\r
+\r
+    return rc;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_setAPAddress\r
+ *\r
+ * @brief       Set the AP's address. Called after the AP address is gleaned\r
+ *              from the Join reply.\r
+ *\r
+ * input parameters\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   void\r
+ */\r
+\r
+void nwk_setAPAddress(addr_t *addr)\r
+{\r
+\r
+    memcpy((void *)&sAPAddress, (void *)addr, NET_ADDR_SIZE);\r
+\r
+    return;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_getAPAddress\r
+ *\r
+ * @brief       Get the AP's address.\r
+ *\r
+ * input parameters\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   Pointer to a constant address object or null if the address has not\r
+ *           yet been set.\r
+ */\r
+\r
+addr_t const *nwk_getAPAddress(void)\r
+{\r
+    addr_t addr;\r
+\r
+    memset(&addr, 0x0, sizeof(addr));\r
+\r
+    return !memcmp(&sAPAddress, &addr, NET_ADDR_SIZE) ? 0 : &sAPAddress;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_getBCastAddress\r
+ *\r
+ * @brief       Get the network broadcast address.\r
+ *\r
+ * input parameters\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   Pointer to a constant address object.\r
+ */\r
+\r
+addr_t const *nwk_getBCastAddress(void)\r
+{\r
+    return (addr_t const *)mrfiBroadcastAddr;\r
+}\r
+\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/simpliciti/Components/nwk/nwk_globals.h b/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/simpliciti/Components/nwk/nwk_globals.h
new file mode 100755 (executable)
index 0000000..7f349c7
--- /dev/null
@@ -0,0 +1,51 @@
+/**************************************************************************************************\r
+*  Filename:       nwk_globals.h\r
+*  Revised:        $Date: 2008-07-30 11:22:21 -0700 (Wed, 30 Jul 2008) $\r
+*  Revision:       $Revision: 17655 $\r
+*  Author:         $Author: lfriedman $\r
+*\r
+*  Description:    This header file supports the management of NWK global symbols.\r
+*\r
+*  Copyright 2004-2007 Texas Instruments Incorporated. All rights reserved.\r
+*\r
+*  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+*  the terms of a software license agreement between the user who downloaded the software,\r
+*  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+*  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+*  License. The License limits your use, and you acknowledge, that the Software may not be\r
+*  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+*  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+*  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+*  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+*  perform, display or sell this Software and/or its documentation for any purpose.\r
+*\r
+*  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+*  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+*  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+*  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+*  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+*  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+*  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+*  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+*  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+*\r
+*  Should you have any questions regarding your right to use this Software,\r
+*  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+#ifndef NWK_GLOBALS_H\r
+#define NWK_GLOBALS_H\r
+\r
+\r
+/* Prototypes */\r
+void nwk_globalsInit(void);\r
+addr_t const  *nwk_getMyAddress(void);\r
+uint8_t nwk_setMyAddress(addr_t *addr);\r
+void nwk_setAPAddress(addr_t *addr);\r
+addr_t const  *nwk_getAPAddress(void);\r
+addr_t const  *nwk_getBCastAddress(void);\r
+uint8_t const *nwk_getFWVersion(void);\r
+uint8_t nwk_getProtocolVersion(void);\r
+\r
+\r
+#endif\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/simpliciti/Components/nwk/nwk_types.h b/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/simpliciti/Components/nwk/nwk_types.h
new file mode 100755 (executable)
index 0000000..79d4e03
--- /dev/null
@@ -0,0 +1,344 @@
+/**************************************************************************************************\r
+*  Filename:       nwk_types.h\r
+*  Revised:        $Date: 2009-01-13 11:31:14 -0800 (Tue, 13 Jan 2009) $\r
+*  Revision:       $Revision: 18744 $\r
+*  Author:         $Author: lfriedman $\r
+*\r
+*  Description:    This header file defines the SimpliciTI typedefs.\r
+*\r
+*  Copyright 2004-2007 Texas Instruments Incorporated. All rights reserved.\r
+*\r
+*  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+*  the terms of a software license agreement between the user who downloaded the software,\r
+*  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+*  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+*  License. The License limits your use, and you acknowledge, that the Software may not be\r
+*  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+*  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+*  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+*  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+*  perform, display or sell this Software and/or its documentation for any purpose.\r
+*\r
+*  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+*  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+*  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+*  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+*  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+*  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+*  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+*  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+*  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+*\r
+*  Should you have any questions regarding your right to use this Software,\r
+*  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+#ifndef NWK_TYPES_H\r
+#define NWK_TYPES_H\r
+\r
+#define NWK_TX_RETRY_COUNT    10\r
+#define NWK_RX_RETRY_COUNT    10\r
+\r
+#define NWK_APP_REPLY_BIT  (0x80)\r
+\r
+#define NET_ADDR_SIZE      MRFI_ADDR_SIZE   /* size of address in bytes */\r
+\r
+#ifdef  FREQUENCY_AGILITY\r
+#    define NWK_FREQ_TBL_SIZE  MRFI_NUM_LOGICAL_CHANS\r
+#else\r
+#    define NWK_FREQ_TBL_SIZE  1\r
+#endif\r
+\r
+typedef struct\r
+{\r
+    uint8_t addr[NET_ADDR_SIZE];\r
+} addr_t;\r
+\r
+typedef uint8_t linkID_t;\r
+typedef uint8_t ccRadioStatus_t;\r
+\r
+\r
+/*      ***********************************************\r
+ *                   Begin IOCTL Support\r
+ *      ***********************************************\r
+ */\r
+enum ioctlObject {\r
+    IOCTL_OBJ_FREQ,\r
+    IOCTL_OBJ_CRYPTKEY,\r
+    IOCTL_OBJ_RAW_IO,\r
+    IOCTL_OBJ_RADIO,\r
+    IOCTL_OBJ_AP_JOIN,\r
+    IOCTL_OBJ_ADDR,\r
+    IOCTL_OBJ_CONNOBJ,\r
+    IOCTL_OBJ_FWVER,\r
+    IOCTL_OBJ_PROTOVER,\r
+    IOCTL_OBJ_NVOBJ,\r
+    IOCTL_OBJ_TOKEN\r
+};\r
+\r
+enum ioctlAction {\r
+    IOCTL_ACT_SET,\r
+    IOCTL_ACT_GET,\r
+    IOCTL_ACT_READ,\r
+    IOCTL_ACT_WRITE,\r
+    IOCTL_ACT_RADIO_SLEEP,\r
+    IOCTL_ACT_RADIO_AWAKE,\r
+    IOCTL_ACT_RADIO_SIGINFO,\r
+    IOCTL_ACT_RADIO_RSSI,\r
+    IOCTL_ACT_RADIO_RXON,\r
+    IOCTL_ACT_RADIO_RXIDLE,\r
+    IOCTL_ACT_RADIO_SETPWR,\r
+    IOCTL_ACT_ON,\r
+    IOCTL_ACT_OFF,\r
+    IOCTL_ACT_SCAN,\r
+    IOCTL_ACT_DELETE\r
+};\r
+\r
+typedef enum ioctlObject ioctlObject_t;\r
+typedef enum ioctlAction ioctlAction_t;\r
+\r
+enum ioctlLevel\r
+{\r
+    IOCTL_LEVEL_0,\r
+    IOCTL_LEVEL_1,\r
+    IOCTL_LEVEL_2\r
+};\r
+\r
+typedef enum ioctlLevel ioctlLevel_t;\r
+\r
+typedef struct\r
+{\r
+    addr_t   *addr;\r
+    uint8_t  *msg;\r
+    uint8_t len;\r
+    uint8_t port;\r
+} ioctlRawSend_t;\r
+\r
+typedef struct\r
+{\r
+    addr_t  *addr;\r
+    uint8_t *msg;\r
+    uint8_t len;\r
+    uint8_t port;\r
+    uint8_t hopCount;\r
+} ioctlRawReceive_t;\r
+\r
+/*\r
+ * Signal information support\r
+ */\r
+typedef int8_t rssi_t;\r
+\r
+typedef struct\r
+{\r
+    rssi_t rssi;\r
+    uint8_t lqi;\r
+} rxMetrics_t;\r
+\r
+typedef struct\r
+{\r
+    linkID_t lid; /* input: Link ID for which signal info desired */\r
+    rxMetrics_t sigInfo;\r
+} ioctlRadioSiginfo_t;\r
+\r
+\r
+/*                      *** Begin SET/GET token support ***                */\r
+enum tokenType\r
+{\r
+    TT_LINK,      /* Token Type is Link */\r
+    TT_JOIN       /* Token Type is Join */\r
+};\r
+\r
+typedef enum tokenType tokenType_t;\r
+\r
+/* Create a union. If either token ever changes type it will make things easier. */\r
+typedef union\r
+{\r
+    uint32_t linkToken;\r
+    uint32_t joinToken;\r
+} token_t;\r
+\r
+typedef struct\r
+{\r
+    tokenType_t tokenType;\r
+    token_t token;\r
+} ioctlToken_t;\r
+/*                      *** End SET/GET token support ***                */\r
+\r
+\r
+/*\r
+ * Frequency Agility support\r
+ */\r
+typedef struct\r
+{\r
+    uint8_t logicalChan;\r
+} freqEntry_t;\r
+\r
+typedef struct\r
+{\r
+    uint8_t numChan;\r
+    freqEntry_t *freq;\r
+} ioctlScanChan_t;\r
+\r
+/* Security typedefs to make things easier if they change types */\r
+typedef uint8_t secMAC_t;\r
+typedef uint8_t secFCS_t;\r
+\r
+/***************************************************************************************\r
+ *                                 ** NV Object support **\r
+ *\r
+ * The following object supports saving and restoring the information\r
+ * necessary to save and restore a device connection context.\r
+ *\r
+ * On a GET interface populates the IOCTL object with the version and length (in bytes)\r
+ * of the current static connection iformation area. In addition it populates the address\r
+ * pointed to by 'objPtr' with the base address of the connection context. At this point\r
+ * the caller can either copy to or from the address. Note that this is a dangerous\r
+ * interface, as the caller is provided with direct access to the connection context.\r
+ *\r
+ * When restoring the connection context some sanity checks are possible. If the\r
+ * version or length elements of the saved context do not match those of the current\r
+ * static object the static object should not be populated. If this sanity fails the\r
+ * caller is not provided with the pointer to the conneciton ocntext.\r
+ *\r
+ * This interface is fairly simple and it is possible to get the address of the\r
+ * connection context to do a restore by simply doing a GET call. This avoids the\r
+ * sanity checks. However, this is not recommended because there may be other side\r
+ * effects of doing a SET that are necessary when restoring a context and are done\r
+ * only when the proper option is used to restore the connection context.\r
+ *\r
+ *************************************************************************************/\r
+typedef struct\r
+{\r
+    uint8_t objVersion;\r
+    uint16_t objLen;\r
+    uint8_t  **objPtr;\r
+} ioctlNVObj_t;\r
+\r
+/*      ***********************************************\r
+ *                    End IOCTL Support\r
+ *      ***********************************************\r
+ */\r
+\r
+enum smplStatus {\r
+    SMPL_SUCCESS,\r
+    SMPL_TIMEOUT,\r
+    SMPL_BAD_PARAM,\r
+    SMPL_NOMEM,\r
+    SMPL_NO_FRAME,\r
+    SMPL_NO_LINK,\r
+    SMPL_NO_JOIN,\r
+    SMPL_NO_CHANNEL,\r
+    SMPL_NO_PEER_UNLINK,\r
+    SMPL_TX_CCA_FAIL,\r
+    SMPL_NO_PAYLOAD,\r
+    SMPL_NO_AP_ADDRESS,\r
+    SMPL_NO_ACK\r
+};\r
+\r
+typedef enum smplStatus smplStatus_t;\r
+\r
+/* NWK application frame handling status codes */\r
+enum fhStatus\r
+{\r
+    FHS_RELEASE, /* handled in interrupt thread */\r
+    FHS_KEEP,    /* handled by background application */\r
+    FHS_REPLAY   /* non-ED case: NWK frame not for me that should be replayed */\r
+};\r
+\r
+typedef enum fhStatus fhStatus_t;\r
+\r
+/********    BEGIN: Object support for parameter context in queue management *********/\r
+enum rcvType\r
+{\r
+    RCV_NWK_PORT,\r
+    RCV_APP_LID,\r
+    RCV_RAW_POLL_FRAME\r
+};\r
+\r
+typedef enum rcvType rcvType_t;\r
+\r
+/* Tx options type */\r
+typedef  uint16_t txOpt_t;\r
+\r
+typedef struct\r
+{\r
+    rcvType_t type;\r
+    union\r
+    {\r
+        linkID_t lid;\r
+        uint8_t port;\r
+        mrfiPacket_t *pkt;\r
+    } t;\r
+} rcvContext_t;\r
+/********    END: Object support for parameter context in queue management *********/\r
+\r
+#define SMPL_FWVERSION_SIZE  4\r
+\r
+typedef struct\r
+{\r
+    uint8_t protocolVersion;\r
+    uint8_t fwVerString[SMPL_FWVERSION_SIZE];\r
+} smplVersionInfo_t;\r
+\r
+/* The following typedef is used to standardize the application Transaction ID field.\r
+ * This field can be used for detection of out-of-order application payloads if this\r
+ * is an issue. There is no real reason to use more than a byte for this support. But\r
+ * if this typedef is anything other than uint8_t be sure to attend to alignment and\r
+ * endian issues.\r
+ */\r
+typedef uint8_t appPTid_t;\r
+\r
+#ifdef ACCESS_POINT\r
+/* Store-and-forward client info object */\r
+typedef struct\r
+{\r
+    addr_t clientAddr;\r
+    appPTid_t lastTID;\r
+} sfClientInfo_t;\r
+\r
+typedef struct\r
+{\r
+    uint8_t curNumSFClients;\r
+    sfClientInfo_t sfClients[NUM_STORE_AND_FWD_CLIENTS];\r
+} sfInfo_t;\r
+#endif\r
+\r
+/****************************************************************************************\r
+*                           SOME USEFUL MACROS\r
+****************************************************************************************/\r
+\r
+/* Delay loop support. Requires mrfi.h */\r
+#define NWK_DELAY(spin)   MRFI_DelayMs(spin)\r
+#define NWK_REPLY_DELAY() MRFI_ReplyDelay();\r
+\r
+/* Network applications may need to remember radio state because the user\r
+ * application may choose to turn Rx off. These macros help get and restore\r
+ * the radio Rx state. The macros should be in the same code block at the same level.\r
+ * The argument 's' is the 'current' radio state and should be set in the code block\r
+ * with a call to MRFI_GetRadioState() _before_ using the macros.\r
+ *\r
+ * Used extensively by NWK but user applications may use them as well. But it is\r
+ * much more liekly that an application will know the radio state since it likely\r
+ * will have set it with IOCTL calls. Requires mrfi.h.\r
+ */\r
+#define NWK_CHECK_FOR_SETRX(s)  if (MRFI_RADIO_STATE_RX != s)    \\r
+    {                                \\r
+        if (MRFI_RADIO_STATE_OFF == s) \\r
+        {                              \\r
+            MRFI_WakeUp();               \\r
+        }                              \\r
+        MRFI_RxOn();                   \\r
+    }\r
+\r
+#define NWK_CHECK_FOR_RESTORE_STATE(s) if (MRFI_RADIO_STATE_RX != s)    \\r
+    {                                \\r
+        if (MRFI_RADIO_STATE_OFF == s) \\r
+        {                              \\r
+            MRFI_Sleep();                \\r
+        }                              \\r
+        else                           \\r
+        {                              \\r
+            MRFI_RxIdle();               \\r
+        }                              \\r
+    }\r
+#endif\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/simpliciti/Components/nwk_applications/nwk_freq.c b/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/simpliciti/Components/nwk_applications/nwk_freq.c
new file mode 100755 (executable)
index 0000000..ed18428
--- /dev/null
@@ -0,0 +1,649 @@
+/**************************************************************************************************\r
+*  Filename:       nwk_freq.c\r
+*  Revised:        $Date: 2008-12-10 13:50:46 -0800 (Wed, 10 Dec 2008) $\r
+*  Revision:       $Revision: 18594 $\r
+*  Author:         $Author: lfriedman $\r
+*\r
+*  Description:    This file supports the SimpliciTI Freq network application.\r
+*\r
+*  Copyright 2007-2009 Texas Instruments Incorporated. All rights reserved.\r
+*\r
+*  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+*  the terms of a software license agreement between the user who downloaded the software,\r
+*  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+*  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+*  License. The License limits your use, and you acknowledge, that the Software may not be\r
+*  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+*  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+*  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+*  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+*  perform, display or sell this Software and/or its documentation for any purpose.\r
+*\r
+*  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+*  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+*  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+*  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+*  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+*  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+*  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+*  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+*  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+*\r
+*  Should you have any questions regarding your right to use this Software,\r
+*  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+/******************************************************************************\r
+ * INCLUDES\r
+ */\r
+\r
+#include <string.h>\r
+#include "bsp.h"\r
+#include "mrfi.h"\r
+#include "nwk_types.h"\r
+#include "nwk.h"\r
+#include "nwk_frame.h"\r
+#include "nwk_freq.h"\r
+#include "nwk_globals.h"\r
+#include "nwk_api.h"\r
+#include "nwk_security.h"\r
+\r
+#if defined(FREQUENCY_AGILITY)\r
+\r
+/******************************************************************************\r
+ * MACROS\r
+ */\r
+\r
+/******************************************************************************\r
+ * CONSTANTS AND DEFINES\r
+ */\r
+\r
+/******************************************************************************\r
+ * TYPEDEFS\r
+ */\r
+\r
+/******************************************************************************\r
+ * LOCAL VARIABLES\r
+ */\r
+static freqEntry_t sCurLogicalChan;\r
+static volatile uint8_t sTid = 0;\r
+\r
+/******************************************************************************\r
+ * LOCAL FUNCTIONS\r
+ */\r
+\r
+static fhStatus_t handle_freq_cmd(mrfiPacket_t *);\r
+static fhStatus_t send_ping_reply(mrfiPacket_t *);\r
+\r
+#    ifndef ACCESS_POINT\r
+static uint8_t change_channel_cmd_is_valid(mrfiPacket_t *);\r
+\r
+#    endif\r
+#    ifdef RANGE_EXTENDER\r
+/* REs must replay frame before changing channels */\r
+static void replayFirst(mrfiPacket_t *);\r
+\r
+#    endif\r
+#    ifdef ACCESS_POINT\r
+/* only the AP can broadcast this command */\r
+static void broadcast_channel_change(uint8_t);\r
+\r
+#    else\r
+/* APs do not process this frame */\r
+static void change_channel_cmd(mrfiPacket_t *);\r
+\r
+#    endif\r
+\r
+/******************************************************************************\r
+ * GLOBAL VARIABLES\r
+ */\r
+\r
+/******************************************************************************\r
+ * GLOBAL FUNCTIONS\r
+ */\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_freqInit\r
+ *\r
+ * @brief       Initialize NWK Frequency application.\r
+ *\r
+ * @return   none.\r
+ */\r
+\r
+void nwk_freqInit(void)\r
+{\r
+\r
+    memset(&sCurLogicalChan, 0x0, sizeof(sCurLogicalChan));\r
+\r
+    /* pick a random value to start the transaction ID for this app. */\r
+    sTid = MRFI_RandomByte();\r
+\r
+    return;\r
+}\r
+\r
+/***************************************************************************\r
+ * @fn          nwk_setChannel\r
+ *\r
+ * @brief       Set requested logical channel.  Accessed by application\r
+ *              through IOCTL interface\r
+ *\r
+ * input parameters\r
+ * @param   chan     - pointer to channel object of requested channel\r
+ *\r
+ * @return   status of operation:\r
+ *             SMPL_SUCCESS    if channel set\r
+ *             SMPL_BAD_PARAM  if requested channel is out of range\r
+ */\r
+\r
+smplStatus_t nwk_setChannel(freqEntry_t *chan)\r
+{\r
+    smplStatus_t rc = SMPL_BAD_PARAM;\r
+\r
+    if (chan->logicalChan < NWK_FREQ_TBL_SIZE)\r
+    {\r
+        MRFI_SetLogicalChannel(chan->logicalChan);\r
+        sCurLogicalChan = *chan;\r
+        rc = SMPL_SUCCESS;\r
+    }\r
+    return rc;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_getChannel\r
+ *\r
+ * @brief       Get current logical channel. Accessed by application through\r
+ *              IOCTL interface\r
+ *\r
+ * input parameters\r
+ * @param   chan     - pointer to channel object of requested channel\r
+ *\r
+ * output parameters\r
+ * @param   chan     - populated channel object\r
+ *\r
+ * @return   none.\r
+ */\r
+\r
+void nwk_getChannel(freqEntry_t *chan)\r
+{\r
+    *chan = sCurLogicalChan;\r
+\r
+    return;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          handle_freq_cmd\r
+ *\r
+ * @brief       Handle a Frequency application command.\r
+ *\r
+ * input parameters\r
+ * @param   frame     - pointer to frame with command context\r
+ *\r
+ * @return   Return FHS_RELEASE if caller should release frame otherwise\r
+ *           return FHS_REPLAY.\r
+ */\r
+\r
+static fhStatus_t handle_freq_cmd(mrfiPacket_t *frame)\r
+{\r
+    fhStatus_t rc = FHS_RELEASE;\r
+\r
+    switch (*(MRFI_P_PAYLOAD(frame) + F_APP_PAYLOAD_OS))\r
+    {\r
+        case FREQ_REQ_PING:\r
+            rc = send_ping_reply(frame);\r
+            break;\r
+\r
+#    ifndef ACCESS_POINT\r
+        case FREQ_REQ_MOVE:\r
+#        ifdef RANGE_EXTENDER\r
+            replayFirst(frame);\r
+#        endif\r
+\r
+            /* Make sure the change channel Freq command came from\r
+             * a valid source before obeying.\r
+             */\r
+            if (change_channel_cmd_is_valid(frame))\r
+            {\r
+                change_channel_cmd(frame);\r
+            }\r
+            break;\r
+#    endif\r
+\r
+#    ifdef ACCESS_POINT\r
+        case FREQ_REQ_REQ_MOVE:\r
+            break;\r
+#    endif\r
+        default:\r
+            break;\r
+    }\r
+\r
+    return rc;\r
+}\r
+\r
+#    ifndef ACCESS_POINT\r
+\r
+/******************************************************************************\r
+ * @fn          change_channel_cmd_is_valid\r
+ *\r
+ * @brief       Check validity of a change channel command frame.\r
+ *\r
+ * input parameters\r
+ * @param   frame  - pointer to frame with command context\r
+ *\r
+ * @return   Returns non-zero if command is valid, otherwise returns 0.\r
+ *           Command is valid if either:\r
+ *             - frame is directed\r
+ *             - frame is from an AP and we know about that AP\r
+ *\r
+ *           It is possible that either we don't know about an AP or that\r
+ *           we do but this frame comes from another AP in range.\r
+ */\r
+\r
+static uint8_t change_channel_cmd_is_valid(mrfiPacket_t *frame)\r
+{\r
+    uint8_t rc = 0;\r
+    addr_t const *apAddr;\r
+\r
+    /* If this was a directed frame obey the command. */\r
+    if (!memcmp(MRFI_P_DST_ADDR(frame), nwk_getMyAddress(), NET_ADDR_SIZE))\r
+    {\r
+        rc = 1;\r
+    }\r
+    else\r
+    {\r
+        /* Do we know about an AP? If not assume frame bogus. */\r
+        apAddr = nwk_getAPAddress();\r
+        if (apAddr)\r
+        {\r
+            /* Yes, we know about an AP. Is that who sent it? */\r
+            if (!memcmp(apAddr, MRFI_P_SRC_ADDR(frame), NET_ADDR_SIZE))\r
+            {\r
+                /* OK. We obey. */\r
+                rc = 1;\r
+            }\r
+        }\r
+    }\r
+\r
+    return rc;\r
+}\r
+\r
+#    endif /* !ACCESS_POINT */\r
+\r
+#    ifdef RANGE_EXTENDER\r
+\r
+/******************************************************************************\r
+ * @fn          replayFirst\r
+ *\r
+ * @brief       Range Extenders must replay the change-channel boradcast\r
+ *              frame before actually changing its own channel.\r
+ *\r
+ * input parameters\r
+ * @param   frame     - pointer to frame with command context\r
+ *\r
+ * @return   void\r
+ */\r
+\r
+/* This routine takes care of some awkwardness. From the dispatch thread all\r
+ * we have is a pointer to the mrfiPacket_t element in the frame buffer into\r
+ * which the frame was retrieved. But to call the replay routine we need the\r
+ * entire frame information structure frameInfo_t. This routine regenerates\r
+ * the frame information structure pointer and then calls the replay routine.\r
+ *\r
+ * This approach requires that the disptach thread guarantee that it will\r
+ * always pass a pointer to the mrfiPacket_t structure in the frame\r
+ * information structure and not a copy of the mrfipacket_t element. It is\r
+ * either the approach here or change all the NWK application dispatch routine\r
+ * argument types. This latter has the downside of interfering with any\r
+ * user-implemented NWK applications. It also needlessly complicates the argument\r
+ * handling: except for this instance all any routine needs is the mrfiPacket_t\r
+ * pointer.\r
+ */\r
+\r
+static void replayFirst(mrfiPacket_t *frame)\r
+{\r
+    frameInfo_t *fiptr;\r
+    uint16_t offset = (uint16_t)&(((frameInfo_t *)0)->mrfiPkt);\r
+\r
+    fiptr = (frameInfo_t *)(((uint8_t *)frame) - ((uint8_t *)offset));\r
+\r
+    nwk_replayFrame(fiptr);\r
+\r
+    return;\r
+}\r
+\r
+#    endif /* RANGE_EXTENDER */\r
+\r
+#    ifndef ACCESS_POINT\r
+\r
+/********************************************************************************\r
+ * @fn          change_channel_cmd\r
+ *\r
+ * @brief       Change to channel specified in received frame. Polling devices\r
+ *              might be awake when the broadcast occurs but we want the channel\r
+ *              change recovery to occur in a disciplined manner using the\r
+ *              polling code. Also, with certain Test sceanrios in which a\r
+ *              sleeping device is emulated we want to emulate 'missing' the\r
+ *              broadcast change-channel command.\r
+ *\r
+ * input parameters\r
+ * @param   frame     - pointer to frame containing target logical channel.\r
+ *\r
+ * @return   none.\r
+ */\r
+\r
+static void change_channel_cmd(mrfiPacket_t *frame)\r
+{\r
+#        if !defined(RX_POLLS)\r
+    freqEntry_t chan;\r
+\r
+    chan.logicalChan = *(MRFI_P_PAYLOAD(frame) + F_APP_PAYLOAD_OS + F_CHAN_OS);\r
+\r
+    nwk_setChannel(&chan);\r
+#        endif\r
+    return;\r
+}\r
+\r
+#    endif /* !ACCESS_POINT */\r
+\r
+/******************************************************************************\r
+ * @fn          send_ping_reply\r
+ *\r
+ * @brief       Send Frequency application ping reply.\r
+ *\r
+ * input parameters\r
+ * @param   frame     - pointer to frame from pinger.\r
+ *\r
+ * @return   FHS_RELEASE unless this isn't an Access Point. In this case for\r
+ *           flow to et this far it is a Range Extender, so replay the frame\r
+ *           by returning FHW_REPLAY\r
+ */\r
+\r
+static fhStatus_t send_ping_reply(mrfiPacket_t *frame)\r
+{\r
+#    ifdef ACCESS_POINT\r
+    uint8_t msg[FREQ_REQ_PING_FRAME_SIZE];\r
+    frameInfo_t *pOutFrame;\r
+\r
+    /* original request with reply bit on */\r
+    msg[FB_APP_INFO_OS] = *(MRFI_P_PAYLOAD(frame) + F_APP_PAYLOAD_OS) | NWK_APP_REPLY_BIT;\r
+    msg[FB_TID_OS]      = *(MRFI_P_PAYLOAD(frame) + F_APP_PAYLOAD_OS + FB_TID_OS);\r
+\r
+    if (pOutFrame = nwk_buildFrame(SMPL_PORT_FREQ, msg, sizeof(msg), MAX_HOPS_FROM_AP))\r
+    {\r
+        /* destination address is the source address of the received frame. */\r
+        memcpy(MRFI_P_DST_ADDR(&pOutFrame->mrfiPkt), MRFI_P_SRC_ADDR(frame), NET_ADDR_SIZE);\r
+        /* must use transaction ID of source frame */\r
+        PUT_INTO_FRAME(MRFI_P_PAYLOAD(&pOutFrame->mrfiPkt), F_TRACTID_OS,\r
+                       (GET_FROM_FRAME(MRFI_P_PAYLOAD(frame), F_TRACTID_OS)));\r
+#        ifdef SMPL_SECURE\r
+        nwk_setSecureFrame(&pOutFrame->mrfiPkt, sizeof(msg), 0);\r
+#        endif /* SMPL_SECURE */\r
+        nwk_sendFrame(pOutFrame, MRFI_TX_TYPE_FORCED);\r
+    }\r
+\r
+    return FHS_RELEASE;\r
+#    else\r
+    return FHS_REPLAY;\r
+#    endif     /* ACCESS_POINT */\r
+}\r
+\r
+/****************************************************************************************\r
+ * @fn          nwk_processFreq\r
+ *\r
+ * @brief       Process a Frequency application frame.\r
+ *\r
+ * input parameters\r
+ * @param   frame     - pointer to frame\r
+ *\r
+ * @return   Disposition for frame: either release (FHS_RELEASE) or replay (FHS_REPLAY).\r
+ */\r
+\r
+fhStatus_t nwk_processFreq(mrfiPacket_t *frame)\r
+{\r
+    fhStatus_t rc = FHS_RELEASE;\r
+    uint8_t replyType;\r
+\r
+    /* Make sure this is a reply and see if we sent this. Validate the\r
+     * packet for reception by client app.\r
+     */\r
+    if (SMPL_MY_REPLY == (replyType = nwk_isValidReply(frame, sTid, FB_APP_INFO_OS, FB_TID_OS)))\r
+    {\r
+        /* It's a match and it's a reply. Validate the received packet by\r
+         * returning a 1 so it can be received by the client app.\r
+         */\r
+        MRFI_PostKillSem();\r
+        rc = FHS_KEEP;\r
+    }\r
+#    if !defined(END_DEVICE)\r
+    else if (SMPL_A_REPLY == replyType)\r
+    {\r
+        /* no match. if i'm not an ED this is a reply that should be passed on. */\r
+        rc = FHS_REPLAY;\r
+    }\r
+#    endif /* !END_DEVICE */\r
+    else if (SMPL_NOT_REPLY == replyType)\r
+    {\r
+        rc = handle_freq_cmd(frame);\r
+    }\r
+\r
+    return rc;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_scanForChannels\r
+ *\r
+ * @brief       Scan for channels by sending a ping frame on each channel in the\r
+ *              channel table and listen for a reply.\r
+ *\r
+ * input parameters\r
+ * @param  channels    - pointer to area to receive list of channels from which\r
+ *                       ping replies were received.\r
+ *\r
+ * output parameters\r
+ * @param   channels   - populated list of channels.\r
+ *\r
+ * @return   statuis of operation..\r
+ */\r
+\r
+uint8_t nwk_scanForChannels(freqEntry_t *channels)\r
+{\r
+    uint8_t msg[FREQ_REQ_PING_FRAME_SIZE], i, num = 0, notBcast = 1;\r
+    addr_t      *apAddr, retAddr;\r
+    uint8_t radioState = MRFI_GetRadioState();\r
+    freqEntry_t chan;\r
+    freqEntry_t curChan;\r
+\r
+    union\r
+    {\r
+        ioctlRawSend_t send;\r
+        ioctlRawReceive_t recv;\r
+    } ioctl_info;\r
+\r
+    nwk_getChannel(&curChan);\r
+\r
+    /* send to AP. If we don't know AP address, broadcast. */\r
+    apAddr = (addr_t *)nwk_getAPAddress();\r
+    if (!apAddr)\r
+    {\r
+        apAddr = (addr_t *)nwk_getBCastAddress();\r
+        notBcast = 0;\r
+    }\r
+\r
+    for (i = 0; i < NWK_FREQ_TBL_SIZE; ++i)\r
+    {\r
+        chan.logicalChan = i;\r
+\r
+        nwk_setChannel(&chan);\r
+\r
+        ioctl_info.send.addr = apAddr;\r
+        ioctl_info.send.msg  = msg;\r
+        ioctl_info.send.len  = sizeof(msg);\r
+        ioctl_info.send.port = SMPL_PORT_FREQ;\r
+\r
+        msg[FB_APP_INFO_OS] = FREQ_REQ_PING;\r
+        msg[FB_TID_OS]      = sTid;\r
+\r
+        SMPL_Ioctl(IOCTL_OBJ_RAW_IO, IOCTL_ACT_WRITE, &ioctl_info.send);\r
+\r
+        ioctl_info.recv.port = SMPL_PORT_FREQ;\r
+        ioctl_info.recv.msg  = msg;\r
+        ioctl_info.recv.addr = &retAddr;\r
+\r
+        NWK_CHECK_FOR_SETRX(radioState);\r
+        NWK_REPLY_DELAY();\r
+        NWK_CHECK_FOR_RESTORE_STATE(radioState);\r
+\r
+        if (SMPL_SUCCESS == SMPL_Ioctl(IOCTL_OBJ_RAW_IO, IOCTL_ACT_READ, &ioctl_info.recv))\r
+        {\r
+            /* Once we know the Access Point we're related to we only accept\r
+             * ping replies from that one.\r
+             */\r
+            if (!notBcast || (notBcast && !memcmp(&retAddr, apAddr, NET_ADDR_SIZE)))\r
+            {\r
+                channels[num++].logicalChan = i;\r
+            }\r
+        }\r
+\r
+        sTid++;\r
+        if (num && notBcast)\r
+        {\r
+            /* we're done...only one possible channel if we know the AP address. */\r
+            break;\r
+        }\r
+        /* TODO: process encryption stuff */\r
+    }\r
+\r
+    /* reset original channel */\r
+    nwk_setChannel(&curChan);\r
+\r
+    return num;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_freqControl\r
+ *\r
+ * @brief       Handle application requests received through IOCTL interface.\r
+ *\r
+ * input parameters\r
+ * @param   action  - requested action\r
+ * @param   val     - pointer to parameters required/returned for action\r
+ *\r
+ * output parameters\r
+ * @param   val   - populated values if action was a retrieval action.\r
+ *\r
+ * @return   status of operation.\r
+ */\r
+\r
+smplStatus_t nwk_freqControl(ioctlAction_t action, void *val)\r
+{\r
+    smplStatus_t rc;\r
+\r
+    switch (action)\r
+    {\r
+        case IOCTL_ACT_SET:\r
+#    ifdef ACCESS_POINT\r
+            broadcast_channel_change(((freqEntry_t *)val)->logicalChan);\r
+#    endif /* ACCESS_POINT */\r
+            rc = nwk_setChannel((freqEntry_t *)val);\r
+            break;\r
+\r
+        case IOCTL_ACT_GET:\r
+            nwk_getChannel((freqEntry_t *)val);\r
+            rc = SMPL_SUCCESS;\r
+            break;\r
+\r
+        case IOCTL_ACT_SCAN:\r
+        {\r
+            ioctlScanChan_t *sc = (ioctlScanChan_t *)val;\r
+\r
+            sc->numChan = nwk_scanForChannels(sc->freq);\r
+            rc = SMPL_SUCCESS;\r
+        }\r
+        break;\r
+\r
+        default:\r
+            rc = SMPL_BAD_PARAM;\r
+            break;\r
+    }\r
+\r
+    return rc;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          broadcast_channel_change\r
+ *\r
+ * @brief       For Access Point only: broadcast a channel change frame.\r
+ *\r
+ * input parameters\r
+ * @param   idx  -  index into channel table of new (logical) channel\r
+ *\r
+ * @return   none.\r
+ */\r
+#    ifdef ACCESS_POINT\r
+#        define CC_REDUNDANCY      1 /* Change-channel redundancy count */\r
+static void broadcast_channel_change(uint8_t idx)\r
+{\r
+    ioctlRawSend_t send;\r
+    uint8_t msg[FREQ_REQ_MOVE_FRAME_SIZE];\r
+    uint8_t repeat = CC_REDUNDANCY;\r
+\r
+    if (idx >= NWK_FREQ_TBL_SIZE)\r
+    {\r
+        return;\r
+    }\r
+\r
+    msg[FB_APP_INFO_OS] = FREQ_REQ_MOVE;\r
+    msg[F_CHAN_OS]      = idx;\r
+\r
+    send.addr = (addr_t *)nwk_getBCastAddress();\r
+    send.msg  = msg;\r
+    send.len  = sizeof(msg);\r
+    send.port = SMPL_PORT_FREQ;\r
+\r
+    SMPL_Ioctl(IOCTL_OBJ_RAW_IO, IOCTL_ACT_WRITE, &send);\r
+\r
+    /* Redundancy addresses the fact that an RE (or any always-listening\r
+     * device) might miss the command\r
+     */\r
+    while (repeat--)\r
+    {\r
+        NWK_DELAY(250);\r
+        SMPL_Ioctl(IOCTL_OBJ_RAW_IO, IOCTL_ACT_WRITE, &send);\r
+    }\r
+}\r
+\r
+#    endif /* ACCESS_POINT */\r
+\r
+#else  /* FREQUENCY_AGILITY */\r
+\r
+/**********************************************************************************\r
+ * @fn          nwk_freqInit\r
+ *\r
+ * @brief       Initialize NWK Frequency application. Stub when Frequency Agility\r
+ *              not supported.\r
+ *\r
+ * @return   none.\r
+ */\r
+\r
+void nwk_freqInit(void)\r
+{\r
+    return;\r
+}\r
+\r
+/****************************************************************************************\r
+ * @fn          nwk_processFreq\r
+ *\r
+ * @brief       Process a Frequency application frame. Stub when Frequency Agility\r
+ *              not supported.\r
+ *\r
+ * input parameters\r
+ * @param   frame     - pointer to frame\r
+ *\r
+ * @return   Disposition for frame: either release (FHS_RELEASE) or replay (FHS_REPLAY).\r
+ */\r
+\r
+fhStatus_t nwk_processFreq(mrfiPacket_t *frame)\r
+{\r
+    return FHS_RELEASE;\r
+}\r
+\r
+#endif  /* FREQUENCY_AGILITY */\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/simpliciti/Components/nwk_applications/nwk_freq.h b/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/simpliciti/Components/nwk_applications/nwk_freq.h
new file mode 100755 (executable)
index 0000000..05c9b41
--- /dev/null
@@ -0,0 +1,74 @@
+/**************************************************************************************************\r
+*  Filename:       nwk_freq.h\r
+*  Revised:        $Date: 2008-05-06 16:48:33 -0700 (Tue, 06 May 2008) $\r
+*  Revision:       $Revision: 17025 $\r
+*  Author:         $Author: lfriedman $\r
+*\r
+*  Description:    This header file supports the SimpliciTI Freq network application.\r
+*\r
+*  Copyright 2004-2007 Texas Instruments Incorporated. All rights reserved.\r
+*\r
+*  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+*  the terms of a software license agreement between the user who downloaded the software,\r
+*  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+*  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+*  License. The License limits your use, and you acknowledge, that the Software may not be\r
+*  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+*  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+*  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+*  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+*  perform, display or sell this Software and/or its documentation for any purpose.\r
+*\r
+*  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+*  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+*  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+*  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+*  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+*  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+*  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+*  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+*  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+*\r
+*  Should you have any questions regarding your right to use this Software,\r
+*  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+#ifndef NWK_FREQ_H\r
+#define NWK_FREQ_H\r
+\r
+/* application payload offsets\r
+ *    both */\r
+#define FB_APP_INFO_OS     0\r
+#define FB_TID_OS          1\r
+\r
+/* Logical channel number for MOVE request. Frame brodcast so no TID\r
+ * is used. Channel number can occupy the TID location. Same offset\r
+ * used for channel change request. No reply to that frame.\r
+ */\r
+#define F_CHAN_OS          1\r
+\r
+/* MGMT frame application requests */\r
+#define  FREQ_REQ_MOVE        0x01\r
+#define  FREQ_REQ_PING        0x02\r
+#define  FREQ_REQ_REQ_MOVE    0x03\r
+\r
+/* change the following as protocol developed */\r
+#define MAX_FREQ_APP_FRAME    2\r
+\r
+/* set the out frame sizes */\r
+#define  FREQ_REQ_MOVE_FRAME_SIZE   2\r
+#define  FREQ_REQ_PING_FRAME_SIZE   2\r
+\r
+/* prototypes */\r
+void nwk_freqInit(void);\r
+fhStatus_t nwk_processFreq(mrfiPacket_t *);\r
+\r
+#if defined(FREQUENCY_AGILITY)\r
+smplStatus_t nwk_setChannel(freqEntry_t *);\r
+void nwk_getChannel(freqEntry_t *);\r
+uint8_t nwk_scanForChannels(freqEntry_t *);\r
+\r
+smplStatus_t nwk_freqControl(ioctlAction_t, void *);\r
+#endif\r
+\r
+#endif\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/simpliciti/Components/nwk_applications/nwk_ioctl.c b/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/simpliciti/Components/nwk_applications/nwk_ioctl.c
new file mode 100755 (executable)
index 0000000..9d88be2
--- /dev/null
@@ -0,0 +1,356 @@
+\r
+/**************************************************************************************************\r
+*  Filename:       nwk_ioctl.c\r
+*  Revised:        $Date: 2009-01-13 11:31:14 -0800 (Tue, 13 Jan 2009) $\r
+*  Revision:       $Revision: 18744 $\r
+*  Author:         $Author: lfriedman $\r
+*\r
+*  Description:    This file supports the SimpliciTI IOCTL implmentation. This interface\r
+*                 gives applications access to the "driver" network level functions\r
+*                 when necessary.\r
+*\r
+*  Copyright 2004-2007 Texas Instruments Incorporated. All rights reserved.\r
+*\r
+*  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+*  the terms of a software license agreement between the user who downloaded the software,\r
+*  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+*  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+*  License. The License limits your use, and you acknowledge, that the Software may not be\r
+*  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+*  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+*  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+*  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+*  perform, display or sell this Software and/or its documentation for any purpose.\r
+*\r
+*  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+*  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+*  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+*  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+*  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+*  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+*  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+*  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+*  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+*\r
+*  Should you have any questions regarding your right to use this Software,\r
+*  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+\r
+/******************************************************************************\r
+ * INCLUDES\r
+ */\r
+#include <string.h>\r
+#include "bsp.h"\r
+#include "mrfi.h"\r
+#include "nwk_types.h"\r
+#include "nwk_frame.h"\r
+#include "nwk.h"\r
+#include "nwk_ioctl.h"\r
+#include "nwk_globals.h"\r
+#include "nwk_security.h"\r
+#ifdef ACCESS_POINT\r
+#    include "nwk_join.h"\r
+#endif\r
+\r
+/******************************************************************************\r
+ * MACROS\r
+ */\r
+\r
+/******************************************************************************\r
+ * CONSTANTS AND DEFINES\r
+ */\r
+\r
+/******************************************************************************\r
+ * TYPEDEFS\r
+ */\r
+\r
+/******************************************************************************\r
+ * LOCAL VARIABLES\r
+ */\r
+\r
+/******************************************************************************\r
+ * LOCAL FUNCTIONS\r
+ */\r
+\r
+/******************************************************************************\r
+ * GLOBAL VARIABLES\r
+ */\r
+\r
+/******************************************************************************\r
+ * GLOBAL FUNCTIONS\r
+ */\r
+\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_rawSend\r
+ *\r
+ * @brief       Builds an outut frame based on information provided by the\r
+ *              caller. This function allows a raw transmission to the target\r
+ *              if the network address is known. this function is used a lot\r
+ *              to support NWK applications.\r
+ *\r
+ * input parameters\r
+ * @param   info    - pointer to strcuture containing info on how to build\r
+ *                    the outgoing frame.\r
+ * output parameters\r
+ *\r
+ * @return         SMPL_SUCCESS\r
+ *                 SMPL_NOMEM       - no room in output frame queue\r
+ *                 SMPL_TX_CCA_FAIL - CCA failure\r
+ */\r
+\r
+smplStatus_t nwk_rawSend(ioctlRawSend_t *info)\r
+{\r
+    frameInfo_t *pOutFrame;\r
+    uint8_t hops;\r
+\r
+    /* If we know frame is going to or from the AP then we can reduce the hop\r
+     * count.\r
+     */\r
+    switch (info->port)\r
+    {\r
+        case SMPL_PORT_JOIN:\r
+        case SMPL_PORT_FREQ:\r
+        case SMPL_PORT_MGMT:\r
+            hops = MAX_HOPS_FROM_AP;\r
+            break;\r
+\r
+        default:\r
+            hops = MAX_HOPS;\r
+            break;\r
+    }\r
+\r
+    if (pOutFrame = nwk_buildFrame(info->port, info->msg, info->len, hops))\r
+    {\r
+        memcpy(MRFI_P_DST_ADDR(&pOutFrame->mrfiPkt), info->addr, NET_ADDR_SIZE);\r
+#ifdef SMPL_SECURE\r
+        nwk_setSecureFrame(&pOutFrame->mrfiPkt, info->len, 0);\r
+#endif  /* SMPL_SECURE */\r
+        return nwk_sendFrame(pOutFrame, MRFI_TX_TYPE_CCA);\r
+    }\r
+    return SMPL_NOMEM;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_rawReceive\r
+ *\r
+ * @brief       Retriievs specified from from the input frame queue. Additional\r
+ *              information such as source address and hop count may also be\r
+ *              retrieved\r
+ *\r
+ * input parameters\r
+ * @param   info    - pointer to structure containing info on what to retrieve\r
+ *\r
+ * output parameters - actually populated by nwk_retrieveFrame()\r
+ *      info->msg      - application payload copied here\r
+ *      info->len      - length of received application payload\r
+ *      info->addr     - if non-NULL points to memory to be populated with\r
+ *                       source address of retrieved frame.\r
+ *      info->hopCount - if non-NULL points to memory to be populated with\r
+ *                       hop count of retrieved frame.\r
+ *\r
+ * @return   Status of operation.\r
+ */\r
+\r
+smplStatus_t nwk_rawReceive(ioctlRawReceive_t *info)\r
+{\r
+    rcvContext_t rcv;\r
+\r
+    rcv.type   = RCV_NWK_PORT;\r
+    rcv.t.port = info->port;\r
+\r
+    return nwk_retrieveFrame(&rcv, info->msg, &info->len, info->addr, &info->hopCount);\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_radioControl\r
+ *\r
+ * @brief       Handle radio control functions.\r
+ *\r
+ * input parameters\r
+ * @param   action   - radio operation to perform. currently suppoerted:\r
+ *                         sleep/unsleep\r
+ * output parameters\r
+ *\r
+ * @return   Status of operation.\r
+ */\r
+\r
+smplStatus_t nwk_radioControl(ioctlAction_t action, void *val)\r
+{\r
+    smplStatus_t rc = SMPL_SUCCESS;\r
+\r
+    if (IOCTL_ACT_RADIO_SLEEP == action)\r
+    {\r
+        /* go to sleep mode. */\r
+        MRFI_RxIdle();\r
+        MRFI_Sleep();\r
+    }\r
+    else if (IOCTL_ACT_RADIO_AWAKE == action)\r
+    {\r
+        MRFI_WakeUp();\r
+\r
+#if !defined(END_DEVICE)\r
+        MRFI_RxOn();\r
+#endif\r
+\r
+    }\r
+    else if (IOCTL_ACT_RADIO_SIGINFO == action)\r
+    {\r
+        ioctlRadioSiginfo_t *pSigInfo = (ioctlRadioSiginfo_t *)val;\r
+        connInfo_t          *pCInfo   = nwk_getConnInfo(pSigInfo->lid);\r
+\r
+        if (!pCInfo)\r
+        {\r
+            return SMPL_BAD_PARAM;\r
+        }\r
+        memcpy(&pSigInfo->sigInfo, &pCInfo->sigInfo, sizeof(pCInfo->sigInfo));\r
+    }\r
+    else if (IOCTL_ACT_RADIO_RSSI == action)\r
+    {\r
+        *((rssi_t *)val) = MRFI_Rssi();\r
+    }\r
+    else if (IOCTL_ACT_RADIO_RXON == action)\r
+    {\r
+        MRFI_RxOn();\r
+    }\r
+    else if (IOCTL_ACT_RADIO_RXIDLE == action)\r
+    {\r
+        MRFI_RxIdle();\r
+    }\r
+#ifdef EXTENDED_API\r
+    else if (IOCTL_ACT_RADIO_SETPWR == action)\r
+    {\r
+        uint8_t idx;\r
+\r
+        switch (*(ioctlLevel_t *)val)\r
+        {\r
+            case IOCTL_LEVEL_2:\r
+                idx = 2;\r
+                break;\r
+\r
+            case IOCTL_LEVEL_1:\r
+                idx = 1;\r
+                break;\r
+\r
+            case IOCTL_LEVEL_0:\r
+                idx = 0;\r
+                break;\r
+\r
+            default:\r
+                return SMPL_BAD_PARAM;\r
+        }\r
+        MRFI_SetRFPwr(idx);\r
+        return SMPL_SUCCESS;\r
+    }\r
+#endif  /* EXTENDED_API */\r
+    else\r
+    {\r
+        rc = SMPL_BAD_PARAM;\r
+    }\r
+    return rc;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_joinContext\r
+ *\r
+ * @brief       For Access Points we need a way to support changing the Join\r
+ *              context. This will allow arbitration bewteen potentially nearby\r
+ *              Access Points when a new device is joining.\r
+ *\r
+ * input parameters\r
+ * @param   action  - Join context is either on or off.\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   Status of operation. Currently always succeeds.\r
+ */\r
+#ifdef ACCESS_POINT\r
+smplStatus_t nwk_joinContext(ioctlAction_t action)\r
+{\r
+    nwk_setJoinContext((IOCTL_ACT_ON == action) ? JOIN_CONTEXT_ON : JOIN_CONTEXT_OFF);\r
+\r
+    return SMPL_SUCCESS;\r
+}\r
+\r
+#endif\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_deviceAddress\r
+ *\r
+ * @brief       Set or Get this device address. The Set must be done before\r
+ *              SMPL_Init() for it to take effect. The Get is always legal but\r
+ *              the value could be invalid if it is called before a valid set\r
+ *              call is made.\r
+ *\r
+ * input parameters\r
+ * @param   action  - Gte or Set\r
+ * @param   addr    - pointer to address object containing value on Set\r
+ *\r
+ * output parameters\r
+ * @param   addr    - pointer to address object to receive value on Get.\r
+ *\r
+ * @return   SMPL_SUCCESS\r
+ *           SMPL_BAD_PARAM  Action request illegal or a Set request\r
+ *                           was not respected.\r
+ */\r
+\r
+smplStatus_t nwk_deviceAddress(ioctlAction_t action, addr_t *addr)\r
+{\r
+    smplStatus_t rc = SMPL_BAD_PARAM;\r
+\r
+    if (IOCTL_ACT_GET == action)\r
+    {\r
+        memcpy(addr, nwk_getMyAddress(), sizeof(addr_t));\r
+        rc = SMPL_SUCCESS;\r
+    }\r
+    else if (IOCTL_ACT_SET == action)\r
+    {\r
+        if (nwk_setMyAddress(addr))\r
+        {\r
+            rc = SMPL_SUCCESS;\r
+        }\r
+    }\r
+\r
+    return rc;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_connectionControl\r
+ *\r
+ * @brief       Access to connection table. Currently supports only deleting\r
+ *              a connection from the table.\r
+ *\r
+ * input parameters\r
+ * @param   action  - Connection control action (only delete is curently valid).\r
+ * @param   val     - pointer to Link ID of connection on which to operate.\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   SMPL_SUCCESS\r
+ *           SMPL_BAD_PARAM  Action is not delete\r
+ *                           Link ID is the UUD Link ID\r
+ *                           No connection table info for Link ID\r
+ */\r
+\r
+smplStatus_t nwk_connectionControl(ioctlAction_t action, void *val)\r
+{\r
+    connInfo_t *pCInfo;\r
+    linkID_t lid = *((linkID_t *)val);\r
+\r
+    if (IOCTL_ACT_DELETE != action)\r
+    {\r
+        return SMPL_BAD_PARAM;\r
+    }\r
+\r
+    if ((SMPL_LINKID_USER_UUD == lid) ||\r
+        (!(pCInfo = nwk_getConnInfo(lid))))\r
+    {\r
+        return SMPL_BAD_PARAM;\r
+    }\r
+\r
+    nwk_freeConnection(pCInfo);\r
+\r
+    return SMPL_SUCCESS;\r
+}\r
+\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/simpliciti/Components/nwk_applications/nwk_ioctl.h b/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/simpliciti/Components/nwk_applications/nwk_ioctl.h
new file mode 100755 (executable)
index 0000000..3b583a9
--- /dev/null
@@ -0,0 +1,54 @@
+/**************************************************************************************************\r
+*  Filename:       nwk_ioctl.h\r
+*  Revised:        $Date: 2008-04-29 15:47:05 -0700 (Tue, 29 Apr 2008) $\r
+*  Revision:       $Revision: 16972 $\r
+*  Author:         $Author: lfriedman $\r
+*\r
+*  Description:    This header file supports the SimpliciTI IOCTL implmentation. This interface\r
+*                 gives applications access to the "driver" network level functions\r
+*                 when necessary.\r
+*\r
+*  Copyright 2004-2007 Texas Instruments Incorporated. All rights reserved.\r
+*\r
+*  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+*  the terms of a software license agreement between the user who downloaded the software,\r
+*  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+*  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+*  License. The License limits your use, and you acknowledge, that the Software may not be\r
+*  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+*  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+*  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+*  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+*  perform, display or sell this Software and/or its documentation for any purpose.\r
+*\r
+*  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+*  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+*  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+*  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+*  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+*  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+*  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+*  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+*  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+*\r
+*  Should you have any questions regarding your right to use this Software,\r
+*  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+\r
+\r
+#ifndef NWK_IOCTL_H\r
+#define NWK_IOCTL_H\r
+\r
+/* prototypes */\r
+smplStatus_t nwk_rawSend(ioctlRawSend_t *);\r
+smplStatus_t nwk_rawReceive(ioctlRawReceive_t *);\r
+\r
+smplStatus_t nwk_radioControl(ioctlAction_t, void *);\r
+smplStatus_t nwk_deviceAddress(ioctlAction_t, addr_t *);\r
+smplStatus_t nwk_connectionControl(ioctlAction_t, void *);\r
+#ifdef ACCESS_POINT\r
+smplStatus_t nwk_joinContext(ioctlAction_t);\r
+#endif\r
+\r
+#endif\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/simpliciti/Components/nwk_applications/nwk_join.c b/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/simpliciti/Components/nwk_applications/nwk_join.c
new file mode 100755 (executable)
index 0000000..039bddd
--- /dev/null
@@ -0,0 +1,599 @@
+/**************************************************************************************************\r
+*  Filename:       nwk_join.c\r
+*  Revised:        $Date: 2009-01-06 15:45:54 -0800 (Tue, 06 Jan 2009) $\r
+*  Revision:       $Revision: 18697 $\r
+*\r
+*  Description:    This file supports the SimpliciTI Join network application.\r
+*\r
+*  Copyright 2007-2009 Texas Instruments Incorporated. All rights reserved.\r
+*\r
+*  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+*  the terms of a software license agreement between the user who downloaded the software,\r
+*  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+*  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+*  License. The License limits your use, and you acknowledge, that the Software may not be\r
+*  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+*  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+*  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+*  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+*  perform, display or sell this Software and/or its documentation for any purpose.\r
+*\r
+*  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+*  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+*  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+*  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+*  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+*  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+*  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+*  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+*  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+*\r
+*  Should you have any questions regarding your right to use this Software,\r
+*  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+\r
+/******************************************************************************\r
+ * INCLUDES\r
+ */\r
+#include <string.h>\r
+#include "bsp.h"\r
+#include "mrfi.h"\r
+#include "nwk_types.h"\r
+#include "nwk_api.h"\r
+#include "nwk_frame.h"\r
+#include "nwk.h"\r
+#include "nwk_link.h"\r
+#include "nwk_join.h"\r
+#include "nwk_globals.h"\r
+#include "nwk_freq.h"\r
+#include "nwk_security.h"\r
+#include "nwk_mgmt.h"\r
+\r
+/******************************************************************************\r
+ * MACROS\r
+ */\r
+\r
+/******************************************************************************\r
+ * CONSTANTS AND DEFINES\r
+ */\r
+\r
+/******************************************************************************\r
+ * TYPEDEFS\r
+ */\r
+\r
+/******************************************************************************\r
+ * LOCAL VARIABLES\r
+ */\r
+\r
+static uint32_t sJoinToken = 0;\r
+static uint8_t (*spCallback)(linkID_t) = NULL;\r
+static volatile uint8_t sTid = 0;\r
+\r
+#ifdef ACCESS_POINT\r
+static sfInfo_t *spSandFContext = NULL;\r
+static uint8_t sJoinOK = 0;\r
+#endif /* ACCESS_POINT */\r
+\r
+/******************************************************************************\r
+ * LOCAL FUNCTIONS\r
+ */\r
+#ifdef ACCESS_POINT\r
+static void smpl_send_join_reply(mrfiPacket_t *frame);\r
+static uint32_t generateLinkToken(void);\r
+static void handleJoinRequest(mrfiPacket_t *);\r
+\r
+#endif /*  ACCESS_POINT */\r
+\r
+/******************************************************************************\r
+ * GLOBAL VARIABLES\r
+ */\r
+\r
+/******************************************************************************\r
+ * GLOBAL FUNCTIONS\r
+ */\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_joinInit\r
+ *\r
+ * @brief       Initialize Join application.\r
+ *\r
+ * input parameters\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   void\r
+ */\r
+\r
+void nwk_joinInit(uint8_t (*pf)(linkID_t))\r
+{\r
+    if (!sJoinToken)\r
+    {\r
+        sJoinToken = DEFAULT_JOIN_TOKEN;\r
+    }\r
+\r
+    spCallback = pf;\r
+    (void) spCallback; /* keep compiler happy if we don't use this */\r
+\r
+    sTid = MRFI_RandomByte();\r
+\r
+#ifdef ACCESS_POINT\r
+    /* set link token to something other than deafult if desired */\r
+    nwk_setLinkToken(generateLinkToken());\r
+#    if defined(STARTUP_JOINCONTEXT_ON)\r
+    sJoinOK = 1;\r
+#    elif defined(STARTUP_JOINCONTEXT_OFF)\r
+    sJoinOK = 0;\r
+#    else\r
+#        error ERROR: Must define either STARTUP_JOINCONTEXT_ON or STARTUP_JOINCONTEXT_OFF\r
+#    endif\r
+    spSandFContext = nwk_getSFInfoPtr();\r
+#endif\r
+\r
+    return;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_setJoinToken\r
+ *\r
+ * @brief       Sets the join token.\r
+ *\r
+ * input parameters\r
+ * @param   token   - join token to be used on this network.\r
+ *\r
+ * output parameters\r
+ *         no room in output queue.\r
+ *\r
+ * @return   void\r
+ */\r
+\r
+void nwk_setJoinToken(uint32_t token)\r
+{\r
+    /* only set if the supplied token is non-zero. */\r
+    if (token)\r
+    {\r
+        sJoinToken = token;\r
+    }\r
+\r
+    return;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_getJoinToken\r
+ *\r
+ * @brief       Gets the current join token.\r
+ *\r
+ * input parameters\r
+ *\r
+ * output parameters\r
+ * @param   pToken   - pointer to the returned value.\r
+ *\r
+ * @return   Current link token\r
+ */\r
+\r
+void nwk_getJoinToken(uint32_t *pToken)\r
+{\r
+    /* only set if the supplied token is non-zero. */\r
+    if (pToken)\r
+    {\r
+        *pToken = sJoinToken;\r
+    }\r
+\r
+    return;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          generateLinkToken\r
+ *\r
+ * @brief       Generate the link token to be used for the network controlled\r
+ *              by this Access Point.\r
+ *\r
+ * input parameters\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   void\r
+ */\r
+#ifdef ACCESS_POINT\r
+static uint32_t generateLinkToken(void)\r
+{\r
+    return 0xDEADBEEF;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          smpl_send_join_reply\r
+ *\r
+ * @brief       Send the Join reply. Include the Link token. If the device is\r
+ *              a polling sleeper put it into the list of store-and-forward\r
+ *              clients.\r
+ *\r
+ * input parameters\r
+ * @param   frame     - join frame for which a reply is needed...maybe\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   void\r
+ */\r
+\r
+static void smpl_send_join_reply(mrfiPacket_t *frame)\r
+{\r
+    frameInfo_t *pOutFrame;\r
+    uint8_t msg[JOIN_REPLY_FRAME_SIZE];\r
+\r
+    /* Is this a legacy frame? If so continue. Otherwise check verion.*/\r
+    if ((MRFI_GET_PAYLOAD_LEN(frame) - F_APP_PAYLOAD_OS) > JOIN_LEGACY_MSG_LENGTH)\r
+    {\r
+        /* see if protocol version is correct... */\r
+        if (*(MRFI_P_PAYLOAD(frame) + F_APP_PAYLOAD_OS + J_PROTOCOL_VERSION_OS) !=\r
+            nwk_getProtocolVersion())\r
+        {\r
+            /* Accommodation of protocol version differences can be noted or accomplished here.\r
+             * Otherwise, no match and the board goes back\r
+             */\r
+            return;\r
+        }\r
+    }\r
+\r
+\r
+    /* see if join token is correct */\r
+    {\r
+        uint32_t jt;\r
+\r
+        nwk_getNumObjectFromMsg(MRFI_P_PAYLOAD(\r
+                                    frame) + F_APP_PAYLOAD_OS + J_JOIN_TOKEN_OS, &jt, sizeof(jt));\r
+        if (jt != sJoinToken)\r
+        {\r
+            return;\r
+        }\r
+    }\r
+\r
+    /* send reply with tid, the link token, and the encryption context */\r
+    {\r
+        uint32_t linkToken;\r
+\r
+        nwk_getLinkToken(&linkToken);\r
+        nwk_putNumObjectIntoMsg((void *)&linkToken, msg + JR_LINK_TOKEN_OS, sizeof(linkToken));\r
+    }\r
+    msg[JR_CRYPTKEY_SIZE_OS] = SEC_CRYPT_KEY_SIZE;\r
+    msg[JB_REQ_OS]           = JOIN_REQ_JOIN | NWK_APP_REPLY_BIT;\r
+    /* sender's tid... */\r
+    msg[JB_TID_OS]           = *(MRFI_P_PAYLOAD(frame) + F_APP_PAYLOAD_OS + JB_TID_OS);\r
+\r
+    if (pOutFrame = nwk_buildFrame(SMPL_PORT_JOIN, msg, sizeof(msg), MAX_HOPS_FROM_AP))\r
+    {\r
+        /* destination address is the source adddress of the received frame. */\r
+        memcpy(MRFI_P_DST_ADDR(&pOutFrame->mrfiPkt), MRFI_P_SRC_ADDR(frame), NET_ADDR_SIZE);\r
+\r
+#    ifdef AP_IS_DATA_HUB\r
+        /* if source device supports ED objects save source address to detect duplicate joins */\r
+        if (*(MRFI_P_PAYLOAD(frame) + F_APP_PAYLOAD_OS + J_NUMCONN_OS))\r
+        {\r
+            if (nwk_saveJoinedDevice(frame) && spCallback)\r
+            {\r
+                spCallback(0);\r
+            }\r
+        }\r
+#    endif\r
+    }\r
+    else\r
+    {\r
+        /* oops -- no room left for Tx frame. Don't send reply. */\r
+        return;\r
+    }\r
+\r
+    /* If this device polls we need to provide store-and-forward support */\r
+    if (GET_FROM_FRAME(MRFI_P_PAYLOAD(frame), F_RX_TYPE) == F_RX_TYPE_POLLS)\r
+    {\r
+        uint8_t loc;\r
+\r
+        /* Check duplicate status */\r
+        if (!nwk_isSandFClient(MRFI_P_SRC_ADDR(frame), &loc))\r
+        {\r
+            uint8_t        *pNumc   = &spSandFContext->curNumSFClients;\r
+            sfClientInfo_t *pClient = &spSandFContext->sfClients[*pNumc];\r
+\r
+            /* It's not a duplicate. Save it if there's room */\r
+            if (*pNumc < NUM_STORE_AND_FWD_CLIENTS)\r
+            {\r
+                memcpy(pClient->clientAddr.addr, MRFI_P_SRC_ADDR(frame), NET_ADDR_SIZE);\r
+                *pNumc = *pNumc + 1;\r
+            }\r
+            else\r
+            {\r
+                /* No room left. Just return and don't send reply. */\r
+                return;\r
+            }\r
+        }\r
+        else\r
+        {\r
+            /* We get here if it's a duplicate. We drop through and send reply.\r
+             * Reset the S&F marker in the Management application -- we should\r
+             * assume that the Client reset so the TID will be random. If this is\r
+             * simply a duplicate frame it causes no harm.\r
+             */\r
+            nwk_resetSFMarker(loc);\r
+        }\r
+    }\r
+\r
+#    ifdef SMPL_SECURE\r
+    nwk_setSecureFrame(&pOutFrame->mrfiPkt, sizeof(msg), 0);\r
+#    endif /* SMPL_SECURE */\r
+\r
+    /* It's not S&F or it is but we're OK to send reply. */\r
+    nwk_sendFrame(pOutFrame, MRFI_TX_TYPE_FORCED);\r
+\r
+    return;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_join\r
+ *\r
+ * @brief       Stub Join function for Access Points.\r
+ *\r
+ * input parameters\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   Always returns SMPL_SUCCESS.\r
+ */\r
+\r
+smplStatus_t nwk_join(void)\r
+{\r
+    return SMPL_SUCCESS;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_isSandFClient\r
+ *\r
+ * @brief       Helper function to see if the destination of a frame we have is\r
+ *              one of AP's store-and-forward clients.\r
+ *\r
+ * input parameters\r
+ * @param   fPtr     - pointer to address in frame in question\r
+ *\r
+ * output parameters\r
+ * @param   entLoc   - pointer to receive entry location in array of clients.\r
+ *\r
+ * @return   Returns client info structure pointer if the destination is a\r
+ *           store-and-forward client, else 0.\r
+ */\r
+\r
+sfClientInfo_t *nwk_isSandFClient(uint8_t *pAddr, uint8_t *entLoc)\r
+{\r
+    uint8_t i;\r
+    sfClientInfo_t *pSFClient = spSandFContext->sfClients;\r
+\r
+    for (i = 0; i < spSandFContext->curNumSFClients; ++i, ++pSFClient)\r
+    {\r
+        if (!memcmp(&pSFClient->clientAddr.addr, pAddr, NET_ADDR_SIZE))\r
+        {\r
+            *entLoc = i;\r
+            return pSFClient;\r
+        }\r
+    }\r
+\r
+    return 0;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_setJoinContext\r
+ *\r
+ * @brief       Helper function to set Join context for Access Point. This will\r
+ *              allow arbitration bewteen potentially nearby Access Points when\r
+ *              a new device is joining.\r
+ *\r
+ * input parameters\r
+ * @param   which   - Join context is either off or on\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   void\r
+ */\r
+\r
+void nwk_setJoinContext(uint8_t which)\r
+{\r
+    sJoinOK = (JOIN_CONTEXT_ON == which) ? 1 : 0;\r
+\r
+    return;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          handleJoinRequest\r
+ *\r
+ * @brief       Dispatches handler for specfic join request\r
+ *\r
+ * input parameters\r
+ *\r
+ * @param   frame - Join frame received\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   void\r
+ */\r
+\r
+static void handleJoinRequest(mrfiPacket_t *frame)\r
+{\r
+    if (JOIN_LEGACY_MSG_LENGTH == (MRFI_GET_PAYLOAD_LEN(frame) - F_APP_PAYLOAD_OS))\r
+    {\r
+        /* Legacy frame. Spoof a join request */\r
+        *(MRFI_P_PAYLOAD(frame) + F_APP_PAYLOAD_OS) = JOIN_REQ_JOIN;\r
+    }\r
+\r
+    switch (*(MRFI_P_PAYLOAD(frame) + F_APP_PAYLOAD_OS))\r
+    {\r
+        case JOIN_REQ_JOIN:\r
+            smpl_send_join_reply(frame);\r
+            break;\r
+\r
+        default:\r
+            break;\r
+    }\r
+\r
+    return;\r
+}\r
+\r
+#else  /* ACCESS_POINT */\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_join\r
+ *\r
+ * @brief       Join functioanlity for non-AP devices. Send the Join token\r
+ *              and wait for the reply.\r
+ *\r
+ * input parameters\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   Status of operation.\r
+ */\r
+\r
+smplStatus_t nwk_join(void)\r
+{\r
+    uint8_t msg[JOIN_FRAME_SIZE];\r
+    uint32_t linkToken;\r
+    addr_t apAddr;\r
+    uint8_t radioState = MRFI_GetRadioState();\r
+    smplStatus_t rc = SMPL_NO_JOIN;\r
+\r
+    union\r
+    {\r
+        ioctlRawSend_t send;\r
+        ioctlRawReceive_t recv;\r
+    } ioctl_info;\r
+\r
+#    if defined(FREQUENCY_AGILITY)\r
+    uint8_t i, numChan;\r
+    freqEntry_t channels[NWK_FREQ_TBL_SIZE];\r
+\r
+    if (!(numChan = nwk_scanForChannels(channels)))\r
+    {\r
+        return SMPL_NO_CHANNEL;\r
+    }\r
+\r
+    for (i = 0; i < numChan; ++i)\r
+    {\r
+        nwk_setChannel(&channels[i]);\r
+#    else\r
+    {\r
+#    endif\r
+\r
+        ioctl_info.send.addr = (addr_t *)nwk_getBCastAddress();\r
+        ioctl_info.send.msg  = msg;\r
+        ioctl_info.send.len  = sizeof(msg);\r
+        ioctl_info.send.port = SMPL_PORT_JOIN;\r
+\r
+        /* Put join token in */\r
+        nwk_putNumObjectIntoMsg((void *)&sJoinToken, msg + J_JOIN_TOKEN_OS, sizeof(sJoinToken));\r
+        /* set app info byte */\r
+        msg[JB_REQ_OS] = JOIN_REQ_JOIN;\r
+        msg[JB_TID_OS] = sTid;\r
+\r
+        /* Set number of connections supported. Used only by AP if it is\r
+         * a data hub.\r
+         */\r
+        msg[J_NUMCONN_OS] = NUM_CONNECTIONS;\r
+        /* protocol version number */\r
+        msg[J_PROTOCOL_VERSION_OS] = nwk_getProtocolVersion();\r
+\r
+        SMPL_Ioctl(IOCTL_OBJ_RAW_IO, IOCTL_ACT_WRITE, &ioctl_info.send);\r
+\r
+        ioctl_info.recv.port = SMPL_PORT_JOIN;\r
+        ioctl_info.recv.msg  = msg;\r
+        ioctl_info.recv.addr = &apAddr; /* save AP address from reply */\r
+\r
+        NWK_CHECK_FOR_SETRX(radioState);\r
+        NWK_REPLY_DELAY();\r
+        NWK_CHECK_FOR_RESTORE_STATE(radioState);\r
+\r
+        if (SMPL_SUCCESS == SMPL_Ioctl(IOCTL_OBJ_RAW_IO, IOCTL_ACT_READ, &ioctl_info.recv))\r
+        {\r
+            uint8_t firstByte = msg[JB_REQ_OS] & (~NWK_APP_REPLY_BIT);\r
+\r
+            /* Sanity check for correct reply frame. Older version\r
+             * has the length instead of the request as the first byte.\r
+             */\r
+            if ((firstByte == JOIN_REQ_JOIN) ||\r
+                (firstByte == JOIN_REPLY_LEGACY_MSG_LENGTH)\r
+                )\r
+            {\r
+                /* join reply returns link token */\r
+                memcpy(&linkToken, msg + JR_LINK_TOKEN_OS, sizeof(linkToken));\r
+\r
+                nwk_setLinkToken(linkToken);\r
+                /* save AP address */\r
+                nwk_setAPAddress(&apAddr);\r
+                sTid++; /* guard against duplicates */\r
+                rc = SMPL_SUCCESS;\r
+#    if defined(FREQUENCY_AGILITY)\r
+                break;\r
+#    endif\r
+            }\r
+        }\r
+        /* TODO: process encryption stuff */\r
+    }\r
+\r
+    return rc;\r
+\r
+}\r
+\r
+#endif /* ACCESS_POINT */\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_processJoin\r
+ *\r
+ * @brief       Processes a Join frame. If this is a reply let it go to the\r
+ *              application. Otherwise generate and send the reply.\r
+ *\r
+ * input parameters\r
+ * @param   frame     - Pointer to Join frame\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   Keep frame for application, release frame, or replay frame.\r
+ */\r
+\r
+fhStatus_t nwk_processJoin(mrfiPacket_t *frame)\r
+{\r
+    fhStatus_t rc = FHS_RELEASE;\r
+    uint8_t replyType;\r
+\r
+    /* Make sure this is a reply and see if we sent this. Validate the\r
+     * packet for reception by client app.\r
+     */\r
+    if (SMPL_MY_REPLY == (replyType = nwk_isValidReply(frame, sTid, JB_REQ_OS, JB_TID_OS)))\r
+    {\r
+        /* It's a match and it's a reply. Validate the received packet by\r
+         * returning a 1 so it can be received by the client app.\r
+         */\r
+        MRFI_PostKillSem();\r
+        rc = FHS_KEEP;\r
+    }\r
+#if defined(ACCESS_POINT)\r
+    else if (SMPL_A_REPLY == replyType)\r
+    {\r
+        /* No match. If I'm not an ED this is a reply that should be passed on. */\r
+        rc = FHS_REPLAY;\r
+    }\r
+    else\r
+    {\r
+        /* Send reply if we're an Access Point otherwise ignore the frame. */\r
+        if ((SMPL_NOT_REPLY == replyType) && sJoinOK)\r
+        {\r
+            handleJoinRequest(frame);\r
+        }\r
+    }\r
+#elif defined(RANGE_EXTENDER)\r
+    else\r
+    {\r
+        /* Either a reply that has to be replayed or a request that\r
+         * also must be replayed.\r
+         */\r
+        rc = FHS_REPLAY;\r
+    }\r
+#endif /* not END_DEVICE */\r
+\r
+    (void) replyType; /* keep compiler happy */\r
+\r
+    return rc;\r
+}\r
+\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/simpliciti/Components/nwk_applications/nwk_join.h b/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/simpliciti/Components/nwk_applications/nwk_join.h
new file mode 100755 (executable)
index 0000000..63ff2c4
--- /dev/null
@@ -0,0 +1,94 @@
+/**************************************************************************************************\r
+*  Filename:       nwk_join.h\r
+*  Revised:        $Date: 2009-01-06 12:26:02 -0800 (Tue, 06 Jan 2009) $\r
+*  Revision:       $Revision: 18693 $\r
+*  Author:         $Author: lfriedman $\r
+*\r
+*  Description:    This header file supports the SimpliciTI Join network application.\r
+*\r
+*  Copyright 2004-2007 Texas Instruments Incorporated. All rights reserved.\r
+*\r
+*  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+*  the terms of a software license agreement between the user who downloaded the software,\r
+*  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+*  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+*  License. The License limits your use, and you acknowledge, that the Software may not be\r
+*  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+*  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+*  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+*  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+*  perform, display or sell this Software and/or its documentation for any purpose.\r
+*\r
+*  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+*  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+*  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+*  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+*  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+*  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+*  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+*  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+*  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+*\r
+*  Should you have any questions regarding your right to use this Software,\r
+*  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+\r
+#ifndef NWK_JOIN_H\r
+#define NWK_JOIN_H\r
+\r
+#define JOIN_CONTEXT_ON  (0x01)\r
+#define JOIN_CONTEXT_OFF (0x02)\r
+\r
+/* Macros needed for protocol backward compatibility */\r
+#define JOIN_LEGACY_MSG_LENGTH        7\r
+#define JOIN_REPLY_LEGACY_MSG_LENGTH  6\r
+\r
+/* place holder... */\r
+#define SEC_CRYPT_KEY_SIZE  0\r
+\r
+/* application payload offsets\r
+ *    both */\r
+#define JB_REQ_OS                0\r
+#define JB_TID_OS                1\r
+/*    join frame */\r
+#define J_JOIN_TOKEN_OS          2\r
+#define J_NUMCONN_OS             6\r
+#define J_PROTOCOL_VERSION_OS    7\r
+/*    join reply frame */\r
+#define JR_LINK_TOKEN_OS         2\r
+#define JR_CRYPTKEY_SIZE_OS      6\r
+#define JR_CRYPTKEY_OS           7\r
+\r
+/* change the following as protocol developed */\r
+#define MAX_JOIN_APP_FRAME    (JR_CRYPTKEY_OS + SEC_CRYPT_KEY_SIZE)\r
+\r
+/* set out frame size */\r
+#define JOIN_FRAME_SIZE         8\r
+#define JOIN_REPLY_FRAME_SIZE   MAX_JOIN_APP_FRAME\r
+\r
+/* join requests\r
+ * NOTE: If aditional command codes are required do _not_ use the\r
+ *       value JOIN_REPLY_LEGACY_MSG_LENGTH. This numeral is used\r
+ *       to guarantee that legacy Join frames (from before release\r
+ *       1.0.6) work correctly. Don't ask.\r
+ */\r
+#define JOIN_REQ_JOIN       1\r
+\r
+/* prototypes */\r
+void nwk_joinInit(uint8_t (*)(linkID_t));\r
+smplStatus_t nwk_join(void);\r
+fhStatus_t nwk_processJoin(mrfiPacket_t *);\r
+void nwk_getJoinToken(uint32_t *);\r
+\r
+void nwk_setJoinContext(uint8_t);\r
+void nwk_setJoinToken(uint32_t);\r
+void nwk_getJoinToken(uint32_t *);\r
+\r
+#ifdef ACCESS_POINT\r
+sfClientInfo_t *nwk_isSandFClient(uint8_t *, uint8_t *);\r
+\r
+#endif\r
+\r
+#endif\r
+\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/simpliciti/Components/nwk_applications/nwk_link.c b/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/simpliciti/Components/nwk_applications/nwk_link.c
new file mode 100755 (executable)
index 0000000..8188970
--- /dev/null
@@ -0,0 +1,886 @@
+/**************************************************************************************************\r
+*  Filename:       nwk_link.c\r
+*  Revised:        $Date: 2008-12-23 13:54:27 -0800 (Tue, 23 Dec 2008) $\r
+*  Revision:       $Revision: 18652 $\r
+*  Author:         $Author: lfriedman $\r
+*\r
+*  Description:    This file supports the SimpliciTI Link network application.\r
+*\r
+*  Copyright 2007-2008 Texas Instruments Incorporated. All rights reserved.\r
+*\r
+*  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+*  the terms of a software license agreement between the user who downloaded the software,\r
+*  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+*  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+*  License. The License limits your use, and you acknowledge, that the Software may not be\r
+*  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+*  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+*  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+*  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+*  perform, display or sell this Software and/or its documentation for any purpose.\r
+*\r
+*  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+*  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+*  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+*  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+*  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+*  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+*  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+*  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+*  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+*\r
+*  Should you have any questions regarding your right to use this Software,\r
+*  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+\r
+/******************************************************************************\r
+ * INCLUDES\r
+ */\r
+\r
+#include <string.h>\r
+#include "bsp.h"\r
+#include "mrfi.h"\r
+#include "nwk_types.h"\r
+#include "nwk_api.h"\r
+#include "nwk_frame.h"\r
+#include "nwk.h"\r
+#include "nwk_link.h"\r
+#include "nwk_globals.h"\r
+#include "nwk_security.h"\r
+\r
+/******************************************************************************\r
+ * MACROS\r
+ */\r
+\r
+/******************************************************************************\r
+ * CONSTANTS AND DEFINES\r
+ */\r
+\r
+/******************************************************************************\r
+ * TYPEDEFS\r
+ */\r
+\r
+/******************************************************************************\r
+ * LOCAL VARIABLES\r
+ */\r
+static uint32_t sLinkToken = 0;\r
+static volatile uint8_t sListenActive = 0;\r
+#if NUM_CONNECTIONS > 0\r
+static volatile linkID_t sServiceLinkID[NUM_CONNECTIONS];\r
+#endif\r
+static volatile uint8_t sNumLinkers = 0;\r
+static volatile uint8_t sTid = 0;\r
+\r
+/******************************************************************************\r
+ * LOCAL FUNCTIONS\r
+ */\r
+\r
+#define  SENT_REPLY       1\r
+#define  SENT_NO_REPLY    2\r
+static uint8_t smpl_send_link_reply(mrfiPacket_t *);\r
+static fhStatus_t handleLinkRequest(mrfiPacket_t *);\r
+\r
+#if defined(EXTENDED_API)\r
+static void smpl_send_unlink_reply(mrfiPacket_t *);\r
+\r
+#endif\r
+\r
+\r
+/******************************************************************************\r
+ * GLOBAL VARIABLES\r
+ */\r
+\r
+/******************************************************************************\r
+ * GLOBAL FUNCTIONS\r
+ */\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_linkInit\r
+ *\r
+ * @brief       Initialize link app. Set link token to the default.\r
+ *\r
+ * input parameters\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   void\r
+ */\r
+\r
+void nwk_linkInit(void)\r
+{\r
+    if (!sLinkToken)\r
+    {\r
+        /* if the link token has not been set externally by the time we get here\r
+         * (such as by the ioctl token-setting interface) assign the default\r
+         */\r
+        sLinkToken = DEFAULT_LINK_TOKEN;\r
+    }\r
+\r
+    /* set a non-zero TID. */\r
+    while (!(sTid = MRFI_RandomByte())) ;\r
+\r
+#if NUM_CONNECTIONS > 0\r
+    memset((void *)&sServiceLinkID, 0x0, sizeof(sServiceLinkID));\r
+#endif\r
+\r
+    return;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_setLinkToken\r
+ *\r
+ * @brief       Sets the link token received in a Join reply.\r
+ *\r
+ * input parameters\r
+ * @param   token   - Link token to be used on this network to link to any peer.\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   void\r
+ */\r
+\r
+void nwk_setLinkToken(uint32_t token)\r
+{\r
+    /* only set if the supplied token is non-zero. */\r
+    if (token)\r
+    {\r
+        sLinkToken = token;\r
+    }\r
+\r
+    return;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_getLinkToken\r
+ *\r
+ * @brief       Gets the current link token.\r
+ *\r
+ * input parameters\r
+ *\r
+ * output parameters\r
+ * @param   pToken   - pointer to the returned value.\r
+ *\r
+ * @return   Current link token\r
+ */\r
+\r
+void nwk_getLinkToken(uint32_t *pToken)\r
+{\r
+    /* only set if the supplied token is non-zero. */\r
+    if (pToken)\r
+    {\r
+        *pToken = sLinkToken;\r
+    }\r
+\r
+    return;\r
+}\r
+\r
+#if defined(EXTENDED_API)\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_unlink\r
+ *\r
+ * @brief       Called from the application level to tear down a link.\r
+ *\r
+ * input parameters\r
+ *\r
+ * output parameters\r
+ * @param   lid     - Link ID assigned for this link\r
+ *\r
+ * @return   Status of the operation.\r
+ *           SMPL_SUCCESS\r
+ *           SMPL_BAD_PARAM       No connection table entry for this Link ID;\r
+ *                                SMPL_LINKID_USER_UUD not valid since it is not\r
+ *                                connection-based.\r
+ *           SMPL_TIMEOUT         No reply from peer.\r
+ *           SMPL_NO_PEER_UNLINK  Peer did not have a Connection Table entry for me.\r
+ */\r
+\r
+smplStatus_t nwk_unlink(linkID_t lid)\r
+{\r
+    uint8_t msg[UNLINK_FRAME_SIZE];\r
+    connInfo_t  *pCInfo = nwk_getConnInfo(lid);\r
+    smplStatus_t rc     = SMPL_SUCCESS;\r
+    addr_t addr;\r
+\r
+    union\r
+    {\r
+        ioctlRawSend_t send;\r
+        ioctlRawReceive_t recv;\r
+    } ioctl_info;\r
+\r
+    /* is there connection info? */\r
+    if (!pCInfo || (lid == SMPL_LINKID_USER_UUD))\r
+    {\r
+        return SMPL_BAD_PARAM;\r
+    }\r
+\r
+    /* set request byte */\r
+    msg[LB_REQ_OS] = LINK_REQ_UNLINK;\r
+\r
+    /* set the transaction ID. this allows target to figure out duplicates */\r
+    msg[LB_TID_OS] = sTid;\r
+\r
+    /* remote port to be sent in message to help match connection */\r
+    msg[UL_RMT_PORT_OS] = pCInfo->portRx;\r
+\r
+    /* setup for ioctl raw I/O */\r
+    memcpy(addr.addr, pCInfo->peerAddr, NET_ADDR_SIZE);\r
+    ioctl_info.send.addr = &addr;\r
+    ioctl_info.send.msg  = msg;\r
+    ioctl_info.send.len  = sizeof(msg);\r
+    ioctl_info.send.port = SMPL_PORT_LINK;\r
+\r
+    SMPL_Ioctl(IOCTL_OBJ_RAW_IO, IOCTL_ACT_WRITE, &ioctl_info.send);\r
+\r
+    {\r
+        uint8_t spin       = NWK_RX_RETRY_COUNT;\r
+        uint8_t radioState = MRFI_GetRadioState();\r
+\r
+        ioctl_info.recv.port = SMPL_PORT_LINK;\r
+        ioctl_info.recv.msg  = msg;\r
+        ioctl_info.recv.addr = (addr_t *)0;\r
+\r
+        do\r
+        {\r
+            NWK_CHECK_FOR_SETRX(radioState);\r
+            NWK_REPLY_DELAY();\r
+            NWK_CHECK_FOR_RESTORE_STATE(radioState);\r
+\r
+            if (SMPL_SUCCESS == SMPL_Ioctl(IOCTL_OBJ_RAW_IO, IOCTL_ACT_READ, &ioctl_info.recv))\r
+            {\r
+                if ((msg[LB_REQ_OS] & (~NWK_APP_REPLY_BIT)) == LINK_REQ_UNLINK)\r
+                {\r
+                    rc = (smplStatus_t)msg[ULR_RESULT_OS];\r
+                    break;\r
+                }\r
+            }\r
+            if (!spin)\r
+            {\r
+                rc = SMPL_TIMEOUT;\r
+                break;\r
+            }\r
+            --spin;\r
+        } while (1);\r
+\r
+        /* it's ok to unconditionally invalidate connection object */\r
+        nwk_freeConnection(pCInfo);\r
+    }\r
+    return rc;\r
+}\r
+\r
+#endif  /* EXTENDED_API */\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_link\r
+ *\r
+ * @brief       Called from the application level to accomplish the link\r
+ *\r
+ * input parameters\r
+ *\r
+ * output parameters\r
+ * @param   lid     - pointer to Link ID (port) assigned for this link\r
+ *\r
+ * @return   Status of the operation.\r
+ */\r
+\r
+smplStatus_t nwk_link(linkID_t *lid)\r
+{\r
+    uint8_t msg[LINK_FRAME_SIZE];\r
+    connInfo_t   *pCInfo = nwk_getNextConnection();\r
+    smplStatus_t rc;\r
+\r
+    if (pCInfo)\r
+    {\r
+        addr_t addr;\r
+        union\r
+        {\r
+            ioctlRawSend_t send;\r
+            ioctlRawReceive_t recv;\r
+        } ioctl_info;\r
+\r
+        if (!nwk_allocateLocalRxPort(LINK_SEND, pCInfo))\r
+        {\r
+            nwk_freeConnection(pCInfo);\r
+            return SMPL_NOMEM;\r
+        }\r
+\r
+        memcpy(addr.addr, nwk_getBCastAddress(), NET_ADDR_SIZE);\r
+        ioctl_info.send.addr = &addr;\r
+        ioctl_info.send.msg  = msg;\r
+        ioctl_info.send.len  = sizeof(msg);\r
+        ioctl_info.send.port = SMPL_PORT_LINK;\r
+\r
+        /* Put link token in */\r
+        nwk_putNumObjectIntoMsg((void *)&sLinkToken, msg + L_LINK_TOKEN_OS, sizeof(sLinkToken));\r
+\r
+        /* set port to which the remote device should send */\r
+        msg[L_RMT_PORT_OS] = pCInfo->portRx;\r
+\r
+        /* set the transaction ID. this allows target to figure out duplicates */\r
+        msg[LB_TID_OS] = sTid;\r
+\r
+        /* set my Rx type */\r
+        msg[L_MY_RXTYPE_OS] = nwk_getMyRxType();\r
+\r
+        /* set request byte */\r
+        msg[LB_REQ_OS] = LINK_REQ_LINK;\r
+\r
+        /* protocol version number */\r
+        msg[L_PROTOCOL_VERSION_OS] = nwk_getProtocolVersion();\r
+\r
+#if defined(SMPL_SECURE)\r
+        pCInfo->connTxCTR = MRFI_RandomByte()                   | \\r
+            ((uint32_t)(MRFI_RandomByte()) << 8)  | \\r
+            ((uint32_t)(MRFI_RandomByte()) << 16) | \\r
+            ((uint32_t)(MRFI_RandomByte()) << 24);\r
+\r
+        nwk_putNumObjectIntoMsg((void *)&pCInfo->connTxCTR, (void *)&msg[L_CTR_OS], 4);\r
+#endif\r
+\r
+\r
+        if (SMPL_SUCCESS != (rc = SMPL_Ioctl(IOCTL_OBJ_RAW_IO, IOCTL_ACT_WRITE, &ioctl_info.send)))\r
+        {\r
+            return rc;\r
+        }\r
+\r
+        {\r
+            uint8_t radioState = MRFI_GetRadioState();\r
+\r
+            ioctl_info.recv.port = SMPL_PORT_LINK;\r
+            ioctl_info.recv.msg  = msg;\r
+            ioctl_info.recv.addr = (addr_t *)pCInfo->peerAddr;\r
+\r
+            NWK_CHECK_FOR_SETRX(radioState);\r
+            NWK_REPLY_DELAY();\r
+            NWK_CHECK_FOR_RESTORE_STATE(radioState);\r
+\r
+            if (SMPL_SUCCESS == SMPL_Ioctl(IOCTL_OBJ_RAW_IO, IOCTL_ACT_READ, &ioctl_info.recv))\r
+            {\r
+                uint8_t firstByte = msg[LB_REQ_OS] & (~NWK_APP_REPLY_BIT);\r
+\r
+                /* Sanity check for correct reply frame. Older version\r
+                 * has the length instead of the request as the first byte.\r
+                 */\r
+                if ((firstByte != LINK_REQ_LINK) &&\r
+                    (firstByte != LINK_REPLY_LEGACY_MSG_LENGTH)\r
+                    )\r
+                {\r
+                    /* invalidate connection object */\r
+                    nwk_freeConnection(pCInfo);\r
+                    return SMPL_NO_LINK;\r
+\r
+                }\r
+            }\r
+            else\r
+            {\r
+                /* no successful receive */\r
+                nwk_freeConnection(pCInfo);\r
+                return SMPL_TIMEOUT;\r
+            }\r
+\r
+            pCInfo->connState = CONNSTATE_CONNECTED;\r
+            pCInfo->portTx    = msg[LR_RMT_PORT_OS]; /* link reply returns remote port */\r
+            *lid              = pCInfo->thisLinkID;  /* return our local port number */\r
+\r
+            /* Set hop count. If it's a polling device set the count to the\r
+             * distance to the AP. Otherwise, set it to the max less the remaining\r
+             * which will be the path taken for this frame. It will be no worse\r
+             * then tha max and probably will be better.\r
+             */\r
+            if (F_RX_TYPE_POLLS == msg[LR_MY_RXTYPE_OS])\r
+            {\r
+                pCInfo->hops2target = MAX_HOPS_FROM_AP;\r
+            }\r
+            else\r
+            {\r
+                /* Can't really use this trick because the device could move. If the\r
+                 * devices are all static this may work unless the initial reception\r
+                 * was marginal.\r
+                 */\r
+#if defined(DEVICE_DOES_NOT_MOVE)\r
+                pCInfo->hops2target = MAX_HOPS - ioctl_info.recv.hopCount;\r
+#else\r
+                pCInfo->hops2target = MAX_HOPS;\r
+#endif\r
+            }\r
+\r
+#if defined(SMPL_SECURE)\r
+            nwk_getNumObjectFromMsg((void *)&msg[LR_CTR_OS], (void *)&pCInfo->connRxCTR, 4);\r
+#endif\r
+        }\r
+\r
+        /* guard against duplicates... */\r
+        ++sTid;\r
+        if (!sTid)\r
+        {\r
+            sTid = 1;\r
+        }\r
+        return SMPL_SUCCESS;\r
+    }\r
+\r
+    return SMPL_NOMEM;\r
+}\r
+\r
+#if defined(EXTENDED_API)\r
+\r
+/******************************************************************************\r
+ * @fn          smpl_send_unlink_reply\r
+ *\r
+ * @brief       Send the unlink reply to the device trying to unlink\r
+ *\r
+ * input parameters\r
+ * @param   frame   - frame received from linker\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   void\r
+ */\r
+\r
+static void smpl_send_unlink_reply(mrfiPacket_t *frame)\r
+{\r
+    connInfo_t  *pCInfo;\r
+    frameInfo_t *pOutFrame;\r
+    uint8_t msg[UNLINK_REPLY_FRAME_SIZE];\r
+    smplStatus_t rc = SMPL_NO_PEER_UNLINK;\r
+\r
+    /* match the remote port and source address with a connection table entry */\r
+    if (pCInfo =\r
+            nwk_findPeer((addr_t *)MRFI_P_SRC_ADDR(frame),\r
+                         *(MRFI_P_PAYLOAD(frame) + F_APP_PAYLOAD_OS + UL_RMT_PORT_OS)))\r
+    {\r
+        /* Note we unconditionally free the connection resources */\r
+        nwk_freeConnection(pCInfo);\r
+        rc = SMPL_SUCCESS;\r
+    }\r
+\r
+    /* set reply bit */\r
+    msg[LB_REQ_OS] = LINK_REQ_UNLINK | NWK_APP_REPLY_BIT;\r
+\r
+    /* sender's TID */\r
+    msg[LB_TID_OS] = *(MRFI_P_PAYLOAD(frame) + F_APP_PAYLOAD_OS + LB_TID_OS);\r
+\r
+    /* result of freeing local connection */\r
+    msg[ULR_RESULT_OS] = rc;\r
+\r
+    if (pOutFrame = nwk_buildFrame(SMPL_PORT_LINK, msg, sizeof(msg), MAX_HOPS))\r
+    {\r
+        /* destination address is the source adddress of the received frame. */\r
+        memcpy(MRFI_P_DST_ADDR(&pOutFrame->mrfiPkt), MRFI_P_SRC_ADDR(frame), NET_ADDR_SIZE);\r
+#    if defined(SMPL_SECURE)\r
+        nwk_setSecureFrame(&pOutFrame->mrfiPkt, sizeof(msg), 0);\r
+#    endif /* SMPL_SECURE */\r
+        nwk_sendFrame(pOutFrame, MRFI_TX_TYPE_FORCED);\r
+    }\r
+}\r
+\r
+#endif     /* EXTENDED_API */\r
+\r
+/******************************************************************************\r
+ * @fn          smpl_send_link_reply\r
+ *\r
+ * @brief       Send the link reply to the device trying to link. This routine\r
+ *              will handle duplicates.\r
+ *\r
+ * input parameters\r
+ * @param   frame   - frame received from linker\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   Returns SENT_REPLY if reply sent, else SENT_NO_REPLY.\r
+ *           The return value is used as this routine unwinds to know\r
+ *           whether to replay the frame. An RE or AP can host an ED\r
+ *           object in which case it might send a reply (possibly from\r
+ *           a duplicate frame). If we do reply we do not want to replay.\r
+ */\r
+\r
+static uint8_t smpl_send_link_reply(mrfiPacket_t *frame)\r
+{\r
+#if NUM_CONNECTIONS > 0\r
+    frameInfo_t *pOutFrame;\r
+    connInfo_t  *pCInfo;\r
+    uint8_t remotePort;\r
+    uint8_t msg[LINK_REPLY_FRAME_SIZE];\r
+\r
+    /* Is this a legacy frame? If so continue. Otherwise check version.*/\r
+    if ((MRFI_GET_PAYLOAD_LEN(frame) - F_APP_PAYLOAD_OS) > LINK_LEGACY_MSG_LENGTH)\r
+    {\r
+        /* see if protocol version is correct... */\r
+        if (*(MRFI_P_PAYLOAD(frame) + F_APP_PAYLOAD_OS + L_PROTOCOL_VERSION_OS) !=\r
+            nwk_getProtocolVersion())\r
+        {\r
+            /* Accommodation of protocol version differences can be noted or accomplished here.\r
+             * This field was also checked in the join transaction but it is checked again here\r
+             * because that check may not have occurred if thre is no AP in this topology.\r
+             * Otherwise, no match and the board goes back\r
+             */\r
+            return SENT_NO_REPLY;\r
+        }\r
+    }\r
+\r
+    /* see if token is correct */\r
+    {\r
+        uint32_t lt;\r
+\r
+        nwk_getNumObjectFromMsg(MRFI_P_PAYLOAD(\r
+                                    frame) + F_APP_PAYLOAD_OS + L_LINK_TOKEN_OS, &lt, sizeof(lt));\r
+        if (lt != sLinkToken)\r
+        {\r
+            return SENT_NO_REPLY;\r
+        }\r
+    }\r
+\r
+    /* if we get here the token matched. */\r
+\r
+    /* is this a duplicate request? */\r
+    remotePort = *(MRFI_P_PAYLOAD(frame) + F_APP_PAYLOAD_OS + L_RMT_PORT_OS);\r
+    if (pCInfo = nwk_isLinkDuplicate(MRFI_P_SRC_ADDR(frame), remotePort))\r
+    {\r
+        /* resend reply */\r
+        msg[LB_REQ_OS] = LINK_REQ_LINK | NWK_APP_REPLY_BIT;\r
+\r
+        /* sender's TID */\r
+        msg[LB_TID_OS] = *(MRFI_P_PAYLOAD(frame) + F_APP_PAYLOAD_OS + LB_TID_OS);\r
+\r
+        /* Send reply with the local port number so the remote device knows where to\r
+         * send packets.\r
+         */\r
+        msg[LR_RMT_PORT_OS] = pCInfo->portRx;\r
+\r
+        /* put my Rx type in there. used to know how to set hops when sending back. */\r
+        msg[LR_MY_RXTYPE_OS] = nwk_getMyRxType();\r
+#    if defined(SMPL_SECURE)\r
+        /* Set the Tx counter value for peer's Rx counter object */\r
+        nwk_putNumObjectIntoMsg((void *)&pCInfo->connTxCTR, (void *)&msg[LR_CTR_OS], 4);\r
+        /* We also need to save the newly generated Rx counter value. */\r
+        nwk_getNumObjectFromMsg((void *)(MRFI_P_PAYLOAD(frame) + F_APP_PAYLOAD_OS + L_CTR_OS),\r
+                                (void *)&pCInfo->connRxCTR, 4);\r
+#    endif\r
+        if (pOutFrame =\r
+                nwk_buildFrame(SMPL_PORT_LINK, msg, sizeof(msg), MAX_HOPS -\r
+                               (GET_FROM_FRAME(MRFI_P_PAYLOAD(frame), F_HOP_COUNT))))\r
+        {\r
+            /* destination address is the source adddress of the received frame. */\r
+            memcpy(MRFI_P_DST_ADDR(&pOutFrame->mrfiPkt), MRFI_P_SRC_ADDR(frame), NET_ADDR_SIZE);\r
+#    if defined(SMPL_SECURE)\r
+            nwk_setSecureFrame(&pOutFrame->mrfiPkt, sizeof(msg), 0);\r
+#    endif  /* SMPL_SECURE */\r
+            nwk_sendFrame(pOutFrame, MRFI_TX_TYPE_FORCED);\r
+        }\r
+        return SENT_REPLY;\r
+    }\r
+\r
+    if (!sListenActive)\r
+    {\r
+        /* We've checked for duplicate and resent reply. In that case we weren't listening\r
+         * so just go back`.\r
+         */\r
+        return SENT_NO_REPLY;\r
+    }\r
+\r
+    /* room to link? */\r
+#    if defined(AP_IS_DATA_HUB)\r
+    pCInfo = nwk_findAlreadyJoined(frame);\r
+\r
+    if (!pCInfo)\r
+#    endif\r
+    {\r
+        pCInfo = nwk_getNextConnection();\r
+    }\r
+\r
+    if (pCInfo)\r
+    {\r
+        /* yes there's room and it's not a dup. address. */\r
+        memcpy(&pCInfo->peerAddr, MRFI_P_SRC_ADDR(frame), NET_ADDR_SIZE);\r
+\r
+        if (!nwk_allocateLocalRxPort(LINK_REPLY, pCInfo))\r
+        {\r
+            nwk_freeConnection(pCInfo);\r
+            /* we're done with the packet */\r
+            return SENT_REPLY;\r
+        }\r
+\r
+        /* The local Rx port is the one returned in the connection structure. The\r
+         * caller is waiting on this to be set. The code here is running in an ISR\r
+         * thread so the caller will see this change after RETI.\r
+         */\r
+        if (NUM_CONNECTIONS == sNumLinkers)\r
+        {\r
+            /* Something is wrong -- no room to stack Link request */\r
+            nwk_freeConnection(pCInfo);\r
+            /* we're done with the packet */\r
+            return SENT_REPLY;\r
+        }\r
+        sServiceLinkID[sNumLinkers++] = pCInfo->thisLinkID;\r
+\r
+        /* save the remote Tx port */\r
+        pCInfo->portTx = remotePort;\r
+\r
+        /* connection is valid... */\r
+        pCInfo->connState = CONNSTATE_CONNECTED;\r
+\r
+        /* Set hop count. If it's a polling device set the count to the\r
+         * distance to the AP. otherwise, set it to the max less the remaining\r
+         * which will be the path taken for this frame. It will be no worse\r
+         * then tha max and probably will be better.\r
+         */\r
+        if (F_RX_TYPE_POLLS == *(MRFI_P_PAYLOAD(frame) + F_APP_PAYLOAD_OS + L_MY_RXTYPE_OS))\r
+        {\r
+            /* It polls. so. we'll be sending to the AP which will store the\r
+             * frame. The AP is only MAX_HOPS_FROM_AP hops away from us.\r
+             */\r
+            pCInfo->hops2target = MAX_HOPS_FROM_AP;\r
+        }\r
+        else\r
+        {\r
+            /* Can't really use this trick because the device could move. If the\r
+             * devices are all static this may work unless the initial reception\r
+             * was marginal.\r
+             */\r
+#    if defined(DEVICE_DOES_NOT_MOVE)\r
+            pCInfo->hops2target = MAX_HOPS - GET_FROM_FRAME(MRFI_P_PAYLOAD(frame), F_HOP_COUNT);\r
+#    else\r
+            pCInfo->hops2target = MAX_HOPS;\r
+#    endif\r
+        }\r
+\r
+        /* Send reply with the local port number so the remote device knows where to\r
+         * send packets.\r
+         */\r
+        msg[LR_RMT_PORT_OS]  = pCInfo->portRx;\r
+\r
+        /* put my Rx type in there. used to know how to set hops when sending back. */\r
+        msg[LR_MY_RXTYPE_OS] = nwk_getMyRxType();\r
+\r
+        msg[LB_REQ_OS] = LINK_REQ_LINK | NWK_APP_REPLY_BIT;\r
+\r
+        /* sender's TID */\r
+        msg[LB_TID_OS] = *(MRFI_P_PAYLOAD(frame) + F_APP_PAYLOAD_OS + LB_TID_OS);\r
+#    if defined(SMPL_SECURE)\r
+        nwk_getNumObjectFromMsg((void *)(MRFI_P_PAYLOAD(frame) + F_APP_PAYLOAD_OS + L_CTR_OS),\r
+                                (void *)&pCInfo->connRxCTR, 4);\r
+        pCInfo->connTxCTR = MRFI_RandomByte()                   | \\r
+            ((uint32_t)(MRFI_RandomByte()) << 8)  | \\r
+            ((uint32_t)(MRFI_RandomByte()) << 16) | \\r
+            ((uint32_t)(MRFI_RandomByte()) << 24);\r
+\r
+        nwk_putNumObjectIntoMsg((void *)&pCInfo->connTxCTR, (void *)&msg[LR_CTR_OS], 4);\r
+#    endif\r
+        if (pOutFrame =\r
+                nwk_buildFrame(SMPL_PORT_LINK, msg, sizeof(msg), MAX_HOPS -\r
+                               (GET_FROM_FRAME(MRFI_P_PAYLOAD(frame), F_HOP_COUNT))))\r
+        {\r
+            /* destination address is the source adddress of the received frame. */\r
+            memcpy(MRFI_P_DST_ADDR(&pOutFrame->mrfiPkt), MRFI_P_SRC_ADDR(frame), NET_ADDR_SIZE);\r
+#    if defined(SMPL_SECURE)\r
+            nwk_setSecureFrame(&pOutFrame->mrfiPkt, sizeof(msg), 0);\r
+#    endif\r
+            if (SMPL_SUCCESS != nwk_sendFrame(pOutFrame, MRFI_TX_TYPE_FORCED))\r
+            {\r
+                /* better release the connection structure */\r
+                nwk_freeConnection(pCInfo);\r
+            }\r
+        }\r
+        else\r
+        {\r
+            /* better release the connection structure */\r
+            nwk_freeConnection(pCInfo);\r
+        }\r
+    }\r
+    /* we're done with the packet */\r
+    return SENT_REPLY;\r
+#else\r
+    return SENT_NO_REPLY;\r
+#endif  /* NUM_CONNECTIONS */\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_processLink\r
+ *\r
+ * @brief       Process Link frame. Just save the frame for the Link app if it\r
+ *              a reply. If it isn't a reply, send the reply in this thread.\r
+ *\r
+ * input parameters\r
+ * @param   frame   - pointer to frame to be processed\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   Keep frame for application, release frame, or replay frame..\r
+ */\r
+\r
+fhStatus_t nwk_processLink(mrfiPacket_t *frame)\r
+{\r
+    fhStatus_t rc;\r
+    uint8_t replyType;\r
+\r
+    /* If we sent this then this is the reply. Validate the\r
+     * packet for reception by client app. If we didn't send\r
+     * it then we are the target. send the reply.\r
+     */\r
+    if (SMPL_MY_REPLY == (replyType = nwk_isValidReply(frame, sTid, LB_REQ_OS, LB_TID_OS)))\r
+    {\r
+        /* It's a match and it's a reply. Validate the received packet by\r
+         * returning a 1 so it can be received by the client app.\r
+         */\r
+        MRFI_PostKillSem();\r
+        rc = FHS_KEEP;\r
+    }\r
+#if !defined(END_DEVICE)\r
+    else if (SMPL_A_REPLY == replyType)\r
+    {\r
+        /* no match. if i'm not an ED this is a reply that should be passed on. */\r
+        rc = FHS_REPLAY;\r
+    }\r
+#endif  /* !END_DEVICE */\r
+    else\r
+    {\r
+        /* No, we didn't send it. Process request assuming it's\r
+         * intended for us.\r
+         */\r
+        rc = handleLinkRequest(frame);\r
+    }\r
+\r
+    (void) replyType; /* keep compiler happy when ED built... */\r
+\r
+    return rc;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_getLocalLinkID\r
+ *\r
+ * @brief       This routine checks to see if a service port has been assigned\r
+ *              as a result of a link reply frame being received. It is the means\r
+ *              by which the user thread knows that the waiting is over for the\r
+ *              link listen. the value is set in an interrupt thread.\r
+ *\r
+ * input parameters\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   Local port assigned when the link reply was received.\r
+ */\r
+\r
+linkID_t nwk_getLocalLinkID(void)\r
+{\r
+    linkID_t lid = 0;\r
+\r
+#if NUM_CONNECTIONS > 0\r
+    uint8_t i;\r
+    bspIState_t intState;\r
+\r
+\r
+    BSP_ENTER_CRITICAL_SECTION(intState);\r
+    if (sNumLinkers)\r
+    {\r
+        sNumLinkers--;\r
+        BSP_EXIT_CRITICAL_SECTION(intState);\r
+\r
+        nwk_setListenContext(LINK_LISTEN_OFF);\r
+        lid = sServiceLinkID[0];\r
+\r
+        /* If more than one Link frame has been processed without an intervening\r
+         * Listen assume that there will be another Link Listen call that will\r
+         * poll for completion which has already occurred. Age any existing entries.\r
+         * This code was added to deal with the possibility of mulitple EDs being\r
+         * activated simultaneously in the AP-as-data-hub example. This opens a\r
+         * window of opportunity for a "typical" scenario to get hosed. But for\r
+         * a "typical" scenario to get hosed a number of improbable events have to\r
+         * occur. These are deemed far less likely than the multiple-ED-activation\r
+         * scenario in the AP-as-dat-hub case.\r
+         */\r
+        for (i = 0; i < sNumLinkers; ++i)\r
+        {\r
+            sServiceLinkID[i] = sServiceLinkID[i + 1];\r
+        }\r
+    }\r
+    else\r
+    {\r
+        BSP_EXIT_CRITICAL_SECTION(intState);\r
+    }\r
+#endif  /* NUM_CONNECTIONS */\r
+\r
+    return lid;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_setListenContext\r
+ *\r
+ * @brief       Sets the context when a LinkListen is executed. This prevents\r
+ *              processing other link frames from being confused with the real\r
+ *              one. Without this semaphore other broadcast link messages\r
+ *              could wait int the input queue and accidently be processed if\r
+ *              a listen is done later.\r
+ *\r
+ * input parameters\r
+ *\r
+ * @param   context - listen on or off\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   void\r
+ */\r
+\r
+void nwk_setListenContext(uint8_t context)\r
+{\r
+    sListenActive = (context == LINK_LISTEN_ON) ? 1 : 0;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          handleLinkRequest\r
+ *\r
+ * @brief       Dispatches handler for specfic link request\r
+ *\r
+ * input parameters\r
+ *\r
+ * @param   frame - Link frame received\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   void\r
+ */\r
+\r
+static fhStatus_t handleLinkRequest(mrfiPacket_t *frame)\r
+{\r
+    fhStatus_t rc = FHS_RELEASE;\r
+    uint8_t isReplySent;\r
+\r
+    if (LINK_LEGACY_MSG_LENGTH == (MRFI_GET_PAYLOAD_LEN(frame) - F_APP_PAYLOAD_OS))\r
+    {\r
+        /* Legacy frame. Spoof a link request */\r
+        *(MRFI_P_PAYLOAD(frame) + F_APP_PAYLOAD_OS) = LINK_REQ_LINK;\r
+    }\r
+\r
+    switch (*(MRFI_P_PAYLOAD(frame) + F_APP_PAYLOAD_OS))\r
+    {\r
+        case LINK_REQ_LINK:\r
+            isReplySent = smpl_send_link_reply(frame);\r
+#if !defined(END_DEVICE)\r
+\r
+            /* If I am an AP or RE and not listening I need to replay frame.\r
+             * The exception is if I am an AP or RE hosting an End Device\r
+             * object and I just sent a reply frame to a duplicate link frame\r
+             * for which I was not listening. In this case don't replay.\r
+             */\r
+            if (!sListenActive && (SENT_REPLY != isReplySent))\r
+            {\r
+                rc = FHS_REPLAY;\r
+            }\r
+#endif   /* !END_DEVICE */\r
+            break;\r
+\r
+#if defined(EXTENDED_API)\r
+        case LINK_REQ_UNLINK:\r
+            smpl_send_unlink_reply(frame);\r
+            break;\r
+#endif\r
+\r
+        default:\r
+            break;\r
+    }\r
+\r
+    /* keep compiler happy if I'm compiled as an End Device */\r
+    (void) isReplySent;\r
+\r
+    return rc;\r
+}\r
+\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/simpliciti/Components/nwk_applications/nwk_link.h b/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/simpliciti/Components/nwk_applications/nwk_link.h
new file mode 100755 (executable)
index 0000000..64ed033
--- /dev/null
@@ -0,0 +1,108 @@
+/**************************************************************************************************\r
+*  Filename:       nwk_link.h\r
+*  Revised:        $Date: 2008-12-10 16:52:14 -0800 (Wed, 10 Dec 2008) $\r
+*  Revision:       $Revision: 18596 $\r
+*  Author:         $Author: lfriedman $\r
+*\r
+*  Description:    This header file supports the SimpliciTI Join network application.\r
+*\r
+*  Copyright 2004-2007 Texas Instruments Incorporated. All rights reserved.\r
+*\r
+*  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+*  the terms of a software license agreement between the user who downloaded the software,\r
+*  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+*  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+*  License. The License limits your use, and you acknowledge, that the Software may not be\r
+*  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+*  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+*  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+*  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+*  perform, display or sell this Software and/or its documentation for any purpose.\r
+*\r
+*  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+*  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+*  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+*  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+*  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+*  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+*  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+*  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+*  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+*\r
+*  Should you have any questions regarding your right to use this Software,\r
+*  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+#ifndef NWK_LINK_H\r
+#define NWK_LINK_H\r
+\r
+/* Macros needed for protocol backward compatibility */\r
+#define LINK_LEGACY_MSG_LENGTH       8\r
+#define LINK_REPLY_LEGACY_MSG_LENGTH 3\r
+\r
+\r
+#define LINK_LISTEN_ON   0\r
+#define LINK_LISTEN_OFF  1\r
+\r
+/* application payload offsets\r
+ *    both */\r
+#define LB_REQ_OS         0\r
+#define LB_TID_OS         1\r
+\r
+/*    link frame */\r
+#define L_LINK_TOKEN_OS        2\r
+#define L_RMT_PORT_OS          6\r
+#define L_MY_RXTYPE_OS         7\r
+#define L_PROTOCOL_VERSION_OS  8\r
+#define L_CTR_OS               9\r
+/*    link reply frame */\r
+#define LR_RMT_PORT_OS         2\r
+#define LR_MY_RXTYPE_OS        3\r
+#define LR_CTR_OS              4\r
+\r
+/*    unlink frame */\r
+#define UL_RMT_PORT_OS        2\r
+/*    unlink reply frame */\r
+#define ULR_RESULT_OS         2\r
+\r
+/* change the following as protocol developed */\r
+#ifndef SMPL_SECURE\r
+#    define MAX_LINK_APP_FRAME      9\r
+#else\r
+#    define MAX_LINK_APP_FRAME      13\r
+#endif\r
+\r
+/* frame sizes */\r
+#ifndef SMPL_SECURE\r
+#    define LINK_FRAME_SIZE         9\r
+#    define LINK_REPLY_FRAME_SIZE   4\r
+#else\r
+#    define LINK_FRAME_SIZE         13\r
+#    define LINK_REPLY_FRAME_SIZE   8\r
+#endif\r
+#define UNLINK_FRAME_SIZE       3\r
+#define UNLINK_REPLY_FRAME_SIZE 3\r
+\r
+/* link requests\r
+ * NOTE: If aditional command codes are required do _not_ use the\r
+ *       value LINK_REPLY_LEGACY_MSG_LENGTH. This numeral is used\r
+ *       to guarantee that legacy Link frames (from before release\r
+ *       1.0.6) work correctly. Don't ask.\r
+ */\r
+\r
+#define LINK_REQ_LINK       1\r
+#define LINK_REQ_UNLINK     2\r
+\r
+/* prototypes */\r
+fhStatus_t nwk_processLink(mrfiPacket_t *);\r
+linkID_t nwk_getLocalLinkID(void);\r
+void nwk_linkInit(void);\r
+smplStatus_t nwk_link(linkID_t *);\r
+\r
+smplStatus_t nwk_unlink(linkID_t);\r
+void nwk_setLinkToken(uint32_t);\r
+void nwk_getLinkToken(uint32_t *);\r
+\r
+void nwk_setListenContext(uint8_t);\r
+\r
+#endif\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/simpliciti/Components/nwk_applications/nwk_mgmt.c b/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/simpliciti/Components/nwk_applications/nwk_mgmt.c
new file mode 100755 (executable)
index 0000000..51253ac
--- /dev/null
@@ -0,0 +1,357 @@
+/**************************************************************************************************\r
+*  Filename:       nwk_mgmt.c\r
+*  Revised:        $Date: 2009-01-06 15:45:54 -0800 (Tue, 06 Jan 2009) $\r
+*  Revision:       $Revision: 18697 $\r
+*  Author:         $Author: lfriedman $\r
+*\r
+*  Description:    This file supports the SimpliciTI Mgmt network application.\r
+*\r
+*  Copyright 2007-2009 Texas Instruments Incorporated. All rights reserved.\r
+*\r
+*  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+*  the terms of a software license agreement between the user who downloaded the software,\r
+*  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+*  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+*  License. The License limits your use, and you acknowledge, that the Software may not be\r
+*  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+*  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+*  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+*  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+*  perform, display or sell this Software and/or its documentation for any purpose.\r
+*\r
+*  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+*  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+*  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+*  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+*  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+*  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+*  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+*  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+*  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+*\r
+*  Should you have any questions regarding your right to use this Software,\r
+*  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+\r
+/******************************************************************************\r
+ * INCLUDES\r
+ */\r
+#include <string.h>\r
+#include "bsp.h"\r
+#include "mrfi.h"\r
+#include "nwk_types.h"\r
+#include "nwk_api.h"\r
+#include "nwk_frame.h"\r
+#include "nwk.h"\r
+#include "nwk_mgmt.h"\r
+#include "nwk_join.h"\r
+#include "nwk_globals.h"\r
+#include "nwk_QMgmt.h"\r
+\r
+/******************************************************************************\r
+ * MACROS\r
+ */\r
+\r
+/******************************************************************************\r
+ * CONSTANTS AND DEFINES\r
+ */\r
+\r
+/******************************************************************************\r
+ * TYPEDEFS\r
+ */\r
+\r
+/******************************************************************************\r
+ * LOCAL VARIABLES\r
+ */\r
+#ifndef ACCESS_POINT\r
+static addr_t const *sAPAddr = NULL;\r
+#else\r
+static uint8_t sSFMarker[NUM_STORE_AND_FWD_CLIENTS] = {0};\r
+#endif\r
+\r
+static volatile uint8_t sTid = 0;\r
+\r
+/******************************************************************************\r
+ * LOCAL FUNCTIONS\r
+ */\r
+static void smpl_send_mgmt_reply(mrfiPacket_t *);\r
+\r
+#ifdef ACCESS_POINT\r
+static void send_poll_reply(mrfiPacket_t *);\r
+\r
+#endif\r
+\r
+/******************************************************************************\r
+ * GLOBAL VARIABLES\r
+ */\r
+\r
+/******************************************************************************\r
+ * GLOBAL FUNCTIONS\r
+ */\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_mgmtInit\r
+ *\r
+ * @brief       Initialize Management functions.\r
+ *\r
+ * input parameters\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   void\r
+ */\r
+\r
+void nwk_mgmtInit(void)\r
+{\r
+    sTid = MRFI_RandomByte();\r
+\r
+#ifdef ACCESS_POINT\r
+    memset(&sSFMarker, 0x0, sizeof(sSFMarker));\r
+#endif\r
+\r
+    return;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_processMgmt\r
+ *\r
+ * @brief       Process Management frame. Just save the frame for the Management\r
+ *              app it it is a reply. If it isn't a reply, send the reply in this\r
+ *              thread.\r
+ *\r
+ * input parameters\r
+ * @param   frame   - pointer to frame to be processed\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   Keep frame for application, release frame, or replay frame.\r
+ */\r
+\r
+fhStatus_t nwk_processMgmt(mrfiPacket_t *frame)\r
+{\r
+    fhStatus_t rc;\r
+    uint8_t replyType;\r
+\r
+    /* If we sent this then this is the reply. Validate the\r
+     * packet for reception by client app. If we didn't send\r
+     * it then we are the target. send the reply.\r
+     */\r
+    if (SMPL_MY_REPLY == (replyType = nwk_isValidReply(frame, sTid, MB_APP_INFO_OS, MB_TID_OS)))\r
+    {\r
+        /* It's a match and it's a reply. Validate the received packet by\r
+         * returning a 1 so it can be received by the client app.\r
+         */\r
+        MRFI_PostKillSem();\r
+        rc = FHS_KEEP;\r
+    }\r
+#if !defined(END_DEVICE)\r
+    else if (SMPL_A_REPLY == replyType)\r
+    {\r
+        /* no match. if i'm not an ED this is a reply that should be passed on. */\r
+        rc = FHS_REPLAY;\r
+    }\r
+#endif  /* !END_DEVICE */\r
+    else\r
+    {\r
+        /* no, we didn't send it. send reply if it's intended for us */\r
+        if (!memcmp(MRFI_P_DST_ADDR(frame), nwk_getMyAddress(), NET_ADDR_SIZE))\r
+        {\r
+            smpl_send_mgmt_reply(frame);\r
+\r
+            /* we're done with the frame. */\r
+            rc = FHS_RELEASE;\r
+        }\r
+        else\r
+        {\r
+            rc = FHS_REPLAY;\r
+        }\r
+    }\r
+\r
+    (void) replyType; /* keep compiler happy */\r
+\r
+    return rc;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          smpl_send_mgmt_reply\r
+ *\r
+ * @brief       Send appropriate reply to Management frame.\r
+ *\r
+ * input parameters\r
+ * @param  frame  - Pointer to frame for which reply required.\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   void\r
+ */\r
+\r
+static void smpl_send_mgmt_reply(mrfiPacket_t *frame)\r
+{\r
+#ifdef ACCESS_POINT\r
+    /* what kind of management frame is this? */\r
+    switch (*(MRFI_P_PAYLOAD(frame) + F_APP_PAYLOAD_OS + MB_APP_INFO_OS))\r
+    {\r
+        case MGMT_REQ_POLL:\r
+            send_poll_reply(frame);\r
+            break;\r
+\r
+        default:\r
+            break;\r
+    }\r
+#endif  /* ACCESS_POINT */\r
+    return;\r
+}\r
+\r
+#ifdef ACCESS_POINT\r
+\r
+/******************************************************************************\r
+ * @fn          send_poll_reply\r
+ *\r
+ * @brief       Send reply to polling frame.\r
+ *\r
+ * input parameters\r
+ * @param  frame  - Pointer to frame for which reply required.\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   void\r
+ */\r
+\r
+static void send_poll_reply(mrfiPacket_t *frame)\r
+{\r
+    uint8_t msgtid = *(MRFI_P_PAYLOAD(frame) + F_APP_PAYLOAD_OS + MB_TID_OS);\r
+    frameInfo_t    *pOutFrame;\r
+    sfClientInfo_t *pClientInfo;\r
+    uint8_t loc;\r
+\r
+    /* Make sure this guy is really a client. We can tell from the source address. */\r
+    if (!(pClientInfo = nwk_isSandFClient(MRFI_P_SRC_ADDR(frame), &loc)))\r
+    {\r
+        /* TODO: maybe send an error frame? */\r
+        return;\r
+    }\r
+\r
+    /* If we have to resync the TID then do it based on the first\r
+     * poll frame we see\r
+     */\r
+    if (!sSFMarker[loc])\r
+    {\r
+        /* If the marker flag is null then it has been initialized, i.e.,\r
+         * there has been a reset. In this case infer that we need to update\r
+         * a (probably) stale last TID. The test will always be true the first\r
+         * time through after a client is established even when an NV restore\r
+         * did not take place but this does no harm.\r
+         */\r
+        pClientInfo->lastTID = msgtid;\r
+        sSFMarker[loc]       = 1;\r
+    }\r
+\r
+    /* If we've seen this poll frame before ignore it. Otherwise we\r
+     * may send a stored frame when we shouldn't.\r
+     */\r
+    else if (nwk_checkAppMsgTID(pClientInfo->lastTID, msgtid))\r
+    {\r
+        pClientInfo->lastTID = msgtid;\r
+    }\r
+    else\r
+    {\r
+        return;\r
+    }\r
+\r
+    if (pOutFrame = nwk_getSandFFrame(frame, M_POLL_PORT_OS))\r
+    {\r
+        /* We need to adjust the order in the queue in this case. Currently\r
+         * we know it is in the input queue and that this adjustment is safe\r
+         * because we're in an ISR thread. This is a fragile fix, though, and\r
+         * should be revisited when time permits.\r
+         */\r
+        nwk_QadjustOrder(INQ, pOutFrame->orderStamp);\r
+\r
+        /* reset hop count... */\r
+        PUT_INTO_FRAME(MRFI_P_PAYLOAD(&pOutFrame->mrfiPkt), F_HOP_COUNT, MAX_HOPS_FROM_AP);\r
+        /* It's gonna be a forwarded frame. */\r
+        PUT_INTO_FRAME(MRFI_P_PAYLOAD(&pOutFrame->mrfiPkt), F_FWD_FRAME, 0x80);\r
+\r
+        nwk_sendFrame(pOutFrame, MRFI_TX_TYPE_FORCED);\r
+    }\r
+    else\r
+    {\r
+        nwk_SendEmptyPollRspFrame(frame);\r
+    }\r
+\r
+    return;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_resetSFMarker\r
+ *\r
+ * @brief       Reset S&F cklient marker so the TIDs resync.\r
+ *\r
+ * input parameters\r
+ * @param  idx  - index of the client that should be reset.\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   void\r
+ */\r
+\r
+void nwk_resetSFMarker(uint8_t idx)\r
+{\r
+    sSFMarker[idx] = 0;\r
+\r
+    return;\r
+}\r
+\r
+#else  /* ACCESS_POINT */\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_poll\r
+ *\r
+ * @brief       Poll S&F server for any waiting frames.\r
+ *\r
+ * input parameters\r
+ * @param  port  - Port on peer.\r
+ * @param  addr  - SimpliciTI address of peer.\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   SMPL_SUCCESS\r
+ *           SMPL_NO_AP_ADDRESS - We don't know Access Point's address\r
+ *           SMPL_NOMEM         - no room in output frame queue\r
+ *           SMPL_TX_CCA_FAIL   - CCA failure\r
+ */\r
+\r
+smplStatus_t nwk_poll(uint8_t port, uint8_t *addr)\r
+{\r
+    uint8_t msg[MGMT_POLL_FRAME_SIZE];\r
+    ioctlRawSend_t send;\r
+\r
+    msg[MB_APP_INFO_OS] = MGMT_REQ_POLL;\r
+    msg[MB_TID_OS]      = sTid;\r
+    msg[M_POLL_PORT_OS] = port;\r
+    memcpy(msg + M_POLL_ADDR_OS, addr, NET_ADDR_SIZE);\r
+\r
+    /* it's OK to increment the TID here because the reply will not be\r
+     * matched based on this number. The reply to the poll comes back\r
+     * to the client port, not the Management port.\r
+     */\r
+    sTid++;\r
+\r
+    if (!sAPAddr)\r
+    {\r
+        sAPAddr = nwk_getAPAddress();\r
+        if (!sAPAddr)\r
+        {\r
+            return SMPL_NO_AP_ADDRESS;\r
+        }\r
+    }\r
+    send.addr = (addr_t *)sAPAddr;\r
+    send.msg  = msg;\r
+    send.len  = sizeof(msg);\r
+    send.port = SMPL_PORT_MGMT;\r
+\r
+    return SMPL_Ioctl(IOCTL_OBJ_RAW_IO, IOCTL_ACT_WRITE, &send);\r
+}\r
+\r
+#endif /* ACCESS_POINT */\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/simpliciti/Components/nwk_applications/nwk_mgmt.h b/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/simpliciti/Components/nwk_applications/nwk_mgmt.h
new file mode 100755 (executable)
index 0000000..13bff76
--- /dev/null
@@ -0,0 +1,68 @@
+/**************************************************************************************************\r
+*  Filename:       nwk_mgmt.h\r
+*  Revised:        $Date: 2009-01-06 15:45:54 -0800 (Tue, 06 Jan 2009) $\r
+*  Revision:       $Revision: 18697 $\r
+*  Author:         $Author: lfriedman $\r
+*\r
+*  Description:    This header file supports the SimpliciTI Mgmt network application.\r
+*\r
+*  Copyright 2004-2007 Texas Instruments Incorporated. All rights reserved.\r
+*\r
+*  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+*  the terms of a software license agreement between the user who downloaded the software,\r
+*  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+*  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+*  License. The License limits your use, and you acknowledge, that the Software may not be\r
+*  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+*  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+*  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+*  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+*  perform, display or sell this Software and/or its documentation for any purpose.\r
+*\r
+*  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+*  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+*  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+*  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+*  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+*  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+*  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+*  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+*  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+*\r
+*  Should you have any questions regarding your right to use this Software,\r
+*  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+\r
+#ifndef NWK_MGMT_H\r
+#define NWK_MGMT_H\r
+\r
+/* MGMT frame application requests */\r
+#define  MGMT_REQ_POLL        0x01\r
+\r
+/* change the following as protocol developed */\r
+#define MAX_MGMT_APP_FRAME    7\r
+\r
+/* application payload offsets\r
+ *    both */\r
+#define MB_APP_INFO_OS           0\r
+#define MB_TID_OS                1\r
+\r
+/*    Poll frame */\r
+#define M_POLL_PORT_OS          2\r
+#define M_POLL_ADDR_OS          3\r
+\r
+/* change the following as protocol developed */\r
+#define MAX_MGMT_APP_FRAME    7\r
+\r
+/* frame sizes */\r
+#define MGMT_POLL_FRAME_SIZE  7\r
+\r
+/* prototypes */\r
+void nwk_mgmtInit(void);\r
+fhStatus_t nwk_processMgmt(mrfiPacket_t *);\r
+\r
+smplStatus_t nwk_poll(uint8_t, uint8_t *);\r
+void nwk_resetSFMarker(uint8_t);\r
+\r
+#endif\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/simpliciti/Components/nwk_applications/nwk_ping.c b/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/simpliciti/Components/nwk_applications/nwk_ping.c
new file mode 100755 (executable)
index 0000000..a257e62
--- /dev/null
@@ -0,0 +1,323 @@
+/**************************************************************************************************\r
+*  Filename:       nwk_ping.c\r
+*  Revised:        $Date: 2009-01-18 16:01:08 -0800 (Sun, 18 Jan 2009) $\r
+*  Revision:       $Revision: 18796 $\r
+*  Author:         $Author: lfriedman $\r
+*\r
+*  Description:    This file supports the SimpliciTI Ping network application.\r
+*\r
+*  Copyright 2007-2009 Texas Instruments Incorporated. All rights reserved.\r
+*\r
+*  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+*  the terms of a software license agreement between the user who downloaded the software,\r
+*  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+*  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+*  License. The License limits your use, and you acknowledge, that the Software may not be\r
+*  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+*  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+*  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+*  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+*  perform, display or sell this Software and/or its documentation for any purpose.\r
+*\r
+*  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+*  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+*  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+*  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+*  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+*  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+*  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+*  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+*  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+*\r
+*  Should you have any questions regarding your right to use this Software,\r
+*  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+\r
+/******************************************************************************\r
+ * INCLUDES\r
+ */\r
+#include <string.h>\r
+#include "bsp.h"\r
+#include "mrfi.h"\r
+#include "nwk_types.h"\r
+#include "nwk_frame.h"\r
+#include "nwk.h"\r
+#include "nwk_ping.h"\r
+#include "nwk_globals.h"\r
+#include "nwk_api.h"\r
+#include "nwk_freq.h"\r
+#include "nwk_security.h"\r
+\r
+/******************************************************************************\r
+ * MACROS\r
+ */\r
+\r
+/******************************************************************************\r
+ * CONSTANTS AND DEFINES\r
+ */\r
+\r
+/******************************************************************************\r
+ * TYPEDEFS\r
+ */\r
+\r
+/******************************************************************************\r
+ * LOCAL VARIABLES\r
+ */\r
+\r
+static volatile uint8_t sTid = 0;\r
+\r
+/******************************************************************************\r
+ * LOCAL FUNCTIONS\r
+ */\r
+static void smpl_send_ping_reply(mrfiPacket_t *);\r
+static void handlePingRequest(mrfiPacket_t *);\r
+\r
+/******************************************************************************\r
+ * GLOBAL VARIABLES\r
+ */\r
+\r
+/******************************************************************************\r
+ * GLOBAL FUNCTIONS\r
+ */\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_pingInit\r
+ *\r
+ * @brief       Initialize Ping application.\r
+ *\r
+ * input parameters\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   void\r
+ */\r
+\r
+void nwk_pingInit(void)\r
+{\r
+    sTid = MRFI_RandomByte();\r
+\r
+    return;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_ping\r
+ *\r
+ * @brief       Called from the application level to ping a peer. A small\r
+ *              payload is sent that includes a tid to detect correct reply.\r
+ *              Caller does not supply payload.\r
+ *\r
+ * input parameters\r
+ * @param   lid     - Link ID representing peer to ping\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   SMPL_SUCCESS   valid reply received\r
+ *           SMPL_TIMEOUT   no valid reply received\r
+ *           SMPL_NO_CHANNEL  no channels returned on a scan\r
+ */\r
+\r
+smplStatus_t nwk_ping(linkID_t lid)\r
+{\r
+    connInfo_t  *pCInfo   = nwk_getConnInfo(lid);\r
+    smplStatus_t rc       = SMPL_BAD_PARAM;\r
+    uint8_t done     = 0;\r
+    uint8_t repeatIt = 2;\r
+    uint8_t msg[MAX_PING_APP_FRAME];\r
+    uint8_t radioState = MRFI_GetRadioState();\r
+\r
+    union\r
+    {\r
+        ioctlRawSend_t send;\r
+        ioctlRawReceive_t recv;\r
+    } ioctl_info;\r
+\r
+    if (!pCInfo || (SMPL_LINKID_USER_UUD == lid))\r
+    {\r
+        /* either link ID bogus or tried to ping the unconnected user datagram link ID. */\r
+        return rc;\r
+    }\r
+\r
+    do\r
+    {\r
+#if defined(FREQUENCY_AGILITY) && !defined(ACCESS_POINT)\r
+        uint8_t i, numChan;\r
+        freqEntry_t channels[NWK_FREQ_TBL_SIZE];\r
+\r
+        if (repeatIt == 2)\r
+        {\r
+            /* If FA enabled, first time through set up so that the 'for'\r
+             * loop checks the current channel. This saves time (no scan)\r
+             * and is very likely to succeed. Populate the proper strucure.\r
+             */\r
+            SMPL_Ioctl(IOCTL_OBJ_FREQ, IOCTL_ACT_GET, channels);\r
+            numChan = 1;\r
+        }\r
+        else\r
+        {\r
+            /* If we get here we must scan for the channel we're now on */\r
+            if (!(numChan = nwk_scanForChannels(channels)))\r
+            {\r
+                return SMPL_NO_CHANNEL;\r
+            }\r
+        }\r
+        /* Either we scan next time through or we're done */\r
+        repeatIt--;\r
+\r
+        /* this loop Pings on each channel (probably only 1) looking\r
+         * for peer.\r
+         */\r
+        for (i = 0; i < numChan && !done; ++i)\r
+        {\r
+            nwk_setChannel(&channels[i]);\r
+#else\r
+        {\r
+            repeatIt = 0;\r
+#endif      /* defined(FREQUENCY_AGILITY) && !defined(ACCESS_POINT) */\r
+\r
+            ioctl_info.send.addr = (addr_t *)pCInfo->peerAddr;\r
+            ioctl_info.send.msg  = msg;\r
+            ioctl_info.send.len  = sizeof(msg);\r
+            ioctl_info.send.port = SMPL_PORT_PING;\r
+\r
+            /* fill in msg */\r
+            msg[PB_REQ_OS] = PING_REQ_PING;\r
+            msg[PB_TID_OS] = sTid;\r
+\r
+            SMPL_Ioctl(IOCTL_OBJ_RAW_IO, IOCTL_ACT_WRITE, &ioctl_info.send);\r
+\r
+            ioctl_info.recv.port = SMPL_PORT_PING;\r
+            ioctl_info.recv.msg  = msg;\r
+            ioctl_info.recv.addr = 0;\r
+\r
+            NWK_CHECK_FOR_SETRX(radioState);\r
+            NWK_REPLY_DELAY();\r
+            NWK_CHECK_FOR_RESTORE_STATE(radioState);\r
+\r
+            if (SMPL_SUCCESS == SMPL_Ioctl(IOCTL_OBJ_RAW_IO, IOCTL_ACT_READ, &ioctl_info.recv))\r
+            {\r
+                repeatIt = 0;\r
+                done     = 1;\r
+                sTid++; /* guard against duplicates */\r
+            }\r
+        }\r
+    } while (repeatIt);\r
+\r
+    return done ? SMPL_SUCCESS : SMPL_TIMEOUT;\r
+\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          smpl_send_ping_reply\r
+ *\r
+ * @brief       Send a reply to a ping request.\r
+ *\r
+ * input parameters\r
+ * @param   frame     - pointer to frame containing request\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   void\r
+ */\r
+\r
+static void smpl_send_ping_reply(mrfiPacket_t *frame)\r
+{\r
+    frameInfo_t *pOutFrame;\r
+\r
+    /* Build the reply frame. The application payload is the one included in the\r
+     * received frame payload.\r
+     */\r
+    if (pOutFrame =\r
+            nwk_buildFrame(SMPL_PORT_PING, MRFI_P_PAYLOAD(frame) + F_APP_PAYLOAD_OS,\r
+                           MRFI_GET_PAYLOAD_LEN(frame) - F_APP_PAYLOAD_OS, MAX_HOPS))\r
+    {\r
+        /* destination address is the source adddress of the received frame. */\r
+        memcpy(MRFI_P_DST_ADDR(&pOutFrame->mrfiPkt), MRFI_P_SRC_ADDR(frame), NET_ADDR_SIZE);\r
+\r
+        /* turn on the reply bit in the application payload */\r
+        *(MRFI_P_PAYLOAD(&pOutFrame->mrfiPkt) + F_APP_PAYLOAD_OS + PB_REQ_OS) |= NWK_APP_REPLY_BIT;\r
+#ifdef SMPL_SECURE\r
+        nwk_setSecureFrame(&pOutFrame->mrfiPkt, MRFI_GET_PAYLOAD_LEN(frame) - F_APP_PAYLOAD_OS, 0);\r
+#endif  /* SMPL_SECURE */\r
+        nwk_sendFrame(pOutFrame, MRFI_TX_TYPE_FORCED);\r
+    }\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_processPing\r
+ *\r
+ * @brief       Ping network application frame handler.\r
+ *\r
+ * input parameters\r
+ * @param   frame   - pointer to frame in question\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return    Keep frame for application, release frame, or replay frame.\r
+ */\r
+\r
+fhStatus_t nwk_processPing(mrfiPacket_t *frame)\r
+{\r
+    fhStatus_t rc;\r
+    uint8_t replyType;\r
+\r
+    /* If we sent this then this is the reply. Validate the\r
+     * packet for reception by client app. If we didn't send\r
+     * it then we are the target. Send the reply.\r
+     */\r
+    replyType = nwk_isValidReply(frame, sTid, PB_REQ_OS, PB_TID_OS);\r
+    if (SMPL_MY_REPLY == replyType)\r
+    {\r
+        /* It's a match and it's a reply. Validate the received packet by\r
+         * returning a 1 so it can be received by the client app.\r
+         */\r
+        MRFI_PostKillSem();\r
+        rc = FHS_KEEP;\r
+    }\r
+#if !defined(END_DEVICE)\r
+    else if (SMPL_A_REPLY == replyType)\r
+    {\r
+        /* no match. If I'm not an ED this is a reply that should be passed on. */\r
+        rc = FHS_REPLAY;\r
+    }\r
+#endif  /* !END_DEVICE */\r
+    else\r
+    {\r
+        /* No, we didn't send it. Send reply assuming it's a Ping intended for us. */\r
+        handlePingRequest(frame);\r
+\r
+        rc = FHS_RELEASE;\r
+    }\r
+\r
+    return rc;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          handlePingRequest\r
+ *\r
+ * @brief       Dispatches handler for specfic Ping request\r
+ *\r
+ * input parameters\r
+ *\r
+ * @param   frame - Ping frame received\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   void\r
+ */\r
+\r
+static void handlePingRequest(mrfiPacket_t *frame)\r
+{\r
+    switch (*(MRFI_P_PAYLOAD(frame) + F_APP_PAYLOAD_OS))\r
+    {\r
+        case PING_REQ_PING:\r
+            smpl_send_ping_reply(frame);\r
+            break;\r
+\r
+        default:\r
+            break;\r
+    }\r
+\r
+    return;\r
+}\r
+\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/simpliciti/Components/nwk_applications/nwk_ping.h b/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/simpliciti/Components/nwk_applications/nwk_ping.h
new file mode 100755 (executable)
index 0000000..6f49bbf
--- /dev/null
@@ -0,0 +1,59 @@
+/**************************************************************************************************\r
+*  Filename:       nwk_ping.h\r
+*  Revised:        $Date: 2008-05-14 14:22:31 -0700 (Wed, 14 May 2008) $\r
+*  Revision:       $Revision: 17075 $\r
+*  Author:         $Author: lfriedman $\r
+*\r
+*  Description:    This file supports the SimpliciTI Ping network application.\r
+*\r
+*  Copyright 2004-2007 Texas Instruments Incorporated. All rights reserved.\r
+*\r
+*  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+*  the terms of a software license agreement between the user who downloaded the software,\r
+*  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+*  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+*  License. The License limits your use, and you acknowledge, that the Software may not be\r
+*  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+*  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+*  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+*  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+*  perform, display or sell this Software and/or its documentation for any purpose.\r
+*\r
+*  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+*  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+*  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+*  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+*  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+*  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+*  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+*  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+*  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+*\r
+*  Should you have any questions regarding your right to use this Software,\r
+*  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+\r
+#ifndef NWK_PING_H\r
+#define NWK_PING_H\r
+\r
+/* change the following as protocol developed */\r
+#define MAX_PING_APP_FRAME    2\r
+\r
+/* application payload offsets\r
+ *    both */\r
+#define PB_REQ_OS     0\r
+#define PB_TID_OS     1\r
+\r
+\r
+/* ping requests */\r
+#define PING_REQ_PING       1\r
+\r
+/* prototypes */\r
+fhStatus_t nwk_processPing(mrfiPacket_t *);\r
+void nwk_pingInit(void);\r
+\r
+smplStatus_t nwk_ping(linkID_t);\r
+\r
+\r
+#endif\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/simpliciti/Components/nwk_applications/nwk_security.c b/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/simpliciti/Components/nwk_applications/nwk_security.c
new file mode 100755 (executable)
index 0000000..d53a558
--- /dev/null
@@ -0,0 +1,565 @@
+/**************************************************************************************************\r
+*  Filename:       nwk_security.c\r
+*  Revised:        $Date: 2009-01-20 14:05:46 -0800 (Tue, 20 Jan 2009) $\r
+*  Revision:       $Revision: 18816 $\r
+*  Author:         $Author: lfriedman $\r
+*\r
+*  Description:    This file supports the SimpliciTI Security network application.\r
+*\r
+*  Copyright 2008-2009 Texas Instruments Incorporated. All rights reserved.\r
+*\r
+*  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+*  the terms of a software license agreement between the user who downloaded the software,\r
+*  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+*  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+*  License. The License limits your use, and you acknowledge, that the Software may not be\r
+*  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+*  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+*  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+*  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+*  perform, display or sell this Software and/or its documentation for any purpose.\r
+*\r
+*  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+*  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+*  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+*  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+*  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+*  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+*  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+*  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+*  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+*\r
+*  Should you have any questions regarding your right to use this Software,\r
+*  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+/******************************************************************************\r
+ * INCLUDES\r
+ */\r
+\r
+#include <string.h>     /* needed for NULL */\r
+#include "mrfi.h"\r
+#include "nwk_types.h"\r
+#include "nwk_security.h"\r
+#include "nwk_frame.h"\r
+#include "nwk.h"\r
+\r
+#ifdef SMPL_SECURE\r
+\r
+/*                   *** GENERAL SECURITY OUTLINE ***\r
+ *\r
+ * We are using XTEA (eXtended Tiny Encryption Algorithm) with a fixed\r
+ * number of rounds (32). We have removed the parameters from the API\r
+ * we harvested from the public domain.\r
+ *\r
+ * We are using a CTR-like mode. We use the 64-bit block cipher function of the\r
+ * XTEA code to encipher a concatenation of the 32-bit initialization vector and\r
+ * a 32-bit counter that increments each block. We encrypt using a fixed 128-bit\r
+ * key. The resulting 64-bit output is XOR'ed with the message. If the message is\r
+ * longer than 64 bits we encipher the next block (incrementing the counter) and\r
+ * continue until the message is exhausted. If the last cipher block is longer\r
+ * than the message we simply discard the remaining cipher block.\r
+ */\r
+\r
+\r
+/******************************************************************************\r
+ * MACROS\r
+ */\r
+\r
+/******************************************************************************\r
+ * CONSTANTS AND DEFINES\r
+ */\r
+\r
+/* The counter can be off by quite a bit because the number of cipher\r
+ * blocks can easily be more than 1 per frame. Value limited to a\r
+ * maximum of 255.\r
+ */\r
+#    define CTR_WINDOW  255\r
+\r
+#    if (CTR_WINDOW > 255) || (CTR_WINDOW < 0)\r
+#        error ERROR: 0 <= CTR_WINDOW < 256\r
+#    endif\r
+\r
+/* Number of rounds for XTEA algorithm. A parameter in the public domain code\r
+ * but we fix it here at 32.\r
+ */\r
+#    define NUM_ROUNDS  32\r
+\r
+/* Key and cipher block size constants */\r
+#    define SMPL_KEYSIZE_BYTES    16\r
+#    define SMPL_KEYSIZE_LONGS     4\r
+\r
+/******************************************************************************\r
+ * TYPEDEFS\r
+ */\r
+/* Union used to access key as both a string and as unsigned longs */\r
+typedef union\r
+{\r
+    uint8_t keyS[SMPL_KEYSIZE_BYTES];\r
+    uint32_t keyL[SMPL_KEYSIZE_LONGS];\r
+} key_t;\r
+\r
+\r
+/******************************************************************************\r
+ * LOCAL VARIABLES\r
+ */\r
+/* 32-bit Initialization vector */\r
+static uint32_t const sIV = 0x87654321;\r
+\r
+/* 128-bit (16 byte) key. Initialized as string but fetched and used in XTEA\r
+ * encryption as 4 unsigned longs. Endianess could count if the peers are on\r
+ * two different MCUs. Endianess is rectified in initialization code.\r
+ *\r
+ * Initialization _MUST_ be done as a string (or character array). Though it\r
+ * won't matter how the initialization is done if both peers are the same\r
+ * endianness, good prectice will initialize these as a string (or character\r
+ * array) so that the endianess reconciliation works properly for all cases.\r
+ */\r
+static key_t sKey = {"SimpliciTI's Key"};\r
+\r
+/* Constant set as an authentication code. Note that since it is a\r
+ * fixed value as opposed to a hash of the message it does not provide\r
+ * an integrity check. It will only differentiate two message encryptions\r
+ * with the same LSB but different MSB components. Thus it helps guard\r
+ * against replays.\r
+ */\r
+static secMAC_t const sMAC = 0xA5;\r
+\r
+/* This is the 64-bit cipher block target. It is this 64-bit block that\r
+ * is XOR'ed with the actual message to be encrypted.\r
+ */\r
+static uint32_t sMsg[2] = {0, 0};\r
+\r
+/******************************************************************************\r
+ * LOCAL FUNCTIONS\r
+ */\r
+static secFCS_t calcFCS(uint8_t *, uint8_t);\r
+static void msg_encipher(uint8_t *, uint8_t, uint32_t *);\r
+static void msg_decipher(uint8_t *, uint8_t, uint32_t *);\r
+static void xtea_encipher(void);\r
+\r
+#endif  /* SMPL_SECURE */\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_securityInit\r
+ *\r
+ * @brief       Initialize Security network application.\r
+ *\r
+ * input parameters\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return      void\r
+ */\r
+\r
+void nwk_securityInit(void)\r
+{\r
+#ifdef SMPL_SECURE\r
+    uint8_t i;\r
+\r
+    /* The key is set as a string. But the XTEA routines operate on 32-bit\r
+     * unsigned longs. Endianess should be taken into account and we do that\r
+     * here by treating the key as being an array of unsigned longs in\r
+     * network order.\r
+     */\r
+    for (i = 0; i < sizeof(sKey.keyL) / sizeof(uint32_t); ++i)\r
+    {\r
+        sKey.keyL[i] = ntohl(sKey.keyL[i]);\r
+    }\r
+\r
+#endif  /* SMPL_SECURE */\r
+    return;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_processSecurity\r
+ *\r
+ * @brief       Security network application frame handler.\r
+ *\r
+ * input parameters\r
+ * @param   frame   - pointer to frame in question\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return    Keep frame for application, release frame, or replay frame.\r
+ */\r
+\r
+fhStatus_t nwk_processSecurity(mrfiPacket_t *frame)\r
+{\r
+    return FHS_RELEASE;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          msg_encipher\r
+ *\r
+ * @brief       Encipher a message using the XTEA algorithm and the modified\r
+ *              CTR mode method.\r
+ *\r
+ * input parameters\r
+ * @param   msg      - pointer to message to encipher\r
+ * @param   len      - length of message\r
+ * @param   cntStart - pointer to the counter used in the cipher block.\r
+ *\r
+ * output parameters\r
+ * @param   cntStart - counter is updated during encryption.\r
+ *\r
+ * @return      void\r
+ */\r
+#ifdef SMPL_SECURE\r
+static void msg_encipher(uint8_t *msg, uint8_t len, uint32_t *cntStart)\r
+{\r
+    uint8_t i, idx, done;\r
+    uint8_t *mptr = (uint8_t *)&sMsg[0];\r
+    uint32_t ctr;\r
+\r
+    if ((NULL == msg) || !len)\r
+    {\r
+        return;\r
+    }\r
+\r
+    /* set local counter from input */\r
+    ctr = *cntStart;\r
+\r
+    idx  = 0;\r
+    done = 0;\r
+    do\r
+    {\r
+        /* Set block to be enciphered. 1st 32 bits are the IV. The second\r
+         * 32 bits are the current CTR value.\r
+         */\r
+        sMsg[0] = sIV;\r
+        sMsg[1] = ctr;\r
+        /* encrypt */\r
+        xtea_encipher();\r
+        /* increment counter for next time. */\r
+        ctr++;\r
+\r
+        /* XOR ciphered block with message to be sent. Only operate\r
+         * up to and including the last message byte which may not\r
+         * be on a cipher block boundary (64 bits == 8 bytes).\r
+         */\r
+        for (i = 0; i < sizeof(sMsg) && idx < len; ++i, ++idx)\r
+        {\r
+            msg[idx] ^= mptr[i];\r
+        }\r
+\r
+        if (idx >= len)\r
+        {\r
+            /* we're done */\r
+            done = 1;\r
+        }\r
+    } while (!done);\r
+\r
+    /* return counter value start for next time */\r
+    *cntStart = ctr;\r
+\r
+    return;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          msg_decipher\r
+ *\r
+ * @brief       Decipher a message using the XTEA algorithm and the modified\r
+ *              CTR mode method.\r
+ *\r
+ * input parameters\r
+ * @param   msg      - pointer to message to decipher\r
+ * @param   len      - length of message\r
+ * @param   cntStart - pointer to the counter used in the cipher block.\r
+ *\r
+ * output parameters\r
+ * @param   cntStart - counter is updated during decryption.\r
+ *\r
+ * @return      void\r
+ */\r
+\r
+static void msg_decipher(uint8_t *msg, uint8_t len, uint32_t *cntStart)\r
+{\r
+    msg_encipher(msg, len, cntStart);\r
+\r
+    return;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          xtea_encipher\r
+ *\r
+ * @brief       XTEA encipher algorithm. Calling arguments removed from public\r
+ *              domain code and static-scope values used instead.\r
+ *\r
+ * input parameters\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return      void\r
+ */\r
+\r
+void xtea_encipher(void)\r
+{\r
+    uint32_t v0 = sMsg[0], v1 = sMsg[1];\r
+    uint16_t i;\r
+    uint32_t sum = 0, delta = 0x9E3779B9;\r
+\r
+    for (i = 0; i < NUM_ROUNDS; i++)\r
+    {\r
+        v0  += (((v1 << 4) ^ (v1 >> 5)) + v1) ^ (sum + sKey.keyL[sum & 3]);\r
+        sum += delta;\r
+        v1  += (((v0 << 4) ^ (v0 >> 5)) + v0) ^ (sum + sKey.keyL[(sum >> 11) & 3]);\r
+    }\r
+\r
+    sMsg[0] = v0;\r
+    sMsg[1] = v1;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_setSecureFrame\r
+ *\r
+ * @brief       Called from NWK to secure a frame.\r
+ *\r
+ * input parameters\r
+ * @param   frame   - pointer to frame to secure\r
+ * @param   msglen  - length of message\r
+ * @param   ctr     - pointer to the counter used in the cipher block. This will\r
+ *                    be NULL if a network application is sending a frame. Since\r
+ *                    these are not connection-based there is no counter sync\r
+ *                    issue but we still need a counter value. A random value\r
+ *                    is used.\r
+ *\r
+ * output parameters\r
+ * @param   cntStart - counter is updated during encryption.\r
+ *\r
+ * @return      void\r
+ */\r
+\r
+void nwk_setSecureFrame(mrfiPacket_t *frame, uint8_t msglen, uint32_t *ctr)\r
+{\r
+    uint32_t locCnt;\r
+\r
+    /* If an encrypted frame is to be sent to a non-connection based port use a\r
+     * random number as the lsb counter value. In this case only the lsb is used\r
+     * for a counter value during decryption. Not as secure but there are still\r
+     * the 32 bits in the IV.\r
+     */\r
+    locCnt = ctr ? *ctr : MRFI_RandomByte();\r
+\r
+    /* place counter value into frame */\r
+    PUT_INTO_FRAME(MRFI_P_PAYLOAD(frame), F_SEC_CTR_OS, (uint8_t)(locCnt & 0xFF));\r
+\r
+    /* Put MAC value in */\r
+    nwk_putNumObjectIntoMsg((void *)&sMAC, (void *)(MRFI_P_PAYLOAD(frame) + F_SEC_MAC_OS),\r
+                            sizeof(secMAC_t));\r
+\r
+    /* Put FCS value in */\r
+    {\r
+        secFCS_t fcs = calcFCS(MRFI_P_PAYLOAD(frame) + F_SEC_MAC_OS, msglen + sizeof(secMAC_t));\r
+\r
+        nwk_putNumObjectIntoMsg((void *)&fcs, (void *)(MRFI_P_PAYLOAD(\r
+                                                           frame) + F_SEC_ICHK_OS), sizeof(secFCS_t));\r
+    }\r
+\r
+    /* Encrypt frame */\r
+    msg_encipher(MRFI_P_PAYLOAD(\r
+                     frame) + F_SEC_ICHK_OS, msglen + sizeof(secMAC_t) + sizeof(secFCS_t), &locCnt);\r
+\r
+    /* Set the Encryption bit */\r
+    PUT_INTO_FRAME(MRFI_P_PAYLOAD(frame), F_ENCRYPT_OS, F_ENCRYPT_OS_MSK);\r
+\r
+    /* Update the counter if it was a "real" counter. */\r
+    if (ctr)\r
+    {\r
+        *ctr = locCnt;\r
+    }\r
+\r
+    return;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          calcFCS\r
+ *\r
+ * @brief       Calculate the frame check sequence. Currently it's just a\r
+ *              cumulative XOR of each byte starting with the MAC byte. The\r
+ *              FCS is placed in front of the MAC after the counter hint and is\r
+ *              included in the encryption.\r
+ *\r
+ * input parameters\r
+ * @param   msg      - pointer to message\r
+ * @param   len      - length of message\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return      Returns the FCS using the typedef.\r
+ */\r
+\r
+static secFCS_t calcFCS(uint8_t *msg, uint8_t len)\r
+{\r
+    uint8_t i;\r
+    secFCS_t result = 0;\r
+\r
+    for (i = 0; i < len; ++i)\r
+    {\r
+        result ^= *(msg + i);\r
+    }\r
+\r
+    return result;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_getSecureFrame\r
+ *\r
+ * @brief       Called from NWK to get a secure a frame and decrypt.\r
+ *\r
+ * input parameters\r
+ * @param   frame    - pointer to frame containing encrypted message\r
+ * @param   msglen   - length of message\r
+ * @param   ctr      - pointer to the counter used in the cipher block. This will\r
+ *                     be NULL if a network applicaiton is getting a frame. Since\r
+ *                     these are not connection-nbased there is no counter sync\r
+ *                     issue but we still need a counter value.\r
+ *\r
+ * output parameters\r
+ * @param   cntStart - counter is updated during decryption. If decryption fails\r
+ *                     this value is not changed.\r
+ *\r
+ * @return      Returns non-zero if frame decryption is valid, otherwise returns 0.\r
+ */\r
+\r
+uint8_t nwk_getSecureFrame(mrfiPacket_t *frame, uint8_t msglen, uint32_t *ctr)\r
+{\r
+    uint8_t rc = 1;\r
+    uint8_t done = 0;\r
+    uint8_t cntHint = GET_FROM_FRAME(MRFI_P_PAYLOAD(frame), F_SEC_CTR_OS);\r
+    uint32_t locCnt, frameCnt;\r
+\r
+    /* Construct proposed CTR values */\r
+\r
+    /* Just like encryption, we may be talking to a non-connection based\r
+     * peer in which case the counter value is represented by the lsb byte\r
+     * conveyed in the frame.\r
+     */\r
+    locCnt = ctr ? *ctr : cntHint;\r
+\r
+    frameCnt = (locCnt & 0xFFFFFF00) + cntHint;\r
+\r
+    do\r
+    {\r
+        /* See if counters match */\r
+        if (locCnt == frameCnt)\r
+        {\r
+            /* When the counters appear to match is the only time we actually decipher\r
+             * the message. It is the only time we can do so since out-of-sync lsb counter\r
+             * values guarantees that something is wrong somewhere. Decryption is successful\r
+             * only if the MAC and FCS values match. The message is left as-is after the\r
+             * decipher attempt. Either it appears valid or is doesn't and is discarded.\r
+             * There is no recovery attempt if the counters match but the MAC or FCS do\r
+             * not. It is considered a rogue message.\r
+             */\r
+            msg_decipher(MRFI_P_PAYLOAD(frame) + F_SEC_ICHK_OS, msglen - 1, &locCnt);\r
+\r
+            /* Get MAC and make sure it matches. A failure can occur if a replayed frame happens\r
+             * to have the correct counter sync value but was encoded with the wrong complete\r
+             * counter value. Otherwise the MAC values must match when the counter values are equal.\r
+             */\r
+            {\r
+                secMAC_t mac;\r
+\r
+                nwk_getNumObjectFromMsg((void *)(MRFI_P_PAYLOAD(\r
+                                                     frame) + F_SEC_MAC_OS), (void *)&mac,\r
+                                        sizeof(secMAC_t));\r
+                if (mac != sMAC)\r
+                {\r
+                    rc = 0;\r
+                }\r
+            }\r
+\r
+            /* FCS check... */\r
+            {\r
+                secFCS_t fcs;\r
+\r
+                nwk_getNumObjectFromMsg((void *)(MRFI_P_PAYLOAD(\r
+                                                     frame) + F_SEC_ICHK_OS), (void *)&fcs,\r
+                                        sizeof(secFCS_t));\r
+                if (fcs !=\r
+                    calcFCS(MRFI_P_PAYLOAD(frame) + F_SEC_MAC_OS, msglen - 1 - sizeof(secMAC_t)))\r
+                {\r
+                    rc = 0;\r
+                }\r
+            }\r
+\r
+            /* we're done. */\r
+            done = 1;\r
+        }\r
+        else\r
+        {\r
+            /* Uh oh. Counters don't match. Try and resync. We need to distinguish among\r
+             * missed frames, duplicates and rogues plus account for counter wrap.\r
+             */\r
+            if (frameCnt > locCnt)\r
+            {\r
+                /* frameCnt is bigger. Second part of test below takes care of\r
+                 * the unlikely case of a complete counter wrap (msb's all 0) in\r
+                 * which case the test will incorrectly fail when the count is\r
+                 * actually within the (wrapped) window. #ifdef'ed to avoid compiler\r
+                 * warning in case user sets CNT_WINDOW to 0 (pointless comparison of\r
+                 * unsigned value).\r
+                 */\r
+                if (((frameCnt - CTR_WINDOW) <= locCnt)\r
+#    if CTR_WINDOW > 0\r
+                    || (frameCnt < CTR_WINDOW)\r
+#    endif\r
+                    )\r
+                {\r
+                    /* Value within window. We probably missed something. Adjust and decipher.\r
+                     * If locCnt is less because it wrapped and frameCnt didn't it means that\r
+                     * it's a duplicate or late frame. In that case the following will lead to\r
+                     * a decryption that fails sanity checks which is OK because the frame will\r
+                     * be correctly rejected.\r
+                     */\r
+                    locCnt = frameCnt;\r
+                }\r
+                else\r
+                {\r
+                    /* It's either a rogue or a really old duplicate packet. In either case\r
+                     * we dismiss the frame.\r
+                     */\r
+                    rc   = 0;\r
+                    done = 1;\r
+                }\r
+            }\r
+            else\r
+            {\r
+                /* locCnt is bigger. The only way the frame can be valid is if the\r
+                 * counter wrapped causing frameCnt to appear to be smaller. Wrap the\r
+                 * counter and decrypt. If the frame isn't valid, i.e., it's late,\r
+                 * a duplicate, or a rogue, the decryption will fail sanity checks and\r
+                 * the frame will be correctly rejected. The following arithmetic works\r
+                 * correctly without a special test for the complete counter wrap case.\r
+                 */\r
+                frameCnt += 0x100; /* wrap the hint-based counter */\r
+                if (((frameCnt - CTR_WINDOW) <= locCnt))\r
+                {\r
+                    /* An lsb wrap but still within window. We probably missed something.\r
+                     * Adjust (with wrap) and decrypt.\r
+                     */\r
+                    locCnt = frameCnt;\r
+                }\r
+                else\r
+                {\r
+                    /* rogue frame */\r
+                    rc   = 0;\r
+                    done = 1;\r
+                }\r
+            }\r
+        }\r
+    } while (!done);\r
+\r
+    if (ctr && rc)\r
+    {\r
+        /* Only update the counter if the count was a "real" one and the\r
+         * decryption succeeded.\r
+         */\r
+        *ctr = locCnt;\r
+    }\r
+\r
+    return rc;\r
+}\r
+\r
+#endif  /* SMPL_SECURE */\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/simpliciti/Components/nwk_applications/nwk_security.h b/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/simpliciti/Components/nwk_applications/nwk_security.h
new file mode 100755 (executable)
index 0000000..ad8b087
--- /dev/null
@@ -0,0 +1,49 @@
+/**************************************************************************************************\r
+*  Filename:       nwk_security.h\r
+*  Revised:        $Date: 2009-01-09 15:02:17 -0800 (Fri, 09 Jan 2009) $\r
+*  Revision:       $Revision: 18728 $\r
+*  Author:         $Author: lfriedman $\r
+*\r
+*  Description:    This file supports the SimpliciTI Security network application.\r
+*\r
+*  Copyright 2004-2007 Texas Instruments Incorporated. All rights reserved.\r
+*\r
+*  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+*  the terms of a software license agreement between the user who downloaded the software,\r
+*  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+*  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+*  License. The License limits your use, and you acknowledge, that the Software may not be\r
+*  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+*  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+*  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+*  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+*  perform, display or sell this Software and/or its documentation for any purpose.\r
+*\r
+*  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+*  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+*  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+*  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+*  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+*  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+*  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+*  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+*  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+*\r
+*  Should you have any questions regarding your right to use this Software,\r
+*  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+\r
+#ifndef NWK_SECURITY_H\r
+#define NWK_SECURITY_H\r
+\r
+/* change the following as Security application is developed */\r
+#define MAX_SEC_APP_FRAME    0\r
+\r
+/* prototypes  */\r
+void nwk_securityInit(void);\r
+fhStatus_t nwk_processSecurity(mrfiPacket_t *);\r
+\r
+void nwk_setSecureFrame(mrfiPacket_t *, uint8_t, uint32_t *);\r
+uint8_t nwk_getSecureFrame(mrfiPacket_t *, uint8_t, uint32_t *);\r
+#endif\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/simpliciti/simpliciti.h b/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/simpliciti/simpliciti.h
new file mode 100755 (executable)
index 0000000..9881a61
--- /dev/null
@@ -0,0 +1,163 @@
+// *************************************************************************************************\r
+//\r
+//     Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//       Redistribution and use in source and binary forms, with or without\r
+//       modification, are permitted provided that the following conditions\r
+//       are met:\r
+//\r
+//         Redistributions of source code must retain the above copyright\r
+//         notice, this list of conditions and the following disclaimer.\r
+//\r
+//         Redistributions in binary form must reproduce the above copyright\r
+//         notice, this list of conditions and the following disclaimer in the\r
+//         documentation and/or other materials provided with the\r
+//         distribution.\r
+//\r
+//         Neither the name of Texas Instruments Incorporated nor the names of\r
+//         its contributors may be used to endorse or promote products derived\r
+//         from this software without specific prior written permission.\r
+//\r
+//       THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//       "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//       LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//       A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//       OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//       SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//       LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//       DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//       THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//       (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//       OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+//\r
+// SimpliciTI packet size (TX only mode)\r
+// -------------------------------------\r
+//\r
+//              * packet rate                  (100/3) packets/second = 33.3 packets/second\r
+//             * packet length                 28 bytes\r
+//             * packet structure              4 bytes         preamble\r
+//                                                             4 bytes         sync\r
+//                                                             1 bytes         length\r
+//                                                             1 bytes         address\r
+//                                                             16 bytes        data\r
+//                                                                      12 byte network data\r
+//                                                                      4  byte user data\r
+//                                                             2 bytes         crc\r
+//\r
+// SimpliciTI frequency overview\r
+// -----------------------------\r
+//\r
+// CC430_End_Device_433MHz.lib (433MHz ISM band)\r
+//\r
+//             * base frequency                433.92 MHz\r
+//             * deviation                             32 kHz\r
+//             * channel spacing               25 kHz\r
+//             * used channel number   0 (frequency agility/hopping disabled)\r
+//             * data rate                             76.8 kBaud\r
+//             * output power                  1.4 dBm\r
+//             * duty                                  9,6% (TX only mode, 32 packets / second)\r
+//\r
+// CC430_End_Device_868MHz.lib (868MHz ISM band)\r
+//\r
+//             * base frequency                869.525 MHz\r
+//             * deviation                             32 kHz\r
+//             * channel spacing               25 kHz\r
+//             * used channel number   0 (frequency agility/hopping disabled)\r
+//             * data rate                             76.8 kBaud\r
+//             * output power                  1.1 dBm\r
+//             * duty                                  9,6% (TX only mode, 32 packets / second)\r
+//\r
+// CC430_End_Device_915MHz.lib (915MHz ISM band)\r
+//\r
+//             * base frequency                902.000 MHz\r
+//             * deviation                             32 kHz\r
+//             * channel spacing               200 kHz\r
+//             * used channel number   20 (frequency agility/hopping disabled)\r
+//             * data rate                             76.8 kBaud\r
+//             * output power                  1.3 dBm\r
+//             * duty                                  9.6% (TX only mode, 32 packets / second)\r
+//\r
+// *************************************************************************************************\r
+\r
+// ---------------------------------------------------------------\r
+// Generic defines and variables\r
+\r
+// Entry point into SimpliciTI library\r
+extern unsigned char simpliciti_link(void);\r
+\r
+// 4 byte device address overrides device address set during compile time\r
+extern unsigned char simpliciti_ed_address[4];\r
+\r
+// Maximum data length\r
+#define SIMPLICITI_MAX_PAYLOAD_LENGTH           (32u)\r
+\r
+// Data to send / receive\r
+extern unsigned char simpliciti_data[SIMPLICITI_MAX_PAYLOAD_LENGTH];\r
+\r
+// Flag contains status information and triggers to send data or to exit SimpliciTI library\r
+// Control is done from outside SimpliciTI library\r
+extern unsigned char simpliciti_flag;\r
+#define SIMPLICITI_STATUS_LINKING                       (BIT0)\r
+#define SIMPLICITI_STATUS_LINKED                        (BIT1)\r
+#define SIMPLICITI_STATUS_ERROR                     (BIT2)\r
+#define SIMPLICITI_TRIGGER_SEND_DATA            (BIT3)\r
+#define SIMPLICITI_TRIGGER_RECEIVED_DATA            (BIT4)\r
+#define SIMPLICITI_TRIGGER_STOP                     (BIT5)\r
+\r
+// Radio frequency offset read from calibration memory\r
+// Compensates crystal deviation from 26MHz nominal value\r
+extern unsigned char rf_frequoffset;\r
+\r
+// Macros\r
+#define getFlag(val, flag)                                              ((val & flag) == flag)\r
+#define setFlag(val, flag)                                              (val |= flag)\r
+#define clearFlag(val, flag)                                    (val &= (~flag))\r
+#define toggleFlag(val, flag)                                   (val ^= flag)\r
+\r
+\r
+// ---------------------------------------------------------------\r
+// SimpliciTI RX only\r
+\r
+// Entry point into SimpliciTI library\r
+extern void simpliciti_main_tx_only(void);\r
+\r
+// Callback function to read data from acceleration sensor or buttons and trigger sending\r
+extern void simpliciti_get_ed_data_callback(void);\r
+\r
+\r
+// ---------------------------------------------------------------\r
+// SimpliciTI Sync\r
+\r
+// Sync data length\r
+#define BM_SYNC_DATA_LENGTH                     (19u)\r
+\r
+// Device data  (0)TYPE   (1) - (18) DATA\r
+#define SYNC_ED_TYPE_R2R                        (1u)\r
+#define SYNC_ED_TYPE_MEMORY                     (2u)\r
+#define SYNC_ED_TYPE_STATUS                     (3u)\r
+\r
+// Host data    (0)CMD    (1) - (18) DATA\r
+#define SYNC_AP_CMD_NOP                         (1u)\r
+#define SYNC_AP_CMD_GET_STATUS                                  (2u)\r
+#define SYNC_AP_CMD_SET_WATCH                   (3u)\r
+#define SYNC_AP_CMD_GET_MEMORY_BLOCKS_MODE_1    (4u)\r
+#define SYNC_AP_CMD_GET_MEMORY_BLOCKS_MODE_2    (5u)\r
+#define SYNC_AP_CMD_ERASE_MEMORY                (6u)\r
+#define SYNC_AP_CMD_EXIT                                                (7u)\r
+\r
+\r
+// Entry point into SimpliciTI library\r
+extern void simpliciti_main_sync(void);\r
+\r
+// Callback function to decode access point command\r
+extern void simpliciti_sync_decode_ap_cmd_callback(void);\r
+\r
+// Callback function to read data from application and trigger sending\r
+extern void simpliciti_sync_get_data_callback(unsigned int index);\r
+\r
+// Send reply packets (>0), 0=no need to reply\r
+extern unsigned char simpliciti_reply_count;\r
+\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/simpliciti/simpliciti_readme.txt b/chronos-ti/Software Projects/Chronos Watch/CCS/Sports Watch/simpliciti/simpliciti_readme.txt
new file mode 100755 (executable)
index 0000000..d1ff81d
--- /dev/null
@@ -0,0 +1,46 @@
+Some notes about the SimpliciTI configuration used in this project\r
+\r
+- The source code is based on the SimpliciTI 1.1.1 release.\r
+\r
+- A full SimpliciTI installation contains configurations for many targets and device types. To avoid confusion,\r
+  only the configuration (End Device) and target files (CC430EM) required for the eZ430-Chronos have been used.\r
+\r
+- All source code files have been copied into the project physically. Symbolic links have been replaced with\r
+  the real source code file. \r
+  \r
+- Due to the indirect inclusion scheme of hardware-dependent source code, some source code files have been\r
+  excluded from build. However, they will be included through higher level source code.  \r
+\r
+- Some modifications where required to the original source code. All these changes have been marked with [BM].\r
+\r
+       bsp_board.c/BSP_InitBoard(void)                 Changed from TA0 to TA1 for delay function, because TA0 is already occupied.\r
+\r
+       bsp_msp430_defs.h/BSP_EarlyInit(void)   Function removed, because SimpliciTI must run in watch context\r
+\r
+       mrfi_radio_interface.c/mrfiRadioInterfaceCmdStrobe(uint8_t addr)\r
+                                                                                       Added code to properly synchronize with radio interface. Otherwise\r
+                                                                                       interface could get stuck.\r
+                                                                                       \r
+       mrfi_radio.c                                                    Changed channel assignment (mrfiLogicalChanTable) for three ISM bands\r
+                                                                                       Changed power output settings (mrfiRFPowerTable) for three ISM bands\r
+                               \r
+       mrfi_radio.c/MRFI_Init(void)                    Added frequency offset correction to use calibrated frequency offset\r
+                                                                                       when starting RF communication\r
+                                                                                       \r
+       mrfi_radio.c/MRFI_RadioIsr(void)                Changed radio ISR to normal function, since we have a shared radio ISR\r
+       \r
+       nwk_api.c                                                               Made variable sInit_done globally available to allow SimpliciTI to shutdown \r
+                                                                                       and restart multiple times\r
+       \r
+       nwk.c/nwk_nwkInit                                               Added workaround to allow allow SimpliciTI to shutdown \r
+                                                                                       and restart multiple times\r
+\r
+- If you (for whatever reason) want to upgrade to a newer version of SimpliciTI, please bear in mind that\r
+\r
+       a) the access point SimpliciTI version is 1.1.1 (and cannot be updated)\r
+\r
+       b) the workarounds used here to enable SimpliciTI to shutdown and restart multiple times might not necessarily\r
+          work when used with later revisions\r
+                  \r
+          \r
+       
\ No newline at end of file
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/bluerobin/BlueRobin_RX_433MHz.r43 b/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/bluerobin/BlueRobin_RX_433MHz.r43
new file mode 100755 (executable)
index 0000000..6bc0263
Binary files /dev/null and b/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/bluerobin/BlueRobin_RX_433MHz.r43 differ
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/bluerobin/BlueRobin_RX_868MHz.r43 b/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/bluerobin/BlueRobin_RX_868MHz.r43
new file mode 100755 (executable)
index 0000000..beb04a4
Binary files /dev/null and b/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/bluerobin/BlueRobin_RX_868MHz.r43 differ
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/bluerobin/BlueRobin_RX_915MHz.r43 b/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/bluerobin/BlueRobin_RX_915MHz.r43
new file mode 100755 (executable)
index 0000000..17a47b4
Binary files /dev/null and b/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/bluerobin/BlueRobin_RX_915MHz.r43 differ
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/bluerobin/BlueRobin_RX_API.h b/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/bluerobin/BlueRobin_RX_API.h
new file mode 100755 (executable)
index 0000000..6cdbb8e
--- /dev/null
@@ -0,0 +1,161 @@
+// *************************************************************************************************\r
+//\r
+// Copyright 2009 BM innovations GmbH (www.bm-innovations.com), all rights reserved.\r
+//\r
+// This trial version of the "BlueRobin(TM) receiver library for the Texas Instruments \r
+// CC430 SoC" may be used for non-profit non-commercial purposes only. If you want to use \r
+// BlueRobin(TM) in a commercial project, please contact the copyright holder for a \r
+// separate license agreement.  \r
+//\r
+// By using this trial version of the "BlueRobin(TM) receiver library for the Texas Instruments \r
+// CC430 SoC", you implicitly agree that you will not modify, adapt, disassemble, decompile, \r
+// reverse engineer, translate or otherwise attempt to discover the source code of the \r
+// "BlueRobin(TM) receiver library for the Texas Instruments CC430 SoC".\r
+//\r
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY \r
+// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF \r
+// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. \r
+//\r
+// IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, \r
+// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, \r
+// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS \r
+// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT \r
+// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF \r
+// THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+// \r
+// *************************************************************************************************\r
+//\r
+// Public header for eZ430-Chronos specific BlueRobin(TM) receiver library.\r
+//\r
+// The following BlueRobin(TM) profiles are supported by this build\r
+//   - heart rate (HR) transmitter\r
+//\r
+// The following number of channels is supported: 1\r
+//\r
+// *************************************************************************************************\r
+//\r
+// BlueRobin(TM) packet size\r
+// -------------------------\r
+// \r
+//             * average packet rate   1 packet/875 msec = ~1.14 packets/second                                \r
+//             * payload per packet    5 bytes \r
+//\r
+// BlueRobin(TM) frequency overview \r
+// (Please note: Settings apply for the transmitter side, i.e. the USB dongle)\r
+// ----------------------------------------------------------------------\r
+//\r
+// Bluerobin_RX_433MHz.lib (433MHz ISM band)\r
+//\r
+//             * frequency                             433.30 MHz - 434.00 MHz\r
+//             * deviation                             95 kHz\r
+//             * channels                              3\r
+//             * data rate                             250 kBaud\r
+//\r
+// Bluerobin_RX_868MHz.lib (868MHz ISM band)\r
+//\r
+//             * frequency                             868.25 MHz - 868.95 MHz\r
+//             * deviation                             95 kHz\r
+//             * channels                              3\r
+//             * data rate                             250 kBaud\r
+//\r
+//\r
+// Bluerobin_RX_915MHz.lib (915MHz ISM band)\r
+//\r
+//             * frequency                             914.35 MHz - 917.75 MHz\r
+//             * deviation                             95 kHz\r
+//             * channels                              34\r
+//             * data rate                             250 kBaud\r
+//\r
+// *************************************************************************************************\r
+\r
+#ifndef BRRX_API_H_\r
+#define BRRX_API_H_\r
+\r
+// *************************************************************************************************\r
+// Include section\r
+\r
+\r
+// *************************************************************************************************\r
+// Defines section\r
+\r
+// List of all possible channel states\r
+typedef enum \r
+{\r
+  TX_OFF = 0,                // Powerdown mode\r
+  TX_ACTIVE,                 // Active mode\r
+  TX_SEARCH                  // Search mode\r
+} brtx_state_t;\r
+\r
+// Transmitter to channel assignment\r
+#define HR_CHANNEL           (0)\r
+\r
+\r
+// *************************************************************************************************\r
+// API section\r
+\r
+// ----------------------------------------------------------\r
+// Functions for initializing and controlling the library\r
+\r
+// Initialize several global variables.\r
+void  BRRX_Init_v(void);\r
+\r
+// Set delay after which a channel will be switched off if no new data can be received.\r
+// Param1: Powerdown delay in packet intervals (875 ms)\r
+void  BRRX_SetPowerdownDelay_v(u8 Delay_u8); \r
+\r
+// Set timeout when searching for a transmitter\r
+// Param1: Search timeout in seconds\r
+void  BRRX_SetSearchTimeout_v(u8 Timeout_u8);\r
+\r
+// Set reduction of valid signal level in learn mode.\r
+// Param1: Reduction of signal level\r
+void  BRRX_SetSignalLevelReduction_v(u8 Reduction_u8);\r
+\r
+// Set ID for a channel. To search for an unknown transmitter the ID has to be set to 0.\r
+// Can be only executed on channels currently in powerdown mode.\r
+// Param1: Channel index\r
+// Param2: New ID\r
+void  BRRX_SetID_v(u8 Index_u8, u32 ID_u32);\r
+\r
+// Get current ID of channel.\r
+// Return: Current ID of channel\r
+// Param1: Channel index\r
+u32 BRRX_GetID_u32(u8 Index_u8);\r
+\r
+// Start reception on one or all channels.\r
+// Param1: Channel index (use 0xFF to start all channels)\r
+void BRRX_Start_v(u8 Index_u8);\r
+\r
+// Stop reception on one or all channels.\r
+// Param1: Channel index (0xFF for all channels)\r
+void BRRX_Stop_v(u8 Index_u8);\r
+\r
+// Get current state of a channel\r
+// Param1: Channel index\r
+brtx_state_t BRRX_GetState_t(u8 Index_u8);\r
+\r
+\r
+// ----------------------------------------------------------\r
+// eZ430-Chronos specific functions\r
+\r
+// Get current heart rate.\r
+// Return: Heart rate in bpm\r
+u8  BRRX_GetHeartRate_u8(void);\r
+\r
+// Get current distance.\r
+// Return: Distance in 10m steps.\r
+u16 BRRX_GetDistance_u16(void);\r
+\r
+// Get current speed.\r
+// Return: Speed in 0.1km/h steps. Trial version is limited to 25.5km/h.\r
+u8  BRRX_GetSpeed_u8(void);\r
+\r
+// ----------------------------------------------------------\r
+// Radio-related functions\r
+\r
+// RX packet end service function\r
+// Must be called by CC1101_VECTOR ISR\r
+void BlueRobin_RadioISR_v(void);\r
+\r
+\r
+#endif /*BRRX_API_H_*/\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/bluerobin/bm.h b/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/bluerobin/bm.h
new file mode 100755 (executable)
index 0000000..7e7db49
--- /dev/null
@@ -0,0 +1,445 @@
+// *************************************************************************************************\r
+//\r
+// Copyright 2009 BM innovations GmbH (www.bm-innovations.com), all rights reserved.\r
+//\r
+// This trial version of the "BlueRobin(TM) receiver library for the Texas Instruments \r
+// CC430 SoC" may be used for non-profit non-commercial purposes only. If you want to use \r
+// BlueRobin(TM) in a commercial project, please contact the copyright holder for a \r
+// separate license agreement.  \r
+//\r
+// By using this trial version of the "BlueRobin(TM) receiver library for the Texas Instruments \r
+// CC430 SoC", you implicitly agree that you will not modify, adapt, disassemble, decompile, \r
+// reverse engineer, translate or otherwise attempt to discover the source code of the \r
+// "BlueRobin(TM) receiver library for the Texas Instruments CC430 SoC".\r
+//\r
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY \r
+// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF \r
+// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. \r
+//\r
+// IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, \r
+// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, \r
+// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS \r
+// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT \r
+// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF \r
+// THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+// \r
+// *************************************************************************************************\r
+// Standard definitions, have to be included in every source and header file.\r
+// *************************************************************************************************\r
+\r
+#ifndef __BM_H\r
+#define __BM_H\r
+\r
+\r
+#if (defined __IAR_SYSTEMS_ASM) || (defined __IAR_SYSTEMS_ASM__)\r
+  #define _ASSEMBLER_USED_\r
+#endif\r
+\r
+#ifndef _ASSEMBLER_USED_\r
+  #include <stddef.h>\r
+#endif\r
+\r
+#ifndef FALSE\r
+  // the classic false\r
+  #define FALSE (0 == 1)\r
+#endif\r
+\r
+#ifndef TRUE\r
+  // the classic true\r
+  #define TRUE  (1 == 1)\r
+#endif\r
+\r
+#ifndef USE_RAW_ATTR\r
+  // per default this feature is disabled\r
+  #define USE_RAW_ATTR FALSE\r
+#endif\r
+\r
+// *************************************************************************************************\r
+// First Section: Basic Data Types\r
+// *************************************************************************************************\r
+\r
+// Fundamental #definitions\r
+// CPU target idents are used for target dependent compilations\r
+\r
+// Texas Instruments MSP430\r
+#define _TI_MSP430_  (16)\r
+\r
+\r
+// Find the currently running compiler\r
+// and make the related #define's\r
+\r
+// _IAR_TID_                target ID from IAR compilers\r
+// _CPU_TID_                remap to enum of processor target numbers\r
+// _CPU_8BIT_INT_           type for 8 bit int\r
+// _CPU_16BIT_INT_          type for 16 bit int\r
+// _CPU_32BIT_INT_          type for 32 bit int\r
+// _CPU_32BIT_FLOAT_        type for 32 bit float\r
+// _CPU_64BIT_FLOAT_        type for 64 bit float\r
+// INTERRUPT                declares an interrupt service routine without an entry in the vector table\r
+// ISR(vector)              declares an interrupt service routine which is added in vector table at offset vector\r
+// MONITOR                  declares a function atomic\r
+// INTERRUPTS_ENABLE        remap to the intrinsic for enable interrupts\r
+// INTERRUPTS_DISABLE       remap to the intrinsic for disable interrupts\r
+// NO_OPERATION             remap to the intrinsic for no operation\r
+// _CPU_DIRECTION_OUT_1_    if TRUE the direction register indicates with an 1: direction is output\r
+// _CPU_EDGE_HIGH_LOW_1_    if TRUE the edge select register indicates with an 1: trigger on high low\r
+// NO_INIT                  declare a variable as not initialized\r
+// INLINE_FUNC              declare a function as inline for release builds\r
+\r
+\r
+#if ((defined __IAR_SYSTEMS_ICC) || (defined __IAR_SYSTEMS_ASM)) && (__IAR_SYSTEMS_ICC__ < 2)\r
+  // Found IAR Compiler with classic IAR frontend\r
+  #ifndef _IAR_TID_\r
+    #define _IAR_TID_ ((__TID__ >> 8) & 0x7f)\r
+  #endif\r
+\r
+  #define INTERRUPT   interrupt\r
+  #define ISR(vector) interrupt [(vector)]\r
+  #define MONITOR     monitor\r
+\r
+  #if ((_IAR_TID_) == 43)\r
+    // Found Texas Instruments MSP430 CPU\r
+    #define _CPU_TID_             _TI_MSP430_\r
+    #define _CPU_DIRECTION_OUT_1_ TRUE\r
+    #define _CPU_EDGE_HIGH_LOW_1_ TRUE\r
+    #define INTERRUPTS_ENABLE()   _EINT()\r
+    // WA for HW bug, add a NOP\r
+    #define INTERRUPTS_DISABLE()  { _DINT(); _NOP(); }\r
+    #define NO_OPERATION()        _NOP()\r
+\r
+  #else\r
+    #error "Unknown IAR Compiler, the file bm.h has to be expanded !"\r
+  #endif\r
+\r
+#elif defined __IAR_SYSTEMS_ICC__\r
+  // Found IAR Compiler with EDG frontend\r
+  #define _IAR_TID_ ((__TID__ >> 8) & 0x7f)\r
+\r
+  #if USE_RAW_ATTR == TRUE\r
+    // Use the raw attribute in ISR's\r
+    #define _RAW __raw\r
+  #else\r
+    // Empty define RAW as it is not used\r
+    #define _RAW\r
+  #endif\r
+  #define INTERRUPT   _RAW __interrupt\r
+  #define MONITOR     __monitor\r
+  #define NO_INIT     __no_init\r
+  #define INTERRUPTS_ENABLE()   __enable_interrupt()\r
+  #define INTERRUPTS_DISABLE()  __disable_interrupt()\r
+  #define NO_OPERATION()        __no_operation()\r
+\r
+  #ifndef DEBUG\r
+    // Force inlining of function in release builds\r
+    #define INLINE_FUNC PRAGMA(inline=forced)\r
+  #else\r
+    // Do not force inlining of function in debug builds\r
+    #define INLINE_FUNC\r
+  #endif\r
+\r
+  #if (!defined CODECHECK) && (!defined __DA_C__)\r
+    // Define to a new way of using #pragmas in preprocessor\r
+    #define PRAGMA(x) _Pragma(#x)\r
+    #define ISR(x) PRAGMA(vector = (x)) INTERRUPT\r
+  #endif\r
+\r
+  #if ((_IAR_TID_) == 43)\r
+    // Found Texas Instruments MSP430 CPU  (V2)\r
+    #define _CPU_TID_             _TI_MSP430_\r
+    #define _CPU_DIRECTION_OUT_1_ TRUE\r
+    #define _CPU_EDGE_HIGH_LOW_1_ TRUE\r
+    #define _CPU_64BIT_INT_       long long\r
+    #if __VER__ < 220\r
+      // WA for HW bug, add a nop after DINT, Compiler has a bugfix since version 2.20\r
+      #undef  INTERRUPTS_DISABLE\r
+      #define INTERRUPTS_DISABLE()  { __disable_interrupt(); __no_operation(); }\r
+    #endif\r
+\r
+  #else\r
+    #error "Unknown new IAR Compiler, the file bm.h has to be expanded !"\r
+  #endif\r
+\r
+\r
+#elif defined __CCE__\r
+  // Found CCE Compiler \r
+  #define INTERRUPT   __interrupt\r
+  #define MONITOR    // __monitor\r
+  #define NO_INIT     __no_init\r
+  #define INTERRUPTS_ENABLE()   __enable_interrupt()\r
+  #define INTERRUPTS_DISABLE()  __disable_interrupt()\r
+  #define NO_OPERATION()        __no_operation()\r
+\r
+  #ifndef DEBUG\r
+    // Force inlining of function in release builds\r
+    #define INLINE_FUNC PRAGMA(inline=forced)\r
+  #else\r
+    // Do not force inlining of function in debug builds\r
+    #define INLINE_FUNC\r
+  #endif\r
+\r
+       // Found Texas Instruments MSP430 CPU  (V2)\r
+       #define _CPU_TID_             _TI_MSP430_\r
+       #define _CPU_DIRECTION_OUT_1_ TRUE\r
+       #define _CPU_EDGE_HIGH_LOW_1_ TRUE\r
+       //#define _CPU_64BIT_INT_       long long\r
+\r
+//  #endif\r
+\r
+#else\r
+  #error "Unknown Compiler, the file bm.h has to be expanded !"\r
+#endif\r
+\r
+\r
+#ifndef _ASSEMBLER_USED_\r
+  // Get the limits to autodetect the size of integral types\r
+  #include <limits.h>\r
+  // Get floats to autodetect the size of float types\r
+  #include <float.h>\r
+\r
+  // ***********************************************************************************************\r
+  //\r
+  // Common basic data types\r
+  //\r
+  // ***********************************************************************************************\r
+  #if UCHAR_MAX == 0xFFu\r
+    #define _CPU_8BIT_INT_ char\r
+  #else\r
+    #error "unable to get size of u8 automatically"\r
+  #endif\r
+\r
+  #if USHRT_MAX == 0xFFFFu\r
+    #define _CPU_16BIT_INT_ short\r
+  #elif UINT_MAX == 0xFFFFu\r
+    #define _CPU_16BIT_INT_ int\r
+  #else\r
+    #error "unable to get size of u16 automatically"\r
+  #endif\r
+\r
+  #if USHRT_MAX == 0xFFFFFFFFu\r
+    #define _CPU_32BIT_INT_ short\r
+  #elif UINT_MAX == 0xFFFFFFFFu\r
+    #define _CPU_32BIT_INT_ int\r
+  #elif ULONG_MAX == 0xFFFFFFFFu\r
+    #define _CPU_32BIT_INT_ long\r
+  #else\r
+    #error "unable to get size of u32 automatically"\r
+  #endif\r
+\r
+  #ifdef __IAR_SYSTEMS_ICC__\r
+    #if __IAR_SYSTEMS_ICC__ > 1\r
+      #define _CPU_32BIT_FLOAT_ float\r
+      #if __DOUBLE_SIZE__ == 8\r
+        #define _CPU_64BIT_FLOAT_ double\r
+      #endif\r
+    #endif\r
+  #endif\r
+\r
+  #ifndef _CPU_32BIT_FLOAT_\r
+    #if FLT_MANT_DIG == 24\r
+      #define _CPU_32BIT_FLOAT_ float\r
+    #elif DBL_MANT_DIG == 24\r
+      #define _CPU_32BIT_FLOAT_ double\r
+    #else\r
+      #error "unable to get size of f32 automatically"\r
+    #endif\r
+\r
+    #if DBL_MANT_DIG == 53\r
+      #define _CPU_64BIT_FLOAT_ double\r
+    #endif\r
+  #endif\r
+\r
+\r
+  // ***********************************************************************************************\r
+  //\r
+  // Following lines #typedef the basic data types in a compiler independent way.\r
+  //\r
+  // ***********************************************************************************************\r
+\r
+  #ifdef _CPU_8BIT_INT_\r
+    // unsigned 8 bit\r
+    typedef unsigned _CPU_8BIT_INT_ u8 ;\r
+    // unsigned 8 bit max value\r
+    #define U8_MAX (0xFFU)\r
+    // signed 8 bit max value\r
+    typedef   signed _CPU_8BIT_INT_ s8 ;\r
+    // signed 8 bit min value\r
+    #define S8_MIN (-127 - 1)\r
+    // signed 8 bit max value\r
+    #define S8_MAX (127)\r
+  #endif\r
+\r
+  #ifdef _CPU_16BIT_INT_\r
+    // unsigned 16 bit\r
+    typedef unsigned _CPU_16BIT_INT_ u16 ;\r
+    // unsigned 16 bit max value\r
+    #define U16_MAX (0xFFFFU)\r
+    // signed 16 bit\r
+    typedef   signed _CPU_16BIT_INT_ s16 ;\r
+    // signed 16 bit min value\r
+    #define S16_MIN (-32767 - 1)\r
+    // signed 16 bit max value\r
+    #define S16_MAX (32767)\r
+  #endif\r
+\r
+  #ifdef _CPU_32BIT_INT_\r
+    // unsigned 32 bit\r
+    typedef unsigned _CPU_32BIT_INT_ u32 ;\r
+    // unsigned 32 bit max value\r
+    #define U32_MAX (0xFFFFFFFFUL)\r
+    // signed 32 bit\r
+    typedef   signed _CPU_32BIT_INT_ s32 ;\r
+    // signed 32 bit min value\r
+    #define S32_MIN (-2147483647L - 1L)\r
+    // signed 32 bit max value\r
+    #define S32_MAX (2147483647L)\r
+  #endif\r
+\r
+  #ifdef _CPU_64BIT_INT_\r
+    // unsigned 64 bit\r
+    typedef unsigned _CPU_64BIT_INT_ u64 ;\r
+    // signed 64 bit\r
+    typedef   signed _CPU_64BIT_INT_ s64 ;\r
+  #endif\r
+\r
+  #ifdef _CPU_32BIT_FLOAT_\r
+    // float 32 bit\r
+    typedef _CPU_32BIT_FLOAT_ f32 ;\r
+    // number of digits in mantissa of f32\r
+    #define F32_MANT_DIG   (24)\r
+    // epsilon for f32\r
+    #define F32_EPSILON    (1.192092896e-07)\r
+    // number of digits of precision of f32\r
+    #define F32_DIG        (6)\r
+    // exponent min of f32\r
+    #define F32_MIN_EXP    (-125)\r
+    // min positive value of f32\r
+    #define F32_MIN        (1.175494351e-38)\r
+    // decimal exponent min of f32\r
+    #define F32_MIN_10_EXP (-37)\r
+    // exponent max of f32\r
+    #define F32_MAX_EXP    (128)\r
+    // max value of f32\r
+    #define F32_MAX        (3.402823466e+38)\r
+    // decimal exponent max of f32\r
+    #define F32_MAX_10_EXP (38)\r
+  #endif\r
+\r
+  #ifdef _CPU_64BIT_FLOAT_\r
+    // float 64 bit\r
+    typedef _CPU_64BIT_FLOAT_ f64 ;\r
+    // number of digits in mantissa of f64\r
+    #define F64_MANT_DIG   (53)\r
+    // epsilon for f64\r
+    #define F64_EPSILON    (2.2204460492503131e-016)\r
+    // number of digits of precision of f64\r
+    #define F64_DIG        (15)\r
+    // exponent min of f64\r
+    #define F64_MIN_EXP    (-1021)\r
+    // min positive value of f64\r
+    #define F64_MIN        (2.2250738585072014e-308)\r
+    // decimal exponent min of f64\r
+    #define F64_MIN_10_EXP (-307)\r
+    // exponent max of f64\r
+    #define F64_MAX_EXP    (1024)\r
+    // max value of f64\r
+    #define F64_MAX        (1.7976931348623158e+308)\r
+    // decimal exponent max of f64\r
+    #define F64_MAX_10_EXP (308)\r
+  #endif\r
+    \r
+  typedef unsigned char BYTE;\r
+  typedef unsigned int  WORD;\r
+  typedef unsigned long DWORD;\r
+    \r
+#endif // _ASSMEBLER_USED_\r
+\r
+// A macro that calculates the number of bits of a given type\r
+#ifndef BITSIZEOF\r
+#define BITSIZEOF(type) (sizeof(type) * CHAR_BIT)\r
+#endif\r
+\r
+/* A macro that generates a bit mask according to a given bit number.\r
+ * Example:\r
+ * - BIT(0) expands to 1 (== 0x01)\r
+ * - BIT(3) expands to 8 (== 0x08)\r
+ */\r
+#define BIT(x) (1uL << (x))\r
+\r
+/* A macro that generates a bit mask according to a given bit number with a cast to type.\r
+ * The difference to BIT(X) is the additional type argument T that is used to cast the type of the\r
+ * constant 1 and the type of the result as well.\r
+ * Example:\r
+ * - BIT_T(u8,0)  expands to (u8)1  (== 0x01)\r
+ * - BIT_T(u32,3) expands to (u32)8 (== 0x08L)\r
+ */\r
+#define BIT_T(t, x) ((t)((t)1 << (x)))\r
+\r
+/* A macro to calculate the position of the highest bit.\r
+ * The result is same as LOG2 in case only one bit is set. Use with constant values only because\r
+ * of code size.\r
+ */\r
+#define BIT_HIGHEST(Input_u32) (     \\r
+  ( (Input_u32) & BIT(31) ) ? 31 : ( \\r
+  ( (Input_u32) & BIT(30) ) ? 30 : ( \\r
+  ( (Input_u32) & BIT(29) ) ? 29 : ( \\r
+  ( (Input_u32) & BIT(28) ) ? 28 : ( \\r
+  ( (Input_u32) & BIT(27) ) ? 27 : ( \\r
+  ( (Input_u32) & BIT(26) ) ? 26 : ( \\r
+  ( (Input_u32) & BIT(25) ) ? 25 : ( \\r
+  ( (Input_u32) & BIT(24) ) ? 24 : ( \\r
+  ( (Input_u32) & BIT(23) ) ? 23 : ( \\r
+  ( (Input_u32) & BIT(22) ) ? 22 : ( \\r
+  ( (Input_u32) & BIT(21) ) ? 21 : ( \\r
+  ( (Input_u32) & BIT(20) ) ? 20 : ( \\r
+  ( (Input_u32) & BIT(19) ) ? 19 : ( \\r
+  ( (Input_u32) & BIT(18) ) ? 18 : ( \\r
+  ( (Input_u32) & BIT(17) ) ? 17 : ( \\r
+  ( (Input_u32) & BIT(16) ) ? 16 : ( \\r
+  ( (Input_u32) & BIT(15) ) ? 15 : ( \\r
+  ( (Input_u32) & BIT(14) ) ? 14 : ( \\r
+  ( (Input_u32) & BIT(13) ) ? 13 : ( \\r
+  ( (Input_u32) & BIT(12) ) ? 12 : ( \\r
+  ( (Input_u32) & BIT(11) ) ? 11 : ( \\r
+  ( (Input_u32) & BIT(10) ) ? 10 : ( \\r
+  ( (Input_u32) & BIT( 9) ) ?  9 : ( \\r
+  ( (Input_u32) & BIT( 8) ) ?  8 : ( \\r
+  ( (Input_u32) & BIT( 7) ) ?  7 : ( \\r
+  ( (Input_u32) & BIT( 6) ) ?  6 : ( \\r
+  ( (Input_u32) & BIT( 5) ) ?  5 : ( \\r
+  ( (Input_u32) & BIT( 4) ) ?  4 : ( \\r
+  ( (Input_u32) & BIT( 3) ) ?  3 : ( \\r
+  ( (Input_u32) & BIT( 2) ) ?  2 : ( \\r
+  ( (Input_u32) & BIT( 1) ) ?  1 : ( \\r
+  ( (Input_u32) & BIT( 0) ) ?  0 :  -1uL ))))))))))))))))))))))))))))))))\r
+\r
+\r
+#ifndef MONITOR\r
+  #define MONITOR\r
+#endif\r
+\r
+#ifndef NO_INIT\r
+  #define NO_INIT\r
+#endif\r
+\r
+#ifndef INTERRUPT\r
+  #define INTERRUPT\r
+#endif\r
+\r
+#ifndef ISR\r
+  #define ISR(ignore)\r
+#endif\r
+\r
+#ifndef INLINE_FUNC\r
+  #define INLINE_FUNC\r
+#endif\r
+\r
+#ifndef INTERRUPTS_ENABLE\r
+  #define INTERRUPTS_ENABLE()\r
+#endif\r
+\r
+#ifndef INTERRUPTS_DISABLE\r
+  #define INTERRUPTS_DISABLE()\r
+#endif\r
+\r
+\r
+#endif // __BM_H\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/change_record.txt b/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/change_record.txt
new file mode 100755 (executable)
index 0000000..83d239d
--- /dev/null
@@ -0,0 +1,35 @@
+V1.6 (21.11.2010)\r
+Fixed following bugs\r
+- rfsimpliciti.c/simpliciti_sync_decode_ap_cmd_callback(),\r
+- timer.c/TIMER0_A0_ISR()                                      LCD shows "done" after successfully received data                                                       \r
+- main.c/wakeup_event(),       \r
+- rfbsl.c/sx_rfbsl()                                           rfBSL requires two button presses in order to update watch \r
+- timer.c/Timer0_A3_Start()                                    Fixed register read (Asynchronous)\r
+- timer.c/Timer0_A4_Delay()                                    Fixed register read (Asynchronous)\r
+                                                               Avoid unwanted flag changes caused by interrupt methods\r
+- port.c/PORT2_ISR() and timer.c/TIMER0_A0_ISR()               Changes the menu if the pressed time from STAR or NUM button are between "short(50ms)" and "long(3s)" \r
+                                                                                                       The backlight stays 3 seconds on\r
+- display.c                                                    Removed file display1.c. The content is now in display.c \r
+- display.h                                                    Fixed LCD_UNIT_L1_PER_S_MASK bit                \r
+                                                                                       \r
+Other changes:\r
+- DCO settling time                                            Set to 375000 cycles\r
\r
+__________________________________________________________________________________________________________________________________________________\r
+V1.5 (16.03.2010)\r
+Fixed following bugs\r
+- main.c/init_application()                                    Changed XT1 drive level to highest to avoid ACLK noise when turning on backlight.\r
+- main.c/wakeup_event(), timer.c/TIMER0_A0_ISR()               Modified key lock procedure.\r
+- vti_ps.c/ps_get_temp()                                       Negative °C are now converted correctly to Kelvin\r
+\r
+Other changes\r
+- main.c/read_calibration_values()                             Added range check for rf_frequoffset variable\r
+                                                               Added bytes for altitude offset correction and s/w version\r
+- altitude.h, altitude.c                                       Added initial altitude offset correction \r
+- SimpliciTI                                                   Added SimpliciTI sources to project. Upgraded to Version 1.1.1.\r
+- RFBSL                                                                Added wireless update support\r
+- Button names                                                 Changed button names from M1/M2/S1/S2/BL to STAR/NUM/UP/DOWN/BACKLIGHT\r
+\r
+__________________________________________________________________________________________________________________________________________________                                                                                                     \r
+V1.4 (22.11.2009)\r
+First version released to manufacturing.
\ No newline at end of file
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/driver/adc12.c b/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/driver/adc12.c
new file mode 100755 (executable)
index 0000000..07f13cc
--- /dev/null
@@ -0,0 +1,164 @@
+// *************************************************************************************************\r
+//\r
+//      Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//        Redistribution and use in source and binary forms, with or without\r
+//        modification, are permitted provided that the following conditions\r
+//        are met:\r
+//\r
+//          Redistributions of source code must retain the above copyright\r
+//          notice, this list of conditions and the following disclaimer.\r
+//\r
+//          Redistributions in binary form must reproduce the above copyright\r
+//          notice, this list of conditions and the following disclaimer in the\r
+//          documentation and/or other materials provided with the\r
+//          distribution.\r
+//\r
+//          Neither the name of Texas Instruments Incorporated nor the names of\r
+//          its contributors may be used to endorse or promote products derived\r
+//          from this software without specific prior written permission.\r
+//\r
+//        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+// ADC12 functions.\r
+// *************************************************************************************************\r
+\r
+// *************************************************************************************************\r
+// Include section\r
+\r
+// system\r
+#include <project.h>\r
+\r
+// driver\r
+#include "adc12.h"\r
+#include "timer.h"\r
+\r
+// *************************************************************************************************\r
+// Prototypes section\r
+\r
+// *************************************************************************************************\r
+// Defines section\r
+\r
+// *************************************************************************************************\r
+// Global Variable section\r
+u16 adc12_result;\r
+u8 adc12_data_ready;\r
+\r
+// *************************************************************************************************\r
+// Extern section\r
+\r
+// *************************************************************************************************\r
+// @fn          adc12_single_conversion\r
+// @brief       Init ADC12.      Do single conversion. Turn off ADC12.\r
+// @param       u16 ref                  Select reference\r
+//                              u16 sht          Sample-and-hold time\r
+//                              u16 channel      Channel of the conversion\r
+// @return      u16 adc12_result Return ADC result\r
+// *************************************************************************************************\r
+u16 adc12_single_conversion(u16 ref, u16 sht, u16 channel)\r
+{\r
+    // Initialize the shared reference module\r
+    REFCTL0 |= REFMSTR + ref + REFON;   // Enable internal reference (1.5V or 2.5V)\r
+\r
+    // Initialize ADC12_A\r
+    ADC12CTL0 = sht + ADC12ON;          // Set sample time\r
+    ADC12CTL1 = ADC12SHP;               // Enable sample timer\r
+    ADC12MCTL0 = ADC12SREF_1 + channel; // ADC input channel\r
+    ADC12IE = 0x001;                    // ADC_IFG upon conv result-ADCMEMO\r
+\r
+    // Wait 2 ticks (66us) to allow internal reference to settle\r
+    Timer0_A4_Delay(2);\r
+\r
+    // Start ADC12\r
+    ADC12CTL0 |= ADC12ENC;\r
+\r
+    // Clear data ready flag\r
+    adc12_data_ready = 0;\r
+\r
+    // Sampling and conversion start\r
+    ADC12CTL0 |= ADC12SC;\r
+\r
+    // Delay to get next ADC value\r
+    Timer0_A4_Delay(5);\r
+    while (!adc12_data_ready) ;\r
+\r
+    // Shut down ADC12\r
+    ADC12CTL0 &= ~(ADC12ENC | ADC12SC | sht);\r
+    ADC12CTL0 &= ~ADC12ON;\r
+\r
+    // Shut down reference voltage\r
+    REFCTL0 &= ~(REFMSTR + ref + REFON);\r
+\r
+    ADC12IE = 0;\r
+\r
+    // Return ADC result\r
+    return (adc12_result);\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          ADC12ISR\r
+// @brief       Store ADC12 conversion result. Set flag to indicate data ready.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+#pragma vector=ADC12_VECTOR\r
+__interrupt void ADC12ISR(void)\r
+{\r
+    switch (__even_in_range(ADC12IV, 34))\r
+    {\r
+        case 0:\r
+            break;                    // Vector  0:  No interrupt\r
+        case 2:\r
+            break;                    // Vector  2:  ADC overflow\r
+        case 4:\r
+            break;                    // Vector  4:  ADC timing overflow\r
+        case 6:                       // Vector  6:  ADC12IFG0\r
+            adc12_result = ADC12MEM0; // Move results, IFG is cleared\r
+            adc12_data_ready = 1;\r
+            _BIC_SR_IRQ(LPM3_bits);   // Exit active CPU\r
+            break;\r
+        case 8:\r
+            break;                    // Vector  8:  ADC12IFG1\r
+        case 10:\r
+            break;                    // Vector 10:  ADC12IFG2\r
+        case 12:\r
+            break;                    // Vector 12:  ADC12IFG3\r
+        case 14:\r
+            break;                    // Vector 14:  ADC12IFG4\r
+        case 16:\r
+            break;                    // Vector 16:  ADC12IFG5\r
+        case 18:\r
+            break;                    // Vector 18:  ADC12IFG6\r
+        case 20:\r
+            break;                    // Vector 20:  ADC12IFG7\r
+        case 22:\r
+            break;                    // Vector 22:  ADC12IFG8\r
+        case 24:\r
+            break;                    // Vector 24:  ADC12IFG9\r
+        case 26:\r
+            break;                    // Vector 26:  ADC12IFG10\r
+        case 28:\r
+            break;                    // Vector 28:  ADC12IFG11\r
+        case 30:\r
+            break;                    // Vector 30:  ADC12IFG12\r
+        case 32:\r
+            break;                    // Vector 32:  ADC12IFG13\r
+        case 34:\r
+            break;                    // Vector 34:  ADC12IFG14\r
+        default:\r
+            break;\r
+    }\r
+}\r
+\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/driver/adc12.h b/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/driver/adc12.h
new file mode 100755 (executable)
index 0000000..90fc327
--- /dev/null
@@ -0,0 +1,57 @@
+// *************************************************************************************************\r
+//\r
+//      Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//        Redistribution and use in source and binary forms, with or without\r
+//        modification, are permitted provided that the following conditions\r
+//        are met:\r
+//\r
+//          Redistributions of source code must retain the above copyright\r
+//          notice, this list of conditions and the following disclaimer.\r
+//\r
+//          Redistributions in binary form must reproduce the above copyright\r
+//          notice, this list of conditions and the following disclaimer in the\r
+//          documentation and/or other materials provided with the\r
+//          distribution.\r
+//\r
+//          Neither the name of Texas Instruments Incorporated nor the names of\r
+//          its contributors may be used to endorse or promote products derived\r
+//          from this software without specific prior written permission.\r
+//\r
+//        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+\r
+#ifndef ADC12_H_\r
+#define ADC12_H_\r
+\r
+// *************************************************************************************************\r
+// Include section\r
+\r
+// *************************************************************************************************\r
+// Prototypes section\r
+extern u16 adc12_single_conversion(u16 ref, u16 sht, u16 channel);\r
+\r
+// *************************************************************************************************\r
+// Defines section\r
+\r
+// *************************************************************************************************\r
+// Global Variable section\r
+extern u16 adc12_result;\r
+extern u8 adc12_data_ready;\r
+\r
+// *************************************************************************************************\r
+// Extern section\r
+\r
+#endif                          /*ADC12_H_ */\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/driver/buzzer.c b/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/driver/buzzer.c
new file mode 100755 (executable)
index 0000000..ec5df8b
--- /dev/null
@@ -0,0 +1,220 @@
+// *************************************************************************************************\r
+//\r
+//      Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//        Redistribution and use in source and binary forms, with or without\r
+//        modification, are permitted provided that the following conditions\r
+//        are met:\r
+//\r
+//          Redistributions of source code must retain the above copyright\r
+//          notice, this list of conditions and the following disclaimer.\r
+//\r
+//          Redistributions in binary form must reproduce the above copyright\r
+//          notice, this list of conditions and the following disclaimer in the\r
+//          documentation and/or other materials provided with the\r
+//          distribution.\r
+//\r
+//          Neither the name of Texas Instruments Incorporated nor the names of\r
+//          its contributors may be used to endorse or promote products derived\r
+//          from this software without specific prior written permission.\r
+//\r
+//        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+// Buzzer functions.\r
+// *************************************************************************************************\r
+\r
+// *************************************************************************************************\r
+// Include section\r
+\r
+// system\r
+#include "project.h"\r
+\r
+// driver\r
+#include "buzzer.h"\r
+#include "timer.h"\r
+#include "display.h"\r
+\r
+// logic\r
+\r
+// *************************************************************************************************\r
+// Prototypes section\r
+void toggle_buzzer(void);\r
+void countdown_buzzer(void);\r
+\r
+// *************************************************************************************************\r
+// Defines section\r
+\r
+// *************************************************************************************************\r
+// Global Variable section\r
+struct buzzer sBuzzer;\r
+\r
+// *************************************************************************************************\r
+// Extern section\r
+//extern u16 timer0_A3_ticks_g;\r
+\r
+// *************************************************************************************************\r
+// @fn          reset_buzzer\r
+// @brief       Init buzzer variables\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void reset_buzzer(void)\r
+{\r
+    sBuzzer.time = 0;\r
+    sBuzzer.state = BUZZER_OFF;\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          start_buzzer\r
+// @brief       Start buzzer output for a number of cylces\r
+// @param       u8 cycles               Keep buzzer output for number of cycles\r
+//                              u16 on_time     Output buzzer for "on_time" ACLK ticks\r
+//                              u16 off_time    Do not output buzzer for "off_time" ACLK ticks\r
+// @return      none\r
+// *************************************************************************************************\r
+void start_buzzer(u8 cycles, u16 on_time, u16 off_time)\r
+{\r
+    // Store new buzzer duration while buzzer is off\r
+    if (sBuzzer.time == 0)\r
+    {\r
+        sBuzzer.time = cycles;\r
+        sBuzzer.on_time = on_time;\r
+        sBuzzer.off_time = off_time;\r
+\r
+        // Need to init every time, because SimpliciTI claims same timer\r
+\r
+        // Reset TA1R, set up mode, TA1 runs from 32768Hz ACLK\r
+        TA1CTL = TACLR | MC_1 | TASSEL__ACLK;\r
+\r
+        // Set PWM frequency\r
+        TA1CCR0 = BUZZER_TIMER_STEPS;\r
+\r
+        // Enable IRQ, set output mode "toggle"\r
+        TA1CCTL0 = OUTMOD_4;\r
+\r
+        // Allow buzzer PWM output on P2.7\r
+        P2SEL |= BIT7;\r
+\r
+        // Activate Timer0_A3 periodic interrupts\r
+        fptr_Timer0_A3_function = toggle_buzzer;\r
+        Timer0_A3_Start(sBuzzer.on_time);\r
+\r
+        // Preload timer advance variable\r
+        sTimer.timer0_A3_ticks = sBuzzer.off_time;\r
+\r
+        // Start with buzzer output on\r
+        sBuzzer.state = BUZZER_ON_OUTPUT_ENABLED;\r
+    }\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          toggle_buzzer\r
+// @brief       Keeps track of buzzer on/off duty cycle\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void toggle_buzzer(void)\r
+{\r
+    // Turn off buzzer\r
+    if (sBuzzer.state == BUZZER_ON_OUTPUT_ENABLED)\r
+    {\r
+        // Stop PWM timer\r
+        TA1CTL &= ~(BIT4 | BIT5);\r
+\r
+        // Reset and disable buzzer PWM output\r
+        P2OUT &= ~BIT7;\r
+        P2SEL &= ~BIT7;\r
+\r
+        // Update buzzer state\r
+        sBuzzer.state = BUZZER_ON_OUTPUT_DISABLED;\r
+\r
+        // Reload Timer0_A4 IRQ to restart output\r
+        sTimer.timer0_A3_ticks = sBuzzer.on_time;\r
+    }\r
+    else                        // Turn on buzzer\r
+    {\r
+        // Decrement buzzer total cycles\r
+        countdown_buzzer();\r
+\r
+        // Reload Timer0_A4 to stop output if sBuzzer.time > 0\r
+        if (sBuzzer.state != BUZZER_OFF)\r
+        {\r
+            // Reset timer TA1\r
+            TA1R = 0;\r
+            TA1CTL |= MC_1;\r
+\r
+            // Enable buzzer PWM output\r
+            P2SEL |= BIT7;\r
+\r
+            // Update buzzer state\r
+            sBuzzer.state = BUZZER_ON_OUTPUT_ENABLED;\r
+\r
+            // Reload Timer0_A4 IRQ to turn off output\r
+            sTimer.timer0_A3_ticks = sBuzzer.off_time;\r
+        }\r
+    }\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          stop_buzzer\r
+// @brief       Stop buzzer output\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void stop_buzzer(void)\r
+{\r
+    // Stop PWM timer\r
+    TA1CTL &= ~(BIT4 | BIT5);\r
+\r
+    // Disable buzzer PWM output\r
+    P2OUT &= ~BIT7;\r
+    P2SEL &= ~BIT7;\r
+\r
+    // Clear PWM timer interrupt\r
+    TA1CCTL0 &= ~CCIE;\r
+\r
+    // Disable periodic start/stop interrupts\r
+    Timer0_A3_Stop();\r
+\r
+    // Clear variables\r
+    reset_buzzer();\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          is_buzzer\r
+// @brief       Check if buzzer is operating\r
+// @param       none\r
+// @return      u8              1 = Buzzer is operating, 0 = Buzzer is off\r
+// *************************************************************************************************\r
+u8 is_buzzer(void)\r
+{\r
+    return (sBuzzer.state != BUZZER_OFF);\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          countdown_buzzer\r
+// @brief       Decrement active buzzer time. Turn off buzzer if cycle end reached.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void countdown_buzzer(void)\r
+{\r
+    // Stop buzzer when reaching 0 cycles\r
+    if (--sBuzzer.time == 0)\r
+    {\r
+        stop_buzzer();\r
+    }\r
+}\r
+\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/driver/buzzer.h b/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/driver/buzzer.h
new file mode 100755 (executable)
index 0000000..59fbba9
--- /dev/null
@@ -0,0 +1,87 @@
+// *************************************************************************************************\r
+//\r
+//      Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//        Redistribution and use in source and binary forms, with or without\r
+//        modification, are permitted provided that the following conditions\r
+//        are met:\r
+//\r
+//          Redistributions of source code must retain the above copyright\r
+//          notice, this list of conditions and the following disclaimer.\r
+//\r
+//          Redistributions in binary form must reproduce the above copyright\r
+//          notice, this list of conditions and the following disclaimer in the\r
+//          documentation and/or other materials provided with the\r
+//          distribution.\r
+//\r
+//          Neither the name of Texas Instruments Incorporated nor the names of\r
+//          its contributors may be used to endorse or promote products derived\r
+//          from this software without specific prior written permission.\r
+//\r
+//        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+\r
+#ifndef BUZZER_H_\r
+#define BUZZER_H_\r
+\r
+// *************************************************************************************************\r
+// Include section\r
+\r
+// *************************************************************************************************\r
+// Prototypes section\r
+extern void reset_buzzer(void);\r
+extern void start_buzzer(u8 cycles, u16 on_time, u16 off_time);\r
+extern void stop_buzzer(void);\r
+extern void toggle_buzzer(void);\r
+extern u8 is_buzzer(void);\r
+extern void countdown_buzzer(void);\r
+\r
+// *************************************************************************************************\r
+// Defines section\r
+\r
+// Buzzer states\r
+#define BUZZER_OFF                                                      (0u)\r
+#define BUZZER_ON_OUTPUT_DISABLED                       (1u)\r
+#define BUZZER_ON_OUTPUT_ENABLED                        (2u)\r
+\r
+// Buzzer output signal frequency = 32,768kHz/(BUZZER_TIMER_STEPS+1)/2 = 2.7kHz\r
+#define BUZZER_TIMER_STEPS                                      (5u)\r
+\r
+// Buzzer on time\r
+#define BUZZER_ON_TICKS                                         (CONV_MS_TO_TICKS(20))\r
+\r
+// Buzzer off time\r
+#define BUZZER_OFF_TICKS                                        (CONV_MS_TO_TICKS(200))\r
+\r
+// *************************************************************************************************\r
+// Global Variable section\r
+struct buzzer\r
+{\r
+    // Keep output for "time" seconds\r
+    u8 time;\r
+\r
+    // On/off duty\r
+    u16 on_time;\r
+    u16 off_time;\r
+\r
+    // Current buzzer output state\r
+    u8 state;\r
+};\r
+extern struct buzzer sBuzzer;\r
+\r
+// *************************************************************************************************\r
+// Extern section\r
+\r
+#endif                          /*BUZZER_H_ */\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/driver/display.c b/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/driver/display.c
new file mode 100755 (executable)
index 0000000..c249f04
--- /dev/null
@@ -0,0 +1,759 @@
+// *************************************************************************************************\r
+//\r
+//      Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//        Redistribution and use in source and binary forms, with or without\r
+//        modification, are permitted provided that the following conditions\r
+//        are met:\r
+//\r
+//          Redistributions of source code must retain the above copyright\r
+//          notice, this list of conditions and the following disclaimer.\r
+//\r
+//          Redistributions in binary form must reproduce the above copyright\r
+//          notice, this list of conditions and the following disclaimer in the\r
+//          documentation and/or other materials provided with the\r
+//          distribution.\r
+//\r
+//          Neither the name of Texas Instruments Incorporated nor the names of\r
+//          its contributors may be used to endorse or promote products derived\r
+//          from this software without specific prior written permission.\r
+//\r
+//        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+// Display functions.\r
+// *************************************************************************************************\r
+\r
+// *************************************************************************************************\r
+// Include section\r
+\r
+// system\r
+#include <project.h>\r
+#include <string.h>\r
+\r
+// driver\r
+#include "display.h"\r
+\r
+// logic\r
+#include "clock.h"\r
+#include "user.h"\r
+#include "date.h"\r
+#include "temperature.h"\r
+\r
+// *************************************************************************************************\r
+// Prototypes section\r
+void write_lcd_mem(u8 * lcdmem, u8 bits, u8 bitmask, u8 state);\r
+void clear_line(u8 line);\r
+void display_symbol(u8 symbol, u8 mode);\r
+void display_char(u8 segment, u8 chr, u8 mode);\r
+void display_chars(u8 segments, u8 * str, u8 mode);\r
+\r
+// *************************************************************************************************\r
+// Defines section\r
+\r
+// *************************************************************************************************\r
+// Global Variable section\r
+\r
+// Table with memory bit assignment for digits "0" to "9" and characters "A" to "Z"\r
+const u8 lcd_font[] = {\r
+    SEG_A + SEG_B + SEG_C + SEG_D + SEG_E + SEG_F,         // Displays "0"\r
+    SEG_B + SEG_C,                                         // Displays "1"\r
+    SEG_A + SEG_B + SEG_D + SEG_E + SEG_G,                 // Displays "2"\r
+    SEG_A + SEG_B + SEG_C + SEG_D + SEG_G,                 // Displays "3"\r
+    SEG_B + SEG_C + SEG_F + SEG_G,                         // Displays "4"\r
+    SEG_A + SEG_C + SEG_D + SEG_F + SEG_G,                 // Displays "5"\r
+    SEG_A + SEG_C + SEG_D + SEG_E + SEG_F + SEG_G,         // Displays "6"\r
+    SEG_A + SEG_B + SEG_C,                                 // Displays "7"\r
+    SEG_A + SEG_B + SEG_C + SEG_D + SEG_E + SEG_F + SEG_G, // Displays "8"\r
+    SEG_A + SEG_B + SEG_C + SEG_D + SEG_F + SEG_G,         // Displays "9"\r
+    0,                                                     // Displays " "\r
+    0,                                                     // Displays " "\r
+    0,                                                     // Displays " "\r
+    0,                                                     // Displays " "\r
+    0,                                                     // Displays " "\r
+    SEG_D + SEG_E + SEG_G,                                 // Displays "c"\r
+    0,                                                     // Displays " "\r
+    SEG_A + SEG_B + SEG_C + SEG_E + SEG_F + SEG_G,         // Displays "A"\r
+    SEG_C + SEG_D + SEG_E + SEG_F + SEG_G,                 // Displays "b"\r
+    SEG_A + SEG_D + SEG_E + SEG_F,                         // Displays "C"\r
+    SEG_B + SEG_C + SEG_D + SEG_E + SEG_G,                 // Displays "d"\r
+    SEG_A + +SEG_D + SEG_E + SEG_F + SEG_G,                // Displays "E"\r
+    SEG_A + SEG_E + SEG_F + SEG_G,                         // Displays "F"\r
+    //  SEG_A+      SEG_C+SEG_D+SEG_E+SEG_F+SEG_G,       // Displays "G"\r
+    SEG_A + SEG_B + SEG_C + SEG_D + SEG_F + SEG_G,         // Displays "g"\r
+    SEG_B + SEG_C + SEG_E + SEG_F + SEG_G,                 // Displays "H"\r
+    SEG_E + SEG_F,                                         // Displays "I"\r
+    SEG_A + SEG_B + SEG_C + SEG_D,                         // Displays "J"\r
+    //              SEG_B+SEG_C+      SEG_E+SEG_F+SEG_G, // Displays "k"\r
+    SEG_D + SEG_E + SEG_F + SEG_G,                         // Displays "k"\r
+    SEG_D + SEG_E + SEG_F,                                 // Displays "L"\r
+    SEG_A + SEG_B + SEG_C + SEG_E + SEG_F,                 // Displays "M"\r
+    SEG_C + SEG_E + SEG_G,                                 // Displays "n"\r
+    SEG_C + SEG_D + SEG_E + SEG_G,                         // Displays "o"\r
+    SEG_A + SEG_B + SEG_E + SEG_F + SEG_G,                 // Displays "P"\r
+    SEG_A + SEG_B + SEG_C + SEG_D + SEG_E + SEG_F,         // Displays "Q"\r
+    SEG_E + SEG_G,                                         // Displays "r"\r
+    SEG_A + SEG_C + SEG_D + SEG_F + SEG_G,                 // Displays "S"\r
+    SEG_D + SEG_E + SEG_F + SEG_G,                         // Displays "t"\r
+    SEG_C + SEG_D + SEG_E,                                 // Displays "u"\r
+    SEG_C + SEG_D + SEG_E,                                 // Displays "u"\r
+    SEG_G,                                                 // Displays "-"\r
+    SEG_B + SEG_C + +SEG_E + SEG_F + SEG_G,                // Displays "X"\r
+    SEG_B + SEG_C + SEG_D + SEG_F + SEG_G,                 // Displays "Y"\r
+    SEG_A + SEG_B + SEG_D + SEG_E + SEG_G,                 // Displays "Z"\r
+};\r
+\r
+// Table with memory address for each display element\r
+const u8 *segments_lcdmem[] = {\r
+    LCD_SYMB_AM_MEM,\r
+    LCD_SYMB_PM_MEM,\r
+    LCD_SYMB_ARROW_UP_MEM,\r
+    LCD_SYMB_ARROW_DOWN_MEM,\r
+    LCD_SYMB_PERCENT_MEM,\r
+    LCD_SYMB_TOTAL_MEM,\r
+    LCD_SYMB_AVERAGE_MEM,\r
+    LCD_SYMB_MAX_MEM,\r
+    LCD_SYMB_BATTERY_MEM,\r
+    LCD_UNIT_L1_FT_MEM,\r
+    LCD_UNIT_L1_K_MEM,\r
+    LCD_UNIT_L1_M_MEM,\r
+    LCD_UNIT_L1_I_MEM,\r
+    LCD_UNIT_L1_PER_S_MEM,\r
+    LCD_UNIT_L1_PER_H_MEM,\r
+    LCD_UNIT_L1_DEGREE_MEM,\r
+    LCD_UNIT_L2_KCAL_MEM,\r
+    LCD_UNIT_L2_KM_MEM,\r
+    LCD_UNIT_L2_MI_MEM,\r
+    LCD_ICON_HEART_MEM,\r
+    LCD_ICON_STOPWATCH_MEM,\r
+    LCD_ICON_RECORD_MEM,\r
+    LCD_ICON_ALARM_MEM,\r
+    LCD_ICON_BEEPER1_MEM,\r
+    LCD_ICON_BEEPER2_MEM,\r
+    LCD_ICON_BEEPER3_MEM,\r
+    LCD_SEG_L1_3_MEM,\r
+    LCD_SEG_L1_2_MEM,\r
+    LCD_SEG_L1_1_MEM,\r
+    LCD_SEG_L1_0_MEM,\r
+    LCD_SEG_L1_COL_MEM,\r
+    LCD_SEG_L1_DP1_MEM,\r
+    LCD_SEG_L1_DP0_MEM,\r
+    LCD_SEG_L2_5_MEM,\r
+    LCD_SEG_L2_4_MEM,\r
+    LCD_SEG_L2_3_MEM,\r
+    LCD_SEG_L2_2_MEM,\r
+    LCD_SEG_L2_1_MEM,\r
+    LCD_SEG_L2_0_MEM,\r
+    LCD_SEG_L2_COL1_MEM,\r
+    LCD_SEG_L2_COL0_MEM,\r
+    LCD_SEG_L2_DP_MEM,\r
+};\r
+\r
+// Table with bit mask for each display element\r
+const u8 segments_bitmask[] = {\r
+    LCD_SYMB_AM_MASK,\r
+    LCD_SYMB_PM_MASK,\r
+    LCD_SYMB_ARROW_UP_MASK,\r
+    LCD_SYMB_ARROW_DOWN_MASK,\r
+    LCD_SYMB_PERCENT_MASK,\r
+    LCD_SYMB_TOTAL_MASK,\r
+    LCD_SYMB_AVERAGE_MASK,\r
+    LCD_SYMB_MAX_MASK,\r
+    LCD_SYMB_BATTERY_MASK,\r
+    LCD_UNIT_L1_FT_MASK,\r
+    LCD_UNIT_L1_K_MASK,\r
+    LCD_UNIT_L1_M_MASK,\r
+    LCD_UNIT_L1_I_MASK,\r
+    LCD_UNIT_L1_PER_S_MASK,\r
+    LCD_UNIT_L1_PER_H_MASK,\r
+    LCD_UNIT_L1_DEGREE_MASK,\r
+    LCD_UNIT_L2_KCAL_MASK,\r
+    LCD_UNIT_L2_KM_MASK,\r
+    LCD_UNIT_L2_MI_MASK,\r
+    LCD_ICON_HEART_MASK,\r
+    LCD_ICON_STOPWATCH_MASK,\r
+    LCD_ICON_RECORD_MASK,\r
+    LCD_ICON_ALARM_MASK,\r
+    LCD_ICON_BEEPER1_MASK,\r
+    LCD_ICON_BEEPER2_MASK,\r
+    LCD_ICON_BEEPER3_MASK,\r
+    LCD_SEG_L1_3_MASK,\r
+    LCD_SEG_L1_2_MASK,\r
+    LCD_SEG_L1_1_MASK,\r
+    LCD_SEG_L1_0_MASK,\r
+    LCD_SEG_L1_COL_MASK,\r
+    LCD_SEG_L1_DP1_MASK,\r
+    LCD_SEG_L1_DP0_MASK,\r
+    LCD_SEG_L2_5_MASK,\r
+    LCD_SEG_L2_4_MASK,\r
+    LCD_SEG_L2_3_MASK,\r
+    LCD_SEG_L2_2_MASK,\r
+    LCD_SEG_L2_1_MASK,\r
+    LCD_SEG_L2_0_MASK,\r
+    LCD_SEG_L2_COL1_MASK,\r
+    LCD_SEG_L2_COL0_MASK,\r
+    LCD_SEG_L2_DP_MASK,\r
+};\r
+\r
+// Quick integer to array conversion table for most common integer values\r
+const u8 int_to_array_conversion_table[][3] = {\r
+    "000", "001", "002", "003", "004", "005", "006", "007", "008", "009", "010", "011", "012",\r
+    "013", "014", "015",\r
+    "016", "017", "018", "019", "020", "021", "022", "023", "024", "025", "026", "027", "028",\r
+    "029", "030", "031",\r
+    "032", "033", "034", "035", "036", "037", "038", "039", "040", "041", "042", "043", "044",\r
+    "045", "046", "047",\r
+    "048", "049", "050", "051", "052", "053", "054", "055", "056", "057", "058", "059", "060",\r
+    "061", "062", "063",\r
+    "064", "065", "066", "067", "068", "069", "070", "071", "072", "073", "074", "075", "076",\r
+    "077", "078", "079",\r
+    "080", "081", "082", "083", "084", "085", "086", "087", "088", "089", "090", "091", "092",\r
+    "093", "094", "095",\r
+    "096", "097", "098", "099", "100", "101", "102", "103", "104", "105", "106", "107", "108",\r
+    "109", "110", "111",\r
+    "112", "113", "114", "115", "116", "117", "118", "119", "120", "121", "122", "123", "124",\r
+    "125", "126", "127",\r
+    "128", "129", "130", "131", "132", "133", "134", "135", "136", "137", "138", "139", "140",\r
+    "141", "142", "143",\r
+    "144", "145", "146", "147", "148", "149", "150", "151", "152", "153", "154", "155", "156",\r
+    "157", "158", "159",\r
+    "160", "161", "162", "163", "164", "165", "166", "167", "168", "169", "170", "171", "172",\r
+    "173", "174", "175",\r
+    "176", "177", "178", "179", "180",\r
+};\r
+\r
+// Display flags\r
+volatile s_display_flags display;\r
+\r
+// Global return string for int_to_array function\r
+u8 int_to_array_str[8];\r
+\r
+// *************************************************************************************************\r
+// Extern section\r
+extern void (*fptr_lcd_function_line1)(u8 line, u8 update);\r
+extern void (*fptr_lcd_function_line2)(u8 line, u8 update);\r
+\r
+// *************************************************************************************************\r
+// @fn          lcd_init\r
+// @brief       Erase LCD memory. Init LCD peripheral.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void lcd_init(void)\r
+{\r
+    // Clear entire display memory\r
+    LCDBMEMCTL |= LCDCLRBM + LCDCLRM;\r
+\r
+    // LCD_FREQ = ACLK/16/8 = 256Hz\r
+    // Frame frequency = 256Hz/4 = 64Hz, LCD mux 4, LCD on\r
+    LCDBCTL0 = (LCDDIV0 + LCDDIV1 + LCDDIV2 + LCDDIV3) | (LCDPRE0 + LCDPRE1) | LCD4MUX | LCDON;\r
+\r
+    // LCB_BLK_FREQ = ACLK/8/4096 = 1Hz\r
+    LCDBBLKCTL = LCDBLKPRE0 | LCDBLKPRE1 | LCDBLKDIV0 | LCDBLKDIV1 | LCDBLKDIV2 | LCDBLKMOD0;\r
+\r
+    // I/O to COM outputs\r
+    P5SEL |= (BIT5 | BIT6 | BIT7);\r
+    P5DIR |= (BIT5 | BIT6 | BIT7);\r
+\r
+    // Activate LCD output\r
+    LCDBPCTL0 = 0xFFFF;         // Select LCD segments S0-S15\r
+    LCDBPCTL1 = 0x00FF;         // Select LCD segments S16-S22\r
+\r
+#ifdef USE_LCD_CHARGE_PUMP\r
+    // Charge pump voltage generated internally, internal bias (V2-V4) generation\r
+    LCDBVCTL = LCDCPEN | VLCD_2_72;\r
+#endif\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          clear_display_all\r
+// @brief       Erase LINE1 and LINE2 segments. Clear also function-specific content.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void clear_display_all(void)\r
+{\r
+    // Clear generic content\r
+    clear_line(LINE1);\r
+    clear_line(LINE2);\r
+\r
+    // Clean up function-specific content\r
+    fptr_lcd_function_line1(LINE1, DISPLAY_LINE_CLEAR);\r
+    fptr_lcd_function_line2(LINE2, DISPLAY_LINE_CLEAR);\r
+\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          clear_display\r
+// @brief       Erase LINE1 and LINE2 segments. Keep icons.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void clear_display(void)\r
+{\r
+    clear_line(LINE1);\r
+    clear_line(LINE2);\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          clear_line\r
+// @brief       Erase segments of a given line.\r
+// @param       u8 line LINE1, LINE2\r
+// @return      none\r
+// *************************************************************************************************\r
+void clear_line(u8 line)\r
+{\r
+    display_chars(switch_seg(line, LCD_SEG_L1_3_0, LCD_SEG_L2_5_0), NULL, SEG_OFF);\r
+    if (line == LINE1)\r
+    {\r
+        display_symbol(LCD_SEG_L1_DP1, SEG_OFF);\r
+        display_symbol(LCD_SEG_L1_DP0, SEG_OFF);\r
+        display_symbol(LCD_SEG_L1_COL, SEG_OFF);\r
+    }\r
+    else                        // line == LINE2\r
+    {\r
+        display_symbol(LCD_SEG_L2_DP, SEG_OFF);\r
+        display_symbol(LCD_SEG_L2_COL1, SEG_OFF);\r
+        display_symbol(LCD_SEG_L2_COL0, SEG_OFF);\r
+    }\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          write_segment\r
+// @brief       Write to one or multiple LCD segments\r
+// @param       lcdmem          Pointer to LCD byte memory\r
+//                              bits            Segments to address\r
+//                              bitmask         Bitmask for particular display item\r
+//                              mode            On, off or blink segments\r
+// @return\r
+// *************************************************************************************************\r
+void write_lcd_mem(u8 * lcdmem, u8 bits, u8 bitmask, u8 state)\r
+{\r
+    if (state == SEG_ON)\r
+    {\r
+        // Clear segments before writing\r
+        *lcdmem = (u8) (*lcdmem & ~bitmask);\r
+\r
+        // Set visible segments\r
+        *lcdmem = (u8) (*lcdmem | bits);\r
+    }\r
+    else if (state == SEG_OFF)\r
+    {\r
+        // Clear segments\r
+        *lcdmem = (u8) (*lcdmem & ~bitmask);\r
+    }\r
+    else if (state == SEG_ON_BLINK_ON)\r
+    {\r
+        // Clear visible / blink segments before writing\r
+        *lcdmem = (u8) (*lcdmem & ~bitmask);\r
+        *(lcdmem + 0x20) = (u8) (*(lcdmem + 0x20) & ~bitmask);\r
+\r
+        // Set visible / blink segments\r
+        *lcdmem = (u8) (*lcdmem | bits);\r
+        *(lcdmem + 0x20) = (u8) (*(lcdmem + 0x20) | bits);\r
+    }\r
+    else if (state == SEG_ON_BLINK_OFF)\r
+    {\r
+        // Clear visible segments before writing\r
+        *lcdmem = (u8) (*lcdmem & ~bitmask);\r
+\r
+        // Set visible segments\r
+        *lcdmem = (u8) (*lcdmem | bits);\r
+\r
+        // Clear blink segments\r
+        *(lcdmem + 0x20) = (u8) (*(lcdmem + 0x20) & ~bitmask);\r
+    }\r
+    else if (state == SEG_OFF_BLINK_OFF)\r
+    {\r
+        // Clear segments\r
+        *lcdmem = (u8) (*lcdmem & ~bitmask);\r
+\r
+        // Clear blink segments\r
+        *(lcdmem + 0x20) = (u8) (*(lcdmem + 0x20) & ~bitmask);\r
+    }\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          int_to_array\r
+// @brief       Generic integer to array routine. Converts integer n to string.\r
+//                              Default conversion result has leading zeros, e.g. "00123"\r
+//                              Option to convert leading '0' into whitespace (blanks)\r
+// @param       u32 n                   integer to convert\r
+//                              u8 digits               number of digits\r
+//                              u8 blanks               fill up result string with number of\r
+// whitespaces instead of leading zeros\r
+// @return      u8                              string\r
+// *************************************************************************************************\r
+u8 *int_to_array(u32 n, u8 digits, u8 blanks)\r
+{\r
+    u8 i;\r
+    u8 digits1 = digits;\r
+\r
+    // Preset result string\r
+    memcpy(int_to_array_str, "0000000", 7);\r
+\r
+    // Return empty string if number of digits is invalid (valid range for digits: 1-7)\r
+    if ((digits == 0) || (digits > 7))\r
+        return (int_to_array_str);\r
+\r
+    // Numbers 0 .. 180 can be copied from int_to_array_conversion_table without conversion\r
+    if (n <= 180)\r
+    {\r
+        if (digits >= 3)\r
+        {\r
+            memcpy(int_to_array_str + (digits - 3), int_to_array_conversion_table[n], 3);\r
+        }\r
+        else                    // digits == 1 || 2\r
+        {\r
+            memcpy(int_to_array_str, int_to_array_conversion_table[n] + (3 - digits), digits);\r
+        }\r
+    }\r
+    else                        // For n > 180 need to calculate string content\r
+    {\r
+        // Calculate digits from least to most significant number\r
+        do\r
+        {\r
+            int_to_array_str[digits - 1] = n % 10 + '0';\r
+            n /= 10;\r
+        }\r
+        while (--digits > 0);\r
+    }\r
+\r
+    // Remove specified number of leading '0', always keep last one\r
+    i = 0;\r
+    while ((int_to_array_str[i] == '0') && (i < digits1 - 1))\r
+    {\r
+        if (blanks > 0)\r
+        {\r
+            // Convert only specified number of leading '0'\r
+            int_to_array_str[i] = ' ';\r
+            blanks--;\r
+        }\r
+        i++;\r
+    }\r
+\r
+    return (int_to_array_str);\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          display_value\r
+// @brief       Generic decimal display routine. Used exclusively by set_value function.\r
+// @param       u8 segments             LCD segments where value is displayed\r
+//                              u32 value                       Integer value to be displayed\r
+//                              u8 digits                       Number of digits to convert\r
+//                              u8 blanks                       Number of leadings blanks in\r
+// int_to_array result string\r
+// @return      none\r
+// *************************************************************************************************\r
+void display_value(u8 segments, u32 value, u8 digits, u8 blanks)\r
+{\r
+    u8 *str;\r
+\r
+    str = int_to_array(value, digits, blanks);\r
+\r
+    // Display string in blink mode\r
+    display_chars(segments, str, SEG_ON_BLINK_ON);\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          display_hours\r
+// @brief       Display hours in 24H / 12H time format.\r
+// @param       u8 segments     Segments where to display hour data\r
+//                              u32 value               Hour data\r
+//                              u8 digits               Must be "2"\r
+//                              u8 blanks               Must be "0"\r
+// @return      none\r
+// *************************************************************************************************\r
+void display_hours(u8 segments, u32 value, u8 digits, u8 blanks)\r
+{\r
+    u8 hours;\r
+\r
+    if (sys.flag.use_metric_units)\r
+    {\r
+        // Display hours in 24H time format\r
+        display_value(segments, (u16) value, digits, blanks);\r
+    }\r
+    else\r
+    {\r
+        // convert internal 24H time format to 12H time format\r
+        hours = convert_hour_to_12H_format(value);\r
+\r
+        // display hours in 12H time format\r
+        display_value(segments, hours, digits, blanks);\r
+        display_am_pm_symbol(value);\r
+    }\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          display_am_pm_symbol\r
+// @brief       Display AM or PM symbol.\r
+// @param       u8 hour         24H internal time format\r
+// @return      none\r
+// *************************************************************************************************\r
+void display_am_pm_symbol(u8 hour)\r
+{\r
+    // Display AM/PM symbol\r
+    if (is_hour_am(hour))\r
+    {\r
+        display_symbol(LCD_SYMB_AM, SEG_ON);\r
+    }\r
+    else\r
+    {\r
+        // Clear AM segments first - required when changing from AM to PM\r
+        display_symbol(LCD_SYMB_AM, SEG_OFF);\r
+        display_symbol(LCD_SYMB_PM, SEG_ON);\r
+    }\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          display_symbol\r
+// @brief       Switch symbol on or off on LCD.\r
+// @param       u8 symbol               A valid LCD symbol (index 0..42)\r
+//                              u8 state                SEG_ON, SEG_OFF, SEG_BLINK\r
+// @return      none\r
+// *************************************************************************************************\r
+void display_symbol(u8 symbol, u8 mode)\r
+{\r
+    u8 *lcdmem;\r
+    u8 bits;\r
+    u8 bitmask;\r
+\r
+    if (symbol <= LCD_SEG_L2_DP)\r
+    {\r
+        // Get LCD memory address for symbol from table\r
+        lcdmem = (u8 *) segments_lcdmem[symbol];\r
+\r
+        // Get bits for symbol from table\r
+        bits = segments_bitmask[symbol];\r
+\r
+        // Bitmask for symbols equals bits\r
+        bitmask = bits;\r
+\r
+        // Write LCD memory\r
+        write_lcd_mem(lcdmem, bits, bitmask, mode);\r
+    }\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          display_char\r
+// @brief       Write to 7-segment characters.\r
+// @param       u8 segment              A valid LCD segment\r
+//                              u8 chr                  Character to display\r
+//                              u8 mode             SEG_ON, SEG_OFF, SEG_BLINK\r
+// @return      none\r
+// *************************************************************************************************\r
+void display_char(u8 segment, u8 chr, u8 mode)\r
+{\r
+    u8 *lcdmem;                 // Pointer to LCD memory\r
+    u8 bitmask;                 // Bitmask for character\r
+    u8 bits, bits1;             // Bits to write\r
+\r
+    // Write to single 7-segment character\r
+    if ((segment >= LCD_SEG_L1_3) && (segment <= LCD_SEG_L2_DP))\r
+    {\r
+        // Get LCD memory address for segment from table\r
+        lcdmem = (u8 *) segments_lcdmem[segment];\r
+\r
+        // Get bitmask for character from table\r
+        bitmask = segments_bitmask[segment];\r
+\r
+        // Get bits from font set\r
+        if ((chr >= 0x30) && (chr <= 0x5A))\r
+        {\r
+            // Use font set\r
+            bits = lcd_font[chr - 0x30];\r
+        }\r
+        else if (chr == 0x2D)\r
+        {\r
+            // '-' not in font set\r
+            bits = BIT1;\r
+        }\r
+        else\r
+        {\r
+            // Other characters map to ' ' (blank)\r
+            bits = 0;\r
+        }\r
+\r
+        // When addressing LINE2 7-segment characters need to swap high- and low-nibble,\r
+        // because LCD COM/SEG assignment is mirrored against LINE1\r
+        if (segment >= LCD_SEG_L2_5)\r
+        {\r
+            bits1 = ((bits << 4) & 0xF0) | ((bits >> 4) & 0x0F);\r
+            bits = bits1;\r
+\r
+            // When addressing LCD_SEG_L2_5, need to convert ASCII '1' and 'L' to 1 bit,\r
+            // because LCD COM/SEG assignment is special for this incomplete character\r
+            if (segment == LCD_SEG_L2_5)\r
+            {\r
+                if ((chr == '1') || (chr == 'L'))\r
+                    bits = BIT7;\r
+            }\r
+        }\r
+\r
+        // Physically write to LCD memory\r
+        write_lcd_mem(lcdmem, bits, bitmask, mode);\r
+    }\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          display_chars\r
+// @brief       Write to consecutive 7-segment characters.\r
+// @param       u8 segments     LCD segment array\r
+//                              u8 * str                Pointer to a string\r
+//                              u8 mode             SEG_ON, SEG_OFF, SEG_BLINK\r
+// @return      none\r
+// *************************************************************************************************\r
+void display_chars(u8 segments, u8 * str, u8 mode)\r
+{\r
+    u8 i;\r
+    u8 length = 0;              // Write length\r
+    u8 char_start;              // Starting point for consecutive write\r
+\r
+    switch (segments)\r
+    {\r
+        // LINE1\r
+        case LCD_SEG_L1_3_0:\r
+            length = 4;\r
+            char_start = LCD_SEG_L1_3;\r
+            break;\r
+        case LCD_SEG_L1_2_0:\r
+            length = 3;\r
+            char_start = LCD_SEG_L1_2;\r
+            break;\r
+        case LCD_SEG_L1_1_0:\r
+            length = 2;\r
+            char_start = LCD_SEG_L1_1;\r
+            break;\r
+        case LCD_SEG_L1_3_1:\r
+            length = 3;\r
+            char_start = LCD_SEG_L1_3;\r
+            break;\r
+        case LCD_SEG_L1_3_2:\r
+            length = 2;\r
+            char_start = LCD_SEG_L1_3;\r
+            break;\r
+\r
+        // LINE2\r
+        case LCD_SEG_L2_5_0:\r
+            length = 6;\r
+            char_start = LCD_SEG_L2_5;\r
+            break;\r
+        case LCD_SEG_L2_4_0:\r
+            length = 5;\r
+            char_start = LCD_SEG_L2_4;\r
+            break;\r
+        case LCD_SEG_L2_3_0:\r
+            length = 4;\r
+            char_start = LCD_SEG_L2_3;\r
+            break;\r
+        case LCD_SEG_L2_2_0:\r
+            length = 3;\r
+            char_start = LCD_SEG_L2_2;\r
+            break;\r
+        case LCD_SEG_L2_1_0:\r
+            length = 2;\r
+            char_start = LCD_SEG_L2_1;\r
+            break;\r
+        case LCD_SEG_L2_5_4:\r
+            length = 2;\r
+            char_start = LCD_SEG_L2_5;\r
+            break;\r
+        case LCD_SEG_L2_5_2:\r
+            length = 4;\r
+            char_start = LCD_SEG_L2_5;\r
+            break;\r
+        case LCD_SEG_L2_3_2:\r
+            length = 2;\r
+            char_start = LCD_SEG_L2_3;\r
+            break;\r
+        case LCD_SEG_L2_4_2:\r
+            length = 3;\r
+            char_start = LCD_SEG_L2_4;\r
+            break;\r
+    }\r
+\r
+    // Write to consecutive digits\r
+    for (i = 0; i < length; i++)\r
+    {\r
+        // Use single character routine to write display memory\r
+        display_char(char_start + i, *(str + i), mode);\r
+    }\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          switch_seg\r
+// @brief       Returns index of 7-segment character. Required for display routines that can draw\r
+//                              information on both lines.\r
+// @param       u8 line             LINE1 or LINE2\r
+//                              u8 index1               Index of LINE1\r
+//                              u8 index2               Index of LINE2\r
+// @return      uint8\r
+// *************************************************************************************************\r
+u8 switch_seg(u8 line, u8 index1, u8 index2)\r
+{\r
+    if (line == LINE1)\r
+    {\r
+        return index1;\r
+    }\r
+    else                        // line == LINE2\r
+    {\r
+        return index2;\r
+    }\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          start_blink\r
+// @brief       Start blinking.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void start_blink(void)\r
+{\r
+    LCDBBLKCTL |= LCDBLKMOD0;\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          stop_blink\r
+// @brief       Stop blinking.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void stop_blink(void)\r
+{\r
+    LCDBBLKCTL &= ~LCDBLKMOD0;\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          stop_blink\r
+// @brief       Clear blinking memory.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void clear_blink_mem(void)\r
+{\r
+    LCDBMEMCTL |= LCDCLRBM;\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          set_blink_rate\r
+// @brief       Set blink rate register bits.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void set_blink_rate(u8 bits)\r
+{\r
+    LCDBBLKCTL &= ~(BIT7 | BIT6 | BIT5);\r
+    LCDBBLKCTL |= bits;\r
+}\r
+\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/driver/display.h b/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/driver/display.h
new file mode 100755 (executable)
index 0000000..044c3bd
--- /dev/null
@@ -0,0 +1,338 @@
+// *************************************************************************************************\r
+//\r
+//      Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//        Redistribution and use in source and binary forms, with or without\r
+//        modification, are permitted provided that the following conditions\r
+//        are met:\r
+//\r
+//          Redistributions of source code must retain the above copyright\r
+//          notice, this list of conditions and the following disclaimer.\r
+//\r
+//          Redistributions in binary form must reproduce the above copyright\r
+//          notice, this list of conditions and the following disclaimer in the\r
+//          documentation and/or other materials provided with the\r
+//          distribution.\r
+//\r
+//          Neither the name of Texas Instruments Incorporated nor the names of\r
+//          its contributors may be used to endorse or promote products derived\r
+//          from this software without specific prior written permission.\r
+//\r
+//        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+\r
+#ifndef __DISPLAY_H\r
+#define __DISPLAY_H\r
+\r
+// *************************************************************************************************\r
+// Include section\r
+\r
+#include <project.h>\r
+\r
+// *************************************************************************************************\r
+// Extern section\r
+\r
+// Constants defined in library\r
+extern const u8 lcd_font[];\r
+extern const u8 *segments_lcdmem[];\r
+extern const u8 segments_bitmask[];\r
+extern const u8 int_to_array_conversion_table[][3];\r
+\r
+// *************************************************************************************************\r
+// Global Variable section\r
+\r
+// Set of display flags\r
+typedef union\r
+{\r
+    struct\r
+    {\r
+        // Line1 + Line2 + Icons\r
+        u16 full_update            : 1;   // 1 = Redraw all content\r
+        u16 partial_update         : 1;   // 1 = Update changes\r
+\r
+        // Line only\r
+        u16 line1_full_update       : 1;  // 1 = Redraw Line1 content\r
+        u16 line2_full_update       : 1;  // 1 = Redraw Line2 content\r
+\r
+        // Logic module data update flags\r
+        u16 update_time              : 1; // 1 = Time was updated\r
+        u16 update_stopwatch         : 1; // 1 = Stopwatch was updated\r
+        u16 update_temperature       : 1; // 1 = Temperature was updated\r
+        u16 update_battery_voltage   : 1; // 1 = Battery voltage was updated\r
+        u16 update_date              : 1; // 1 = Date was updated\r
+        u16 update_alarm             : 1; // 1 = Alarm time was updated\r
+        u16 update_acceleration      : 1; // 1 = Acceleration data was updated\r
+    } flag;\r
+    u16 all_flags;                        // Shortcut to all display flags (for reset)\r
+} s_display_flags;\r
+extern volatile s_display_flags display;\r
+\r
+// *************************************************************************************************\r
+// Defines section\r
+\r
+// Display function modes\r
+#define DISPLAY_LINE_UPDATE_FULL                (BIT0)\r
+#define DISPLAY_LINE_UPDATE_PARTIAL             (BIT1)\r
+#define DISPLAY_LINE_CLEAR                              (BIT2)\r
+\r
+// Definitions for line view style\r
+#define DISPLAY_DEFAULT_VIEW                    (0u)\r
+#define DISPLAY_ALTERNATIVE_VIEW                (1u)\r
+\r
+// Definitions for line access\r
+#define LINE1                                                   (1u)\r
+#define LINE2                                                   (2u)\r
+\r
+// LCD display modes\r
+#define SEG_OFF                                 (0u)\r
+#define SEG_ON                                  (1u)\r
+#define SEG_ON_BLINK_ON                 (2u)\r
+#define SEG_ON_BLINK_OFF                (3u)\r
+#define SEG_OFF_BLINK_OFF               (4u)\r
+\r
+// 7-segment character bit assignments\r
+#define SEG_A                   (BIT4)\r
+#define SEG_B                   (BIT5)\r
+#define SEG_C                   (BIT6)\r
+#define SEG_D                   (BIT7)\r
+#define SEG_E                   (BIT2)\r
+#define SEG_F                   (BIT0)\r
+#define SEG_G                   (BIT1)\r
+\r
+// ------------------------------------------\r
+// LCD symbols for easier access\r
+//\r
+// xxx_SEG_xxx          = Seven-segment character (sequence 5-4-3-2-1-0)\r
+// xxx_SYMB_xxx         = Display symbol, e.g. "AM" for ante meridiem\r
+// xxx_UNIT_xxx         = Display unit, e.g. "km/h" for kilometers per hour\r
+// xxx_ICON_xxx         = Display icon, e.g. heart to indicate reception of heart rate data\r
+// xxx_L1_xxx           = Item is part of Line1 information\r
+// xxx_L2_xxx           = Item is part of Line2 information\r
+\r
+// Symbols for Line1\r
+#define LCD_SYMB_AM                                     0\r
+#define LCD_SYMB_PM                                     1\r
+#define LCD_SYMB_ARROW_UP                       2\r
+#define LCD_SYMB_ARROW_DOWN                     3\r
+#define LCD_SYMB_PERCENT                        4\r
+\r
+// Symbols for Line2\r
+#define LCD_SYMB_TOTAL                          5\r
+#define LCD_SYMB_AVERAGE                        6\r
+#define LCD_SYMB_MAX                            7\r
+#define LCD_SYMB_BATTERY                        8\r
+\r
+// Units for Line1\r
+#define LCD_UNIT_L1_FT                          9\r
+#define LCD_UNIT_L1_K                           10\r
+#define LCD_UNIT_L1_M                           11\r
+#define LCD_UNIT_L1_I                           12\r
+#define LCD_UNIT_L1_PER_S                       13\r
+#define LCD_UNIT_L1_PER_H                       14\r
+#define LCD_UNIT_L1_DEGREE                      15\r
+\r
+// Units for Line2\r
+#define LCD_UNIT_L2_KCAL                        16\r
+#define LCD_UNIT_L2_KM                          17\r
+#define LCD_UNIT_L2_MI                          18\r
+\r
+// Icons\r
+#define LCD_ICON_HEART                          19\r
+#define LCD_ICON_STOPWATCH                      20\r
+#define LCD_ICON_RECORD                         21\r
+#define LCD_ICON_ALARM                          22\r
+#define LCD_ICON_BEEPER1                        23\r
+#define LCD_ICON_BEEPER2                        24\r
+#define LCD_ICON_BEEPER3                        25\r
+\r
+// Line1 7-segments\r
+#define LCD_SEG_L1_3                            26\r
+#define LCD_SEG_L1_2                            27\r
+#define LCD_SEG_L1_1                            28\r
+#define LCD_SEG_L1_0                            29\r
+#define LCD_SEG_L1_COL                          30\r
+#define LCD_SEG_L1_DP1                          31\r
+#define LCD_SEG_L1_DP0                          32\r
+\r
+// Line2 7-segments\r
+#define LCD_SEG_L2_5                            33\r
+#define LCD_SEG_L2_4                            34\r
+#define LCD_SEG_L2_3                            35\r
+#define LCD_SEG_L2_2                            36\r
+#define LCD_SEG_L2_1                            37\r
+#define LCD_SEG_L2_0                            38\r
+#define LCD_SEG_L2_COL1                         39\r
+#define LCD_SEG_L2_COL0                         40\r
+#define LCD_SEG_L2_DP                           41\r
+\r
+// Line1 7-segment arrays\r
+#define LCD_SEG_L1_3_0                          70\r
+#define LCD_SEG_L1_2_0                          71\r
+#define LCD_SEG_L1_1_0                          72\r
+#define LCD_SEG_L1_3_1                          73\r
+#define LCD_SEG_L1_3_2                          74\r
+\r
+// Line2 7-segment arrays\r
+#define LCD_SEG_L2_5_0                          90\r
+#define LCD_SEG_L2_4_0                          91\r
+#define LCD_SEG_L2_3_0                          92\r
+#define LCD_SEG_L2_2_0                          93\r
+#define LCD_SEG_L2_1_0                          94\r
+#define LCD_SEG_L2_5_2                          95\r
+#define LCD_SEG_L2_3_2                          96\r
+#define LCD_SEG_L2_5_4                          97\r
+#define LCD_SEG_L2_4_2                          98\r
+\r
+// LCD controller memory map\r
+#define LCD_MEM_1                               ((u8*)0x0A20)\r
+#define LCD_MEM_2                               ((u8*)0x0A21)\r
+#define LCD_MEM_3                               ((u8*)0x0A22)\r
+#define LCD_MEM_4                               ((u8*)0x0A23)\r
+#define LCD_MEM_5                               ((u8*)0x0A24)\r
+#define LCD_MEM_6                               ((u8*)0x0A25)\r
+#define LCD_MEM_7                               ((u8*)0x0A26)\r
+#define LCD_MEM_8                               ((u8*)0x0A27)\r
+#define LCD_MEM_9                               ((u8*)0x0A28)\r
+#define LCD_MEM_10                              ((u8*)0x0A29)\r
+#define LCD_MEM_11                              ((u8*)0x0A2A)\r
+#define LCD_MEM_12                              ((u8*)0x0A2B)\r
+\r
+// Memory assignment\r
+#define LCD_SEG_L1_0_MEM                        (LCD_MEM_6)\r
+#define LCD_SEG_L1_1_MEM                        (LCD_MEM_4)\r
+#define LCD_SEG_L1_2_MEM                        (LCD_MEM_3)\r
+#define LCD_SEG_L1_3_MEM                        (LCD_MEM_2)\r
+#define LCD_SEG_L1_COL_MEM                      (LCD_MEM_1)\r
+#define LCD_SEG_L1_DP1_MEM                      (LCD_MEM_1)\r
+#define LCD_SEG_L1_DP0_MEM                      (LCD_MEM_5)\r
+#define LCD_SEG_L2_0_MEM                        (LCD_MEM_8)\r
+#define LCD_SEG_L2_1_MEM                        (LCD_MEM_9)\r
+#define LCD_SEG_L2_2_MEM                        (LCD_MEM_10)\r
+#define LCD_SEG_L2_3_MEM                        (LCD_MEM_11)\r
+#define LCD_SEG_L2_4_MEM                        (LCD_MEM_12)\r
+#define LCD_SEG_L2_5_MEM                        (LCD_MEM_12)\r
+#define LCD_SEG_L2_COL1_MEM                     (LCD_MEM_1)\r
+#define LCD_SEG_L2_COL0_MEM                     (LCD_MEM_5)\r
+#define LCD_SEG_L2_DP_MEM                       (LCD_MEM_9)\r
+#define LCD_SYMB_AM_MEM                         (LCD_MEM_1)\r
+#define LCD_SYMB_PM_MEM                         (LCD_MEM_1)\r
+#define LCD_SYMB_ARROW_UP_MEM           (LCD_MEM_1)\r
+#define LCD_SYMB_ARROW_DOWN_MEM         (LCD_MEM_1)\r
+#define LCD_SYMB_PERCENT_MEM            (LCD_MEM_5)\r
+#define LCD_SYMB_TOTAL_MEM                      (LCD_MEM_11)\r
+#define LCD_SYMB_AVERAGE_MEM            (LCD_MEM_10)\r
+#define LCD_SYMB_MAX_MEM                        (LCD_MEM_8)\r
+#define LCD_SYMB_BATTERY_MEM            (LCD_MEM_7)\r
+#define LCD_UNIT_L1_FT_MEM                      (LCD_MEM_5)\r
+#define LCD_UNIT_L1_K_MEM                       (LCD_MEM_5)\r
+#define LCD_UNIT_L1_M_MEM                       (LCD_MEM_7)\r
+#define LCD_UNIT_L1_I_MEM                       (LCD_MEM_7)\r
+#define LCD_UNIT_L1_PER_S_MEM           (LCD_MEM_5)\r
+#define LCD_UNIT_L1_PER_H_MEM           (LCD_MEM_7)\r
+#define LCD_UNIT_L1_DEGREE_MEM          (LCD_MEM_5)\r
+#define LCD_UNIT_L2_KCAL_MEM            (LCD_MEM_7)\r
+#define LCD_UNIT_L2_KM_MEM                      (LCD_MEM_7)\r
+#define LCD_UNIT_L2_MI_MEM                      (LCD_MEM_7)\r
+#define LCD_ICON_HEART_MEM                      (LCD_MEM_2)\r
+#define LCD_ICON_STOPWATCH_MEM          (LCD_MEM_3)\r
+#define LCD_ICON_RECORD_MEM                     (LCD_MEM_1)\r
+#define LCD_ICON_ALARM_MEM                      (LCD_MEM_4)\r
+#define LCD_ICON_BEEPER1_MEM            (LCD_MEM_5)\r
+#define LCD_ICON_BEEPER2_MEM            (LCD_MEM_6)\r
+#define LCD_ICON_BEEPER3_MEM            (LCD_MEM_7)\r
+\r
+// Bit masks for write access\r
+#define LCD_SEG_L1_0_MASK                       (BIT2 + BIT1 + BIT0 + BIT7 + BIT6 + BIT5 + BIT4)\r
+#define LCD_SEG_L1_1_MASK                       (BIT2 + BIT1 + BIT0 + BIT7 + BIT6 + BIT5 + BIT4)\r
+#define LCD_SEG_L1_2_MASK                       (BIT2 + BIT1 + BIT0 + BIT7 + BIT6 + BIT5 + BIT4)\r
+#define LCD_SEG_L1_3_MASK                       (BIT2 + BIT1 + BIT0 + BIT7 + BIT6 + BIT5 + BIT4)\r
+#define LCD_SEG_L1_COL_MASK                     (BIT5)\r
+#define LCD_SEG_L1_DP1_MASK                     (BIT6)\r
+#define LCD_SEG_L1_DP0_MASK                     (BIT2)\r
+#define LCD_SEG_L2_0_MASK                       (BIT3 + BIT2 + BIT1 + BIT0 + BIT6 + BIT5 + BIT4)\r
+#define LCD_SEG_L2_1_MASK                       (BIT3 + BIT2 + BIT1 + BIT0 + BIT6 + BIT5 + BIT4)\r
+#define LCD_SEG_L2_2_MASK                       (BIT3 + BIT2 + BIT1 + BIT0 + BIT6 + BIT5 + BIT4)\r
+#define LCD_SEG_L2_3_MASK                       (BIT3 + BIT2 + BIT1 + BIT0 + BIT6 + BIT5 + BIT4)\r
+#define LCD_SEG_L2_4_MASK                       (BIT3 + BIT2 + BIT1 + BIT0 + BIT6 + BIT5 + BIT4)\r
+#define LCD_SEG_L2_5_MASK                       (BIT7)\r
+#define LCD_SEG_L2_COL1_MASK            (BIT4)\r
+#define LCD_SEG_L2_COL0_MASK            (BIT0)\r
+#define LCD_SEG_L2_DP_MASK                      (BIT7)\r
+#define LCD_SYMB_AM_MASK                        (BIT1 + BIT0)\r
+#define LCD_SYMB_PM_MASK                        (BIT0)\r
+#define LCD_SYMB_ARROW_UP_MASK          (BIT2)\r
+#define LCD_SYMB_ARROW_DOWN_MASK        (BIT3)\r
+#define LCD_SYMB_PERCENT_MASK           (BIT4)\r
+#define LCD_SYMB_TOTAL_MASK                     (BIT7)\r
+#define LCD_SYMB_AVERAGE_MASK           (BIT7)\r
+#define LCD_SYMB_MAX_MASK                       (BIT7)\r
+#define LCD_SYMB_BATTERY_MASK           (BIT7)\r
+#define LCD_UNIT_L1_FT_MASK                     (BIT5)\r
+#define LCD_UNIT_L1_K_MASK                      (BIT6)\r
+#define LCD_UNIT_L1_M_MASK                      (BIT1)\r
+#define LCD_UNIT_L1_I_MASK                      (BIT0)\r
+#define LCD_UNIT_L1_PER_S_MASK          (BIT7)\r
+#define LCD_UNIT_L1_PER_H_MASK          (BIT2)\r
+#define LCD_UNIT_L1_DEGREE_MASK         (BIT1)\r
+#define LCD_UNIT_L2_KCAL_MASK           (BIT4)\r
+#define LCD_UNIT_L2_KM_MASK                     (BIT5)\r
+#define LCD_UNIT_L2_MI_MASK                     (BIT6)\r
+#define LCD_ICON_HEART_MASK                     (BIT3)\r
+#define LCD_ICON_STOPWATCH_MASK         (BIT3)\r
+#define LCD_ICON_RECORD_MASK            (BIT7)\r
+#define LCD_ICON_ALARM_MASK                     (BIT3)\r
+#define LCD_ICON_BEEPER1_MASK           (BIT3)\r
+#define LCD_ICON_BEEPER2_MASK           (BIT3)\r
+#define LCD_ICON_BEEPER3_MASK           (BIT3)\r
+\r
+// *************************************************************************************************\r
+// API section\r
+\r
+// Physical LCD memory write\r
+extern void write_lcd_mem(u8 * lcdmem, u8 bits, u8 bitmask, u8 state);\r
+\r
+// Display init / clear\r
+extern void lcd_init(void);\r
+extern void clear_display(void);\r
+extern void clear_display_all(void);\r
+extern void clear_line(u8 line);\r
+\r
+// Blinking function\r
+extern void start_blink(void);\r
+extern void stop_blink(void);\r
+extern void clear_blink_mem(void);\r
+extern void set_blink_rate(u8 bits);\r
+\r
+// Character / symbol draw functions\r
+extern void display_char(u8 segment, u8 chr, u8 mode);\r
+extern void display_chars(u8 segments, u8 * str, u8 mode);\r
+extern void display_symbol(u8 symbol, u8 mode);\r
+\r
+// Time display function\r
+extern void DisplayTime(u8 updateMode);\r
+extern void display_am_pm_symbol(u8 timeAM);\r
+\r
+// Set_value display functions\r
+extern void display_value(u8 segments, u32 value, u8 digits, u8 blanks);\r
+extern void display_hours(u8 segments, u32 value, u8 digits, u8 blanks);\r
+\r
+// Integer to string conversion\r
+extern u8 *int_to_array(u32 n, u8 digits, u8 blanks);\r
+\r
+// Segment index helper function\r
+extern u8 switch_seg(u8 line, u8 index1, u8 index2);\r
+\r
+#endif   /*__DISPLAY_H*/\r
+\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/driver/ez430_chronos_datalogger_codesize_limited_drivers.r43 b/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/driver/ez430_chronos_datalogger_codesize_limited_drivers.r43
new file mode 100755 (executable)
index 0000000..eaa660c
Binary files /dev/null and b/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/driver/ez430_chronos_datalogger_codesize_limited_drivers.r43 differ
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/driver/flash.c b/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/driver/flash.c
new file mode 100755 (executable)
index 0000000..2247f4c
--- /dev/null
@@ -0,0 +1,95 @@
+// *************************************************************************************************\r
+//\r
+//      Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//        Redistribution and use in source and binary forms, with or without\r
+//        modification, are permitted provided that the following conditions\r
+//        are met:\r
+//\r
+//          Redistributions of source code must retain the above copyright\r
+//          notice, this list of conditions and the following disclaimer.\r
+//\r
+//          Redistributions in binary form must reproduce the above copyright\r
+//          notice, this list of conditions and the following disclaimer in the\r
+//          documentation and/or other materials provided with the\r
+//          distribution.\r
+//\r
+//          Neither the name of Texas Instruments Incorporated nor the names of\r
+//          its contributors may be used to endorse or promote products derived\r
+//          from this software without specific prior written permission.\r
+//\r
+//        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+// Data logger routines.\r
+// *************************************************************************************************\r
+\r
+// *************************************************************************************************\r
+// Include section\r
+\r
+// system\r
+#include "project.h"\r
+\r
+// logic\r
+#include "datalog.h"\r
+\r
+// *************************************************************************************************\r
+// Prototypes section\r
+\r
+// *************************************************************************************************\r
+// Defines section\r
+\r
+// *************************************************************************************************\r
+// Implementation\r
+\r
+void flash_erase_page(u8 page)\r
+{\r
+    // Convert page index to memory address\r
+    u16 *wptr = (u16 *) (page * 512);\r
+\r
+    // Range check\r
+    if ((page < DATALOG_PAGE_START) || (page > DATALOG_PAGE_END))\r
+        return;\r
+\r
+    // Wait until not busy\r
+    while ((FCTL3 & BUSY) != 0) ;\r
+\r
+    __disable_interrupt();\r
+    FCTL3 = FWKEY;              // Clear Lock bit\r
+    FCTL1 = FWKEY + ERASE;      // Set Erase bit\r
+    *wptr = 0;                  // Dummy write to erase Flash seg\r
+    FCTL1 = FWKEY + WRT;        // Set WRT bit for write operation\r
+    FCTL1 = FWKEY;              // Clear WRT bit\r
+    FCTL3 = FWKEY + LOCK;       // Set LOCK bit\r
+    __enable_interrupt();\r
+}\r
+\r
+void flash_write(u16 * wptr, u16 data)\r
+{\r
+    // Range check\r
+    //if ((page < DATALOG_MEMORY_START) || (page > DATALOG_MEMORY_END)) return;\r
+\r
+    // Wait until not busy\r
+    while ((FCTL3 & BUSY) != 0) ;\r
+\r
+    __disable_interrupt();\r
+    FCTL3 = FWKEY;              // Clear Lock bit\r
+    *wptr = 0;                  // Dummy write to erase Flash seg\r
+    FCTL1 = FWKEY + WRT;        // Set WRT bit for write operation\r
+    *wptr = data;\r
+    FCTL1 = FWKEY;              // Clear WRT bit\r
+    FCTL3 = FWKEY + LOCK;       // Set LOCK bit\r
+    __enable_interrupt();\r
+}\r
+\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/driver/flash.h b/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/driver/flash.h
new file mode 100755 (executable)
index 0000000..b9cafa9
--- /dev/null
@@ -0,0 +1,44 @@
+// *************************************************************************************************\r
+//\r
+//      Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//        Redistribution and use in source and binary forms, with or without\r
+//        modification, are permitted provided that the following conditions\r
+//        are met:\r
+//\r
+//          Redistributions of source code must retain the above copyright\r
+//          notice, this list of conditions and the following disclaimer.\r
+//\r
+//          Redistributions in binary form must reproduce the above copyright\r
+//          notice, this list of conditions and the following disclaimer in the\r
+//          documentation and/or other materials provided with the\r
+//          distribution.\r
+//\r
+//          Neither the name of Texas Instruments Incorporated nor the names of\r
+//          its contributors may be used to endorse or promote products derived\r
+//          from this software without specific prior written permission.\r
+//\r
+//        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+\r
+#ifndef FLASH_H_\r
+#define FLASH_H_\r
+\r
+// *************************************************************************************************\r
+// Extern section\r
+extern void flash_erase_page(u8 page);\r
+extern void flash_write(u16 * wptr, u16 data);\r
+\r
+#endif\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/driver/pmm.c b/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/driver/pmm.c
new file mode 100755 (executable)
index 0000000..3257e7a
--- /dev/null
@@ -0,0 +1,78 @@
+//****************************************************************************//\r
+// Function Library for setting the PMM\r
+//\r
+//  This file is used in conjunction with PMM.c to set the core\r
+//  voltage level of a device. To set a core voltage level, call\r
+//  SetVCore(level). See RF project(s) for example usage.\r
+//\r
+//  Original programm                                           Stefan Schauer\r
+//  Rev 1.1: changed VCoreUp to fit with recommended flow (09/04/2008)\r
+//\r
+//****************************************************************************//\r
+#include "cc430x613x.h"\r
+#include "pmm.h"\r
+\r
+//****************************************************************************//\r
+// Set VCore level\r
+// SetVCore level is called from the user API\r
+//****************************************************************************//\r
+void SetVCore(unsigned char level)                                   // Note: change level by one\r
+                                                                     // step only\r
+{\r
+    unsigned char actLevel;\r
+\r
+    do\r
+    {\r
+        actLevel = PMMCTL0_L & PMMCOREV_3;\r
+        if (actLevel < level)\r
+            SetVCoreUp(++actLevel);                                  // Set VCore (step by step)\r
+        if (actLevel > level)\r
+            SetVCoreDown(--actLevel);                                // Set VCore (step by step)\r
+    }\r
+    while (actLevel != level);\r
+}\r
+\r
+//****************************************************************************//\r
+// Set VCore up\r
+//****************************************************************************//\r
+void SetVCoreUp(unsigned char level)                                 // Note: change level by one\r
+                                                                     // step only\r
+{\r
+    PMMCTL0_H = 0xA5;                                                // Open PMM module registers\r
+                                                                     // for write access\r
+\r
+    SVSMHCTL = SVSHE + SVSHRVL0 * level + SVMHE + SVSMHRRL0 * level; // Set SVS/M high side to new\r
+                                                                     // level\r
+\r
+    SVSMLCTL = SVSLE + SVMLE + SVSMLRRL0 * level;                    // Set SVM new Level\r
+    while ((PMMIFG & SVSMLDLYIFG) == 0) ;                            // Wait till SVM is settled\r
+                                                                     // (Delay)\r
+    PMMCTL0_L = PMMCOREV0 * level;                                   // Set VCore to x\r
+    PMMIFG &= ~(SVMLVLRIFG + SVMLIFG);                               // Clear already set flags\r
+    if ((PMMIFG & SVMLIFG))\r
+        while ((PMMIFG & SVMLVLRIFG) == 0) ;                         // Wait till level is reached\r
+\r
+    SVSMLCTL = SVSLE + SVSLRVL0 * level + SVMLE + SVSMLRRL0 * level; // Set SVS/M Low side to new\r
+                                                                     // level\r
+    PMMCTL0_H = 0x00;                                                // Lock PMM module registers\r
+                                                                     // for write access\r
+}\r
+\r
+//****************************************************************************//\r
+// Set VCore down\r
+//****************************************************************************//\r
+void SetVCoreDown(unsigned char level)\r
+{\r
+    PMMCTL0_H = 0xA5;                                                // Open PMM module registers\r
+                                                                     // for write access\r
+    SVSMLCTL = SVSLE + SVSLRVL0 * level + SVMLE + SVSMLRRL0 * level; // Set SVS/M Low side to new\r
+                                                                     // level\r
+    while ((PMMIFG & SVSMLDLYIFG) == 0) ;                            // Wait till SVM is settled\r
+                                                                     // (Delay)\r
+    PMMCTL0_L = (level * PMMCOREV0);                                 // Set VCore to 1.85 V for Max\r
+                                                                     // Speed.\r
+    PMMCTL0_H = 0x00;                                                // Lock PMM module registers\r
+                                                                     // for write access\r
+}\r
+\r
+//****************************************************************************//\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/driver/pmm.h b/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/driver/pmm.h
new file mode 100755 (executable)
index 0000000..170008f
--- /dev/null
@@ -0,0 +1,43 @@
+//====================================================================\r
+//    File: PMM.h\r
+//\r
+//    This file is used in conjunction with PMM.c to set the core\r
+//    voltage level of a device. To set a core voltage level, call\r
+//    SetVCore(level). See RF project(s) for example usage.\r
+//\r
+//    Version 1.0 first\r
+//    07/14/07\r
+//\r
+//====================================================================\r
+\r
+#ifndef __PMM\r
+#define __PMM\r
+\r
+//====================================================================\r
+\r
+/**\r
+ * Set the VCore to a new level\r
+ *\r
+ * \param level       PMM level ID\r
+ */\r
+void SetVCore(unsigned char level);\r
+\r
+//====================================================================\r
+\r
+/**\r
+ * Set the VCore to a new higher level\r
+ *\r
+ * \param level       PMM level ID\r
+ */\r
+void SetVCoreUp(unsigned char level);\r
+\r
+//====================================================================\r
+\r
+/**\r
+ * Set the VCore to a new Lower level\r
+ *\r
+ * \param level       PMM level ID\r
+ */\r
+void SetVCoreDown(unsigned char level);\r
+\r
+#endif                          /* __PMM */\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/driver/ports.c b/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/driver/ports.c
new file mode 100755 (executable)
index 0000000..5a83a11
--- /dev/null
@@ -0,0 +1,440 @@
+// *************************************************************************************************\r
+//\r
+//      Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//        Redistribution and use in source and binary forms, with or without\r
+//        modification, are permitted provided that the following conditions\r
+//        are met:\r
+//\r
+//          Redistributions of source code must retain the above copyright\r
+//          notice, this list of conditions and the following disclaimer.\r
+//\r
+//          Redistributions in binary form must reproduce the above copyright\r
+//          notice, this list of conditions and the following disclaimer in the\r
+//          documentation and/or other materials provided with the\r
+//          distribution.\r
+//\r
+//          Neither the name of Texas Instruments Incorporated nor the names of\r
+//          its contributors may be used to endorse or promote products derived\r
+//          from this software without specific prior written permission.\r
+//\r
+//        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+// Button entry functions.\r
+// *************************************************************************************************\r
+\r
+// *************************************************************************************************\r
+// Include section\r
+\r
+// system\r
+#include "project.h"\r
+\r
+// driver\r
+#include "ports.h"\r
+#include "buzzer.h"\r
+#include "vti_as.h"\r
+#include "vti_ps.h"\r
+#include "timer.h"\r
+#include "display.h"\r
+\r
+// logic\r
+#include "clock.h"\r
+#include "rfsimpliciti.h"\r
+#include "simpliciti.h"\r
+#include "altitude.h"\r
+\r
+// *************************************************************************************************\r
+// Prototypes section\r
+void button_repeat_on(u16 msec);\r
+void button_repeat_off(void);\r
+void button_repeat_function(void);\r
+\r
+// *************************************************************************************************\r
+// Defines section\r
+\r
+// Macro for button IRQ\r
+#define IRQ_TRIGGERED(flags, bit)               ((flags & bit) == bit)\r
+\r
+// *************************************************************************************************\r
+// Global Variable section\r
+volatile s_button_flags button;\r
+volatile struct struct_button sButton;\r
+\r
+// *************************************************************************************************\r
+// Extern section\r
+extern void (*fptr_Timer0_A3_function)(void);\r
+\r
+// *************************************************************************************************\r
+// @fn          init_buttons\r
+// @brief       Init and enable button interrupts.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void init_buttons(void)\r
+{\r
+    // Set button ports to input\r
+    BUTTONS_DIR &= ~ALL_BUTTONS;\r
+\r
+    // Enable internal pull-downs\r
+    BUTTONS_OUT &= ~ALL_BUTTONS;\r
+    BUTTONS_REN |= ALL_BUTTONS;\r
+\r
+    // IRQ triggers on rising edge\r
+    BUTTONS_IES &= ~ALL_BUTTONS;\r
+\r
+    // Reset IRQ flags\r
+    BUTTONS_IFG &= ~ALL_BUTTONS;\r
+\r
+    // Enable button interrupts\r
+    BUTTONS_IE |= ALL_BUTTONS;\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          PORT2_ISR\r
+// @brief       Interrupt service routine for\r
+//                                      - buttons\r
+//                                      - acceleration sensor CMA_INT\r
+//                                      - pressure sensor DRDY\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+#pragma vector=PORT2_VECTOR\r
+__interrupt void PORT2_ISR(void)\r
+{\r
+    // Clear flags\r
+    u8 int_flag, int_enable;\r
+    u8 buzzer = 0;\r
+    u8 simpliciti_button_event = 0;\r
+    static u8 simpliciti_button_repeat = 0;\r
+\r
+    // Remember interrupt enable bits\r
+    int_enable = BUTTONS_IE;\r
+\r
+    if ((!button.flag.star_long) && (!button.flag.num_long))\r
+    {\r
+        // Clear button flags\r
+        button.all_flags = 0;\r
+\r
+        // Store valid button interrupt flag\r
+        int_flag = BUTTONS_IFG & int_enable;\r
+\r
+        // ---------------------------------------------------\r
+        // While SimpliciTI stack is active, buttons behave differently:\r
+        //  - Store button events in SimpliciTI packet data\r
+        //  - Exit SimpliciTI when button DOWN was pressed\r
+        if (is_rf())\r
+        {\r
+            // Erase previous button press after a number of resends (increase number if link\r
+            // quality is low)\r
+            // This will create a series of packets containing the same button press\r
+            // Necessary because we have no acknowledge\r
+            // Filtering (edge detection) will be done by receiver software\r
+            if (simpliciti_button_repeat++ > 6)\r
+            {\r
+                simpliciti_data[0] &= ~0xF0;\r
+                simpliciti_button_repeat = 0;\r
+            }\r
+\r
+            if ((int_flag & BUTTON_STAR_PIN) == BUTTON_STAR_PIN)\r
+            {\r
+                simpliciti_data[0] |= SIMPLICITI_BUTTON_STAR;\r
+                simpliciti_button_event = 1;\r
+            }\r
+            else if ((int_flag & BUTTON_NUM_PIN) == BUTTON_NUM_PIN)\r
+            {\r
+                simpliciti_data[0] |= SIMPLICITI_BUTTON_NUM;\r
+                simpliciti_button_event = 1;\r
+            }\r
+            else if ((int_flag & BUTTON_UP_PIN) == BUTTON_UP_PIN)\r
+            {\r
+                simpliciti_data[0] |= SIMPLICITI_BUTTON_UP;\r
+                simpliciti_button_event = 1;\r
+            }\r
+            else if ((int_flag & BUTTON_DOWN_PIN) == BUTTON_DOWN_PIN)\r
+            {\r
+                simpliciti_flag |= SIMPLICITI_TRIGGER_STOP;\r
+            }\r
+\r
+            // Trigger packet sending inside SimpliciTI stack\r
+            if (simpliciti_button_event)\r
+                simpliciti_flag |= SIMPLICITI_TRIGGER_SEND_DATA;\r
+        }\r
+        else                    // Normal operation\r
+        {\r
+            // Debounce buttons\r
+            if ((int_flag & ALL_BUTTONS) != 0)\r
+            {\r
+                // Disable PORT2 IRQ\r
+                __disable_interrupt();\r
+                BUTTONS_IE = 0x00;\r
+                __enable_interrupt();\r
+\r
+                // Debounce delay 1\r
+                Timer0_A4_Delay(CONV_MS_TO_TICKS(BUTTONS_DEBOUNCE_TIME_IN));\r
+\r
+                // Reset inactivity detection\r
+                sTime.last_activity = sTime.system_time;\r
+            }\r
+\r
+            // ---------------------------------------------------\r
+            // STAR button IRQ\r
+            if (IRQ_TRIGGERED(int_flag, BUTTON_STAR_PIN))\r
+            {\r
+                // Filter bouncing noise\r
+                if (BUTTON_STAR_IS_PRESSED)\r
+                {\r
+                    button.flag.star = 1;\r
+                    button.flag.star_not_long = 0;\r
+                    // Generate button click\r
+                    buzzer = 1;\r
+                }\r
+                else if ((BUTTONS_IES & BUTTON_STAR_PIN) == BUTTON_STAR_PIN)\r
+                {\r
+                    button.flag.star = 1;\r
+                    button.flag.star_not_long = 0;\r
+                    BUTTONS_IES &= ~BUTTON_STAR_PIN;\r
+                }\r
+            }\r
+            // ---------------------------------------------------\r
+            // NUM button IRQ\r
+            else if (IRQ_TRIGGERED(int_flag, BUTTON_NUM_PIN))\r
+            {\r
+                // Filter bouncing noise\r
+                if (BUTTON_NUM_IS_PRESSED)\r
+                {\r
+                    button.flag.num = 1;\r
+                    button.flag.num_not_long = 0;\r
+                    // Generate button click\r
+                    buzzer = 1;\r
+                }\r
+                else if ((BUTTONS_IES & BUTTON_NUM_PIN) == BUTTON_NUM_PIN)\r
+                {\r
+                    button.flag.num = 1;\r
+                    button.flag.num_not_long = 0;\r
+                    BUTTONS_IES &= ~BUTTON_NUM_PIN;\r
+                }\r
+            }\r
+            // ---------------------------------------------------\r
+            // UP button IRQ\r
+            else if (IRQ_TRIGGERED(int_flag, BUTTON_UP_PIN))\r
+            {\r
+                // Filter bouncing noise\r
+                if (BUTTON_UP_IS_PRESSED)\r
+                {\r
+                    button.flag.up = 1;\r
+\r
+                    // Generate button click\r
+                    buzzer = 1;\r
+                }\r
+            }\r
+            // ---------------------------------------------------\r
+            // DOWN button IRQ\r
+            else if (IRQ_TRIGGERED(int_flag, BUTTON_DOWN_PIN))\r
+            {\r
+                // Filter bouncing noise\r
+                if (BUTTON_DOWN_IS_PRESSED)\r
+                {\r
+                    button.flag.down = 1;\r
+\r
+                    // Generate button click\r
+                    buzzer = 1;\r
+                }\r
+            }\r
+            // ---------------------------------------------------\r
+            // B/L button IRQ\r
+            else if (IRQ_TRIGGERED(int_flag, BUTTON_BACKLIGHT_PIN))\r
+            {\r
+                // Filter bouncing noise\r
+                if (BUTTON_BACKLIGHT_IS_PRESSED)\r
+                {\r
+                    sButton.backlight_status = 1;\r
+                    sButton.backlight_timeout = 0;\r
+                    P2OUT |= BUTTON_BACKLIGHT_PIN;\r
+                    P2DIR |= BUTTON_BACKLIGHT_PIN;\r
+                }\r
+            }\r
+        }\r
+\r
+        // Trying to lock/unlock buttons?\r
+        if (button.flag.num && button.flag.down)\r
+        {\r
+            // No buzzer output\r
+            buzzer = 0;\r
+            button.all_flags = 0;\r
+        }\r
+\r
+        // Generate button click when button was activated\r
+        if (buzzer)\r
+        {\r
+\r
+            if (!sys.flag.up_down_repeat_enabled)\r
+            {\r
+                start_buzzer(1, CONV_MS_TO_TICKS(20), CONV_MS_TO_TICKS(150));\r
+            }\r
+\r
+            // Debounce delay 2\r
+            Timer0_A4_Delay(CONV_MS_TO_TICKS(BUTTONS_DEBOUNCE_TIME_OUT));\r
+        }\r
+\r
+        // ---------------------------------------------------\r
+        // Acceleration sensor IRQ\r
+        if (IRQ_TRIGGERED(int_flag, AS_INT_PIN))\r
+        {\r
+            // Get data from sensor\r
+            request.flag.acceleration_measurement = 1;\r
+        }\r
+\r
+        // ---------------------------------------------------\r
+        // Pressure sensor IRQ\r
+        if (IRQ_TRIGGERED(int_flag, PS_INT_PIN))\r
+        {\r
+            // Get data from sensor\r
+            request.flag.altitude_measurement = 1;\r
+        }\r
+\r
+        // ---------------------------------------------------\r
+        // Safe long button event detection\r
+        if (button.flag.star || button.flag.num)\r
+        {\r
+            // Additional debounce delay to enable safe high detection - 50ms\r
+            Timer0_A4_Delay(CONV_MS_TO_TICKS(BUTTONS_DEBOUNCE_TIME_LEFT));\r
+\r
+            // Check if this button event is short enough\r
+            if (BUTTON_STAR_IS_PRESSED)\r
+            {\r
+                // Change interrupt edge to detect button release\r
+                BUTTONS_IES |= BUTTON_STAR_PIN;\r
+                button.flag.star = 0;\r
+                // This flag is used to detect if the user released the button before the\r
+                // time for a long button press (3s)\r
+                button.flag.star_not_long = 1;\r
+            }\r
+            if (BUTTON_NUM_IS_PRESSED)\r
+            {\r
+                // Change interrupt edge to detect button release\r
+                BUTTONS_IES |= BUTTON_NUM_PIN;\r
+                button.flag.num = 0;\r
+                // This flag is used to detect if the user released the button before the\r
+                // time for a long button press (3s)\r
+                button.flag.num_not_long = 1;\r
+            }\r
+        }\r
+    }\r
+    // Reenable PORT2 IRQ\r
+    __disable_interrupt();\r
+    BUTTONS_IFG = 0x00;\r
+    BUTTONS_IE = int_enable;\r
+    __enable_interrupt();\r
+\r
+    // Exit from LPM3/LPM4 on RETI\r
+    __bic_SR_register_on_exit(LPM4_bits);\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          button_repeat_on\r
+// @brief       Start button auto repeat timer.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void button_repeat_on(u16 msec)\r
+{\r
+    // Set button repeat flag\r
+    sys.flag.up_down_repeat_enabled = 1;\r
+\r
+    // Set Timer0_A3 function pointer to button repeat function\r
+    fptr_Timer0_A3_function = button_repeat_function;\r
+\r
+    // Timer0_A3 IRQ triggers every 200ms\r
+    Timer0_A3_Start(CONV_MS_TO_TICKS(msec));\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          button_repeat_off\r
+// @brief       Stop button auto repeat timer.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void button_repeat_off(void)\r
+{\r
+    // Clear button repeat flag\r
+    sys.flag.up_down_repeat_enabled = 0;\r
+\r
+    // Timer0_A3 IRQ repeats with 4Hz\r
+    Timer0_A3_Stop();\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          button_repeat_function\r
+// @brief       Check at regular intervals if button is pushed continuously\r
+//                              and trigger virtual button event.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void button_repeat_function(void)\r
+{\r
+    static u8 start_delay = 10; // Wait for 2 seconds before starting auto up/down\r
+    u8 repeat = 0;\r
+\r
+    // If buttons UP or DOWN are continuously high, repeatedly set button flag\r
+    if (BUTTON_UP_IS_PRESSED)\r
+    {\r
+        if (start_delay == 0)\r
+        {\r
+            // Generate a virtual button event\r
+            button.flag.up = 1;\r
+            repeat = 1;\r
+        }\r
+        else\r
+        {\r
+            start_delay--;\r
+        }\r
+    }\r
+    else if (BUTTON_DOWN_IS_PRESSED)\r
+    {\r
+        if (start_delay == 0)\r
+        {\r
+            // Generate a virtual button event\r
+            button.flag.down = 1;\r
+            repeat = 1;\r
+        }\r
+        else\r
+        {\r
+            start_delay--;\r
+        }\r
+    }\r
+    else\r
+    {\r
+        // Reset repeat counter\r
+        sButton.repeats = 0;\r
+        start_delay = 10;\r
+\r
+        // Enable blinking\r
+        start_blink();\r
+    }\r
+\r
+    // If virtual button event is generated, stop blinking and reset timeout counter\r
+    if (repeat)\r
+    {\r
+        // Increase repeat counter\r
+        sButton.repeats++;\r
+\r
+        // Reset inactivity detection counter\r
+        sTime.last_activity = sTime.system_time;\r
+\r
+        // Disable blinking\r
+        stop_blink();\r
+    }\r
+}\r
+\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/driver/ports.h b/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/driver/ports.h
new file mode 100755 (executable)
index 0000000..96c3fc2
--- /dev/null
@@ -0,0 +1,130 @@
+// *************************************************************************************************\r
+//\r
+//      Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//        Redistribution and use in source and binary forms, with or without\r
+//        modification, are permitted provided that the following conditions\r
+//        are met:\r
+//\r
+//          Redistributions of source code must retain the above copyright\r
+//          notice, this list of conditions and the following disclaimer.\r
+//\r
+//          Redistributions in binary form must reproduce the above copyright\r
+//          notice, this list of conditions and the following disclaimer in the\r
+//          documentation and/or other materials provided with the\r
+//          distribution.\r
+//\r
+//          Neither the name of Texas Instruments Incorporated nor the names of\r
+//          its contributors may be used to endorse or promote products derived\r
+//          from this software without specific prior written permission.\r
+//\r
+//        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+\r
+#ifndef PORTS_H_\r
+#define PORTS_H_\r
+\r
+// *************************************************************************************************\r
+// Defines section\r
+\r
+// Port, pins and interrupt resources for buttons\r
+#define BUTTONS_IN              (P2IN)\r
+#define BUTTONS_OUT                             (P2OUT)\r
+#define BUTTONS_DIR             (P2DIR)\r
+#define BUTTONS_REN                             (P2REN)\r
+#define BUTTONS_IE              (P2IE)\r
+#define BUTTONS_IES             (P2IES)\r
+#define BUTTONS_IFG             (P2IFG)\r
+#define BUTTONS_IRQ_VECT2       (PORT2_VECTOR)\r
+\r
+// Button ports\r
+#define BUTTON_STAR_PIN         (BIT2)\r
+#define BUTTON_NUM_PIN          (BIT1)\r
+#define BUTTON_UP_PIN           (BIT4)\r
+#define BUTTON_DOWN_PIN         (BIT0)\r
+#define BUTTON_BACKLIGHT_PIN    (BIT3)\r
+#define ALL_BUTTONS                             (BUTTON_STAR_PIN + BUTTON_NUM_PIN + BUTTON_UP_PIN + \\r
+                                                 BUTTON_DOWN_PIN + BUTTON_BACKLIGHT_PIN)\r
+\r
+// Macros for button press detection\r
+#define BUTTON_STAR_IS_PRESSED          ((BUTTONS_IN & BUTTON_STAR_PIN) == BUTTON_STAR_PIN)\r
+#define BUTTON_NUM_IS_PRESSED           ((BUTTONS_IN & BUTTON_NUM_PIN) == BUTTON_NUM_PIN)\r
+#define BUTTON_UP_IS_PRESSED            ((BUTTONS_IN & BUTTON_UP_PIN) == BUTTON_UP_PIN)\r
+#define BUTTON_DOWN_IS_PRESSED          ((BUTTONS_IN & BUTTON_DOWN_PIN) == BUTTON_DOWN_PIN)\r
+#define BUTTON_BACKLIGHT_IS_PRESSED     ((BUTTONS_IN & BUTTON_BACKLIGHT_PIN) == \\r
+                                         BUTTON_BACKLIGHT_PIN)\r
+#define NO_BUTTON_IS_PRESSED            ((BUTTONS_IN & ALL_BUTTONS) == 0)\r
+\r
+// Macros for button release detection\r
+#define BUTTON_STAR_IS_RELEASED                 ((BUTTONS_IN & BUTTON_STAR_PIN) == 0)\r
+#define BUTTON_NUM_IS_RELEASED                  ((BUTTONS_IN & BUTTON_NUM_PIN) == 0)\r
+#define BUTTON_UP_IS_RELEASED                   (BUTTONS_IN & BUTTON_UP_PIN) == 0)\r
+#define BUTTON_DOWN_IS_RELEASED                 ((BUTTONS_IN & BUTTON_DOWN_PIN) == 0)\r
+#define BUTTON_BACKLIGHT_IS_RELEASED    ((BUTTONS_IN & BUTTON_BACKLIGHT_PIN) == 0)\r
+\r
+// Button debounce time (msec)\r
+#define BUTTONS_DEBOUNCE_TIME_IN        (5u)\r
+#define BUTTONS_DEBOUNCE_TIME_OUT       (250u)\r
+#define BUTTONS_DEBOUNCE_TIME_LEFT      (50u)\r
+\r
+// Detect if STAR / NUM button is held low continuously\r
+#define LEFT_BUTTON_LONG_TIME           (2u)\r
+\r
+// Backlight time (sec)\r
+#define BACKLIGHT_TIME_ON                       (3u)\r
+\r
+// Leave set_value() function after some seconds of user inactivity\r
+#define INACTIVITY_TIME                 (30u)\r
+\r
+// Set of button flags\r
+typedef union\r
+{\r
+    struct\r
+    {\r
+        // Manual button events\r
+        u16 star              : 1; // Short STAR button press\r
+        u16 num               : 1; // Short NUM button press\r
+        u16 up                : 1; // Short UP button press\r
+        u16 down              : 1; // Short DOWN button press\r
+        u16 backlight         : 1; // Short BACKLIGHT button press\r
+        u16 star_long         : 1; // Long STAR button press\r
+        u16 num_long          : 1; // Long NUM button press\r
+        u16 star_not_long     : 1; // Between short and long STAR button press\r
+        u16 num_not_long      : 1; // Between short and long NUM button press\r
+    } flag;\r
+    u16 all_flags;                 // Shortcut to all display flags (for reset)\r
+} s_button_flags;\r
+extern volatile s_button_flags button;\r
+\r
+struct struct_button\r
+{\r
+    u8 star_timeout;               // This variable is incremented once per second if STAR button is\r
+                                   // still pressed\r
+    u8 num_timeout;                // This variable is incremented once per second if NUM button is\r
+                                   // still pressed\r
+    u8 backlight_timeout;          // controls the timeout for the backlight\r
+    u8 backlight_status;           // 1 case backlight is on\r
+    s16 repeats;\r
+};\r
+extern volatile struct struct_button sButton;\r
+\r
+// *************************************************************************************************\r
+// Extern section\r
+extern void button_repeat_on(u16 msec);\r
+extern void button_repeat_off(void);\r
+extern void button_repeat_function(void);\r
+extern void init_buttons(void);\r
+\r
+#endif                             /*PORTS_H_ */\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/driver/radio.c b/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/driver/radio.c
new file mode 100755 (executable)
index 0000000..8e5a36b
--- /dev/null
@@ -0,0 +1,187 @@
+// *************************************************************************************************\r
+//\r
+//      Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//        Redistribution and use in source and binary forms, with or without\r
+//        modification, are permitted provided that the following conditions\r
+//        are met:\r
+//\r
+//          Redistributions of source code must retain the above copyright\r
+//          notice, this list of conditions and the following disclaimer.\r
+//\r
+//          Redistributions in binary form must reproduce the above copyright\r
+//          notice, this list of conditions and the following disclaimer in the\r
+//          documentation and/or other materials provided with the\r
+//          distribution.\r
+//\r
+//          Neither the name of Texas Instruments Incorporated nor the names of\r
+//          its contributors may be used to endorse or promote products derived\r
+//          from this software without specific prior written permission.\r
+//\r
+//        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+// Radio core access functions. Taken from TI reference code for CC430.\r
+// *************************************************************************************************\r
+\r
+// system\r
+#include "project.h"\r
+\r
+// driver\r
+#include "rf1a.h"\r
+#include "timer.h"\r
+\r
+// logic\r
+#include "rfsimpliciti.h"\r
+#include "bluerobin.h"\r
+\r
+// *************************************************************************************************\r
+// Extern section\r
+\r
+// SimpliciTI CC430 radio ISR - located in SimpliciTi library\r
+extern void MRFI_RadioIsr(void);\r
+\r
+// BlueRobin CC430 radio ISR - located in BlueRobin library\r
+extern void BlueRobin_RadioISR_v(void);\r
+\r
+// *************************************************************************************************\r
+// @fn          radio_reset\r
+// @brief       Reset radio core.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void radio_reset(void)\r
+{\r
+    volatile u16 i;\r
+    u8 x;\r
+\r
+    // Reset radio core\r
+    Strobe(RF_SRES);\r
+    // Wait before checking IDLE\r
+    for (i = 0; i < 100; i++) ;\r
+    do\r
+    {\r
+        x = Strobe(RF_SIDLE);\r
+    }\r
+    while ((x & 0x70) != 0x00);\r
+\r
+    // Clear radio error register\r
+    RF1AIFERR = 0;\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          radio_powerdown\r
+// @brief       Put radio to SLEEP mode.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void radio_powerdown(void)\r
+{\r
+    /* Chip bug: Radio does not come out of this SLEEP when put to sleep\r
+     * using the SPWD cmd. However, it does wakes up if SXOFF was used to\r
+     * put it to sleep.\r
+     */\r
+    // Powerdown radio\r
+    Strobe(RF_SIDLE);\r
+    Strobe(RF_SPWD);\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          radio_sxoff\r
+// @brief       Put radio to SLEEP mode (XTAL off only).\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void radio_sxoff(void)\r
+{\r
+    /* Chip bug: Radio does not come out of this SLEEP when put to sleep\r
+     * using the SPWD cmd. However, it does wakes up if SXOFF was used to\r
+     * put it to sleep.\r
+     */\r
+    // Powerdown radio\r
+    Strobe(RF_SIDLE);\r
+    Strobe(RF_SXOFF);\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          open_radio\r
+// @brief       Prepare radio for RF communication.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void open_radio(void)\r
+{\r
+    // Reset radio core\r
+    radio_reset();\r
+\r
+    // Enable radio IRQ\r
+    RF1AIFG &= ~BIT4;           // Clear a pending interrupt\r
+    RF1AIE |= BIT4;             // Enable the interrupt\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          close_radio\r
+// @brief       Shutdown radio for RF communication.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void close_radio(void)\r
+{\r
+    // Disable radio IRQ\r
+    RF1AIFG = 0;\r
+    RF1AIE = 0;\r
+\r
+    // Reset radio core\r
+    radio_reset();\r
+\r
+    // Put radio to sleep\r
+    radio_powerdown();\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          GDOx_ISR\r
+// @brief       GDO0/2 ISR to detect received packet.\r
+//                              In BlueRobin mode:  capture packet end time and decode received\r
+// packet\r
+//                              In SimpliciTI mode: go to SimpliciTI handler\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+#pragma vector=CC1101_VECTOR\r
+__interrupt void radio_ISR(void)\r
+{\r
+    u8 rf1aivec = RF1AIV;\r
+\r
+    // Forward to SimpliciTI interrupt service routine\r
+    if (is_rf())\r
+    {\r
+        MRFI_RadioIsr();\r
+    }\r
+    else                                  // BlueRobin packet end interrupt service routine\r
+    {\r
+        if (rf1aivec == RF1AIV_RFIFG9)\r
+        {\r
+            if ((sBlueRobin.state == BLUEROBIN_SEARCHING) ||\r
+                (sBlueRobin.state == BLUEROBIN_CONNECTED))\r
+            {\r
+                BlueRobin_RadioISR_v();\r
+            }\r
+        }\r
+        else if (rf1aivec == RF1AIV_NONE) // RF1A interface interrupt (error etc.)\r
+        {\r
+            asm ("     nop"); // break here\r
+        }\r
+    }\r
+}\r
+\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/driver/radio.h b/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/driver/radio.h
new file mode 100755 (executable)
index 0000000..f4c1bb9
--- /dev/null
@@ -0,0 +1,48 @@
+// *************************************************************************************************\r
+//\r
+//      Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//        Redistribution and use in source and binary forms, with or without\r
+//        modification, are permitted provided that the following conditions\r
+//        are met:\r
+//\r
+//          Redistributions of source code must retain the above copyright\r
+//          notice, this list of conditions and the following disclaimer.\r
+//\r
+//          Redistributions in binary form must reproduce the above copyright\r
+//          notice, this list of conditions and the following disclaimer in the\r
+//          documentation and/or other materials provided with the\r
+//          distribution.\r
+//\r
+//          Neither the name of Texas Instruments Incorporated nor the names of\r
+//          its contributors may be used to endorse or promote products derived\r
+//          from this software without specific prior written permission.\r
+//\r
+//        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+\r
+#ifndef RADIO_H_\r
+#define RADIO_H_\r
+\r
+extern void radio_reset(void);\r
+extern void radio_powerdown(void);\r
+extern void radio_sxoff(void);\r
+extern void radio_idle(void);\r
+extern void open_radio(void);\r
+extern void close_radio(void);\r
+extern void pmm_set_high_current_mode(void);\r
+extern void pmm_set_low_current_mode(void);\r
+\r
+#endif                          /*RADIO_H_ */\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/driver/rf1a.c b/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/driver/rf1a.c
new file mode 100755 (executable)
index 0000000..9f3b5be
--- /dev/null
@@ -0,0 +1,233 @@
+// *************************************************************************************************\r
+//\r
+// Actual revision: $Revision: $\r
+// Revision label:  $Name: $\r
+// Revision state:  $State: $\r
+//\r
+// *************************************************************************************************\r
+// Radio core access functions. Taken from TI reference code for CC430.\r
+// *************************************************************************************************\r
+\r
+// *************************************************************************************************\r
+// Include section\r
+\r
+// system\r
+#include <project.h>\r
+\r
+// driver\r
+#include "rf1a.h"\r
+\r
+// *************************************************************************************************\r
+// Global section\r
+\r
+// *************************************************************************************************\r
+// Define section\r
+#define st(x)                                           do { x } while (__LINE__ == -1)\r
+#define ENTER_CRITICAL_SECTION(x)       st(x = __get_interrupt_state(); __disable_interrupt(); )\r
+#define EXIT_CRITICAL_SECTION(x)    __set_interrupt_state(x)\r
+\r
+// *************************************************************************************************\r
+// @fn          Strobe\r
+// @brief       Send command to radio.\r
+// @param       unsigned char strobe    Command to radio\r
+// @return      statusByte                              Radio core status\r
+// *************************************************************************************************\r
+unsigned char Strobe(unsigned char strobe)\r
+{\r
+    u8 statusByte = 0;\r
+    u16 int_state, gdo_state;\r
+\r
+    // Check for valid strobe command\r
+    if ((strobe == 0xBD) || ((strobe > RF_SRES) && (strobe < RF_SNOP)))\r
+    {\r
+        ENTER_CRITICAL_SECTION(int_state);\r
+\r
+        // Clear the Status read flag\r
+        RF1AIFCTL1 &= ~(RFSTATIFG);\r
+\r
+        // Wait for radio to be ready for next instruction\r
+        while (!(RF1AIFCTL1 & RFINSTRIFG)) ;\r
+\r
+        // Write the strobe instruction\r
+        if ((strobe > RF_SRES) && (strobe < RF_SNOP))\r
+        {\r
+\r
+            gdo_state = ReadSingleReg(IOCFG2);         // buffer IOCFG2 state\r
+            WriteSingleReg(IOCFG2, 0x29);              // c-ready to GDO2\r
+\r
+            RF1AINSTRB = strobe;\r
+            if ((RF1AIN & 0x04) == 0x04)               // chip at sleep mode\r
+            {\r
+                if ((strobe == RF_SXOFF) || (strobe == RF_SPWD) || (strobe == RF_SWOR))\r
+                {\r
+                }\r
+                else\r
+                {\r
+                    while ((RF1AIN & 0x04) == 0x04) ;  // c-ready ?\r
+                    __delay_cycles(9800);              // Delay for ~810usec at 12MHz CPU clock\r
+                }\r
+            }\r
+            WriteSingleReg(IOCFG2, gdo_state);         // restore IOCFG2 setting\r
+        }\r
+        else                                           // chip active mode\r
+        {\r
+            RF1AINSTRB = strobe;\r
+        }\r
+        statusByte = RF1ASTATB;\r
+        while (!(RF1AIFCTL1 & RFSTATIFG)) ;\r
+        EXIT_CRITICAL_SECTION(int_state);\r
+    }\r
+    return statusByte;\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          ResetRadioCore\r
+// @brief       Software reset radio core.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void ResetRadioCore(void)\r
+{\r
+    Strobe(RF_SRES);            // Reset the Radio Core\r
+    Strobe(RF_SNOP);            // Reset Radio Pointer\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          ReadSingleReg\r
+// @brief       Read byte from register.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+unsigned char ReadSingleReg(unsigned char addr)\r
+{\r
+    unsigned char x;\r
+    u16 int_state;\r
+\r
+    ENTER_CRITICAL_SECTION(int_state);\r
+\r
+    RF1AINSTR1B = (addr | RF_REGRD);\r
+    x = RF1ADOUT1B;\r
+\r
+    EXIT_CRITICAL_SECTION(int_state);\r
+\r
+    return x;\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          WriteSingleReg\r
+// @brief       Write byte to register.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void WriteSingleReg(unsigned char addr, unsigned char value)\r
+{\r
+    volatile unsigned int i;\r
+    u16 int_state;\r
+\r
+    ENTER_CRITICAL_SECTION(int_state);\r
+\r
+    while (!(RF1AIFCTL1 & RFINSTRIFG)) ;           // Wait for the Radio to be ready for the next\r
+                                                   // instruction\r
+\r
+    RF1AINSTRW = ((addr | RF_REGWR) << 8) + value; // Send address + Instruction\r
+    while (!(RFDINIFG & RF1AIFCTL1)) ;\r
+\r
+    i = RF1ADOUTB;                                 // Reset RFDOUTIFG flag which contains status\r
+                                                   // byte\r
+\r
+    EXIT_CRITICAL_SECTION(int_state);\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          ReadBurstReg\r
+// @brief       Read sequence of bytes from register.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void ReadBurstReg(unsigned char addr, unsigned char *buffer, unsigned char count)\r
+{\r
+    unsigned int i;\r
+    u16 int_state;\r
+\r
+    ENTER_CRITICAL_SECTION(int_state);\r
+\r
+    while (!(RF1AIFCTL1 & RFINSTRIFG)) ;     // Wait for the Radio to be ready for next instruction\r
+    RF1AINSTR1B = (addr | RF_REGRD);         // Send address + Instruction\r
+\r
+    for (i = 0; i < (count - 1); i++)\r
+    {\r
+        while (!(RFDOUTIFG & RF1AIFCTL1)) ;  // Wait for the Radio Core to update the RF1ADOUTB reg\r
+        buffer[i] = RF1ADOUT1B;              // Read DOUT from Radio Core + clears RFDOUTIFG\r
+        // Also initiates auo-read for next DOUT byte\r
+    }\r
+    buffer[count - 1] = RF1ADOUT0B;          // Store the last DOUT from Radio Core\r
+\r
+    EXIT_CRITICAL_SECTION(int_state);\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          WriteBurstReg\r
+// @brief       Write sequence of bytes to register.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void WriteBurstReg(unsigned char addr, unsigned char *buffer, unsigned char count)\r
+{\r
+    // Write Burst works wordwise not bytewise - bug known already\r
+    unsigned char i;\r
+    u16 int_state;\r
+\r
+    ENTER_CRITICAL_SECTION(int_state);\r
+\r
+    while (!(RF1AIFCTL1 & RFINSTRIFG)) ;               // Wait for the Radio to be ready for next\r
+                                                       // instruction\r
+    RF1AINSTRW = ((addr | RF_REGWR) << 8) + buffer[0]; // Send address + Instruction\r
+\r
+    for (i = 1; i < count; i++)\r
+    {\r
+        RF1ADINB = buffer[i];                          // Send data\r
+        while (!(RFDINIFG & RF1AIFCTL1)) ;             // Wait for TX to finish\r
+    }\r
+    i = RF1ADOUTB;                                     // Reset RFDOUTIFG flag which contains status\r
+                                                       // byte\r
+\r
+    EXIT_CRITICAL_SECTION(int_state);\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          WritePATable\r
+// @brief       Write data to power table\r
+// @param       unsigned char value             Value to write\r
+// @return      none\r
+// *************************************************************************************************\r
+void WritePATable(unsigned char value)\r
+{\r
+    unsigned char readbackPATableValue = 0;\r
+    u16 int_state;\r
+\r
+    ENTER_CRITICAL_SECTION(int_state);\r
+\r
+    while (readbackPATableValue != value)\r
+    {\r
+        while (!(RF1AIFCTL1 & RFINSTRIFG)) ;\r
+        RF1AINSTRW = 0x7E00 + value; // PA Table write (burst)\r
+\r
+        while (!(RF1AIFCTL1 & RFINSTRIFG)) ;\r
+        RF1AINSTRB = RF_SNOP;        // reset pointer\r
+\r
+        while (!(RF1AIFCTL1 & RFINSTRIFG)) ;\r
+        RF1AINSTRB = 0xFE;           // PA Table read (burst)\r
+\r
+        while (!(RF1AIFCTL1 & RFDINIFG)) ;\r
+        RF1ADINB = 0x00;             //dummy write\r
+\r
+        while (!(RF1AIFCTL1 & RFDOUTIFG)) ;\r
+        readbackPATableValue = RF1ADOUT0B;\r
+\r
+        while (!(RF1AIFCTL1 & RFINSTRIFG)) ;\r
+        RF1AINSTRB = RF_SNOP;\r
+    }\r
+\r
+    EXIT_CRITICAL_SECTION(int_state);\r
+}\r
+\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/driver/rf1a.h b/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/driver/rf1a.h
new file mode 100755 (executable)
index 0000000..f1acd1c
--- /dev/null
@@ -0,0 +1,20 @@
+// *************************************************************************************************\r
+//\r
+// Actual revision: $Revision: $\r
+// Revision label:  $Name: $\r
+// Revision state:  $State: $\r
+//\r
+// *************************************************************************************************\r
+// Radio core access functions. Taken from TI reference code for CC430.\r
+// *************************************************************************************************\r
+\r
+// *************************************************************************************************\r
+// Prototype section\r
+unsigned char Strobe(unsigned char strobe);\r
+unsigned char ReadSingleReg(unsigned char addr);\r
+void WriteSingleReg(unsigned char addr, unsigned char value);\r
+void ReadBurstReg(unsigned char addr, unsigned char *buffer, unsigned char count);\r
+void WriteBurstReg(unsigned char addr, unsigned char *buffer, unsigned char count);\r
+void ResetRadioCore(void);\r
+void WritePATable(unsigned char value);\r
+void WaitForXT2(void);\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/driver/timer.c b/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/driver/timer.c
new file mode 100755 (executable)
index 0000000..428bb68
--- /dev/null
@@ -0,0 +1,485 @@
+// *************************************************************************************************\r
+//\r
+//      Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//        Redistribution and use in source and binary forms, with or without\r
+//        modification, are permitted provided that the following conditions\r
+//        are met:\r
+//\r
+//          Redistributions of source code must retain the above copyright\r
+//          notice, this list of conditions and the following disclaimer.\r
+//\r
+//          Redistributions in binary form must reproduce the above copyright\r
+//          notice, this list of conditions and the following disclaimer in the\r
+//          documentation and/or other materials provided with the\r
+//          distribution.\r
+//\r
+//          Neither the name of Texas Instruments Incorporated nor the names of\r
+//          its contributors may be used to endorse or promote products derived\r
+//          from this software without specific prior written permission.\r
+//\r
+//        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+// Timer service routines.\r
+// *************************************************************************************************\r
+\r
+// *************************************************************************************************\r
+// Include section\r
+\r
+// system\r
+#include "project.h"\r
+\r
+// driver\r
+#include "timer.h"\r
+#include "ports.h"\r
+#include "buzzer.h"\r
+#include "vti_ps.h"\r
+#include "vti_as.h"\r
+\r
+// logic\r
+#include "clock.h"\r
+#include "battery.h"\r
+#include "altitude.h"\r
+#include "display.h"\r
+#include "rfsimpliciti.h"\r
+#include "simpliciti.h"\r
+#include "acceleration.h"\r
+#include "bluerobin.h"\r
+#include "temperature.h"\r
+#include "datalog.h"\r
+\r
+// *************************************************************************************************\r
+// Prototypes section\r
+void Timer0_Init(void);\r
+void Timer0_Stop(void);\r
+void Timer0_A1_Start(void);\r
+void Timer0_A1_Stop(void);\r
+void Timer0_A3_Start(u16 ticks);\r
+void Timer0_A3_Stop(void);\r
+void Timer0_A4_Delay(u16 ticks);\r
+\r
+void (*fptr_Timer0_A3_function)(void);\r
+\r
+// *************************************************************************************************\r
+// Defines section\r
+\r
+// *************************************************************************************************\r
+// Global Variable section\r
+struct timer sTimer;\r
+\r
+// *************************************************************************************************\r
+// Extern section\r
+extern void BRRX_TimerTask_v(void);\r
+extern void to_lpm(void);\r
+\r
+// *************************************************************************************************\r
+// @fn          Timer0_Init\r
+// @brief       Set Timer0 to a period of 1 or 2 sec. IRQ TACCR0 is asserted when timer overflows.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void Timer0_Init(void)\r
+{\r
+    // Set interrupt frequency to 1Hz\r
+    TA0CCR0 = 32768 - 1;\r
+\r
+    // Enable timer interrupt\r
+    TA0CCTL0 |= CCIE;\r
+\r
+    // Clear and start timer now\r
+    // Continuous mode: Count to 0xFFFF and restart from 0 again - 1sec timing will be generated by\r
+    // ISR\r
+    TA0CTL |= TASSEL0 + MC1 + TACLR;\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          Timer0_Start\r
+// @brief       Start Timer0.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void Timer0_Start(void)\r
+{\r
+    // Start Timer0 in continuous mode\r
+    TA0CTL |= MC_2;\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          Timer0_Stop\r
+// @brief       Stop and reset Timer0.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void Timer0_Stop(void)\r
+{\r
+    // Stop Timer0\r
+    TA0CTL &= ~MC_2;\r
+\r
+    // Set Timer0 count register to 0x0000\r
+    TA0R = 0;\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          Timer0_A3_Start\r
+// @brief       Trigger IRQ every "ticks" microseconds\r
+// @param       ticks (1 tick = 1/32768 sec)\r
+// @return      none\r
+// *************************************************************************************************\r
+void Timer0_A3_Start(u16 ticks)\r
+{\r
+    u16 value = 0;\r
+\r
+    // Store timer ticks in global variable\r
+    sTimer.timer0_A3_ticks = ticks;\r
+\r
+    // Delay based on current counter value\r
+    // To make sure this value is correctly read\r
+    while (value != TA0R)\r
+        value = TA0R;\r
+    value += ticks;\r
+\r
+    // Update CCR\r
+    TA0CCR3 = value;\r
+\r
+    // Reset IRQ flag\r
+    TA0CCTL3 &= ~CCIFG;\r
+\r
+    // Enable timer interrupt\r
+    TA0CCTL3 |= CCIE;\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          Timer0_A3_Stop\r
+// @brief       Stop Timer0_A3.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void Timer0_A3_Stop(void)\r
+{\r
+    // Clear timer interrupt\r
+    TA0CCTL3 &= ~CCIE;\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          Timer0_A4_Delay\r
+// @brief       Wait for some microseconds\r
+// @param       ticks (1 tick = 1/32768 sec)\r
+// @return      none\r
+// *************************************************************************************************\r
+void Timer0_A4_Delay(u16 ticks)\r
+{\r
+    u16 value = 0;\r
+\r
+    // Exit immediately if Timer0 not running - otherwise we'll get stuck here\r
+    if ((TA0CTL & (BIT4 | BIT5)) == 0)\r
+        return;\r
+\r
+    // Disable timer interrupt\r
+    TA0CCTL4 &= ~CCIE;\r
+\r
+    // Clear delay_over flag\r
+    sys.flag.delay_over = 0;\r
+\r
+    // Add delay to current timer value\r
+    // To make sure this value is correctly read\r
+    while (value != TA0R)\r
+        value = TA0R;\r
+    value += ticks;\r
+\r
+    // Update CCR\r
+    TA0CCR4 = value;\r
+\r
+    // Reset IRQ flag\r
+    TA0CCTL4 &= ~CCIFG;\r
+\r
+    // Enable timer interrupt\r
+    TA0CCTL4 |= CCIE;\r
+\r
+    // Wait for timer IRQ\r
+    while (1)\r
+    {\r
+        // Delay in LPM\r
+        to_lpm();               // will also set GIE again\r
+\r
+#ifdef USE_WATCHDOG\r
+        // Service watchdog\r
+        WDTCTL = WDTPW + WDTIS__512K + WDTSSEL__ACLK + WDTCNTCL;\r
+#endif\r
+\r
+        // Check stop condition\r
+        // disable interrupt to prevent flag's change caused by interrupt methods\r
+        __disable_interrupt();\r
+        if (sys.flag.delay_over)\r
+            break;\r
+    }\r
+    __enable_interrupt();\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          TIMER0_A0_ISR\r
+// @brief       IRQ handler for TIMER0_A0 IRQ\r
+//                              Timer0_A0       1/1sec clock tick                       (serviced by\r
+// function TIMER0_A0_ISR)\r
+//                              Timer0_A1\r
+//                                                               (serviced by function\r
+// TIMER0_A1_5_ISR)\r
+//                              Timer0_A2       1/100 sec Stopwatch                     (serviced by\r
+// function TIMER0_A1_5_ISR)\r
+//                              Timer0_A3       Configurable periodic IRQ       (serviced by\r
+// function TIMER0_A1_5_ISR)\r
+//                              Timer0_A4       One-time delay                          (serviced by\r
+// function TIMER0_A1_5_ISR)\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+#pragma vector = TIMER0_A0_VECTOR\r
+__interrupt void TIMER0_A0_ISR(void)\r
+{\r
+    static u8 button_lock_counter = 0;\r
+\r
+    // Disable IE\r
+    TA0CCTL0 &= ~CCIE;\r
+    // Reset IRQ flag\r
+    TA0CCTL0 &= ~CCIFG;\r
+    // Add 1 sec to TACCR0 register (IRQ will be asserted at 0x7FFF and 0xFFFF = 1 sec intervals)\r
+    TA0CCR0 += 32768;\r
+    // Enable IE\r
+    TA0CCTL0 |= CCIE;\r
+\r
+    // Add 1 second to global time\r
+    clock_tick();\r
+\r
+    // Set clock update flag\r
+    display.flag.update_time = 1;\r
+\r
+    // While BlueRobin searches freeze system state\r
+    if (is_bluerobin_searching())\r
+    {\r
+        // Exit from LPM3 on RETI\r
+        _BIC_SR_IRQ(LPM3_bits);\r
+        return;\r
+    }\r
+\r
+    if ((is_rf()) && (sRFsmpl.mode == SIMPLICITI_SYNC))\r
+    {\r
+        if (sRFsmpl.display_sync_done == 0)\r
+        {\r
+            display_chars(LCD_SEG_L2_5_0, (u8 *) "  SYNC", SEG_ON);\r
+        }\r
+        else\r
+        {\r
+            sRFsmpl.display_sync_done--;\r
+        }\r
+    }\r
+\r
+    // -------------------------------------------------------------------\r
+    // Service modules that require 1/min processing\r
+    if (sTime.drawFlag >= 2)\r
+    {\r
+        // Measure battery voltage\r
+        request.flag.voltage_measurement = 1;\r
+    }\r
+\r
+    // -------------------------------------------------------------------\r
+    // Service active modules that require 1/s processing\r
+\r
+    // Request data logging\r
+    if (is_datalog())\r
+        request.flag.datalog = 1;\r
+\r
+    // Request temperature and pressure measurement\r
+    if (is_altitude_measurement())\r
+        request.flag.altitude_measurement = 1;\r
+\r
+    // Get BlueRobin data from API\r
+    if (is_bluerobin())\r
+        get_bluerobin_data();\r
+\r
+    // If battery is low, count down display counter\r
+    if (sys.flag.low_battery)\r
+    {\r
+        if (sBatt.lobatt_display-- == 0)\r
+        {\r
+            message.flag.prepare = 1;\r
+            message.flag.type_lobatt = 1;\r
+            sBatt.lobatt_display = BATTERY_LOW_MESSAGE_CYCLE;\r
+        }\r
+    }\r
+\r
+    // If a message has to be displayed, set display flag\r
+    if (message.all_flags)\r
+    {\r
+        if (message.flag.prepare)\r
+        {\r
+            message.flag.prepare = 0;\r
+            message.flag.show = 1;\r
+        }\r
+        else if (message.flag.erase)    // message cycle is over, so erase it\r
+        {\r
+            message.flag.erase = 0;\r
+            display.flag.full_update = 1;\r
+        }\r
+    }\r
+\r
+    // -------------------------------------------------------------------\r
+    // Check idle timeout, set timeout flag\r
+    if (sys.flag.idle_timeout_enabled)\r
+    {\r
+        if (sTime.system_time - sTime.last_activity > INACTIVITY_TIME)\r
+            sys.flag.idle_timeout = 1;  //setFlag(sysFlag_g, SYS_TIMEOUT_IDLE);\r
+    }\r
+\r
+    // -------------------------------------------------------------------\r
+    // Turn the Backlight off after timeout\r
+    if (sButton.backlight_status == 1)\r
+    {\r
+        if (sButton.backlight_timeout > BACKLIGHT_TIME_ON)\r
+        {\r
+            //turn off Backlight\r
+            P2OUT &= ~BUTTON_BACKLIGHT_PIN;\r
+            P2DIR &= ~BUTTON_BACKLIGHT_PIN;\r
+            sButton.backlight_timeout = 0;\r
+            sButton.backlight_status = 0;\r
+        }\r
+        else\r
+        {\r
+            sButton.backlight_timeout++;\r
+        }\r
+    }\r
+\r
+    // -------------------------------------------------------------------\r
+    // Detect continuous button high states\r
+\r
+    // Trying to lock/unlock buttons?\r
+    if (BUTTON_NUM_IS_PRESSED && BUTTON_DOWN_IS_PRESSED)\r
+    {\r
+        if (button_lock_counter++ > LEFT_BUTTON_LONG_TIME)\r
+        {\r
+            // Toggle lock / unlock buttons flag\r
+            sys.flag.lock_buttons = ~sys.flag.lock_buttons;\r
+\r
+            // Show "buttons are locked/unlocked" message synchronously with next second tick\r
+            message.flag.prepare = 1;\r
+            if (sys.flag.lock_buttons)\r
+                message.flag.type_locked = 1;\r
+            else\r
+                message.flag.type_unlocked = 1;\r
+\r
+            // Reset button lock counter\r
+            button_lock_counter = 0;\r
+        }\r
+    }\r
+    else                        // Trying to create a long button press?\r
+    {\r
+        // Reset button lock counter\r
+        button_lock_counter = 0;\r
+\r
+        if (BUTTON_STAR_IS_PRESSED)\r
+        {\r
+            sButton.star_timeout++;\r
+\r
+            // Check if button was held low for some seconds\r
+            if (sButton.star_timeout > LEFT_BUTTON_LONG_TIME)\r
+            {\r
+                button.flag.star_long = 1;\r
+                button.flag.star_not_long = 0;\r
+                sButton.star_timeout = 0;\r
+                // Return interrupt edge to normal value\r
+                BUTTONS_IES &= ~BUTTON_STAR_PIN;\r
+            }\r
+        }\r
+        else                    // there was a button press not long enough\r
+        {\r
+            sButton.star_timeout = 0;\r
+        }\r
+\r
+        if (BUTTON_NUM_IS_PRESSED)\r
+        {\r
+            sButton.num_timeout++;\r
+\r
+            // Check if button was held low for some seconds\r
+            if (sButton.num_timeout > LEFT_BUTTON_LONG_TIME)\r
+            {\r
+                button.flag.num_long = 1;\r
+                button.flag.num_not_long = 0;\r
+                sButton.num_timeout = 0;\r
+                // Return interrupt edge to normal value\r
+                BUTTONS_IES &= ~BUTTON_NUM_PIN;\r
+            }\r
+        }\r
+        else                    // there was a button press not long enough\r
+        {\r
+            sButton.num_timeout = 0;\r
+        }\r
+    }\r
+\r
+    // Exit from LPM3 on RETI\r
+    _BIC_SR_IRQ(LPM3_bits);\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          Timer0_A1_5_ISR\r
+// @brief       IRQ handler for timer IRQ.\r
+//                              Timer0_A0       1/1sec clock tick (serviced by function\r
+// TIMER0_A0_ISR)\r
+//                              Timer0_A1       BlueRobin timer\r
+//                              Timer0_A2\r
+//                              Timer0_A3       Configurable periodic IRQ (used by button_repeat and\r
+// buzzer)\r
+//                              Timer0_A4       One-time delay\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+#pragma vector = TIMER0_A1_VECTOR\r
+__interrupt void TIMER0_A1_5_ISR(void)\r
+{\r
+    u16 value;\r
+\r
+    switch (TA0IV)\r
+    {\r
+        // Timer0_A1    BlueRobin timer\r
+        case 0x02:                                 // Timer0_A1 handler\r
+            BRRX_TimerTask_v();\r
+            break;\r
+\r
+        // Timer0_A3    Configurable periodic IRQ (used by button_repeat and buzzer)\r
+        case 0x06:                                 // Disable IE\r
+            TA0CCTL3 &= ~CCIE;\r
+            // Reset IRQ flag\r
+            TA0CCTL3 &= ~CCIFG;\r
+            // Store new value in CCR\r
+            value = TA0R + sTimer.timer0_A3_ticks; //timer0_A3_ticks_g;\r
+            // Load CCR register with next capture point\r
+            TA0CCR3 = value;\r
+            // Enable timer interrupt\r
+            TA0CCTL3 |= CCIE;\r
+            // Call function handler\r
+            fptr_Timer0_A3_function();\r
+            break;\r
+\r
+        // Timer0_A4    One-time delay\r
+        case 0x08:                                 // Disable IE\r
+            TA0CCTL4 &= ~CCIE;\r
+            // Reset IRQ flag\r
+            TA0CCTL4 &= ~CCIFG;\r
+            // Set delay over flag\r
+            sys.flag.delay_over = 1;\r
+            break;\r
+    }\r
+\r
+    // Exit from LPM3 on RETI\r
+    _BIC_SR_IRQ(LPM3_bits);\r
+}\r
+\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/driver/timer.h b/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/driver/timer.h
new file mode 100755 (executable)
index 0000000..a65bf92
--- /dev/null
@@ -0,0 +1,68 @@
+// *************************************************************************************************\r
+//\r
+//      Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//        Redistribution and use in source and binary forms, with or without\r
+//        modification, are permitted provided that the following conditions\r
+//        are met:\r
+//\r
+//          Redistributions of source code must retain the above copyright\r
+//          notice, this list of conditions and the following disclaimer.\r
+//\r
+//          Redistributions in binary form must reproduce the above copyright\r
+//          notice, this list of conditions and the following disclaimer in the\r
+//          documentation and/or other materials provided with the\r
+//          distribution.\r
+//\r
+//          Neither the name of Texas Instruments Incorporated nor the names of\r
+//          its contributors may be used to endorse or promote products derived\r
+//          from this software without specific prior written permission.\r
+//\r
+//        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+\r
+#ifndef TIMER_H_\r
+#define TIMER_H_\r
+\r
+// *************************************************************************************************\r
+// Include section\r
+\r
+// *************************************************************************************************\r
+// Prototypes section\r
+extern void Timer0_Init(void);\r
+extern void Timer0_Start(void);\r
+extern void Timer0_Stop(void);\r
+extern void Timer0_A3_Start(u16 ticks);\r
+extern void Timer0_A3_Stop(void);\r
+extern void Timer0_A4_Delay(u16 ticks);\r
+\r
+extern void (*fptr_Timer0_A3_function)(void);\r
+\r
+// *************************************************************************************************\r
+// Defines section\r
+struct timer\r
+{\r
+    // Timer0_A3 periodic delay\r
+    u16 timer0_A3_ticks;\r
+};\r
+extern struct timer sTimer;\r
+\r
+// *************************************************************************************************\r
+// Global Variable section\r
+\r
+// *************************************************************************************************\r
+// Extern section\r
+\r
+#endif                          /*TIMER_H_ */\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/driver/vti_as.c b/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/driver/vti_as.c
new file mode 100755 (executable)
index 0000000..0bd4912
--- /dev/null
@@ -0,0 +1,356 @@
+// *************************************************************************************************\r
+//\r
+//      Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//        Redistribution and use in source and binary forms, with or without\r
+//        modification, are permitted provided that the following conditions\r
+//        are met:\r
+//\r
+//          Redistributions of source code must retain the above copyright\r
+//          notice, this list of conditions and the following disclaimer.\r
+//\r
+//          Redistributions in binary form must reproduce the above copyright\r
+//          notice, this list of conditions and the following disclaimer in the\r
+//          documentation and/or other materials provided with the\r
+//          distribution.\r
+//\r
+//          Neither the name of Texas Instruments Incorporated nor the names of\r
+//          its contributors may be used to endorse or promote products derived\r
+//          from this software without specific prior written permission.\r
+//\r
+//        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+// VTI CMA3000-D0x acceleration sensor driver functions\r
+// *************************************************************************************************\r
+\r
+// *************************************************************************************************\r
+// Include section\r
+\r
+// system\r
+#include "project.h"\r
+\r
+// logic\r
+#include "simpliciti.h"\r
+\r
+// driver\r
+#include "vti_as.h"\r
+#include "timer.h"\r
+#include "display.h"\r
+\r
+// *************************************************************************************************\r
+// Prototypes section\r
+void as_start(void);\r
+void as_stop(void);\r
+u8 as_read_register(u8 bAddress);\r
+u8 as_write_register(u8 bAddress, u8 bData);\r
+\r
+// *************************************************************************************************\r
+// Defines section\r
+\r
+// =================================================================================================\r
+// CMA3000-D0x acceleration sensor configuration\r
+// =================================================================================================\r
+// DCO frequency division factor determining speed of the acceleration sensor SPI interface\r
+// Speed in Hz = 12MHz / AS_BR_DIVIDER (max. 500kHz)\r
+#define AS_BR_DIVIDER        (30u)\r
+\r
+// Acceleration measurement range in g\r
+// Valid ranges are: 2 and 8\r
+#define AS_RANGE             (2u)\r
+\r
+// Sample rate for acceleration values in Hz\r
+// Valid sample rates for 2g range are:     100, 400\r
+// Valid sample rates for 8g range are: 40, 100, 400\r
+#define AS_SAMPLE_RATE       (100u)\r
+\r
+// *************************************************************************************************\r
+// Global Variable section\r
+\r
+// Global flag for proper acceleration sensor operation\r
+u8 as_ok;\r
+\r
+// *************************************************************************************************\r
+// Extern section\r
+\r
+// *************************************************************************************************\r
+// @fn          as_init\r
+// @brief       Setup acceleration sensor connection, do not power up yet\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void as_init(void)\r
+{\r
+#ifdef AS_DISCONNECT\r
+    // Deactivate connection to acceleration sensor\r
+    AS_PWR_OUT &= ~AS_PWR_PIN;                             // Power off\r
+    AS_INT_OUT &= ~AS_INT_PIN;                             // Pin to low to avoid floating pins\r
+    AS_SPI_OUT &= ~(AS_SDO_PIN + AS_SDI_PIN + AS_SCK_PIN); // Pin to low to avoid floating pins\r
+    AS_CSN_OUT &= ~AS_CSN_PIN;                             // Pin to low to avoid floating pins\r
+    AS_INT_DIR |= AS_INT_PIN;                              // Pin to output to avoid floating pins\r
+    AS_SPI_DIR |= AS_SDO_PIN + AS_SDI_PIN + AS_SCK_PIN;    // Pin to output to avoid floating pins\r
+    AS_CSN_DIR |= AS_CSN_PIN;                              // Pin to output to avoid floating pins\r
+    AS_PWR_DIR |= AS_PWR_PIN;                              // Power pin to output direction\r
+#else\r
+    AS_INT_DIR &= ~AS_INT_PIN;                             // Input\r
+    AS_SPI_DIR &= ~AS_SDI_PIN;                             // Input\r
+    AS_SPI_DIR |= AS_SDO_PIN + AS_SCK_PIN;                 // Output\r
+    AS_SPI_SEL |= AS_SDO_PIN + AS_SDI_PIN + AS_SCK_PIN;    // Port pins to SDO, SDI and SCK function\r
+    AS_CSN_OUT |= AS_CSN_PIN;                              // CSN=1\r
+    AS_CSN_DIR |= AS_CSN_PIN;                              //\r
+    AS_PWR_OUT |= AS_PWR_PIN;                              // VDD=1\r
+    AS_PWR_DIR |= AS_PWR_PIN;                              //\r
+#endif\r
+\r
+    // Reset global sensor flag\r
+    as_ok = 1;\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          as_start\r
+// @brief       Power-up and initialize acceleration sensor\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void as_start(void)\r
+{\r
+    volatile u16 Counter_u16;\r
+    u8 bConfig;                                         //, bStatus;\r
+\r
+    // Initialize SPI interface to acceleration sensor\r
+    AS_SPI_CTL0 |= UCSYNC | UCMST | UCMSB               // SPI master, 8 data bits,  MSB first,\r
+        | UCCKPH;                                       //  clock idle low, data output on falling\r
+                                                        // edge\r
+    AS_SPI_CTL1 |= UCSSEL1;                             // SMCLK as clock source\r
+    AS_SPI_BR0 = AS_BR_DIVIDER;                         // Low byte of division factor for baud rate\r
+    AS_SPI_BR1 = 0x00;                                  // High byte of division factor for baud\r
+                                                        // rate\r
+    AS_SPI_CTL1 &= ~UCSWRST;                            // Start SPI hardware\r
+\r
+    // Initialize interrupt pin for data read out from acceleration sensor\r
+    AS_INT_IES &= ~AS_INT_PIN;                          // Interrupt on rising edge\r
+\r
+#ifdef AS_DISCONNECT\r
+    // Enable interrupt\r
+    AS_INT_DIR &= ~AS_INT_PIN;                          // Switch INT pin to input\r
+    AS_SPI_DIR &= ~AS_SDI_PIN;                          // Switch SDI pin to input\r
+    AS_SPI_REN |= AS_SDI_PIN;                           // Pulldown on SDI pin\r
+    AS_SPI_SEL |= AS_SDO_PIN + AS_SDI_PIN + AS_SCK_PIN; // Port pins to SDO, SDI and SCK function\r
+    AS_CSN_OUT |= AS_CSN_PIN;                           // Deselect acceleration sensor\r
+    AS_PWR_OUT |= AS_PWR_PIN;                           // Power on active high\r
+#endif\r
+\r
+    // Delay of >5ms required between switching on power and configuring sensor\r
+    Timer0_A4_Delay(CONV_MS_TO_TICKS(10));\r
+\r
+    // Initialize interrupt pin for data read out from acceleration sensor\r
+    AS_INT_IFG &= ~AS_INT_PIN;                          // Reset flag\r
+    AS_INT_IE |= AS_INT_PIN;                            // Enable interrupt\r
+\r
+    // Configure sensor and start to sample data\r
+#if (AS_RANGE == 2)\r
+    bConfig = 0x80;\r
+#    if (AS_SAMPLE_RATE == 100)\r
+    bConfig |= 0x02;\r
+#    elif (AS_SAMPLE_RATE == 400)\r
+    bConfig |= 0x04;\r
+#    else\r
+#        error "Sample rate not supported"\r
+#    endif\r
+#elif (AS_RANGE == 8)\r
+    bConfig = 0x00;\r
+#    if (AS_SAMPLE_RATE == 40)\r
+    bConfig |= 0x06;\r
+#    elif (AS_SAMPLE_RATE == 100)\r
+    bConfig |= 0x02;\r
+#    elif (AS_SAMPLE_RATE == 400)\r
+    bConfig |= 0x04;\r
+#    else\r
+#        error "Sample rate not supported"\r
+#    endif\r
+#else\r
+#    error "Measurement range not supported"\r
+#endif\r
+\r
+    // Reset sensor\r
+    as_write_register(0x04, 0x02);\r
+    as_write_register(0x04, 0x0A);\r
+    as_write_register(0x04, 0x04);\r
+\r
+    // Wait 5 ms before starting sensor output\r
+    Timer0_A4_Delay(CONV_MS_TO_TICKS(5));\r
+\r
+    // Set 2g measurement range, start to output data with 100Hz rate\r
+    as_write_register(0x02, bConfig);\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          as_stop\r
+// @brief       Power down acceleration sensor\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void as_stop(void)\r
+{\r
+    // Disable interrupt\r
+    AS_INT_IE &= ~AS_INT_PIN;                              // Disable interrupt\r
+\r
+#ifdef AS_DISCONNECT\r
+    // Power-down sensor\r
+    AS_PWR_OUT &= ~AS_PWR_PIN;                             // Power off\r
+    AS_INT_OUT &= ~AS_INT_PIN;                             // Pin to low to avoid floating pins\r
+    AS_SPI_OUT &= ~(AS_SDO_PIN + AS_SDI_PIN + AS_SCK_PIN); // Pins to low to avoid floating pins\r
+    AS_SPI_SEL &= ~(AS_SDO_PIN + AS_SDI_PIN + AS_SCK_PIN); // Port pins to I/O function\r
+    AS_CSN_OUT &= ~AS_CSN_PIN;                             // Pin to low to avoid floating pins\r
+    AS_INT_DIR |= AS_INT_PIN;                              // Pin to output to avoid floating pins\r
+    AS_SPI_DIR |= AS_SDO_PIN + AS_SDI_PIN + AS_SCK_PIN;    // Pins to output to avoid floating pins\r
+    AS_CSN_DIR |= AS_CSN_PIN;                              // Pin to output to avoid floating pins\r
+#else\r
+    // Reset sensor -> sensor to powerdown\r
+    as_write_register(0x04, 0x02);\r
+    as_write_register(0x04, 0x0A);\r
+    as_write_register(0x04, 0x04);\r
+#endif\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          as_read_register\r
+// @brief       Read a byte from the acceleration sensor\r
+// @param       u8 bAddress             Register address\r
+// @return      u8                                      Register content\r
+// *************************************************************************************************\r
+u8 as_read_register(u8 bAddress)\r
+{\r
+    u8 bResult;\r
+    u16 timeout;\r
+\r
+    // Exit function if an error was detected previously\r
+    if (!as_ok)\r
+        return (0);\r
+\r
+    bAddress <<= 2;                                         // Address to be shifted left by 2 and\r
+                                                            // RW bit to be reset\r
+\r
+    AS_SPI_REN &= ~AS_SDI_PIN;                              // Pulldown on SDI pin not required\r
+    AS_CSN_OUT &= ~AS_CSN_PIN;                              // Select acceleration sensor\r
+\r
+    bResult = AS_RX_BUFFER;                                 // Read RX buffer just to clear\r
+                                                            // interrupt flag\r
+\r
+    AS_TX_BUFFER = bAddress;                                // Write address to TX buffer\r
+\r
+    timeout = SPI_TIMEOUT;\r
+    while (!(AS_IRQ_REG & AS_RX_IFG) && (--timeout > 0)) ;  // Wait until new data was written into\r
+                                                            // RX buffer\r
+    if (timeout == 0)\r
+    {\r
+        as_ok = 0;\r
+        return (0);\r
+    }\r
+    bResult = AS_RX_BUFFER;                                 // Read RX buffer just to clear\r
+                                                            // interrupt flag\r
+\r
+    AS_TX_BUFFER = 0;                                       // Write dummy data to TX buffer\r
+\r
+    timeout = SPI_TIMEOUT;\r
+    while (!(AS_IRQ_REG & AS_RX_IFG) && (--timeout > 0)) ;  // Wait until new data was written into\r
+                                                            // RX buffer\r
+    if (timeout == 0)\r
+    {\r
+        as_ok = 0;\r
+        return (0);\r
+    }\r
+    bResult = AS_RX_BUFFER;                                 // Read RX buffer\r
+\r
+    AS_CSN_OUT |= AS_CSN_PIN;                               // Deselect acceleration sensor\r
+    AS_SPI_REN |= AS_SDI_PIN;                               // Pulldown on SDI pin required again\r
+\r
+    // Return new data from RX buffer\r
+    return bResult;\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          as_write_register\r
+// @brief               Write a byte to the acceleration sensor\r
+// @param       u8 bAddress             Register address\r
+//                              u8 bData                        Data to write\r
+// @return\r
+// *************************************************************************************************\r
+u8 as_write_register(u8 bAddress, u8 bData)\r
+{\r
+    u8 bResult;\r
+    u16 timeout;\r
+\r
+    // Exit function if an error was detected previously\r
+    if (!as_ok)\r
+        return (0);\r
+\r
+    bAddress <<= 2;                                         // Address to be shifted left by 1\r
+    bAddress |= BIT1;                                       // RW bit to be set\r
+\r
+    AS_SPI_REN &= ~AS_SDI_PIN;                              // Pulldown on SDI pin not required\r
+    AS_CSN_OUT &= ~AS_CSN_PIN;                              // Select acceleration sensor\r
+\r
+    bResult = AS_RX_BUFFER;                                 // Read RX buffer just to clear\r
+                                                            // interrupt flag\r
+\r
+    AS_TX_BUFFER = bAddress;                                // Write address to TX buffer\r
+\r
+    timeout = SPI_TIMEOUT;\r
+    while (!(AS_IRQ_REG & AS_RX_IFG) && (--timeout > 0)) ;  // Wait until new data was written into\r
+                                                            // RX buffer\r
+    if (timeout == 0)\r
+    {\r
+        as_ok = 0;\r
+        return (0);\r
+    }\r
+    bResult = AS_RX_BUFFER;                                 // Read RX buffer just to clear\r
+                                                            // interrupt flag\r
+\r
+    AS_TX_BUFFER = bData;                                   // Write data to TX buffer\r
+\r
+    timeout = SPI_TIMEOUT;\r
+    while (!(AS_IRQ_REG & AS_RX_IFG) && (--timeout > 0)) ;  // Wait until new data was written into\r
+                                                            // RX buffer\r
+    if (timeout == 0)\r
+    {\r
+        as_ok = 0;\r
+        return (0);\r
+    }\r
+    bResult = AS_RX_BUFFER;                                 // Read RX buffer\r
+\r
+    AS_CSN_OUT |= AS_CSN_PIN;                               // Deselect acceleration sensor\r
+    AS_SPI_REN |= AS_SDI_PIN;                               // Pulldown on SDI pin required again\r
+\r
+    return bResult;\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          as_get_data\r
+// @brief       Service routine to read acceleration values.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void as_get_data(u8 * data)\r
+{\r
+    // Exit if sensor is not powered up\r
+    if ((AS_PWR_OUT & AS_PWR_PIN) != AS_PWR_PIN)\r
+        return;\r
+\r
+    // Store X/Y/Z acceleration data in buffer\r
+    *(data + 0) = as_read_register(0x06);\r
+    *(data + 1) = as_read_register(0x07);\r
+    *(data + 2) = as_read_register(0x08);\r
+}\r
+\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/driver/vti_as.h b/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/driver/vti_as.h
new file mode 100755 (executable)
index 0000000..178af33
--- /dev/null
@@ -0,0 +1,106 @@
+// *************************************************************************************************\r
+//\r
+//      Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//        Redistribution and use in source and binary forms, with or without\r
+//        modification, are permitted provided that the following conditions\r
+//        are met:\r
+//\r
+//          Redistributions of source code must retain the above copyright\r
+//          notice, this list of conditions and the following disclaimer.\r
+//\r
+//          Redistributions in binary form must reproduce the above copyright\r
+//          notice, this list of conditions and the following disclaimer in the\r
+//          documentation and/or other materials provided with the\r
+//          distribution.\r
+//\r
+//          Neither the name of Texas Instruments Incorporated nor the names of\r
+//          its contributors may be used to endorse or promote products derived\r
+//          from this software without specific prior written permission.\r
+//\r
+//        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+\r
+#ifndef VTI_AS_H_\r
+#define VTI_AS_H_\r
+\r
+// *************************************************************************************************\r
+// Include section\r
+\r
+// *************************************************************************************************\r
+// Prototypes section\r
+extern void as_init(void);\r
+extern void as_start(void);\r
+extern void as_stop(void);\r
+extern u8 as_read_register(u8 bAddress);\r
+extern u8 as_write_register(u8 bAddress, u8 bData);\r
+extern void as_get_data(u8 * data);\r
+\r
+// *************************************************************************************************\r
+// Defines section\r
+\r
+// Disconnect power supply for acceleration sensor when not used\r
+#define AS_DISCONNECT\r
+\r
+// Port and pin resource for SPI interface to acceleration sensor\r
+// SDO=MOSI=P1.6, SDI=MISO=P1.5, SCK=P1.7\r
+#define AS_SPI_IN            (P1IN)\r
+#define AS_SPI_OUT           (P1OUT)\r
+#define AS_SPI_DIR           (P1DIR)\r
+#define AS_SPI_SEL           (P1SEL)\r
+#define AS_SPI_REN           (P1REN)\r
+#define AS_SDO_PIN           (BIT6)\r
+#define AS_SDI_PIN           (BIT5)\r
+#define AS_SCK_PIN           (BIT7)\r
+\r
+// CSN=PJ.1\r
+#define AS_CSN_OUT                       (PJOUT)\r
+#define AS_CSN_DIR                       (PJDIR)\r
+#define AS_CSN_PIN           (BIT1)\r
+\r
+#define AS_TX_BUFFER         (UCA0TXBUF)\r
+#define AS_RX_BUFFER         (UCA0RXBUF)\r
+#define AS_TX_IFG            (UCTXIFG)\r
+#define AS_RX_IFG            (UCRXIFG)\r
+#define AS_IRQ_REG           (UCA0IFG)\r
+#define AS_SPI_CTL0          (UCA0CTL0)\r
+#define AS_SPI_CTL1          (UCA0CTL1)\r
+#define AS_SPI_BR0           (UCA0BR0)\r
+#define AS_SPI_BR1           (UCA0BR1)\r
+\r
+// Port and pin resource for power-up of acceleration sensor, VDD=PJ.0\r
+#define AS_PWR_OUT           (PJOUT)\r
+#define AS_PWR_DIR           (PJDIR)\r
+#define AS_PWR_PIN           (BIT0)\r
+\r
+// Port, pin and interrupt resource for interrupt from acceleration sensor, CMA_INT=P2.5\r
+#define AS_INT_IN            (P2IN)\r
+#define AS_INT_OUT           (P2OUT)\r
+#define AS_INT_DIR           (P2DIR)\r
+#define AS_INT_IE            (P2IE)\r
+#define AS_INT_IES           (P2IES)\r
+#define AS_INT_IFG           (P2IFG)\r
+#define AS_INT_PIN           (BIT5)\r
+\r
+// SPI timeout to detect sensor failure\r
+#define SPI_TIMEOUT                             (1000u)\r
+\r
+// *************************************************************************************************\r
+// Global Variable section\r
+\r
+// *************************************************************************************************\r
+// Extern section\r
+\r
+#endif                          /*VTI_AS_H_ */\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/driver/vti_ps.c b/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/driver/vti_ps.c
new file mode 100755 (executable)
index 0000000..fa2d493
--- /dev/null
@@ -0,0 +1,563 @@
+// *************************************************************************************************\r
+//\r
+//      Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//        Redistribution and use in source and binary forms, with or without\r
+//        modification, are permitted provided that the following conditions\r
+//        are met:\r
+//\r
+//          Redistributions of source code must retain the above copyright\r
+//          notice, this list of conditions and the following disclaimer.\r
+//\r
+//          Redistributions in binary form must reproduce the above copyright\r
+//          notice, this list of conditions and the following disclaimer in the\r
+//          documentation and/or other materials provided with the\r
+//          distribution.\r
+//\r
+//          Neither the name of Texas Instruments Incorporated nor the names of\r
+//          its contributors may be used to endorse or promote products derived\r
+//          from this software without specific prior written permission.\r
+//\r
+//        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+// VTI SCP1000-D0x pressure sensor driver functions\r
+// *************************************************************************************************\r
+\r
+// *************************************************************************************************\r
+// Include section\r
+\r
+// system\r
+#include "project.h"\r
+\r
+// driver\r
+#include "vti_ps.h"\r
+#include "timer.h"\r
+\r
+// *************************************************************************************************\r
+// Prototypes section\r
+u16 ps_read_register(u8 address, u8 mode);\r
+u8 ps_write_register(u8 address, u8 data);\r
+u8 ps_twi_read(u8 ack);\r
+void twi_delay(void);\r
+\r
+// *************************************************************************************************\r
+// Defines section\r
+\r
+// *************************************************************************************************\r
+// Global Variable section\r
+\r
+// VTI pressure (hPa) to altitude (m) conversion tables\r
+const s16 h0[17] =\r
+{ -153, 0, 111, 540, 989, 1457, 1949, 2466, 3012, 3591, 4206, 4865, 5574, 6344, 7185, 8117, 9164 };\r
+const u16 p0[17] =\r
+{ 1031, 1013, 1000, 950, 900, 850, 800, 750, 700, 650, 600, 550, 500, 450, 400, 350, 300 };\r
+\r
+float p[17];\r
+\r
+// Global flag for proper pressure sensor operation\r
+u8 ps_ok;\r
+\r
+// *************************************************************************************************\r
+// Extern section\r
+\r
+// *************************************************************************************************\r
+// @fn          ps_init\r
+// @brief       Init pressure sensor I/O\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void ps_init(void)\r
+{\r
+    volatile u8 success, status, eeprom, timeout;\r
+\r
+    PS_INT_DIR &= ~PS_INT_PIN;             // DRDY is input\r
+    PS_INT_IES &= ~PS_INT_PIN;             // Interrupt on DRDY rising edge\r
+    PS_TWI_OUT |= PS_SCL_PIN + PS_SDA_PIN; // SCL and SDA are outputs by default\r
+    PS_TWI_DIR |= PS_SCL_PIN + PS_SDA_PIN; // SCL and SDA are outputs by default\r
+\r
+    // Reset global ps_ok flag\r
+    ps_ok = 0;\r
+\r
+    // 100msec delay to allow VDD stabilisation\r
+    Timer0_A4_Delay(CONV_MS_TO_TICKS(100));\r
+\r
+    // Reset pressure sensor -> powerdown sensor\r
+    success = ps_write_register(0x06, 0x01);\r
+\r
+    // 100msec delay\r
+    Timer0_A4_Delay(CONV_MS_TO_TICKS(100));\r
+\r
+    // Check if STATUS register BIT0 is cleared\r
+    status = ps_read_register(0x07, PS_TWI_8BIT_ACCESS);\r
+    if (((status & BIT0) == 0) && (status != 0))\r
+    {\r
+        // Check EEPROM checksum in DATARD8 register\r
+        eeprom = ps_read_register(0x7F, PS_TWI_8BIT_ACCESS);\r
+        if (eeprom == 0x01)\r
+            ps_ok = 1;\r
+        else\r
+            ps_ok = 0;\r
+    }\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          ps_start\r
+// @brief       Init pressure sensor registers and start sampling\r
+// @param       none\r
+// @return      u8              1=Sensor started, 0=Sensor did not start\r
+// *************************************************************************************************\r
+void ps_start(void)\r
+{\r
+    // Start sampling data in ultra low power mode\r
+    ps_write_register(0x03, 0x0B);\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          ps_stop\r
+// @brief       Power down pressure sensor\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void ps_stop(void)\r
+{\r
+    // Put sensor to standby\r
+    ps_write_register(0x03, 0x00);\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          ps_twi_sda\r
+// @brief       Control SDA line\r
+// @param       u8 condition            PS_TWI_SEND_START, PS_TWI_SEND_RESTART, PS_TWI_SEND_STOP\r
+//                                                                              PS_TWI_CHECK_ACK\r
+// @return      u8                                      1=ACK, 0=NACK\r
+// *************************************************************************************************\r
+u8 ps_twi_sda(u8 condition)\r
+{\r
+    u8 sda = 0;\r
+\r
+    if (condition == PS_TWI_SEND_START)\r
+    {\r
+        PS_TWI_SDA_OUT;         // SDA is output\r
+        PS_TWI_SCL_HI;\r
+        twi_delay();\r
+        PS_TWI_SDA_LO;\r
+        twi_delay();\r
+        PS_TWI_SCL_LO;          // SCL 1-0 transition while SDA=0\r
+        twi_delay();\r
+    }\r
+    else if (condition == PS_TWI_SEND_RESTART)\r
+    {\r
+        PS_TWI_SDA_OUT;         // SDA is output\r
+        PS_TWI_SCL_LO;\r
+        PS_TWI_SDA_HI;\r
+        twi_delay();\r
+        PS_TWI_SCL_HI;\r
+        twi_delay();\r
+        PS_TWI_SDA_LO;\r
+        twi_delay();\r
+        PS_TWI_SCL_LO;\r
+        twi_delay();\r
+    }\r
+    else if (condition == PS_TWI_SEND_STOP)\r
+    {\r
+        PS_TWI_SDA_OUT;         // SDA is output\r
+        PS_TWI_SDA_LO;\r
+        twi_delay();\r
+        PS_TWI_SCL_LO;\r
+        twi_delay();\r
+        PS_TWI_SCL_HI;\r
+        twi_delay();\r
+        PS_TWI_SDA_HI;          // SDA 0-1 transition while SCL=1\r
+        twi_delay();\r
+    }\r
+    else if (condition == PS_TWI_CHECK_ACK)\r
+    {\r
+        PS_TWI_SDA_IN;          // SDA is input\r
+        PS_TWI_SCL_LO;\r
+        twi_delay();\r
+        PS_TWI_SCL_HI;\r
+        twi_delay();\r
+        sda = PS_TWI_IN & PS_SDA_PIN;\r
+        PS_TWI_SCL_LO;\r
+    }\r
+\r
+    // Return value will only be evaluated when checking device ACK\r
+    return (sda == 0);\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          twi_delay\r
+// @brief       Delay between TWI signal edges.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void twi_delay(void)\r
+{\r
+    asm ("     nop");\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          ps_twi_write\r
+// @brief       Clock out bits through SDA.\r
+// @param       u8 data         Byte to send\r
+// @return      none\r
+// *************************************************************************************************\r
+void ps_twi_write(u8 data)\r
+{\r
+    u8 i, mask;\r
+\r
+    // Set mask byte to 10000000b\r
+    mask = BIT0 << 7;\r
+\r
+    PS_TWI_SDA_OUT;             // SDA is output\r
+\r
+    for (i = 8; i > 0; i--)\r
+    {\r
+        PS_TWI_SCL_LO;          // SCL=0\r
+        if ((data & mask) == mask)\r
+        {\r
+            PS_TWI_SDA_HI;      // SDA=1\r
+        }\r
+        else\r
+        {\r
+            PS_TWI_SDA_LO;      // SDA=0\r
+        }\r
+        mask = mask >> 1;\r
+        twi_delay();\r
+        PS_TWI_SCL_HI;          // SCL=1\r
+        twi_delay();\r
+    }\r
+\r
+    PS_TWI_SCL_LO;              // SCL=0\r
+    PS_TWI_SDA_IN;              // SDA is input\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          ps_twi_read\r
+// @brief       Read bits from SDA\r
+// @param       u8 ack          1=Send ACK after read, 0=Send NACK after read\r
+// @return      u8                      Bits read\r
+// *************************************************************************************************\r
+u8 ps_twi_read(u8 ack)\r
+{\r
+    u8 i;\r
+    u8 data = 0;\r
+\r
+    PS_TWI_SDA_IN;              // SDA is input\r
+\r
+    for (i = 0; i < 8; i++)\r
+    {\r
+        PS_TWI_SCL_LO;          // SCL=0\r
+        twi_delay();\r
+        PS_TWI_SCL_HI;          // SCL=0\r
+        twi_delay();\r
+\r
+        // Shift captured bits to left\r
+        data = data << 1;\r
+\r
+        // Capture new bit\r
+        if ((PS_TWI_IN & PS_SDA_PIN) == PS_SDA_PIN)\r
+            data |= BIT0;\r
+    }\r
+\r
+    PS_TWI_SDA_OUT;             // SDA is output\r
+\r
+    // 1 aditional clock phase to generate master ACK\r
+    PS_TWI_SCL_LO;              // SCL=0\r
+    if (ack == 1)               // Send ack -> continue read\r
+    {\r
+        PS_TWI_SDA_LO\r
+    }\r
+    else                        // Send nack -> stop read\r
+    {\r
+        PS_TWI_SDA_HI\r
+    }\r
+    twi_delay();\r
+    PS_TWI_SCL_HI;              // SCL=0\r
+    twi_delay();\r
+    PS_TWI_SCL_LO;\r
+\r
+    return (data);\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          as_write_register\r
+// @brief               Write a byte to the pressure sensor\r
+// @param       u8 address              Register address\r
+//                              u8 data                 Data to write\r
+// @return      u8\r
+// *************************************************************************************************\r
+u8 ps_write_register(u8 address, u8 data)\r
+{\r
+    volatile u8 success;\r
+\r
+    ps_twi_sda(PS_TWI_SEND_START);            // Generate start condition\r
+\r
+    ps_twi_write((0x11 << 1) | PS_TWI_WRITE); // Send 7bit device address 0x11 + write bit '0'\r
+    success = ps_twi_sda(PS_TWI_CHECK_ACK);   // Check ACK from device\r
+    if (!success)\r
+        return (0);\r
+\r
+    ps_twi_write(address);                    // Send 8bit register address\r
+    success = ps_twi_sda(PS_TWI_CHECK_ACK);   // Check ACK from device\r
+    if (!success)\r
+        return (0);\r
+\r
+    ps_twi_write(data);                       // Send 8bit data to register\r
+    success = ps_twi_sda(PS_TWI_CHECK_ACK);   // Check ACK from device\r
+    // Slave does not send this ACK\r
+    // if (!success) return (0);\r
+\r
+    ps_twi_sda(PS_TWI_SEND_STOP);             // Generate stop condition\r
+\r
+    return (1);\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          ps_read_register\r
+// @brief       Read a byte from the pressure sensor\r
+// @param       u8 address              Register address\r
+//                              u8      mode            PS_TWI_8BIT_ACCESS, PS_TWI_16BIT_ACCESS\r
+// @return      u16                         Register content\r
+// *************************************************************************************************\r
+u16 ps_read_register(u8 address, u8 mode)\r
+{\r
+    u8 success;\r
+    u16 data = 0;\r
+\r
+    ps_twi_sda(PS_TWI_SEND_START);            // Generate start condition\r
+\r
+    ps_twi_write((0x11 << 1) | PS_TWI_WRITE); // Send 7bit device address 0x11 + write bit '0'\r
+    success = ps_twi_sda(PS_TWI_CHECK_ACK);   // Check ACK from device\r
+    if (!success)\r
+        return (0);\r
+\r
+    ps_twi_write(address);                    // Send 8bit register address\r
+    success = ps_twi_sda(PS_TWI_CHECK_ACK);   // Check ACK from device\r
+    if (!success)\r
+        return (0);\r
+\r
+    ps_twi_sda(PS_TWI_SEND_RESTART);          // Generate restart condition\r
+\r
+    ps_twi_write((0x11 << 1) | PS_TWI_READ);  // Send 7bit device address 0x11 + read bit '1'\r
+    success = ps_twi_sda(PS_TWI_CHECK_ACK);   // Check ACK from device\r
+    if (!success)\r
+        return (0);\r
+\r
+    if (mode == PS_TWI_16BIT_ACCESS)\r
+    {\r
+        data = ps_twi_read(1) << 8;           // Read MSB 8bit data from register\r
+        data |= ps_twi_read(0);               // Read LSB 8bit data from register\r
+    }\r
+    else\r
+    {\r
+        data = ps_twi_read(0);                // Read 8bit data from register\r
+    }\r
+\r
+    ps_twi_sda(PS_TWI_SEND_STOP);             // Generate stop condition\r
+\r
+    return (data);\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          ps_get_pa\r
+// @brief       Read out pressure. Format is Pa. Range is 30000 .. 120000 Pa.\r
+// @param       none\r
+// @return      u32             15-bit pressure sensor value (Pa)\r
+// *************************************************************************************************\r
+u32 ps_get_pa(void)\r
+{\r
+    volatile u32 data = 0;\r
+\r
+    // Get 3 MSB from DATARD8 register\r
+    data = ps_read_register(0x7F, PS_TWI_8BIT_ACCESS);\r
+    data = ((data & 0x07) << 8) << 8;\r
+\r
+    // Get 16 LSB from DATARD16 register\r
+    data |= ps_read_register(0x80, PS_TWI_16BIT_ACCESS);\r
+\r
+    // Convert decimal value to Pa\r
+    data = (data >> 2);\r
+\r
+    return (data);\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          ps_get_temp\r
+// @brief       Read out temperature.\r
+// @param       none\r
+// @return      u16             13-bit temperature value in xx.x K format\r
+// *************************************************************************************************\r
+u16 ps_get_temp(void)\r
+{\r
+    volatile u16 data = 0;\r
+    u16 temp = 0;\r
+    u8 is_negative = 0;\r
+    u16 kelvin;\r
+\r
+    // Get 13 bit from TEMPOUT register\r
+    data = ps_read_register(0x81, PS_TWI_16BIT_ACCESS);\r
+\r
+    // Convert negative temperatures\r
+    if ((data & BIT(13)) == BIT(13))\r
+    {\r
+        // Sign extend temperature\r
+        data |= 0xC000;\r
+        // Convert two's complement\r
+        data = ~data;\r
+        data += 1;\r
+        is_negative = 1;\r
+    }\r
+\r
+    temp = data / 2;\r
+\r
+    // Convert from °C to K\r
+    if (is_negative)\r
+        kelvin = 2732 - temp;\r
+    else\r
+        kelvin = temp + 2732;\r
+\r
+    return (kelvin);\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          init_pressure_table\r
+// @brief       Init pressure table with constants\r
+// @param       u32             p               Pressure (Pa)\r
+// @return      u16                             Altitude (m)\r
+// *************************************************************************************************\r
+void init_pressure_table(void)\r
+{\r
+    u8 i;\r
+\r
+    for (i = 0; i < 17; i++)\r
+        p[i] = p0[i];\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          update_pressure_table\r
+// @brief       Calculate pressure table for reference altitude.\r
+//                              Implemented straight from VTI reference code.\r
+// @param       s16             href    Reference height\r
+//                              u32             p_meas  Pressure (Pa)\r
+//                              u16             t_meas  Temperature (10*K)\r
+// @return      none\r
+// *************************************************************************************************\r
+void update_pressure_table(s16 href, u32 p_meas, u16 t_meas)\r
+{\r
+    const float Invt00 = 0.003470415;\r
+    const float coefp = 0.00006;\r
+    volatile float p_fact;\r
+    volatile float p_noll;\r
+    volatile float hnoll;\r
+    volatile float h_low = 0;\r
+    volatile float t0;\r
+    u8 i;\r
+\r
+    // Typecast arguments\r
+    volatile float fl_href = href;\r
+    volatile float fl_p_meas = (float)p_meas / 100;     // Convert from Pa to hPa\r
+    volatile float fl_t_meas = (float)t_meas / 10;      // Convert from 10 K to 1 K\r
+\r
+    t0 = fl_t_meas + (0.0065 * fl_href);\r
+\r
+    hnoll = fl_href / (t0 * Invt00);\r
+\r
+    for (i = 0; i <= 15; i++)\r
+    {\r
+        if (h0[i] > hnoll)\r
+            break;\r
+        h_low = h0[i];\r
+    }\r
+\r
+    p_noll =\r
+        (float)(hnoll -\r
+                h_low) *\r
+        (1 -\r
+         (hnoll -\r
+          (float)h0[i]) *\r
+         coefp) * ((float)p0[i] - (float)p0[i - 1]) / ((float)h0[i] - h_low) + (float)p0[i - 1];\r
+\r
+    // Calculate multiplicator\r
+    p_fact = fl_p_meas / p_noll;\r
+\r
+    // Apply correction factor to pressure table\r
+    for (i = 0; i <= 16; i++)\r
+    {\r
+        p[i] = p0[i] * p_fact;\r
+    }\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          conv_pa_to_meter\r
+// @brief       Convert pressure (Pa) to altitude (m) using a conversion table\r
+//                              Implemented straight from VTI reference code.\r
+// @param       u32             p_meas  Pressure (Pa)\r
+//                              u16             t_meas  Temperature (10* K)\r
+// @return      s16                             Altitude (m)\r
+// *************************************************************************************************\r
+s16 conv_pa_to_meter(u32 p_meas, u16 t_meas)\r
+{\r
+    const float coef2 = 0.0007;\r
+    const float Invt00 = 0.003470415;\r
+    volatile float hnoll;\r
+    volatile float t0;\r
+    volatile float p_low;\r
+    volatile float fl_h;\r
+    volatile s16 h;\r
+    u8 i;\r
+\r
+    // Typecast arguments\r
+    volatile float fl_p_meas = (float)p_meas / 100;     // Convert from Pa to hPa\r
+    volatile float fl_t_meas = (float)t_meas / 10;      // Convert from 10 K to 1 K\r
+\r
+    for (i = 0; i <= 16; i++)\r
+    {\r
+        if (p[i] < fl_p_meas)\r
+            break;\r
+        p_low = p[i];\r
+    }\r
+\r
+    if (i == 0)\r
+    {\r
+        hnoll = (float)(fl_p_meas - p[0]) / (p[1] - p[0]) * ((float)(h0[1] - h0[0]));\r
+    }\r
+    else if (i < 15)\r
+    {\r
+        hnoll =\r
+            (float)(fl_p_meas -\r
+                    p_low) *\r
+            (1 -\r
+             (fl_p_meas -\r
+              p[i]) * coef2) / (p[i] - p_low) * ((float)(h0[i] - h0[i - 1])) + h0[i - 1];\r
+    }\r
+    else if (i == 15)\r
+    {\r
+        hnoll =\r
+            (float)(fl_p_meas - p_low) / (p[i] - p_low) * ((float)(h0[i] - h0[i - 1])) + h0[i - 1];\r
+    }\r
+    else                        // i==16\r
+    {\r
+        hnoll = (float)(fl_p_meas - p[16]) / (p[16] - p[15]) * ((float)(h0[16] - h0[15])) + h0[16];\r
+    }\r
+\r
+    // Compensate temperature error\r
+    t0 = fl_t_meas / (1 - hnoll * Invt00 * 0.0065);\r
+    fl_h = Invt00 * t0 * hnoll;\r
+    h = (u16) fl_h;\r
+\r
+    return (h);\r
+}\r
+\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/driver/vti_ps.h b/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/driver/vti_ps.h
new file mode 100755 (executable)
index 0000000..e044695
--- /dev/null
@@ -0,0 +1,99 @@
+// *************************************************************************************************\r
+//\r
+//      Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//        Redistribution and use in source and binary forms, with or without\r
+//        modification, are permitted provided that the following conditions\r
+//        are met:\r
+//\r
+//          Redistributions of source code must retain the above copyright\r
+//          notice, this list of conditions and the following disclaimer.\r
+//\r
+//          Redistributions in binary form must reproduce the above copyright\r
+//          notice, this list of conditions and the following disclaimer in the\r
+//          documentation and/or other materials provided with the\r
+//          distribution.\r
+//\r
+//          Neither the name of Texas Instruments Incorporated nor the names of\r
+//          its contributors may be used to endorse or promote products derived\r
+//          from this software without specific prior written permission.\r
+//\r
+//        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+\r
+#ifndef VTI_PS_H_\r
+#define VTI_PS_H_\r
+\r
+// *************************************************************************************************\r
+// Include section\r
+\r
+// *************************************************************************************************\r
+// Prototypes section\r
+extern void ps_init(void);\r
+extern void ps_start(void);\r
+extern void ps_stop(void);\r
+extern u32 ps_get_pa(void);\r
+extern u16 ps_get_temp(void);\r
+extern void init_pressure_table(void);\r
+extern void update_pressure_table(s16 href, u32 p_meas, u16 t_meas);\r
+extern s16 conv_pa_to_meter(u32 p_meas, u16 t_meas);\r
+\r
+// *************************************************************************************************\r
+// Defines section\r
+\r
+// Port and pin resource for TWI interface to pressure sensor\r
+// SCL=PJ.3, SDA=PJ.2, DRDY=P2.6\r
+#define PS_TWI_IN            (PJIN)\r
+#define PS_TWI_OUT           (PJOUT)\r
+#define PS_TWI_DIR           (PJDIR)\r
+#define PS_TWI_REN           (PJREN)\r
+#define PS_SCL_PIN           (BIT3)\r
+#define PS_SDA_PIN           (BIT2)\r
+\r
+// Port, pin and interrupt resource for interrupt from acceleration sensor, DRDY=P2.6\r
+#define PS_INT_IN            (P2IN)\r
+#define PS_INT_OUT           (P2OUT)\r
+#define PS_INT_DIR           (P2DIR)\r
+#define PS_INT_IE            (P2IE)\r
+#define PS_INT_IES           (P2IES)\r
+#define PS_INT_IFG           (P2IFG)\r
+#define PS_INT_PIN           (BIT6)\r
+\r
+// TWI defines\r
+#define PS_TWI_WRITE            (0u)\r
+#define PS_TWI_READ                     (1u)\r
+\r
+#define PS_TWI_SEND_START       (0u)\r
+#define PS_TWI_SEND_RESTART     (1u)\r
+#define PS_TWI_SEND_STOP        (2u)\r
+#define PS_TWI_CHECK_ACK        (3u)\r
+\r
+#define PS_TWI_8BIT_ACCESS      (0u)\r
+#define PS_TWI_16BIT_ACCESS     (1u)\r
+\r
+#define PS_TWI_SCL_HI           { PS_TWI_OUT |=  PS_SCL_PIN; }\r
+#define PS_TWI_SCL_LO           { PS_TWI_OUT &= ~PS_SCL_PIN; }\r
+#define PS_TWI_SDA_HI           { PS_TWI_OUT |=  PS_SDA_PIN; }\r
+#define PS_TWI_SDA_LO           { PS_TWI_OUT &= ~PS_SDA_PIN; }\r
+#define PS_TWI_SDA_IN           { PS_TWI_OUT |=  PS_SDA_PIN; PS_TWI_DIR &= ~PS_SDA_PIN; }\r
+#define PS_TWI_SDA_OUT          { PS_TWI_DIR |=  PS_SDA_PIN; }\r
+\r
+// *************************************************************************************************\r
+// Global Variable section\r
+\r
+// *************************************************************************************************\r
+// Extern section\r
+\r
+#endif                          /*VTI_PS_H_ */\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/ez430_chronos_datalogger.ewd b/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/ez430_chronos_datalogger.ewd
new file mode 100755 (executable)
index 0000000..1c1c244
--- /dev/null
@@ -0,0 +1,1963 @@
+<?xml version="1.0" encoding="iso-8859-1"?>\r
+\r
+<project>\r
+  <fileVersion>2</fileVersion>\r
+  <configuration>\r
+    <name>915MHz - Limited IAR Kickstart (USA)</name>\r
+    <toolchain>\r
+      <name>MSP430</name>\r
+    </toolchain>\r
+    <debug>1</debug>\r
+    <settings>\r
+      <name>C-SPY</name>\r
+      <archiveVersion>4</archiveVersion>\r
+      <data>\r
+        <version>24</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>OCImagesSuppressCheck1</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OCImagesPath1</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>OCImagesSuppressCheck2</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OCImagesPath2</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>OCImagesSuppressCheck3</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OCImagesPath3</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>CInput</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>MacOverride</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>MacFile</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>IProcessor</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>GoToEnable</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>GoToName</name>\r
+          <state>main</state>\r
+        </option>\r
+        <option>\r
+          <name>DynDriver</name>\r
+          <state>430FET</state>\r
+        </option>\r
+        <option>\r
+          <name>dDllSlave</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>DdfFileSlave</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>DdfOverride</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>DdfFileName</name>\r
+          <state>$TOOLKIT_DIR$\config\CC430F6137.ddf</state>\r
+        </option>\r
+        <option>\r
+          <name>ProcTMS</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CExtraOptionsCheck</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CExtraOptions</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>ProcMSP430X</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CompilerDataModel</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>IVBASE</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CPUTAG</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>L092Mode</name>\r
+          <state>1</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>430FET</name>\r
+      <archiveVersion>1</archiveVersion>\r
+      <data>\r
+        <version>21</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>CFetMandatory</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Erase</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>EMUVerifyDownloadP7</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>EraseOptionSlaveP7</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>ExitBreakpointP7</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>PutcharBreakpointP7</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>GetcharBreakpointP7</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>derivativeP7</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>ParallelPortP7</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>TargetVoltage</name>\r
+          <state>3.3</state>\r
+        </option>\r
+        <option>\r
+          <name>AllowLockedFlashAccessP7</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>EMUAttach</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AttachOptionSlave</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CRadioProtocolType</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCRadioModuleTypeSlave</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>EEMLevel</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>DiasbleMemoryCache</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>NeedLockedFlashAccess</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>UsbComPort</name>\r
+          <state>Automatic</state>\r
+        </option>\r
+        <option>\r
+          <name>FetConnection</name>\r
+          <version>2</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>SoftwareBreakpointEnable</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>RadioSoftwareBreakpointType</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>TargetSettlingtime</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AllowAccessToBSL</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OTargetVccTypeDefault</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCBetaDll</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>GPassword</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>DebugLPM5</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>LPM5Slave</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CRadioAutoManualType</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>ExternalCodeDownload</name>\r
+          <state>0</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>SIM430</name>\r
+      <archiveVersion>1</archiveVersion>\r
+      <data>\r
+        <version>4</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>SimOddAddressCheckP7</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CSimMandatory</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>derivativeSim</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>SimEnablePSP</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>SimPspOverrideConfig</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>SimPspConfigFile</name>\r
+          <state>###Uninitialized###</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <debuggerPlugins>\r
+      <plugin>\r
+        <file>$TOOLKIT_DIR$\plugins\Lcd\lcd.ewplugin</file>\r
+        <loadFlag>1</loadFlag>\r
+      </plugin>\r
+      <plugin>\r
+        <file>$TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin</file>\r
+        <loadFlag>0</loadFlag>\r
+      </plugin>\r
+      <plugin>\r
+        <file>$TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin</file>\r
+        <loadFlag>0</loadFlag>\r
+      </plugin>\r
+      <plugin>\r
+        <file>$TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin</file>\r
+        <loadFlag>0</loadFlag>\r
+      </plugin>\r
+      <plugin>\r
+        <file>$TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin</file>\r
+        <loadFlag>0</loadFlag>\r
+      </plugin>\r
+      <plugin>\r
+        <file>$EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin</file>\r
+        <loadFlag>1</loadFlag>\r
+      </plugin>\r
+      <plugin>\r
+        <file>$EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin</file>\r
+        <loadFlag>0</loadFlag>\r
+      </plugin>\r
+      <plugin>\r
+        <file>$EW_DIR$\common\plugins\Profiling\Profiling.ENU.ewplugin</file>\r
+        <loadFlag>1</loadFlag>\r
+      </plugin>\r
+      <plugin>\r
+        <file>$EW_DIR$\common\plugins\Stack\Stack.ENU.ewplugin</file>\r
+        <loadFlag>1</loadFlag>\r
+      </plugin>\r
+      <plugin>\r
+        <file>$EW_DIR$\common\plugins\SymList\SymList.ENU.ewplugin</file>\r
+        <loadFlag>1</loadFlag>\r
+      </plugin>\r
+    </debuggerPlugins>\r
+  </configuration>\r
+  <configuration>\r
+    <name>868MHz - Limited IAR Kickstart (Europe)</name>\r
+    <toolchain>\r
+      <name>MSP430</name>\r
+    </toolchain>\r
+    <debug>1</debug>\r
+    <settings>\r
+      <name>C-SPY</name>\r
+      <archiveVersion>4</archiveVersion>\r
+      <data>\r
+        <version>24</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>OCImagesSuppressCheck1</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OCImagesPath1</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>OCImagesSuppressCheck2</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OCImagesPath2</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>OCImagesSuppressCheck3</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OCImagesPath3</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>CInput</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>MacOverride</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>MacFile</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>IProcessor</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>GoToEnable</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>GoToName</name>\r
+          <state>main</state>\r
+        </option>\r
+        <option>\r
+          <name>DynDriver</name>\r
+          <state>430FET</state>\r
+        </option>\r
+        <option>\r
+          <name>dDllSlave</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>DdfFileSlave</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>DdfOverride</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>DdfFileName</name>\r
+          <state>$TOOLKIT_DIR$\config\CC430F6137.ddf</state>\r
+        </option>\r
+        <option>\r
+          <name>ProcTMS</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CExtraOptionsCheck</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CExtraOptions</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>ProcMSP430X</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CompilerDataModel</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>IVBASE</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CPUTAG</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>L092Mode</name>\r
+          <state>1</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>430FET</name>\r
+      <archiveVersion>1</archiveVersion>\r
+      <data>\r
+        <version>21</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>CFetMandatory</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Erase</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>EMUVerifyDownloadP7</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>EraseOptionSlaveP7</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>ExitBreakpointP7</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>PutcharBreakpointP7</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>GetcharBreakpointP7</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>derivativeP7</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>ParallelPortP7</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>TargetVoltage</name>\r
+          <state>3.3</state>\r
+        </option>\r
+        <option>\r
+          <name>AllowLockedFlashAccessP7</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>EMUAttach</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AttachOptionSlave</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CRadioProtocolType</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCRadioModuleTypeSlave</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>EEMLevel</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>DiasbleMemoryCache</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>NeedLockedFlashAccess</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>UsbComPort</name>\r
+          <state>Automatic</state>\r
+        </option>\r
+        <option>\r
+          <name>FetConnection</name>\r
+          <version>2</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>SoftwareBreakpointEnable</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>RadioSoftwareBreakpointType</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>TargetSettlingtime</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AllowAccessToBSL</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OTargetVccTypeDefault</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCBetaDll</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>GPassword</name>\r
+          <state>###Uninitialized###</state>\r
+        </option>\r
+        <option>\r
+          <name>DebugLPM5</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>LPM5Slave</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CRadioAutoManualType</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>ExternalCodeDownload</name>\r
+          <state>0</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>SIM430</name>\r
+      <archiveVersion>1</archiveVersion>\r
+      <data>\r
+        <version>4</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>SimOddAddressCheckP7</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CSimMandatory</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>derivativeSim</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>SimEnablePSP</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>SimPspOverrideConfig</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>SimPspConfigFile</name>\r
+          <state>###Uninitialized###</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <debuggerPlugins>\r
+      <plugin>\r
+        <file>$TOOLKIT_DIR$\plugins\Lcd\lcd.ewplugin</file>\r
+        <loadFlag>1</loadFlag>\r
+      </plugin>\r
+      <plugin>\r
+        <file>$TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin</file>\r
+        <loadFlag>0</loadFlag>\r
+      </plugin>\r
+      <plugin>\r
+        <file>$TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin</file>\r
+        <loadFlag>0</loadFlag>\r
+      </plugin>\r
+      <plugin>\r
+        <file>$TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin</file>\r
+        <loadFlag>0</loadFlag>\r
+      </plugin>\r
+      <plugin>\r
+        <file>$TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin</file>\r
+        <loadFlag>0</loadFlag>\r
+      </plugin>\r
+      <plugin>\r
+        <file>$EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin</file>\r
+        <loadFlag>1</loadFlag>\r
+      </plugin>\r
+      <plugin>\r
+        <file>$EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin</file>\r
+        <loadFlag>0</loadFlag>\r
+      </plugin>\r
+      <plugin>\r
+        <file>$EW_DIR$\common\plugins\Profiling\Profiling.ENU.ewplugin</file>\r
+        <loadFlag>1</loadFlag>\r
+      </plugin>\r
+      <plugin>\r
+        <file>$EW_DIR$\common\plugins\Stack\Stack.ENU.ewplugin</file>\r
+        <loadFlag>1</loadFlag>\r
+      </plugin>\r
+      <plugin>\r
+        <file>$EW_DIR$\common\plugins\SymList\SymList.ENU.ewplugin</file>\r
+        <loadFlag>1</loadFlag>\r
+      </plugin>\r
+    </debuggerPlugins>\r
+  </configuration>\r
+  <configuration>\r
+    <name>433MHz - Limited IAR Kickstart (Other regions)</name>\r
+    <toolchain>\r
+      <name>MSP430</name>\r
+    </toolchain>\r
+    <debug>1</debug>\r
+    <settings>\r
+      <name>C-SPY</name>\r
+      <archiveVersion>4</archiveVersion>\r
+      <data>\r
+        <version>24</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>OCImagesSuppressCheck1</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OCImagesPath1</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>OCImagesSuppressCheck2</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OCImagesPath2</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>OCImagesSuppressCheck3</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OCImagesPath3</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>CInput</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>MacOverride</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>MacFile</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>IProcessor</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>GoToEnable</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>GoToName</name>\r
+          <state>main</state>\r
+        </option>\r
+        <option>\r
+          <name>DynDriver</name>\r
+          <state>430FET</state>\r
+        </option>\r
+        <option>\r
+          <name>dDllSlave</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>DdfFileSlave</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>DdfOverride</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>DdfFileName</name>\r
+          <state>$TOOLKIT_DIR$\config\CC430F6137.ddf</state>\r
+        </option>\r
+        <option>\r
+          <name>ProcTMS</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CExtraOptionsCheck</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CExtraOptions</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>ProcMSP430X</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CompilerDataModel</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>IVBASE</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CPUTAG</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>L092Mode</name>\r
+          <state>1</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>430FET</name>\r
+      <archiveVersion>1</archiveVersion>\r
+      <data>\r
+        <version>21</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>CFetMandatory</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Erase</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>EMUVerifyDownloadP7</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>EraseOptionSlaveP7</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>ExitBreakpointP7</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>PutcharBreakpointP7</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>GetcharBreakpointP7</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>derivativeP7</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>ParallelPortP7</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>TargetVoltage</name>\r
+          <state>3.3</state>\r
+        </option>\r
+        <option>\r
+          <name>AllowLockedFlashAccessP7</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>EMUAttach</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AttachOptionSlave</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CRadioProtocolType</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCRadioModuleTypeSlave</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>EEMLevel</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>DiasbleMemoryCache</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>NeedLockedFlashAccess</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>UsbComPort</name>\r
+          <state>Automatic</state>\r
+        </option>\r
+        <option>\r
+          <name>FetConnection</name>\r
+          <version>2</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>SoftwareBreakpointEnable</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>RadioSoftwareBreakpointType</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>TargetSettlingtime</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AllowAccessToBSL</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OTargetVccTypeDefault</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCBetaDll</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>GPassword</name>\r
+          <state>###Uninitialized###</state>\r
+        </option>\r
+        <option>\r
+          <name>DebugLPM5</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>LPM5Slave</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CRadioAutoManualType</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>ExternalCodeDownload</name>\r
+          <state>0</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>SIM430</name>\r
+      <archiveVersion>1</archiveVersion>\r
+      <data>\r
+        <version>4</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>SimOddAddressCheckP7</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CSimMandatory</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>derivativeSim</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>SimEnablePSP</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>SimPspOverrideConfig</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>SimPspConfigFile</name>\r
+          <state>###Uninitialized###</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <debuggerPlugins>\r
+      <plugin>\r
+        <file>$TOOLKIT_DIR$\plugins\Lcd\lcd.ewplugin</file>\r
+        <loadFlag>1</loadFlag>\r
+      </plugin>\r
+      <plugin>\r
+        <file>$TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin</file>\r
+        <loadFlag>0</loadFlag>\r
+      </plugin>\r
+      <plugin>\r
+        <file>$TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin</file>\r
+        <loadFlag>0</loadFlag>\r
+      </plugin>\r
+      <plugin>\r
+        <file>$TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin</file>\r
+        <loadFlag>0</loadFlag>\r
+      </plugin>\r
+      <plugin>\r
+        <file>$TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin</file>\r
+        <loadFlag>0</loadFlag>\r
+      </plugin>\r
+      <plugin>\r
+        <file>$EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin</file>\r
+        <loadFlag>1</loadFlag>\r
+      </plugin>\r
+      <plugin>\r
+        <file>$EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin</file>\r
+        <loadFlag>0</loadFlag>\r
+      </plugin>\r
+      <plugin>\r
+        <file>$EW_DIR$\common\plugins\Profiling\Profiling.ENU.ewplugin</file>\r
+        <loadFlag>1</loadFlag>\r
+      </plugin>\r
+      <plugin>\r
+        <file>$EW_DIR$\common\plugins\Stack\Stack.ENU.ewplugin</file>\r
+        <loadFlag>1</loadFlag>\r
+      </plugin>\r
+      <plugin>\r
+        <file>$EW_DIR$\common\plugins\SymList\SymList.ENU.ewplugin</file>\r
+        <loadFlag>1</loadFlag>\r
+      </plugin>\r
+    </debuggerPlugins>\r
+  </configuration>\r
+  <configuration>\r
+    <name>915MHz - Unrestricted IAR Workbench (USA)</name>\r
+    <toolchain>\r
+      <name>MSP430</name>\r
+    </toolchain>\r
+    <debug>1</debug>\r
+    <settings>\r
+      <name>C-SPY</name>\r
+      <archiveVersion>4</archiveVersion>\r
+      <data>\r
+        <version>24</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>OCImagesSuppressCheck1</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OCImagesPath1</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>OCImagesSuppressCheck2</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OCImagesPath2</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>OCImagesSuppressCheck3</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OCImagesPath3</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>CInput</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>MacOverride</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>MacFile</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>IProcessor</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>GoToEnable</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>GoToName</name>\r
+          <state>main</state>\r
+        </option>\r
+        <option>\r
+          <name>DynDriver</name>\r
+          <state>430FET</state>\r
+        </option>\r
+        <option>\r
+          <name>dDllSlave</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>DdfFileSlave</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>DdfOverride</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>DdfFileName</name>\r
+          <state>$TOOLKIT_DIR$\config\CC430F6137.ddf</state>\r
+        </option>\r
+        <option>\r
+          <name>ProcTMS</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CExtraOptionsCheck</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CExtraOptions</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>ProcMSP430X</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CompilerDataModel</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>IVBASE</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CPUTAG</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>L092Mode</name>\r
+          <state>1</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>430FET</name>\r
+      <archiveVersion>1</archiveVersion>\r
+      <data>\r
+        <version>21</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>CFetMandatory</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Erase</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>EMUVerifyDownloadP7</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>EraseOptionSlaveP7</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>ExitBreakpointP7</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>PutcharBreakpointP7</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>GetcharBreakpointP7</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>derivativeP7</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>ParallelPortP7</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>TargetVoltage</name>\r
+          <state>3.3</state>\r
+        </option>\r
+        <option>\r
+          <name>AllowLockedFlashAccessP7</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>EMUAttach</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AttachOptionSlave</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CRadioProtocolType</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCRadioModuleTypeSlave</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>EEMLevel</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>DiasbleMemoryCache</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>NeedLockedFlashAccess</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>UsbComPort</name>\r
+          <state>Automatic</state>\r
+        </option>\r
+        <option>\r
+          <name>FetConnection</name>\r
+          <version>2</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>SoftwareBreakpointEnable</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>RadioSoftwareBreakpointType</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>TargetSettlingtime</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AllowAccessToBSL</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OTargetVccTypeDefault</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCBetaDll</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>GPassword</name>\r
+          <state>###Uninitialized###</state>\r
+        </option>\r
+        <option>\r
+          <name>DebugLPM5</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>LPM5Slave</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CRadioAutoManualType</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>ExternalCodeDownload</name>\r
+          <state>0</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>SIM430</name>\r
+      <archiveVersion>1</archiveVersion>\r
+      <data>\r
+        <version>4</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>SimOddAddressCheckP7</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CSimMandatory</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>derivativeSim</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>SimEnablePSP</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>SimPspOverrideConfig</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>SimPspConfigFile</name>\r
+          <state>###Uninitialized###</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <debuggerPlugins>\r
+      <plugin>\r
+        <file>$TOOLKIT_DIR$\plugins\Lcd\lcd.ewplugin</file>\r
+        <loadFlag>1</loadFlag>\r
+      </plugin>\r
+      <plugin>\r
+        <file>$TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin</file>\r
+        <loadFlag>0</loadFlag>\r
+      </plugin>\r
+      <plugin>\r
+        <file>$TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin</file>\r
+        <loadFlag>0</loadFlag>\r
+      </plugin>\r
+      <plugin>\r
+        <file>$TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin</file>\r
+        <loadFlag>0</loadFlag>\r
+      </plugin>\r
+      <plugin>\r
+        <file>$TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin</file>\r
+        <loadFlag>0</loadFlag>\r
+      </plugin>\r
+      <plugin>\r
+        <file>$EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin</file>\r
+        <loadFlag>1</loadFlag>\r
+      </plugin>\r
+      <plugin>\r
+        <file>$EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin</file>\r
+        <loadFlag>0</loadFlag>\r
+      </plugin>\r
+      <plugin>\r
+        <file>$EW_DIR$\common\plugins\Profiling\Profiling.ENU.ewplugin</file>\r
+        <loadFlag>1</loadFlag>\r
+      </plugin>\r
+      <plugin>\r
+        <file>$EW_DIR$\common\plugins\Stack\Stack.ENU.ewplugin</file>\r
+        <loadFlag>1</loadFlag>\r
+      </plugin>\r
+      <plugin>\r
+        <file>$EW_DIR$\common\plugins\SymList\SymList.ENU.ewplugin</file>\r
+        <loadFlag>1</loadFlag>\r
+      </plugin>\r
+    </debuggerPlugins>\r
+  </configuration>\r
+  <configuration>\r
+    <name>868MHz - Unrestricted IAR Workbench (Europe)</name>\r
+    <toolchain>\r
+      <name>MSP430</name>\r
+    </toolchain>\r
+    <debug>1</debug>\r
+    <settings>\r
+      <name>C-SPY</name>\r
+      <archiveVersion>4</archiveVersion>\r
+      <data>\r
+        <version>24</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>OCImagesSuppressCheck1</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OCImagesPath1</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>OCImagesSuppressCheck2</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OCImagesPath2</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>OCImagesSuppressCheck3</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OCImagesPath3</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>CInput</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>MacOverride</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>MacFile</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>IProcessor</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>GoToEnable</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>GoToName</name>\r
+          <state>main</state>\r
+        </option>\r
+        <option>\r
+          <name>DynDriver</name>\r
+          <state>430FET</state>\r
+        </option>\r
+        <option>\r
+          <name>dDllSlave</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>DdfFileSlave</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>DdfOverride</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>DdfFileName</name>\r
+          <state>$TOOLKIT_DIR$\config\CC430F6137.ddf</state>\r
+        </option>\r
+        <option>\r
+          <name>ProcTMS</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CExtraOptionsCheck</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CExtraOptions</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>ProcMSP430X</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CompilerDataModel</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>IVBASE</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CPUTAG</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>L092Mode</name>\r
+          <state>1</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>430FET</name>\r
+      <archiveVersion>1</archiveVersion>\r
+      <data>\r
+        <version>21</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>CFetMandatory</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Erase</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>EMUVerifyDownloadP7</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>EraseOptionSlaveP7</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>ExitBreakpointP7</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>PutcharBreakpointP7</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>GetcharBreakpointP7</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>derivativeP7</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>ParallelPortP7</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>TargetVoltage</name>\r
+          <state>3.3</state>\r
+        </option>\r
+        <option>\r
+          <name>AllowLockedFlashAccessP7</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>EMUAttach</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AttachOptionSlave</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CRadioProtocolType</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCRadioModuleTypeSlave</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>EEMLevel</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>DiasbleMemoryCache</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>NeedLockedFlashAccess</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>UsbComPort</name>\r
+          <state>Automatic</state>\r
+        </option>\r
+        <option>\r
+          <name>FetConnection</name>\r
+          <version>2</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>SoftwareBreakpointEnable</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>RadioSoftwareBreakpointType</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>TargetSettlingtime</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AllowAccessToBSL</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OTargetVccTypeDefault</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCBetaDll</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>GPassword</name>\r
+          <state>###Uninitialized###</state>\r
+        </option>\r
+        <option>\r
+          <name>DebugLPM5</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>LPM5Slave</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CRadioAutoManualType</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>ExternalCodeDownload</name>\r
+          <state>0</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>SIM430</name>\r
+      <archiveVersion>1</archiveVersion>\r
+      <data>\r
+        <version>4</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>SimOddAddressCheckP7</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CSimMandatory</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>derivativeSim</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>SimEnablePSP</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>SimPspOverrideConfig</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>SimPspConfigFile</name>\r
+          <state>###Uninitialized###</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <debuggerPlugins>\r
+      <plugin>\r
+        <file>$TOOLKIT_DIR$\plugins\Lcd\lcd.ewplugin</file>\r
+        <loadFlag>1</loadFlag>\r
+      </plugin>\r
+      <plugin>\r
+        <file>$TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin</file>\r
+        <loadFlag>0</loadFlag>\r
+      </plugin>\r
+      <plugin>\r
+        <file>$TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin</file>\r
+        <loadFlag>0</loadFlag>\r
+      </plugin>\r
+      <plugin>\r
+        <file>$TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin</file>\r
+        <loadFlag>0</loadFlag>\r
+      </plugin>\r
+      <plugin>\r
+        <file>$TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin</file>\r
+        <loadFlag>0</loadFlag>\r
+      </plugin>\r
+      <plugin>\r
+        <file>$EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin</file>\r
+        <loadFlag>1</loadFlag>\r
+      </plugin>\r
+      <plugin>\r
+        <file>$EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin</file>\r
+        <loadFlag>0</loadFlag>\r
+      </plugin>\r
+      <plugin>\r
+        <file>$EW_DIR$\common\plugins\Profiling\Profiling.ENU.ewplugin</file>\r
+        <loadFlag>1</loadFlag>\r
+      </plugin>\r
+      <plugin>\r
+        <file>$EW_DIR$\common\plugins\Stack\Stack.ENU.ewplugin</file>\r
+        <loadFlag>1</loadFlag>\r
+      </plugin>\r
+      <plugin>\r
+        <file>$EW_DIR$\common\plugins\SymList\SymList.ENU.ewplugin</file>\r
+        <loadFlag>1</loadFlag>\r
+      </plugin>\r
+    </debuggerPlugins>\r
+  </configuration>\r
+  <configuration>\r
+    <name>433MHz - Unrestricted IAR Workbench (Other regions)</name>\r
+    <toolchain>\r
+      <name>MSP430</name>\r
+    </toolchain>\r
+    <debug>1</debug>\r
+    <settings>\r
+      <name>C-SPY</name>\r
+      <archiveVersion>4</archiveVersion>\r
+      <data>\r
+        <version>24</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>OCImagesSuppressCheck1</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OCImagesPath1</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>OCImagesSuppressCheck2</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OCImagesPath2</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>OCImagesSuppressCheck3</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OCImagesPath3</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>CInput</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>MacOverride</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>MacFile</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>IProcessor</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>GoToEnable</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>GoToName</name>\r
+          <state>main</state>\r
+        </option>\r
+        <option>\r
+          <name>DynDriver</name>\r
+          <state>430FET</state>\r
+        </option>\r
+        <option>\r
+          <name>dDllSlave</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>DdfFileSlave</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>DdfOverride</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>DdfFileName</name>\r
+          <state>$TOOLKIT_DIR$\config\CC430F6137.ddf</state>\r
+        </option>\r
+        <option>\r
+          <name>ProcTMS</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CExtraOptionsCheck</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CExtraOptions</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>ProcMSP430X</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CompilerDataModel</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>IVBASE</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CPUTAG</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>L092Mode</name>\r
+          <state>1</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>430FET</name>\r
+      <archiveVersion>1</archiveVersion>\r
+      <data>\r
+        <version>21</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>CFetMandatory</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Erase</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>EMUVerifyDownloadP7</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>EraseOptionSlaveP7</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>ExitBreakpointP7</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>PutcharBreakpointP7</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>GetcharBreakpointP7</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>derivativeP7</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>ParallelPortP7</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>TargetVoltage</name>\r
+          <state>3.3</state>\r
+        </option>\r
+        <option>\r
+          <name>AllowLockedFlashAccessP7</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>EMUAttach</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AttachOptionSlave</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CRadioProtocolType</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCRadioModuleTypeSlave</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>EEMLevel</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>DiasbleMemoryCache</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>NeedLockedFlashAccess</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>UsbComPort</name>\r
+          <state>Automatic</state>\r
+        </option>\r
+        <option>\r
+          <name>FetConnection</name>\r
+          <version>2</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>SoftwareBreakpointEnable</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>RadioSoftwareBreakpointType</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>TargetSettlingtime</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AllowAccessToBSL</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OTargetVccTypeDefault</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCBetaDll</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>GPassword</name>\r
+          <state>###Uninitialized###</state>\r
+        </option>\r
+        <option>\r
+          <name>DebugLPM5</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>LPM5Slave</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CRadioAutoManualType</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>ExternalCodeDownload</name>\r
+          <state>0</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>SIM430</name>\r
+      <archiveVersion>1</archiveVersion>\r
+      <data>\r
+        <version>4</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>SimOddAddressCheckP7</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CSimMandatory</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>derivativeSim</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>SimEnablePSP</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>SimPspOverrideConfig</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>SimPspConfigFile</name>\r
+          <state>###Uninitialized###</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <debuggerPlugins>\r
+      <plugin>\r
+        <file>$TOOLKIT_DIR$\plugins\Lcd\lcd.ewplugin</file>\r
+        <loadFlag>1</loadFlag>\r
+      </plugin>\r
+      <plugin>\r
+        <file>$TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin</file>\r
+        <loadFlag>0</loadFlag>\r
+      </plugin>\r
+      <plugin>\r
+        <file>$TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin</file>\r
+        <loadFlag>0</loadFlag>\r
+      </plugin>\r
+      <plugin>\r
+        <file>$TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin</file>\r
+        <loadFlag>0</loadFlag>\r
+      </plugin>\r
+      <plugin>\r
+        <file>$TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin</file>\r
+        <loadFlag>0</loadFlag>\r
+      </plugin>\r
+      <plugin>\r
+        <file>$EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin</file>\r
+        <loadFlag>1</loadFlag>\r
+      </plugin>\r
+      <plugin>\r
+        <file>$EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin</file>\r
+        <loadFlag>0</loadFlag>\r
+      </plugin>\r
+      <plugin>\r
+        <file>$EW_DIR$\common\plugins\Profiling\Profiling.ENU.ewplugin</file>\r
+        <loadFlag>1</loadFlag>\r
+      </plugin>\r
+      <plugin>\r
+        <file>$EW_DIR$\common\plugins\Stack\Stack.ENU.ewplugin</file>\r
+        <loadFlag>1</loadFlag>\r
+      </plugin>\r
+      <plugin>\r
+        <file>$EW_DIR$\common\plugins\SymList\SymList.ENU.ewplugin</file>\r
+        <loadFlag>1</loadFlag>\r
+      </plugin>\r
+    </debuggerPlugins>\r
+  </configuration>\r
+</project>\r
+\r
+\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/ez430_chronos_datalogger.ewp b/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/ez430_chronos_datalogger.ewp
new file mode 100755 (executable)
index 0000000..44fe498
--- /dev/null
@@ -0,0 +1,6037 @@
+<?xml version="1.0" encoding="iso-8859-1"?>\r
+\r
+<project>\r
+  <fileVersion>2</fileVersion>\r
+  <configuration>\r
+    <name>915MHz - Limited IAR Kickstart (USA)</name>\r
+    <toolchain>\r
+      <name>MSP430</name>\r
+    </toolchain>\r
+    <debug>1</debug>\r
+    <settings>\r
+      <name>General</name>\r
+      <archiveVersion>7</archiveVersion>\r
+      <data>\r
+        <version>27</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>ExePath</name>\r
+          <state>915MHz - Limited IAR Kickstart (USA)\Exe</state>\r
+        </option>\r
+        <option>\r
+          <name>ObjPath</name>\r
+          <state>915MHz - Limited IAR Kickstart (USA)\Obj</state>\r
+        </option>\r
+        <option>\r
+          <name>ListPath</name>\r
+          <state>915MHz - Limited IAR Kickstart (USA)\List</state>\r
+        </option>\r
+        <option>\r
+          <name>PosIndCode</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Hardware Multiplier</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>GOutputBinary</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AssemblerOnly</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OGDouble</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>GRuntimeLibSelect</name>\r
+          <version>0</version>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>RTDescription</name>\r
+          <state>Use the normal configuration of the C/EC++ runtime library. No locale interface, C locale, no file descriptor support, no multibytes in printf and scanf, and no hex floats in strtod.</state>\r
+        </option>\r
+        <option>\r
+          <name>RTConfigPath</name>\r
+          <state>$TOOLKIT_DIR$\LIB\DLIB\dl430xsfn.h</state>\r
+        </option>\r
+        <option>\r
+          <name>RTLibraryPath</name>\r
+          <state>$TOOLKIT_DIR$\LIB\DLIB\dl430xsfn.r43</state>\r
+        </option>\r
+        <option>\r
+          <name>Input variant</name>\r
+          <version>0</version>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Input description</name>\r
+          <state>No specifier n, no float or long long.</state>\r
+        </option>\r
+        <option>\r
+          <name>Output variant</name>\r
+          <version>0</version>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Output description</name>\r
+          <state>No specifier a or A.</state>\r
+        </option>\r
+        <option>\r
+          <name>GRuntimeLibSelectSlave</name>\r
+          <version>0</version>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OGCore</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>GeneralEnableMisra</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>GeneralMisraVerbose</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OGChipSelectMenu</name>\r
+          <state>CC430F6137    CC430F6137</state>\r
+        </option>\r
+        <option>\r
+          <name>GStackHeapOverride</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>GStackSize2</name>\r
+          <state>80</state>\r
+        </option>\r
+        <option>\r
+          <name>GHeapSize2</name>\r
+          <state>80</state>\r
+        </option>\r
+        <option>\r
+          <name>RadioDataModelType</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>GHeap20Size</name>\r
+          <state>80</state>\r
+        </option>\r
+        <option>\r
+          <name>GeneralMisraRules98</name>\r
+          <version>0</version>\r
+          <state>1000111110110101101110011100111111101110011011000101110111101101100111111111111100110011111001110111001111111111111111111111111</state>\r
+        </option>\r
+        <option>\r
+          <name>RadioHeapSizeType</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>RadioHardwareMultiplierType</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>GeneralMisraVer</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>GeneralMisraRules04</name>\r
+          <version>0</version>\r
+          <state>111101110010111111111000110111111111111111111111111110010111101111010101111111111111111111111111101111111011111001111011111011111111111111111</state>\r
+        </option>\r
+        <option>\r
+          <name>RadioL092ModelType</name>\r
+          <state>0</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>ICC430</name>\r
+      <archiveVersion>4</archiveVersion>\r
+      <data>\r
+        <version>30</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>CCDefines</name>\r
+          <state>ISM_US</state>\r
+        </option>\r
+        <option>\r
+          <name>CCPreprocFile</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCPreprocComments</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCPreprocLine</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCListCFile</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCListCMnemonics</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCListCMessages</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCListAssFile</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCListAssSource</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCEnableRemarks</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCDiagSuppress</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>CCDiagRemark</name>\r
+          <state>Pa082</state>\r
+        </option>\r
+        <option>\r
+          <name>CCDiagWarning</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>CCDiagError</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>IObjPrefix2</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CCRequirePrototypes</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCAllowList</name>\r
+          <version>1</version>\r
+          <state>11111</state>\r
+        </option>\r
+        <option>\r
+          <name>CCObjUseModuleName</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCObjModuleName</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>CCDebugInfo</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>IProcessor</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCDiagWarnAreErr</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCCharIs</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CCExt</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCMultibyteSupport</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCMigrationPreprocExtentions</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCCompilerRuntimeInfo</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>IDoubleSize</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OutputFile</name>\r
+          <state>$FILE_BNAME$.r43</state>\r
+        </option>\r
+        <option>\r
+          <name>CCLibConfigHeader</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OCCR4Utilize</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OCCR5Utilize</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CPIC</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>IExtraOptionsCheck</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>IExtraOptions</name>\r
+          <state>-f"$PROJ_DIR$\simpliciti\Applications\configuration\End Device\smpl_config.dat"</state>\r
+          <state>-f"$PROJ_DIR$\simpliciti\Applications\configuration\smpl_nwk_config.dat"</state>\r
+        </option>\r
+        <option>\r
+          <name>PreInclude</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>CCOverrideModuleTypeDefault</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCRadioModuleType</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCRadioModuleTypeSlave</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>newCCIncludePaths</name>\r
+          <state>$PROJ_DIR$\</state>\r
+          <state>$PROJ_DIR$\include\</state>\r
+          <state>$PROJ_DIR$\driver\</state>\r
+          <state>$PROJ_DIR$\logic\</state>\r
+          <state>$PROJ_DIR$\bluerobin\</state>\r
+          <state>$PROJ_DIR$\simpliciti\</state>\r
+          <state>$PROJ_DIR$\simpliciti\Components\bsp</state>\r
+          <state>$PROJ_DIR$\simpliciti\Components\bsp\drivers</state>\r
+          <state>$PROJ_DIR$\simpliciti\Components\bsp\boards\CC430EM</state>\r
+          <state>$PROJ_DIR$\simpliciti\Components\mrfi</state>\r
+          <state>$PROJ_DIR$\simpliciti\Components\nwk</state>\r
+          <state>$PROJ_DIR$\simpliciti\Components\nwk_applications</state>\r
+        </option>\r
+        <option>\r
+          <name>CCStdIncCheck</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CompilerMisraOverride</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OI430X</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>ReduceStack</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Save20bit</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CompilerDataModel</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CCOptLevel</name>\r
+          <state>3</state>\r
+        </option>\r
+        <option>\r
+          <name>CCOptStrategy</name>\r
+          <version>0</version>\r
+          <state>2</state>\r
+        </option>\r
+        <option>\r
+          <name>CCOptLevelSlave</name>\r
+          <state>3</state>\r
+        </option>\r
+        <option>\r
+          <name>CInput</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CompilerMisraRules98</name>\r
+          <version>0</version>\r
+          <state>1000111110110101101110011100111111101110011011000101110111101101100111111111111100110011111001110111001111111111111111111111111</state>\r
+        </option>\r
+        <option>\r
+          <name>CompilerMisraRules04</name>\r
+          <version>0</version>\r
+          <state>111101110010111111111000110111111111111111111111111110010111101111010101111111111111111111111111101111111011111001111011111011111111111111111</state>\r
+        </option>\r
+        <option>\r
+          <name>IccLang</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>IccCDialect</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>IccAllowVLA</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>IccCppDialect</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>IccRelaxedFpPrecision</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCPUTAG</name>\r
+          <state>1</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>A430</name>\r
+      <archiveVersion>4</archiveVersion>\r
+      <data>\r
+        <version>13</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>AObjPrefix</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>ACaseSensitivity</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>MacroChars</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AWarnEnable</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AWarnWhat</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AWarnOne</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>AWarnRange1</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>AWarnRange2</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>ADefines</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>AList</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AListHeader</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>AListing</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Includes</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>MacDefs</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>MacExps</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>MacExec</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OnlyAssed</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>MultiLine</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>PageLengthCheck</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>PageLength</name>\r
+          <state>80</state>\r
+        </option>\r
+        <option>\r
+          <name>TabSpacing</name>\r
+          <state>8</state>\r
+        </option>\r
+        <option>\r
+          <name>AXRef</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AXRefDefines</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AXRefInternal</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AXRefDual</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>ADebug</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>ADebugType</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>IProcessor</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AMaxErrOn</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AMaxErrNum</name>\r
+          <state>100</state>\r
+        </option>\r
+        <option>\r
+          <name>OutputFile</name>\r
+          <state>$FILE_BNAME$.r43</state>\r
+        </option>\r
+        <option>\r
+          <name>AMultibyteSupport</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AExtraOptionsCheck</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AExtraOptions</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>OA1M</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>AIgnoreStdInclude</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AStdIncludes</name>\r
+          <state>$TOOLKIT_DIR$\INC\</state>\r
+        </option>\r
+        <option>\r
+          <name>AUserIncludes</name>\r
+          <state></state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>CUSTOM</name>\r
+      <archiveVersion>3</archiveVersion>\r
+      <data>\r
+        <extensions></extensions>\r
+        <cmdline></cmdline>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>BICOMP</name>\r
+      <archiveVersion>0</archiveVersion>\r
+      <data/>\r
+    </settings>\r
+    <settings>\r
+      <name>BUILDACTION</name>\r
+      <archiveVersion>1</archiveVersion>\r
+      <data>\r
+        <prebuild></prebuild>\r
+        <postbuild></postbuild>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>XLINK</name>\r
+      <archiveVersion>4</archiveVersion>\r
+      <data>\r
+        <version>22</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>XOutOverride</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OutputFile</name>\r
+          <state>ez430_chronos_datalogger_915MHz.d43</state>\r
+        </option>\r
+        <option>\r
+          <name>OutputFormat</name>\r
+          <version>11</version>\r
+          <state>33</state>\r
+        </option>\r
+        <option>\r
+          <name>FormatVariant</name>\r
+          <version>8</version>\r
+          <state>2</state>\r
+        </option>\r
+        <option>\r
+          <name>SecondaryOutputFile</name>\r
+          <state>(None for the selected format)</state>\r
+        </option>\r
+        <option>\r
+          <name>XDefines</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>AlwaysOutput</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OverlapWarnings</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>NoGlobalCheck</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>XList</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>SegmentMap</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>ListSymbols</name>\r
+          <state>2</state>\r
+        </option>\r
+        <option>\r
+          <name>PageLengthCheck</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>PageLength</name>\r
+          <state>80</state>\r
+        </option>\r
+        <option>\r
+          <name>XIncludes</name>\r
+          <state>$TOOLKIT_DIR$\LIB\</state>\r
+        </option>\r
+        <option>\r
+          <name>ModuleStatus</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>XclOverride</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>XclFile</name>\r
+          <state>$PROJ_DIR$\lnkCC430F6137.xcl</state>\r
+        </option>\r
+        <option>\r
+          <name>XclFileSlave</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>DoFill</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>FillerByte</name>\r
+          <state>0xFF</state>\r
+        </option>\r
+        <option>\r
+          <name>DoCrc</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CrcSize</name>\r
+          <version>0</version>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CrcAlgo</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CrcPoly</name>\r
+          <state>0x11021</state>\r
+        </option>\r
+        <option>\r
+          <name>CrcCompl</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>RangeCheckAlternatives</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>SuppressAllWarn</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>SuppressDiags</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>TreatAsWarn</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>TreatAsErr</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>ModuleLocalSym</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CrcBitOrder</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>XHardwareMul</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>IncludeSuppressed</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>ModuleSummary</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>XlinkStackSize</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>XlinkCodeModel</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>xcProgramEntryLabel</name>\r
+          <state>__program_start</state>\r
+        </option>\r
+        <option>\r
+          <name>DebugInformation</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>RuntimeControl</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>IoEmulation</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>XcRTLibraryFile</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OXLibIOConfig</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>XLibraryHeap</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>AllowExtraOutput</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>GenerateExtraOutput</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>XExtraOutOverride</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>ExtraOutputFile</name>\r
+          <state>ez430_chronos_datalogger.a43</state>\r
+        </option>\r
+        <option>\r
+          <name>ExtraOutputFormat</name>\r
+          <version>11</version>\r
+          <state>23</state>\r
+        </option>\r
+        <option>\r
+          <name>ExtraFormatVariant</name>\r
+          <version>8</version>\r
+          <state>2</state>\r
+        </option>\r
+        <option>\r
+          <name>xcOverrideProgramEntryLabel</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>xcProgramEntryLabelSelect</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>ListOutputFormat</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>BufferedTermOutput</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>XExtraOptionsCheck</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>XExtraOptions</name>\r
+          <state>--ks_version</state>\r
+        </option>\r
+        <option>\r
+          <name>OverlaySystemMap</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>RawBinaryFile</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>RawBinarySymbol</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>RawBinarySegment</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>RawBinaryAlign</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>XLinkMisraHandler</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CrcAlign</name>\r
+          <state>2</state>\r
+        </option>\r
+        <option>\r
+          <name>CrcInitialValue</name>\r
+          <state>0x0</state>\r
+        </option>\r
+        <option>\r
+          <name>XLibraryHeap20</name>\r
+          <state>1</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>XAR</name>\r
+      <archiveVersion>4</archiveVersion>\r
+      <data>\r
+        <version>0</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>XAROutOverride</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>XARInputs</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>OutputFile</name>\r
+          <state></state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>BILINK</name>\r
+      <archiveVersion>0</archiveVersion>\r
+      <data/>\r
+    </settings>\r
+  </configuration>\r
+  <configuration>\r
+    <name>868MHz - Limited IAR Kickstart (Europe)</name>\r
+    <toolchain>\r
+      <name>MSP430</name>\r
+    </toolchain>\r
+    <debug>1</debug>\r
+    <settings>\r
+      <name>General</name>\r
+      <archiveVersion>7</archiveVersion>\r
+      <data>\r
+        <version>27</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>ExePath</name>\r
+          <state>868MHz - Limited IAR Kickstart (Europe)\Exe</state>\r
+        </option>\r
+        <option>\r
+          <name>ObjPath</name>\r
+          <state>868MHz - Limited IAR Kickstart (Europe)\Obj</state>\r
+        </option>\r
+        <option>\r
+          <name>ListPath</name>\r
+          <state>868MHz - Limited IAR Kickstart (Europe)\List</state>\r
+        </option>\r
+        <option>\r
+          <name>PosIndCode</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Hardware Multiplier</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>GOutputBinary</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AssemblerOnly</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OGDouble</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>GRuntimeLibSelect</name>\r
+          <version>0</version>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>RTDescription</name>\r
+          <state>Use the normal configuration of the C/EC++ runtime library. No locale interface, C locale, no file descriptor support, no multibytes in printf and scanf, and no hex floats in strtod.</state>\r
+        </option>\r
+        <option>\r
+          <name>RTConfigPath</name>\r
+          <state>$TOOLKIT_DIR$\LIB\DLIB\dl430xsfn.h</state>\r
+        </option>\r
+        <option>\r
+          <name>RTLibraryPath</name>\r
+          <state>$TOOLKIT_DIR$\LIB\DLIB\dl430xsfn.r43</state>\r
+        </option>\r
+        <option>\r
+          <name>Input variant</name>\r
+          <version>0</version>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Input description</name>\r
+          <state>No specifier n, no float or long long.</state>\r
+        </option>\r
+        <option>\r
+          <name>Output variant</name>\r
+          <version>0</version>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Output description</name>\r
+          <state>No specifier a or A.</state>\r
+        </option>\r
+        <option>\r
+          <name>GRuntimeLibSelectSlave</name>\r
+          <version>0</version>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OGCore</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>GeneralEnableMisra</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>GeneralMisraVerbose</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OGChipSelectMenu</name>\r
+          <state>CC430F6137    CC430F6137</state>\r
+        </option>\r
+        <option>\r
+          <name>GStackHeapOverride</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>GStackSize2</name>\r
+          <state>80</state>\r
+        </option>\r
+        <option>\r
+          <name>GHeapSize2</name>\r
+          <state>80</state>\r
+        </option>\r
+        <option>\r
+          <name>RadioDataModelType</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>GHeap20Size</name>\r
+          <state>80</state>\r
+        </option>\r
+        <option>\r
+          <name>GeneralMisraRules98</name>\r
+          <version>0</version>\r
+          <state>1000111110110101101110011100111111101110011011000101110111101101100111111111111100110011111001110111001111111111111111111111111</state>\r
+        </option>\r
+        <option>\r
+          <name>RadioHeapSizeType</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>RadioHardwareMultiplierType</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>GeneralMisraVer</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>GeneralMisraRules04</name>\r
+          <version>0</version>\r
+          <state>111101110010111111111000110111111111111111111111111110010111101111010101111111111111111111111111101111111011111001111011111011111111111111111</state>\r
+        </option>\r
+        <option>\r
+          <name>RadioL092ModelType</name>\r
+          <state>0</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>ICC430</name>\r
+      <archiveVersion>4</archiveVersion>\r
+      <data>\r
+        <version>30</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>CCDefines</name>\r
+          <state>ISM_EU</state>\r
+        </option>\r
+        <option>\r
+          <name>CCPreprocFile</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCPreprocComments</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCPreprocLine</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCListCFile</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCListCMnemonics</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCListCMessages</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCListAssFile</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCListAssSource</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCEnableRemarks</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCDiagSuppress</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>CCDiagRemark</name>\r
+          <state>Pa082</state>\r
+        </option>\r
+        <option>\r
+          <name>CCDiagWarning</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>CCDiagError</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>IObjPrefix2</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CCRequirePrototypes</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCAllowList</name>\r
+          <version>1</version>\r
+          <state>11111</state>\r
+        </option>\r
+        <option>\r
+          <name>CCObjUseModuleName</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCObjModuleName</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>CCDebugInfo</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>IProcessor</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCDiagWarnAreErr</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCCharIs</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CCExt</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCMultibyteSupport</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCMigrationPreprocExtentions</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCCompilerRuntimeInfo</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>IDoubleSize</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OutputFile</name>\r
+          <state>$FILE_BNAME$.r43</state>\r
+        </option>\r
+        <option>\r
+          <name>CCLibConfigHeader</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OCCR4Utilize</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OCCR5Utilize</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CPIC</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>IExtraOptionsCheck</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>IExtraOptions</name>\r
+          <state>-f"$PROJ_DIR$\simpliciti\Applications\configuration\End Device\smpl_config.dat"</state>\r
+          <state>-f"$PROJ_DIR$\simpliciti\Applications\configuration\smpl_nwk_config.dat"</state>\r
+        </option>\r
+        <option>\r
+          <name>PreInclude</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>CCOverrideModuleTypeDefault</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCRadioModuleType</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCRadioModuleTypeSlave</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>newCCIncludePaths</name>\r
+          <state>$PROJ_DIR$\</state>\r
+          <state>$PROJ_DIR$\include\</state>\r
+          <state>$PROJ_DIR$\driver\</state>\r
+          <state>$PROJ_DIR$\logic\</state>\r
+          <state>$PROJ_DIR$\bluerobin\</state>\r
+          <state>$PROJ_DIR$\simpliciti\</state>\r
+          <state>$PROJ_DIR$\simpliciti\Components\bsp</state>\r
+          <state>$PROJ_DIR$\simpliciti\Components\bsp\drivers</state>\r
+          <state>$PROJ_DIR$\simpliciti\Components\bsp\boards\CC430EM</state>\r
+          <state>$PROJ_DIR$\simpliciti\Components\mrfi</state>\r
+          <state>$PROJ_DIR$\simpliciti\Components\nwk</state>\r
+          <state>$PROJ_DIR$\simpliciti\Components\nwk_applications</state>\r
+        </option>\r
+        <option>\r
+          <name>CCStdIncCheck</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CompilerMisraOverride</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OI430X</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>ReduceStack</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Save20bit</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CompilerDataModel</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CCOptLevel</name>\r
+          <state>3</state>\r
+        </option>\r
+        <option>\r
+          <name>CCOptStrategy</name>\r
+          <version>0</version>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CCOptLevelSlave</name>\r
+          <state>3</state>\r
+        </option>\r
+        <option>\r
+          <name>CInput</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CompilerMisraRules98</name>\r
+          <version>0</version>\r
+          <state>1000111110110101101110011100111111101110011011000101110111101101100111111111111100110011111001110111001111111111111111111111111</state>\r
+        </option>\r
+        <option>\r
+          <name>CompilerMisraRules04</name>\r
+          <version>0</version>\r
+          <state>111101110010111111111000110111111111111111111111111110010111101111010101111111111111111111111111101111111011111001111011111011111111111111111</state>\r
+        </option>\r
+        <option>\r
+          <name>IccLang</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>IccCDialect</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>IccAllowVLA</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>IccCppDialect</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>IccRelaxedFpPrecision</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCPUTAG</name>\r
+          <state>1</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>A430</name>\r
+      <archiveVersion>4</archiveVersion>\r
+      <data>\r
+        <version>13</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>AObjPrefix</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>ACaseSensitivity</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>MacroChars</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AWarnEnable</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AWarnWhat</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AWarnOne</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>AWarnRange1</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>AWarnRange2</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>ADefines</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>AList</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AListHeader</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>AListing</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Includes</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>MacDefs</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>MacExps</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>MacExec</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OnlyAssed</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>MultiLine</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>PageLengthCheck</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>PageLength</name>\r
+          <state>80</state>\r
+        </option>\r
+        <option>\r
+          <name>TabSpacing</name>\r
+          <state>8</state>\r
+        </option>\r
+        <option>\r
+          <name>AXRef</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AXRefDefines</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AXRefInternal</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AXRefDual</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>ADebug</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>ADebugType</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>IProcessor</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AMaxErrOn</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AMaxErrNum</name>\r
+          <state>100</state>\r
+        </option>\r
+        <option>\r
+          <name>OutputFile</name>\r
+          <state>$FILE_BNAME$.r43</state>\r
+        </option>\r
+        <option>\r
+          <name>AMultibyteSupport</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AExtraOptionsCheck</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AExtraOptions</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>OA1M</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>AIgnoreStdInclude</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AStdIncludes</name>\r
+          <state>$TOOLKIT_DIR$\INC\</state>\r
+        </option>\r
+        <option>\r
+          <name>AUserIncludes</name>\r
+          <state></state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>CUSTOM</name>\r
+      <archiveVersion>3</archiveVersion>\r
+      <data>\r
+        <extensions></extensions>\r
+        <cmdline></cmdline>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>BICOMP</name>\r
+      <archiveVersion>0</archiveVersion>\r
+      <data/>\r
+    </settings>\r
+    <settings>\r
+      <name>BUILDACTION</name>\r
+      <archiveVersion>1</archiveVersion>\r
+      <data>\r
+        <prebuild></prebuild>\r
+        <postbuild></postbuild>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>XLINK</name>\r
+      <archiveVersion>4</archiveVersion>\r
+      <data>\r
+        <version>22</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>XOutOverride</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OutputFile</name>\r
+          <state>ez430_chronos_datalogger_868MHz.d43</state>\r
+        </option>\r
+        <option>\r
+          <name>OutputFormat</name>\r
+          <version>11</version>\r
+          <state>33</state>\r
+        </option>\r
+        <option>\r
+          <name>FormatVariant</name>\r
+          <version>8</version>\r
+          <state>2</state>\r
+        </option>\r
+        <option>\r
+          <name>SecondaryOutputFile</name>\r
+          <state>(None for the selected format)</state>\r
+        </option>\r
+        <option>\r
+          <name>XDefines</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>AlwaysOutput</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OverlapWarnings</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>NoGlobalCheck</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>XList</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>SegmentMap</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>ListSymbols</name>\r
+          <state>2</state>\r
+        </option>\r
+        <option>\r
+          <name>PageLengthCheck</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>PageLength</name>\r
+          <state>80</state>\r
+        </option>\r
+        <option>\r
+          <name>XIncludes</name>\r
+          <state>$TOOLKIT_DIR$\LIB\</state>\r
+        </option>\r
+        <option>\r
+          <name>ModuleStatus</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>XclOverride</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>XclFile</name>\r
+          <state>$PROJ_DIR$\lnkCC430F6137.xcl</state>\r
+        </option>\r
+        <option>\r
+          <name>XclFileSlave</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>DoFill</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>FillerByte</name>\r
+          <state>0xFF</state>\r
+        </option>\r
+        <option>\r
+          <name>DoCrc</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CrcSize</name>\r
+          <version>0</version>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CrcAlgo</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CrcPoly</name>\r
+          <state>0x11021</state>\r
+        </option>\r
+        <option>\r
+          <name>CrcCompl</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>RangeCheckAlternatives</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>SuppressAllWarn</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>SuppressDiags</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>TreatAsWarn</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>TreatAsErr</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>ModuleLocalSym</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CrcBitOrder</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>XHardwareMul</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>IncludeSuppressed</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>ModuleSummary</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>XlinkStackSize</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>XlinkCodeModel</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>xcProgramEntryLabel</name>\r
+          <state>__program_start</state>\r
+        </option>\r
+        <option>\r
+          <name>DebugInformation</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>RuntimeControl</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>IoEmulation</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>XcRTLibraryFile</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OXLibIOConfig</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>XLibraryHeap</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>AllowExtraOutput</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>GenerateExtraOutput</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>XExtraOutOverride</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>ExtraOutputFile</name>\r
+          <state>ez430_chronos_datalogger.a43</state>\r
+        </option>\r
+        <option>\r
+          <name>ExtraOutputFormat</name>\r
+          <version>11</version>\r
+          <state>23</state>\r
+        </option>\r
+        <option>\r
+          <name>ExtraFormatVariant</name>\r
+          <version>8</version>\r
+          <state>2</state>\r
+        </option>\r
+        <option>\r
+          <name>xcOverrideProgramEntryLabel</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>xcProgramEntryLabelSelect</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>ListOutputFormat</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>BufferedTermOutput</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>XExtraOptionsCheck</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>XExtraOptions</name>\r
+          <state>--ks_version</state>\r
+        </option>\r
+        <option>\r
+          <name>OverlaySystemMap</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>RawBinaryFile</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>RawBinarySymbol</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>RawBinarySegment</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>RawBinaryAlign</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>XLinkMisraHandler</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CrcAlign</name>\r
+          <state>2</state>\r
+        </option>\r
+        <option>\r
+          <name>CrcInitialValue</name>\r
+          <state>0x0</state>\r
+        </option>\r
+        <option>\r
+          <name>XLibraryHeap20</name>\r
+          <state>1</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>XAR</name>\r
+      <archiveVersion>4</archiveVersion>\r
+      <data>\r
+        <version>0</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>XAROutOverride</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>XARInputs</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>OutputFile</name>\r
+          <state></state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>BILINK</name>\r
+      <archiveVersion>0</archiveVersion>\r
+      <data/>\r
+    </settings>\r
+  </configuration>\r
+  <configuration>\r
+    <name>433MHz - Limited IAR Kickstart (Other regions)</name>\r
+    <toolchain>\r
+      <name>MSP430</name>\r
+    </toolchain>\r
+    <debug>1</debug>\r
+    <settings>\r
+      <name>General</name>\r
+      <archiveVersion>7</archiveVersion>\r
+      <data>\r
+        <version>27</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>ExePath</name>\r
+          <state>433MHz - Limited IAR Kickstart (Other regions)\Exe</state>\r
+        </option>\r
+        <option>\r
+          <name>ObjPath</name>\r
+          <state>433MHz - Limited IAR Kickstart (Other regions)\Obj</state>\r
+        </option>\r
+        <option>\r
+          <name>ListPath</name>\r
+          <state>433MHz - Limited IAR Kickstart (Other regions)\List</state>\r
+        </option>\r
+        <option>\r
+          <name>PosIndCode</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Hardware Multiplier</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>GOutputBinary</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AssemblerOnly</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OGDouble</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>GRuntimeLibSelect</name>\r
+          <version>0</version>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>RTDescription</name>\r
+          <state>Use the normal configuration of the C/EC++ runtime library. No locale interface, C locale, no file descriptor support, no multibytes in printf and scanf, and no hex floats in strtod.</state>\r
+        </option>\r
+        <option>\r
+          <name>RTConfigPath</name>\r
+          <state>$TOOLKIT_DIR$\LIB\DLIB\dl430xsfn.h</state>\r
+        </option>\r
+        <option>\r
+          <name>RTLibraryPath</name>\r
+          <state>$TOOLKIT_DIR$\LIB\DLIB\dl430xsfn.r43</state>\r
+        </option>\r
+        <option>\r
+          <name>Input variant</name>\r
+          <version>0</version>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Input description</name>\r
+          <state>No specifier n, no float or long long.</state>\r
+        </option>\r
+        <option>\r
+          <name>Output variant</name>\r
+          <version>0</version>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Output description</name>\r
+          <state>No specifier a or A.</state>\r
+        </option>\r
+        <option>\r
+          <name>GRuntimeLibSelectSlave</name>\r
+          <version>0</version>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OGCore</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>GeneralEnableMisra</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>GeneralMisraVerbose</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OGChipSelectMenu</name>\r
+          <state>CC430F6137    CC430F6137</state>\r
+        </option>\r
+        <option>\r
+          <name>GStackHeapOverride</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>GStackSize2</name>\r
+          <state>80</state>\r
+        </option>\r
+        <option>\r
+          <name>GHeapSize2</name>\r
+          <state>80</state>\r
+        </option>\r
+        <option>\r
+          <name>RadioDataModelType</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>GHeap20Size</name>\r
+          <state>80</state>\r
+        </option>\r
+        <option>\r
+          <name>GeneralMisraRules98</name>\r
+          <version>0</version>\r
+          <state>1000111110110101101110011100111111101110011011000101110111101101100111111111111100110011111001110111001111111111111111111111111</state>\r
+        </option>\r
+        <option>\r
+          <name>RadioHeapSizeType</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>RadioHardwareMultiplierType</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>GeneralMisraVer</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>GeneralMisraRules04</name>\r
+          <version>0</version>\r
+          <state>111101110010111111111000110111111111111111111111111110010111101111010101111111111111111111111111101111111011111001111011111011111111111111111</state>\r
+        </option>\r
+        <option>\r
+          <name>RadioL092ModelType</name>\r
+          <state>0</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>ICC430</name>\r
+      <archiveVersion>4</archiveVersion>\r
+      <data>\r
+        <version>30</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>CCDefines</name>\r
+          <state>ISM_LF</state>\r
+        </option>\r
+        <option>\r
+          <name>CCPreprocFile</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCPreprocComments</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCPreprocLine</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCListCFile</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCListCMnemonics</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCListCMessages</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCListAssFile</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCListAssSource</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCEnableRemarks</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCDiagSuppress</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>CCDiagRemark</name>\r
+          <state>Pa082</state>\r
+        </option>\r
+        <option>\r
+          <name>CCDiagWarning</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>CCDiagError</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>IObjPrefix2</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CCRequirePrototypes</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCAllowList</name>\r
+          <version>1</version>\r
+          <state>11111</state>\r
+        </option>\r
+        <option>\r
+          <name>CCObjUseModuleName</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCObjModuleName</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>CCDebugInfo</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>IProcessor</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCDiagWarnAreErr</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCCharIs</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CCExt</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCMultibyteSupport</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCMigrationPreprocExtentions</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCCompilerRuntimeInfo</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>IDoubleSize</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OutputFile</name>\r
+          <state>$FILE_BNAME$.r43</state>\r
+        </option>\r
+        <option>\r
+          <name>CCLibConfigHeader</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OCCR4Utilize</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OCCR5Utilize</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CPIC</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>IExtraOptionsCheck</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>IExtraOptions</name>\r
+          <state>-f"$PROJ_DIR$\simpliciti\Applications\configuration\End Device\smpl_config.dat"</state>\r
+          <state>-f"$PROJ_DIR$\simpliciti\Applications\configuration\smpl_nwk_config.dat"</state>\r
+        </option>\r
+        <option>\r
+          <name>PreInclude</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>CCOverrideModuleTypeDefault</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCRadioModuleType</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCRadioModuleTypeSlave</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>newCCIncludePaths</name>\r
+          <state>$PROJ_DIR$\</state>\r
+          <state>$PROJ_DIR$\include\</state>\r
+          <state>$PROJ_DIR$\driver\</state>\r
+          <state>$PROJ_DIR$\logic\</state>\r
+          <state>$PROJ_DIR$\bluerobin\</state>\r
+          <state>$PROJ_DIR$\simpliciti\</state>\r
+          <state>$PROJ_DIR$\simpliciti\Components\bsp</state>\r
+          <state>$PROJ_DIR$\simpliciti\Components\bsp\drivers</state>\r
+          <state>$PROJ_DIR$\simpliciti\Components\bsp\boards\CC430EM</state>\r
+          <state>$PROJ_DIR$\simpliciti\Components\mrfi</state>\r
+          <state>$PROJ_DIR$\simpliciti\Components\nwk</state>\r
+          <state>$PROJ_DIR$\simpliciti\Components\nwk_applications</state>\r
+          <state>$PROJ_DIR$\bluerobin\code</state>\r
+          <state>$PROJ_DIR$\bluerobin\lib</state>\r
+          <state>$PROJ_DIR$\bluerobin\lib\br_rx</state>\r
+        </option>\r
+        <option>\r
+          <name>CCStdIncCheck</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CompilerMisraOverride</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OI430X</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>ReduceStack</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Save20bit</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CompilerDataModel</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CCOptLevel</name>\r
+          <state>3</state>\r
+        </option>\r
+        <option>\r
+          <name>CCOptStrategy</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCOptLevelSlave</name>\r
+          <state>3</state>\r
+        </option>\r
+        <option>\r
+          <name>CInput</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CompilerMisraRules98</name>\r
+          <version>0</version>\r
+          <state>1000111110110101101110011100111111101110011011000101110111101101100111111111111100110011111001110111001111111111111111111111111</state>\r
+        </option>\r
+        <option>\r
+          <name>CompilerMisraRules04</name>\r
+          <version>0</version>\r
+          <state>111101110010111111111000110111111111111111111111111110010111101111010101111111111111111111111111101111111011111001111011111011111111111111111</state>\r
+        </option>\r
+        <option>\r
+          <name>IccLang</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>IccCDialect</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>IccAllowVLA</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>IccCppDialect</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>IccRelaxedFpPrecision</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCPUTAG</name>\r
+          <state>1</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>A430</name>\r
+      <archiveVersion>4</archiveVersion>\r
+      <data>\r
+        <version>13</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>AObjPrefix</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>ACaseSensitivity</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>MacroChars</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AWarnEnable</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AWarnWhat</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AWarnOne</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>AWarnRange1</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>AWarnRange2</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>ADefines</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>AList</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AListHeader</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>AListing</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Includes</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>MacDefs</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>MacExps</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>MacExec</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OnlyAssed</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>MultiLine</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>PageLengthCheck</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>PageLength</name>\r
+          <state>80</state>\r
+        </option>\r
+        <option>\r
+          <name>TabSpacing</name>\r
+          <state>8</state>\r
+        </option>\r
+        <option>\r
+          <name>AXRef</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AXRefDefines</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AXRefInternal</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AXRefDual</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>ADebug</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>ADebugType</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>IProcessor</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AMaxErrOn</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AMaxErrNum</name>\r
+          <state>100</state>\r
+        </option>\r
+        <option>\r
+          <name>OutputFile</name>\r
+          <state>$FILE_BNAME$.r43</state>\r
+        </option>\r
+        <option>\r
+          <name>AMultibyteSupport</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AExtraOptionsCheck</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AExtraOptions</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>OA1M</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>AIgnoreStdInclude</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AStdIncludes</name>\r
+          <state>$TOOLKIT_DIR$\INC\</state>\r
+        </option>\r
+        <option>\r
+          <name>AUserIncludes</name>\r
+          <state></state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>CUSTOM</name>\r
+      <archiveVersion>3</archiveVersion>\r
+      <data>\r
+        <extensions></extensions>\r
+        <cmdline></cmdline>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>BICOMP</name>\r
+      <archiveVersion>0</archiveVersion>\r
+      <data/>\r
+    </settings>\r
+    <settings>\r
+      <name>BUILDACTION</name>\r
+      <archiveVersion>1</archiveVersion>\r
+      <data>\r
+        <prebuild></prebuild>\r
+        <postbuild></postbuild>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>XLINK</name>\r
+      <archiveVersion>4</archiveVersion>\r
+      <data>\r
+        <version>22</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>XOutOverride</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OutputFile</name>\r
+          <state>ez430_chronos_datalogger_433MHz.d43</state>\r
+        </option>\r
+        <option>\r
+          <name>OutputFormat</name>\r
+          <version>11</version>\r
+          <state>33</state>\r
+        </option>\r
+        <option>\r
+          <name>FormatVariant</name>\r
+          <version>8</version>\r
+          <state>2</state>\r
+        </option>\r
+        <option>\r
+          <name>SecondaryOutputFile</name>\r
+          <state>(None for the selected format)</state>\r
+        </option>\r
+        <option>\r
+          <name>XDefines</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>AlwaysOutput</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OverlapWarnings</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>NoGlobalCheck</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>XList</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>SegmentMap</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>ListSymbols</name>\r
+          <state>2</state>\r
+        </option>\r
+        <option>\r
+          <name>PageLengthCheck</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>PageLength</name>\r
+          <state>80</state>\r
+        </option>\r
+        <option>\r
+          <name>XIncludes</name>\r
+          <state>$TOOLKIT_DIR$\LIB\</state>\r
+        </option>\r
+        <option>\r
+          <name>ModuleStatus</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>XclOverride</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>XclFile</name>\r
+          <state>$PROJ_DIR$\lnkCC430F6137.xcl</state>\r
+        </option>\r
+        <option>\r
+          <name>XclFileSlave</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>DoFill</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>FillerByte</name>\r
+          <state>0xFF</state>\r
+        </option>\r
+        <option>\r
+          <name>DoCrc</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CrcSize</name>\r
+          <version>0</version>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CrcAlgo</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CrcPoly</name>\r
+          <state>0x11021</state>\r
+        </option>\r
+        <option>\r
+          <name>CrcCompl</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>RangeCheckAlternatives</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>SuppressAllWarn</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>SuppressDiags</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>TreatAsWarn</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>TreatAsErr</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>ModuleLocalSym</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CrcBitOrder</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>XHardwareMul</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>IncludeSuppressed</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>ModuleSummary</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>XlinkStackSize</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>XlinkCodeModel</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>xcProgramEntryLabel</name>\r
+          <state>__program_start</state>\r
+        </option>\r
+        <option>\r
+          <name>DebugInformation</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>RuntimeControl</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>IoEmulation</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>XcRTLibraryFile</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OXLibIOConfig</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>XLibraryHeap</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>AllowExtraOutput</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>GenerateExtraOutput</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>XExtraOutOverride</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>ExtraOutputFile</name>\r
+          <state>ez430_chronos_datalogger.a43</state>\r
+        </option>\r
+        <option>\r
+          <name>ExtraOutputFormat</name>\r
+          <version>11</version>\r
+          <state>23</state>\r
+        </option>\r
+        <option>\r
+          <name>ExtraFormatVariant</name>\r
+          <version>8</version>\r
+          <state>2</state>\r
+        </option>\r
+        <option>\r
+          <name>xcOverrideProgramEntryLabel</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>xcProgramEntryLabelSelect</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>ListOutputFormat</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>BufferedTermOutput</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>XExtraOptionsCheck</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>XExtraOptions</name>\r
+          <state>--ks_version</state>\r
+        </option>\r
+        <option>\r
+          <name>OverlaySystemMap</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>RawBinaryFile</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>RawBinarySymbol</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>RawBinarySegment</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>RawBinaryAlign</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>XLinkMisraHandler</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CrcAlign</name>\r
+          <state>2</state>\r
+        </option>\r
+        <option>\r
+          <name>CrcInitialValue</name>\r
+          <state>0x0</state>\r
+        </option>\r
+        <option>\r
+          <name>XLibraryHeap20</name>\r
+          <state>1</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>XAR</name>\r
+      <archiveVersion>4</archiveVersion>\r
+      <data>\r
+        <version>0</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>XAROutOverride</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>XARInputs</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>OutputFile</name>\r
+          <state></state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>BILINK</name>\r
+      <archiveVersion>0</archiveVersion>\r
+      <data/>\r
+    </settings>\r
+  </configuration>\r
+  <configuration>\r
+    <name>915MHz - Unrestricted IAR Workbench (USA)</name>\r
+    <toolchain>\r
+      <name>MSP430</name>\r
+    </toolchain>\r
+    <debug>1</debug>\r
+    <settings>\r
+      <name>General</name>\r
+      <archiveVersion>7</archiveVersion>\r
+      <data>\r
+        <version>27</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>ExePath</name>\r
+          <state>915MHz - Unrestricted IAR Workbench (USA)\Exe</state>\r
+        </option>\r
+        <option>\r
+          <name>ObjPath</name>\r
+          <state>915MHz - Unrestricted IAR Workbench (USA)\Obj</state>\r
+        </option>\r
+        <option>\r
+          <name>ListPath</name>\r
+          <state>915MHz - Unrestricted IAR Workbench (USA)\List</state>\r
+        </option>\r
+        <option>\r
+          <name>PosIndCode</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Hardware Multiplier</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>GOutputBinary</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AssemblerOnly</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OGDouble</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>GRuntimeLibSelect</name>\r
+          <version>0</version>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>RTDescription</name>\r
+          <state>Use the normal configuration of the C/EC++ runtime library. No locale interface, C locale, no file descriptor support, no multibytes in printf and scanf, and no hex floats in strtod.</state>\r
+        </option>\r
+        <option>\r
+          <name>RTConfigPath</name>\r
+          <state>$TOOLKIT_DIR$\LIB\DLIB\dl430xsfn.h</state>\r
+        </option>\r
+        <option>\r
+          <name>RTLibraryPath</name>\r
+          <state>$TOOLKIT_DIR$\LIB\DLIB\dl430xsfn.r43</state>\r
+        </option>\r
+        <option>\r
+          <name>Input variant</name>\r
+          <version>0</version>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Input description</name>\r
+          <state>No specifier n, no float or long long.</state>\r
+        </option>\r
+        <option>\r
+          <name>Output variant</name>\r
+          <version>0</version>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Output description</name>\r
+          <state>No specifier a or A.</state>\r
+        </option>\r
+        <option>\r
+          <name>GRuntimeLibSelectSlave</name>\r
+          <version>0</version>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OGCore</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>GeneralEnableMisra</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>GeneralMisraVerbose</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OGChipSelectMenu</name>\r
+          <state>CC430F6137    CC430F6137</state>\r
+        </option>\r
+        <option>\r
+          <name>GStackHeapOverride</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>GStackSize2</name>\r
+          <state>80</state>\r
+        </option>\r
+        <option>\r
+          <name>GHeapSize2</name>\r
+          <state>80</state>\r
+        </option>\r
+        <option>\r
+          <name>RadioDataModelType</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>GHeap20Size</name>\r
+          <state>80</state>\r
+        </option>\r
+        <option>\r
+          <name>GeneralMisraRules98</name>\r
+          <version>0</version>\r
+          <state>1000111110110101101110011100111111101110011011000101110111101101100111111111111100110011111001110111001111111111111111111111111</state>\r
+        </option>\r
+        <option>\r
+          <name>RadioHeapSizeType</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>RadioHardwareMultiplierType</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>GeneralMisraVer</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>GeneralMisraRules04</name>\r
+          <version>0</version>\r
+          <state>111101110010111111111000110111111111111111111111111110010111101111010101111111111111111111111111101111111011111001111011111011111111111111111</state>\r
+        </option>\r
+        <option>\r
+          <name>RadioL092ModelType</name>\r
+          <state>0</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>ICC430</name>\r
+      <archiveVersion>4</archiveVersion>\r
+      <data>\r
+        <version>30</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>CCDefines</name>\r
+          <state>ISM_US</state>\r
+          <state>MRFI_CC430</state>\r
+          <state>__CC430F6137__</state>\r
+        </option>\r
+        <option>\r
+          <name>CCPreprocFile</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCPreprocComments</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCPreprocLine</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCListCFile</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCListCMnemonics</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCListCMessages</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCListAssFile</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCListAssSource</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCEnableRemarks</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCDiagSuppress</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>CCDiagRemark</name>\r
+          <state>Pa082</state>\r
+        </option>\r
+        <option>\r
+          <name>CCDiagWarning</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>CCDiagError</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>IObjPrefix2</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CCRequirePrototypes</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCAllowList</name>\r
+          <version>1</version>\r
+          <state>11111</state>\r
+        </option>\r
+        <option>\r
+          <name>CCObjUseModuleName</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCObjModuleName</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>CCDebugInfo</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>IProcessor</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCDiagWarnAreErr</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCCharIs</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CCExt</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCMultibyteSupport</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCMigrationPreprocExtentions</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCCompilerRuntimeInfo</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>IDoubleSize</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OutputFile</name>\r
+          <state>$FILE_BNAME$.r43</state>\r
+        </option>\r
+        <option>\r
+          <name>CCLibConfigHeader</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OCCR4Utilize</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OCCR5Utilize</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CPIC</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>IExtraOptionsCheck</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>IExtraOptions</name>\r
+          <state>-f"$PROJ_DIR$\simpliciti\Applications\configuration\End Device\smpl_config.dat"</state>\r
+          <state>-f"$PROJ_DIR$\simpliciti\Applications\configuration\smpl_nwk_config.dat"</state>\r
+        </option>\r
+        <option>\r
+          <name>PreInclude</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>CCOverrideModuleTypeDefault</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCRadioModuleType</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCRadioModuleTypeSlave</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>newCCIncludePaths</name>\r
+          <state>$PROJ_DIR$\</state>\r
+          <state>$PROJ_DIR$\include\</state>\r
+          <state>$PROJ_DIR$\driver\</state>\r
+          <state>$PROJ_DIR$\logic\</state>\r
+          <state>$PROJ_DIR$\bluerobin\</state>\r
+          <state>$PROJ_DIR$\simpliciti\</state>\r
+          <state>$PROJ_DIR$\simpliciti\Components\bsp</state>\r
+          <state>$PROJ_DIR$\simpliciti\Components\bsp\drivers</state>\r
+          <state>$PROJ_DIR$\simpliciti\Components\bsp\boards\CC430EM</state>\r
+          <state>$PROJ_DIR$\simpliciti\Components\mrfi</state>\r
+          <state>$PROJ_DIR$\simpliciti\Components\nwk</state>\r
+          <state>$PROJ_DIR$\simpliciti\Components\nwk_applications</state>\r
+        </option>\r
+        <option>\r
+          <name>CCStdIncCheck</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CompilerMisraOverride</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OI430X</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>ReduceStack</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Save20bit</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CompilerDataModel</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CCOptLevel</name>\r
+          <state>3</state>\r
+        </option>\r
+        <option>\r
+          <name>CCOptStrategy</name>\r
+          <version>0</version>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CCOptLevelSlave</name>\r
+          <state>3</state>\r
+        </option>\r
+        <option>\r
+          <name>CInput</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CompilerMisraRules98</name>\r
+          <version>0</version>\r
+          <state>1000111110110101101110011100111111101110011011000101110111101101100111111111111100110011111001110111001111111111111111111111111</state>\r
+        </option>\r
+        <option>\r
+          <name>CompilerMisraRules04</name>\r
+          <version>0</version>\r
+          <state>111101110010111111111000110111111111111111111111111110010111101111010101111111111111111111111111101111111011111001111011111011111111111111111</state>\r
+        </option>\r
+        <option>\r
+          <name>IccLang</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>IccCDialect</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>IccAllowVLA</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>IccCppDialect</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>IccRelaxedFpPrecision</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCPUTAG</name>\r
+          <state>1</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>A430</name>\r
+      <archiveVersion>4</archiveVersion>\r
+      <data>\r
+        <version>13</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>AObjPrefix</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>ACaseSensitivity</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>MacroChars</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AWarnEnable</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AWarnWhat</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AWarnOne</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>AWarnRange1</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>AWarnRange2</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>ADefines</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>AList</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AListHeader</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>AListing</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Includes</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>MacDefs</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>MacExps</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>MacExec</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OnlyAssed</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>MultiLine</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>PageLengthCheck</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>PageLength</name>\r
+          <state>80</state>\r
+        </option>\r
+        <option>\r
+          <name>TabSpacing</name>\r
+          <state>8</state>\r
+        </option>\r
+        <option>\r
+          <name>AXRef</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AXRefDefines</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AXRefInternal</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AXRefDual</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>ADebug</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>ADebugType</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>IProcessor</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AMaxErrOn</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AMaxErrNum</name>\r
+          <state>100</state>\r
+        </option>\r
+        <option>\r
+          <name>OutputFile</name>\r
+          <state>$FILE_BNAME$.r43</state>\r
+        </option>\r
+        <option>\r
+          <name>AMultibyteSupport</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AExtraOptionsCheck</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AExtraOptions</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>OA1M</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>AIgnoreStdInclude</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AStdIncludes</name>\r
+          <state>$TOOLKIT_DIR$\INC\</state>\r
+        </option>\r
+        <option>\r
+          <name>AUserIncludes</name>\r
+          <state></state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>CUSTOM</name>\r
+      <archiveVersion>3</archiveVersion>\r
+      <data>\r
+        <extensions></extensions>\r
+        <cmdline></cmdline>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>BICOMP</name>\r
+      <archiveVersion>0</archiveVersion>\r
+      <data/>\r
+    </settings>\r
+    <settings>\r
+      <name>BUILDACTION</name>\r
+      <archiveVersion>1</archiveVersion>\r
+      <data>\r
+        <prebuild></prebuild>\r
+        <postbuild></postbuild>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>XLINK</name>\r
+      <archiveVersion>4</archiveVersion>\r
+      <data>\r
+        <version>22</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>XOutOverride</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OutputFile</name>\r
+          <state>ez430_chronos_datalogger_915MHz.d43</state>\r
+        </option>\r
+        <option>\r
+          <name>OutputFormat</name>\r
+          <version>11</version>\r
+          <state>33</state>\r
+        </option>\r
+        <option>\r
+          <name>FormatVariant</name>\r
+          <version>8</version>\r
+          <state>2</state>\r
+        </option>\r
+        <option>\r
+          <name>SecondaryOutputFile</name>\r
+          <state>(None for the selected format)</state>\r
+        </option>\r
+        <option>\r
+          <name>XDefines</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>AlwaysOutput</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OverlapWarnings</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>NoGlobalCheck</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>XList</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>SegmentMap</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>ListSymbols</name>\r
+          <state>2</state>\r
+        </option>\r
+        <option>\r
+          <name>PageLengthCheck</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>PageLength</name>\r
+          <state>80</state>\r
+        </option>\r
+        <option>\r
+          <name>XIncludes</name>\r
+          <state>$TOOLKIT_DIR$\LIB\</state>\r
+        </option>\r
+        <option>\r
+          <name>ModuleStatus</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>XclOverride</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>XclFile</name>\r
+          <state>$PROJ_DIR$\lnkCC430F6137.xcl</state>\r
+        </option>\r
+        <option>\r
+          <name>XclFileSlave</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>DoFill</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>FillerByte</name>\r
+          <state>0xFF</state>\r
+        </option>\r
+        <option>\r
+          <name>DoCrc</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CrcSize</name>\r
+          <version>0</version>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CrcAlgo</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CrcPoly</name>\r
+          <state>0x11021</state>\r
+        </option>\r
+        <option>\r
+          <name>CrcCompl</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>RangeCheckAlternatives</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>SuppressAllWarn</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>SuppressDiags</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>TreatAsWarn</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>TreatAsErr</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>ModuleLocalSym</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CrcBitOrder</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>XHardwareMul</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>IncludeSuppressed</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>ModuleSummary</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>XlinkStackSize</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>XlinkCodeModel</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>xcProgramEntryLabel</name>\r
+          <state>__program_start</state>\r
+        </option>\r
+        <option>\r
+          <name>DebugInformation</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>RuntimeControl</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>IoEmulation</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>XcRTLibraryFile</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OXLibIOConfig</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>XLibraryHeap</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>AllowExtraOutput</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>GenerateExtraOutput</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>XExtraOutOverride</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>ExtraOutputFile</name>\r
+          <state>ez430_chronos_datalogger.a43</state>\r
+        </option>\r
+        <option>\r
+          <name>ExtraOutputFormat</name>\r
+          <version>11</version>\r
+          <state>23</state>\r
+        </option>\r
+        <option>\r
+          <name>ExtraFormatVariant</name>\r
+          <version>8</version>\r
+          <state>2</state>\r
+        </option>\r
+        <option>\r
+          <name>xcOverrideProgramEntryLabel</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>xcProgramEntryLabelSelect</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>ListOutputFormat</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>BufferedTermOutput</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>XExtraOptionsCheck</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>XExtraOptions</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>OverlaySystemMap</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>RawBinaryFile</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>RawBinarySymbol</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>RawBinarySegment</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>RawBinaryAlign</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>XLinkMisraHandler</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CrcAlign</name>\r
+          <state>2</state>\r
+        </option>\r
+        <option>\r
+          <name>CrcInitialValue</name>\r
+          <state>0x0</state>\r
+        </option>\r
+        <option>\r
+          <name>XLibraryHeap20</name>\r
+          <state>1</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>XAR</name>\r
+      <archiveVersion>4</archiveVersion>\r
+      <data>\r
+        <version>0</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>XAROutOverride</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>XARInputs</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>OutputFile</name>\r
+          <state></state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>BILINK</name>\r
+      <archiveVersion>0</archiveVersion>\r
+      <data/>\r
+    </settings>\r
+  </configuration>\r
+  <configuration>\r
+    <name>868MHz - Unrestricted IAR Workbench (Europe)</name>\r
+    <toolchain>\r
+      <name>MSP430</name>\r
+    </toolchain>\r
+    <debug>1</debug>\r
+    <settings>\r
+      <name>General</name>\r
+      <archiveVersion>7</archiveVersion>\r
+      <data>\r
+        <version>27</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>ExePath</name>\r
+          <state>868MHz - Unrestricted IAR Workbench (Europe)\Exe</state>\r
+        </option>\r
+        <option>\r
+          <name>ObjPath</name>\r
+          <state>868MHz - Unrestricted IAR Workbench (Europe)\Obj</state>\r
+        </option>\r
+        <option>\r
+          <name>ListPath</name>\r
+          <state>868MHz - Unrestricted IAR Workbench (Europe)\List</state>\r
+        </option>\r
+        <option>\r
+          <name>PosIndCode</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Hardware Multiplier</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>GOutputBinary</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AssemblerOnly</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OGDouble</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>GRuntimeLibSelect</name>\r
+          <version>0</version>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>RTDescription</name>\r
+          <state>Use the normal configuration of the C/EC++ runtime library. No locale interface, C locale, no file descriptor support, no multibytes in printf and scanf, and no hex floats in strtod.</state>\r
+        </option>\r
+        <option>\r
+          <name>RTConfigPath</name>\r
+          <state>$TOOLKIT_DIR$\LIB\DLIB\dl430xsfn.h</state>\r
+        </option>\r
+        <option>\r
+          <name>RTLibraryPath</name>\r
+          <state>$TOOLKIT_DIR$\LIB\DLIB\dl430xsfn.r43</state>\r
+        </option>\r
+        <option>\r
+          <name>Input variant</name>\r
+          <version>0</version>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Input description</name>\r
+          <state>No specifier n, no float or long long.</state>\r
+        </option>\r
+        <option>\r
+          <name>Output variant</name>\r
+          <version>0</version>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Output description</name>\r
+          <state>No specifier a or A.</state>\r
+        </option>\r
+        <option>\r
+          <name>GRuntimeLibSelectSlave</name>\r
+          <version>0</version>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OGCore</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>GeneralEnableMisra</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>GeneralMisraVerbose</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OGChipSelectMenu</name>\r
+          <state>CC430F6137    CC430F6137</state>\r
+        </option>\r
+        <option>\r
+          <name>GStackHeapOverride</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>GStackSize2</name>\r
+          <state>80</state>\r
+        </option>\r
+        <option>\r
+          <name>GHeapSize2</name>\r
+          <state>80</state>\r
+        </option>\r
+        <option>\r
+          <name>RadioDataModelType</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>GHeap20Size</name>\r
+          <state>80</state>\r
+        </option>\r
+        <option>\r
+          <name>GeneralMisraRules98</name>\r
+          <version>0</version>\r
+          <state>1000111110110101101110011100111111101110011011000101110111101101100111111111111100110011111001110111001111111111111111111111111</state>\r
+        </option>\r
+        <option>\r
+          <name>RadioHeapSizeType</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>RadioHardwareMultiplierType</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>GeneralMisraVer</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>GeneralMisraRules04</name>\r
+          <version>0</version>\r
+          <state>111101110010111111111000110111111111111111111111111110010111101111010101111111111111111111111111101111111011111001111011111011111111111111111</state>\r
+        </option>\r
+        <option>\r
+          <name>RadioL092ModelType</name>\r
+          <state>0</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>ICC430</name>\r
+      <archiveVersion>4</archiveVersion>\r
+      <data>\r
+        <version>30</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>CCDefines</name>\r
+          <state>ISM_EU</state>\r
+          <state>MRFI_CC430</state>\r
+          <state>__CC430F6137__</state>\r
+        </option>\r
+        <option>\r
+          <name>CCPreprocFile</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCPreprocComments</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCPreprocLine</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCListCFile</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCListCMnemonics</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCListCMessages</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCListAssFile</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCListAssSource</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCEnableRemarks</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCDiagSuppress</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>CCDiagRemark</name>\r
+          <state>Pa082</state>\r
+        </option>\r
+        <option>\r
+          <name>CCDiagWarning</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>CCDiagError</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>IObjPrefix2</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CCRequirePrototypes</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCAllowList</name>\r
+          <version>1</version>\r
+          <state>11111</state>\r
+        </option>\r
+        <option>\r
+          <name>CCObjUseModuleName</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCObjModuleName</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>CCDebugInfo</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>IProcessor</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCDiagWarnAreErr</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCCharIs</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CCExt</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCMultibyteSupport</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCMigrationPreprocExtentions</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCCompilerRuntimeInfo</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>IDoubleSize</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OutputFile</name>\r
+          <state>$FILE_BNAME$.r43</state>\r
+        </option>\r
+        <option>\r
+          <name>CCLibConfigHeader</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OCCR4Utilize</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OCCR5Utilize</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CPIC</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>IExtraOptionsCheck</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>IExtraOptions</name>\r
+          <state>-f"$PROJ_DIR$\simpliciti\Applications\configuration\End Device\smpl_config.dat"</state>\r
+          <state>-f"$PROJ_DIR$\simpliciti\Applications\configuration\smpl_nwk_config.dat"</state>\r
+        </option>\r
+        <option>\r
+          <name>PreInclude</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>CCOverrideModuleTypeDefault</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCRadioModuleType</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCRadioModuleTypeSlave</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>newCCIncludePaths</name>\r
+          <state>$PROJ_DIR$\</state>\r
+          <state>$PROJ_DIR$\include\</state>\r
+          <state>$PROJ_DIR$\driver\</state>\r
+          <state>$PROJ_DIR$\logic\</state>\r
+          <state>$PROJ_DIR$\bluerobin\</state>\r
+          <state>$PROJ_DIR$\simpliciti\</state>\r
+          <state>$PROJ_DIR$\simpliciti\Components\bsp</state>\r
+          <state>$PROJ_DIR$\simpliciti\Components\bsp\drivers</state>\r
+          <state>$PROJ_DIR$\simpliciti\Components\bsp\boards\CC430EM</state>\r
+          <state>$PROJ_DIR$\simpliciti\Components\mrfi</state>\r
+          <state>$PROJ_DIR$\simpliciti\Components\nwk</state>\r
+          <state>$PROJ_DIR$\simpliciti\Components\nwk_applications</state>\r
+        </option>\r
+        <option>\r
+          <name>CCStdIncCheck</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CompilerMisraOverride</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OI430X</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>ReduceStack</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Save20bit</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CompilerDataModel</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CCOptLevel</name>\r
+          <state>3</state>\r
+        </option>\r
+        <option>\r
+          <name>CCOptStrategy</name>\r
+          <version>0</version>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CCOptLevelSlave</name>\r
+          <state>3</state>\r
+        </option>\r
+        <option>\r
+          <name>CInput</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CompilerMisraRules98</name>\r
+          <version>0</version>\r
+          <state>1000111110110101101110011100111111101110011011000101110111101101100111111111111100110011111001110111001111111111111111111111111</state>\r
+        </option>\r
+        <option>\r
+          <name>CompilerMisraRules04</name>\r
+          <version>0</version>\r
+          <state>111101110010111111111000110111111111111111111111111110010111101111010101111111111111111111111111101111111011111001111011111011111111111111111</state>\r
+        </option>\r
+        <option>\r
+          <name>IccLang</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>IccCDialect</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>IccAllowVLA</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>IccCppDialect</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>IccRelaxedFpPrecision</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCPUTAG</name>\r
+          <state>1</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>A430</name>\r
+      <archiveVersion>4</archiveVersion>\r
+      <data>\r
+        <version>13</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>AObjPrefix</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>ACaseSensitivity</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>MacroChars</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AWarnEnable</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AWarnWhat</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AWarnOne</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>AWarnRange1</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>AWarnRange2</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>ADefines</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>AList</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AListHeader</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>AListing</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Includes</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>MacDefs</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>MacExps</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>MacExec</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OnlyAssed</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>MultiLine</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>PageLengthCheck</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>PageLength</name>\r
+          <state>80</state>\r
+        </option>\r
+        <option>\r
+          <name>TabSpacing</name>\r
+          <state>8</state>\r
+        </option>\r
+        <option>\r
+          <name>AXRef</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AXRefDefines</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AXRefInternal</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AXRefDual</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>ADebug</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>ADebugType</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>IProcessor</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AMaxErrOn</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AMaxErrNum</name>\r
+          <state>100</state>\r
+        </option>\r
+        <option>\r
+          <name>OutputFile</name>\r
+          <state>$FILE_BNAME$.r43</state>\r
+        </option>\r
+        <option>\r
+          <name>AMultibyteSupport</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AExtraOptionsCheck</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AExtraOptions</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>OA1M</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>AIgnoreStdInclude</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AStdIncludes</name>\r
+          <state>$TOOLKIT_DIR$\INC\</state>\r
+        </option>\r
+        <option>\r
+          <name>AUserIncludes</name>\r
+          <state></state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>CUSTOM</name>\r
+      <archiveVersion>3</archiveVersion>\r
+      <data>\r
+        <extensions></extensions>\r
+        <cmdline></cmdline>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>BICOMP</name>\r
+      <archiveVersion>0</archiveVersion>\r
+      <data/>\r
+    </settings>\r
+    <settings>\r
+      <name>BUILDACTION</name>\r
+      <archiveVersion>1</archiveVersion>\r
+      <data>\r
+        <prebuild></prebuild>\r
+        <postbuild></postbuild>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>XLINK</name>\r
+      <archiveVersion>4</archiveVersion>\r
+      <data>\r
+        <version>22</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>XOutOverride</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OutputFile</name>\r
+          <state>ez430_chronos_datalogger_868MHz.d43</state>\r
+        </option>\r
+        <option>\r
+          <name>OutputFormat</name>\r
+          <version>11</version>\r
+          <state>33</state>\r
+        </option>\r
+        <option>\r
+          <name>FormatVariant</name>\r
+          <version>8</version>\r
+          <state>2</state>\r
+        </option>\r
+        <option>\r
+          <name>SecondaryOutputFile</name>\r
+          <state>(None for the selected format)</state>\r
+        </option>\r
+        <option>\r
+          <name>XDefines</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>AlwaysOutput</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OverlapWarnings</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>NoGlobalCheck</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>XList</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>SegmentMap</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>ListSymbols</name>\r
+          <state>2</state>\r
+        </option>\r
+        <option>\r
+          <name>PageLengthCheck</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>PageLength</name>\r
+          <state>80</state>\r
+        </option>\r
+        <option>\r
+          <name>XIncludes</name>\r
+          <state>$TOOLKIT_DIR$\LIB\</state>\r
+        </option>\r
+        <option>\r
+          <name>ModuleStatus</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>XclOverride</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>XclFile</name>\r
+          <state>$PROJ_DIR$\lnkCC430F6137.xcl</state>\r
+        </option>\r
+        <option>\r
+          <name>XclFileSlave</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>DoFill</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>FillerByte</name>\r
+          <state>0xFF</state>\r
+        </option>\r
+        <option>\r
+          <name>DoCrc</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CrcSize</name>\r
+          <version>0</version>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CrcAlgo</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CrcPoly</name>\r
+          <state>0x11021</state>\r
+        </option>\r
+        <option>\r
+          <name>CrcCompl</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>RangeCheckAlternatives</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>SuppressAllWarn</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>SuppressDiags</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>TreatAsWarn</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>TreatAsErr</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>ModuleLocalSym</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CrcBitOrder</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>XHardwareMul</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>IncludeSuppressed</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>ModuleSummary</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>XlinkStackSize</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>XlinkCodeModel</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>xcProgramEntryLabel</name>\r
+          <state>__program_start</state>\r
+        </option>\r
+        <option>\r
+          <name>DebugInformation</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>RuntimeControl</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>IoEmulation</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>XcRTLibraryFile</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OXLibIOConfig</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>XLibraryHeap</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>AllowExtraOutput</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>GenerateExtraOutput</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>XExtraOutOverride</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>ExtraOutputFile</name>\r
+          <state>ez430_chronos_datalogger.a43</state>\r
+        </option>\r
+        <option>\r
+          <name>ExtraOutputFormat</name>\r
+          <version>11</version>\r
+          <state>23</state>\r
+        </option>\r
+        <option>\r
+          <name>ExtraFormatVariant</name>\r
+          <version>8</version>\r
+          <state>2</state>\r
+        </option>\r
+        <option>\r
+          <name>xcOverrideProgramEntryLabel</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>xcProgramEntryLabelSelect</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>ListOutputFormat</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>BufferedTermOutput</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>XExtraOptionsCheck</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>XExtraOptions</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>OverlaySystemMap</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>RawBinaryFile</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>RawBinarySymbol</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>RawBinarySegment</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>RawBinaryAlign</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>XLinkMisraHandler</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CrcAlign</name>\r
+          <state>2</state>\r
+        </option>\r
+        <option>\r
+          <name>CrcInitialValue</name>\r
+          <state>0x0</state>\r
+        </option>\r
+        <option>\r
+          <name>XLibraryHeap20</name>\r
+          <state>1</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>XAR</name>\r
+      <archiveVersion>4</archiveVersion>\r
+      <data>\r
+        <version>0</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>XAROutOverride</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>XARInputs</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>OutputFile</name>\r
+          <state>ez430_chronos_datalogger.r43</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>BILINK</name>\r
+      <archiveVersion>0</archiveVersion>\r
+      <data/>\r
+    </settings>\r
+  </configuration>\r
+  <configuration>\r
+    <name>433MHz - Unrestricted IAR Workbench (Other regions)</name>\r
+    <toolchain>\r
+      <name>MSP430</name>\r
+    </toolchain>\r
+    <debug>1</debug>\r
+    <settings>\r
+      <name>General</name>\r
+      <archiveVersion>7</archiveVersion>\r
+      <data>\r
+        <version>27</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>ExePath</name>\r
+          <state>433MHz - Unrestricted IAR Workbench (Other regions)\Exe</state>\r
+        </option>\r
+        <option>\r
+          <name>ObjPath</name>\r
+          <state>433MHz - Unrestricted IAR Workbench (Other regions)\Obj</state>\r
+        </option>\r
+        <option>\r
+          <name>ListPath</name>\r
+          <state>433MHz - Unrestricted IAR Workbench (Other regions)\List</state>\r
+        </option>\r
+        <option>\r
+          <name>PosIndCode</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Hardware Multiplier</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>GOutputBinary</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AssemblerOnly</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OGDouble</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>GRuntimeLibSelect</name>\r
+          <version>0</version>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>RTDescription</name>\r
+          <state>Use the normal configuration of the C/EC++ runtime library. No locale interface, C locale, no file descriptor support, no multibytes in printf and scanf, and no hex floats in strtod.</state>\r
+        </option>\r
+        <option>\r
+          <name>RTConfigPath</name>\r
+          <state>$TOOLKIT_DIR$\LIB\DLIB\dl430xsfn.h</state>\r
+        </option>\r
+        <option>\r
+          <name>RTLibraryPath</name>\r
+          <state>$TOOLKIT_DIR$\LIB\DLIB\dl430xsfn.r43</state>\r
+        </option>\r
+        <option>\r
+          <name>Input variant</name>\r
+          <version>0</version>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Input description</name>\r
+          <state>No specifier n, no float or long long.</state>\r
+        </option>\r
+        <option>\r
+          <name>Output variant</name>\r
+          <version>0</version>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Output description</name>\r
+          <state>No specifier a or A.</state>\r
+        </option>\r
+        <option>\r
+          <name>GRuntimeLibSelectSlave</name>\r
+          <version>0</version>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OGCore</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>GeneralEnableMisra</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>GeneralMisraVerbose</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OGChipSelectMenu</name>\r
+          <state>CC430F6137    CC430F6137</state>\r
+        </option>\r
+        <option>\r
+          <name>GStackHeapOverride</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>GStackSize2</name>\r
+          <state>80</state>\r
+        </option>\r
+        <option>\r
+          <name>GHeapSize2</name>\r
+          <state>80</state>\r
+        </option>\r
+        <option>\r
+          <name>RadioDataModelType</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>GHeap20Size</name>\r
+          <state>80</state>\r
+        </option>\r
+        <option>\r
+          <name>GeneralMisraRules98</name>\r
+          <version>0</version>\r
+          <state>1000111110110101101110011100111111101110011011000101110111101101100111111111111100110011111001110111001111111111111111111111111</state>\r
+        </option>\r
+        <option>\r
+          <name>RadioHeapSizeType</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>RadioHardwareMultiplierType</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>GeneralMisraVer</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>GeneralMisraRules04</name>\r
+          <version>0</version>\r
+          <state>111101110010111111111000110111111111111111111111111110010111101111010101111111111111111111111111101111111011111001111011111011111111111111111</state>\r
+        </option>\r
+        <option>\r
+          <name>RadioL092ModelType</name>\r
+          <state>0</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>ICC430</name>\r
+      <archiveVersion>4</archiveVersion>\r
+      <data>\r
+        <version>30</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>CCDefines</name>\r
+          <state>ISM_LF</state>\r
+          <state>MRFI_CC430</state>\r
+          <state>__CC430F6137__</state>\r
+        </option>\r
+        <option>\r
+          <name>CCPreprocFile</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCPreprocComments</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCPreprocLine</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCListCFile</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCListCMnemonics</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCListCMessages</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCListAssFile</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCListAssSource</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCEnableRemarks</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCDiagSuppress</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>CCDiagRemark</name>\r
+          <state>Pa082</state>\r
+        </option>\r
+        <option>\r
+          <name>CCDiagWarning</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>CCDiagError</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>IObjPrefix2</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CCRequirePrototypes</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCAllowList</name>\r
+          <version>1</version>\r
+          <state>11111</state>\r
+        </option>\r
+        <option>\r
+          <name>CCObjUseModuleName</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCObjModuleName</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>CCDebugInfo</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>IProcessor</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCDiagWarnAreErr</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCCharIs</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CCExt</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCMultibyteSupport</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCMigrationPreprocExtentions</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCCompilerRuntimeInfo</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>IDoubleSize</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OutputFile</name>\r
+          <state>$FILE_BNAME$.r43</state>\r
+        </option>\r
+        <option>\r
+          <name>CCLibConfigHeader</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OCCR4Utilize</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OCCR5Utilize</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CPIC</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>IExtraOptionsCheck</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>IExtraOptions</name>\r
+          <state>-f"$PROJ_DIR$\simpliciti\Applications\configuration\End Device\smpl_config.dat"</state>\r
+          <state>-f"$PROJ_DIR$\simpliciti\Applications\configuration\smpl_nwk_config.dat"</state>\r
+        </option>\r
+        <option>\r
+          <name>PreInclude</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>CCOverrideModuleTypeDefault</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCRadioModuleType</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCRadioModuleTypeSlave</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>newCCIncludePaths</name>\r
+          <state>$PROJ_DIR$\</state>\r
+          <state>$PROJ_DIR$\include\</state>\r
+          <state>$PROJ_DIR$\driver\</state>\r
+          <state>$PROJ_DIR$\logic\</state>\r
+          <state>$PROJ_DIR$\bluerobin\</state>\r
+          <state>$PROJ_DIR$\simpliciti\</state>\r
+          <state>$PROJ_DIR$\simpliciti\Components\bsp</state>\r
+          <state>$PROJ_DIR$\simpliciti\Components\bsp\drivers</state>\r
+          <state>$PROJ_DIR$\simpliciti\Components\bsp\boards\CC430EM</state>\r
+          <state>$PROJ_DIR$\simpliciti\Components\mrfi</state>\r
+          <state>$PROJ_DIR$\simpliciti\Components\nwk</state>\r
+          <state>$PROJ_DIR$\simpliciti\Components\nwk_applications</state>\r
+        </option>\r
+        <option>\r
+          <name>CCStdIncCheck</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CompilerMisraOverride</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OI430X</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>ReduceStack</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Save20bit</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CompilerDataModel</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CCOptLevel</name>\r
+          <state>3</state>\r
+        </option>\r
+        <option>\r
+          <name>CCOptStrategy</name>\r
+          <version>0</version>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CCOptLevelSlave</name>\r
+          <state>3</state>\r
+        </option>\r
+        <option>\r
+          <name>CInput</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CompilerMisraRules98</name>\r
+          <version>0</version>\r
+          <state>1000111110110101101110011100111111101110011011000101110111101101100111111111111100110011111001110111001111111111111111111111111</state>\r
+        </option>\r
+        <option>\r
+          <name>CompilerMisraRules04</name>\r
+          <version>0</version>\r
+          <state>111101110010111111111000110111111111111111111111111110010111101111010101111111111111111111111111101111111011111001111011111011111111111111111</state>\r
+        </option>\r
+        <option>\r
+          <name>IccLang</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>IccCDialect</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>IccAllowVLA</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>IccCppDialect</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>IccRelaxedFpPrecision</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCPUTAG</name>\r
+          <state>1</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>A430</name>\r
+      <archiveVersion>4</archiveVersion>\r
+      <data>\r
+        <version>13</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>AObjPrefix</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>ACaseSensitivity</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>MacroChars</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AWarnEnable</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AWarnWhat</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AWarnOne</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>AWarnRange1</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>AWarnRange2</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>ADefines</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>AList</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AListHeader</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>AListing</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Includes</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>MacDefs</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>MacExps</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>MacExec</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OnlyAssed</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>MultiLine</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>PageLengthCheck</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>PageLength</name>\r
+          <state>80</state>\r
+        </option>\r
+        <option>\r
+          <name>TabSpacing</name>\r
+          <state>8</state>\r
+        </option>\r
+        <option>\r
+          <name>AXRef</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AXRefDefines</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AXRefInternal</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AXRefDual</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>ADebug</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>ADebugType</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>IProcessor</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AMaxErrOn</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AMaxErrNum</name>\r
+          <state>100</state>\r
+        </option>\r
+        <option>\r
+          <name>OutputFile</name>\r
+          <state>$FILE_BNAME$.r43</state>\r
+        </option>\r
+        <option>\r
+          <name>AMultibyteSupport</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AExtraOptionsCheck</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AExtraOptions</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>OA1M</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>AIgnoreStdInclude</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AStdIncludes</name>\r
+          <state>$TOOLKIT_DIR$\INC\</state>\r
+        </option>\r
+        <option>\r
+          <name>AUserIncludes</name>\r
+          <state></state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>CUSTOM</name>\r
+      <archiveVersion>3</archiveVersion>\r
+      <data>\r
+        <extensions></extensions>\r
+        <cmdline></cmdline>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>BICOMP</name>\r
+      <archiveVersion>0</archiveVersion>\r
+      <data/>\r
+    </settings>\r
+    <settings>\r
+      <name>BUILDACTION</name>\r
+      <archiveVersion>1</archiveVersion>\r
+      <data>\r
+        <prebuild></prebuild>\r
+        <postbuild></postbuild>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>XLINK</name>\r
+      <archiveVersion>4</archiveVersion>\r
+      <data>\r
+        <version>22</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>XOutOverride</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OutputFile</name>\r
+          <state>ez430_chronos_datalogger_433MHz.d43</state>\r
+        </option>\r
+        <option>\r
+          <name>OutputFormat</name>\r
+          <version>11</version>\r
+          <state>33</state>\r
+        </option>\r
+        <option>\r
+          <name>FormatVariant</name>\r
+          <version>8</version>\r
+          <state>2</state>\r
+        </option>\r
+        <option>\r
+          <name>SecondaryOutputFile</name>\r
+          <state>(None for the selected format)</state>\r
+        </option>\r
+        <option>\r
+          <name>XDefines</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>AlwaysOutput</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OverlapWarnings</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>NoGlobalCheck</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>XList</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>SegmentMap</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>ListSymbols</name>\r
+          <state>2</state>\r
+        </option>\r
+        <option>\r
+          <name>PageLengthCheck</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>PageLength</name>\r
+          <state>80</state>\r
+        </option>\r
+        <option>\r
+          <name>XIncludes</name>\r
+          <state>$TOOLKIT_DIR$\LIB\</state>\r
+        </option>\r
+        <option>\r
+          <name>ModuleStatus</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>XclOverride</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>XclFile</name>\r
+          <state>$PROJ_DIR$\lnkCC430F6137.xcl</state>\r
+        </option>\r
+        <option>\r
+          <name>XclFileSlave</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>DoFill</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>FillerByte</name>\r
+          <state>0xFF</state>\r
+        </option>\r
+        <option>\r
+          <name>DoCrc</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CrcSize</name>\r
+          <version>0</version>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CrcAlgo</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CrcPoly</name>\r
+          <state>0x11021</state>\r
+        </option>\r
+        <option>\r
+          <name>CrcCompl</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>RangeCheckAlternatives</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>SuppressAllWarn</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>SuppressDiags</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>TreatAsWarn</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>TreatAsErr</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>ModuleLocalSym</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CrcBitOrder</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>XHardwareMul</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>IncludeSuppressed</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>ModuleSummary</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>XlinkStackSize</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>XlinkCodeModel</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>xcProgramEntryLabel</name>\r
+          <state>__program_start</state>\r
+        </option>\r
+        <option>\r
+          <name>DebugInformation</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>RuntimeControl</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>IoEmulation</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>XcRTLibraryFile</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OXLibIOConfig</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>XLibraryHeap</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>AllowExtraOutput</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>GenerateExtraOutput</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>XExtraOutOverride</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>ExtraOutputFile</name>\r
+          <state>ez430_chronos_datalogger.a43</state>\r
+        </option>\r
+        <option>\r
+          <name>ExtraOutputFormat</name>\r
+          <version>11</version>\r
+          <state>23</state>\r
+        </option>\r
+        <option>\r
+          <name>ExtraFormatVariant</name>\r
+          <version>8</version>\r
+          <state>2</state>\r
+        </option>\r
+        <option>\r
+          <name>xcOverrideProgramEntryLabel</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>xcProgramEntryLabelSelect</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>ListOutputFormat</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>BufferedTermOutput</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>XExtraOptionsCheck</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>XExtraOptions</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>OverlaySystemMap</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>RawBinaryFile</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>RawBinarySymbol</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>RawBinarySegment</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>RawBinaryAlign</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>XLinkMisraHandler</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CrcAlign</name>\r
+          <state>2</state>\r
+        </option>\r
+        <option>\r
+          <name>CrcInitialValue</name>\r
+          <state>0x0</state>\r
+        </option>\r
+        <option>\r
+          <name>XLibraryHeap20</name>\r
+          <state>1</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>XAR</name>\r
+      <archiveVersion>4</archiveVersion>\r
+      <data>\r
+        <version>0</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>XAROutOverride</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>XARInputs</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>OutputFile</name>\r
+          <state></state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>BILINK</name>\r
+      <archiveVersion>0</archiveVersion>\r
+      <data/>\r
+    </settings>\r
+  </configuration>\r
+  <group>\r
+    <name>bluerobin</name>\r
+    <file>\r
+      <name>$PROJ_DIR$\bluerobin\BlueRobin_RX_433MHz.r43</name>\r
+      <excluded>\r
+        <configuration>915MHz - Limited IAR Kickstart (USA)</configuration>\r
+        <configuration>868MHz - Limited IAR Kickstart (Europe)</configuration>\r
+        <configuration>915MHz - Unrestricted IAR Workbench (USA)</configuration>\r
+        <configuration>868MHz - Unrestricted IAR Workbench (Europe)</configuration>\r
+      </excluded>\r
+    </file>\r
+    <file>\r
+      <name>$PROJ_DIR$\bluerobin\BlueRobin_RX_868MHz.r43</name>\r
+      <excluded>\r
+        <configuration>915MHz - Limited IAR Kickstart (USA)</configuration>\r
+        <configuration>433MHz - Limited IAR Kickstart (Other regions)</configuration>\r
+        <configuration>915MHz - Unrestricted IAR Workbench (USA)</configuration>\r
+        <configuration>433MHz - Unrestricted IAR Workbench (Other regions)</configuration>\r
+      </excluded>\r
+    </file>\r
+    <file>\r
+      <name>$PROJ_DIR$\bluerobin\BlueRobin_RX_915MHz.r43</name>\r
+      <excluded>\r
+        <configuration>868MHz - Limited IAR Kickstart (Europe)</configuration>\r
+        <configuration>433MHz - Limited IAR Kickstart (Other regions)</configuration>\r
+        <configuration>868MHz - Unrestricted IAR Workbench (Europe)</configuration>\r
+        <configuration>433MHz - Unrestricted IAR Workbench (Other regions)</configuration>\r
+      </excluded>\r
+    </file>\r
+    <file>\r
+      <name>$PROJ_DIR$\bluerobin\BlueRobin_RX_API.h</name>\r
+    </file>\r
+    <file>\r
+      <name>$PROJ_DIR$\bluerobin\bm.h</name>\r
+    </file>\r
+  </group>\r
+  <group>\r
+    <name>driver</name>\r
+    <file>\r
+      <name>$PROJ_DIR$\driver\adc12.c</name>\r
+      <excluded>\r
+        <configuration>915MHz - Limited IAR Kickstart (USA)</configuration>\r
+        <configuration>868MHz - Limited IAR Kickstart (Europe)</configuration>\r
+        <configuration>433MHz - Limited IAR Kickstart (Other regions)</configuration>\r
+      </excluded>\r
+    </file>\r
+    <file>\r
+      <name>$PROJ_DIR$\driver\adc12.h</name>\r
+    </file>\r
+    <file>\r
+      <name>$PROJ_DIR$\driver\buzzer.c</name>\r
+      <excluded>\r
+        <configuration>915MHz - Limited IAR Kickstart (USA)</configuration>\r
+        <configuration>868MHz - Limited IAR Kickstart (Europe)</configuration>\r
+        <configuration>433MHz - Limited IAR Kickstart (Other regions)</configuration>\r
+      </excluded>\r
+    </file>\r
+    <file>\r
+      <name>$PROJ_DIR$\driver\buzzer.h</name>\r
+    </file>\r
+    <file>\r
+      <name>$PROJ_DIR$\driver\display.c</name>\r
+      <excluded>\r
+        <configuration>915MHz - Limited IAR Kickstart (USA)</configuration>\r
+        <configuration>868MHz - Limited IAR Kickstart (Europe)</configuration>\r
+        <configuration>433MHz - Limited IAR Kickstart (Other regions)</configuration>\r
+      </excluded>\r
+    </file>\r
+    <file>\r
+      <name>$PROJ_DIR$\driver\display.h</name>\r
+    </file>\r
+    <file>\r
+      <name>$PROJ_DIR$\driver\ez430_chronos_datalogger_codesize_limited_drivers.r43</name>\r
+      <excluded>\r
+        <configuration>915MHz - Unrestricted IAR Workbench (USA)</configuration>\r
+        <configuration>868MHz - Unrestricted IAR Workbench (Europe)</configuration>\r
+        <configuration>433MHz - Unrestricted IAR Workbench (Other regions)</configuration>\r
+      </excluded>\r
+    </file>\r
+    <file>\r
+      <name>$PROJ_DIR$\driver\flash.c</name>\r
+      <excluded>\r
+        <configuration>915MHz - Limited IAR Kickstart (USA)</configuration>\r
+        <configuration>868MHz - Limited IAR Kickstart (Europe)</configuration>\r
+        <configuration>433MHz - Limited IAR Kickstart (Other regions)</configuration>\r
+      </excluded>\r
+    </file>\r
+    <file>\r
+      <name>$PROJ_DIR$\driver\flash.h</name>\r
+    </file>\r
+    <file>\r
+      <name>$PROJ_DIR$\driver\pmm.c</name>\r
+      <excluded>\r
+        <configuration>915MHz - Limited IAR Kickstart (USA)</configuration>\r
+        <configuration>868MHz - Limited IAR Kickstart (Europe)</configuration>\r
+        <configuration>433MHz - Limited IAR Kickstart (Other regions)</configuration>\r
+      </excluded>\r
+    </file>\r
+    <file>\r
+      <name>$PROJ_DIR$\driver\pmm.h</name>\r
+    </file>\r
+    <file>\r
+      <name>$PROJ_DIR$\driver\ports.c</name>\r
+      <excluded>\r
+        <configuration>915MHz - Limited IAR Kickstart (USA)</configuration>\r
+        <configuration>868MHz - Limited IAR Kickstart (Europe)</configuration>\r
+        <configuration>433MHz - Limited IAR Kickstart (Other regions)</configuration>\r
+      </excluded>\r
+    </file>\r
+    <file>\r
+      <name>$PROJ_DIR$\driver\ports.h</name>\r
+    </file>\r
+    <file>\r
+      <name>$PROJ_DIR$\driver\radio.c</name>\r
+      <excluded>\r
+        <configuration>915MHz - Limited IAR Kickstart (USA)</configuration>\r
+        <configuration>868MHz - Limited IAR Kickstart (Europe)</configuration>\r
+        <configuration>433MHz - Limited IAR Kickstart (Other regions)</configuration>\r
+      </excluded>\r
+    </file>\r
+    <file>\r
+      <name>$PROJ_DIR$\driver\radio.h</name>\r
+    </file>\r
+    <file>\r
+      <name>$PROJ_DIR$\driver\rf1a.c</name>\r
+      <excluded>\r
+        <configuration>915MHz - Limited IAR Kickstart (USA)</configuration>\r
+        <configuration>868MHz - Limited IAR Kickstart (Europe)</configuration>\r
+        <configuration>433MHz - Limited IAR Kickstart (Other regions)</configuration>\r
+      </excluded>\r
+    </file>\r
+    <file>\r
+      <name>$PROJ_DIR$\driver\rf1a.h</name>\r
+    </file>\r
+    <file>\r
+      <name>$PROJ_DIR$\driver\timer.c</name>\r
+      <excluded>\r
+        <configuration>915MHz - Limited IAR Kickstart (USA)</configuration>\r
+        <configuration>868MHz - Limited IAR Kickstart (Europe)</configuration>\r
+        <configuration>433MHz - Limited IAR Kickstart (Other regions)</configuration>\r
+      </excluded>\r
+    </file>\r
+    <file>\r
+      <name>$PROJ_DIR$\driver\timer.h</name>\r
+    </file>\r
+    <file>\r
+      <name>$PROJ_DIR$\driver\vti_as.c</name>\r
+      <excluded>\r
+        <configuration>915MHz - Limited IAR Kickstart (USA)</configuration>\r
+        <configuration>868MHz - Limited IAR Kickstart (Europe)</configuration>\r
+        <configuration>433MHz - Limited IAR Kickstart (Other regions)</configuration>\r
+      </excluded>\r
+    </file>\r
+    <file>\r
+      <name>$PROJ_DIR$\driver\vti_as.h</name>\r
+    </file>\r
+    <file>\r
+      <name>$PROJ_DIR$\driver\vti_ps.c</name>\r
+      <excluded>\r
+        <configuration>915MHz - Limited IAR Kickstart (USA)</configuration>\r
+        <configuration>868MHz - Limited IAR Kickstart (Europe)</configuration>\r
+        <configuration>433MHz - Limited IAR Kickstart (Other regions)</configuration>\r
+      </excluded>\r
+    </file>\r
+    <file>\r
+      <name>$PROJ_DIR$\driver\vti_ps.h</name>\r
+    </file>\r
+  </group>\r
+  <group>\r
+    <name>include</name>\r
+    <file>\r
+      <name>$PROJ_DIR$\include\project.h</name>\r
+    </file>\r
+  </group>\r
+  <group>\r
+    <name>logic</name>\r
+    <file>\r
+      <name>$PROJ_DIR$\logic\acceleration.c</name>\r
+    </file>\r
+    <file>\r
+      <name>$PROJ_DIR$\logic\acceleration.h</name>\r
+    </file>\r
+    <file>\r
+      <name>$PROJ_DIR$\logic\altitude.c</name>\r
+    </file>\r
+    <file>\r
+      <name>$PROJ_DIR$\logic\altitude.h</name>\r
+    </file>\r
+    <file>\r
+      <name>$PROJ_DIR$\logic\battery.c</name>\r
+    </file>\r
+    <file>\r
+      <name>$PROJ_DIR$\logic\battery.h</name>\r
+    </file>\r
+    <file>\r
+      <name>$PROJ_DIR$\logic\bluerobin.c</name>\r
+    </file>\r
+    <file>\r
+      <name>$PROJ_DIR$\logic\bluerobin.h</name>\r
+    </file>\r
+    <file>\r
+      <name>$PROJ_DIR$\logic\clock.c</name>\r
+    </file>\r
+    <file>\r
+      <name>$PROJ_DIR$\logic\clock.h</name>\r
+    </file>\r
+    <file>\r
+      <name>$PROJ_DIR$\logic\datalog.c</name>\r
+    </file>\r
+    <file>\r
+      <name>$PROJ_DIR$\logic\datalog.h</name>\r
+    </file>\r
+    <file>\r
+      <name>$PROJ_DIR$\logic\date.c</name>\r
+    </file>\r
+    <file>\r
+      <name>$PROJ_DIR$\logic\date.h</name>\r
+    </file>\r
+    <file>\r
+      <name>$PROJ_DIR$\logic\menu.c</name>\r
+    </file>\r
+    <file>\r
+      <name>$PROJ_DIR$\logic\menu.h</name>\r
+    </file>\r
+    <file>\r
+      <name>$PROJ_DIR$\logic\rfbsl.c</name>\r
+    </file>\r
+    <file>\r
+      <name>$PROJ_DIR$\logic\rfbsl.h</name>\r
+    </file>\r
+    <file>\r
+      <name>$PROJ_DIR$\logic\rfsimpliciti.c</name>\r
+    </file>\r
+    <file>\r
+      <name>$PROJ_DIR$\logic\rfsimpliciti.h</name>\r
+    </file>\r
+    <file>\r
+      <name>$PROJ_DIR$\logic\temperature.c</name>\r
+    </file>\r
+    <file>\r
+      <name>$PROJ_DIR$\logic\temperature.h</name>\r
+    </file>\r
+    <file>\r
+      <name>$PROJ_DIR$\logic\user.c</name>\r
+    </file>\r
+    <file>\r
+      <name>$PROJ_DIR$\logic\user.h</name>\r
+    </file>\r
+  </group>\r
+  <group>\r
+    <name>simpliciti</name>\r
+    <group>\r
+      <name>Applications</name>\r
+      <group>\r
+        <name>application</name>\r
+        <group>\r
+          <name>End Device</name>\r
+          <file>\r
+            <name>$PROJ_DIR$\simpliciti\Applications\application\End Device\main_ED_BM.c</name>\r
+            <excluded>\r
+              <configuration>915MHz - Limited IAR Kickstart (USA)</configuration>\r
+              <configuration>868MHz - Limited IAR Kickstart (Europe)</configuration>\r
+              <configuration>433MHz - Limited IAR Kickstart (Other regions)</configuration>\r
+            </excluded>\r
+          </file>\r
+        </group>\r
+      </group>\r
+      <group>\r
+        <name>configuration</name>\r
+        <group>\r
+          <name>End Device</name>\r
+          <file>\r
+            <name>$PROJ_DIR$\simpliciti\Applications\configuration\End Device\smpl_config.dat</name>\r
+          </file>\r
+        </group>\r
+        <file>\r
+          <name>$PROJ_DIR$\simpliciti\Applications\configuration\smpl_nwk_config.dat</name>\r
+        </file>\r
+      </group>\r
+    </group>\r
+    <group>\r
+      <name>Components</name>\r
+      <group>\r
+        <name>bsp</name>\r
+        <group>\r
+          <name>boards</name>\r
+          <group>\r
+            <name>CC430EM</name>\r
+            <group>\r
+              <name>bsp_external</name>\r
+              <file>\r
+                <name>$PROJ_DIR$\simpliciti\Components\bsp\boards\CC430EM\bsp_external\mrfi_board_defs.h</name>\r
+              </file>\r
+            </group>\r
+            <file>\r
+              <name>$PROJ_DIR$\simpliciti\Components\bsp\boards\CC430EM\bsp_board.c</name>\r
+              <excluded>\r
+                <configuration>915MHz - Limited IAR Kickstart (USA)</configuration>\r
+                <configuration>868MHz - Limited IAR Kickstart (Europe)</configuration>\r
+                <configuration>433MHz - Limited IAR Kickstart (Other regions)</configuration>\r
+                <configuration>915MHz - Unrestricted IAR Workbench (USA)</configuration>\r
+                <configuration>868MHz - Unrestricted IAR Workbench (Europe)</configuration>\r
+                <configuration>433MHz - Unrestricted IAR Workbench (Other regions)</configuration>\r
+              </excluded>\r
+            </file>\r
+            <file>\r
+              <name>$PROJ_DIR$\simpliciti\Components\bsp\boards\CC430EM\bsp_board_defs.h</name>\r
+            </file>\r
+            <file>\r
+              <name>$PROJ_DIR$\simpliciti\Components\bsp\boards\CC430EM\bsp_button_defs.h</name>\r
+            </file>\r
+            <file>\r
+              <name>$PROJ_DIR$\simpliciti\Components\bsp\boards\CC430EM\bsp_config.h</name>\r
+            </file>\r
+            <file>\r
+              <name>$PROJ_DIR$\simpliciti\Components\bsp\boards\CC430EM\bsp_driver_defs.h</name>\r
+            </file>\r
+            <file>\r
+              <name>$PROJ_DIR$\simpliciti\Components\bsp\boards\CC430EM\bsp_drivers.c</name>\r
+              <excluded>\r
+                <configuration>915MHz - Limited IAR Kickstart (USA)</configuration>\r
+                <configuration>868MHz - Limited IAR Kickstart (Europe)</configuration>\r
+                <configuration>433MHz - Limited IAR Kickstart (Other regions)</configuration>\r
+                <configuration>915MHz - Unrestricted IAR Workbench (USA)</configuration>\r
+                <configuration>868MHz - Unrestricted IAR Workbench (Europe)</configuration>\r
+                <configuration>433MHz - Unrestricted IAR Workbench (Other regions)</configuration>\r
+              </excluded>\r
+            </file>\r
+            <file>\r
+              <name>$PROJ_DIR$\simpliciti\Components\bsp\boards\CC430EM\bsp_led_defs.h</name>\r
+            </file>\r
+          </group>\r
+        </group>\r
+        <group>\r
+          <name>drivers</name>\r
+          <group>\r
+            <name>code</name>\r
+            <file>\r
+              <name>$PROJ_DIR$\simpliciti\Components\bsp\drivers\code\bsp_buttons.c</name>\r
+              <excluded>\r
+                <configuration>915MHz - Limited IAR Kickstart (USA)</configuration>\r
+                <configuration>868MHz - Limited IAR Kickstart (Europe)</configuration>\r
+                <configuration>433MHz - Limited IAR Kickstart (Other regions)</configuration>\r
+                <configuration>915MHz - Unrestricted IAR Workbench (USA)</configuration>\r
+                <configuration>868MHz - Unrestricted IAR Workbench (Europe)</configuration>\r
+                <configuration>433MHz - Unrestricted IAR Workbench (Other regions)</configuration>\r
+              </excluded>\r
+            </file>\r
+            <file>\r
+              <name>$PROJ_DIR$\simpliciti\Components\bsp\drivers\code\bsp_generic_buttons.h</name>\r
+            </file>\r
+            <file>\r
+              <name>$PROJ_DIR$\simpliciti\Components\bsp\drivers\code\bsp_generic_leds.h</name>\r
+            </file>\r
+            <file>\r
+              <name>$PROJ_DIR$\simpliciti\Components\bsp\drivers\code\bsp_leds.c</name>\r
+              <excluded>\r
+                <configuration>915MHz - Limited IAR Kickstart (USA)</configuration>\r
+                <configuration>868MHz - Limited IAR Kickstart (Europe)</configuration>\r
+                <configuration>433MHz - Limited IAR Kickstart (Other regions)</configuration>\r
+                <configuration>915MHz - Unrestricted IAR Workbench (USA)</configuration>\r
+                <configuration>868MHz - Unrestricted IAR Workbench (Europe)</configuration>\r
+                <configuration>433MHz - Unrestricted IAR Workbench (Other regions)</configuration>\r
+              </excluded>\r
+            </file>\r
+          </group>\r
+          <file>\r
+            <name>$PROJ_DIR$\simpliciti\Components\bsp\drivers\bsp_buttons.h</name>\r
+          </file>\r
+          <file>\r
+            <name>$PROJ_DIR$\simpliciti\Components\bsp\drivers\bsp_leds.h</name>\r
+          </file>\r
+        </group>\r
+        <group>\r
+          <name>mcus</name>\r
+          <file>\r
+            <name>$PROJ_DIR$\simpliciti\Components\bsp\mcus\bsp_msp430_defs.h</name>\r
+          </file>\r
+        </group>\r
+        <file>\r
+          <name>$PROJ_DIR$\simpliciti\Components\bsp\bsp.c</name>\r
+          <excluded>\r
+            <configuration>915MHz - Limited IAR Kickstart (USA)</configuration>\r
+            <configuration>868MHz - Limited IAR Kickstart (Europe)</configuration>\r
+            <configuration>433MHz - Limited IAR Kickstart (Other regions)</configuration>\r
+          </excluded>\r
+        </file>\r
+        <file>\r
+          <name>$PROJ_DIR$\simpliciti\Components\bsp\bsp.h</name>\r
+        </file>\r
+        <file>\r
+          <name>$PROJ_DIR$\simpliciti\Components\bsp\bsp_macros.h</name>\r
+        </file>\r
+      </group>\r
+      <group>\r
+        <name>mrfi</name>\r
+        <group>\r
+          <name>radios</name>\r
+          <group>\r
+            <name>family5</name>\r
+            <file>\r
+              <name>$PROJ_DIR$\simpliciti\Components\mrfi\radios\family5\mrfi_radio.c</name>\r
+              <excluded>\r
+                <configuration>915MHz - Limited IAR Kickstart (USA)</configuration>\r
+                <configuration>868MHz - Limited IAR Kickstart (Europe)</configuration>\r
+                <configuration>433MHz - Limited IAR Kickstart (Other regions)</configuration>\r
+                <configuration>915MHz - Unrestricted IAR Workbench (USA)</configuration>\r
+                <configuration>868MHz - Unrestricted IAR Workbench (Europe)</configuration>\r
+                <configuration>433MHz - Unrestricted IAR Workbench (Other regions)</configuration>\r
+              </excluded>\r
+            </file>\r
+            <file>\r
+              <name>$PROJ_DIR$\simpliciti\Components\mrfi\radios\family5\mrfi_radio_interface.c</name>\r
+              <excluded>\r
+                <configuration>915MHz - Limited IAR Kickstart (USA)</configuration>\r
+                <configuration>868MHz - Limited IAR Kickstart (Europe)</configuration>\r
+                <configuration>433MHz - Limited IAR Kickstart (Other regions)</configuration>\r
+                <configuration>915MHz - Unrestricted IAR Workbench (USA)</configuration>\r
+                <configuration>868MHz - Unrestricted IAR Workbench (Europe)</configuration>\r
+                <configuration>433MHz - Unrestricted IAR Workbench (Other regions)</configuration>\r
+              </excluded>\r
+            </file>\r
+            <file>\r
+              <name>$PROJ_DIR$\simpliciti\Components\mrfi\radios\family5\mrfi_radio_interface.h</name>\r
+            </file>\r
+          </group>\r
+        </group>\r
+        <group>\r
+          <name>smartrf</name>\r
+          <group>\r
+            <name>CC1101</name>\r
+            <file>\r
+              <name>$PROJ_DIR$\simpliciti\Components\mrfi\smartrf\CC1101\smartrf_CC1101.h</name>\r
+            </file>\r
+          </group>\r
+        </group>\r
+        <file>\r
+          <name>$PROJ_DIR$\simpliciti\Components\mrfi\mrfi.c</name>\r
+          <excluded>\r
+            <configuration>915MHz - Limited IAR Kickstart (USA)</configuration>\r
+            <configuration>868MHz - Limited IAR Kickstart (Europe)</configuration>\r
+            <configuration>433MHz - Limited IAR Kickstart (Other regions)</configuration>\r
+          </excluded>\r
+        </file>\r
+        <file>\r
+          <name>$PROJ_DIR$\simpliciti\Components\mrfi\mrfi.h</name>\r
+        </file>\r
+        <file>\r
+          <name>$PROJ_DIR$\simpliciti\Components\mrfi\mrfi_defs.h</name>\r
+        </file>\r
+      </group>\r
+      <group>\r
+        <name>nwk</name>\r
+        <file>\r
+          <name>$PROJ_DIR$\simpliciti\Components\nwk\nwk.c</name>\r
+          <excluded>\r
+            <configuration>915MHz - Limited IAR Kickstart (USA)</configuration>\r
+            <configuration>868MHz - Limited IAR Kickstart (Europe)</configuration>\r
+            <configuration>433MHz - Limited IAR Kickstart (Other regions)</configuration>\r
+          </excluded>\r
+        </file>\r
+        <file>\r
+          <name>$PROJ_DIR$\simpliciti\Components\nwk\nwk.h</name>\r
+        </file>\r
+        <file>\r
+          <name>$PROJ_DIR$\simpliciti\Components\nwk\nwk_api.c</name>\r
+          <excluded>\r
+            <configuration>915MHz - Limited IAR Kickstart (USA)</configuration>\r
+            <configuration>868MHz - Limited IAR Kickstart (Europe)</configuration>\r
+            <configuration>433MHz - Limited IAR Kickstart (Other regions)</configuration>\r
+          </excluded>\r
+        </file>\r
+        <file>\r
+          <name>$PROJ_DIR$\simpliciti\Components\nwk\nwk_api.h</name>\r
+        </file>\r
+        <file>\r
+          <name>$PROJ_DIR$\simpliciti\Components\nwk\nwk_app.h</name>\r
+        </file>\r
+        <file>\r
+          <name>$PROJ_DIR$\simpliciti\Components\nwk\nwk_frame.c</name>\r
+          <excluded>\r
+            <configuration>915MHz - Limited IAR Kickstart (USA)</configuration>\r
+            <configuration>868MHz - Limited IAR Kickstart (Europe)</configuration>\r
+            <configuration>433MHz - Limited IAR Kickstart (Other regions)</configuration>\r
+          </excluded>\r
+        </file>\r
+        <file>\r
+          <name>$PROJ_DIR$\simpliciti\Components\nwk\nwk_frame.h</name>\r
+        </file>\r
+        <file>\r
+          <name>$PROJ_DIR$\simpliciti\Components\nwk\nwk_globals.c</name>\r
+          <excluded>\r
+            <configuration>915MHz - Limited IAR Kickstart (USA)</configuration>\r
+            <configuration>868MHz - Limited IAR Kickstart (Europe)</configuration>\r
+            <configuration>433MHz - Limited IAR Kickstart (Other regions)</configuration>\r
+          </excluded>\r
+        </file>\r
+        <file>\r
+          <name>$PROJ_DIR$\simpliciti\Components\nwk\nwk_globals.h</name>\r
+        </file>\r
+        <file>\r
+          <name>$PROJ_DIR$\simpliciti\Components\nwk\nwk_QMgmt.c</name>\r
+          <excluded>\r
+            <configuration>915MHz - Limited IAR Kickstart (USA)</configuration>\r
+            <configuration>868MHz - Limited IAR Kickstart (Europe)</configuration>\r
+            <configuration>433MHz - Limited IAR Kickstart (Other regions)</configuration>\r
+          </excluded>\r
+        </file>\r
+        <file>\r
+          <name>$PROJ_DIR$\simpliciti\Components\nwk\nwk_QMgmt.h</name>\r
+        </file>\r
+        <file>\r
+          <name>$PROJ_DIR$\simpliciti\Components\nwk\nwk_types.h</name>\r
+        </file>\r
+      </group>\r
+      <group>\r
+        <name>nwk_applications</name>\r
+        <file>\r
+          <name>$PROJ_DIR$\simpliciti\Components\nwk_applications\nwk_freq.c</name>\r
+          <excluded>\r
+            <configuration>915MHz - Limited IAR Kickstart (USA)</configuration>\r
+            <configuration>868MHz - Limited IAR Kickstart (Europe)</configuration>\r
+            <configuration>433MHz - Limited IAR Kickstart (Other regions)</configuration>\r
+          </excluded>\r
+        </file>\r
+        <file>\r
+          <name>$PROJ_DIR$\simpliciti\Components\nwk_applications\nwk_freq.h</name>\r
+        </file>\r
+        <file>\r
+          <name>$PROJ_DIR$\simpliciti\Components\nwk_applications\nwk_ioctl.c</name>\r
+          <excluded>\r
+            <configuration>915MHz - Limited IAR Kickstart (USA)</configuration>\r
+            <configuration>868MHz - Limited IAR Kickstart (Europe)</configuration>\r
+            <configuration>433MHz - Limited IAR Kickstart (Other regions)</configuration>\r
+          </excluded>\r
+        </file>\r
+        <file>\r
+          <name>$PROJ_DIR$\simpliciti\Components\nwk_applications\nwk_ioctl.h</name>\r
+        </file>\r
+        <file>\r
+          <name>$PROJ_DIR$\simpliciti\Components\nwk_applications\nwk_join.c</name>\r
+          <excluded>\r
+            <configuration>915MHz - Limited IAR Kickstart (USA)</configuration>\r
+            <configuration>868MHz - Limited IAR Kickstart (Europe)</configuration>\r
+            <configuration>433MHz - Limited IAR Kickstart (Other regions)</configuration>\r
+          </excluded>\r
+        </file>\r
+        <file>\r
+          <name>$PROJ_DIR$\simpliciti\Components\nwk_applications\nwk_join.h</name>\r
+        </file>\r
+        <file>\r
+          <name>$PROJ_DIR$\simpliciti\Components\nwk_applications\nwk_link.c</name>\r
+          <excluded>\r
+            <configuration>915MHz - Limited IAR Kickstart (USA)</configuration>\r
+            <configuration>868MHz - Limited IAR Kickstart (Europe)</configuration>\r
+            <configuration>433MHz - Limited IAR Kickstart (Other regions)</configuration>\r
+          </excluded>\r
+        </file>\r
+        <file>\r
+          <name>$PROJ_DIR$\simpliciti\Components\nwk_applications\nwk_link.h</name>\r
+        </file>\r
+        <file>\r
+          <name>$PROJ_DIR$\simpliciti\Components\nwk_applications\nwk_mgmt.c</name>\r
+          <excluded>\r
+            <configuration>915MHz - Limited IAR Kickstart (USA)</configuration>\r
+            <configuration>868MHz - Limited IAR Kickstart (Europe)</configuration>\r
+            <configuration>433MHz - Limited IAR Kickstart (Other regions)</configuration>\r
+          </excluded>\r
+        </file>\r
+        <file>\r
+          <name>$PROJ_DIR$\simpliciti\Components\nwk_applications\nwk_mgmt.h</name>\r
+        </file>\r
+        <file>\r
+          <name>$PROJ_DIR$\simpliciti\Components\nwk_applications\nwk_ping.c</name>\r
+          <excluded>\r
+            <configuration>915MHz - Limited IAR Kickstart (USA)</configuration>\r
+            <configuration>868MHz - Limited IAR Kickstart (Europe)</configuration>\r
+            <configuration>433MHz - Limited IAR Kickstart (Other regions)</configuration>\r
+          </excluded>\r
+        </file>\r
+        <file>\r
+          <name>$PROJ_DIR$\simpliciti\Components\nwk_applications\nwk_ping.h</name>\r
+        </file>\r
+        <file>\r
+          <name>$PROJ_DIR$\simpliciti\Components\nwk_applications\nwk_security.c</name>\r
+          <excluded>\r
+            <configuration>915MHz - Limited IAR Kickstart (USA)</configuration>\r
+            <configuration>868MHz - Limited IAR Kickstart (Europe)</configuration>\r
+            <configuration>433MHz - Limited IAR Kickstart (Other regions)</configuration>\r
+          </excluded>\r
+        </file>\r
+        <file>\r
+          <name>$PROJ_DIR$\simpliciti\Components\nwk_applications\nwk_security.h</name>\r
+        </file>\r
+      </group>\r
+    </group>\r
+    <file>\r
+      <name>$PROJ_DIR$\simpliciti\CC430_End_Device_433MHz.r43</name>\r
+      <excluded>\r
+        <configuration>915MHz - Limited IAR Kickstart (USA)</configuration>\r
+        <configuration>868MHz - Limited IAR Kickstart (Europe)</configuration>\r
+        <configuration>915MHz - Unrestricted IAR Workbench (USA)</configuration>\r
+        <configuration>868MHz - Unrestricted IAR Workbench (Europe)</configuration>\r
+        <configuration>433MHz - Unrestricted IAR Workbench (Other regions)</configuration>\r
+      </excluded>\r
+    </file>\r
+    <file>\r
+      <name>$PROJ_DIR$\simpliciti\CC430_End_Device_868MHz.r43</name>\r
+      <excluded>\r
+        <configuration>915MHz - Limited IAR Kickstart (USA)</configuration>\r
+        <configuration>433MHz - Limited IAR Kickstart (Other regions)</configuration>\r
+        <configuration>915MHz - Unrestricted IAR Workbench (USA)</configuration>\r
+        <configuration>868MHz - Unrestricted IAR Workbench (Europe)</configuration>\r
+        <configuration>433MHz - Unrestricted IAR Workbench (Other regions)</configuration>\r
+      </excluded>\r
+    </file>\r
+    <file>\r
+      <name>$PROJ_DIR$\simpliciti\CC430_End_Device_915MHz.r43</name>\r
+      <excluded>\r
+        <configuration>868MHz - Limited IAR Kickstart (Europe)</configuration>\r
+        <configuration>433MHz - Limited IAR Kickstart (Other regions)</configuration>\r
+        <configuration>915MHz - Unrestricted IAR Workbench (USA)</configuration>\r
+        <configuration>868MHz - Unrestricted IAR Workbench (Europe)</configuration>\r
+        <configuration>433MHz - Unrestricted IAR Workbench (Other regions)</configuration>\r
+      </excluded>\r
+    </file>\r
+    <file>\r
+      <name>$PROJ_DIR$\simpliciti\simpliciti.h</name>\r
+    </file>\r
+  </group>\r
+  <file>\r
+    <name>$PROJ_DIR$\change_record.txt</name>\r
+  </file>\r
+  <file>\r
+    <name>$PROJ_DIR$\lnkCC430F6137.xcl</name>\r
+  </file>\r
+  <file>\r
+    <name>$PROJ_DIR$\main.c</name>\r
+  </file>\r
+</project>\r
+\r
+\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/ez430_chronos_datalogger.eww b/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/ez430_chronos_datalogger.eww
new file mode 100755 (executable)
index 0000000..000c020
--- /dev/null
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="iso-8859-1"?>\r
+\r
+<workspace>\r
+  <project>\r
+    <path>$WS_DIR$\ez430_chronos_datalogger.ewp</path>\r
+  </project>\r
+  <batchBuild/>\r
+</workspace>\r
+\r
+\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/include/project.h b/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/include/project.h
new file mode 100755 (executable)
index 0000000..5fa7ed2
--- /dev/null
@@ -0,0 +1,132 @@
+// *************************************************************************************************\r
+//\r
+//      Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/ \r
+//       \r
+//       \r
+//        Redistribution and use in source and binary forms, with or without \r
+//        modification, are permitted provided that the following conditions \r
+//        are met:\r
+//      \r
+//          Redistributions of source code must retain the above copyright \r
+//          notice, this list of conditions and the following disclaimer.\r
+//       \r
+//          Redistributions in binary form must reproduce the above copyright\r
+//          notice, this list of conditions and the following disclaimer in the \r
+//          documentation and/or other materials provided with the   \r
+//          distribution.\r
+//       \r
+//          Neither the name of Texas Instruments Incorporated nor the names of\r
+//          its contributors may be used to endorse or promote products derived\r
+//          from this software without specific prior written permission.\r
+//      \r
+//        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \r
+//        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT \r
+//        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT \r
+//        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, \r
+//        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT \r
+//        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT \r
+//        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE \r
+//        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+\r
+#ifndef PROJECT_H_\r
+#define PROJECT_H_\r
+\r
+// *************************************************************************************************\r
+// Include section\r
+#include <cc430x613x.h>\r
+#include <bm.h>\r
+\r
+// *************************************************************************************************\r
+// Defines section\r
+\r
+// Comment this to not use the LCD charge pump\r
+//#define USE_LCD_CHARGE_PUMP\r
+\r
+// Uncomment this define to build the application without watchdog support\r
+#define USE_WATCHDOG\r
+\r
+// Use/not use filter when measuring physical values\r
+#define FILTER_OFF                                             (0u)\r
+#define FILTER_ON                                              (1u)\r
+\r
+// Uncomment this define to build the application with BlueRobin heartrate support\r
+#define INCLUDE_BLUEROBIN_SUPPORT\r
+\r
+// *************************************************************************************************\r
+// Macro section\r
+\r
+// Conversion from usec to ACLK timer ticks\r
+#define CONV_US_TO_TICKS(usec)                                 (((usec) * 32768) / 1000000)\r
+\r
+// Conversion from msec to ACLK timer ticks\r
+#define CONV_MS_TO_TICKS(msec)                                 (((msec) * 32768) / 1000)\r
+\r
+// *************************************************************************************************\r
+// Typedef section\r
+\r
+typedef enum\r
+{\r
+   MENU_ITEM_NOT_VISIBLE = 0,   // Menu item is not visible\r
+   MENU_ITEM_VISIBLE            // Menu item is visible\r
+} menu_t;\r
+\r
+// Set of system flags\r
+typedef union\r
+{\r
+   struct\r
+   {\r
+      u16 idle_timeout           :1;      // Timeout after inactivity\r
+      u16 idle_timeout_enabled   :1;      // When in set mode, timeout after a given period\r
+      u16 lock_buttons           :1;      // Lock buttons\r
+      u16 mask_buzzer            :1;      // Do not output buzz for next button event\r
+      u16 up_down_repeat_enabled :1;      // While in set_value(), create virtual UP / DOWN button press\r
+      u16 low_battery            :1;      // 1 = Battery is low\r
+      u16 use_metric_units       :1;      // 1 = Use metric units, 0 = use English units\r
+      u16 delay_over             :1;      // 1 = Timer delay over\r
+   } flag;\r
+   u16 all_flags;               // Shortcut to all display flags (for reset)\r
+} s_system_flags;\r
+extern volatile s_system_flags sys;\r
+\r
+// Set of request flags\r
+typedef union\r
+{\r
+   struct\r
+   {\r
+      u16 voltage_measurement      :1;       // 1 = Measure voltage\r
+      u16 altitude_measurement     :1;       // 1 = Measure air pressure\r
+      u16 acceleration_measurement :1;       // 1 = Measure acceleration\r
+      u16 datalog                  :1;       // 1 = Add data \r
+   } flag;\r
+   u16 all_flags;               // Shortcut to all display flags (for reset)\r
+} s_request_flags;\r
+extern volatile s_request_flags request;\r
+\r
+// Set of message flags\r
+typedef union\r
+{\r
+   struct\r
+   {\r
+      u16 prepare         :1;        // 1 = Wait for clock tick, then set display.flag.show_message flag\r
+      u16 show            :1;        // 1 = Display message now\r
+      u16 erase           :1;        // 1 = Erase message\r
+      u16 type_locked     :1;        // 1 = Show "buttons are locked" in Line2\r
+      u16 type_unlocked   :1;        // 1 = Show "buttons are unlocked" in Line2\r
+      u16 type_lobatt     :1;        // 1 = Show "lobatt" text in Line2\r
+      u16 type_on         :1;        // 1 = Show "  on" text in Line1\r
+      u16 type_off        :1;        // 1 = Show " off" text in Line1\r
+      u16 type_nomem      :1;        // 1 = Show "nomem" text in Line2\r
+   } flag;\r
+   u16 all_flags;          // Shortcut to all message flags (for reset)\r
+} s_message_flags;\r
+extern volatile s_message_flags message;\r
+\r
+// *************************************************************************************************\r
+// Global Variable section\r
+\r
+#endif                          /*PROJECT_H_ */\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/lnkcc430f6137.xcl b/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/lnkcc430f6137.xcl
new file mode 100755 (executable)
index 0000000..f5c0401
--- /dev/null
@@ -0,0 +1,138 @@
+//*****************************************************************\r
+//\r
+// XLINK command file for IAR Embedded Workbench for MSP430.\r
+//\r
+// This file should be used with the CC430F6137 microprocessor.\r
+//\r
+// Copyright 1996-2007 IAR Systems. All rights reserved.\r
+//\r
+// Usage:  xlink your_file(s) -f lnkcc430f6137 library\r
+//\r
+// $Revision: 1.30 $\r
+//\r
+//*****************************************************************\r
+\r
+//*****************************************************************\r
+//\r
+// The memory areas of the CC430F6137 microprocessor:\r
+//\r
+//   Peripheral units:                0 - 01FF\r
+//\r
+//   Information memory (FLASH):   1800 - 19FF\r
+//\r
+//   Read-write memory (RAM):      1C00 - 23FD\r
+//\r
+//   Read-only memory (FLASH):     8000 - FF7F\r
+//                                 \r
+//\r
+//*****************************************************************\r
+\r
+//*****************************************************************\r
+//\r
+// The following segments are defined in this linker command file:\r
+//\r
+// Data read/write segments (RAM)\r
+// ==============================\r
+//\r
+// segment     Restrictions    Usage\r
+// -------     ------------    --------------------------\r
+// DATA16_I    < 10000         Data16 initialized variables\r
+// DATA16_Z    < 10000         Data16 zero initialized variables\r
+// DATA16_N    < 10000         Data16 uninitialized variables\r
+// DATA16_HEAP < 10000         Data16 heap used by malloc and free\r
+// DATA20_I                    Data20 initialized variables\r
+// DATA20_Z                    Data20 zero initialized variables\r
+// DATA20_N                    Data20 uninitialized variables\r
+// DATA20_HEAP                 Data20 heap used by malloc and free\r
+// CSTACK      < 10000         Runtime stack\r
+//\r
+//\r
+// Program and data read-only segments (FLASH)\r
+// ===========================================\r
+//\r
+// segment     Restrictions    Usage\r
+// -------     ------------    --------------------------\r
+// INFO                        Information memory\r
+// CSTART      < 10000         Program startup code\r
+// CODE                        Program code\r
+// ISR_CODE    < 10000         Program code for interrupt service routines\r
+// DATA16_C    < 10000         Data16 constant data and string literals\r
+// DATA16_ID   < 10000         Data16 initializers for DATA16_I\r
+// DATA20_C                    Data20 constant data and string literals\r
+// DATA20_ID                   Data20 initializers for DATA20_I\r
+// DIFUNCT     < 10000         Dynamic initialization vector used by C++\r
+// CHECKSUM                    Checksum byte(s) generated by the -J option\r
+// INTVEC      FF80-FFFF       Interrupt vectors\r
+// RESET       FFFE-FFFF       The reset vector\r
+//\r
+//*****************************************************************\r
+\r
+\r
+// ---------------------------------------------------------\r
+// Stack and heap sizes.\r
+// ---------------------------------------------------------\r
+\r
+// Uncomment for command line use\r
+//-D_STACK_SIZE=80\r
+//-D_DATA16_HEAP_SIZE=80\r
+\r
+\r
+// ---------------------------------------------------------\r
+// Define cpu.\r
+// ---------------------------------------------------------\r
+\r
+-cmsp430\r
+\r
+\r
+// ---------------------------------------------------------\r
+// Read-write memory.\r
+// ---------------------------------------------------------\r
+\r
+-Z(DATA)DATA16_I,DATA16_Z,DATA16_N,DATA16_HEAP+_DATA16_HEAP_SIZE=1C00-23FD\r
+-Z(DATA)CSTACK+_STACK_SIZE#\r
+\r
+\r
+// ---------------------------------------------------------\r
+// Read only memory\r
+\r
+\r
+// ---------------------------------------------------------\r
+// Information memory\r
+// ---------------------------------------------------------\r
+\r
+-Z(CODE)INFO=1800-19FF\r
+-Z(CODE)INFOA=1980-19FF\r
+-Z(CODE)INFOB=1900-197F\r
+-Z(CODE)INFOC=1880-18FF\r
+-Z(CODE)INFOD=1800-187F\r
+\r
+\r
+\r
+// ---------------------------------------------------------\r
+// Constant data\r
+// ---------------------------------------------------------\r
+\r
+//-Z(CONST)DATA16_C,DATA16_ID,DIFUNCT=8000-FF7F\r
+-Z(CONST)DATA16_C,DATA16_ID,DIFUNCT=9E00-FF7F\r
+\r
+// ---------------------------------------------------------\r
+// Code\r
+// ---------------------------------------------------------\r
+\r
+//-Z(CODE)CSTART,ISR_CODE=8000-FF7F\r
+//-P(CODE)CODE=8000-FF7F\r
+-Z(CODE)CSTART,ISR_CODE=9E00-FF7F\r
+-P(CODE)CODE=9E00-FF7F\r
+\r
+\r
+// ---------------------------------------------------------\r
+// Interrupt vectors\r
+// ---------------------------------------------------------\r
+\r
+-Z(CODE)INTVEC=FF80-FFFF\r
+-Z(CODE)RESET=FFFE-FFFF\r
+\r
+\r
+// ---------------------------------------------------------\r
+// The end\r
+// ---------------------------------------------------------\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/logic/acceleration.c b/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/logic/acceleration.c
new file mode 100755 (executable)
index 0000000..c422496
--- /dev/null
@@ -0,0 +1,241 @@
+// *************************************************************************************************\r
+//\r
+//      Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//        Redistribution and use in source and binary forms, with or without\r
+//        modification, are permitted provided that the following conditions\r
+//        are met:\r
+//\r
+//          Redistributions of source code must retain the above copyright\r
+//          notice, this list of conditions and the following disclaimer.\r
+//\r
+//          Redistributions in binary form must reproduce the above copyright\r
+//          notice, this list of conditions and the following disclaimer in the\r
+//          documentation and/or other materials provided with the\r
+//          distribution.\r
+//\r
+//          Neither the name of Texas Instruments Incorporated nor the names of\r
+//          its contributors may be used to endorse or promote products derived\r
+//          from this software without specific prior written permission.\r
+//\r
+//        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+// Acceleration measurement functions.\r
+// *************************************************************************************************\r
+\r
+// *************************************************************************************************\r
+// Include section\r
+\r
+// system\r
+#include "project.h"\r
+\r
+// driver\r
+#include "display.h"\r
+#include "vti_as.h"\r
+\r
+// logic\r
+#include "acceleration.h"\r
+#include "simpliciti.h"\r
+#include "user.h"\r
+\r
+// *************************************************************************************************\r
+// Global Variable section\r
+struct accel sAccel;\r
+\r
+// Conversion values from data to mgrav taken from CMA3000-D0x datasheet (rev 0.4, table 4)\r
+const u16 mgrav_per_bit[7] = { 18, 36, 71, 143, 286, 571, 1142 };\r
+\r
+// *************************************************************************************************\r
+// Extern section\r
+\r
+// Global flag for proper acceleration sensor operation\r
+extern u8 as_ok;\r
+\r
+// *************************************************************************************************\r
+// @fn          reset_acceleration\r
+// @brief       Reset acceleration variables.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void reset_acceleration(void)\r
+{\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          acceleration_value_is_positive\r
+// @brief       Returns 1 if 2's complement number is positive\r
+// @param       u8 value        2's complement number\r
+// @return      u8                      1 = number is positive, 0 = number is negavtive\r
+// *************************************************************************************************\r
+u8 acceleration_value_is_positive(u8 value)\r
+{\r
+    return ((value & BIT7) == 0);\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          convert_acceleration_value_to_mgrav\r
+// @brief       Converts measured value to mgrav units\r
+// @param       u8 value        g data from sensor\r
+// @return      u16                     Acceleration (mgrav)\r
+// *************************************************************************************************\r
+u16 convert_acceleration_value_to_mgrav(u8 value)\r
+{\r
+    u16 result;\r
+    u8 i;\r
+\r
+    if (!acceleration_value_is_positive(value))\r
+    {\r
+        // Convert 2's complement negative number to positive number\r
+        value = ~value;\r
+        value += 1;\r
+    }\r
+\r
+    result = 0;\r
+    for (i = 0; i < 7; i++)\r
+    {\r
+        result += ((value & (BIT(i))) >> i) * mgrav_per_bit[i];\r
+    }\r
+\r
+    return (result);\r
+}\r
+\r
+//\r
+////\r
+// *************************************************************************************************\r
+//// @fn          display_acceleration\r
+//// @brief       Display routine.\r
+//// @param       u8 line                       LINE1\r
+////                            u8 update               DISPLAY_LINE_UPDATE_FULL, DISPLAY_LINE_CLEAR\r
+//// @return      none\r
+////\r
+// *************************************************************************************************\r
+//void display_acceleration(u8 line, u8 update)\r
+//{\r
+//      u8 * str;\r
+//      u8 raw_data;\r
+//      u16 accel_data;\r
+//\r
+//      // Show warning if acceleration sensor was not initialised properly\r
+//      if (!as_ok)\r
+//      {\r
+//              display_chars(LCD_SEG_L1_2_0, (u8*)"ERR", SEG_ON);\r
+//      }\r
+//      else\r
+//      {\r
+//              // Redraw whole screen\r
+//              if (update == DISPLAY_LINE_UPDATE_FULL)\r
+//              {\r
+//                      {\r
+//                              // Start acceleration sensor\r
+//                              if (!is_acceleration_measurement())\r
+//                              {\r
+//                                      // Clear previous acceleration value\r
+//                                      sAccel.data = 0;\r
+//\r
+//                                      // Start sensor\r
+//                                      as_start();\r
+//\r
+//                                      // Set timeout counter\r
+//                                      sAccel.timeout = ACCEL_MEASUREMENT_TIMEOUT;\r
+//\r
+//                                      // Set mode\r
+//                                      sAccel.mode = ACCEL_MODE_ON;\r
+//\r
+//                                      // Start with Y-axis values\r
+//                                      sAccel.view_style = DISPLAY_ACCEL_Y;\r
+//                              }\r
+//\r
+//                              // Display decimal point\r
+//                              display_symbol(LCD_SEG_L1_DP1, SEG_ON);\r
+//                      }\r
+//              }\r
+//              else if (update == DISPLAY_LINE_UPDATE_PARTIAL)\r
+//              {\r
+//                      // Convert X/Y/Z values to mg\r
+//                      switch (sAccel.view_style)\r
+//                      {\r
+//                              case DISPLAY_ACCEL_X:   raw_data = sAccel.xyz[0];\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//                                                                        display_char(LCD_SEG_L1_3,\r
+// 'X', SEG_ON);\r
+//                                                                              break;\r
+//                              case DISPLAY_ACCEL_Y:   raw_data = sAccel.xyz[1];\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//                                                                        display_char(LCD_SEG_L1_3,\r
+// 'Y', SEG_ON);\r
+//                                                                              break;\r
+//                              default:                                raw_data = sAccel.xyz[2];\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//                                                                        display_char(LCD_SEG_L1_3,\r
+// 'Z', SEG_ON);\r
+//                                                                              break;\r
+//                      }\r
+//                      accel_data = convert_acceleration_value_to_mgrav(raw_data) / 10;\r
+//\r
+//                      // Filter acceleration\r
+//                      accel_data = (u16)((accel_data * 0.2) + (sAccel.data * 0.8));\r
+//\r
+//                      // Store average acceleration\r
+//                      sAccel.data = accel_data;\r
+//\r
+//                      // Display acceleration in x.xx format\r
+//                      str = int_to_array(accel_data, 3, 0);\r
+//                      display_chars(LCD_SEG_L1_2_0, str, SEG_ON);\r
+//\r
+//                      // Display sign\r
+//                      if (acceleration_value_is_positive(raw_data))\r
+//                      {\r
+//                              display_symbol(LCD_SYMB_ARROW_UP, SEG_ON);\r
+//                              display_symbol(LCD_SYMB_ARROW_DOWN, SEG_OFF);\r
+//                      }\r
+//                      else\r
+//                      {\r
+//                              display_symbol(LCD_SYMB_ARROW_UP, SEG_OFF);\r
+//                              display_symbol(LCD_SYMB_ARROW_DOWN, SEG_ON);\r
+//                      }\r
+//              }\r
+//              else if (update == DISPLAY_LINE_CLEAR)\r
+//              {\r
+//                      // Stop acceleration sensor\r
+//                      as_stop();\r
+//\r
+//                      // Clear mode\r
+//                      sAccel.mode = ACCEL_MODE_OFF;\r
+//\r
+//                      // Clean up display\r
+//                      display_symbol(LCD_SEG_L1_DP1, SEG_OFF);\r
+//                      display_symbol(LCD_SYMB_ARROW_UP, SEG_OFF);\r
+//                      display_symbol(LCD_SYMB_ARROW_DOWN, SEG_OFF);\r
+//              }\r
+//      }\r
+//}\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/logic/acceleration.h b/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/logic/acceleration.h
new file mode 100755 (executable)
index 0000000..7b39c2a
--- /dev/null
@@ -0,0 +1,78 @@
+// *************************************************************************************************\r
+//\r
+//      Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//        Redistribution and use in source and binary forms, with or without\r
+//        modification, are permitted provided that the following conditions\r
+//        are met:\r
+//\r
+//          Redistributions of source code must retain the above copyright\r
+//          notice, this list of conditions and the following disclaimer.\r
+//\r
+//          Redistributions in binary form must reproduce the above copyright\r
+//          notice, this list of conditions and the following disclaimer in the\r
+//          documentation and/or other materials provided with the\r
+//          distribution.\r
+//\r
+//          Neither the name of Texas Instruments Incorporated nor the names of\r
+//          its contributors may be used to endorse or promote products derived\r
+//          from this software without specific prior written permission.\r
+//\r
+//        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+\r
+#ifndef ACCELERATION_H_\r
+#define ACCELERATION_H_\r
+\r
+// *************************************************************************************************\r
+// Include section\r
+\r
+// *************************************************************************************************\r
+// Prototypes section\r
+\r
+// *************************************************************************************************\r
+// Defines section\r
+\r
+//#define DISPLAY_ACCEL_X               (0u)\r
+//#define DISPLAY_ACCEL_Y               (1u)\r
+//#define DISPLAY_ACCEL_Z               (2u)\r
+\r
+//#define ACCEL_MODE_OFF                (0u)\r
+//#define ACCEL_MODE_ON         (1u)\r
+\r
+// Stop acceleration measurement after 60 minutes to save battery\r
+//#define ACCEL_MEASUREMENT_TIMEOUT             (60*60u)\r
+\r
+// *************************************************************************************************\r
+// Global Variable section\r
+struct accel\r
+{\r
+    //      u8                      mode;                   // ACC_MODE_OFF, ACC_MODE_ON\r
+    u8 xyz[3];                  // Sensor raw data\r
+    u16 data;                   // Acceleration data in 10 * mgrav\r
+    //      u8                      view_style;             // Display X/Y/Z values\r
+    //      u16                     timeout;                // Timeout\r
+};\r
+extern struct accel sAccel;\r
+\r
+// *************************************************************************************************\r
+// Extern section\r
+extern void reset_acceleration(void);\r
+extern void sx_acceleration(u8 line);\r
+extern void display_acceleration(u8 line, u8 update);\r
+extern u8 is_acceleration_measurement(void);\r
+extern void do_acceleration_measurement(void);\r
+\r
+#endif                          /*ACCELERATION_H_ */\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/logic/altitude.c b/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/logic/altitude.c
new file mode 100755 (executable)
index 0000000..b1cf98d
--- /dev/null
@@ -0,0 +1,342 @@
+// *************************************************************************************************\r
+//\r
+//      Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//        Redistribution and use in source and binary forms, with or without\r
+//        modification, are permitted provided that the following conditions\r
+//        are met:\r
+//\r
+//          Redistributions of source code must retain the above copyright\r
+//          notice, this list of conditions and the following disclaimer.\r
+//\r
+//          Redistributions in binary form must reproduce the above copyright\r
+//          notice, this list of conditions and the following disclaimer in the\r
+//          documentation and/or other materials provided with the\r
+//          distribution.\r
+//\r
+//          Neither the name of Texas Instruments Incorporated nor the names of\r
+//          its contributors may be used to endorse or promote products derived\r
+//          from this software without specific prior written permission.\r
+//\r
+//        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+// Altitude measurement functions.\r
+// *************************************************************************************************\r
+\r
+// *************************************************************************************************\r
+// Include section\r
+\r
+// system\r
+#include "project.h"\r
+\r
+// driver\r
+#include "altitude.h"\r
+#include "display.h"\r
+#include "vti_ps.h"\r
+#include "ports.h"\r
+#include "timer.h"\r
+\r
+// logic\r
+#include "user.h"\r
+#include "datalog.h"\r
+\r
+// *************************************************************************************************\r
+// Prototypes section\r
+\r
+// *************************************************************************************************\r
+// Defines section\r
+\r
+// *************************************************************************************************\r
+// Global Variable section\r
+struct alt sAlt;\r
+\r
+// *************************************************************************************************\r
+// Extern section\r
+\r
+// Global flag for pressure sensor initialisation status\r
+extern u8 ps_ok;\r
+\r
+// *************************************************************************************************\r
+// @fn          reset_altitude_measurement\r
+// @brief       Reset altitude measurement.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void reset_altitude_measurement(void)\r
+{\r
+    // Set default values\r
+    sAlt.on = 0;\r
+    sAlt.altitude = 0;\r
+    sAlt.temperature_C = 0;\r
+    sAlt.temperature_C_offset = 0;\r
+\r
+    // Pressure sensor ok?\r
+    if (ps_ok)\r
+    {\r
+        // Initialise pressure table\r
+        init_pressure_table();\r
+\r
+        // Do single conversion\r
+        start_altitude_measurement();\r
+        stop_altitude_measurement();\r
+\r
+        // Apply calibration offset and recalculate pressure table\r
+        if (sAlt.altitude_offset != 0)\r
+        {\r
+            sAlt.altitude += sAlt.altitude_offset;\r
+            update_pressure_table(sAlt.altitude, sAlt.pressure, sAlt.temperature_K);\r
+        }\r
+    }\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          conv_m_to_ft\r
+// @brief       Convert meters to feet\r
+// @param       u16 m           Meters\r
+// @return      u16             Feet\r
+// *************************************************************************************************\r
+s16 convert_m_to_ft(s16 m)\r
+{\r
+    return (((s32) 328 * m) / 100);\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          conv_ft_to_m\r
+// @brief       Convert feet to meters\r
+// @param       u16 ft          Feet\r
+// @return      u16             Meters\r
+// *************************************************************************************************\r
+s16 convert_ft_to_m(s16 ft)\r
+{\r
+    return (((s32) ft * 61) / 200);\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          start_altitude_measurement\r
+// @brief       Start altitude measurement\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void start_altitude_measurement(void)\r
+{\r
+    u8 timeout = 15;\r
+\r
+    // Already on?\r
+    if (sAlt.on)\r
+        return;\r
+\r
+    // Show warning if pressure sensor was not initialised properly\r
+    if (!ps_ok)\r
+    {\r
+        display_chars(LCD_SEG_L1_2_0, (u8 *) "ERR", SEG_ON);\r
+        return;\r
+    }\r
+\r
+    // Enable DRDY IRQ on rising edge\r
+    PS_INT_IFG &= ~PS_INT_PIN;\r
+    PS_INT_IE |= PS_INT_PIN;\r
+\r
+    // Start pressure sensor\r
+    ps_start();\r
+\r
+    // Set altitude measurement flag\r
+    sAlt.on = 1;\r
+\r
+    // Get updated altitude\r
+    while (((PS_INT_IN & PS_INT_PIN) == 0) && (timeout > 0))\r
+    {\r
+        Timer0_A4_Delay(CONV_MS_TO_TICKS(100));\r
+        timeout--;\r
+    }\r
+\r
+    // Failed to start?\r
+    if (timeout == 0)\r
+    {\r
+        sAlt.on = 0;\r
+    }\r
+\r
+    do_altitude_measurement(FILTER_OFF);\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          stop_altitude_measurement\r
+// @brief       Stop altitude measurement\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void stop_altitude_measurement(void)\r
+{\r
+    // Return if pressure sensor was not initialised properly\r
+    if (!ps_ok)\r
+        return;\r
+\r
+    // Not on?\r
+    if (!sAlt.on)\r
+        return;\r
+\r
+    // Logging data?\r
+    if (is_datalog())\r
+        return;\r
+\r
+    // Stop pressure sensor\r
+    ps_stop();\r
+\r
+    // Clear on flag\r
+    sAlt.on = 0;\r
+\r
+    // Disable DRDY IRQ\r
+    PS_INT_IE &= ~PS_INT_PIN;\r
+    PS_INT_IFG &= ~PS_INT_PIN;\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          is_altitude_measurement\r
+// @brief       Altitude measurement check\r
+// @param       none\r
+// @return      u8              1=Measurement ongoing, 0=measurement off\r
+// *************************************************************************************************\r
+u8 is_altitude_measurement(void)\r
+{\r
+    return (sAlt.on);\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          do_altitude_measurement\r
+// @brief       Perform single altitude measurement\r
+// @param       u8 filter       Filter option\r
+// @return      none\r
+// *************************************************************************************************\r
+void do_altitude_measurement(u8 filter)\r
+{\r
+    volatile u32 pressure;\r
+\r
+    // If sensor is not ready, skip data read\r
+    if ((PS_INT_IN & PS_INT_PIN) == 0)\r
+        return;\r
+\r
+    // Get temperature (format is *10 K) from sensor\r
+    sAlt.temperature_K = ps_get_temp();\r
+    sAlt.temperature_C = sAlt.temperature_K - 2721 + sAlt.temperature_C_offset;\r
+\r
+    // Get pressure (format is 1Pa) from sensor\r
+    pressure = ps_get_pa();\r
+\r
+    // Store measured pressure value\r
+    if (filter == FILTER_OFF)\r
+    {\r
+        sAlt.pressure = pressure;\r
+    }\r
+    else\r
+    {\r
+        // Filter current pressure\r
+        pressure = (u32) ((pressure * 0.2) + (sAlt.pressure * 0.8));\r
+\r
+        // Store average pressure\r
+        sAlt.pressure = pressure;\r
+    }\r
+\r
+    // Convert pressure (Pa) and temperature ( K) to altitude (m)\r
+    sAlt.altitude = conv_pa_to_meter(sAlt.pressure, sAlt.temperature_K);\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          display_altitude\r
+// @brief       Display routine. Supports display in meters and feet.\r
+// @param       u8 line                 LINE1\r
+//                              u8 update               DISPLAY_LINE_UPDATE_FULL,\r
+// DISPLAY_LINE_UPDATE_PARTIAL, DISPLAY_LINE_CLEAR\r
+// @return      none\r
+// *************************************************************************************************\r
+void display_altitude(u8 line, u8 update)\r
+{\r
+    u8 *str;\r
+    s16 ft;\r
+\r
+    // Start measurement\r
+    start_altitude_measurement();\r
+\r
+    // redraw whole screen\r
+    if (update == DISPLAY_LINE_UPDATE_FULL)\r
+    {\r
+        if (sys.flag.use_metric_units)\r
+        {\r
+            // Display "m" symbol\r
+            display_symbol(LCD_UNIT_L1_M, SEG_ON);\r
+        }\r
+        else\r
+        {\r
+            // Display "ft" symbol\r
+            display_symbol(LCD_UNIT_L1_FT, SEG_ON);\r
+        }\r
+\r
+        // Display altitude\r
+        display_altitude(LINE1, DISPLAY_LINE_UPDATE_PARTIAL);\r
+    }\r
+    else if (update == DISPLAY_LINE_UPDATE_PARTIAL)\r
+    {\r
+        if (sys.flag.use_metric_units)\r
+        {\r
+            // Display altitude in xxxx m format, allow 3 leading blank digits\r
+            if (sAlt.altitude >= 0)\r
+            {\r
+                str = int_to_array(sAlt.altitude, 4, 3);\r
+                display_symbol(LCD_SYMB_ARROW_UP, SEG_ON);\r
+                display_symbol(LCD_SYMB_ARROW_DOWN, SEG_OFF);\r
+            }\r
+            else\r
+            {\r
+                str = int_to_array(sAlt.altitude * (-1), 4, 3);\r
+                display_symbol(LCD_SYMB_ARROW_UP, SEG_OFF);\r
+                display_symbol(LCD_SYMB_ARROW_DOWN, SEG_ON);\r
+            }\r
+        }\r
+        else\r
+        {\r
+            // Convert from meters to feet\r
+            ft = convert_m_to_ft(sAlt.altitude);\r
+\r
+            // Limit to 9999ft (3047m)\r
+            if (ft > 9999)\r
+                ft = 9999;\r
+\r
+            // Display altitude in xxxx ft format, allow 3 leading blank digits\r
+            if (ft >= 0)\r
+            {\r
+                str = int_to_array(ft, 4, 3);\r
+                display_symbol(LCD_SYMB_ARROW_UP, SEG_ON);\r
+                display_symbol(LCD_SYMB_ARROW_DOWN, SEG_OFF);\r
+            }\r
+            else\r
+            {\r
+                str = int_to_array(ft * (-1), 4, 3);\r
+                display_symbol(LCD_SYMB_ARROW_UP, SEG_OFF);\r
+                display_symbol(LCD_SYMB_ARROW_DOWN, SEG_ON);\r
+            }\r
+        }\r
+        display_chars(LCD_SEG_L1_3_0, str, SEG_ON);\r
+    }\r
+    else if (update == DISPLAY_LINE_CLEAR)\r
+    {\r
+        // Stop measurement\r
+        stop_altitude_measurement();\r
+\r
+        // Clean up function-specific segments before leaving function\r
+        display_symbol(LCD_UNIT_L1_M, SEG_OFF);\r
+        display_symbol(LCD_UNIT_L1_FT, SEG_OFF);\r
+        display_symbol(LCD_SYMB_ARROW_UP, SEG_OFF);\r
+        display_symbol(LCD_SYMB_ARROW_DOWN, SEG_OFF);\r
+    }\r
+}\r
+\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/logic/altitude.h b/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/logic/altitude.h
new file mode 100755 (executable)
index 0000000..f9550d8
--- /dev/null
@@ -0,0 +1,73 @@
+// *************************************************************************************************\r
+//\r
+//      Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//        Redistribution and use in source and binary forms, with or without\r
+//        modification, are permitted provided that the following conditions\r
+//        are met:\r
+//\r
+//          Redistributions of source code must retain the above copyright\r
+//          notice, this list of conditions and the following disclaimer.\r
+//\r
+//          Redistributions in binary form must reproduce the above copyright\r
+//          notice, this list of conditions and the following disclaimer in the\r
+//          documentation and/or other materials provided with the\r
+//          distribution.\r
+//\r
+//          Neither the name of Texas Instruments Incorporated nor the names of\r
+//          its contributors may be used to endorse or promote products derived\r
+//          from this software without specific prior written permission.\r
+//\r
+//        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+\r
+#ifndef ALTITUDE_H_\r
+#define ALTITUDE_H_\r
+\r
+// *************************************************************************************************\r
+// Include section\r
+\r
+// *************************************************************************************************\r
+// Prototypes section\r
+extern void reset_altitude_measurement(void);\r
+extern void start_altitude_measurement(void);\r
+extern void stop_altitude_measurement(void);\r
+extern u8 is_altitude_measurement(void);\r
+extern void do_altitude_measurement(u8 filter);\r
+\r
+// menu functions\r
+extern void display_altitude(u8 line, u8 update);\r
+\r
+// *************************************************************************************************\r
+// Defines section\r
+\r
+// *************************************************************************************************\r
+// Global Variable section\r
+struct alt\r
+{\r
+    u8 on;                      // 1 = Measurement started, 0 = measurement off\r
+    u32 pressure;               // Pressure (Pa)\r
+    u16 temperature_K;          // Temperature in K\r
+    s16 temperature_C;          // Temperature in ºC\r
+    s16 temperature_C_offset;   // Temperature ºC offset\r
+    s16 altitude;               // Altitude (m)\r
+    s16 altitude_offset;        // Altitude offset stored during calibration\r
+};\r
+extern struct alt sAlt;\r
+\r
+// *************************************************************************************************\r
+// Extern section\r
+\r
+#endif                          /*ALTITUDE_H_ */\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/logic/battery.c b/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/logic/battery.c
new file mode 100755 (executable)
index 0000000..d02a821
--- /dev/null
@@ -0,0 +1,135 @@
+// *************************************************************************************************\r
+//\r
+//      Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//        Redistribution and use in source and binary forms, with or without\r
+//        modification, are permitted provided that the following conditions\r
+//        are met:\r
+//\r
+//          Redistributions of source code must retain the above copyright\r
+//          notice, this list of conditions and the following disclaimer.\r
+//\r
+//          Redistributions in binary form must reproduce the above copyright\r
+//          notice, this list of conditions and the following disclaimer in the\r
+//          documentation and/or other materials provided with the\r
+//          distribution.\r
+//\r
+//          Neither the name of Texas Instruments Incorporated nor the names of\r
+//          its contributors may be used to endorse or promote products derived\r
+//          from this software without specific prior written permission.\r
+//\r
+//        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+// Battery voltage measurement functions.\r
+// *************************************************************************************************\r
+\r
+// *************************************************************************************************\r
+// Include section\r
+\r
+// system\r
+#include "project.h"\r
+\r
+// driver\r
+#include "display.h"\r
+#include "ports.h"\r
+#include "adc12.h"\r
+\r
+// logic\r
+#include "menu.h"\r
+#include "battery.h"\r
+\r
+// *************************************************************************************************\r
+// Prototypes section\r
+void reset_batt_measurement(void);\r
+void battery_measurement(void);\r
+\r
+// *************************************************************************************************\r
+// Defines section\r
+\r
+// *************************************************************************************************\r
+// Global Variable section\r
+struct batt sBatt;\r
+\r
+// *************************************************************************************************\r
+// Extern section\r
+\r
+// *************************************************************************************************\r
+// @fn          reset_batt_measurement\r
+// @brief       Reset battery measurement module.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void reset_batt_measurement(void)\r
+{\r
+    // Reset lobatt display counter\r
+    sBatt.lobatt_display = BATTERY_LOW_MESSAGE_CYCLE;\r
+\r
+    // Start with battery voltage of 3.00V\r
+    sBatt.voltage = 300;\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          battery_measurement\r
+// @brief       Init ADC12. Do single conversion of AVCC voltage. Turn off ADC12.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void battery_measurement(void)\r
+{\r
+    u16 voltage;\r
+\r
+    // Convert external battery voltage (ADC12INCH_11=AVCC-AVSS/2)\r
+    voltage = adc12_single_conversion(REFVSEL_1, ADC12SHT0_10, ADC12INCH_11);\r
+\r
+    // Convert ADC value to "x.xx V"\r
+    // Ideally we have A11=0->AVCC=0V ... A11=4095(2^12-1)->AVCC=4V\r
+    // --> (A11/4095)*4V=AVCC --> AVCC=(A11*4)/4095\r
+    voltage = (voltage * 2 * 2) / 41;\r
+\r
+    // Correct measured voltage with calibration value\r
+    voltage += sBatt.offset;\r
+\r
+    // Discard values that are clearly outside the measurement range\r
+    if (voltage > BATTERY_HIGH_THRESHOLD)\r
+    {\r
+        voltage = sBatt.voltage;\r
+    }\r
+\r
+    // Filter battery voltage\r
+    sBatt.voltage = ((voltage * 2) + (sBatt.voltage * 8)) / 10;\r
+\r
+    // If battery voltage falls below low battery threshold, set system flag and modify LINE2\r
+    // display function pointer\r
+    if (sBatt.voltage < BATTERY_LOW_THRESHOLD)\r
+    {\r
+        sys.flag.low_battery = 1;\r
+\r
+        // Set sticky battery icon\r
+        display_symbol(LCD_SYMB_BATTERY, SEG_ON);\r
+    }\r
+    else\r
+    {\r
+        sys.flag.low_battery = 0;\r
+\r
+        // Clear sticky battery icon\r
+        display_symbol(LCD_SYMB_BATTERY, SEG_OFF);\r
+    }\r
+    // Update LINE2\r
+    display.flag.line2_full_update = 1;\r
+\r
+    // Indicate to display function that new value is available\r
+    display.flag.update_battery_voltage = 1;\r
+}\r
+\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/logic/battery.h b/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/logic/battery.h
new file mode 100755 (executable)
index 0000000..ade8b8e
--- /dev/null
@@ -0,0 +1,79 @@
+// *************************************************************************************************\r
+//\r
+//      Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//        Redistribution and use in source and binary forms, with or without\r
+//        modification, are permitted provided that the following conditions\r
+//        are met:\r
+//\r
+//          Redistributions of source code must retain the above copyright\r
+//          notice, this list of conditions and the following disclaimer.\r
+//\r
+//          Redistributions in binary form must reproduce the above copyright\r
+//          notice, this list of conditions and the following disclaimer in the\r
+//          documentation and/or other materials provided with the\r
+//          distribution.\r
+//\r
+//          Neither the name of Texas Instruments Incorporated nor the names of\r
+//          its contributors may be used to endorse or promote products derived\r
+//          from this software without specific prior written permission.\r
+//\r
+//        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+\r
+#ifndef BATTERY_H_\r
+#define BATTERY_H_\r
+\r
+// *************************************************************************************************\r
+// Include section\r
+\r
+// *************************************************************************************************\r
+// Prototypes section\r
+\r
+// Internal functions\r
+extern void reset_batt_measurement(void);\r
+extern void battery_measurement(void);\r
+\r
+// *************************************************************************************************\r
+// Defines section\r
+\r
+// Battery high voltage threshold\r
+#define BATTERY_HIGH_THRESHOLD                  (360u)\r
+\r
+// Battery end of life voltage threshold -> disable radio, show "lobatt" message\r
+#define BATTERY_LOW_THRESHOLD                   (240u)\r
+\r
+// Show "lobatt" message every n seconds\r
+#define BATTERY_LOW_MESSAGE_CYCLE               (15u)\r
+\r
+// *************************************************************************************************\r
+// Global Variable section\r
+struct batt\r
+{\r
+    // Counter for alternating "lobatt" display\r
+    u8 lobatt_display;\r
+\r
+    // Battery voltage\r
+    u16 voltage;\r
+\r
+    // Battery voltage offset\r
+    s16 offset;\r
+};\r
+extern struct batt sBatt;\r
+\r
+// *************************************************************************************************\r
+// Extern section\r
+\r
+#endif                          /*BATTERY_H_ */\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/logic/bluerobin.c b/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/logic/bluerobin.c
new file mode 100755 (executable)
index 0000000..f4460ef
--- /dev/null
@@ -0,0 +1,396 @@
+// *************************************************************************************************\r
+//\r
+//      Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//        Redistribution and use in source and binary forms, with or without\r
+//        modification, are permitted provided that the following conditions\r
+//        are met:\r
+//\r
+//          Redistributions of source code must retain the above copyright\r
+//          notice, this list of conditions and the following disclaimer.\r
+//\r
+//          Redistributions in binary form must reproduce the above copyright\r
+//          notice, this list of conditions and the following disclaimer in the\r
+//          documentation and/or other materials provided with the\r
+//          distribution.\r
+//\r
+//          Neither the name of Texas Instruments Incorporated nor the names of\r
+//          its contributors may be used to endorse or promote products derived\r
+//          from this software without specific prior written permission.\r
+//\r
+//        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+// BlueRobin functions.\r
+// *************************************************************************************************\r
+\r
+// *************************************************************************************************\r
+// Include section\r
+\r
+// system\r
+#include "project.h"\r
+\r
+// driver\r
+#include "display.h"\r
+#include "radio.h"\r
+#include "ports.h"\r
+#include "timer.h"\r
+#include "rf1a.h"\r
+\r
+// logic\r
+#include "BlueRobin_RX_API.h"\r
+#include "bluerobin.h"\r
+#include "rfsimpliciti.h"\r
+#include "user.h"\r
+\r
+// *************************************************************************************************\r
+// Prototypes section\r
+\r
+// *************************************************************************************************\r
+// Defines section\r
+\r
+// Set to TRUE if transmitter ID should be remembered when reconnecting\r
+// Transmitter ID can be cleared by pressing button STAR for more than 3 seconds\r
+#define REMEMBER_TX_ID                  (FALSE)\r
+\r
+// *************************************************************************************************\r
+// Global Variable section\r
+struct bluerobin sBlueRobin;\r
+\r
+// *************************************************************************************************\r
+// Extern section\r
+\r
+// Stop BlueRobin timer\r
+extern void BRRX__StopTimer_v(void);\r
+\r
+// Calibration value for FSCTRL0 register (corrects deviation of 26MHz crystal)\r
+extern u8 rf_frequoffset;\r
+\r
+// *************************************************************************************************\r
+// @fn          reset_bluerobin\r
+// @brief       Reset BlueRobin data.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void reset_bluerobin(void)\r
+{\r
+    // Reset state is no connection\r
+    sBlueRobin.state = BLUEROBIN_OFF;\r
+\r
+    // Reset value of chest strap ID is 0 --> connect to next best chest strap\r
+    sBlueRobin.cs_id = 0;\r
+\r
+    // No new data available\r
+    sBlueRobin.update = BLUEROBIN_NO_UPDATE;\r
+    sBlueRobin.heartrate = 0;\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          mx_rfblue\r
+// @brief       BlueRobin sub menu. Button STAR resets chest strap ID to 0.\r
+// @param       u8 line LINE2\r
+// @return      none\r
+// *************************************************************************************************\r
+void mx_bluerobin(u8 line)\r
+{\r
+#if REMEMBER_TX_ID == TRUE\r
+    u8 i;\r
+\r
+    // Reset chest strap ID\r
+    sBlueRobin.cs_id = 0;\r
+\r
+    display_chars(LCD_SEG_L1_2_0, (u8 *) "CLR", SEG_ON);\r
+    for (i = 0; i < 4; i++)\r
+        Timer0_A4_Delay(CONV_MS_TO_TICKS(500));\r
+#endif\r
+\r
+    // Clear simulated button event\r
+    button.all_flags = 0;\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          sx_bluerobin\r
+// @brief       BlueRobin direct function. Button UP connects/disconnects with transmitter unit.\r
+// @param       u8 line         LINE1\r
+// @return      none\r
+// *************************************************************************************************\r
+void sx_bluerobin(u8 line)\r
+{\r
+    u8 stop = 0;\r
+\r
+    // Exit if battery voltage is too low for radio operation\r
+    if (sys.flag.low_battery)\r
+        return;\r
+\r
+    // Exit if SimpliciTI stack is active\r
+    if (is_rf())\r
+        return;\r
+\r
+    // UP: connect / disconnect transmitter\r
+    if (button.flag.up)\r
+    {\r
+        if (sBlueRobin.state == BLUEROBIN_OFF)\r
+        {\r
+            // If no transmitter can be found, stop BlueRobin stack\r
+            if (!start_bluerobin())\r
+                stop = 1;\r
+        }\r
+        else if (sBlueRobin.state == BLUEROBIN_CONNECTED)\r
+        {\r
+            // Shutdown connection\r
+            stop = 1;\r
+        }\r
+    }\r
+\r
+    // Shutdown connection\r
+    if (stop)\r
+    {\r
+        stop_bluerobin();\r
+    }\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          display_heartrate\r
+// @brief       Heart rate display routine.\r
+// @param       u8 line         LINE1\r
+//                              u8 update       DISPLAY_LINE_UPDATE_FULL,\r
+// DISPLAY_LINE_UPDATE_PARTIAL, DISPLAY_LINE_CLEAR\r
+// @return      none\r
+// *************************************************************************************************\r
+void display_heartrate(u8 line, u8 update)\r
+{\r
+    u8 *str;\r
+\r
+    if (update != DISPLAY_LINE_CLEAR)\r
+    {\r
+        if (is_bluerobin())\r
+        {\r
+            str = int_to_array(sBlueRobin.heartrate, 3, 2);\r
+            display_chars(LCD_SEG_L1_2_0, str, SEG_ON);\r
+        }\r
+        else\r
+        {\r
+            display_chars(LCD_SEG_L1_2_0, (u8 *) "---", SEG_ON);\r
+        }\r
+    }\r
+\r
+    // Redraw whole screen\r
+    if (!is_bluerobin())\r
+    {\r
+        if (update == DISPLAY_LINE_UPDATE_FULL)\r
+        {\r
+            display_symbol(LCD_ICON_HEART, SEG_ON);\r
+        }\r
+        else if (update == DISPLAY_LINE_CLEAR)\r
+        {\r
+            // Clear heart when not connected\r
+            display_symbol(LCD_ICON_HEART, SEG_OFF);\r
+        }\r
+    }\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          is_bluerobin\r
+// @brief       Returns TRUE if BlueRobin transmitter is connected.\r
+// @param       none\r
+// @return      u8\r
+// *************************************************************************************************\r
+u8 is_bluerobin(void)\r
+{\r
+    return (sBlueRobin.state == BLUEROBIN_CONNECTED);\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          is_bluerobin_searching\r
+// @brief       Returns TRUE if BlueRobin is searching for a transmitter.\r
+// @param       none\r
+// @return      u8                      1 if it is trying to connect\r
+// *************************************************************************************************\r
+u8 is_bluerobin_searching(void)\r
+{\r
+    return (sBlueRobin.state == BLUEROBIN_SEARCHING);\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          get_bluerobin_data\r
+// @brief       Read BlueRobin packet data from API.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void get_bluerobin_data(void)\r
+{\r
+    brtx_state_t bChannelState;\r
+\r
+    // Check connection status\r
+    bChannelState = BRRX_GetState_t(HR_CHANNEL);\r
+\r
+    switch (bChannelState)\r
+    {\r
+        case TX_ACTIVE:        // Read heart rate data from BlueRobin API\r
+            sBlueRobin.heartrate = BRRX_GetHeartRate_u8();\r
+            sBlueRobin.update = BLUEROBIN_NEW_DATA;\r
+            break;\r
+\r
+        case TX_OFF:           // Shutdown connection\r
+            stop_bluerobin();\r
+            break;\r
+\r
+        // BR_SEARCH, BR_LEARN, BR_PAUSE: Keep old values until we receive new data\r
+        default:\r
+            break;\r
+    }\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          start_bluerobin\r
+// @brief       Start BlueRobin stack and search for a transmitter.\r
+// @param       none\r
+// @return      0 = no transmitter found, 1 = connected to a transmitter\r
+// *************************************************************************************************\r
+u8 start_bluerobin(void)\r
+{\r
+    u8 timeout, i;\r
+\r
+    // Init BlueRobin timer and radio\r
+    // Enable high current mode\r
+    open_radio();\r
+\r
+    // Initialize BR library\r
+    BRRX_Init_v();\r
+\r
+    // Set BR data transmission properties\r
+    BRRX_SetPowerdownDelay_v(10); // Power down channel after 10 consecutive lost data packets (~9\r
+                                  // seconds)\r
+    BRRX_SetSearchTimeout_v(6);   // Stop searching after 8 seconds\r
+\r
+    // Sensitivity in learn mode reduced --> connect only to close transmitters\r
+    // Skip this part if chest strap id was set in a previous learn mode run\r
+#if REMEMBER_TX_ID == TRUE\r
+    if (sBlueRobin.cs_id == 0)\r
+        BRRX_SetSignalLevelReduction_v(5);\r
+#else\r
+    // Forget previously learned transmitter ID and connect to next close transmitter\r
+    sBlueRobin.cs_id = 0;\r
+    BRRX_SetSignalLevelReduction_v(5);\r
+#endif\r
+\r
+    // Apply frequency offset compensation to radio register FSCTRL0\r
+    // If calibration memory was erased, rf_frequoffset defaults to 0x00 and has no effect\r
+    WriteSingleReg(FSCTRL0, rf_frequoffset);\r
+\r
+    // New state is SEARCH\r
+    sBlueRobin.state = BLUEROBIN_SEARCHING;\r
+\r
+    // Blink RF icon to show searching\r
+    display_symbol(LCD_ICON_BEEPER1, SEG_ON_BLINK_ON);\r
+    display_symbol(LCD_ICON_BEEPER2, SEG_ON_BLINK_ON);\r
+    display_symbol(LCD_ICON_BEEPER3, SEG_ON_BLINK_ON);\r
+\r
+    // Turn on radio and establish connection if channel not already started\r
+    if (BRRX_GetState_t(HR_CHANNEL) == TX_OFF)\r
+    {\r
+        // Start in learn mode (connect to closest heart rate transmitter)\r
+        BRRX_SetID_v(HR_CHANNEL, sBlueRobin.cs_id);\r
+        BRRX_Start_v(HR_CHANNEL);\r
+\r
+        // Wait until learning phase is over, additional timeout prevents race condition if hardware\r
+        // works incorrect\r
+        timeout = 40;\r
+        while ((BRRX_GetState_t(HR_CHANNEL) == TX_SEARCH) && (timeout-- > 0))\r
+        {\r
+            Timer0_A4_Delay(CONV_MS_TO_TICKS(200));\r
+        }\r
+\r
+        // Timeout?\r
+        if (timeout == 0)\r
+        {\r
+            display_chars(LCD_SEG_L1_3_0, (u8 *) "FAIL", SEG_ON);\r
+            for (i = 0; i < 4; i++)\r
+                Timer0_A4_Delay(CONV_MS_TO_TICKS(500));\r
+        }\r
+    }\r
+\r
+    // Check if connection attempt was successful\r
+    if (BRRX_GetState_t(HR_CHANNEL) == TX_ACTIVE)\r
+    {\r
+        // Successfully connected to transmitter\r
+        sBlueRobin.state = BLUEROBIN_CONNECTED;\r
+\r
+        // When in learn mode, copy chest strap ID\r
+        if (sBlueRobin.cs_id == 0)\r
+            sBlueRobin.cs_id = BRRX_GetID_u32(HR_CHANNEL);\r
+\r
+        // Show steady RF icon to indicate established connection\r
+        display_symbol(LCD_ICON_BEEPER1, SEG_ON_BLINK_OFF);\r
+        display_symbol(LCD_ICON_BEEPER2, SEG_ON_BLINK_OFF);\r
+        display_symbol(LCD_ICON_BEEPER3, SEG_ON_BLINK_OFF);\r
+\r
+        // Show blinking icon\r
+        display_symbol(LCD_ICON_HEART, SEG_ON_BLINK_ON);\r
+\r
+        return (1);\r
+    }\r
+    else                        // Error -> Shutdown connection\r
+    {\r
+        // Clear RF icon\r
+        display_symbol(LCD_ICON_BEEPER1, SEG_OFF_BLINK_OFF);\r
+        display_symbol(LCD_ICON_BEEPER2, SEG_OFF_BLINK_OFF);\r
+        display_symbol(LCD_ICON_BEEPER3, SEG_OFF_BLINK_OFF);\r
+\r
+        return (0);\r
+    }\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          stop_bluerobin\r
+// @brief       Stop communication and put peripherals in power-down mode.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void stop_bluerobin(void)\r
+{\r
+    // Reset connection status byte\r
+    sBlueRobin.state = BLUEROBIN_OFF;\r
+\r
+    // Stop channel\r
+    BRRX_Stop_v(HR_CHANNEL);\r
+\r
+    // Powerdown radio\r
+    close_radio();\r
+\r
+    // Force full display update to clear heart rate and speed data\r
+    sBlueRobin.heartrate = 0;\r
+    display.flag.full_update = 1;\r
+\r
+    // Clear heart and RF symbol\r
+    display_symbol(LCD_ICON_HEART, SEG_OFF_BLINK_OFF);\r
+    display_symbol(LCD_ICON_BEEPER1, SEG_OFF_BLINK_OFF);\r
+    display_symbol(LCD_ICON_BEEPER2, SEG_OFF_BLINK_OFF);\r
+    display_symbol(LCD_ICON_BEEPER3, SEG_OFF_BLINK_OFF);\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          bluerobin_flash_write_window\r
+// @brief       Returns 1 if next BlueRobin ISR is more than 15msec away.\r
+// @param       none\r
+// @return      u8\r
+// *************************************************************************************************\r
+u8 is_bluerobin_flash_write_window(void)\r
+{\r
+    if (is_bluerobin())\r
+        return ((TA0CCR1 - TA0R) > 500);\r
+    else\r
+        return (1);\r
+}\r
+\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/logic/bluerobin.h b/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/logic/bluerobin.h
new file mode 100755 (executable)
index 0000000..7127c04
--- /dev/null
@@ -0,0 +1,90 @@
+// *************************************************************************************************\r
+//\r
+//      Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//        Redistribution and use in source and binary forms, with or without\r
+//        modification, are permitted provided that the following conditions\r
+//        are met:\r
+//\r
+//          Redistributions of source code must retain the above copyright\r
+//          notice, this list of conditions and the following disclaimer.\r
+//\r
+//          Redistributions in binary form must reproduce the above copyright\r
+//          notice, this list of conditions and the following disclaimer in the\r
+//          documentation and/or other materials provided with the\r
+//          distribution.\r
+//\r
+//          Neither the name of Texas Instruments Incorporated nor the names of\r
+//          its contributors may be used to endorse or promote products derived\r
+//          from this software without specific prior written permission.\r
+//\r
+//        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+\r
+#ifndef BLUEROBIN_H_\r
+#define BLUEROBIN_H_\r
+\r
+// *************************************************************************************************\r
+// Include section\r
+#include <project.h>\r
+\r
+// *************************************************************************************************\r
+// Prototypes section\r
+extern void reset_bluerobin(void);\r
+extern void mx_bluerobin(u8 line);\r
+extern void sx_bluerobin(u8 line);\r
+extern void display_heartrate(u8 line, u8 update);\r
+extern u8 is_bluerobin(void);\r
+extern u8 is_bluerobin_searching(void);\r
+extern void get_bluerobin_data(void);\r
+extern u8 start_bluerobin(void);\r
+extern void stop_bluerobin(void);\r
+extern u8 is_bluerobin_flash_write_window(void);\r
+\r
+// *************************************************************************************************\r
+// Defines section\r
+\r
+// BlueRobin connection states\r
+typedef enum\r
+{\r
+    BLUEROBIN_OFF = 0,          // Not connected\r
+    BLUEROBIN_SEARCHING,        // Searching for transmitter\r
+    BLUEROBIN_CONNECTED,        // Connected\r
+    BLUEROBIN_ERROR             // Error occurred while trying to connect or while connected\r
+} BlueRobin_state_t;\r
+\r
+// BlueRobin data update states\r
+typedef enum\r
+{\r
+    BLUEROBIN_NO_UPDATE = 0,    // No new data available\r
+    BLUEROBIN_NEW_DATA          // New data arrived\r
+} BlueRobin_update_t;\r
+\r
+// *************************************************************************************************\r
+// Global Variable section\r
+struct bluerobin\r
+{\r
+    BlueRobin_state_t state;    // BLUEROBIN_OFF, BLUEROBIN_SEARCHING, BLUEROBIN_CONNECTED,\r
+                                // BLUEROBIN_ERROR\r
+    BlueRobin_update_t update;  // BLUEROBIN_NO_UPDATE, BLUEROBIN_NEW_DATA\r
+    u32 cs_id;                  // BLUEROBIN_NO_UPDATE, BLUEROBIN_NEW_DATA\r
+    u8 heartrate;               // Heart rate (1 bpm)\r
+};\r
+extern struct bluerobin sBlueRobin;\r
+\r
+// *************************************************************************************************\r
+// Extern section\r
+\r
+#endif                          /*BLUEROBIN_H_ */\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/logic/clock.c b/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/logic/clock.c
new file mode 100755 (executable)
index 0000000..bc44675
--- /dev/null
@@ -0,0 +1,292 @@
+// *************************************************************************************************\r
+//\r
+//      Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//        Redistribution and use in source and binary forms, with or without\r
+//        modification, are permitted provided that the following conditions\r
+//        are met:\r
+//\r
+//          Redistributions of source code must retain the above copyright\r
+//          notice, this list of conditions and the following disclaimer.\r
+//\r
+//          Redistributions in binary form must reproduce the above copyright\r
+//          notice, this list of conditions and the following disclaimer in the\r
+//          documentation and/or other materials provided with the\r
+//          distribution.\r
+//\r
+//          Neither the name of Texas Instruments Incorporated nor the names of\r
+//          its contributors may be used to endorse or promote products derived\r
+//          from this software without specific prior written permission.\r
+//\r
+//        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+// Time functions.\r
+// *************************************************************************************************\r
+\r
+// *************************************************************************************************\r
+// Include section\r
+\r
+// system\r
+#include "project.h"\r
+\r
+// driver\r
+#include "ports.h"\r
+#include "display.h"\r
+#include "timer.h"\r
+\r
+// logic\r
+#include "menu.h"\r
+#include "clock.h"\r
+#include "user.h"\r
+#include "bluerobin.h"\r
+#include "date.h"\r
+\r
+// *************************************************************************************************\r
+// Prototypes section\r
+void reset_clock(void);\r
+void clock_tick(void);\r
+void mx_time(u8 line);\r
+void sx_time(u8 line);\r
+\r
+void calc_24H_to_12H(u8 * hours, u8 * timeAM);\r
+void conv_24H_to_12H(u8 * hours24, u8 * hours12, u8 * timeAMorPM);\r
+\r
+// *************************************************************************************************\r
+// Defines section\r
+\r
+// *************************************************************************************************\r
+// Global Variable section\r
+struct time sTime;\r
+\r
+// *************************************************************************************************\r
+// Extern section\r
+\r
+// *************************************************************************************************\r
+// @fn          reset_clock\r
+// @brief       Resets clock time to 00:00:00, 24H time format.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void reset_clock(void)\r
+{\r
+    // Set global system time to 0\r
+    sTime.system_time = 0;\r
+\r
+    // Set main 24H time to start value\r
+    sTime.hour = 4;\r
+    sTime.minute = 30;\r
+    sTime.second = 0;\r
+\r
+    // Display style of both lines is default (HH:MM)\r
+    sTime.line1ViewStyle = DISPLAY_DEFAULT_VIEW;\r
+\r
+    // Reset timeout detection\r
+    sTime.last_activity = 0;\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          clock_tick\r
+// @brief       Add 1 second to system time and to display time\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void clock_tick(void)\r
+{\r
+    // Use sTime.drawFlag to minimize display updates\r
+    // sTime.drawFlag = 1: second\r
+    // sTime.drawFlag = 2: minute, second\r
+    // sTime.drawFlag = 3: hour, minute\r
+    sTime.drawFlag = 1;\r
+\r
+    // Increase global system time\r
+    sTime.system_time++;\r
+\r
+    // Add 1 second\r
+    sTime.second++;\r
+\r
+    // Add 1 minute\r
+    if (sTime.second == 60)\r
+    {\r
+        sTime.second = 0;\r
+        sTime.minute++;\r
+        sTime.drawFlag++;\r
+\r
+        // Add 1 hour\r
+        if (sTime.minute == 60)\r
+        {\r
+            sTime.minute = 0;\r
+            sTime.hour++;\r
+            sTime.drawFlag++;\r
+\r
+            // Add 1 day\r
+            if (sTime.hour == 24)\r
+            {\r
+                sTime.hour = 0;\r
+                add_day();\r
+            }\r
+        }\r
+    }\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          convert_hour_to_12H_format\r
+// @brief       Convert internal 24H time to 12H time.\r
+// @param       u8 hour         Hour in 24H format\r
+// @return      u8                      Hour in 12H format\r
+// *************************************************************************************************\r
+u8 convert_hour_to_12H_format(u8 hour)\r
+{\r
+    // 00:00 .. 11:59 --> AM 12:00 .. 11:59\r
+    if (hour == 0)\r
+        return (hour + 12);\r
+    else if (hour <= 12)\r
+        return (hour);\r
+    // 13:00 .. 23:59 --> PM 01:00 .. 11:59\r
+    else\r
+        return (hour - 12);\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          is_hour_am\r
+// @brief       Checks if internal 24H time is AM or PM\r
+// @param       u8 hour         Hour in 24H format\r
+// @return      u8                      1 = AM, 0 = PM\r
+// *************************************************************************************************\r
+u8 is_hour_am(u8 hour)\r
+{\r
+    // 00:00 .. 11:59 --> AM 12:00 .. 11:59\r
+    if (hour < 12)\r
+        return (1);\r
+    // 12:00 .. 23:59 --> PM 12:00 .. 11:59\r
+    else\r
+        return (0);\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          sx_time\r
+// @brief       Time user routine. Toggles view style between HH:MM and SS.\r
+// @param       line            LINE1\r
+// @return      none\r
+// *************************************************************************************************\r
+void sx_time(u8 line)\r
+{\r
+    // Toggle display view style\r
+    if (sTime.line1ViewStyle == DISPLAY_DEFAULT_VIEW)\r
+        sTime.line1ViewStyle = DISPLAY_ALTERNATIVE_VIEW;\r
+    else\r
+        sTime.line1ViewStyle = DISPLAY_DEFAULT_VIEW;\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          display_time\r
+// @brief       Clock display routine. Supports 24H and 12H time format.\r
+// @param       u8 line                 LINE1\r
+//                              u8 update               DISPLAY_LINE_UPDATE_FULL,\r
+// DISPLAY_LINE_UPDATE_PARTIAL\r
+// @return      none\r
+// *************************************************************************************************\r
+void display_time(u8 line, u8 update)\r
+{\r
+    u8 hour12;\r
+\r
+    // Partial update\r
+    if (update == DISPLAY_LINE_UPDATE_PARTIAL)\r
+    {\r
+        if (sTime.drawFlag != 0)\r
+        {\r
+            if (sTime.line1ViewStyle == DISPLAY_DEFAULT_VIEW)\r
+            {\r
+                switch (sTime.drawFlag)\r
+                {\r
+                    case 3:\r
+                        if (sys.flag.use_metric_units)\r
+                        {\r
+                            // Display 24H time "HH"\r
+                            display_chars(switch_seg(line, LCD_SEG_L1_3_2,\r
+                                                     LCD_SEG_L2_3_2), int_to_array(sTime.hour, 2,\r
+                                                                                   0), SEG_ON);\r
+                        }\r
+                        else\r
+                        {\r
+                            // Display 12H time "HH" + AM/PM\r
+                            hour12 = convert_hour_to_12H_format(sTime.hour);\r
+                            display_chars(switch_seg(line, LCD_SEG_L1_3_2,\r
+                                                     LCD_SEG_L2_3_2), int_to_array(hour12, 2,\r
+                                                                                   0), SEG_ON);\r
+                            display_am_pm_symbol(sTime.hour);\r
+                        }\r
+\r
+                    case 2:\r
+                        display_chars(switch_seg(line, LCD_SEG_L1_1_0,\r
+                                                 LCD_SEG_L2_1_0), int_to_array(sTime.minute, 2,\r
+                                                                               0), SEG_ON);\r
+                }\r
+            }\r
+            else\r
+            {\r
+                // Seconds are always updated\r
+                display_chars(switch_seg(line, LCD_SEG_L1_1_0,\r
+                                         LCD_SEG_L2_1_0), int_to_array(sTime.second, 2, 0), SEG_ON);\r
+            }\r
+        }\r
+    }\r
+    else if (update == DISPLAY_LINE_UPDATE_FULL)\r
+    {\r
+        // Full update\r
+        if (sTime.line1ViewStyle == DISPLAY_DEFAULT_VIEW)\r
+        {\r
+            // Display 24H/12H time\r
+            if (sys.flag.use_metric_units)\r
+            {\r
+                // Display 24H time "HH"\r
+                display_chars(switch_seg(line, LCD_SEG_L1_3_2,\r
+                                         LCD_SEG_L2_3_2), int_to_array(sTime.hour, 2, 0), SEG_ON);\r
+            }\r
+            else\r
+            {\r
+                // Display 12H time "HH" + AM/PM information\r
+                hour12 = convert_hour_to_12H_format(sTime.hour);\r
+                display_chars(switch_seg(line, LCD_SEG_L1_3_2,\r
+                                         LCD_SEG_L2_3_2), int_to_array(hour12, 2, 0), SEG_ON);\r
+                // Display AM/PM information\r
+                if (line == LINE1)\r
+                {\r
+                    display_am_pm_symbol(sTime.hour);\r
+                }\r
+            }\r
+\r
+            // Display minute\r
+            display_chars(switch_seg(line, LCD_SEG_L1_1_0,\r
+                                     LCD_SEG_L2_1_0), int_to_array(sTime.minute, 2, 0), SEG_ON);\r
+            display_symbol(switch_seg(line, LCD_SEG_L1_COL, LCD_SEG_L2_COL0), SEG_ON_BLINK_ON);\r
+        }\r
+        else\r
+        {\r
+            // Display seconds\r
+            display_chars(switch_seg(line, LCD_SEG_L1_1_0,\r
+                                     LCD_SEG_L2_1_0), int_to_array(sTime.second, 2, 0), SEG_ON);\r
+            display_symbol(switch_seg(line, LCD_SEG_L1_DP1, LCD_SEG_L2_DP), SEG_ON);\r
+        }\r
+    }\r
+    else if (update == DISPLAY_LINE_CLEAR)\r
+    {\r
+        display_symbol(switch_seg(line, LCD_SEG_L1_COL, LCD_SEG_L2_COL0), SEG_OFF_BLINK_OFF);\r
+        // Change display style to default (HH:MM)\r
+        sTime.line1ViewStyle = DISPLAY_DEFAULT_VIEW;\r
+        // Clean up AM/PM icon\r
+        display_symbol(LCD_SYMB_AM, SEG_OFF);\r
+    }\r
+}\r
+\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/logic/clock.h b/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/logic/clock.h
new file mode 100755 (executable)
index 0000000..a4ad480
--- /dev/null
@@ -0,0 +1,74 @@
+// *************************************************************************************************\r
+//\r
+//      Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//        Redistribution and use in source and binary forms, with or without\r
+//        modification, are permitted provided that the following conditions\r
+//        are met:\r
+//\r
+//          Redistributions of source code must retain the above copyright\r
+//          notice, this list of conditions and the following disclaimer.\r
+//\r
+//          Redistributions in binary form must reproduce the above copyright\r
+//          notice, this list of conditions and the following disclaimer in the\r
+//          documentation and/or other materials provided with the\r
+//          distribution.\r
+//\r
+//          Neither the name of Texas Instruments Incorporated nor the names of\r
+//          its contributors may be used to endorse or promote products derived\r
+//          from this software without specific prior written permission.\r
+//\r
+//        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+\r
+#ifndef CLOCK_H_\r
+#define CLOCK_H_\r
+\r
+// *************************************************************************************************\r
+// Defines section\r
+\r
+// Definitions for time format\r
+#define TIMEFORMAT_24H                  (0u)\r
+#define TIMEFORMAT_12H                  (1u)\r
+\r
+// *************************************************************************************************\r
+// Prototypes section\r
+extern void reset_clock(void);\r
+extern void sx_time(u8 line);\r
+extern void mx_time(u8 line);\r
+extern void clock_tick(void);\r
+extern void display_selection_Timeformat1(u8 segments, u32 index, u8 digits, u8 blanks);\r
+extern void display_time(u8 line, u8 update);\r
+\r
+// English units support\r
+extern void calc_24H_to_12H(u8 * hours, u8 * timeAM);\r
+extern u8 convert_hour_to_12H_format(u8 hour);\r
+extern u8 is_hour_am(u8 hour);\r
+\r
+// *************************************************************************************************\r
+// Global Variable section\r
+struct time\r
+{\r
+    u32 system_time;            // Global system time. Used to calculate last activity\r
+    u32 last_activity;          // Inactivity detection (exits set_value() function)\r
+    u8 drawFlag;                // Flag to minimize display updates\r
+    u8 line1ViewStyle;          // Viewing style\r
+    u8 hour;                    // Time data\r
+    u8 minute;                  // Time data\r
+    u8 second;                  // Time data\r
+};\r
+extern struct time sTime;\r
+\r
+#endif                          /*CLOCK_H_ */\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/logic/datalog.c b/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/logic/datalog.c
new file mode 100755 (executable)
index 0000000..6bd327b
--- /dev/null
@@ -0,0 +1,465 @@
+// *************************************************************************************************\r
+//\r
+//      Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//        Redistribution and use in source and binary forms, with or without\r
+//        modification, are permitted provided that the following conditions\r
+//        are met:\r
+//\r
+//          Redistributions of source code must retain the above copyright\r
+//          notice, this list of conditions and the following disclaimer.\r
+//\r
+//          Redistributions in binary form must reproduce the above copyright\r
+//          notice, this list of conditions and the following disclaimer in the\r
+//          documentation and/or other materials provided with the\r
+//          distribution.\r
+//\r
+//          Neither the name of Texas Instruments Incorporated nor the names of\r
+//          its contributors may be used to endorse or promote products derived\r
+//          from this software without specific prior written permission.\r
+//\r
+//        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+// Data logger routines.\r
+// *************************************************************************************************\r
+\r
+// *************************************************************************************************\r
+// Include section\r
+\r
+// system\r
+#include "project.h"\r
+\r
+// driver\r
+#include "display.h"\r
+#include "flash.h"\r
+#include "ports.h"\r
+\r
+// logic\r
+#include "datalog.h"\r
+#include "date.h"\r
+#include "clock.h"\r
+#include "altitude.h"\r
+#include "temperature.h"\r
+#include "bluerobin.h"\r
+\r
+// *************************************************************************************************\r
+// Prototypes section\r
+void start_datalog(void);\r
+void stop_datalog(void);\r
+void datalog_sm(u8 * data, u8 len, u8 cmd);\r
+\r
+// *************************************************************************************************\r
+// Defines section\r
+\r
+// *************************************************************************************************\r
+// Global Variable section\r
+struct datalog sDatalog;\r
+\r
+// *************************************************************************************************\r
+// Extern section\r
+\r
+// *************************************************************************************************\r
+// @fn          reset_datalog\r
+// @brief       Reset data logger memory and init variables.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void reset_datalog(void)\r
+{\r
+    u8 i;\r
+\r
+    // Clear data logger memory\r
+    for (i = DATALOG_PAGE_START; i <= DATALOG_PAGE_END; i++)\r
+    {\r
+        flash_erase_page(i);\r
+    }\r
+\r
+    sDatalog.flags.all = 0;\r
+    sDatalog.mode = DATALOG_MODE_TEMPERATURE + DATALOG_MODE_ALTITUDE;\r
+    sDatalog.interval = DATALOG_INTERVAL;\r
+    sDatalog.delay = 0;\r
+    sDatalog.wptr = (u16 *) DATALOG_MEMORY_START;\r
+    sDatalog.idx = 0;\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          sx_alarm\r
+// @brief       Sx button turns alarm on/off.\r
+// @param       u8 line         LINE1\r
+// @return      none\r
+// *************************************************************************************************\r
+void sx_datalog(u8 line)\r
+{\r
+    // Turn off the backlight\r
+    P2OUT &= ~BUTTON_BACKLIGHT_PIN;\r
+    P2DIR &= ~BUTTON_BACKLIGHT_PIN;\r
+\r
+    // Toggle data logger state\r
+    if (!sDatalog.flags.flag.on)\r
+    {\r
+        if (!sDatalog.flags.flag.memory_full)\r
+        {\r
+            // Turn on data logger\r
+            start_datalog();\r
+        }\r
+        else                    // Memory full\r
+        {\r
+            // Show "nomem" message\r
+            message.flag.prepare = 1;\r
+            message.flag.type_nomem = 1;\r
+        }\r
+    }\r
+    else\r
+    {\r
+        // Turn off data logger\r
+        stop_datalog();\r
+    }\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          start_datalog\r
+// @brief       Begin to log data.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void start_datalog(void)\r
+{\r
+    // Start BlueRobin RX\r
+    if ((sDatalog.mode & DATALOG_MODE_HEARTRATE) != 0)\r
+    {\r
+        // Keep existing connection\r
+        if (!is_bluerobin())\r
+        {\r
+            // Start BlueRobin\r
+            if (!start_bluerobin())\r
+            {\r
+                // No connection established? -> Close stack\r
+                stop_bluerobin();\r
+            }\r
+        }\r
+    }\r
+\r
+    // Start pressure measurement\r
+    if ((sDatalog.mode & (DATALOG_MODE_TEMPERATURE | DATALOG_MODE_ALTITUDE)) != 0)\r
+    {\r
+        // Start altitude measurement\r
+        start_altitude_measurement();\r
+    }\r
+\r
+    // Set datalogger icon\r
+    display_symbol(LCD_ICON_RECORD, SEG_ON_BLINK_OFF);\r
+\r
+    // Start data logging\r
+    datalog_sm(NULL, 0, DATALOG_CMD_START);\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          stop_datalog\r
+// @brief       Stop data logging.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void stop_datalog(void)\r
+{\r
+    if ((sDatalog.mode & DATALOG_MODE_HEARTRATE) != 0)\r
+    {\r
+        // Stop BlueRobin connection\r
+        if (is_bluerobin())\r
+            stop_bluerobin();\r
+    }\r
+\r
+    // Stop data logging and write out buffer\r
+    datalog_sm(NULL, 0, DATALOG_CMD_CLOSE);\r
+\r
+    if ((sDatalog.mode & (DATALOG_MODE_TEMPERATURE | DATALOG_MODE_ALTITUDE)) != 0)\r
+    {\r
+        // Stop altitude measurement\r
+        stop_altitude_measurement();\r
+    }\r
+\r
+    // Clear datalogger icon\r
+    display_symbol(LCD_ICON_RECORD, SEG_OFF_BLINK_OFF);\r
+}\r
+\r
+u8 is_datalog(void)\r
+{\r
+    return (sDatalog.flags.flag.on);\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          display_datalog\r
+// @brief       Display data logger information.\r
+// @param       u8 line LINE1, LINE2\r
+//                              u8 update       DISPLAY_LINE_UPDATE_FULL, DISPLAY_LINE_CLEAR\r
+// @return      none\r
+// *************************************************************************************************\r
+void display_datalog(u8 line, u8 update)\r
+{\r
+    if (update == DISPLAY_LINE_UPDATE_FULL)\r
+    {\r
+        display_chars(LCD_SEG_L2_4_0, (u8 *) " DLOG", SEG_ON);\r
+    }\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          do_datalog\r
+// @brief       Add data to data logging buffer. Called by second tick.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void do_datalog(void)\r
+{\r
+    u8 temp[4];\r
+    u8 count;\r
+\r
+    // If logging delay is over, add new data\r
+    if (--sDatalog.delay == 0)\r
+    {\r
+        // Store data when possible compressed (heartrate = 8 bits, temperature/altitude = min. 12\r
+        // bits)\r
+        if (sDatalog.mode == DATALOG_MODE_HEARTRATE)\r
+        {\r
+            temp[0] = sBlueRobin.heartrate;\r
+            count = 1;\r
+        }\r
+        else if (sDatalog.mode == DATALOG_MODE_TEMPERATURE)\r
+        {\r
+            temp[0] = (sAlt.temperature_C >> 8) & 0xFF;\r
+            temp[1] = sAlt.temperature_C & 0xFF;\r
+            count = 2;\r
+        }\r
+        else if (sDatalog.mode == DATALOG_MODE_ALTITUDE)\r
+        {\r
+            temp[0] = (sAlt.altitude >> 8) & 0xFF;\r
+            temp[1] = sAlt.altitude & 0xFF;\r
+            count = 2;\r
+        }\r
+        else if (sDatalog.mode ==\r
+                 (DATALOG_MODE_HEARTRATE | DATALOG_MODE_TEMPERATURE | DATALOG_MODE_ALTITUDE))\r
+        {\r
+            temp[0] = sBlueRobin.heartrate;\r
+            temp[1] = (sAlt.temperature_C >> 4) & 0xFF;\r
+            temp[2] = ((sAlt.temperature_C << 4) & 0xF0) | ((sAlt.altitude >> 8) & 0x0F);\r
+            temp[3] = sAlt.altitude & 0xFF;\r
+            count = 4;\r
+        }\r
+        else if (sDatalog.mode == (DATALOG_MODE_HEARTRATE | DATALOG_MODE_TEMPERATURE))\r
+        {\r
+            temp[0] = sBlueRobin.heartrate;\r
+            temp[1] = (sAlt.temperature_C >> 8) & 0xFF;\r
+            temp[2] = sAlt.temperature_C & 0xFF;\r
+            count = 3;\r
+        }\r
+        else if (sDatalog.mode == (DATALOG_MODE_HEARTRATE | DATALOG_MODE_ALTITUDE))\r
+        {\r
+            temp[0] = sBlueRobin.heartrate;\r
+            temp[1] = (sAlt.altitude >> 8) & 0xFF;\r
+            temp[2] = sAlt.altitude & 0xFF;\r
+            count = 3;\r
+        }\r
+        else if (sDatalog.mode == (DATALOG_MODE_TEMPERATURE | DATALOG_MODE_ALTITUDE))\r
+        {\r
+            temp[0] = (sAlt.temperature_C >> 4) & 0xFF;\r
+            temp[1] = ((sAlt.temperature_C << 4) & 0xF0) | ((sAlt.altitude >> 8) & 0x0F);\r
+            temp[2] = sAlt.altitude & 0xFF;\r
+            count = 3;\r
+        }\r
+\r
+        // Add data to recording buffer\r
+        datalog_sm((u8 *) &temp, count, DATALOG_CMD_ADD_DATA);\r
+\r
+        // Reset delay counter\r
+        sDatalog.delay = sDatalog.interval;\r
+\r
+        // Write to flash if buffer is over write threshold and no BlueRobin event is close\r
+        datalog_sm(NULL, 0, DATALOG_CMD_WRITE_DATA);\r
+    }\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          datalog_add_to_buffer\r
+// @brief       Add byte-data to data logging buffer\r
+// @param       u8 * data               Pointer to byte-data\r
+//                              u8 len                  Byte count\r
+// @return      none\r
+// *************************************************************************************************\r
+void datalog_add_to_buffer(u8 * data, u8 len)\r
+{\r
+    u8 i;\r
+\r
+    for (i = 0; i < len; i++)\r
+    {\r
+        // Copy values to buffer\r
+        if (sDatalog.idx < DATALOG_BUFFER_SIZE)\r
+        {\r
+            sDatalog.buffer[sDatalog.idx++] = *(data + i);\r
+        }\r
+    }\r
+}\r
+\r
+// *************************************************************************************************\r
+// Write buffer content to flash\r
+// *************************************************************************************************\r
+void datalog_write_buffer(void)\r
+{\r
+    u8 i = 0;\r
+    u16 data;\r
+    u8 eom = 0;\r
+    volatile u16 temp;\r
+\r
+    // Check if we cross end of memory threshold with this buffer write\r
+    if (sDatalog.wptr >= (u16 *) (DATALOG_MEMORY_END - 1 - sDatalog.idx))\r
+    {\r
+        // Correct index to only write to end of memory\r
+        // Leave 2 bytes for session end marker\r
+        temp = (u16) sDatalog.wptr;\r
+        sDatalog.idx = (u8) ((u16) DATALOG_MEMORY_END - 1 - temp);\r
+        eom = 1;\r
+    }\r
+\r
+    // Write buffer content to flash\r
+    while (i < sDatalog.idx - 1)\r
+    {\r
+        // Keep array order when writing to flash memory\r
+        data = sDatalog.buffer[i++];\r
+        data += (u16) (sDatalog.buffer[i++] << 8);\r
+\r
+        // Write 16-bit word to flash\r
+        flash_write(sDatalog.wptr++, data);\r
+    }\r
+\r
+    // Stop data logging and write session end marker\r
+    if (eom)\r
+    {\r
+        // Write end marker\r
+        flash_write((u16 *) (DATALOG_MEMORY_END - 1), 0xFFFE);\r
+        // Clear buffer index\r
+        sDatalog.idx = 0;\r
+        // Clear flags\r
+        sDatalog.flags.flag.on = 0;\r
+        sDatalog.flags.flag.memory_full = 1;\r
+        // Clear datalogger icon\r
+        display_symbol(LCD_ICON_RECORD, SEG_OFF_BLINK_OFF);\r
+    }\r
+    else\r
+    {\r
+        // If index was odd number, 1 byte remains in buffer and must be written next time\r
+        if ((sDatalog.idx & 0x01) == 0x01)\r
+        {\r
+            sDatalog.buffer[0] = sDatalog.buffer[sDatalog.idx - 1];\r
+            sDatalog.idx = 1;\r
+        }\r
+        else                    // All bytes haven been written\r
+        {\r
+            sDatalog.idx = 0;\r
+        }\r
+    }\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          datalog_sm\r
+// @brief       Data logging state machine\r
+// @param       u8 line LINE1, LINE2\r
+//                              u8 update       DISPLAY_LINE_UPDATE_FULL, DISPLAY_LINE_CLEAR\r
+// @return      none\r
+// *************************************************************************************************\r
+void datalog_sm(u8 * data, u8 len, u8 cmd)\r
+{\r
+    u8 i;\r
+    u16 temp;\r
+\r
+    switch (cmd)\r
+    {\r
+        case DATALOG_CMD_START:\r
+            if (!sDatalog.flags.flag.on && !sDatalog.flags.flag.memory_full)\r
+            {\r
+                // Clear index\r
+                sDatalog.idx = 0;\r
+                sDatalog.delay = sDatalog.interval;\r
+\r
+                // Add session begin marker to buffer (2 byte)\r
+                temp = 0xFFFB;\r
+                datalog_add_to_buffer((u8 *) &temp, 2);\r
+\r
+                // Add recording mode to buffer (1 byte)\r
+                datalog_add_to_buffer((u8 *) &sDatalog.mode, 1);\r
+\r
+                // Add recording interval to buffer (1 byte)\r
+                datalog_add_to_buffer((u8 *) &sDatalog.interval, 1);\r
+\r
+                // Add date to buffer (DD.MM.YYYY) (4 bytes)\r
+                datalog_add_to_buffer((u8 *) &sDate.day, 1);\r
+                datalog_add_to_buffer((u8 *) &sDate.month, 1);\r
+                datalog_add_to_buffer((u8 *) &sDate.year, 2);\r
+\r
+                // Add system time to buffer (HH.MM.SS) (3 bytes)\r
+                datalog_add_to_buffer((u8 *) &sTime.hour, 3);\r
+\r
+                // Data logging has started\r
+                sDatalog.flags.flag.on = 1;\r
+            }\r
+            break;\r
+\r
+        case DATALOG_CMD_CLOSE:\r
+            if (sDatalog.flags.flag.on && !sDatalog.flags.flag.memory_full)\r
+            {\r
+                // If index is odd, add a dummy byte before writing session end marker\r
+                if ((sDatalog.idx & 0x01) == 0x01)\r
+                {\r
+                    temp = 0x00;\r
+                    datalog_add_to_buffer((u8 *) &temp, 1);\r
+                }\r
+                // Add session end marker to buffer (2 byte)\r
+                temp = 0xFFFE;\r
+                datalog_add_to_buffer((u8 *) &temp, 2);\r
+                // Write buffer to flash\r
+                datalog_write_buffer();\r
+            }\r
+            sDatalog.flags.flag.on = 0;\r
+            break;\r
+\r
+        case DATALOG_CMD_ADD_DATA:\r
+            if (sDatalog.flags.flag.on && !sDatalog.flags.flag.memory_full)\r
+            {\r
+                datalog_add_to_buffer(data, len);\r
+            }\r
+            break;\r
+\r
+        case DATALOG_CMD_WRITE_DATA:\r
+            if (sDatalog.flags.flag.on && !sDatalog.flags.flag.memory_full)\r
+            {\r
+                // Over write threshold?\r
+                if (sDatalog.idx > DATALOG_BUFFER_WRITE_THRESHOLD)\r
+                {\r
+                    // BlueRobin ISR call more than ~13ms away?\r
+                    if (is_bluerobin_flash_write_window())\r
+                        datalog_write_buffer();\r
+                }\r
+            }\r
+            break;\r
+\r
+        case DATALOG_CMD_ERASE:\r
+            if (!sDatalog.flags.flag.on)\r
+            {\r
+                for (i = DATALOG_PAGE_START; i <= DATALOG_PAGE_END; i++)\r
+                {\r
+                    flash_erase_page(i);\r
+                }\r
+            }\r
+            break;\r
+\r
+    }\r
+}\r
+\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/logic/datalog.h b/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/logic/datalog.h
new file mode 100755 (executable)
index 0000000..da3903f
--- /dev/null
@@ -0,0 +1,134 @@
+// *************************************************************************************************\r
+//\r
+//      Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//        Redistribution and use in source and binary forms, with or without\r
+//        modification, are permitted provided that the following conditions\r
+//        are met:\r
+//\r
+//          Redistributions of source code must retain the above copyright\r
+//          notice, this list of conditions and the following disclaimer.\r
+//\r
+//          Redistributions in binary form must reproduce the above copyright\r
+//          notice, this list of conditions and the following disclaimer in the\r
+//          documentation and/or other materials provided with the\r
+//          distribution.\r
+//\r
+//          Neither the name of Texas Instruments Incorporated nor the names of\r
+//          its contributors may be used to endorse or promote products derived\r
+//          from this software without specific prior written permission.\r
+//\r
+//        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+\r
+#ifndef DATALOG_H_\r
+#define DATALOG_H_\r
+\r
+// *************************************************************************************************\r
+// Include section\r
+\r
+// *************************************************************************************************\r
+// Prototypes section\r
+\r
+// internal functions\r
+extern void reset_datalog(void);\r
+extern u8 is_datalog(void);\r
+extern void do_datalog(void);\r
+extern void display_datalog(u8 line, u8 update);\r
+extern void stop_datalog(void);\r
+\r
+// menu functions\r
+extern void sx_datalog(u8 line);\r
+\r
+// *************************************************************************************************\r
+// Defines section\r
+\r
+// Data logger state\r
+#define DATALOG_OFF                                             (0u)\r
+#define DATALOG_ON                                              (1u)\r
+\r
+// Data memory range: 0x8000 - 0x9DFF (7.5kB)\r
+#define DATALOG_MEMORY_START            (0x8000)\r
+#define DATALOG_MEMORY_END              (0x9DFF)\r
+#define DATALOG_BYTES_PER_PAGE          (512u)\r
+#define DATALOG_PAGE_START                              (DATALOG_MEMORY_START / \\r
+                                                         DATALOG_BYTES_PER_PAGE)\r
+#define DATALOG_PAGE_END                                (DATALOG_MEMORY_END / \\r
+                                                         DATALOG_BYTES_PER_PAGE)\r
+\r
+// Store data in buffer before writing to flash memory\r
+#define DATALOG_BUFFER_SIZE             (128u)\r
+#define DATALOG_BUFFER_WRITE_THRESHOLD  (100u)\r
+\r
+// Datalogging interval in seconds\r
+#define DATALOG_INTERVAL                        (5u)\r
+\r
+// Datalogger state machine commands\r
+#define DATALOG_CMD_START                       (BIT0)\r
+#define DATALOG_CMD_CLOSE                       (BIT1)\r
+#define DATALOG_CMD_ERASE                       (BIT2)\r
+#define DATALOG_CMD_ADD_DATA                    (BIT3)\r
+#define DATALOG_CMD_WRITE_DATA                  (BIT4)\r
+\r
+// Datalog modes\r
+#define DATALOG_MODE_HEARTRATE                  (BIT0)\r
+#define DATALOG_MODE_TEMPERATURE                (BIT1)\r
+#define DATALOG_MODE_ALTITUDE                   (BIT2)\r
+#define DATALOG_MODE_ACCELERATION               (BIT3)\r
+\r
+// *************************************************************************************************\r
+// Global Variable section\r
+\r
+// Flags\r
+typedef union\r
+{\r
+    struct\r
+    {\r
+        u8 on          : 1; // 1 = data logging has started\r
+        u8 memory_full : 1; // 1 = memory is full\r
+        u8 one_second  : 1; // 1 = 1 second has elapsed\r
+    } flag;\r
+    u8 all;                 // Shortcut to all flags (for reset)\r
+} datalog_flags;\r
+\r
+struct datalog\r
+{\r
+    // Flags\r
+    datalog_flags flags;\r
+\r
+    // Data logging mode\r
+    u8 mode;\r
+\r
+    // Data logging interval\r
+    u8 interval;\r
+\r
+    // Data logging delay counter\r
+    u8 delay;\r
+\r
+    // Datalog memory write pointer\r
+    u16 *wptr;\r
+\r
+    // Datalogger write buffer index\r
+    u8 idx;\r
+\r
+    // Datalogger write buffer\r
+    u8 buffer[DATALOG_BUFFER_SIZE];\r
+};\r
+extern struct datalog sDatalog;\r
+\r
+// *************************************************************************************************\r
+// Extern section\r
+\r
+#endif                          /*DATALOG_H_ */\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/logic/date.c b/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/logic/date.c
new file mode 100755 (executable)
index 0000000..1e34ec5
--- /dev/null
@@ -0,0 +1,234 @@
+// *************************************************************************************************\r
+//\r
+//      Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//        Redistribution and use in source and binary forms, with or without\r
+//        modification, are permitted provided that the following conditions\r
+//        are met:\r
+//\r
+//          Redistributions of source code must retain the above copyright\r
+//          notice, this list of conditions and the following disclaimer.\r
+//\r
+//          Redistributions in binary form must reproduce the above copyright\r
+//          notice, this list of conditions and the following disclaimer in the\r
+//          documentation and/or other materials provided with the\r
+//          distribution.\r
+//\r
+//          Neither the name of Texas Instruments Incorporated nor the names of\r
+//          its contributors may be used to endorse or promote products derived\r
+//          from this software without specific prior written permission.\r
+//\r
+//        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+// Date functions.\r
+// *************************************************************************************************\r
+\r
+// *************************************************************************************************\r
+// Include section\r
+\r
+// system\r
+#include "project.h"\r
+\r
+// driver\r
+#include "display.h"\r
+#include "ports.h"\r
+\r
+// logic\r
+#include "date.h"\r
+#include "user.h"\r
+\r
+// *************************************************************************************************\r
+// Prototypes section\r
+void reset_date(void);\r
+u8 get_numberOfDays(u8 month, u16 year);\r
+void add_day(void);\r
+void mx_date(u8 line);\r
+void sx_date(u8 line);\r
+void display_date(u8 line, u8 update);\r
+\r
+// *************************************************************************************************\r
+// Defines section\r
+\r
+// *************************************************************************************************\r
+// Global Variable section\r
+struct date sDate;\r
+\r
+// *************************************************************************************************\r
+// Extern section\r
+\r
+// *************************************************************************************************\r
+// @fn          reset_date\r
+// @brief       Reset date to start value.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void reset_date(void)\r
+{\r
+    // Set date\r
+    sDate.year = 2009;\r
+    sDate.month = 8;\r
+    sDate.day = 1;\r
+\r
+    // Show day and month on display\r
+    sDate.display = DISPLAY_DEFAULT_VIEW;\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          get_NumberOfDays\r
+// @brief       Return number of days for a given month\r
+// @param       month           month as char\r
+//                              year            year as int\r
+// @return                              day count for given month\r
+// *************************************************************************************************\r
+u8 get_numberOfDays(u8 month, u16 year)\r
+{\r
+    switch (month)\r
+    {\r
+        case 1:\r
+        case 3:\r
+        case 5:\r
+        case 7:\r
+        case 8:\r
+        case 10:\r
+        case 12:\r
+            return (31);\r
+\r
+        case 4:\r
+        case 6:\r
+        case 9:\r
+        case 11:\r
+            return (30);\r
+\r
+        // 1. A year that is divisible by 4 is a leap year. (Y % 4) == 0\r
+        // 2. Exception to rule 1: a year that is divisible by 100 is not a leap year. (Y % 100) !=\r
+        // 0\r
+        // 3. Exception to rule 2: a year that is divisible by 400 is a leap year. (Y % 400) == 0\r
+\r
+        case 2:\r
+            if ((year % 4 == 0) && ((year % 100 != 0) || (year % 400 == 0)))\r
+                return (29);\r
+            else\r
+                return (28);\r
+\r
+        default:\r
+            return (0);\r
+    }\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          add_day\r
+// @brief       Add one day to current date. Called when clock changes from 23:59 to 00:00\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void add_day(void)\r
+{\r
+    // Add 1 day\r
+    sDate.day++;\r
+\r
+    // Check if day overflows into next month\r
+    if (sDate.day > get_numberOfDays(sDate.month, sDate.year))\r
+    {\r
+        // Add 1 month and reset to day to 1\r
+        sDate.day = 1;\r
+        sDate.month++;\r
+\r
+        // Check if month overflows into next year\r
+        if (sDate.month > 12)\r
+        {\r
+            // Add 1 year and reset month and day to 1\r
+            sDate.day = 1;\r
+            sDate.month = 1;\r
+            sDate.year++;\r
+        }\r
+    }\r
+\r
+    // Indicate to display function that new value is available\r
+    display.flag.full_update = 1;\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          sx_date\r
+// @brief       Date user routine. Toggles view between DD.MM and YYYY.\r
+// @param       line            LINE1, LINE2\r
+// @return      none\r
+// *************************************************************************************************\r
+void sx_date(u8 line)\r
+{\r
+    // Toggle display items\r
+    if (sDate.display == DISPLAY_DEFAULT_VIEW)\r
+        sDate.display = DISPLAY_ALTERNATIVE_VIEW;\r
+    else\r
+        sDate.display = DISPLAY_DEFAULT_VIEW;\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          display_date\r
+// @brief       Display date in DD.MM format (metric units) or MM.DD (English units).\r
+// @param       u8 line                 LINE1, LINE2\r
+//                              u8 update               DISPLAY_LINE_UPDATE_FULL,\r
+// DISPLAY_LINE_UPDATE_PARTIAL\r
+// @return      none\r
+// *************************************************************************************************\r
+void display_date(u8 line, u8 update)\r
+{\r
+    u8 *str;\r
+\r
+    if (update == DISPLAY_LINE_UPDATE_FULL)\r
+    {\r
+        if (sDate.display == DISPLAY_DEFAULT_VIEW)\r
+        {\r
+            // Convert day to string\r
+            str = int_to_array(sDate.day, 2, 0);\r
+            if (sys.flag.use_metric_units)\r
+            {\r
+                display_chars(switch_seg(line, LCD_SEG_L1_3_2, LCD_SEG_L2_3_2), str, SEG_ON);\r
+            }\r
+            else\r
+            {\r
+                display_chars(switch_seg(line, LCD_SEG_L1_1_0, LCD_SEG_L2_1_0), str, SEG_ON);\r
+            }\r
+\r
+            // Convert month to string\r
+            str = int_to_array(sDate.month, 2, 0);\r
+            if (sys.flag.use_metric_units)\r
+            {\r
+                display_chars(switch_seg(line, LCD_SEG_L1_1_0, LCD_SEG_L2_1_0), str, SEG_ON);\r
+            }\r
+            else\r
+            {\r
+                display_chars(switch_seg(line, LCD_SEG_L1_3_2, LCD_SEG_L2_3_2), str, SEG_ON);\r
+            }\r
+\r
+            // Display "." to separate day and month\r
+            display_symbol(switch_seg(line, LCD_SEG_L1_DP1, LCD_SEG_L2_DP), SEG_ON);\r
+        }\r
+        else\r
+        {\r
+            // Convert year to string\r
+            str = int_to_array(sDate.year, 4, 0);\r
+            display_chars(switch_seg(line, LCD_SEG_L1_3_0, LCD_SEG_L2_3_0), str, SEG_ON);\r
+\r
+            // Clear "."\r
+            display_symbol(switch_seg(line, LCD_SEG_L1_DP1, LCD_SEG_L2_DP), SEG_OFF);\r
+        }\r
+    }\r
+    else if (update == DISPLAY_LINE_CLEAR)\r
+    {\r
+        // Show day and month on display when coming around next time\r
+        sDate.display = DISPLAY_DEFAULT_VIEW;\r
+    }\r
+}\r
+\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/logic/date.h b/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/logic/date.h
new file mode 100755 (executable)
index 0000000..f3a65b8
--- /dev/null
@@ -0,0 +1,68 @@
+// *************************************************************************************************\r
+//\r
+//      Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//        Redistribution and use in source and binary forms, with or without\r
+//        modification, are permitted provided that the following conditions\r
+//        are met:\r
+//\r
+//          Redistributions of source code must retain the above copyright\r
+//          notice, this list of conditions and the following disclaimer.\r
+//\r
+//          Redistributions in binary form must reproduce the above copyright\r
+//          notice, this list of conditions and the following disclaimer in the\r
+//          documentation and/or other materials provided with the\r
+//          distribution.\r
+//\r
+//          Neither the name of Texas Instruments Incorporated nor the names of\r
+//          its contributors may be used to endorse or promote products derived\r
+//          from this software without specific prior written permission.\r
+//\r
+//        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+\r
+#ifndef DATE_H_\r
+#define DATE_H_\r
+\r
+// *************************************************************************************************\r
+// Include section\r
+\r
+// *************************************************************************************************\r
+// Prototypes section\r
+extern void reset_date(void);\r
+extern void add_day(void);\r
+extern void mx_date(u8 line);\r
+extern void sx_date(u8 line);\r
+extern void display_date(u8 line, u8 update);\r
+\r
+// *************************************************************************************************\r
+// Defines section\r
+\r
+// *************************************************************************************************\r
+// Global Variable section\r
+struct date\r
+{\r
+    u8 display;                 // Toggles view between DISPLAY_DEFAULT_VIEW = DD.MM and\r
+                                // DISPLAY_ALTERNATIVE_VIEW = YYYY\r
+    u8 day;\r
+    u8 month;\r
+    u16 year;\r
+};\r
+extern struct date sDate;\r
+\r
+// *************************************************************************************************\r
+// Extern section\r
+\r
+#endif                          /*DATE_H_ */\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/logic/menu.c b/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/logic/menu.c
new file mode 100755 (executable)
index 0000000..f664cdf
--- /dev/null
@@ -0,0 +1,172 @@
+// *************************************************************************************************\r
+//\r
+//      Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//        Redistribution and use in source and binary forms, with or without\r
+//        modification, are permitted provided that the following conditions\r
+//        are met:\r
+//\r
+//          Redistributions of source code must retain the above copyright\r
+//          notice, this list of conditions and the following disclaimer.\r
+//\r
+//          Redistributions in binary form must reproduce the above copyright\r
+//          notice, this list of conditions and the following disclaimer in the\r
+//          documentation and/or other materials provided with the\r
+//          distribution.\r
+//\r
+//          Neither the name of Texas Instruments Incorporated nor the names of\r
+//          its contributors may be used to endorse or promote products derived\r
+//          from this software without specific prior written permission.\r
+//\r
+//        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+// Menu management functions.\r
+// *************************************************************************************************\r
+\r
+// *************************************************************************************************\r
+// Include section\r
+\r
+// system\r
+#include "project.h"\r
+\r
+// driver\r
+#include "display.h"\r
+\r
+// logic\r
+#include "menu.h"\r
+#include "user.h"\r
+#include "clock.h"\r
+#include "date.h"\r
+#include "temperature.h"\r
+#include "altitude.h"\r
+#include "battery.h"\r
+#include "bluerobin.h"\r
+#include "rfsimpliciti.h"\r
+#include "acceleration.h"\r
+#include "datalog.h"\r
+#include "rfbsl.h"\r
+\r
+// *************************************************************************************************\r
+// Defines section\r
+#define FUNCTION(function)  function\r
+\r
+// *************************************************************************************************\r
+// Global Variable section\r
+const struct menu *ptrMenu_L1 = NULL;\r
+const struct menu *ptrMenu_L2 = NULL;\r
+\r
+// *************************************************************************************************\r
+// Global Variable section\r
+\r
+void display_nothing(u8 line, u8 update)\r
+{\r
+}\r
+\r
+u8 update_time(void)\r
+{\r
+    return (display.flag.update_time);\r
+}\r
+\r
+u8 update_date(void)\r
+{\r
+    return (display.flag.update_date);\r
+}\r
+\r
+u8 update_temperature(void)\r
+{\r
+    return (display.flag.update_temperature);\r
+}\r
+\r
+// *************************************************************************************************\r
+// User navigation ( [____] = default menu item after reset )\r
+//\r
+//      LINE1:  [Time] -> Temperature -> Altitude -> Heart rate\r
+//\r
+//      LINE2:  [Date] -> Datalog -> SYNC -> RFBSL\r
+// *************************************************************************************************\r
+\r
+// Line1 - Time\r
+const struct menu menu_L1_Time = {\r
+    FUNCTION(sx_time),             // direct function\r
+    FUNCTION(dummy),               // sub menu function\r
+    FUNCTION(display_time),        // display function\r
+    FUNCTION(update_time),         // new display data\r
+    &menu_L1_Temperature,\r
+};\r
+\r
+// Line1 - Temperature\r
+const struct menu menu_L1_Temperature = {\r
+    FUNCTION(dummy),               // direct function\r
+    FUNCTION(dummy),               // sub menu function\r
+    FUNCTION(display_temperature), // display function\r
+    FUNCTION(update_time),         // new display data\r
+    &menu_L1_Altitude,\r
+};\r
+\r
+// Line1 - Altitude\r
+const struct menu menu_L1_Altitude = {\r
+    FUNCTION(dummy),               // direct function\r
+    FUNCTION(dummy),               // sub menu function\r
+    FUNCTION(display_altitude),    // display function\r
+    FUNCTION(update_time),         // new display data\r
+#ifdef INCLUDE_BLUEROBIN_SUPPORT\r
+    &menu_L1_Heartrate,\r
+};\r
+\r
+// Line1 - Heart Rate\r
+const struct menu menu_L1_Heartrate = {\r
+    FUNCTION(sx_bluerobin),        // direct function\r
+    FUNCTION(mx_bluerobin),        // sub menu function\r
+    FUNCTION(display_heartrate),   // display function\r
+    FUNCTION(update_time),         // new display data\r
+#endif\r
+    &menu_L1_Time,\r
+};\r
+\r
+// Line2 - Date\r
+const struct menu menu_L2_Date = {\r
+    FUNCTION(sx_date),             // direct function\r
+    FUNCTION(dummy),               // sub menu function\r
+    FUNCTION(display_date),        // display function\r
+    FUNCTION(update_date),         // new display data\r
+    &menu_L2_DataLog,\r
+};\r
+\r
+// Line2 - DataLog (data recording on/off)\r
+const struct menu menu_L2_DataLog = {\r
+    FUNCTION(sx_datalog),          // direct function\r
+    FUNCTION(dummy),               // sub menu function\r
+    FUNCTION(display_datalog),     // display function\r
+    FUNCTION(update_time),         // new display data\r
+    &menu_L2_Sync,\r
+};\r
+\r
+// Line2 - SYNC (synchronization/data download via SimpliciTI)\r
+const struct menu menu_L2_Sync = {\r
+    FUNCTION(sx_sync),             // direct function\r
+    FUNCTION(dummy),               // sub menu function\r
+    FUNCTION(display_sync),        // display function\r
+    FUNCTION(update_time),         // new display data\r
+    &menu_L2_RFBSL,\r
+};\r
+\r
+// Line2 - RFBSL (software update)\r
+const struct menu menu_L2_RFBSL = {\r
+    FUNCTION(sx_rfbsl),            // direct function\r
+    FUNCTION(dummy),               // sub menu function\r
+    FUNCTION(display_rfbsl),       // display function\r
+    FUNCTION(update_time),         // new display data\r
+    &menu_L2_Date,\r
+};\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/logic/menu.h b/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/logic/menu.h
new file mode 100755 (executable)
index 0000000..6b543e1
--- /dev/null
@@ -0,0 +1,84 @@
+// *************************************************************************************************\r
+//\r
+//      Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//        Redistribution and use in source and binary forms, with or without\r
+//        modification, are permitted provided that the following conditions\r
+//        are met:\r
+//\r
+//          Redistributions of source code must retain the above copyright\r
+//          notice, this list of conditions and the following disclaimer.\r
+//\r
+//          Redistributions in binary form must reproduce the above copyright\r
+//          notice, this list of conditions and the following disclaimer in the\r
+//          documentation and/or other materials provided with the\r
+//          distribution.\r
+//\r
+//          Neither the name of Texas Instruments Incorporated nor the names of\r
+//          its contributors may be used to endorse or promote products derived\r
+//          from this software without specific prior written permission.\r
+//\r
+//        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+\r
+#ifndef MENU_H_\r
+#define MENU_H_\r
+\r
+// *************************************************************************************************\r
+// Include section\r
+\r
+// *************************************************************************************************\r
+// Prototypes section\r
+\r
+// *************************************************************************************************\r
+// Defines section\r
+\r
+struct menu\r
+{\r
+    // Pointer to direct function (start, stop etc)\r
+    void (*sx_function)(u8 line);\r
+    // Pointer to sub menu function (change settings, reset counter etc)\r
+    void (*mx_function)(u8 line);\r
+    // Pointer to display function\r
+    void (*display_function)(u8 line, u8 mode);\r
+    // Display update trigger\r
+    u8 (*display_update)(void);\r
+    // Pointer to next menu item\r
+    const struct menu *next;\r
+};\r
+\r
+// *************************************************************************************************\r
+// Global Variable section\r
+\r
+// *************************************************************************************************\r
+// Extern section\r
+\r
+// Line1 navigation\r
+extern const struct menu menu_L1_Time;\r
+extern const struct menu menu_L1_Temperature;\r
+extern const struct menu menu_L1_Altitude;\r
+extern const struct menu menu_L1_Heartrate;\r
+\r
+// Line2 navigation\r
+extern const struct menu menu_L2_Date;\r
+extern const struct menu menu_L2_DataLog;\r
+extern const struct menu menu_L2_Sync;\r
+extern const struct menu menu_L2_RFBSL;\r
+\r
+// Pointers to current menu item\r
+extern const struct menu *ptrMenu_L1;\r
+extern const struct menu *ptrMenu_L2;\r
+\r
+#endif                          /*MENU_H_ */\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/logic/rfbsl.c b/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/logic/rfbsl.c
new file mode 100755 (executable)
index 0000000..c32c980
--- /dev/null
@@ -0,0 +1,118 @@
+// *************************************************************************************************\r
+//\r
+//      Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//        Redistribution and use in source and binary forms, with or without\r
+//        modification, are permitted provided that the following conditions\r
+//        are met:\r
+//\r
+//          Redistributions of source code must retain the above copyright\r
+//          notice, this list of conditions and the following disclaimer.\r
+//\r
+//          Redistributions in binary form must reproduce the above copyright\r
+//          notice, this list of conditions and the following disclaimer in the\r
+//          documentation and/or other materials provided with the\r
+//          distribution.\r
+//\r
+//          Neither the name of Texas Instruments Incorporated nor the names of\r
+//          its contributors may be used to endorse or promote products derived\r
+//          from this software without specific prior written permission.\r
+//\r
+//        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+// Wireless Update functions.\r
+// *************************************************************************************************\r
+\r
+\r
+// *************************************************************************************************\r
+// Include section\r
+\r
+// system\r
+#include "project.h"\r
+\r
+// driver\r
+#include "display.h"\r
+#include "ports.h"\r
+\r
+// logic\r
+#include "rfbsl.h"\r
+#include "bluerobin.h"\r
+#include "rfsimpliciti.h"\r
+\r
+// *************************************************************************************************\r
+// Global Variable section\r
+u8 rfBSL_button_confirmation;\r
+\r
+// *************************************************************************************************\r
+// @fn          sx_rfbsl\r
+// @brief       This functions starts the RFBSL\r
+// @param       line            LINE1, LINE2\r
+// @return      none\r
+// *************************************************************************************************\r
+void sx_rfbsl(u8 line)\r
+{\r
+    // Exit if battery voltage is too low for radio operation\r
+    if (sys.flag.low_battery)\r
+        return;\r
+\r
+    // Exit if BlueRobin stack is active\r
+    if (is_bluerobin())\r
+        return;\r
+\r
+    // Exit if SimpliciTI stack is active\r
+    if (is_rf())\r
+        return;\r
+\r
+    rfBSL_button_confirmation++;\r
+\r
+    if (rfBSL_button_confirmation == 2)\r
+    {\r
+        // Before entering RFBSL clear the LINE1 Symbols\r
+        display_symbol(LCD_SYMB_AM, SEG_OFF);\r
+\r
+        clear_line(LINE1);\r
+\r
+        // Write RAM to indicate we will be downloading the RAM Updater first\r
+        display_chars(LCD_SEG_L2_5_0, (u8 *) " RFBSL", SEG_ON);\r
+        display_chars(LCD_SEG_L1_3_0, (u8 *) " RAM", SEG_ON);\r
+\r
+        // Call RFBSL\r
+        CALL_RFSBL();\r
+    }\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          display_rfbsl\r
+// @brief       RFBSL display routine.\r
+// @param       u8 line                 LINE2\r
+//                              u8 update               DISPLAY_LINE_UPDATE_FULL\r
+// @return      none\r
+// *************************************************************************************************\r
+void display_rfbsl(u8 line, u8 update)\r
+{\r
+    if (update == DISPLAY_LINE_UPDATE_FULL)\r
+    {\r
+        if (rfBSL_button_confirmation == 0)\r
+        {\r
+            display_chars(LCD_SEG_L2_5_0, (u8 *) " RFBSL", SEG_ON);\r
+        }\r
+        else if (rfBSL_button_confirmation < 2)\r
+        {\r
+            // Request one more button press to confirm rfBSL call\r
+            display_chars(LCD_SEG_L2_5_0, (u8 *) " CONF", SEG_ON);\r
+        }\r
+    }\r
+}\r
+\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/logic/rfbsl.h b/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/logic/rfbsl.h
new file mode 100755 (executable)
index 0000000..364749f
--- /dev/null
@@ -0,0 +1,55 @@
+// *************************************************************************************************\r
+//\r
+//      Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//        Redistribution and use in source and binary forms, with or without\r
+//        modification, are permitted provided that the following conditions\r
+//        are met:\r
+//\r
+//          Redistributions of source code must retain the above copyright\r
+//          notice, this list of conditions and the following disclaimer.\r
+//\r
+//          Redistributions in binary form must reproduce the above copyright\r
+//          notice, this list of conditions and the following disclaimer in the\r
+//          documentation and/or other materials provided with the\r
+//          distribution.\r
+//\r
+//          Neither the name of Texas Instruments Incorporated nor the names of\r
+//          its contributors may be used to endorse or promote products derived\r
+//          from this software without specific prior written permission.\r
+//\r
+//        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+\r
+#ifndef RFBSL_H_\r
+#define RFBSL_H_\r
+\r
+// *************************************************************************************************\r
+// Prototypes section\r
+extern void sx_rfbsl(u8 line);\r
+extern void display_rfbsl(u8 line, u8 update);\r
+\r
+// *************************************************************************************************\r
+// Defines section\r
+\r
+// Entry point of of the Flash Updater in BSL memory\r
+#define CALL_RFSBL()   ((void (*)()) 0x1000)()\r
+\r
+\r
+// *************************************************************************************************\r
+// Global Variable section\r
+extern u8 rfBSL_button_confirmation;\r
+\r
+#endif                          /*RFBSL_H_ */\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/logic/rfsimpliciti.c b/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/logic/rfsimpliciti.c
new file mode 100755 (executable)
index 0000000..6887571
--- /dev/null
@@ -0,0 +1,403 @@
+// *************************************************************************************************\r
+//\r
+//      Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//        Redistribution and use in source and binary forms, with or without\r
+//        modification, are permitted provided that the following conditions\r
+//        are met:\r
+//\r
+//          Redistributions of source code must retain the above copyright\r
+//          notice, this list of conditions and the following disclaimer.\r
+//\r
+//          Redistributions in binary form must reproduce the above copyright\r
+//          notice, this list of conditions and the following disclaimer in the\r
+//          documentation and/or other materials provided with the\r
+//          distribution.\r
+//\r
+//          Neither the name of Texas Instruments Incorporated nor the names of\r
+//          its contributors may be used to endorse or promote products derived\r
+//          from this software without specific prior written permission.\r
+//\r
+//        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+// SimpliciTI functions.\r
+// *************************************************************************************************\r
+\r
+// *************************************************************************************************\r
+// Include section\r
+\r
+// system\r
+#include "project.h"\r
+\r
+// driver\r
+#include "display.h"\r
+#include "vti_as.h"\r
+#include "ports.h"\r
+#include "timer.h"\r
+#include "radio.h"\r
+#include "flash.h"\r
+\r
+// logic\r
+#include "acceleration.h"\r
+#include "rfsimpliciti.h"\r
+#include "bluerobin.h"\r
+#include "simpliciti.h"\r
+#include "clock.h"\r
+#include "date.h"\r
+#include "temperature.h"\r
+#include "vti_ps.h"\r
+#include "altitude.h"\r
+#include "datalog.h"\r
+\r
+// *************************************************************************************************\r
+// Prototypes section\r
+void simpliciti_get_data_callback(void);\r
+void start_simpliciti_sync(void);\r
+\r
+// *************************************************************************************************\r
+// Defines section\r
+\r
+// Each packet index requires 2 bytes, so we can have 9 packet indizes in 18 bytes usable payload\r
+#define BM_SYNC_BURST_PACKETS_IN_DATA           (9u)\r
+\r
+// *************************************************************************************************\r
+// Global Variable section\r
+struct RFsmpl sRFsmpl;\r
+\r
+// flag contains status information, trigger to send data and trigger to exit SimpliciTI\r
+unsigned char simpliciti_flag;\r
+\r
+// 4 data bytes to send\r
+unsigned char simpliciti_data[SIMPLICITI_MAX_PAYLOAD_LENGTH];\r
+\r
+// 4 byte device address overrides SimpliciTI end device address set in "smpl_config.dat"\r
+unsigned char simpliciti_ed_address[4];\r
+\r
+// 1 = send one or more reply packets, 0 = no need to reply\r
+//unsigned char simpliciti_reply;\r
+unsigned char simpliciti_reply_count;\r
+\r
+// 1 = send packets sequentially from burst_start to burst_end, 2 = send packets addressed by their\r
+// index\r
+u8 burst_mode;\r
+\r
+// Start and end index of packets to send out\r
+u16 burst_start, burst_end;\r
+\r
+// Array containing requested packets\r
+u16 burst_packet[BM_SYNC_BURST_PACKETS_IN_DATA];\r
+\r
+// Current packet index\r
+u8 burst_packet_index;\r
+\r
+// Byte-Pointer to flash memory\r
+u8 *flash_ptr;\r
+\r
+// *************************************************************************************************\r
+// Extern section\r
+extern void (*fptr_lcd_function_line1)(u8 line, u8 update);\r
+\r
+// *************************************************************************************************\r
+// @fn          reset_rf\r
+// @brief       Reset SimpliciTI data.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void reset_rf(void)\r
+{\r
+    // No connection\r
+    sRFsmpl.mode = SIMPLICITI_OFF;\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          sx_sync\r
+// @brief       Start SimpliciTI. Button DOWN connects/disconnects to access point.\r
+// @param       u8 line         LINE2\r
+// @return      none\r
+// *************************************************************************************************\r
+void sx_sync(u8 line)\r
+{\r
+    // Exit if battery voltage is too low for radio operation\r
+    if (sys.flag.low_battery)\r
+        return;\r
+\r
+    // Exit if BlueRobin stack is active\r
+    if (is_bluerobin())\r
+        return;\r
+\r
+    // Turn off the backlight\r
+    P2OUT &= ~BUTTON_BACKLIGHT_PIN;\r
+    P2DIR &= ~BUTTON_BACKLIGHT_PIN;\r
+    BUTTONS_IE &= ~BUTTON_BACKLIGHT_PIN;\r
+\r
+    // Start SimpliciTI in sync mode\r
+    start_simpliciti_sync();\r
+\r
+    BUTTONS_IE |= BUTTON_BACKLIGHT_PIN;\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          display_sync\r
+// @brief       SimpliciTI display routine.\r
+// @param       u8 line                 LINE2\r
+//                              u8 update               DISPLAY_LINE_UPDATE_FULL\r
+// @return      none\r
+// *************************************************************************************************\r
+void display_sync(u8 line, u8 update)\r
+{\r
+    if (update == DISPLAY_LINE_UPDATE_FULL)\r
+    {\r
+        display_chars(LCD_SEG_L2_5_0, (u8 *) "  SYNC", SEG_ON);\r
+    }\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          is_rf\r
+// @brief       Returns TRUE if SimpliciTI receiver is connected.\r
+// @param       none\r
+// @return      u8\r
+// *************************************************************************************************\r
+u8 is_rf(void)\r
+{\r
+    return (sRFsmpl.mode != SIMPLICITI_OFF);\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          start_simpliciti_sync\r
+// @brief       Start SimpliciTI (sync mode).\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void start_simpliciti_sync(void)\r
+{\r
+    // Clear LINE1\r
+    clear_line(LINE1);\r
+    fptr_lcd_function_line1(LINE1, DISPLAY_LINE_CLEAR);\r
+\r
+    // Stop data logging and close session\r
+    stop_datalog();\r
+\r
+    // Turn on beeper icon to show activity\r
+    display_symbol(LCD_ICON_BEEPER1, SEG_ON_BLINK_ON);\r
+    display_symbol(LCD_ICON_BEEPER2, SEG_ON_BLINK_ON);\r
+    display_symbol(LCD_ICON_BEEPER3, SEG_ON_BLINK_ON);\r
+\r
+    // Prepare radio for RF communication\r
+    open_radio();\r
+\r
+    // Set SimpliciTI mode\r
+    sRFsmpl.mode = SIMPLICITI_SYNC;\r
+\r
+    // Set SimpliciTI timeout to save battery power\r
+    sRFsmpl.timeout = SIMPLICITI_TIMEOUT;\r
+\r
+    // Start SimpliciTI stack. Try to link to access point.\r
+    // Exit with timeout or by a DOWN button press.\r
+    if (simpliciti_link())\r
+    {\r
+        // Enter sync routine. This will send ready-to-receive packets at regular intervals to the\r
+        // access point.\r
+        // The access point always replies a command (NOP if no other command is set)\r
+        simpliciti_main_sync();\r
+    }\r
+\r
+    // Set SimpliciTI state to OFF\r
+    sRFsmpl.mode = SIMPLICITI_OFF;\r
+\r
+    // Powerdown radio\r
+    close_radio();\r
+\r
+    // Clear last button events\r
+    Timer0_A4_Delay(CONV_MS_TO_TICKS(BUTTONS_DEBOUNCE_TIME_OUT));\r
+    BUTTONS_IFG = 0x00;\r
+    button.all_flags = 0;\r
+\r
+    // Clear icons\r
+    display_symbol(LCD_ICON_BEEPER1, SEG_OFF_BLINK_OFF);\r
+    display_symbol(LCD_ICON_BEEPER2, SEG_OFF_BLINK_OFF);\r
+    display_symbol(LCD_ICON_BEEPER3, SEG_OFF_BLINK_OFF);\r
+\r
+    // Force full display update\r
+    display.flag.full_update = 1;\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          simpliciti_sync_decode_ap_cmd_callback\r
+// @brief       For SYNC mode only: Decode command from access point and trigger actions.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void simpliciti_sync_decode_ap_cmd_callback(void)\r
+{\r
+    u8 i;\r
+    s16 t1, offset;\r
+\r
+    // Default behaviour is to send no reply packets\r
+    simpliciti_reply_count = 0;\r
+\r
+    switch (simpliciti_data[0])\r
+    {\r
+        case SYNC_AP_CMD_NOP:\r
+            break;\r
+\r
+        case SYNC_AP_CMD_GET_STATUS: // Send watch parameters\r
+            simpliciti_data[0] = SYNC_ED_TYPE_STATUS;\r
+            // Send single reply packet\r
+            simpliciti_reply_count = 1;\r
+            break;\r
+\r
+        case SYNC_AP_CMD_SET_WATCH:  // Set watch parameters\r
+            sys.flag.use_metric_units = (simpliciti_data[1] >> 7) & 0x01;\r
+            sTime.hour = simpliciti_data[1] & 0x7F;\r
+            sTime.minute = simpliciti_data[2];\r
+            sTime.second = simpliciti_data[3];\r
+            sDate.year = (simpliciti_data[4] << 8) + simpliciti_data[5];\r
+            sDate.month = simpliciti_data[6];\r
+            sDate.day = simpliciti_data[7];\r
+            // Set temperature and temperature offset\r
+            t1 = (s16) ((simpliciti_data[10] << 8) + simpliciti_data[11]);\r
+            offset = t1 - (sAlt.temperature_C - sAlt.temperature_C_offset);\r
+            sAlt.temperature_C_offset = offset;\r
+            sAlt.temperature_C = t1;\r
+            // Set altitude\r
+            sAlt.altitude = (s16) ((simpliciti_data[12] << 8) + simpliciti_data[13]);\r
+            update_pressure_table(sAlt.altitude, sAlt.pressure, sAlt.temperature_K);\r
+            // Data logging mode\r
+            sDatalog.mode = simpliciti_data[14];\r
+            // Data logging interval\r
+            sDatalog.interval = simpliciti_data[15];\r
+\r
+            display_chars(LCD_SEG_L2_5_0, (u8 *) "  DONE", SEG_ON);\r
+            sRFsmpl.display_sync_done = 1;\r
+            break;\r
+\r
+        case SYNC_AP_CMD_GET_MEMORY_BLOCKS_MODE_1:\r
+            // Send sequential packets out in a burst\r
+            simpliciti_data[0] = SYNC_ED_TYPE_MEMORY;\r
+            // Get burst start and end packet\r
+            burst_start = (simpliciti_data[1] << 8) + simpliciti_data[2];\r
+            burst_end = (simpliciti_data[3] << 8) + simpliciti_data[4];\r
+            // Set burst mode\r
+            burst_mode = 1;\r
+            // Number of packets to send\r
+            simpliciti_reply_count = burst_end - burst_start + 1;\r
+            break;\r
+\r
+        case SYNC_AP_CMD_GET_MEMORY_BLOCKS_MODE_2:\r
+            // Send specified packets out in a burst\r
+            simpliciti_data[0] = SYNC_ED_TYPE_MEMORY;\r
+            // Store the requested packets\r
+            for (i = 0; i < BM_SYNC_BURST_PACKETS_IN_DATA; i++)\r
+            {\r
+                burst_packet[i] = (simpliciti_data[i * 2 + 1] << 8) + simpliciti_data[i * 2 + 2];\r
+            }\r
+            // Set burst mode\r
+            burst_mode = 2;\r
+            // Number of packets to send\r
+            simpliciti_reply_count = BM_SYNC_BURST_PACKETS_IN_DATA;\r
+            break;\r
+\r
+        case SYNC_AP_CMD_ERASE_MEMORY: // Erase data logger memory\r
+            for (i = DATALOG_PAGE_START; i <= DATALOG_PAGE_END; i++)\r
+            {\r
+                flash_erase_page(i);\r
+            }\r
+            sDatalog.wptr = (u16 *) DATALOG_MEMORY_START;\r
+            sDatalog.flags.flag.memory_full = 0;\r
+            break;\r
+\r
+        case SYNC_AP_CMD_EXIT:         // Exit sync mode\r
+            simpliciti_flag |= SIMPLICITI_TRIGGER_STOP;\r
+            break;\r
+    }\r
+\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          simpliciti_sync_get_data_callback\r
+// @brief       For SYNC mode only: Access point has requested data. Copy this data into the TX\r
+// buffer now.\r
+// @param       u16 index               Index used for memory requests\r
+// @return      none\r
+// *************************************************************************************************\r
+void simpliciti_sync_get_data_callback(unsigned int index)\r
+{\r
+    u8 i;\r
+    u16 bytes_ready;\r
+\r
+    volatile u16 addr, mem;\r
+\r
+    // Calculate bytes ready for sync\r
+    bytes_ready = (sDatalog.wptr - (u16 *) DATALOG_MEMORY_START) * 2;\r
+\r
+    // simpliciti_data[0] contains data type and needs to be returned to AP\r
+    switch (simpliciti_data[0])\r
+    {\r
+        case SYNC_ED_TYPE_STATUS: // Status packet\r
+            // Time\r
+            simpliciti_data[1] = (sys.flag.use_metric_units << 7) | (sTime.hour & 0x7F);\r
+            simpliciti_data[2] = sTime.minute;\r
+            simpliciti_data[3] = sTime.second;\r
+            // Date\r
+            simpliciti_data[4] = sDate.year >> 8;\r
+            simpliciti_data[5] = sDate.year & 0xFF;\r
+            simpliciti_data[6] = sDate.month;\r
+            simpliciti_data[7] = sDate.day;\r
+            // Unused\r
+            simpliciti_data[8] = 0;\r
+            simpliciti_data[9] = 0;\r
+            // Temperature\r
+            simpliciti_data[10] = sAlt.temperature_C >> 8;\r
+            simpliciti_data[11] = sAlt.temperature_C & 0xFF;\r
+            // Altitude\r
+            simpliciti_data[12] = sAlt.altitude >> 8;\r
+            simpliciti_data[13] = sAlt.altitude & 0xFF;\r
+            // Data logging mode\r
+            simpliciti_data[14] = sDatalog.mode;\r
+            // Data logging interval\r
+            simpliciti_data[15] = sDatalog.interval;\r
+            // Bytes ready for download\r
+            simpliciti_data[16] = bytes_ready >> 8;\r
+            simpliciti_data[17] = bytes_ready & 0xFF;\r
+            // Unused\r
+            simpliciti_data[18] = 0;\r
+\r
+            break;\r
+\r
+        case SYNC_ED_TYPE_MEMORY:\r
+            if (burst_mode == 1)\r
+            {\r
+                // Set burst packet address\r
+                simpliciti_data[1] = ((burst_start + index) >> 8) & 0xFF;\r
+                simpliciti_data[2] = (burst_start + index) & 0xFF;\r
+                // Assemble payload\r
+                flash_ptr = (u8 *) (DATALOG_MEMORY_START + (burst_start + index) * 16);\r
+                for (i = 3; i < BM_SYNC_DATA_LENGTH; i++)\r
+                    simpliciti_data[i] = *flash_ptr++;\r
+            }\r
+            else if (burst_mode == 2)\r
+            {\r
+                // Set burst packet address\r
+                simpliciti_data[1] = (burst_packet[index] >> 8) & 0xFF;\r
+                simpliciti_data[2] = burst_packet[index] & 0xFF;\r
+                // Assemble payload\r
+                flash_ptr = (u8 *) (DATALOG_MEMORY_START + burst_packet[index] * 16);\r
+                for (i = 3; i < BM_SYNC_DATA_LENGTH; i++)\r
+                    simpliciti_data[i] = *flash_ptr++;\r
+            }\r
+            break;\r
+    }\r
+}\r
+\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/logic/rfsimpliciti.h b/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/logic/rfsimpliciti.h
new file mode 100755 (executable)
index 0000000..3cf7902
--- /dev/null
@@ -0,0 +1,98 @@
+// *************************************************************************************************\r
+//\r
+//      Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//        Redistribution and use in source and binary forms, with or without\r
+//        modification, are permitted provided that the following conditions\r
+//        are met:\r
+//\r
+//          Redistributions of source code must retain the above copyright\r
+//          notice, this list of conditions and the following disclaimer.\r
+//\r
+//          Redistributions in binary form must reproduce the above copyright\r
+//          notice, this list of conditions and the following disclaimer in the\r
+//          documentation and/or other materials provided with the\r
+//          distribution.\r
+//\r
+//          Neither the name of Texas Instruments Incorporated nor the names of\r
+//          its contributors may be used to endorse or promote products derived\r
+//          from this software without specific prior written permission.\r
+//\r
+//        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+\r
+#ifndef RFSIMPLICITI_H_\r
+#define RFSIMPLICITI_H_\r
+\r
+// *************************************************************************************************\r
+// Include section\r
+\r
+// *************************************************************************************************\r
+// Prototypes section\r
+extern void reset_rf(void);\r
+extern void sx_rf(u8 line);\r
+extern void sx_ppt(u8 line);\r
+extern void sx_sync(u8 line);\r
+extern void display_rf(u8 line, u8 update);\r
+extern void display_ppt(u8 line, u8 update);\r
+extern void display_sync(u8 line, u8 update);\r
+extern void send_smpl_data(u16 data);\r
+extern u8 is_rf(void);\r
+\r
+// *************************************************************************************************\r
+// Defines section\r
+\r
+// SimpliciTI connection states\r
+typedef enum\r
+{\r
+    SIMPLICITI_OFF = 0,         // Not connected\r
+    SIMPLICITI_ACCELERATION,    // Transmitting acceleration data and button events\r
+    SIMPLICITI_BUTTONS,         // Transmitting button events\r
+    SIMPLICITI_SYNC             // Syncing\r
+} simpliciti_mode_t;\r
+\r
+// Stop SimpliciTI transmission after 60 minutes to save power\r
+#define SIMPLICITI_TIMEOUT                              (60 * 60u)\r
+\r
+// Button flags for SimpliciTI data\r
+#define SIMPLICITI_BUTTON_STAR                  (0x10)\r
+#define SIMPLICITI_BUTTON_NUM                   (0x20)\r
+#define SIMPLICITI_BUTTON_UP                    (0x30)\r
+\r
+// SimpliciTI mode flag\r
+#define SIMPLICITI_MOUSE_EVENTS                 (0x01)\r
+#define SIMPLICITI_KEY_EVENTS                   (0x02)\r
+\r
+// *************************************************************************************************\r
+// Global Variable section\r
+struct RFsmpl\r
+{\r
+    // SIMPLICITI_OFF, SIMPLICITI_ACCELERATION, SIMPLICITI_BUTTONS\r
+    simpliciti_mode_t mode;\r
+\r
+    // Timeout until SimpliciTI transmission is automatically stopped\r
+    u16 timeout;\r
+\r
+    // Variable to display\r
+    u8 display_sync_done;\r
+};\r
+extern struct RFsmpl sRFsmpl;\r
+\r
+extern unsigned char simpliciti_flag;\r
+\r
+// *************************************************************************************************\r
+// Extern section\r
+\r
+#endif                          /*RFSIMPLICITI_H_ */\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/logic/temperature.c b/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/logic/temperature.c
new file mode 100755 (executable)
index 0000000..5a4f897
--- /dev/null
@@ -0,0 +1,170 @@
+// *************************************************************************************************\r
+//\r
+//      Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//        Redistribution and use in source and binary forms, with or without\r
+//        modification, are permitted provided that the following conditions\r
+//        are met:\r
+//\r
+//          Redistributions of source code must retain the above copyright\r
+//          notice, this list of conditions and the following disclaimer.\r
+//\r
+//          Redistributions in binary form must reproduce the above copyright\r
+//          notice, this list of conditions and the following disclaimer in the\r
+//          documentation and/or other materials provided with the\r
+//          distribution.\r
+//\r
+//          Neither the name of Texas Instruments Incorporated nor the names of\r
+//          its contributors may be used to endorse or promote products derived\r
+//          from this software without specific prior written permission.\r
+//\r
+//        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+// Temperature measurement functions.\r
+// *************************************************************************************************\r
+\r
+// *************************************************************************************************\r
+// Include section\r
+\r
+// system\r
+#include "project.h"\r
+\r
+// driver\r
+#include "temperature.h"\r
+#include "display.h"\r
+\r
+// logic\r
+#include "altitude.h"\r
+\r
+// *************************************************************************************************\r
+// Prototypes section\r
+s16 convert_C_to_F(s16 value);\r
+s16 convert_F_to_C(s16 value);\r
+\r
+// *************************************************************************************************\r
+// Defines section\r
+\r
+// *************************************************************************************************\r
+// Global Variable section\r
+\r
+// *************************************************************************************************\r
+// Extern section\r
+\r
+// *************************************************************************************************\r
+// @fn          convert_C_to_F\r
+// @brief       Convert °C to °F\r
+// @param       s16 value               Temperature in °C\r
+// @return      s16                     Temperature in °F\r
+// *************************************************************************************************\r
+s16 convert_C_to_F(s16 value)\r
+{\r
+    s16 DegF;\r
+\r
+    // Celsius in Fahrenheit = (( TCelsius × 9 ) / 5 ) + 32\r
+    DegF = ((value * 9 * 10) / 5 / 10) + 32 * 10;\r
+\r
+    return (DegF);\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          convert_F_to_C\r
+// @brief       Convert °F to °C\r
+// @param       s16 value               Temperature in 2.1 °F\r
+// @return      s16                     Temperature in 2.1 °C\r
+// *************************************************************************************************\r
+s16 convert_F_to_C(s16 value)\r
+{\r
+    s16 DegC;\r
+\r
+    // TCelsius =( TFahrenheit - 32 ) × 5 / 9\r
+    DegC = (((value - 320) * 5)) / 9;\r
+\r
+    return (DegC);\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          display_temperature\r
+// @brief       Common display routine for metric and English units.\r
+// @param       u8 line                 LINE1\r
+//                              u8 update               DISPLAY_LINE_UPDATE_FULL, DISPLAY_LINE_CLEAR\r
+// @return      none\r
+// *************************************************************************************************\r
+void display_temperature(u8 line, u8 update)\r
+{\r
+    u8 *str;\r
+    s16 temperature;\r
+\r
+    // Redraw whole screen\r
+    if (update == DISPLAY_LINE_UPDATE_FULL)\r
+    {\r
+        // Start measurement\r
+        start_altitude_measurement();\r
+\r
+        // Display °C / °F\r
+        display_symbol(LCD_SEG_L1_DP1, SEG_ON);\r
+        display_symbol(LCD_UNIT_L1_DEGREE, SEG_ON);\r
+        if (sys.flag.use_metric_units)\r
+            display_char(LCD_SEG_L1_0, 'C', SEG_ON);\r
+        else\r
+            display_char(LCD_SEG_L1_0, 'F', SEG_ON);\r
+\r
+        // Display temperature\r
+        display_temperature(LINE1, DISPLAY_LINE_UPDATE_PARTIAL);\r
+    }\r
+    else if (update == DISPLAY_LINE_UPDATE_PARTIAL)\r
+    {\r
+        // When using English units, convert °C to °F (temp*1.8+32)\r
+        if (!sys.flag.use_metric_units)\r
+        {\r
+            temperature = convert_C_to_F(sAlt.temperature_C);\r
+        }\r
+        else\r
+        {\r
+            temperature = sAlt.temperature_C;\r
+        }\r
+\r
+        // Indicate temperature sign through arrow up/down icon\r
+        if (temperature < 0)\r
+        {\r
+            // Convert negative to positive number\r
+            temperature = ~temperature;\r
+            temperature += 1;\r
+\r
+            display_symbol(LCD_SYMB_ARROW_UP, SEG_OFF);\r
+            display_symbol(LCD_SYMB_ARROW_DOWN, SEG_ON);\r
+        }\r
+        else                    // Temperature is >= 0\r
+        {\r
+            display_symbol(LCD_SYMB_ARROW_UP, SEG_ON);\r
+            display_symbol(LCD_SYMB_ARROW_DOWN, SEG_OFF);\r
+        }\r
+\r
+        // Display result in xx.x format\r
+        str = int_to_array(temperature, 3, 1);\r
+        display_chars(LCD_SEG_L1_3_1, str, SEG_ON);\r
+    }\r
+    else if (update == DISPLAY_LINE_CLEAR)\r
+    {\r
+        // Stop measurement\r
+        stop_altitude_measurement();\r
+\r
+        // Clean up function-specific segments before leaving function\r
+        display_symbol(LCD_SYMB_ARROW_UP, SEG_OFF);\r
+        display_symbol(LCD_SYMB_ARROW_DOWN, SEG_OFF);\r
+        display_symbol(LCD_UNIT_L1_DEGREE, SEG_OFF);\r
+        display_symbol(LCD_SEG_L1_DP1, SEG_OFF);\r
+    }\r
+}\r
+\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/logic/temperature.h b/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/logic/temperature.h
new file mode 100755 (executable)
index 0000000..81121ac
--- /dev/null
@@ -0,0 +1,55 @@
+// *************************************************************************************************\r
+//\r
+//      Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//        Redistribution and use in source and binary forms, with or without\r
+//        modification, are permitted provided that the following conditions\r
+//        are met:\r
+//\r
+//          Redistributions of source code must retain the above copyright\r
+//          notice, this list of conditions and the following disclaimer.\r
+//\r
+//          Redistributions in binary form must reproduce the above copyright\r
+//          notice, this list of conditions and the following disclaimer in the\r
+//          documentation and/or other materials provided with the\r
+//          distribution.\r
+//\r
+//          Neither the name of Texas Instruments Incorporated nor the names of\r
+//          its contributors may be used to endorse or promote products derived\r
+//          from this software without specific prior written permission.\r
+//\r
+//        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+\r
+#ifndef TEMPERATURE_H_\r
+#define TEMPERATURE_H_\r
+\r
+// *************************************************************************************************\r
+// Include section\r
+\r
+// *************************************************************************************************\r
+// Prototypes section\r
+extern void display_temperature(u8 line, u8 update);\r
+\r
+// *************************************************************************************************\r
+// Defines section\r
+\r
+// *************************************************************************************************\r
+// Global Variable section\r
+\r
+// *************************************************************************************************\r
+// Extern section\r
+\r
+#endif                          /*TEMPERATURE_H_ */\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/logic/user.c b/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/logic/user.c
new file mode 100755 (executable)
index 0000000..6410d0b
--- /dev/null
@@ -0,0 +1,282 @@
+// *************************************************************************************************\r
+//\r
+//      Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//        Redistribution and use in source and binary forms, with or without\r
+//        modification, are permitted provided that the following conditions\r
+//        are met:\r
+//\r
+//          Redistributions of source code must retain the above copyright\r
+//          notice, this list of conditions and the following disclaimer.\r
+//\r
+//          Redistributions in binary form must reproduce the above copyright\r
+//          notice, this list of conditions and the following disclaimer in the\r
+//          documentation and/or other materials provided with the\r
+//          distribution.\r
+//\r
+//          Neither the name of Texas Instruments Incorporated nor the names of\r
+//          its contributors may be used to endorse or promote products derived\r
+//          from this software without specific prior written permission.\r
+//\r
+//        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+// Several user functions.\r
+// *************************************************************************************************\r
+\r
+// *************************************************************************************************\r
+// Include section\r
+\r
+// system\r
+#include "project.h"\r
+\r
+// driver\r
+#include "display.h"\r
+#include "buzzer.h"\r
+#include "ports.h"\r
+\r
+// logic\r
+#include "menu.h"\r
+#include "date.h"\r
+#include "clock.h"\r
+#include "user.h"\r
+\r
+// *************************************************************************************************\r
+// Prototypes section\r
+\r
+// *************************************************************************************************\r
+// Defines section\r
+\r
+// *************************************************************************************************\r
+// Global Variable section\r
+\r
+// *************************************************************************************************\r
+// Extern section\r
+extern void idle_loop(void);\r
+\r
+// *************************************************************************************************\r
+// @fn          dummy\r
+// @brief       Dummy direct function.\r
+// @param       u8 line LINE1, LINE2\r
+// @return      none\r
+// *************************************************************************************************\r
+void dummy(u8 line)\r
+{\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          set_value\r
+// @brief       Generic value setting routine\r
+// @param       s32 * value                                                     Pointer to value to\r
+// set\r
+//                              u8digits\r
+//                                                        Number of digits\r
+//                              u8 blanks\r
+//                                                       Number of whitespaces before first valid\r
+// digit\r
+//                              s32 limitLow                                            Lower limit\r
+// of value\r
+//                              s32 limitHigh                                           Upper limit\r
+// of value\r
+//                              u16 mode\r
+//                              u8 segments\r
+//                                                     Segments where value should be drawn\r
+//                              fptr_setValue_display_function1         Value-specific display\r
+// routine\r
+// @return      none\r
+// *************************************************************************************************\r
+void set_value(s32 * value, u8 digits, u8 blanks, s32 limitLow, s32 limitHigh, u16 mode,\r
+               u8 segments,\r
+               void (*fptr_setValue_display_function1)(u8 segments, u32 value, u8 digits,\r
+                                                       u8 blanks))\r
+{\r
+    u8 update;\r
+    s16 stepValue = 1;\r
+    u8 doRound = 0;\r
+    u32 val;\r
+\r
+    // Clear button flags\r
+    button.all_flags = 0;\r
+\r
+    // Clear blink memory\r
+    clear_blink_mem();\r
+\r
+    // For safety only - buzzer on/off and button_repeat share same IRQ\r
+    stop_buzzer();\r
+\r
+    // Init step size and repeat counter\r
+    sButton.repeats = 0;\r
+\r
+    // Initial display update\r
+    update = 1;\r
+\r
+    // Turn on 200ms button repeat function\r
+    button_repeat_on(200);\r
+\r
+    // Start blinking with with 2Hz\r
+    set_blink_rate(BIT6 + BIT5);\r
+\r
+    // Value set loop\r
+    while (1)\r
+    {\r
+        // Idle timeout: exit function\r
+        if (sys.flag.idle_timeout)\r
+            break;\r
+\r
+        // STAR (short) button: exit function\r
+        if (button.flag.star)\r
+            break;\r
+\r
+        // NUM button: exit function and goto to next value (if available)\r
+        if (button.flag.num)\r
+        {\r
+            if ((mode & SETVALUE_NEXT_VALUE) == SETVALUE_NEXT_VALUE)\r
+                break;\r
+        }\r
+\r
+        // UP button: increase value\r
+        if (button.flag.up)\r
+        {\r
+            // Increase value\r
+            *value = *value + stepValue;\r
+\r
+            // Check value limits\r
+            if (*value > limitHigh)\r
+            {\r
+                // Check if value can roll over, else stick to limit\r
+                if ((mode & SETVALUE_ROLLOVER_VALUE) == SETVALUE_ROLLOVER_VALUE)\r
+                    *value = limitLow;\r
+                else\r
+                    *value = limitHigh;\r
+\r
+                // Reset step size to default\r
+                stepValue = 1;\r
+            }\r
+\r
+            // Trigger display update\r
+            update = 1;\r
+\r
+            // Clear button flag\r
+            button.flag.up = 0;\r
+        }\r
+\r
+        // DOWN button: decrease value\r
+        if (button.flag.down)\r
+        {\r
+            // Decrease value\r
+            *value = *value - stepValue;\r
+\r
+            // Check value limits\r
+            if (*value < limitLow)\r
+            {\r
+                // Check if value can roll over, else stick to limit\r
+                if ((mode & SETVALUE_ROLLOVER_VALUE) == SETVALUE_ROLLOVER_VALUE)\r
+                    *value = limitHigh;\r
+                else\r
+                    *value = limitLow;\r
+\r
+                // Reset step size to default\r
+                stepValue = 1;\r
+            }\r
+\r
+            // Trigger display update\r
+            update = 1;\r
+\r
+            // Clear button flag\r
+            button.flag.down = 0;\r
+        }\r
+\r
+        // When fast mode is enabled, increase step size if Sx button is continuously\r
+        if ((mode & SETVALUE_FAST_MODE) == SETVALUE_FAST_MODE)\r
+        {\r
+            switch (sButton.repeats)\r
+            {\r
+                case 0:\r
+                    stepValue = 1;\r
+                    doRound = 0;\r
+                    break;\r
+                case 10:\r
+                case -10:\r
+                    stepValue = 10;\r
+                    doRound = 1;\r
+                    break;\r
+                case 20:\r
+                case -20:\r
+                    stepValue = 100;\r
+                    doRound = 1;\r
+                    break;\r
+                case 30:\r
+                case -30:\r
+                    stepValue = 1000;\r
+                    doRound = 1;\r
+                    break;\r
+            }\r
+\r
+            // Round value to avoid odd numbers on display\r
+            if (stepValue != 1 && doRound == 1)\r
+            {\r
+                *value -= *value % stepValue;\r
+                doRound = 0;\r
+            }\r
+        }\r
+\r
+        // Update display when there is new data\r
+        if (update)\r
+        {\r
+            // Display up or down arrow according to sign of value\r
+            if ((mode & SETVALUE_DISPLAY_ARROWS) == SETVALUE_DISPLAY_ARROWS)\r
+            {\r
+                if (*value >= 0)\r
+                {\r
+                    display_symbol(LCD_SYMB_ARROW_UP, SEG_ON);\r
+                    display_symbol(LCD_SYMB_ARROW_DOWN, SEG_OFF);\r
+                    val = *value;\r
+                }\r
+                else\r
+                {\r
+                    display_symbol(LCD_SYMB_ARROW_UP, SEG_OFF);\r
+                    display_symbol(LCD_SYMB_ARROW_DOWN, SEG_ON);\r
+                    val = *value * (-1);\r
+                }\r
+            }\r
+            else\r
+            {\r
+                val = *value;\r
+            }\r
+\r
+            // Display function can either display value directly, modify value before displaying\r
+            // or display a string referenced by the value\r
+            fptr_setValue_display_function1(segments, val, digits, blanks);\r
+\r
+            // Clear update flag\r
+            update = 0;\r
+        }\r
+\r
+        // Call idle loop to serve background tasks\r
+        idle_loop();\r
+\r
+    }\r
+\r
+    // Clear up and down arrows\r
+    display_symbol(LCD_SYMB_ARROW_UP, SEG_OFF);\r
+    display_symbol(LCD_SYMB_ARROW_DOWN, SEG_OFF);\r
+\r
+    // Set blinking rate to 1Hz and stop\r
+    set_blink_rate(BIT7 + BIT6 + BIT5);\r
+    clear_blink_mem();\r
+\r
+    // Turn off button repeat function\r
+    button_repeat_off();\r
+}\r
+\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/logic/user.h b/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/logic/user.h
new file mode 100755 (executable)
index 0000000..f48cea4
--- /dev/null
@@ -0,0 +1,59 @@
+// *************************************************************************************************\r
+//\r
+//      Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//        Redistribution and use in source and binary forms, with or without\r
+//        modification, are permitted provided that the following conditions\r
+//        are met:\r
+//\r
+//          Redistributions of source code must retain the above copyright\r
+//          notice, this list of conditions and the following disclaimer.\r
+//\r
+//          Redistributions in binary form must reproduce the above copyright\r
+//          notice, this list of conditions and the following disclaimer in the\r
+//          documentation and/or other materials provided with the\r
+//          distribution.\r
+//\r
+//          Neither the name of Texas Instruments Incorporated nor the names of\r
+//          its contributors may be used to endorse or promote products derived\r
+//          from this software without specific prior written permission.\r
+//\r
+//        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+\r
+#ifndef USER_H_\r
+#define USER_H_\r
+\r
+// *************************************************************************************************\r
+// Defines section\r
+#define SETVALUE_ROLLOVER_VALUE                         BIT0\r
+#define SETVALUE_DISPLAY_VALUE                          BIT1\r
+#define SETVALUE_DISPLAY_ARROWS                         BIT2\r
+#define SETVALUE_DISPLAY_SELECTION                      BIT3\r
+#define SETVALUE_FAST_MODE                                      BIT4\r
+#define SETVALUE_NEXT_VALUE                                     BIT5\r
+\r
+// *************************************************************************************************\r
+// Prototypes section\r
+extern u8 *select_view_style(u8 line, u8 * view1, u8 * view2);\r
+\r
+extern void (*fptr_setValue_display_function1)(u8 segments, u32 value, u8 digits, u8 blanks);\r
+extern void set_value(s32 * value, u8 digits, u8 blanks, s32 limitLow, s32 limitHigh, u16 mode,\r
+                      u8 segments,\r
+                      void (*fptr_setValue_display_function1)(u8 segments, u32 value, u8 digits,\r
+                                                              u8 blanks));\r
+extern void dummy(u8 line);\r
+\r
+#endif                          /*USER_H_ */\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/main.c b/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/main.c
new file mode 100755 (executable)
index 0000000..7c96545
--- /dev/null
@@ -0,0 +1,707 @@
+// *************************************************************************************************\r
+//\r
+//      Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//        Redistribution and use in source and binary forms, with or without\r
+//        modification, are permitted provided that the following conditions\r
+//        are met:\r
+//\r
+//          Redistributions of source code must retain the above copyright\r
+//          notice, this list of conditions and the following disclaimer.\r
+//\r
+//          Redistributions in binary form must reproduce the above copyright\r
+//          notice, this list of conditions and the following disclaimer in the\r
+//          documentation and/or other materials provided with the\r
+//          distribution.\r
+//\r
+//          Neither the name of Texas Instruments Incorporated nor the names of\r
+//          its contributors may be used to endorse or promote products derived\r
+//          from this software without specific prior written permission.\r
+//\r
+//        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+//\r
+//******************************************************************************\r
+//   eZ430-Chronos\r
+//\r
+//   Description: Software for the eZ430-Chronos Datalogger\r
+//\r
+//   P.Francisco\r
+//   Version    1.6\r
+//   Texas Instruments, Inc\r
+//   November 2010\r
+//   Known working builds:\r
+//     IAR Embedded Workbench (Version: 5.10.4)\r
+//     Code Composer Studio (Version  4.2.0.10012)\r
+//******************************************************************************\r
+//Change Log (More detailed information can be found in change_record.txt):\r
+//******************************************************************************\r
+//Version:  1.6\r
+//Comments: Several bugs were fixed.\r
+//          LCD shows "done" after successfully received data\r
+//          rfBSL requires two button presses in order to update watch\r
+//          New method detects a long button press\r
+//          Removed file display1.c. The content is now in display.c\r
+//          Backlight of Chronos stays on for 3 sec after backlight button was pushed.\r
+//\r
+//Version:  1.5\r
+//Comments: Changed XT1 drive level to highest\r
+//          Modified key lock procedure.\r
+//          Negative °C are now converted correctly to Kelvin\r
+//          Enabled fast mode when changing altitude offset\r
+//          Disabled stopwatch stop when watch buttons are locked\r
+//          Added SimpliciTI sources to project. Upgraded to Version 1.1.1.\r
+//          Changed button names from M1/M2/S1/S2/BL to STAR/NUM/UP/DOWN/BACKLIGHT\r
+//\r
+//Version:  1.4\r
+//Comments: Initial Release Version\r
+//**********************************************************************************\r
+\r
+// *************************************************************************************************\r
+// Initialization and control of application.\r
+// *************************************************************************************************\r
+\r
+// *************************************************************************************************\r
+// Include section\r
+\r
+// system\r
+#include "project.h"\r
+#include <string.h>\r
+\r
+// driver\r
+#include "clock.h"\r
+#include "display.h"\r
+#include "vti_as.h"\r
+#include "vti_ps.h"\r
+#include "radio.h"\r
+#include "buzzer.h"\r
+#include "ports.h"\r
+#include "timer.h"\r
+#include "pmm.h"\r
+\r
+// logic\r
+#include "menu.h"\r
+#include "date.h"\r
+#include "battery.h"\r
+#include "temperature.h"\r
+#include "altitude.h"\r
+#include "battery.h"\r
+#include "acceleration.h"\r
+#include "bluerobin.h"\r
+#include "rfsimpliciti.h"\r
+#include "simpliciti.h"\r
+#include "datalog.h"\r
+#include "rfbsl.h"\r
+\r
+// *************************************************************************************************\r
+// Prototypes section\r
+void init_application(void);\r
+void init_global_variables(void);\r
+void wakeup_event(void);\r
+void process_requests(void);\r
+void display_update(void);\r
+void idle_loop(void);\r
+void configure_ports(void);\r
+void read_calibration_values(void);\r
+\r
+// *************************************************************************************************\r
+// Defines section\r
+\r
+// Number of calibration data bytes in INFOA memory\r
+#define CALIBRATION_DATA_LENGTH         (13u)\r
+\r
+// *************************************************************************************************\r
+// Global Variable section\r
+\r
+// Variable holding system internal flags\r
+volatile s_system_flags sys;\r
+\r
+// Variable holding flags set by logic modules\r
+volatile s_request_flags request;\r
+\r
+// Variable holding message flags\r
+volatile s_message_flags message;\r
+\r
+// Global radio frequency offset taken from calibration memory\r
+// Compensates crystal deviation from 26MHz nominal value\r
+u8 rf_frequoffset;\r
+\r
+// Function pointers for LINE1 and LINE2 display function\r
+void (*fptr_lcd_function_line1)(u8 line, u8 update);\r
+void (*fptr_lcd_function_line2)(u8 line, u8 update);\r
+\r
+// *************************************************************************************************\r
+// Extern section\r
+\r
+// *************************************************************************************************\r
+// @fn          main\r
+// @brief       Main routine\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+int main(void)\r
+{\r
+    // Init MCU\r
+    init_application();\r
+\r
+    // Assign initial value to global variables\r
+    init_global_variables();\r
+\r
+    // Main control loop: wait in low power mode until some event needs to be processed\r
+    while (1)\r
+    {\r
+        // When idle go to LPM3\r
+        idle_loop();\r
+\r
+        // Process wake-up events\r
+        if (button.all_flags || sys.all_flags)\r
+            wakeup_event();\r
+\r
+        // Process actions requested by logic modules\r
+        if (request.all_flags)\r
+            process_requests();\r
+\r
+        // Before going to LPM3, update display\r
+        if (display.all_flags)\r
+            display_update();\r
+    }\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          init_application\r
+// @brief       Initialize the microcontroller.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void init_application(void)\r
+{\r
+    volatile unsigned char *ptr;\r
+\r
+    // ---------------------------------------------------------------------\r
+    // Enable watchdog\r
+\r
+    // Watchdog triggers after 16 seconds when not cleared\r
+#ifdef USE_WATCHDOG\r
+    WDTCTL = WDTPW + WDTIS__512K + WDTSSEL__ACLK;\r
+#else\r
+    WDTCTL = WDTPW + WDTHOLD;\r
+#endif\r
+\r
+    // ---------------------------------------------------------------------\r
+    // Configure PMM\r
+    SetVCore(3);\r
+\r
+    // Set global high power request enable\r
+    PMMCTL0_H = 0xA5;\r
+    PMMCTL0_L |= PMMHPMRE;\r
+    PMMCTL0_H = 0x00;\r
+\r
+    // ---------------------------------------------------------------------\r
+    // Enable 32kHz ACLK\r
+    P5SEL |= 0x03;              // Select XIN, XOUT on P5.0 and P5.1\r
+    UCSCTL6 &= ~XT1OFF;         // XT1 On, Highest drive strength\r
+    UCSCTL6 |= XCAP_3;          // Internal load cap\r
+    UCSCTL3 = SELA__XT1CLK;     // Select XT1 as FLL reference\r
+    UCSCTL4 = SELA__XT1CLK | SELS__DCOCLKDIV | SELM__DCOCLKDIV;\r
+\r
+    // ---------------------------------------------------------------------\r
+    // Configure CPU clock for 12MHz\r
+    _BIS_SR(SCG0);              // Disable the FLL control loop\r
+    UCSCTL0 = 0x0000;           // Set lowest possible DCOx, MODx\r
+    UCSCTL1 = DCORSEL_5;        // Select suitable range\r
+    UCSCTL2 = FLLD_1 + 0x16E;   // Set DCO Multiplier\r
+    _BIC_SR(SCG0);              // Enable the FLL control loop\r
+\r
+    // Worst-case settling time for the DCO when the DCO range bits have been\r
+    // changed is n x 32 x 32 x f_MCLK / f_FLL_reference. See UCS chapter in 5xx\r
+    // UG for optimization.\r
+    // 32 x 32 x 12 MHz / 32,768 Hz = 375000 = MCLK cycles for DCO to settle\r
+    __delay_cycles(375000);\r
+\r
+    // Loop until XT1 & DCO stabilizes, use do-while to insure that\r
+    // body is executed at least once\r
+    do\r
+    {\r
+        UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG + XT1HFOFFG + DCOFFG);\r
+        SFRIFG1 &= ~OFIFG;      // Clear fault flags\r
+    }\r
+    while ((SFRIFG1 & OFIFG));\r
+\r
+    // ---------------------------------------------------------------------\r
+    // Configure port mapping\r
+\r
+    // Disable all interrupts\r
+    __disable_interrupt();\r
+    // Get write-access to port mapping registers:\r
+    PMAPPWD = 0x02D52;\r
+    // Allow reconfiguration during runtime:\r
+    PMAPCTL = PMAPRECFG;\r
+\r
+    // P2.7 = TA0CCR1A or TA1CCR0A output (buzzer output)\r
+    ptr = &P2MAP0;\r
+    *(ptr + 7) = PM_TA1CCR0A;\r
+    P2OUT &= ~BIT7;\r
+    P2DIR |= BIT7;\r
+\r
+    // P1.5 = SPI MISO input\r
+    ptr = &P1MAP0;\r
+    *(ptr + 5) = PM_UCA0SOMI;\r
+    // P1.6 = SPI MOSI output\r
+    *(ptr + 6) = PM_UCA0SIMO;\r
+    // P1.7 = SPI CLK output\r
+    *(ptr + 7) = PM_UCA0CLK;\r
+\r
+    // Disable write-access to port mapping registers:\r
+    PMAPPWD = 0;\r
+    // Re-enable all interrupts\r
+    __enable_interrupt();\r
+\r
+    // ---------------------------------------------------------------------\r
+    // Configure ports\r
+\r
+    // ---------------------------------------------------------------------\r
+    // Reset radio core\r
+    radio_reset();\r
+    radio_powerdown();\r
+\r
+    // ---------------------------------------------------------------------\r
+    // Init acceleration sensor\r
+    as_init();\r
+\r
+    // ---------------------------------------------------------------------\r
+    // Init LCD\r
+    lcd_init();\r
+\r
+    // ---------------------------------------------------------------------\r
+    // Init buttons\r
+    init_buttons();\r
+\r
+    // ---------------------------------------------------------------------\r
+    // Configure Timer0 for use by the clock and delay functions\r
+    Timer0_Init();\r
+\r
+    // ---------------------------------------------------------------------\r
+    // Init pressure sensor\r
+    ps_init();\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          init_global_variables\r
+// @brief       Initialize global variables.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void init_global_variables(void)\r
+{\r
+    // --------------------------------------------\r
+    // Apply default settings\r
+\r
+    // set menu pointers to default menu items\r
+    ptrMenu_L1 = &menu_L1_Time;\r
+    ptrMenu_L2 = &menu_L2_DataLog;\r
+\r
+    // Assign LINE1 and LINE2 display functions\r
+    fptr_lcd_function_line1 = ptrMenu_L1->display_function;\r
+    fptr_lcd_function_line2 = ptrMenu_L2->display_function;\r
+\r
+    // Init system flags\r
+    button.all_flags = 0;\r
+    sys.all_flags = 0;\r
+    request.all_flags = 0;\r
+    display.all_flags = 0;\r
+    message.all_flags = 0;\r
+\r
+    // Force full display update when starting up\r
+    display.flag.full_update = 1;\r
+\r
+#ifndef ISM_US\r
+    // Use metric units for display\r
+    sys.flag.use_metric_units = 1;\r
+#endif\r
+\r
+    // Read calibration values from info memory\r
+    read_calibration_values();\r
+\r
+    // Set system time to default value\r
+    reset_clock();\r
+\r
+    // Set date to default value\r
+    reset_date();\r
+\r
+    // Set buzzer to default value\r
+    reset_buzzer();\r
+\r
+    // Reset altitude measurement\r
+    reset_altitude_measurement();\r
+\r
+    // Reset acceleration measurement\r
+    reset_acceleration();\r
+\r
+#ifdef INCLUDE_BLUEROBIN_SUPPORT\r
+    // Reset BlueRobin stack\r
+    reset_bluerobin();\r
+#endif\r
+\r
+    // Reset SimpliciTI stack\r
+    reset_rf();\r
+\r
+    // Reset battery measurement\r
+    reset_batt_measurement();\r
+\r
+    // Reset data logger\r
+    reset_datalog();\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          wakeup_event\r
+// @brief       Process external / internal wakeup events.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void wakeup_event(void)\r
+{\r
+    // Enable idle timeout\r
+    sys.flag.idle_timeout_enabled = 1;\r
+\r
+    // If buttons are locked, only display "buttons are locked" message\r
+    if (button.all_flags && sys.flag.lock_buttons)\r
+    {\r
+        // Show "buttons are locked" message synchronously with next second tick\r
+        if (!(BUTTON_NUM_IS_PRESSED && BUTTON_DOWN_IS_PRESSED))\r
+        {\r
+            message.flag.prepare = 1;\r
+            message.flag.type_locked = 1;\r
+        }\r
+\r
+        // Clear buttons\r
+        button.all_flags = 0;\r
+    }\r
+    // Process long button press event (while button is held)\r
+    else if (button.flag.star_long)\r
+    {\r
+        // Clear button event\r
+        button.flag.star_long = 0;\r
+\r
+        // Call sub menu function\r
+        ptrMenu_L1->mx_function(LINE1);\r
+\r
+        // Set display update flag\r
+        display.flag.full_update = 1;\r
+    }\r
+    else if (button.flag.num_long)\r
+    {\r
+        // Clear button event\r
+        button.flag.num_long = 0;\r
+\r
+        // Call sub menu function\r
+        ptrMenu_L2->mx_function(LINE2);\r
+\r
+        // Set display update flag\r
+        display.flag.full_update = 1;\r
+    }\r
+    // Process single button press event (after button was released)\r
+    else if (button.all_flags)\r
+    {\r
+        // STAR button event ---------------------------------------------------------------------\r
+        // (Short) Advance to next menu item\r
+        if (button.flag.star)\r
+        {\r
+            // Clean up display before activating next menu item\r
+            fptr_lcd_function_line1(LINE1, DISPLAY_LINE_CLEAR);\r
+\r
+            // Go to next menu entry\r
+            ptrMenu_L1 = ptrMenu_L1->next;\r
+\r
+            // Assign new display function\r
+            fptr_lcd_function_line1 = ptrMenu_L1->display_function;\r
+\r
+            // Set Line1 display update flag\r
+            display.flag.line1_full_update = 1;\r
+\r
+            // Clear button flag\r
+            button.flag.star = 0;\r
+        }\r
+        // NUM button event ---------------------------------------------------------------------\r
+        // (Short) Advance to next menu item\r
+        else if (button.flag.num)\r
+        {\r
+            // Clear rfBSL confirmation flag\r
+            rfBSL_button_confirmation = 0;\r
+\r
+            // Clean up display before activating next menu item\r
+            fptr_lcd_function_line2(LINE2, DISPLAY_LINE_CLEAR);\r
+\r
+            // Go to next menu entry\r
+            ptrMenu_L2 = ptrMenu_L2->next;\r
+\r
+            // Assign new display function\r
+            fptr_lcd_function_line2 = ptrMenu_L2->display_function;\r
+\r
+            // Set Line2 display update flag\r
+            display.flag.line2_full_update = 1;\r
+\r
+            // Clear button flag\r
+            button.flag.num = 0;\r
+        }\r
+        // UP button event ---------------------------------------------------------------------\r
+        // Activate user function for Line1 menu item\r
+        else if (button.flag.up)\r
+        {\r
+            // Call direct function\r
+            ptrMenu_L1->sx_function(LINE1);\r
+\r
+            // Set Line1 display update flag\r
+            display.flag.line1_full_update = 1;\r
+\r
+            // Clear button flag\r
+            button.flag.up = 0;\r
+        }\r
+        // DOWN button event ---------------------------------------------------------------------\r
+        // Activate user function for Line2 menu item\r
+        else if (button.flag.down)\r
+        {\r
+            // Call direct function\r
+            ptrMenu_L2->sx_function(LINE2);\r
+\r
+            // Set Line1 display update flag\r
+            display.flag.line2_full_update = 1;\r
+\r
+            // Clear button flag\r
+            button.flag.down = 0;\r
+        }\r
+    }\r
+\r
+    // Process internal events\r
+    if (sys.all_flags)\r
+    {\r
+        // Idle timeout ---------------------------------------------------------------------\r
+        if (sys.flag.idle_timeout)\r
+        {\r
+            // Clear timeout flag\r
+            sys.flag.idle_timeout = 0;\r
+\r
+            // Clear display\r
+            clear_display();\r
+\r
+            // Set display update flags\r
+            display.flag.full_update = 1;\r
+        }\r
+    }\r
+\r
+    // Disable idle timeout\r
+    sys.flag.idle_timeout_enabled = 0;\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          process_requests\r
+// @brief       Process requested actions outside ISR context.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void process_requests(void)\r
+{\r
+    // Do temperature and pressure measurement\r
+    if (request.flag.altitude_measurement)\r
+        do_altitude_measurement(FILTER_ON);\r
+\r
+    // Add data to datalog buffer\r
+    if (request.flag.datalog)\r
+        do_datalog();\r
+\r
+    // Do voltage measurement\r
+    if (request.flag.voltage_measurement)\r
+        battery_measurement();\r
+\r
+    // Reset request flag\r
+    request.all_flags = 0;\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          display_update\r
+// @brief       Process display flags and call LCD update routines.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void display_update(void)\r
+{\r
+    u8 line;\r
+    u8 string[8];\r
+\r
+    // ---------------------------------------------------------------------\r
+    // Call Line1 display function\r
+    if (display.flag.full_update || display.flag.line1_full_update)\r
+    {\r
+        clear_line(LINE1);\r
+        fptr_lcd_function_line1(LINE1, DISPLAY_LINE_UPDATE_FULL);\r
+    }\r
+    else if (ptrMenu_L1->display_update())\r
+    {\r
+        // Update line1 only when new data is available\r
+        fptr_lcd_function_line1(LINE1, DISPLAY_LINE_UPDATE_PARTIAL);\r
+    }\r
+\r
+    // ---------------------------------------------------------------------\r
+    // If message text should be displayed on Line2, skip normal update\r
+    if (message.flag.show)\r
+    {\r
+        // Select message to display\r
+        line = LINE2;\r
+        if (message.flag.type_locked)\r
+            memcpy(string, "  LO?T", 6);\r
+        else if (message.flag.type_unlocked)\r
+            memcpy(string, "  OPEN", 6);\r
+        else if (message.flag.type_lobatt)\r
+            memcpy(string, "LOBATT", 6);\r
+        else if (message.flag.type_nomem)\r
+            memcpy(string, " NOMEM", 6);\r
+        else\r
+        {\r
+            line = LINE1;\r
+            if (message.flag.type_on)\r
+                memcpy(string, "  ON", 4);\r
+            else if (message.flag.type_off)\r
+                memcpy(string, " OFF", 4);\r
+        }\r
+\r
+        // Clear previous content\r
+        clear_line(line);\r
+        fptr_lcd_function_line2(line, DISPLAY_LINE_CLEAR);\r
+\r
+        if (line == LINE2)\r
+            display_chars(LCD_SEG_L2_5_0, string, SEG_ON);\r
+        else\r
+            display_chars(LCD_SEG_L1_3_0, string, SEG_ON);\r
+\r
+        // Next second tick erases message and repaints original screen content\r
+        message.all_flags = 0;\r
+        message.flag.erase = 1;\r
+    }\r
+    // ---------------------------------------------------------------------\r
+    // Call Line2 display function\r
+    else if (display.flag.full_update || display.flag.line2_full_update)\r
+    {\r
+        clear_line(LINE2);\r
+        fptr_lcd_function_line2(LINE2, DISPLAY_LINE_UPDATE_FULL);\r
+    }\r
+    else if (ptrMenu_L2->display_update() && !message.all_flags)\r
+    {\r
+        // Update line2 only when new data is available\r
+        fptr_lcd_function_line2(LINE2, DISPLAY_LINE_UPDATE_PARTIAL);\r
+    }\r
+\r
+    // ---------------------------------------------------------------------\r
+    // Restore blinking icons (blinking memory is cleared when calling set_value)\r
+    if (display.flag.full_update)\r
+    {\r
+        if (is_bluerobin() == BLUEROBIN_CONNECTED)\r
+        {\r
+            // Turn on beeper icon to show activity\r
+            display_symbol(LCD_ICON_BEEPER1, SEG_ON_BLINK_OFF);\r
+            display_symbol(LCD_ICON_BEEPER2, SEG_ON_BLINK_OFF);\r
+            display_symbol(LCD_ICON_BEEPER3, SEG_ON_BLINK_OFF);\r
+        }\r
+    }\r
+\r
+    // Clear display flag\r
+    display.all_flags = 0;\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          to_lpm\r
+// @brief       Go to LPM0/3.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void to_lpm(void)\r
+{\r
+    // Go to LPM3\r
+    _BIS_SR(LPM3_bits + GIE);\r
+    __no_operation();\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          idle_loop\r
+// @brief       Go to LPM. Service watchdog timer when waking up.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void idle_loop(void)\r
+{\r
+    // To low power mode\r
+    to_lpm();\r
+\r
+#ifdef USE_WATCHDOG\r
+    // Service watchdog\r
+    WDTCTL = WDTPW + WDTIS__512K + WDTSSEL__ACLK + WDTCNTCL;\r
+#endif\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          read_calibration_values\r
+// @brief       Read calibration values for temperature measurement, voltage measurement\r
+//                              and radio from INFO memory.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void read_calibration_values(void)\r
+{\r
+    u8 cal_data[CALIBRATION_DATA_LENGTH]; // Temporary storage for constants\r
+    u8 i;\r
+    u8 *flash_mem;                        // Memory pointer\r
+\r
+    // Read calibration data from Info D memory\r
+    flash_mem = (u8 *) 0x1800;\r
+    for (i = 0; i < CALIBRATION_DATA_LENGTH; i++)\r
+    {\r
+        cal_data[i] = *flash_mem++;\r
+    }\r
+\r
+    if (cal_data[0] == 0xFF)\r
+    {\r
+        // If no values are available (i.e. INFO D memory has been erased by user), assign\r
+        // experimentally derived values\r
+        rf_frequoffset = 4;\r
+        sBatt.offset = -10;\r
+        simpliciti_ed_address[0] = 0x79;\r
+        simpliciti_ed_address[1] = 0x56;\r
+        simpliciti_ed_address[2] = 0x34;\r
+        simpliciti_ed_address[3] = 0x12;\r
+        sAlt.altitude_offset = 0;\r
+    }\r
+    else\r
+    {\r
+        // Assign calibration data to global variables\r
+        rf_frequoffset = cal_data[1];\r
+        // Range check for calibrated FREQEST value (-20 .. + 20 is ok, else use default value)\r
+        if ((rf_frequoffset > 20) && (rf_frequoffset < (256 - 20)))\r
+        {\r
+            rf_frequoffset = 0;\r
+        }\r
+        sBatt.offset = (s16) ((cal_data[4] << 8) + cal_data[5]);\r
+        simpliciti_ed_address[0] = cal_data[6];\r
+        simpliciti_ed_address[1] = cal_data[7];\r
+        simpliciti_ed_address[2] = cal_data[8];\r
+        simpliciti_ed_address[3] = cal_data[9];\r
+        // S/W version byte set during calibration?\r
+        if (cal_data[12] != 0xFF)\r
+        {\r
+            sAlt.altitude_offset = (s16) ((cal_data[10] << 8) + cal_data[11]);\r
+        }\r
+        else\r
+        {\r
+            sAlt.altitude_offset = 0;\r
+        }\r
+    }\r
+}\r
+\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/settings/ez430_chronos_datalogger.cspy.bat b/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/settings/ez430_chronos_datalogger.cspy.bat
new file mode 100755 (executable)
index 0000000..8523a0b
--- /dev/null
@@ -0,0 +1,15 @@
+@REM This batch file has been generated by the IAR Embedded Workbench\r
+@REM C-SPY Debugger, as an aid to preparing a command line for running\r
+@REM the cspybat command line utility using the appropriate settings.\r
+@REM\r
+@REM You can launch cspybat by typing the name of this batch file followed\r
+@REM by the name of the debug file (usually an ELF/DWARF or UBROF file).\r
+@REM Note that this file is generated every time a new debug session\r
+@REM is initialized, so you may want to move or rename the file before\r
+@REM making changes.\r
+@REM \r
+\r
+\r
+"C:\Program Files\IAR Systems\Embedded Workbench 6.0\common\bin\cspybat" "C:\Program Files\IAR Systems\Embedded Workbench 6.0\430\bin\430proc.dll" "C:\Program Files\IAR Systems\Embedded Workbench 6.0\430\bin\430fet.dll"  %1 --plugin "C:\Program Files\IAR Systems\Embedded Workbench 6.0\430\bin\430bat.dll" --backend -B "-p" "C:\Program Files\IAR Systems\Embedded Workbench 6.0\430\config\CC430F6137.ddf" "--core=430Xv2" "--data_model=small" "--iv_base" "0xFF80" "--no_wrap_around" "-d" "fet" "--erase_main" "--derivative" "CC430F6137" "--protocol" "spy-bi-wire" "--eem" "EMEX_SMALL_5XX" "--port" "Automatic" "--connection" "ti_usb" "--settlingtime=0" "--msp430_dll" "msp430.dll" "--vccDefault" "3.3" \r
+\r
+\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/settings/ez430_chronos_datalogger.dbgdt b/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/settings/ez430_chronos_datalogger.dbgdt
new file mode 100755 (executable)
index 0000000..c116f04
--- /dev/null
@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="iso-8859-1"?>\r
+\r
+<Project>\r
+  <Desktop>\r
+    <Static>\r
+      <Debug-Log>\r
+        \r
+        \r
+      <ColumnWidth0>20</ColumnWidth0><ColumnWidth1>1221</ColumnWidth1></Debug-Log>\r
+      <Build>\r
+        \r
+        \r
+        \r
+        \r
+      <ColumnWidth0>20</ColumnWidth0><ColumnWidth1>915</ColumnWidth1><ColumnWidth2>244</ColumnWidth2><ColumnWidth3>61</ColumnWidth3></Build>\r
+      <Workspace>\r
+        <ColumnWidths>\r
+          \r
+          \r
+          \r
+          \r
+        <Column0>298</Column0><Column1>27</Column1><Column2>27</Column2><Column3>27</Column3></ColumnWidths>\r
+      </Workspace>\r
+      <Disassembly>\r
+        \r
+        \r
+      <InstrProfShow>0</InstrProfShow><PreferedWindows><Position>2</Position><ScreenPosX>0</ScreenPosX><ScreenPosY>0</ScreenPosY><Windows/></PreferedWindows><MixedMode>1</MixedMode><CodeCovShow>0</CodeCovShow></Disassembly>\r
+    <Watch><Format><struct_types/><watch_formats/></Format><PreferedWindows><Position>2</Position><ScreenPosX>0</ScreenPosX><ScreenPosY>0</ScreenPosY><Windows><Window><Factory>Register</Factory></Window></Windows></PreferedWindows><Column0>285</Column0><Column1>201</Column1><Column2>100</Column2><Column3>100</Column3></Watch><Register><PreferedWindows><Position>2</Position><ScreenPosX>0</ScreenPosX><ScreenPosY>0</ScreenPosY><Windows><Window><Factory>Watch</Factory></Window></Windows></PreferedWindows></Register><Memory><FindDirection>1</FindDirection><FindAsHex>0</FindAsHex></Memory><Find-in-Files><ColumnWidth0>527</ColumnWidth0><ColumnWidth1>75</ColumnWidth1><ColumnWidth2>904</ColumnWidth2></Find-in-Files></Static>\r
+    <Windows>\r
+      \r
+      \r
+      \r
+    <Wnd0>\r
+        <Tabs>\r
+          <Tab>\r
+            <Identity>TabID-24903-19240</Identity>\r
+            <TabName>Debug Log</TabName>\r
+            <Factory>Debug-Log</Factory>\r
+            <Session/>\r
+          </Tab>\r
+          <Tab>\r
+            <Identity>TabID-24380-19250</Identity>\r
+            <TabName>Build</TabName>\r
+            <Factory>Build</Factory>\r
+            <Session/>\r
+          </Tab>\r
+        <Tab><Identity>TabID-20596-29664</Identity><TabName>Breakpoints</TabName><Factory>Breakpoints</Factory></Tab><Tab><Identity>TabID-125-5262</Identity><TabName>Memory</TabName><Factory>Memory</Factory><Session><ZoneNumber>0</ZoneNumber><SelectionAnchor>6144</SelectionAnchor><SelectionEnd>6144</SelectionEnd><UnitsPerGroup>1</UnitsPerGroup><EndianMode>0</EndianMode><DataCovEnabled>0</DataCovEnabled><DataCovShown>0</DataCovShown><HScroll>0</HScroll><VScroll>377</VScroll></Session></Tab><Tab><Identity>TabID-4077-5393</Identity><TabName>Find in Files</TabName><Factory>Find-in-Files</Factory><Session/></Tab></Tabs>\r
+        \r
+      <SelectedTab>0</SelectedTab></Wnd0><Wnd1>\r
+        <Tabs>\r
+          <Tab>\r
+            <Identity>TabID-2883-19244</Identity>\r
+            <TabName>Workspace</TabName>\r
+            <Factory>Workspace</Factory>\r
+            <Session>\r
+              \r
+            <NodeDict><ExpandedNode>ez430_chronos_datalogger</ExpandedNode></NodeDict></Session>\r
+          </Tab>\r
+        </Tabs>\r
+        \r
+      <SelectedTab>0</SelectedTab></Wnd1></Windows>\r
+    <Editor>\r
+      \r
+      \r
+      \r
+      \r
+    <Pane><Tab><Factory>TextEditor</Factory><Filename>$WS_DIR$\main.c</Filename><XPos>0</XPos><YPos>138</YPos><SelStart>5821</SelStart><SelEnd>5821</SelEnd></Tab><ActiveTab>0</ActiveTab></Pane><ActivePane>0</ActivePane><Sizes><Pane><X>1000000</X><Y>1000000</Y></Pane></Sizes><SplitMode>1</SplitMode></Editor>\r
+    <Positions>\r
+      \r
+      \r
+      \r
+      \r
+      \r
+    <Top><Row0><Sizes><Toolbar-012a1e20><key>iaridepm.enu1</key></Toolbar-012a1e20></Sizes></Row0><Row1><Sizes><Toolbar-06fd7b40><key>debuggergui.enu1</key></Toolbar-06fd7b40></Sizes></Row1><Row2><Sizes><Toolbar-06892a68><key>430fet1</key></Toolbar-06892a68></Sizes></Row2></Top><Left><Row0><Sizes><Wnd1><Rect><Top>-2</Top><Left>-2</Left><Bottom>595</Bottom><Right>372</Right><x>-2</x><y>-2</y><xscreen>180</xscreen><yscreen>273</yscreen><sizeHorzCX>140625</sizeHorzCX><sizeHorzCY>284969</sizeHorzCY><sizeVertCX>292188</sizeVertCX><sizeVertCY>623173</sizeVertCY></Rect></Wnd1></Sizes></Row0></Left><Right><Row0><Sizes/></Row0></Right><Bottom><Row0><Sizes><Wnd0><Rect><Top>-2</Top><Left>-2</Left><Bottom>271</Bottom><Right>1282</Right><x>-2</x><y>-2</y><xscreen>1284</xscreen><yscreen>273</yscreen><sizeHorzCX>1003125</sizeHorzCX><sizeHorzCY>284969</sizeHorzCY><sizeVertCX>140625</sizeVertCX><sizeVertCY>284969</sizeVertCY></Rect></Wnd0></Sizes></Row0></Bottom><Float><Sizes/></Float></Positions>\r
+  </Desktop>\r
+</Project>\r
+\r
+\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/settings/ez430_chronos_datalogger.dni b/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/settings/ez430_chronos_datalogger.dni
new file mode 100755 (executable)
index 0000000..c285ee1
--- /dev/null
@@ -0,0 +1,87 @@
+[DebugChecksum]\r
+Checksum=262336797\r
+[DisAssemblyWindow]\r
+NumStates=_ 1\r
+State 1=_ 1\r
+[CodeCoverage]\r
+Enabled=_ 0\r
+[Profiling]\r
+Enabled=0\r
+[StackPlugin]\r
+Enabled=1\r
+OverflowWarningsEnabled=1\r
+WarningThreshold=90\r
+SpWarningsEnabled=1\r
+WarnHow=0\r
+UseTrigger=1\r
+TriggerName=main\r
+LimitSize=0\r
+ByteLimit=50\r
+[State Storage]\r
+Control Register=0\r
+[Sequencer]\r
+Control Register=0\r
+NextState0=0\r
+NextState1=0\r
+[Action Register]\r
+Break=3\r
+State Storage=0\r
+[InstructionProfiling]\r
+Enabled=_ 0\r
+[Interrupts]\r
+Enabled=1\r
+[MemoryMap]\r
+Enabled=0\r
+Base=0\r
+UseAuto=0\r
+TypeViolation=1\r
+UnspecRange=1\r
+ActionState=1\r
+[TraceHelper]\r
+Enabled=0\r
+ShowSource=1\r
+[Log file]\r
+LoggingEnabled=_ 0\r
+LogFile=_ ""\r
+Category=_ 0\r
+[TermIOLog]\r
+LoggingEnabled=_ 0\r
+LogFile=_ ""\r
+[CallStackLog]\r
+Enabled=0\r
+[DriverProfiling]\r
+Enabled=0\r
+Mode=1229342020\r
+Graph=0\r
+Symbiont=0\r
+[Breakpoints]\r
+Bp0=_ "STD_CODE" "{$PROJ_DIR$\logic\bluerobin.c}.309.10@1" 0 0 0 0 "" 0 ""\r
+Bp1=_ "STD_CODE" "{$PROJ_DIR$\logic\bluerobin.c}.361.4@1" 0 0 0 0 "" 0 ""\r
+Bp2=_ "STD_CODE" "{$PROJ_DIR$\driver\radio.c}.185.8@1" 0 0 0 0 "" 0 ""\r
+Bp3=_ "STD_CODE" "{$PROJ_DIR$\driver\radio.c}.185.8@1" 0 0 0 0 "" 0 ""\r
+Bp4=_ "STD_CODE" "{$PROJ_DIR$\driver\radio.c}.185.8@1" 0 0 0 0 "" 0 ""\r
+Bp5=_ "STD_CODE" "{$PROJ_DIR$\logic\bluerobin.c}.291.4@1" 1 0 0 0 "" 0 ""\r
+Count=6\r
+[FET]\r
+Clock mode=14\r
+Extended Clock mode=61663\r
+Secure Password=\r
+Extended Clock Control Enable=1\r
+Advanced Extended Clock Control=0\r
+Emulation mode=0\r
+Free running=0\r
+Shutting Down=3\r
+[Memory Dump]\r
+Start address=\r
+Lenghth=\r
+Address info=0\r
+Format=0\r
+Dump registers=0\r
+PC=0\r
+SP=0\r
+SR=0\r
+all registers=0\r
+File name=\r
+[Aliases]\r
+Count=0\r
+SuppressDialog=0\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/settings/ez430_chronos_datalogger.wsdt b/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/settings/ez430_chronos_datalogger.wsdt
new file mode 100755 (executable)
index 0000000..91f2798
--- /dev/null
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="iso-8859-1"?>\r
+\r
+<Workspace>\r
+  <ConfigDictionary>\r
+    \r
+  <CurrentConfigs><Project>ez430_chronos_datalogger/433MHz - Unrestricted IAR Workbench (Other regions)</Project></CurrentConfigs></ConfigDictionary>\r
+  <Desktop>\r
+    <Static>\r
+      <Workspace>\r
+        <ColumnWidths>\r
+          \r
+          \r
+          \r
+          \r
+        <Column0>282</Column0><Column1>41</Column1><Column2>27</Column2><Column3>0</Column3></ColumnWidths>\r
+      <PreferedWindows><Position>1</Position><ScreenPosX>0</ScreenPosX><ScreenPosY>0</ScreenPosY><Windows><Window><Factory>SourceBrowser</Factory></Window></Windows></PreferedWindows></Workspace>\r
+    <Build><ColumnWidth0>20</ColumnWidth0><ColumnWidth1>915</ColumnWidth1><ColumnWidth2>244</ColumnWidth2><ColumnWidth3>61</ColumnWidth3></Build><TerminalIO/><Debug-Log><ColumnWidth0>20</ColumnWidth0><ColumnWidth1>1221</ColumnWidth1></Debug-Log><Find-in-Files><ColumnWidth0>471</ColumnWidth0><ColumnWidth1>67</ColumnWidth1><ColumnWidth2>807</ColumnWidth2></Find-in-Files><Tool-Output/><SourceBrowser><PreferedWindows><Position>1</Position><ScreenPosX>0</ScreenPosX><ScreenPosY>0</ScreenPosY><Windows><Window><Factory>Workspace</Factory></Window></Windows></PreferedWindows></SourceBrowser></Static>\r
+    <Windows>\r
+      \r
+    <Wnd2><Tabs><Tab><Identity>TabID-12355-9241</Identity><TabName>Build</TabName><Factory>Build</Factory><Session/></Tab><Tab><Identity>TabID-11374-19903</Identity><TabName>Debug Log</TabName><Factory>Debug-Log</Factory><Session/></Tab><Tab><Identity>TabID-19476-23171</Identity><TabName>Find in Files</TabName><Factory>Find-in-Files</Factory><Session/></Tab><Tab><Identity>TabID-26297-1149</Identity><TabName>Tool Output</TabName><Factory>Tool-Output</Factory><Session/></Tab></Tabs><SelectedTab>0</SelectedTab></Wnd2><Wnd3><Tabs><Tab><Identity>TabID-19628-18239</Identity><TabName>Workspace</TabName><Factory>Workspace</Factory><Session><NodeDict><ExpandedNode>ez430_chronos_datalogger</ExpandedNode></NodeDict></Session></Tab></Tabs><SelectedTab>0</SelectedTab></Wnd3></Windows>\r
+    <Editor>\r
+      \r
+      \r
+      \r
+      \r
+    <Pane><Tab><Factory>TextEditor</Factory><Filename>$WS_DIR$\main.c</Filename><XPos>0</XPos><YPos>24</YPos><SelStart>2578</SelStart><SelEnd>2578</SelEnd></Tab><Tab><Factory>TextEditor</Factory><Filename>$WS_DIR$\driver\timer.c</Filename><XPos>0</XPos><YPos>0</YPos><SelStart>364</SelStart><SelEnd>364</SelEnd></Tab><ActiveTab>1</ActiveTab></Pane><ActivePane>0</ActivePane><Sizes><Pane><X>1000000</X><Y>1000000</Y></Pane></Sizes><SplitMode>1</SplitMode></Editor>\r
+    <Positions>\r
+      \r
+      \r
+      \r
+      \r
+      \r
+    <Top><Row0><Sizes><Toolbar-012aaf10><key>iaridepm.enu1</key></Toolbar-012aaf10></Sizes></Row0></Top><Left><Row0><Sizes><Wnd3><Rect><Top>-2</Top><Left>-2</Left><Bottom>697</Bottom><Right>370</Right><x>-2</x><y>-2</y><xscreen>149</xscreen><yscreen>137</yscreen><sizeHorzCX>116406</sizeHorzCX><sizeHorzCY>143006</sizeHorzCY><sizeVertCX>290625</sizeVertCX><sizeVertCY>729645</sizeVertCY></Rect></Wnd3></Sizes></Row0></Left><Right><Row0><Sizes/></Row0></Right><Bottom><Row0><Sizes><Wnd2><Rect><Top>-2</Top><Left>-2</Left><Bottom>217</Bottom><Right>1282</Right><x>-2</x><y>-2</y><xscreen>1284</xscreen><yscreen>219</yscreen><sizeHorzCX>1003125</sizeHorzCX><sizeHorzCY>228601</sizeHorzCY><sizeVertCX>116406</sizeVertCX><sizeVertCY>188935</sizeVertCY></Rect></Wnd2></Sizes></Row0></Bottom><Float><Sizes/></Float></Positions>\r
+  </Desktop>\r
+</Workspace>\r
+\r
+\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/Applications/application/End Device/main_ED_BM.c b/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/Applications/application/End Device/main_ED_BM.c
new file mode 100755 (executable)
index 0000000..af83d41
--- /dev/null
@@ -0,0 +1,264 @@
+/**********************************************************************************************\r
+  Copyright 2007-2009 Texas Instruments Incorporated. All rights reserved.\r
+\r
+  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+  the terms of a software license agreement between the user who downloaded the software,\r
+  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+  License. The License limits your use, and you acknowledge, that the Software may not be\r
+  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+  perform, display or sell this Software and/or its documentation for any purpose.\r
+\r
+  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+\r
+  Should you have any questions regarding your right to use this Software,\r
+  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+// *************************************************************************************************\r
+// Include section\r
+#include "bsp.h"\r
+#include "mrfi.h"\r
+#include "nwk_types.h"\r
+#include "nwk_api.h"\r
+#include "bsp_leds.h"\r
+#include "bsp_buttons.h"\r
+#include "simpliciti.h"\r
+\r
+\r
+// *************************************************************************************************\r
+// Defines section\r
+#define TIMEOUT                                        (10u)\r
+\r
+// Conversion from msec to ACLK timer ticks\r
+#define CONV_MS_TO_TICKS(msec)                                 (((msec) * 32768) / 1000) \r
+\r
+// U16\r
+typedef unsigned short u16;\r
+\r
+// *************************************************************************************************\r
+// Prototypes section\r
+\r
+\r
+// *************************************************************************************************\r
+// Extern section\r
+extern uint8_t sInit_done;\r
+\r
+// SimpliciTI has no low power delay function, so we have to use ours\r
+extern void Timer0_A4_Delay(u16 ticks);\r
+\r
+\r
+// *************************************************************************************************\r
+// Global Variable section\r
+static linkID_t sLinkID1;\r
+\r
+\r
+\r
+// *************************************************************************************************\r
+// @fn          simpliciti_link\r
+// @brief       Init hardware and try to link to access point.\r
+// @param       none\r
+// @return      unsigned char          0 = Could not link, timeout or external cancel.\r
+//                                                                     1 = Linked successful.\r
+// *************************************************************************************************\r
+unsigned char simpliciti_link(void)\r
+{\r
+  uint8_t timeout;\r
+  addr_t lAddr;\r
+  uint8_t i;\r
+  uint8_t pwr;\r
+  \r
+  // Configure timer\r
+  BSP_InitBoard();\r
+  \r
+  // Change network address to value set in calling function\r
+  for (i=0; i<NET_ADDR_SIZE; i++)\r
+  {\r
+    lAddr.addr[i] = simpliciti_ed_address[i];\r
+  }\r
+  SMPL_Ioctl(IOCTL_OBJ_ADDR, IOCTL_ACT_SET, &lAddr);\r
+  \r
+  // Set flag  \r
+  simpliciti_flag = SIMPLICITI_STATUS_LINKING; \r
+       \r
+  /* Keep trying to join (a side effect of successful initialization) until\r
+   * successful. Toggle LEDS to indicate that joining has not occurred.\r
+   */\r
+  timeout = 0;\r
+  while (SMPL_SUCCESS != SMPL_Init(0))\r
+  {\r
+    NWK_DELAY(1000);\r
+\r
+    // Service watchdog\r
+       WDTCTL = WDTPW + WDTIS__512K + WDTSSEL__ACLK + WDTCNTCL;\r
+    \r
+    // Stop connecting after defined numbers of seconds (15)\r
+    if (timeout++ > TIMEOUT) \r
+    {\r
+               // Clean up SimpliciTI stack to enable restarting\r
+               sInit_done = 0;\r
+           simpliciti_flag = SIMPLICITI_STATUS_ERROR;\r
+               return (0);\r
+    }\r
+    \r
+    // Break when flag bit SIMPLICITI_TRIGGER_STOP is set\r
+    if (getFlag(simpliciti_flag, SIMPLICITI_TRIGGER_STOP)) \r
+    {\r
+               // Clean up SimpliciTI stack to enable restarting\r
+       sInit_done = 0;\r
+       return (0);\r
+       }\r
+  }\r
+  \r
+  // Set output power to +3.3dmB\r
+  pwr = IOCTL_LEVEL_2;\r
+  SMPL_Ioctl(IOCTL_OBJ_RADIO, IOCTL_ACT_RADIO_SETPWR, &pwr);\r
+\r
+  /* Unconditional link to AP which is listening due to successful join. */\r
+  timeout = 0;\r
+  while (SMPL_SUCCESS != SMPL_Link(&sLinkID1))\r
+  {\r
+    NWK_DELAY(1000);\r
+    \r
+    // Service watchdog\r
+       WDTCTL = WDTPW + WDTIS__512K + WDTSSEL__ACLK + WDTCNTCL;\r
+\r
+    // Stop linking after timeout\r
+    if (timeout++ > TIMEOUT) \r
+    {\r
+               // Clean up SimpliciTI stack to enable restarting\r
+               sInit_done = 0;\r
+           simpliciti_flag = SIMPLICITI_STATUS_ERROR;\r
+               return (0);\r
+    }\r
+    \r
+    // Exit when flag bit SIMPLICITI_TRIGGER_STOP is set\r
+    if (getFlag(simpliciti_flag, SIMPLICITI_TRIGGER_STOP)) \r
+    {\r
+       // Clean up SimpliciTI stack to enable restarting\r
+       sInit_done = 0;\r
+       return (0); \r
+       }\r
+  }\r
+  simpliciti_flag = SIMPLICITI_STATUS_LINKED;\r
+  \r
+  return (1);\r
+}\r
+\r
+\r
+\r
+// *************************************************************************************************\r
+// @fn          simpliciti_main_tx_only\r
+// @brief       Get data through callback. Transfer data when external trigger is set.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void simpliciti_main_tx_only(void)\r
+{\r
+  while(1)\r
+  {\r
+    // Get end device data from callback function \r
+    simpliciti_get_ed_data_callback();\r
+    \r
+    // Send data when flag bit SIMPLICITI_TRIGGER_SEND_DATA is set\r
+    if (getFlag(simpliciti_flag, SIMPLICITI_TRIGGER_SEND_DATA)) \r
+    {\r
+      // Get radio ready. Wakes up in IDLE state.\r
+      SMPL_Ioctl( IOCTL_OBJ_RADIO, IOCTL_ACT_RADIO_AWAKE, 0);\r
+      \r
+      // Acceleration / button events packets are 4 bytes long\r
+      SMPL_SendOpt(sLinkID1, simpliciti_data, 4, SMPL_TXOPTION_NONE);\r
+      \r
+      // Put radio back to SLEEP state\r
+      SMPL_Ioctl( IOCTL_OBJ_RADIO, IOCTL_ACT_RADIO_SLEEP, 0);\r
+      \r
+      clearFlag(simpliciti_flag, SIMPLICITI_TRIGGER_SEND_DATA);\r
+    }\r
+    \r
+    // Exit when flag bit SIMPLICITI_TRIGGER_STOP is set\r
+    if (getFlag(simpliciti_flag, SIMPLICITI_TRIGGER_STOP)) \r
+    {\r
+       // Clean up SimpliciTI stack to enable restarting\r
+       sInit_done = 0;\r
+           break;\r
+       }\r
+  }\r
+}\r
+\r
+\r
+\r
+// *************************************************************************************************\r
+// @fn          simpliciti_main_sync\r
+// @brief       Send ready-to-receive packets in regular intervals. Listen shortly for host reply.\r
+//                             Decode received host command and trigger action. \r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void simpliciti_main_sync(void)\r
+{\r
+       uint8_t len, i;\r
+       uint8_t ed_data[2];\r
+       \r
+       while(1)\r
+       {\r
+               // Sleep 0.5sec between ready-to-receive packets\r
+               // SimpliciTI has no low power delay function, so we have to use ours\r
+               Timer0_A4_Delay(CONV_MS_TO_TICKS(500));\r
+               \r
+               // Get radio ready. Radio wakes up in IDLE state.\r
+       SMPL_Ioctl( IOCTL_OBJ_RADIO, IOCTL_ACT_RADIO_AWAKE, 0);\r
+               \r
+               // Send 2 byte long ready-to-receive packet to stimulate host reply\r
+               ed_data[0] = SYNC_ED_TYPE_R2R;\r
+               ed_data[1] = 0xCB;\r
+               SMPL_SendOpt(sLinkID1, ed_data, 2, SMPL_TXOPTION_NONE);\r
+               \r
+               // Wait shortly for host reply\r
+               SMPL_Ioctl( IOCTL_OBJ_RADIO, IOCTL_ACT_RADIO_RXON, 0);\r
+               NWK_DELAY(10);\r
+       \r
+               // Check if a command packet was received\r
+               while (SMPL_Receive(sLinkID1, simpliciti_data, &len) == SMPL_SUCCESS)\r
+               {\r
+                       // Decode received data\r
+                       if (len > 0)\r
+                       {\r
+                               // Use callback function in application to decode data and react\r
+                               simpliciti_sync_decode_ap_cmd_callback();\r
+                               \r
+                               // Get reply data and send out reply packet burst (19 bytes each)\r
+                               for (i=0; i<simpliciti_reply_count; i++)\r
+                               {\r
+                                       NWK_DELAY(10);\r
+                                       simpliciti_sync_get_data_callback(i);\r
+                                       SMPL_SendOpt(sLinkID1, simpliciti_data, BM_SYNC_DATA_LENGTH, SMPL_TXOPTION_NONE);\r
+                               }\r
+                       }\r
+               }\r
+\r
+               // Put radio back to sleep              \r
+               SMPL_Ioctl( IOCTL_OBJ_RADIO, IOCTL_ACT_RADIO_SLEEP, 0);\r
+               \r
+               // Service watchdog\r
+               WDTCTL = WDTPW + WDTIS__512K + WDTSSEL__ACLK + WDTCNTCL;\r
+               \r
+               // Exit when flag bit SIMPLICITI_TRIGGER_STOP is set\r
+               if (getFlag(simpliciti_flag, SIMPLICITI_TRIGGER_STOP)) \r
+               {\r
+                       // Clean up SimpliciTI stack to enable restarting\r
+                       sInit_done = 0;\r
+                       break;\r
+               }\r
+       }\r
+}\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/Applications/configuration/End Device/smpl_config.dat b/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/Applications/configuration/End Device/smpl_config.dat
new file mode 100755 (executable)
index 0000000..ca3bfb4
--- /dev/null
@@ -0,0 +1,81 @@
+/**************************************************************************************************\r
+  Filename:       smpl_config.dat\r
+  Revised:        $Date: 2008-10-02 15:57:27 -0700 (Thu, 02 Oct 2008) $\r
+  Revision:       $Revision: 18187 $\r
+  Author:         $Author: lfriedman $\r
+\r
+  Description:    This file supports the SimpliciTI Customer Configuration for End Devices.\r
+\r
+  Copyright 2004-2007 Texas Instruments Incorporated. All rights reserved.\r
+\r
+  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+  the terms of a software license agreement between the user who downloaded the software,\r
+  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+  License. The License limits your use, and you acknowledge, that the Software may not be\r
+  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+  perform, display or sell this Software and/or its documentation for any purpose.\r
+\r
+  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+\r
+  Should you have any questions regarding your right to use this Software,\r
+  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+\r
+/* Number of connections supported. each connection supports bi-directional\r
+ * communication.  Access Points and Range Extenders can set this to 0 if they\r
+ * do not host End Device objects\r
+ */\r
+/*-DNUM_CONNECTIONS=2*/\r
+/* [BM] Only allow 1 connection to RF access point */\r
+-DNUM_CONNECTIONS=1\r
+\r
+/*  ***  Size of low level queues for sent and received frames. Affects RAM usage  ***  */\r
+\r
+/* AP needs larger input frame queue if it is supporting store-and-forward\r
+ * clients because the forwarded messages are held here. Two is probably enough\r
+ * for an End Device\r
+ */\r
+-DSIZE_INFRAME_Q=2\r
+\r
+/* The output frame queue can be small since Tx is done synchronously. Actually\r
+ * 1 is probably enough. If an Access Point device is also hosting an End Device \r
+ * that sends to a sleeping peer the output queue should be larger -- the waiting \r
+ * frames in this case are held here. In that case the output frame queue should \r
+ * be bigger. \r
+ */\r
+-DSIZE_OUTFRAME_Q=2\r
+\r
+/* This device's address. The first byte is used as a filter on the CC1100/CC2500\r
+ * radios so THE FIRST BYTE MUST NOT BE either 0x00 or 0xFF. Also, for these radios\r
+ * on End Devices the first byte should be the least significant byte so the filtering\r
+ * is maximally effective. Otherwise the frame has to be processed by the MCU before it\r
+ * is recognized as not intended for the device. APs and REs run in promiscuous mode so\r
+ * the filtering is not done. This macro intializes a static const array of unsigned\r
+ * characters of length NET_ADDR_SIZE (found in nwk_types.h). the quotes (") are\r
+ * necessary below unless the spaces are removed.\r
+ */\r
+-DTHIS_DEVICE_ADDRESS="{0x79, 0x56, 0x34, 0x12}"\r
+\r
+/* device type */\r
+-DEND_DEVICE\r
+\r
+/* For polling End Devices we need to specify that they do so. Uncomment the \r
+ * macro definition below if this is a polling device. This field is used \r
+ * by the Access Point to know whether to reserve store-and-forward support \r
+ * for the polling End Device during the Join exchange.\r
+ */\r
+/* -DRX_POLLS */\r
+\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/Applications/configuration/smpl_nwk_config.dat b/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/Applications/configuration/smpl_nwk_config.dat
new file mode 100755 (executable)
index 0000000..48119de
--- /dev/null
@@ -0,0 +1,80 @@
+/**************************************************************************************************\r
+  Filename:       smpl_nwk_config.dat\r
+  Revised:        $Date: 2009-02-07 14:21:07 -0700 (Sat, 07 Feb 2009) $\r
+  Revision:       $Revision: 19010 $\r
+  Author:         $Author: lfriedman $\r
+\r
+  Description:    This file supports the SimpliciTI Customer Configuration for overall network.\r
+\r
+  Copyright 2007-2009 Texas Instruments Incorporated. All rights reserved.\r
+\r
+  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+  the terms of a software license agreement between the user who downloaded the software,\r
+  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+  License. The License limits your use, and you acknowledge, that the Software may not be\r
+  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+  perform, display or sell this Software and/or its documentation for any purpose.\r
+\r
+  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+\r
+  Should you have any questions regarding your right to use this Software,\r
+  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+\r
+/* max hop count */\r
+-DMAX_HOPS=3\r
+\r
+/* max hops away from and AP. Keeps hop count and therefore replay\r
+ * storms down for sending to and from polling End Devices. Also used\r
+ * when joining since the EDs can't be more than 1 hop away.\r
+ */\r
+-DMAX_HOPS_FROM_AP=1\r
+\r
+/* Maximum size of Network application payload. Do not change unless\r
+ * protocol changes are reflected in different maximum network\r
+ * application payload size.\r
+ */\r
+-DMAX_NWK_PAYLOAD=9\r
+\r
+/* Maximum size of application payload */\r
+/*-DMAX_APP_PAYLOAD=10*/\r
+/* [BM] Need to increase max payload for sync application */\r
+-DMAX_APP_PAYLOAD=19\r
+\r
+/* default Link token */\r
+-DDEFAULT_LINK_TOKEN=0x01020304\r
+\r
+/* default Join token */\r
+-DDEFAULT_JOIN_TOKEN=0x05060708\r
+\r
+/* define Frequency Agility as active for this build */\r
+/* [BM] No need for frequency hopping */\r
+/*-DFREQUENCY_AGILITY*/\r
+\r
+/* Remove 'x' corruption to enable application autoacknowledge support. Requires extended API as well */\r
+-DAPP_AUTO_ACK\r
+\r
+/* Remove 'x' corruption to enable Extended API */\r
+-DEXTENDED_API\r
+\r
+/* Remove 'x' corruption to enable security. */\r
+-DxSMPL_SECURE\r
+\r
+/* Remove 'x' corruption to enable NV object support. */\r
+-DxNVOBJECT_SUPPORT\r
+\r
+/* Remove 'x' corruption to enable software timer. */\r
+-DSW_TIMER\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/CC430_End_Device_433MHz.r43 b/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/CC430_End_Device_433MHz.r43
new file mode 100755 (executable)
index 0000000..02df10a
Binary files /dev/null and b/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/CC430_End_Device_433MHz.r43 differ
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/CC430_End_Device_868MHz.r43 b/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/CC430_End_Device_868MHz.r43
new file mode 100755 (executable)
index 0000000..a5bfe63
Binary files /dev/null and b/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/CC430_End_Device_868MHz.r43 differ
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/CC430_End_Device_915MHz.r43 b/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/CC430_End_Device_915MHz.r43
new file mode 100755 (executable)
index 0000000..15d69bb
Binary files /dev/null and b/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/CC430_End_Device_915MHz.r43 differ
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/Components/bsp/boards/CC430EM/bsp_board.c b/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/Components/bsp/boards/CC430EM/bsp_board.c
new file mode 100755 (executable)
index 0000000..42be76e
--- /dev/null
@@ -0,0 +1,289 @@
+/**************************************************************************************************\r
+  Filename:       bsp_board.c\r
+  Revised:        $Date: 2009-10-11 16:48:20 -0700 (Sun, 11 Oct 2009) $\r
+  Revision:       $Revision: 20896 $\r
+\r
+  Copyright 2008-2009 Texas Instruments Incorporated.  All rights reserved.\r
+\r
+  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+  the terms of a software license agreement between the user who downloaded the software,\r
+  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+  License. The License limits your use, and you acknowledge, that the Software may not be\r
+  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+  perform, display or sell this Software and/or its documentation for any purpose.\r
+\r
+  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+\r
+  Should you have any questions regarding your right to use this Software,\r
+  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+/* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+ *   BSP (Board Support Package)\r
+ *   Target : Texas Instruments CC430EM\r
+ *   Top-level board code file.\r
+ * =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+ */\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                            Includes\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#include "bsp.h"\r
+#include "bsp_config.h"\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                            Prototypes\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+static void SetVCore(uint8_t level);\r
+static void SetVCoreUp(uint8_t level);\r
+static void SetVCoreDown(uint8_t level);\r
+static void Bsp_SetVCore(void);\r
+static void Bsp_SetClocks(void);\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                            Defines\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#define BSP_TIMER_CLK_MHZ   12       /* 12 MHz MCLKC and SMCLK */\r
+#define BSP_DELAY_MAX_USEC  (0xFFFF/BSP_TIMER_CLK_MHZ)\r
+\r
+/**************************************************************************************************\r
+ * @fn          SetVCore\r
+ *\r
+ * @brief       SetVCore level is called from the user API. Change level by one step only.\r
+ *\r
+ * @param       level - VcCore level\r
+ *\r
+ * @return      none\r
+ **************************************************************************************************\r
+ */\r
+static void SetVCore (uint8_t level)\r
+{\r
+  uint8_t actLevel;\r
+  do {\r
+    actLevel = PMMCTL0_L & PMMCOREV_3;\r
+    if (actLevel < level)\r
+      SetVCoreUp(++actLevel);               /* Set VCore (step by step) */\r
+    if (actLevel > level)\r
+      SetVCoreDown(--actLevel);             /* Set VCore (step by step) */\r
+  }while (actLevel != level);\r
+}\r
+\r
+/**************************************************************************************************\r
+ * @fn          SetVCoreUp\r
+ *\r
+ * @brief       Set VCore up. Change level by one step only.\r
+ *\r
+ * @param       level - VcCore level\r
+ *\r
+ * @return      none\r
+ *************************************************************************************************\r
+ */\r
+static void SetVCoreUp (uint8_t level)\r
+{\r
+  PMMCTL0_H = 0xA5;                          /* Open PMM module registers for write access */\r
+\r
+  SVSMHCTL = SVSHE + SVSHRVL0 * level + SVMHE + SVSMHRRL0 * level; /* Set SVS/M high side to new level */\r
+\r
+  SVSMLCTL = SVSLE + SVMLE + SVSMLRRL0 * level; /* Set SVM new Level */\r
+  while ((PMMIFG & SVSMLDLYIFG) == 0);       /* Wait till SVM is settled (Delay) */\r
+  PMMCTL0_L = PMMCOREV0 * level;             /* Set VCore to x */\r
+  PMMIFG &= ~(SVMLVLRIFG + SVMLIFG);         /* Clear already set flags */\r
+  if ((PMMIFG & SVMLIFG))\r
+    while ((PMMIFG & SVMLVLRIFG) == 0);      /* Wait till level is reached */\r
+\r
+  SVSMLCTL = SVSLE + SVSLRVL0 * level + SVMLE + SVSMLRRL0 * level;  /* Set SVS/M Low side to new level */\r
+  PMMCTL0_H = 0x00;                          /* Lock PMM module registers for write access */\r
+}\r
+\r
+/**************************************************************************************************\r
+ * @fn          SetVCoreDown\r
+ *\r
+ * @brief       Set VCore down\r
+ *\r
+ * @param       level - VcCore level\r
+ *\r
+ * @return      none\r
+ **************************************************************************************************\r
+ */\r
+static void SetVCoreDown (uint8_t level)\r
+{\r
+  PMMCTL0_H = 0xA5;                         /* Open PMM module registers for write access */\r
+  SVSMLCTL = SVSLE + SVSLRVL0 * level + SVMLE + SVSMLRRL0 * level; /* Set SVS/M Low side to new level */\r
+  while ((PMMIFG & SVSMLDLYIFG) == 0);      /* Wait till SVM is settled (Delay) */\r
+  PMMCTL0_L = (level * PMMCOREV0);          /* Set VCore to 1.85 V for Max Speed. */\r
+  PMMCTL0_H = 0x00;                         /* Lock PMM module registers for write access */\r
+}\r
+\r
+/**************************************************************************************************\r
+ * @fn          Bsp_SetVCore\r
+ *\r
+ * @brief       Setup the core voltage.\r
+ *\r
+ * @param       none\r
+ *\r
+ * @return      none\r
+ **************************************************************************************************\r
+ */\r
+static void Bsp_SetVCore(void)\r
+{\r
+  SetVCore(3);\r
+}\r
+\r
+/**************************************************************************************************\r
+ * @fn          Bsp_SetClocks\r
+ *\r
+ * @brief       Set up system clocks.\r
+ *\r
+ * @param       none\r
+ *\r
+ * @return      none\r
+ **************************************************************************************************\r
+ */\r
+static void Bsp_SetClocks(void)\r
+{\r
+  /* Configure CPU clock for 12MHz */\r
+\r
+  /* If clock settings are changed, remember to update BSP_TIMER_CLK_MHZ.\r
+   * Otherwise, all timer settings would be incorrect.\r
+   */\r
+  UCSCTL3 |= SELREF_2;                      /* Set DCO FLL reference = REFO */\r
+  UCSCTL4 |= SELA_2;                        /* Set ACLK = REFO */\r
+\r
+  __bis_SR_register(SCG0);                  /* Disable the FLL control loop */\r
+  UCSCTL0 = 0x0000;                         /* Set lowest possible DCOx, MODx */\r
+  UCSCTL1 = DCORSEL_5;                      /* Select DCO range 24MHz operation */\r
+  UCSCTL2 = FLLD_1 + 374;                   /* Set DCO Multiplier for 12MHz */\r
+                                            /* (N + 1) * FLLRef = Fdco */\r
+                                            /* (374 + 1) * 32768 = 12MHz */\r
+                                            /* Set FLL Div = fDCOCLK/2 */\r
+  __bic_SR_register(SCG0);                  /* Enable the FLL control loop */\r
+\r
+  /* Worst-case settling time for the DCO when the DCO range bits have been\r
+   * changed is n x 32 x 32 x f_MCLK / f_FLL_reference.\r
+   * 32 x 32 x 12 MHz / 32,768 Hz = 375000 = MCLK cycles for DCO to settle\r
+   */\r
+  __delay_cycles(375000);\r
+       \r
+  /* Loop until XT1,XT2 & DCO fault flag is cleared */\r
+  do\r
+  {\r
+    UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG + DCOFFG);\r
+                                            /* Clear XT2,XT1,DCO fault flags */\r
+    SFRIFG1 &= ~OFIFG;                      /* Clear fault flags */\r
+  }while (SFRIFG1&OFIFG);                   /* Test oscillator fault flag */\r
+\r
+  /* Select REFO as ACLK source and DCOCLK as MCLK and SMCLK source */\r
+  UCSCTL4 = SELA__REFOCLK | SELS__DCOCLKDIV | SELM__DCOCLKDIV;\r
+}\r
+\r
+/**************************************************************************************************\r
+ * @fn          BSP_EARLY_INIT\r
+ *\r
+ * @brief       This function is called by start-up code before doing the normal initialization\r
+ *              of data segments. If the return value is zero, initialization is not performed.\r
+ *              The global macro label "BSP_EARLY_INIT" gets #defined in the bsp_msp430_defs.h\r
+ *              file, according to the specific compiler environment (CCE or IAR). In the CCE\r
+ *              environment this macro invokes "_system_pre_init()" and in the IAR environment\r
+ *              this macro invokes "__low_level_init()".\r
+ *\r
+ * @param       None\r
+ *\r
+ * @return      0 - don't intialize data segments / 1 - do initialization\r
+ *************************************************************************************************\r
+ */\r
+BSP_EARLY_INIT(void)\r
+{\r
+  /* Disable watchdog timer */\r
+  WDTCTL = WDTPW | WDTHOLD;\r
+\r
+  /* Setup Vcore */\r
+  Bsp_SetVCore();\r
+\r
+  /* Configure System clocks */\r
+  Bsp_SetClocks();\r
+\r
+  /* Return 1 - run seg_init */\r
+  return (1);\r
+}\r
+\r
+/**************************************************************************************************\r
+ * @fn          BSP_InitBoard\r
+ *\r
+ * @brief       Initialize the board.\r
+ *\r
+ * @param       none\r
+ *\r
+ * @return      none\r
+ **************************************************************************************************\r
+ */\r
+void BSP_InitBoard(void)\r
+{\r
+  /* Configure TimerA for use by the delay function */\r
+\r
+  /* Reset the timer */\r
+  //TA0CTL |= TACLR; /* Set the TACLR  */\r
+\r
+  /* Clear all settings */\r
+  //TA0CTL = 0x0;\r
+\r
+  /* Select the clk source to be - SMCLK (Sub-Main CLK)*/\r
+  //TA0CTL |= TASSEL_2;\r
+  \r
+  // [BM] We need to use TA1 for delay function, because TA0 is already occupied\r
+  TA1CTL |= TACLR; /* Set the TACLR  */\r
+  TA1CTL = 0x0;\r
+  TA1CTL |= TASSEL_2;\r
+}\r
+\r
+/**************************************************************************************************\r
+ * @fn          BSP_Delay\r
+ *\r
+ * @brief       Delay for the requested amount of time.\r
+ *\r
+ * @param       # of microseconds to delay.\r
+ *\r
+ * @return      none\r
+ **************************************************************************************************\r
+ */\r
+void BSP_Delay(uint16_t usec)\r
+{\r
+  BSP_ASSERT(usec < BSP_DELAY_MAX_USEC);\r
+\r
+  //TA0R = 0; /* initial count  */\r
+  //TA0CCR0 = BSP_TIMER_CLK_MHZ*usec; /* compare count. (delay in ticks) */\r
+\r
+  /* Start the timer in UP mode */\r
+  //TA0CTL |= MC_1;\r
+\r
+  /* Loop till compare interrupt flag is set */\r
+  //while(!(TA0CCTL0 & CCIFG));\r
+\r
+  /* Stop the timer */\r
+  //TA0CTL &= ~(MC_1);\r
+\r
+  /* Clear the interrupt flag */\r
+   //TA0CCTL0 &= ~CCIFG;\r
+   \r
+  // [BM] We need to use TA1 for delay function, because TA0 is already occupied\r
+  TA1R = 0; \r
+  TA1CCR0 = BSP_TIMER_CLK_MHZ*usec; \r
+  TA1CTL |= MC_1;\r
+  while(!(TA1CCTL0 & CCIFG));\r
+  TA1CTL &= ~(MC_1);\r
+  TA1CCTL0 &= ~CCIFG;  \r
+}\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/Components/bsp/boards/CC430EM/bsp_board_defs.h b/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/Components/bsp/boards/CC430EM/bsp_board_defs.h
new file mode 100755 (executable)
index 0000000..f3e01ad
--- /dev/null
@@ -0,0 +1,83 @@
+/**************************************************************************************************\r
+  Revised:        $Date: 2007-07-06 11:19:00 -0700 (Fri, 06 Jul 2007) $\r
+  Revision:       $Revision: 13579 $\r
+\r
+  Copyright 2007 Texas Instruments Incorporated.  All rights reserved.\r
+\r
+  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+  the terms of a software license agreement between the user who downloaded the software,\r
+  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+  License. The License limits your use, and you acknowledge, that the Software may not be\r
+  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+  perform, display or sell this Software and/or its documentation for any purpose.\r
+\r
+  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+\r
+  Should you have any questions regarding your right to use this Software,\r
+  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+/* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+ *   BSP (Board Support Package)\r
+ *   Target : Texas Instruments CC430EM\r
+ *   Board definition file.\r
+ * =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+ */\r
+\r
+#ifndef BSP_BOARD_DEFS_H\r
+#define BSP_BOARD_DEFS_H\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                     Board Unique Define\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#define BSP_BOARD_CC430EM\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                           Mcu\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#include "mcus/bsp_msp430_defs.h"\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                          Clock\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#include "bsp_config.h"\r
+#define __bsp_CLOCK_MHZ__         BSP_CONFIG_CLOCK_MHZ\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                     Board Initialization\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#define BSP_BOARD_C               "bsp_board.c"\r
+#define BSP_INIT_BOARD()          BSP_InitBoard()\r
+#define BSP_DELAY_USECS(x)        BSP_Delay(x)\r
+\r
+void BSP_InitBoard(void);\r
+void BSP_Delay(uint16_t usec);\r
+\r
+/* ************************************************************************************************\r
+ *                                   Compile Time Integrity Checks\r
+ * ************************************************************************************************\r
+ */\r
+\r
+/**************************************************************************************************\r
+ */\r
+#endif\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/Components/bsp/boards/CC430EM/bsp_button_defs.h b/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/Components/bsp/boards/CC430EM/bsp_button_defs.h
new file mode 100755 (executable)
index 0000000..453863c
--- /dev/null
@@ -0,0 +1,91 @@
+/**************************************************************************************************\r
+  Revised:        $Date: 2007-07-06 11:19:00 -0700 (Fri, 06 Jul 2007) $\r
+  Revision:       $Revision: 13579 $\r
+\r
+  Copyright 2007 Texas Instruments Incorporated.  All rights reserved.\r
+\r
+  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+  the terms of a software license agreement between the user who downloaded the software,\r
+  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+  License. The License limits your use, and you acknowledge, that the Software may not be\r
+  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+  perform, display or sell this Software and/or its documentation for any purpose.\r
+\r
+  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+\r
+  Should you have any questions regarding your right to use this Software,\r
+  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+/* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+ *   BSP (Board Support Package)\r
+ *   Target : Texas Instruments CC430EM\r
+ *   Button definition file.\r
+ * =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+ */\r
+\r
+#ifndef BSP_BUTTON_DEFS_H\r
+#define BSP_BUTTON_DEFS_H\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                           Includes\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#include "bsp_board_defs.h"\r
+#include "bsp_macros.h"\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                      Button Configuration\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#define __bsp_NUM_BUTTONS__                   1\r
+#define __bsp_BUTTON_DEBOUNCE_WAIT__(expr)    st( int i; for(i=0; i<500; i++) { if (!(expr)) i = 0; } )\r
+\r
+\r
+/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+ *                 BUTTON #1\r
+ * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+ *   Schematic   :  S2\r
+ *   Description :  Push Button\r
+ *   Polarity    :  Active Low\r
+ *   GPIO        :  P1.7\r
+ * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+ */\r
+#define __bsp_BUTTON1_BIT__             7\r
+#define __bsp_BUTTON1_PORT__            P1IN\r
+#define __bsp_BUTTON1_IS_ACTIVE_LOW__   1\r
+\r
+\r
+/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+ *          Extended Configuration\r
+ * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+ */\r
+/* Enable the internal PullUp for button #1. */\r
+#define __bsp_BUTTON_EXTENDED_CONFIG__() st( P1OUT |= BV(__bsp_BUTTON1_BIT__); /* PullUp */ \\r
+                                             P1REN |= BV(__bsp_BUTTON1_BIT__);)/* Enable PullUp */\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                Include Generic Button Macros\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#include "code/bsp_generic_buttons.h"\r
+\r
+\r
+/**************************************************************************************************\r
+ */\r
+#endif\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/Components/bsp/boards/CC430EM/bsp_config.h b/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/Components/bsp/boards/CC430EM/bsp_config.h
new file mode 100755 (executable)
index 0000000..a4550e2
--- /dev/null
@@ -0,0 +1,47 @@
+/**************************************************************************************************\r
+  Revised:        $Date: 2007-07-06 11:19:00 -0700 (Fri, 06 Jul 2007) $\r
+  Revision:       $Revision: 13579 $\r
+\r
+  Copyright 2007 Texas Instruments Incorporated.  All rights reserved.\r
+\r
+  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+  the terms of a software license agreement between the user who downloaded the software,\r
+  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+  License. The License limits your use, and you acknowledge, that the Software may not be\r
+  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+  perform, display or sell this Software and/or its documentation for any purpose.\r
+\r
+  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+\r
+  Should you have any questions regarding your right to use this Software,\r
+  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+/* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+ *   BSP (Board Support Package)\r
+ *   Target : Texas Instruments CC430EM\r
+ *   Board configuration file.\r
+ * =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+ */\r
+\r
+#ifndef BSP_CONFIG_H\r
+#define BSP_CONFIG_H\r
+\r
+\r
+/* Nothing needed for this platform. */\r
+\r
+/**************************************************************************************************\r
+ */\r
+#endif\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/Components/bsp/boards/CC430EM/bsp_driver_defs.h b/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/Components/bsp/boards/CC430EM/bsp_driver_defs.h
new file mode 100755 (executable)
index 0000000..b3f7066
--- /dev/null
@@ -0,0 +1,54 @@
+/**************************************************************************************************\r
+  Revised:        $Date: 2007-07-06 11:19:00 -0700 (Fri, 06 Jul 2007) $\r
+  Revision:       $Revision: 13579 $\r
+\r
+  Copyright 2007 Texas Instruments Incorporated.  All rights reserved.\r
+\r
+  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+  the terms of a software license agreement between the user who downloaded the software,\r
+  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+  License. The License limits your use, and you acknowledge, that the Software may not be\r
+  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+  perform, display or sell this Software and/or its documentation for any purpose.\r
+\r
+  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+\r
+  Should you have any questions regarding your right to use this Software,\r
+  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+/* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+ *   BSP (Board Support Package)\r
+ *   Target : Texas Instruments CC430EM\r
+ *   Driver definition file.\r
+ * =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+ */\r
+\r
+#ifndef BSP_DRIVER_DEFS_H\r
+#define BSP_DRIVER_DEFS_H\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                     Driver Initialization\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#define BSP_DRIVERS_C               "bsp_drivers.c"\r
+#define BSP_INIT_DRIVERS()          BSP_InitDrivers()\r
+void BSP_InitDrivers(void);\r
+\r
+\r
+/**************************************************************************************************\r
+ */\r
+#endif\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/Components/bsp/boards/CC430EM/bsp_drivers.c b/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/Components/bsp/boards/CC430EM/bsp_drivers.c
new file mode 100755 (executable)
index 0000000..563f59c
--- /dev/null
@@ -0,0 +1,88 @@
+/**************************************************************************************************\r
+  Revised:        $Date: 2007-07-06 11:19:00 -0700 (Fri, 06 Jul 2007) $\r
+  Revision:       $Revision: 13579 $\r
+\r
+  Copyright 2007 Texas Instruments Incorporated.  All rights reserved.\r
+\r
+  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+  the terms of a software license agreement between the user who downloaded the software,\r
+  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+  License. The License limits your use, and you acknowledge, that the Software may not be\r
+  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+  perform, display or sell this Software and/or its documentation for any purpose.\r
+\r
+  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+\r
+  Should you have any questions regarding your right to use this Software,\r
+  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+/* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+ *   BSP (Board Support Package)\r
+ *   Target : Texas Instruments CC430EM\r
+ *   Top-level driver file.\r
+ * =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+ */\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                            Includes\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#include "bsp_driver_defs.h"\r
+#include "bsp_leds.h"\r
+#include "bsp_buttons.h"\r
+#include "bsp_config.h"\r
+\r
+\r
+/**************************************************************************************************\r
+ * @fn          BSP_InitDrivers\r
+ *\r
+ * @brief       Initialize all enabled BSP drivers.\r
+ *\r
+ * @param       none\r
+ *\r
+ * @return      none\r
+ **************************************************************************************************\r
+ */\r
+void BSP_InitDrivers(void)\r
+{\r
+#if (!defined BSP_NO_LEDS)\r
+  BSP_InitLeds();\r
+#endif\r
+\r
+#if (!defined BSP_NO_BUTTONS)\r
+  BSP_InitButtons();\r
+#endif\r
+}\r
+\r
+\r
+/* ================================================================================================\r
+ *                                        C Code Includes\r
+ * ================================================================================================\r
+ */\r
+#ifndef BSP_NO_LEDS\r
+#include "drivers/code/bsp_leds.c"\r
+#endif\r
+\r
+#ifndef BSP_NO_BUTTONS\r
+#include "drivers/code/bsp_buttons.c"\r
+#endif\r
+\r
+\r
+/**************************************************************************************************\r
+*/\r
+\r
+\r
+\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/Components/bsp/boards/CC430EM/bsp_external/mrfi_board_defs.h b/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/Components/bsp/boards/CC430EM/bsp_external/mrfi_board_defs.h
new file mode 100755 (executable)
index 0000000..38840c0
--- /dev/null
@@ -0,0 +1,81 @@
+/**************************************************************************************************\r
+  Revised:        $Date: 2007-07-06 11:19:00 -0700 (Fri, 06 Jul 2007) $\r
+  Revision:       $Revision: 13579 $\r
+\r
+  Copyright 2007 Texas Instruments Incorporated.  All rights reserved.\r
+\r
+  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+  the terms of a software license agreement between the user who downloaded the software,\r
+  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+  License. The License limits your use, and you acknowledge, that the Software may not be\r
+  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+  perform, display or sell this Software and/or its documentation for any purpose.\r
+\r
+  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+\r
+  Should you have any questions regarding your right to use this Software,\r
+  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+/* ~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=\r
+ *   MRFI (Minimal RF Interface)\r
+ *   Board definition file.\r
+ *   Target : Texas Instruments CC430EM\r
+ *   Radios : CC430\r
+ * ~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=\r
+ */\r
+\r
+#ifndef MRFI_BOARD_DEFS_H\r
+#define MRFI_BOARD_DEFS_H\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                           Includes\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#include "bsp.h"\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                           Defines\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                        Radio Selection\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#if (!defined MRFI_CC430)\r
+  #error "ERROR: A compatible radio must be specified for the CC430EM board."\r
+#endif\r
+\r
+\r
+/* Radio Interface critical section macros */\r
+typedef bspIState_t mrfiRIFIState_t;\r
+#define MRFI_RIF_ENTER_CRITICAL_SECTION(x)    BSP_ENTER_CRITICAL_SECTION(x)\r
+#define MRFI_RIF_EXIT_CRITICAL_SECTION(x)     BSP_EXIT_CRITICAL_SECTION(x)\r
+\r
+\r
+/**************************************************************************************************\r
+ *                                  Compile Time Integrity Checks\r
+ **************************************************************************************************\r
+ */\r
+#ifndef BSP_BOARD_CC430EM\r
+#error "ERROR: Mismatch between specified board and MRFI configuration."\r
+#endif\r
+\r
+\r
+/**************************************************************************************************\r
+ */\r
+#endif\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/Components/bsp/boards/CC430EM/bsp_led_defs.h b/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/Components/bsp/boards/CC430EM/bsp_led_defs.h
new file mode 100755 (executable)
index 0000000..5cd33b6
--- /dev/null
@@ -0,0 +1,97 @@
+/**************************************************************************************************\r
+  Revised:        $Date: 2007-07-06 11:19:00 -0700 (Fri, 06 Jul 2007) $\r
+  Revision:       $Revision: 13579 $\r
+\r
+  Copyright 2007 Texas Instruments Incorporated.  All rights reserved.\r
+\r
+  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+  the terms of a software license agreement between the user who downloaded the software,\r
+  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+  License. The License limits your use, and you acknowledge, that the Software may not be\r
+  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+  perform, display or sell this Software and/or its documentation for any purpose.\r
+\r
+  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+\r
+  Should you have any questions regarding your right to use this Software,\r
+  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+/* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+ *   BSP (Board Support Package)\r
+ *   Target : Texas Instruments CC430EM\r
+ *   LED definition file.\r
+ * =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+ */\r
+\r
+#ifndef BSP_LED_DEFS_H\r
+#define BSP_LED_DEFS_H\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                           Includes\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#include "bsp_board_defs.h"\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                      Configuration\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#define __bsp_NUM_LEDS__               2\r
+#define __bsp_LED_BLINK_LOOP_COUNT__   0x34000\r
+\r
+\r
+/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+ *                 LED #1\r
+ * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+ *   Schematic :  LED1\r
+ *   Color     :  Green\r
+ *   Polarity  :  Active High\r
+ *   GPIO      :  P1.0\r
+ * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+ */\r
+#define __bsp_LED1_BIT__            0\r
+#define __bsp_LED1_PORT__           P1OUT\r
+#define __bsp_LED1_DDR__            P1DIR\r
+#define __bsp_LED1_IS_ACTIVE_LOW__  0\r
+\r
+\r
+/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+ *                 LED #2\r
+ * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+ *   Schematic :  LED2\r
+ *   Color     :  Green\r
+ *   Polarity  :  Active High\r
+ *   GPIO      :  P3.6\r
+ * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+ */\r
+#define __bsp_LED2_BIT__            6\r
+#define __bsp_LED2_PORT__           P3OUT\r
+#define __bsp_LED2_DDR__            P3DIR\r
+#define __bsp_LED2_IS_ACTIVE_LOW__  0\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                 Include Generic LED Macros\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#include "code/bsp_generic_leds.h"\r
+\r
+\r
+/**************************************************************************************************\r
+ */\r
+#endif\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/Components/bsp/bsp.c b/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/Components/bsp/bsp.c
new file mode 100755 (executable)
index 0000000..cee0b33
--- /dev/null
@@ -0,0 +1,101 @@
+/**************************************************************************************************\r
+  Revised:        $Date: 2007-07-06 11:19:00 -0700 (Fri, 06 Jul 2007) $\r
+  Revision:       $Revision: 13579 $\r
+\r
+  Copyright 2007 Texas Instruments Incorporated.  All rights reserved.\r
+\r
+  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+  the terms of a software license agreement between the user who downloaded the software,\r
+  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+  License. The License limits your use, and you acknowledge, that the Software may not be\r
+  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+  perform, display or sell this Software and/or its documentation for any purpose.\r
+\r
+  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+\r
+  Should you have any questions regarding your right to use this Software,\r
+  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+/* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+ *   BSP (Board Support Package)\r
+ *   Top-level BSP code file.\r
+ * =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+ */\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                            Includes\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#include "bsp.h"\r
+#include "bsp_driver_defs.h"\r
+\r
+\r
+/**************************************************************************************************\r
+ * @fn          BSP_Init\r
+ *\r
+ * @brief       Initialize the board and drivers.\r
+ *\r
+ * @param       none\r
+ *\r
+ * @return      none\r
+ **************************************************************************************************\r
+ */\r
+void BSP_Init(void)\r
+{\r
+  BSP_INIT_BOARD();\r
+  BSP_INIT_DRIVERS();\r
+\r
+  /*-------------------------------------------------------------\r
+   *  Run time integrity checks.  Perform only if asserts\r
+   *  are enabled.\r
+   */\r
+#ifdef BSP_ASSERTS_ARE_ON\r
+  /* verify endianess is correctly specified */\r
+  {\r
+    uint16_t test = 0x00AA; /* first storage byte of 'test' is non-zero for little endian */\r
+    BSP_ASSERT(!(*((uint8_t *)&test)) == !BSP_LITTLE_ENDIAN); /* endianess mismatch */\r
+  }\r
+#endif\r
+}\r
+\r
+\r
+/* ================================================================================================\r
+ *                                        C Code Includes\r
+ * ================================================================================================\r
+ */\r
+#ifdef BSP_BOARD_C\r
+#include BSP_BOARD_C\r
+#endif\r
+\r
+#ifdef BSP_DRIVERS_C\r
+#include BSP_DRIVERS_C\r
+#endif\r
+\r
+\r
+/* ************************************************************************************************\r
+ *                                   Compile Time Integrity Checks\r
+ * ************************************************************************************************\r
+ */\r
+BSP_STATIC_ASSERT( sizeof(  uint8_t ) == 1 );\r
+BSP_STATIC_ASSERT( sizeof(   int8_t ) == 1 );\r
+BSP_STATIC_ASSERT( sizeof( uint16_t ) == 2 );\r
+BSP_STATIC_ASSERT( sizeof(  int16_t ) == 2 );\r
+BSP_STATIC_ASSERT( sizeof( uint32_t ) == 4 );\r
+BSP_STATIC_ASSERT( sizeof(  int32_t ) == 4 );\r
+\r
+\r
+/**************************************************************************************************\r
+ */\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/Components/bsp/bsp.h b/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/Components/bsp/bsp.h
new file mode 100755 (executable)
index 0000000..8cff5a0
--- /dev/null
@@ -0,0 +1,183 @@
+/**************************************************************************************************\r
+  Revised:        $Date: 2007-07-06 11:19:00 -0700 (Fri, 06 Jul 2007) $\r
+  Revision:       $Revision: 13579 $\r
+\r
+  Copyright 2007 Texas Instruments Incorporated.  All rights reserved.\r
+\r
+  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+  the terms of a software license agreement between the user who downloaded the software,\r
+  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+  License. The License limits your use, and you acknowledge, that the Software may not be\r
+  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+  perform, display or sell this Software and/or its documentation for any purpose.\r
+\r
+  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+\r
+  Should you have any questions regarding your right to use this Software,\r
+  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+/* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+ *   BSP (Board Support Package)\r
+ *   Include file for core BSP services.\r
+ * =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+ */\r
+\r
+#ifndef BSP_H\r
+#define BSP_H\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                           Includes\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#include "bsp_board_defs.h"\r
+#include "bsp_macros.h"\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                          BSP Defines\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#define BSP\r
+#define BSP_VER       100  /* BSP version 1.00a */\r
+#define BSP_SUBVER    a\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                            Clock\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#define BSP_CLOCK_MHZ   __bsp_CLOCK_MHZ__\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                            Memory\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#ifndef __bsp_LITTLE_ENDIAN__\r
+#error ERROR: Endianess not defined\r
+#endif\r
+\r
+#define BSP_LITTLE_ENDIAN   __bsp_LITTLE_ENDIAN__\r
+\r
+#define CODE    __bsp_CODE_MEMSPACE__\r
+#define XDATA   __bsp_XDATA_MEMSPACE__\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                            Interrupts\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#define BSP_ISR_FUNCTION(func,vect)     __bsp_ISR_FUNCTION__(func,vect)\r
+\r
+#define BSP_ENABLE_INTERRUPTS()         __bsp_ENABLE_INTERRUPTS__()\r
+#define BSP_DISABLE_INTERRUPTS()        __bsp_DISABLE_INTERRUPTS__()\r
+#define BSP_INTERRUPTS_ARE_ENABLED()    __bsp_INTERRUPTS_ARE_ENABLED__()\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                         Critical Sections\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+typedef __bsp_ISTATE_T__  bspIState_t;\r
+\r
+#define BSP_ENTER_CRITICAL_SECTION(x)   st( x = __bsp_GET_ISTATE__(); __bsp_DISABLE_INTERRUPTS__(); )\r
+#define BSP_EXIT_CRITICAL_SECTION(x)    __bsp_RESTORE_ISTATE__(x)\r
+#define BSP_CRITICAL_STATEMENT(x)       st( bspIState_t s;                    \\r
+                                            BSP_ENTER_CRITICAL_SECTION(s);    \\r
+                                            x;                                \\r
+                                            BSP_EXIT_CRITICAL_SECTION(s); )\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                           Asserts\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+\r
+/*\r
+ *  BSP_ASSERT( expression ) - The given expression must evaluate as "true" or else the assert\r
+ *  handler is called.  From here, the call stack feature of the debugger can pinpoint where\r
+ * the problem occurred.\r
+ *\r
+ *  BSP_FORCE_ASSERT() - If asserts are in use, immediately calls the assert handler.\r
+ *\r
+ *  BSP_ASSERTS_ARE_ON - can use #ifdef to see if asserts are enabled\r
+ *\r
+ *  Asserts can be disabled for optimum performance and minimum code size (ideal for\r
+ *  finalized, debugged production code).\r
+ */\r
+\r
+#if (!defined BSP_NO_DEBUG)\r
+#ifndef BSP_ASSERT_HANDLER\r
+#define BSP_ASSERT_HANDLER()      st( __bsp_DISABLE_INTERRUPTS__();  while(1); )\r
+#endif\r
+#define BSP_ASSERT(expr)          st( if (!(expr)) BSP_ASSERT_HANDLER(); )\r
+#define BSP_FORCE_ASSERT()        BSP_ASSERT_HANDLER()\r
+#define BSP_ASSERTS_ARE_ON\r
+#else\r
+#define BSP_ASSERT(expr)          /* empty */\r
+#define BSP_FORCE_ASSERT()        /* empty */\r
+#endif\r
+\r
+/* static assert */\r
+#define BSP_STATIC_ASSERT(expr)   void bspDummyPrototype( char dummy[1/((expr)!=0)] )\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                           Prototypes\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+void BSP_Init(void);\r
+/**************************************************************************************************\r
+ */\r
+\r
+/****************************************************************************************\r
+ *                                 BEGIN ENDIAN SUPPORT\r
+ *\r
+ * Security encrypt/decrypt operates on unsigned long quantities. These must match on\r
+ * source and destination platforms. These macros enforce the standard conversions.\r
+ * Currently all platforms (CC2520/CC2x30 and MSP430) are little endian.\r
+ *\r
+ *******************   Network order for encryption is LITTLE ENDIAN   ******************\r
+ *\r
+ ****************************************************************************************/\r
+\r
+#if (BSP_LITTLE_ENDIAN != 0)\r
+#define   ntohs(x)    (x)\r
+#define   htons(x)    (x)\r
+\r
+#define   ntohl(x)    (x)\r
+#define   htonl(x)    (x)\r
+\r
+#else\r
+\r
+#define   ntohs(x)    (((x>>8) & 0xFF) | ((x & 0xFF)<<8))\r
+#define   htons(x)    (((x>>8) & 0xFF) | ((x & 0xFF)<<8))\r
+\r
+#define   ntohl(x)    ( ((x>>24) & 0xFF) | ((x>>8) & 0xFF00) | \\r
+                        ((x & 0xFF00)<<8) | ((x & 0xFF)<<24)   \\r
+                      )\r
+#define   htonl(x)    ( ((x>>24) & 0xFF) | ((x>>8) & 0xFF00) | \\r
+                        ((x & 0xFF00)<<8) | ((x & 0xFF)<<24)   \\r
+                      )\r
+\r
+#endif  /* (BSP_LITTLE_ENDIAN != 0) */\r
+\r
+/***************************************************************************************\r
+ *                                 END ENDIAN SUPPORT\r
+ ***************************************************************************************/\r
+\r
+\r
+\r
+#endif\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/Components/bsp/bsp_macros.h b/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/Components/bsp/bsp_macros.h
new file mode 100755 (executable)
index 0000000..ee99a19
--- /dev/null
@@ -0,0 +1,79 @@
+/**************************************************************************************************\r
+  Revised:        $Date: 2007-07-06 11:19:00 -0700 (Fri, 06 Jul 2007) $\r
+  Revision:       $Revision: 13579 $\r
+\r
+  Copyright 2007 Texas Instruments Incorporated.  All rights reserved.\r
+\r
+  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+  the terms of a software license agreement between the user who downloaded the software,\r
+  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+  License. The License limits your use, and you acknowledge, that the Software may not be\r
+  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+  perform, display or sell this Software and/or its documentation for any purpose.\r
+\r
+  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+\r
+  Should you have any questions regarding your right to use this Software,\r
+  contact Texas Instruments Incorporated at www.TI.com. \r
+**************************************************************************************************/\r
+\r
+/* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+ *   BSP (Board Support Package)\r
+ *   Include file for BSP utility macros.\r
+ * =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+ */\r
+\r
+#ifndef BSP_MACROS_H\r
+#define BSP_MACROS_H\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                          Macros\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+/* bit value */\r
+#ifndef BV\r
+#define BV(n)      (1 << (n))\r
+#endif\r
+\r
+/*\r
+ *  This macro is for use by other macros to form a fully valid C statement.\r
+ *  Without this, the if/else conditionals could show unexpected behavior.\r
+ *\r
+ *  For example, use...\r
+ *    #define SET_REGS()  st( ioreg1 = 0; ioreg2 = 0; )\r
+ *  instead of ...\r
+ *    #define SET_REGS()  { ioreg1 = 0; ioreg2 = 0; }\r
+ *  or\r
+ *    #define  SET_REGS()    ioreg1 = 0; ioreg2 = 0;\r
+ *  The last macro would not behave as expected in the if/else construct.\r
+ *  The second to last macro will cause a compiler error in certain uses\r
+ *  of if/else construct\r
+ *\r
+ *  It is not necessary, or recommended, to use this macro where there is\r
+ *  already a valid C statement.  For example, the following is redundant...\r
+ *    #define CALL_FUNC()   st(  func();  )\r
+ *  This should simply be...\r
+ *    #define CALL_FUNC()   func()\r
+ *\r
+ * (The while condition below evaluates false without generating a\r
+ *  constant-controlling-loop type of warning on most compilers.)\r
+ */\r
+#define st(x)      do { x } while (__LINE__ == -1)\r
+\r
+\r
+/**************************************************************************************************\r
+ */\r
+#endif\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/Components/bsp/drivers/bsp_buttons.h b/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/Components/bsp/drivers/bsp_buttons.h
new file mode 100755 (executable)
index 0000000..b73d615
--- /dev/null
@@ -0,0 +1,90 @@
+/**************************************************************************************************\r
+  Revised:        $Date: 2007-07-06 11:19:00 -0700 (Fri, 06 Jul 2007) $\r
+  Revision:       $Revision: 13579 $\r
+\r
+  Copyright 2007 Texas Instruments Incorporated. All rights reserved.\r
+\r
+  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+  the terms of a software license agreement between the user who downloaded the software,\r
+  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+  License. The License limits your use, and you acknowledge, that the Software may not be\r
+  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+  perform, display or sell this Software and/or its documentation for any purpose.\r
+\r
+  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+\r
+  Should you have any questions regarding your right to use this Software,\r
+  contact Texas Instruments Incorporated at www.TI.com. \r
+**************************************************************************************************/\r
+\r
+/* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+ *   BSP (Board Support Package)\r
+ *   Button driver include file.\r
+ * =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+ */\r
+\r
+#ifndef BSP_BUTTONS_H\r
+#define BSP_BUTTONS_H\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                           Includes\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#include "bsp_button_defs.h"\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                           Defines\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#define BSP_NUM_BUTTONS                   __bsp_NUM_BUTTONS__\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                            Macros\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#define BSP_BUTTON_DEBOUNCE_WAIT(expr)    __bsp_BUTTON_DEBOUNCE_WAIT__(expr)    \r
+\r
+#define BSP_BUTTON1()   __bsp_BUTTON1__()\r
+#define BSP_BUTTON2()   __bsp_BUTTON2__()\r
+#define BSP_BUTTON3()   __bsp_BUTTON3__()\r
+#define BSP_BUTTON4()   __bsp_BUTTON4__()\r
+#define BSP_BUTTON5()   __bsp_BUTTON5__()\r
+#define BSP_BUTTON6()   __bsp_BUTTON6__()\r
+#define BSP_BUTTON7()   __bsp_BUTTON7__()\r
+#define BSP_BUTTON8()   __bsp_BUTTON8__()\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                        Prototypes\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+void BSP_InitButtons(void);\r
+\r
+\r
+/* ************************************************************************************************\r
+ *                                   Compile Time Integrity Checks\r
+ * ************************************************************************************************\r
+ */\r
+#ifdef BSP_NO_BUTTONS\r
+#error "ERROR: The button driver is disabled.  This file should not be included."\r
+#endif\r
+\r
+\r
+/**************************************************************************************************\r
+ */\r
+#endif\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/Components/bsp/drivers/bsp_leds.h b/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/Components/bsp/drivers/bsp_leds.h
new file mode 100755 (executable)
index 0000000..b01338b
--- /dev/null
@@ -0,0 +1,133 @@
+/**************************************************************************************************\r
+  Revised:        $Date: 2007-07-06 11:19:00 -0700 (Fri, 06 Jul 2007) $\r
+  Revision:       $Revision: 13579 $\r
+\r
+  Copyright 2007 Texas Instruments Incorporated.  All rights reserved.\r
+\r
+  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+  the terms of a software license agreement between the user who downloaded the software,\r
+  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+  License. The License limits your use, and you acknowledge, that the Software may not be\r
+  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+  perform, display or sell this Software and/or its documentation for any purpose.\r
+\r
+  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+\r
+  Should you have any questions regarding your right to use this Software,\r
+  contact Texas Instruments Incorporated at www.TI.com. \r
+**************************************************************************************************/\r
+\r
+/* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+ *   BSP (Board Support Package)\r
+ *   LED driver include file.\r
+ * =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+ */\r
+\r
+#ifndef BSP_LEDS_H\r
+#define BSP_LEDS_H\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                           Includes\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#include "bsp_led_defs.h"\r
+#include "bsp_macros.h"\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                             Defines\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#define BSP_NUM_LEDS            __bsp_NUM_LEDS__\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                              Macros\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+\r
+/* blink delay loop */\r
+#define BSP_LED_BLINK_DELAY()   st( { volatile uint32_t i; \\r
+                                      for (i=0; i<__bsp_LED_BLINK_LOOP_COUNT__; i++) { }; } )\r
+\r
+/* LED1 */\r
+#define BSP_TURN_ON_LED1()      __bsp_LED1_TURN_ON__()\r
+#define BSP_TURN_OFF_LED1()     __bsp_LED1_TURN_OFF__()\r
+#define BSP_TOGGLE_LED1()       __bsp_LED1_TOGGLE__()\r
+#define BSP_LED1_IS_ON()        __bsp_LED1_IS_ON__()\r
+\r
+/* LED2 */\r
+#define BSP_TURN_ON_LED2()      __bsp_LED2_TURN_ON__()\r
+#define BSP_TURN_OFF_LED2()     __bsp_LED2_TURN_OFF__()\r
+#define BSP_TOGGLE_LED2()       __bsp_LED2_TOGGLE__()\r
+#define BSP_LED2_IS_ON()        __bsp_LED2_IS_ON__()\r
+\r
+/* LED3 */\r
+#define BSP_TURN_ON_LED3()      __bsp_LED3_TURN_ON__()\r
+#define BSP_TURN_OFF_LED3()     __bsp_LED3_TURN_OFF__()\r
+#define BSP_TOGGLE_LED3()       __bsp_LED3_TOGGLE__()\r
+#define BSP_LED3_IS_ON()        __bsp_LED3_IS_ON__()\r
+\r
+/* LED4 */\r
+#define BSP_TURN_ON_LED4()      __bsp_LED4_TURN_ON__()\r
+#define BSP_TURN_OFF_LED4()     __bsp_LED4_TURN_OFF__()\r
+#define BSP_TOGGLE_LED4()       __bsp_LED4_TOGGLE__()\r
+#define BSP_LED4_IS_ON()        __bsp_LED4_IS_ON__()\r
+\r
+/* LED5 */\r
+#define BSP_TURN_ON_LED5()      __bsp_LED5_TURN_ON__()\r
+#define BSP_TURN_OFF_LED5()     __bsp_LED5_TURN_OFF__()\r
+#define BSP_TOGGLE_LED5()       __bsp_LED5_TOGGLE__()\r
+#define BSP_LED5_IS_ON()        __bsp_LED5_IS_ON__()\r
+\r
+/* LED6 */\r
+#define BSP_TURN_ON_LED6()      __bsp_LED6_TURN_ON__()\r
+#define BSP_TURN_OFF_LED6()     __bsp_LED6_TURN_OFF__()\r
+#define BSP_TOGGLE_LED6()       __bsp_LED6_TOGGLE__()\r
+#define BSP_LED6_IS_ON()        __bsp_LED6_IS_ON__()\r
+\r
+/* LED7 */\r
+#define BSP_TURN_ON_LED7()      __bsp_LED7_TURN_ON__()\r
+#define BSP_TURN_OFF_LED7()     __bsp_LED7_TURN_OFF__()\r
+#define BSP_TOGGLE_LED7()       __bsp_LED7_TOGGLE__()\r
+#define BSP_LED7_IS_ON()        __bsp_LED7_IS_ON__()\r
+\r
+/* LED8 */\r
+#define BSP_TURN_ON_LED8()      __bsp_LED8_TURN_ON__()\r
+#define BSP_TURN_OFF_LED8()     __bsp_LED8_TURN_OFF__()\r
+#define BSP_TOGGLE_LED8()       __bsp_LED8_TOGGLE__()\r
+#define BSP_LED8_IS_ON()        __bsp_LED8_IS_ON__()\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                        Prototypes\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+void BSP_InitLeds(void);\r
+\r
+\r
+\r
+/* ************************************************************************************************\r
+ *                                   Compile Time Integrity Checks\r
+ * ************************************************************************************************\r
+ */\r
+#ifdef BSP_NO_LEDS\r
+#error "ERROR: The LED driver is disabled.  This file should not be included."\r
+#endif\r
+\r
+/**************************************************************************************************\r
+ */\r
+#endif\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/Components/bsp/drivers/code/bsp_buttons.c b/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/Components/bsp/drivers/code/bsp_buttons.c
new file mode 100755 (executable)
index 0000000..b8f2018
--- /dev/null
@@ -0,0 +1,97 @@
+/**************************************************************************************************\r
+  Revised:        $Date: 2007-07-06 11:19:00 -0700 (Fri, 06 Jul 2007) $\r
+  Revision:       $Revision: 13579 $\r
+\r
+  Copyright 2007 Texas Instruments Incorporated.  All rights reserved.\r
+\r
+  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+  the terms of a software license agreement between the user who downloaded the software,\r
+  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+  License. The License limits your use, and you acknowledge, that the Software may not be\r
+  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+  perform, display or sell this Software and/or its documentation for any purpose.\r
+\r
+  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+\r
+  Should you have any questions regarding your right to use this Software,\r
+  contact Texas Instruments Incorporated at www.TI.com. \r
+**************************************************************************************************/\r
+\r
+/* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+ *   BSP (Board Support Package)\r
+ *   Generic button driver code file.\r
+ * =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+ */\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                            Includes\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#include "bsp_buttons.h"\r
+#include "bsp_button_defs.h"\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                             Macros\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#define BSP_CONFIG_BUTTON1()    __bsp_BUTTON1_CONFIG__()\r
+#define BSP_CONFIG_BUTTON2()    __bsp_BUTTON2_CONFIG__()\r
+#define BSP_CONFIG_BUTTON3()    __bsp_BUTTON3_CONFIG__()\r
+#define BSP_CONFIG_BUTTON4()    __bsp_BUTTON4_CONFIG__()\r
+#define BSP_CONFIG_BUTTON5()    __bsp_BUTTON5_CONFIG__()\r
+#define BSP_CONFIG_BUTTON6()    __bsp_BUTTON6_CONFIG__()\r
+#define BSP_CONFIG_BUTTON7()    __bsp_BUTTON7_CONFIG__()\r
+#define BSP_CONFIG_BUTTON8()    __bsp_BUTTON8_CONFIG__()\r
+\r
+#ifdef __bsp_BUTTON_EXTENDED_CONFIG__\r
+#define BSP_BUTTON_EXTENDED_CONFIG()  __bsp_BUTTON_EXTENDED_CONFIG__()\r
+#else\r
+#define BSP_BUTTON_EXTENDED_CONFIG()\r
+#endif\r
+\r
+\r
+/**************************************************************************************************\r
+ * @fn          BSP_InitButtons\r
+ *\r
+ * @brief       Initialize button hardware and driver code.\r
+ *\r
+ * @param       none\r
+ *\r
+ * @return      none\r
+ **************************************************************************************************\r
+ */\r
+void BSP_InitButtons(void)\r
+{\r
+  /* configure LEDs */\r
+  BSP_CONFIG_BUTTON1();\r
+  BSP_CONFIG_BUTTON2();\r
+  BSP_CONFIG_BUTTON3();\r
+  BSP_CONFIG_BUTTON4();\r
+  BSP_CONFIG_BUTTON5();\r
+  BSP_CONFIG_BUTTON6();\r
+  BSP_CONFIG_BUTTON7();\r
+  BSP_CONFIG_BUTTON8();\r
+\r
+  /* peform extended configuration if needed */\r
+  BSP_BUTTON_EXTENDED_CONFIG();\r
+}\r
+\r
+\r
+/**************************************************************************************************\r
+*/\r
+\r
+   \r
+   \r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/Components/bsp/drivers/code/bsp_generic_buttons.h b/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/Components/bsp/drivers/code/bsp_generic_buttons.h
new file mode 100755 (executable)
index 0000000..e9ae165
--- /dev/null
@@ -0,0 +1,203 @@
+/**************************************************************************************************\r
+  Revised:        $Date: 2007-07-06 11:19:00 -0700 (Fri, 06 Jul 2007) $\r
+  Revision:       $Revision: 13579 $\r
+\r
+  Copyright 2007 Texas Instruments Incorporated.  All rights reserved.\r
+\r
+  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+  the terms of a software license agreement between the user who downloaded the software,\r
+  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+  License. The License limits your use, and you acknowledge, that the Software may not be\r
+  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+  perform, display or sell this Software and/or its documentation for any purpose.\r
+\r
+  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+\r
+  Should you have any questions regarding your right to use this Software,\r
+  contact Texas Instruments Incorporated at www.TI.com. \r
+**************************************************************************************************/\r
+\r
+/* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+ *   BSP (Board Support Package)\r
+ *   Generic button macro include file.\r
+ * =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+ */\r
+\r
+#ifndef BSP_GENERIC_BUTTONS_H\r
+#define BSP_GENERIC_BUTTONS_H\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                           Includes\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#include "bsp_board_defs.h"\r
+#include "bsp_macros.h"\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                            Macros\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#define __bsp_BUTTON__(port,bit,low)    ((low) ? (!((port) & BV(bit))) : ((port) & BV(bit)) )\r
+\r
+\r
+/* ------------------------- populate BUTTON #1 macros ------------------------- */\r
+#define __bsp_NUM_BUTTON1_DEFINES__  ((defined __bsp_BUTTON1_PORT__)  + \\r
+                                      (defined __bsp_BUTTON1_BIT__)   + \\r
+                                      (defined __bsp_BUTTON1_IS_ACTIVE_LOW__))\r
+#if (__bsp_NUM_BUTTON1_DEFINES__ == 3)\r
+#define __bsp_BUTTON1__()           __bsp_BUTTON__( __bsp_BUTTON1_PORT__, __bsp_BUTTON1_BIT__, __bsp_BUTTON1_IS_ACTIVE_LOW__ )\r
+#define __bsp_BUTTON1_CONFIG__()    /* nothing required */\r
+#elif (__bsp_NUM_BUTTON1_DEFINES__ == 0)\r
+#define __bsp_BUTTON1__()           /* no button */   0\r
+#define __bsp_BUTTON1_CONFIG__()    /* no button */\r
+#else\r
+#error "ERROR: Incomplete number of macros for BUTTON1."\r
+#endif\r
+\r
+/* ------------------------- populate BUTTON #2 macros ------------------------- */\r
+#define __bsp_NUM_BUTTON2_DEFINES__  ((defined __bsp_BUTTON2_PORT__)  + \\r
+                                      (defined __bsp_BUTTON2_BIT__)   + \\r
+                                      (defined __bsp_BUTTON2_IS_ACTIVE_LOW__))\r
+#if (__bsp_NUM_BUTTON2_DEFINES__ == 3)\r
+#define __bsp_BUTTON2__()           __bsp_BUTTON__( __bsp_BUTTON2_PORT__, __bsp_BUTTON2_BIT__, __bsp_BUTTON2_IS_ACTIVE_LOW__ )\r
+#define __bsp_BUTTON2_CONFIG__()    /* nothing required */\r
+#elif (__bsp_NUM_BUTTON2_DEFINES__ == 0)\r
+#define __bsp_BUTTON2__()           /* no button */   0\r
+#define __bsp_BUTTON2_CONFIG__()    /* no button */\r
+#else\r
+#error "ERROR: Incomplete number of macros for BUTTON2."\r
+#endif\r
+\r
+/* ------------------------- populate BUTTON #3 macros ------------------------- */\r
+#define __bsp_NUM_BUTTON3_DEFINES__  ((defined __bsp_BUTTON3_PORT__)  + \\r
+                                      (defined __bsp_BUTTON3_BIT__)   + \\r
+                                      (defined __bsp_BUTTON3_IS_ACTIVE_LOW__))\r
+#if (__bsp_NUM_BUTTON3_DEFINES__ == 3)\r
+#define __bsp_BUTTON3__()           __bsp_BUTTON__( __bsp_BUTTON3_PORT__, __bsp_BUTTON3_BIT__, __bsp_BUTTON3_IS_ACTIVE_LOW__ )\r
+#define __bsp_BUTTON3_CONFIG__()    /* nothing required */\r
+#elif (__bsp_NUM_BUTTON3_DEFINES__ == 0)\r
+#define __bsp_BUTTON3__()           /* no button */   0\r
+#define __bsp_BUTTON3_CONFIG__()    /* no button */\r
+#else\r
+#error "ERROR: Incomplete number of macros for BUTTON3."\r
+#endif\r
+\r
+/* ------------------------- populate BUTTON #4 macros ------------------------- */\r
+#define __bsp_NUM_BUTTON4_DEFINES__  ((defined __bsp_BUTTON4_PORT__)  + \\r
+                                      (defined __bsp_BUTTON4_BIT__)   + \\r
+                                      (defined __bsp_BUTTON4_IS_ACTIVE_LOW__))\r
+#if (__bsp_NUM_BUTTON4_DEFINES__ == 3)\r
+#define __bsp_BUTTON4__()           __bsp_BUTTON__( __bsp_BUTTON4_PORT__, __bsp_BUTTON4_BIT__, __bsp_BUTTON4_IS_ACTIVE_LOW__ )\r
+#define __bsp_BUTTON4_CONFIG__()    /* nothing required */\r
+#elif (__bsp_NUM_BUTTON4_DEFINES__ == 0)\r
+#define __bsp_BUTTON4__()           /* no button */   0\r
+#define __bsp_BUTTON4_CONFIG__()    /* no button */\r
+#else\r
+#error "ERROR: Incomplete number of macros for BUTTON4."\r
+#endif\r
+\r
+/* ------------------------- populate BUTTON #5 macros ------------------------- */\r
+#define __bsp_NUM_BUTTON5_DEFINES__  ((defined __bsp_BUTTON5_PORT__)  + \\r
+                                      (defined __bsp_BUTTON5_BIT__)   + \\r
+                                      (defined __bsp_BUTTON5_IS_ACTIVE_LOW__))\r
+#if (__bsp_NUM_BUTTON5_DEFINES__ == 3)\r
+#define __bsp_BUTTON5__()           __bsp_BUTTON__( __bsp_BUTTON5_PORT__, __bsp_BUTTON5_BIT__, __bsp_BUTTON5_IS_ACTIVE_LOW__ )\r
+#define __bsp_BUTTON5_CONFIG__()    /* nothing required */\r
+#elif (__bsp_NUM_BUTTON5_DEFINES__ == 0)\r
+#define __bsp_BUTTON5__()           /* no button */   0\r
+#define __bsp_BUTTON5_CONFIG__()    /* no button */\r
+#else\r
+#error "ERROR: Incomplete number of macros for BUTTON5."\r
+#endif\r
+\r
+/* ------------------------- populate BUTTON #6 macros ------------------------- */\r
+#define __bsp_NUM_BUTTON6_DEFINES__  ((defined __bsp_BUTTON6_PORT__)  + \\r
+                                      (defined __bsp_BUTTON6_BIT__)   + \\r
+                                      (defined __bsp_BUTTON6_IS_ACTIVE_LOW__))\r
+#if (__bsp_NUM_BUTTON6_DEFINES__ == 3)\r
+#define __bsp_BUTTON6__()           __bsp_BUTTON__( __bsp_BUTTON6_PORT__, __bsp_BUTTON6_BIT__, __bsp_BUTTON6_IS_ACTIVE_LOW__ )\r
+#define __bsp_BUTTON6_CONFIG__()    /* nothing required */\r
+#elif (__bsp_NUM_BUTTON6_DEFINES__ == 0)\r
+#define __bsp_BUTTON6__()           /* no button */   0\r
+#define __bsp_BUTTON6_CONFIG__()    /* no button */\r
+#else\r
+#error "ERROR: Incomplete number of macros for BUTTON6."\r
+#endif\r
+\r
+/* ------------------------- populate BUTTON #7 macros ------------------------- */\r
+#define __bsp_NUM_BUTTON7_DEFINES__  ((defined __bsp_BUTTON7_PORT__)  + \\r
+                                      (defined __bsp_BUTTON7_BIT__)   + \\r
+                                      (defined __bsp_BUTTON7_IS_ACTIVE_LOW__))\r
+#if (__bsp_NUM_BUTTON7_DEFINES__ == 3)\r
+#define __bsp_BUTTON7__()           __bsp_BUTTON__( __bsp_BUTTON7_PORT__, __bsp_BUTTON7_BIT__, __bsp_BUTTON7_IS_ACTIVE_LOW__ )\r
+#define __bsp_BUTTON7_CONFIG__()    /* nothing required */\r
+#elif (__bsp_NUM_BUTTON7_DEFINES__ == 0)\r
+#define __bsp_BUTTON7__()           /* no button */   0\r
+#define __bsp_BUTTON7_CONFIG__()    /* no button */\r
+#else\r
+#error "ERROR: Incomplete number of macros for BUTTON7."\r
+#endif\r
+\r
+/* ------------------------- populate BUTTON #8 macros ------------------------- */\r
+#define __bsp_NUM_BUTTON8_DEFINES__  ((defined __bsp_BUTTON8_PORT__)  + \\r
+                                      (defined __bsp_BUTTON8_BIT__)   + \\r
+                                      (defined __bsp_BUTTON8_IS_ACTIVE_LOW__))\r
+#if (__bsp_NUM_BUTTON8_DEFINES__ == 3)\r
+#define __bsp_BUTTON8__()           __bsp_BUTTON__( __bsp_BUTTON8_PORT__, __bsp_BUTTON8_BIT__, __bsp_BUTTON8_IS_ACTIVE_LOW__ )\r
+#define __bsp_BUTTON8_CONFIG__()    /* nothing required */\r
+#elif (__bsp_NUM_BUTTON8_DEFINES__ == 0)\r
+#define __bsp_BUTTON8__()           /* no button */   0\r
+#define __bsp_BUTTON8_CONFIG__()    /* no button */\r
+#else\r
+#error "ERROR: Incomplete number of macros for BUTTON8."\r
+#endif\r
+\r
+\r
+/* ************************************************************************************************\r
+ *                                   Compile Time Integrity Checks\r
+ * ************************************************************************************************\r
+ */\r
+\r
+/* -------------------- number of buttons defined -------------------- */\r
+#ifndef __bsp_NUM_BUTTONS__\r
+#error "ERROR: Number of buttons is not specified."\r
+#else\r
+#if ((__bsp_NUM_BUTTONS__ > 8) || (__bsp_NUM_BUTTONS__ < 0))\r
+#error "ERROR: Unsupported number of buttons specified.  Maximum is eight."\r
+#endif\r
+#endif\r
+\r
+#if (((__bsp_NUM_BUTTON1_DEFINES__ != 0) + \\r
+      (__bsp_NUM_BUTTON2_DEFINES__ != 0) + \\r
+      (__bsp_NUM_BUTTON3_DEFINES__ != 0) + \\r
+      (__bsp_NUM_BUTTON4_DEFINES__ != 0) + \\r
+      (__bsp_NUM_BUTTON5_DEFINES__ != 0) + \\r
+      (__bsp_NUM_BUTTON6_DEFINES__ != 0) + \\r
+      (__bsp_NUM_BUTTON7_DEFINES__ != 0) + \\r
+      (__bsp_NUM_BUTTON8_DEFINES__ != 0)) != __bsp_NUM_BUTTONS__)\r
+#error "ERROR: Inconsistency between defined macros and specified number of buttons."\r
+#endif\r
+\r
+/* -------------------- debounce macro -------------------- */\r
+#ifndef __bsp_BUTTON_DEBOUNCE_WAIT__\r
+#error "ERROR: Debounce delay macro is missing."\r
+#endif\r
+\r
+\r
+/**************************************************************************************************\r
+ */\r
+#endif\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/Components/bsp/drivers/code/bsp_generic_leds.h b/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/Components/bsp/drivers/code/bsp_generic_leds.h
new file mode 100755 (executable)
index 0000000..6e1e42b
--- /dev/null
@@ -0,0 +1,278 @@
+/**************************************************************************************************\r
+  Revised:        $Date: 2007-07-06 11:19:00 -0700 (Fri, 06 Jul 2007) $\r
+  Revision:       $Revision: 13579 $\r
+\r
+  Copyright 2007 Texas Instruments Incorporated.  All rights reserved.\r
+\r
+  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+  the terms of a software license agreement between the user who downloaded the software,\r
+  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+  License. The License limits your use, and you acknowledge, that the Software may not be\r
+  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+  perform, display or sell this Software and/or its documentation for any purpose.\r
+\r
+  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+\r
+  Should you have any questions regarding your right to use this Software,\r
+  contact Texas Instruments Incorporated at www.TI.com. \r
+**************************************************************************************************/\r
+\r
+/* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+ *   BSP (Board Support Package)\r
+ *   Generic LED macro include file.\r
+ * =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+ */\r
+\r
+#ifndef BSP_GENERIC_LEDS_H\r
+#define BSP_GENERIC_LEDS_H\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                          Includes\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#include "bsp_macros.h"\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                           Macros\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+\r
+/*\r
+ *  Note : The conditionals in the following macros evaulate compile time constants.\r
+ *         Any compiler worth its salt will optimize these conditionals out for the\r
+ *         smallest possible code.\r
+ */\r
+\r
+#define __bsp_LED_TURN_ON__(bit,port,ddr,low)  \\r
+  st( if (low) { port &= ~BV(bit); } else { port |= BV(bit); } )\r
+\r
+#define __bsp_LED_TURN_OFF__(bit,port,ddr,low)  \\r
+  st( if (low) { port |= BV(bit); } else { port &= ~BV(bit); } )\r
+\r
+#define __bsp_LED_IS_ON__(bit,port,ddr,low)  \\r
+  ( (low) ? (!((port) & BV(bit))) : ((port) & BV(bit)) )\r
+\r
+#define __bsp_LED_TOGGLE__(bit,port,ddr,low)     st( port ^= BV(bit); )\r
+#define __bsp_LED_CONFIG__(bit,port,ddr,low)     st( ddr |= BV(bit); )\r
+\r
+\r
+\r
+/* ------------------------- populate LED1 macros ------------------------- */\r
+#define __bsp_NUM_LED1_DEFINES__  ((defined __bsp_LED1_BIT__)  + \\r
+                                   (defined __bsp_LED1_PORT__) + \\r
+                                   (defined __bsp_LED1_DDR__)  + \\r
+                                   (defined __bsp_LED1_IS_ACTIVE_LOW__))\r
+#if (__bsp_NUM_LED1_DEFINES__ == 4)\r
+#define __bsp_LED1_TURN_ON__()    __bsp_LED_TURN_ON__ ( __bsp_LED1_BIT__, __bsp_LED1_PORT__, __bsp_LED1_DDR__, __bsp_LED1_IS_ACTIVE_LOW__ )\r
+#define __bsp_LED1_TURN_OFF__()   __bsp_LED_TURN_OFF__( __bsp_LED1_BIT__, __bsp_LED1_PORT__, __bsp_LED1_DDR__, __bsp_LED1_IS_ACTIVE_LOW__ )\r
+#define __bsp_LED1_TOGGLE__()     __bsp_LED_TOGGLE__  ( __bsp_LED1_BIT__, __bsp_LED1_PORT__, __bsp_LED1_DDR__, __bsp_LED1_IS_ACTIVE_LOW__ )\r
+#define __bsp_LED1_IS_ON__()      __bsp_LED_IS_ON__   ( __bsp_LED1_BIT__, __bsp_LED1_PORT__, __bsp_LED1_DDR__, __bsp_LED1_IS_ACTIVE_LOW__ )\r
+#define __bsp_LED1_CONFIG__()     __bsp_LED_CONFIG__  ( __bsp_LED1_BIT__, __bsp_LED1_PORT__, __bsp_LED1_DDR__, __bsp_LED1_IS_ACTIVE_LOW__ )\r
+#elif (__bsp_NUM_LED1_DEFINES__ == 0)\r
+#define __bsp_LED1_TURN_ON__()    /* no LED */\r
+#define __bsp_LED1_TURN_OFF__()   /* no LED */\r
+#define __bsp_LED1_TOGGLE__()     /* no LED */\r
+#define __bsp_LED1_IS_ON__()      /* no LED */  0\r
+#define __bsp_LED1_CONFIG__()     /* no LED */\r
+#else\r
+#error "ERROR: Incomplete number of macros for LED1."\r
+#endif\r
+\r
+\r
+/* ------------------------- populate LED2 macros ------------------------- */\r
+#define __bsp_NUM_LED2_DEFINES__  ((defined __bsp_LED2_BIT__)  + \\r
+                                   (defined __bsp_LED2_PORT__) + \\r
+                                   (defined __bsp_LED2_DDR__)  + \\r
+                                   (defined __bsp_LED2_IS_ACTIVE_LOW__))\r
+#if (__bsp_NUM_LED2_DEFINES__ == 4)\r
+#define __bsp_LED2_TURN_ON__()    __bsp_LED_TURN_ON__ ( __bsp_LED2_BIT__, __bsp_LED2_PORT__, __bsp_LED2_DDR__, __bsp_LED2_IS_ACTIVE_LOW__ )\r
+#define __bsp_LED2_TURN_OFF__()   __bsp_LED_TURN_OFF__( __bsp_LED2_BIT__, __bsp_LED2_PORT__, __bsp_LED2_DDR__, __bsp_LED2_IS_ACTIVE_LOW__ )\r
+#define __bsp_LED2_TOGGLE__()     __bsp_LED_TOGGLE__  ( __bsp_LED2_BIT__, __bsp_LED2_PORT__, __bsp_LED2_DDR__, __bsp_LED2_IS_ACTIVE_LOW__ )\r
+#define __bsp_LED2_IS_ON__()      __bsp_LED_IS_ON__   ( __bsp_LED2_BIT__, __bsp_LED2_PORT__, __bsp_LED2_DDR__, __bsp_LED2_IS_ACTIVE_LOW__ )\r
+#define __bsp_LED2_CONFIG__()     __bsp_LED_CONFIG__  ( __bsp_LED2_BIT__, __bsp_LED2_PORT__, __bsp_LED2_DDR__, __bsp_LED2_IS_ACTIVE_LOW__ )\r
+#elif (__bsp_NUM_LED2_DEFINES__ == 0)\r
+#define __bsp_LED2_TURN_ON__()    /* no LED */\r
+#define __bsp_LED2_TURN_OFF__()   /* no LED */\r
+#define __bsp_LED2_TOGGLE__()     /* no LED */\r
+#define __bsp_LED2_IS_ON__()      /* no LED */  0\r
+#define __bsp_LED2_CONFIG__()     /* no LED */\r
+#else\r
+#error "ERROR: Incomplete number of macros for LED2."\r
+#endif\r
+\r
+\r
+/* ------------------------- populate LED3 macros ------------------------- */\r
+#define __bsp_NUM_LED3_DEFINES__  ((defined __bsp_LED3_BIT__)  + \\r
+                                   (defined __bsp_LED3_PORT__) + \\r
+                                   (defined __bsp_LED3_DDR__)  + \\r
+                                   (defined __bsp_LED3_IS_ACTIVE_LOW__))\r
+#if (__bsp_NUM_LED3_DEFINES__ == 4)\r
+#define __bsp_LED3_TURN_ON__()    __bsp_LED_TURN_ON__ ( __bsp_LED3_BIT__, __bsp_LED3_PORT__, __bsp_LED3_DDR__, __bsp_LED3_IS_ACTIVE_LOW__ )\r
+#define __bsp_LED3_TURN_OFF__()   __bsp_LED_TURN_OFF__( __bsp_LED3_BIT__, __bsp_LED3_PORT__, __bsp_LED3_DDR__, __bsp_LED3_IS_ACTIVE_LOW__ )\r
+#define __bsp_LED3_TOGGLE__()     __bsp_LED_TOGGLE__  ( __bsp_LED3_BIT__, __bsp_LED3_PORT__, __bsp_LED3_DDR__, __bsp_LED3_IS_ACTIVE_LOW__ )\r
+#define __bsp_LED3_IS_ON__()      __bsp_LED_IS_ON__   ( __bsp_LED3_BIT__, __bsp_LED3_PORT__, __bsp_LED3_DDR__, __bsp_LED3_IS_ACTIVE_LOW__ )\r
+#define __bsp_LED3_CONFIG__()     __bsp_LED_CONFIG__  ( __bsp_LED3_BIT__, __bsp_LED3_PORT__, __bsp_LED3_DDR__, __bsp_LED3_IS_ACTIVE_LOW__ )\r
+#elif (__bsp_NUM_LED3_DEFINES__ == 0)\r
+#define __bsp_LED3_TURN_ON__()    /* no LED */\r
+#define __bsp_LED3_TURN_OFF__()   /* no LED */\r
+#define __bsp_LED3_TOGGLE__()     /* no LED */\r
+#define __bsp_LED3_IS_ON__()      /* no LED */  0\r
+#define __bsp_LED3_CONFIG__()     /* no LED */\r
+#else\r
+#error "ERROR: Incomplete number of macros for LED3."\r
+#endif\r
+\r
+\r
+/* ------------------------- populate LED4 macros ------------------------- */\r
+#define __bsp_NUM_LED4_DEFINES__  ((defined __bsp_LED4_BIT__)  + \\r
+                                   (defined __bsp_LED4_PORT__) + \\r
+                                   (defined __bsp_LED4_DDR__)  + \\r
+                                   (defined __bsp_LED4_IS_ACTIVE_LOW__))\r
+#if (__bsp_NUM_LED4_DEFINES__ == 4)\r
+#define __bsp_LED4_TURN_ON__()    __bsp_LED_TURN_ON__ ( __bsp_LED4_BIT__, __bsp_LED4_PORT__, __bsp_LED4_DDR__, __bsp_LED4_IS_ACTIVE_LOW__ )\r
+#define __bsp_LED4_TURN_OFF__()   __bsp_LED_TURN_OFF__( __bsp_LED4_BIT__, __bsp_LED4_PORT__, __bsp_LED4_DDR__, __bsp_LED4_IS_ACTIVE_LOW__ )\r
+#define __bsp_LED4_TOGGLE__()     __bsp_LED_TOGGLE__  ( __bsp_LED4_BIT__, __bsp_LED4_PORT__, __bsp_LED4_DDR__, __bsp_LED4_IS_ACTIVE_LOW__ )\r
+#define __bsp_LED4_IS_ON__()      __bsp_LED_IS_ON__   ( __bsp_LED4_BIT__, __bsp_LED4_PORT__, __bsp_LED4_DDR__, __bsp_LED4_IS_ACTIVE_LOW__ )\r
+#define __bsp_LED4_CONFIG__()     __bsp_LED_CONFIG__  ( __bsp_LED4_BIT__, __bsp_LED4_PORT__, __bsp_LED4_DDR__, __bsp_LED4_IS_ACTIVE_LOW__ )\r
+#elif (__bsp_NUM_LED4_DEFINES__ == 0)\r
+#define __bsp_LED4_TURN_ON__()    /* no LED */\r
+#define __bsp_LED4_TURN_OFF__()   /* no LED */\r
+#define __bsp_LED4_TOGGLE__()     /* no LED */\r
+#define __bsp_LED4_IS_ON__()      /* no LED */  0\r
+#define __bsp_LED4_CONFIG__()     /* no LED */\r
+#else\r
+#error "ERROR: Incomplete number of macros for LED4."\r
+#endif\r
+\r
+/* ------------------------- populate LED5 macros ------------------------- */\r
+#define __bsp_NUM_LED5_DEFINES__  ((defined __bsp_LED5_BIT__)  + \\r
+                                   (defined __bsp_LED5_PORT__) + \\r
+                                   (defined __bsp_LED5_DDR__)  + \\r
+                                   (defined __bsp_LED5_IS_ACTIVE_LOW__))\r
+#if (__bsp_NUM_LED5_DEFINES__ == 4)\r
+#define __bsp_LED5_TURN_ON__()    __bsp_LED_TURN_ON__ ( __bsp_LED5_BIT__, __bsp_LED5_PORT__, __bsp_LED5_DDR__, __bsp_LED5_IS_ACTIVE_LOW__ )\r
+#define __bsp_LED5_TURN_OFF__()   __bsp_LED_TURN_OFF__( __bsp_LED5_BIT__, __bsp_LED5_PORT__, __bsp_LED5_DDR__, __bsp_LED5_IS_ACTIVE_LOW__ )\r
+#define __bsp_LED5_TOGGLE__()     __bsp_LED_TOGGLE__  ( __bsp_LED5_BIT__, __bsp_LED5_PORT__, __bsp_LED5_DDR__, __bsp_LED5_IS_ACTIVE_LOW__ )\r
+#define __bsp_LED5_IS_ON__()      __bsp_LED_IS_ON__   ( __bsp_LED5_BIT__, __bsp_LED5_PORT__, __bsp_LED5_DDR__, __bsp_LED5_IS_ACTIVE_LOW__ )\r
+#define __bsp_LED5_CONFIG__()     __bsp_LED_CONFIG__  ( __bsp_LED5_BIT__, __bsp_LED5_PORT__, __bsp_LED5_DDR__, __bsp_LED5_IS_ACTIVE_LOW__ )\r
+#elif (__bsp_NUM_LED5_DEFINES__ == 0)\r
+#define __bsp_LED5_TURN_ON__()    /* no LED */\r
+#define __bsp_LED5_TURN_OFF__()   /* no LED */\r
+#define __bsp_LED5_TOGGLE__()     /* no LED */\r
+#define __bsp_LED5_IS_ON__()      /* no LED */  0\r
+#define __bsp_LED5_CONFIG__()     /* no LED */\r
+#else\r
+#error "ERROR: Incomplete number of macros for LED5."\r
+#endif\r
+\r
+/* ------------------------- populate LED6 macros ------------------------- */\r
+#define __bsp_NUM_LED6_DEFINES__  ((defined __bsp_LED6_BIT__)  + \\r
+                                   (defined __bsp_LED6_PORT__) + \\r
+                                   (defined __bsp_LED6_DDR__)  + \\r
+                                   (defined __bsp_LED6_IS_ACTIVE_LOW__))\r
+#if (__bsp_NUM_LED6_DEFINES__ == 4)\r
+#define __bsp_LED6_TURN_ON__()    __bsp_LED_TURN_ON__ ( __bsp_LED6_BIT__, __bsp_LED6_PORT__, __bsp_LED6_DDR__, __bsp_LED6_IS_ACTIVE_LOW__ )\r
+#define __bsp_LED6_TURN_OFF__()   __bsp_LED_TURN_OFF__( __bsp_LED6_BIT__, __bsp_LED6_PORT__, __bsp_LED6_DDR__, __bsp_LED6_IS_ACTIVE_LOW__ )\r
+#define __bsp_LED6_TOGGLE__()     __bsp_LED_TOGGLE__  ( __bsp_LED6_BIT__, __bsp_LED6_PORT__, __bsp_LED6_DDR__, __bsp_LED6_IS_ACTIVE_LOW__ )\r
+#define __bsp_LED6_IS_ON__()      __bsp_LED_IS_ON__   ( __bsp_LED6_BIT__, __bsp_LED6_PORT__, __bsp_LED6_DDR__, __bsp_LED6_IS_ACTIVE_LOW__ )\r
+#define __bsp_LED6_CONFIG__()     __bsp_LED_CONFIG__  ( __bsp_LED6_BIT__, __bsp_LED6_PORT__, __bsp_LED6_DDR__, __bsp_LED6_IS_ACTIVE_LOW__ )\r
+#elif (__bsp_NUM_LED6_DEFINES__ == 0)\r
+#define __bsp_LED6_TURN_ON__()    /* no LED */\r
+#define __bsp_LED6_TURN_OFF__()   /* no LED */\r
+#define __bsp_LED6_TOGGLE__()     /* no LED */\r
+#define __bsp_LED6_IS_ON__()      /* no LED */  0\r
+#define __bsp_LED6_CONFIG__()     /* no LED */\r
+#else\r
+#error "ERROR: Incomplete number of macros for LED6."\r
+#endif\r
+\r
+/* ------------------------- populate LED7 macros ------------------------- */\r
+#define __bsp_NUM_LED7_DEFINES__  ((defined __bsp_LED7_BIT__)  + \\r
+                                   (defined __bsp_LED7_PORT__) + \\r
+                                   (defined __bsp_LED7_DDR__)  + \\r
+                                   (defined __bsp_LED7_IS_ACTIVE_LOW__))\r
+#if (__bsp_NUM_LED7_DEFINES__ == 4)\r
+#define __bsp_LED7_TURN_ON__()    __bsp_LED_TURN_ON__ ( __bsp_LED7_BIT__, __bsp_LED7_PORT__, __bsp_LED7_DDR__, __bsp_LED7_IS_ACTIVE_LOW__ )\r
+#define __bsp_LED7_TURN_OFF__()   __bsp_LED_TURN_OFF__( __bsp_LED7_BIT__, __bsp_LED7_PORT__, __bsp_LED7_DDR__, __bsp_LED7_IS_ACTIVE_LOW__ )\r
+#define __bsp_LED7_TOGGLE__()     __bsp_LED_TOGGLE__  ( __bsp_LED7_BIT__, __bsp_LED7_PORT__, __bsp_LED7_DDR__, __bsp_LED7_IS_ACTIVE_LOW__ )\r
+#define __bsp_LED7_IS_ON__()      __bsp_LED_IS_ON__   ( __bsp_LED7_BIT__, __bsp_LED7_PORT__, __bsp_LED7_DDR__, __bsp_LED7_IS_ACTIVE_LOW__ )\r
+#define __bsp_LED7_CONFIG__()     __bsp_LED_CONFIG__  ( __bsp_LED7_BIT__, __bsp_LED7_PORT__, __bsp_LED7_DDR__, __bsp_LED7_IS_ACTIVE_LOW__ )\r
+#elif (__bsp_NUM_LED7_DEFINES__ == 0)\r
+#define __bsp_LED7_TURN_ON__()    /* no LED */\r
+#define __bsp_LED7_TURN_OFF__()   /* no LED */\r
+#define __bsp_LED7_TOGGLE__()     /* no LED */\r
+#define __bsp_LED7_IS_ON__()      /* no LED */  0\r
+#define __bsp_LED7_CONFIG__()     /* no LED */\r
+#else\r
+#error "ERROR: Incomplete number of macros for LED7."\r
+#endif\r
+\r
+/* ------------------------- populate LED8 macros ------------------------- */\r
+#define __bsp_NUM_LED8_DEFINES__  ((defined __bsp_LED8_BIT__)  + \\r
+                                   (defined __bsp_LED8_PORT__) + \\r
+                                   (defined __bsp_LED8_DDR__)  + \\r
+                                   (defined __bsp_LED8_IS_ACTIVE_LOW__))\r
+#if (__bsp_NUM_LED8_DEFINES__ == 4)\r
+#define __bsp_LED8_TURN_ON__()    __bsp_LED_TURN_ON__ ( __bsp_LED8_BIT__, __bsp_LED8_PORT__, __bsp_LED8_DDR__, __bsp_LED8_IS_ACTIVE_LOW__ )\r
+#define __bsp_LED8_TURN_OFF__()   __bsp_LED_TURN_OFF__( __bsp_LED8_BIT__, __bsp_LED8_PORT__, __bsp_LED8_DDR__, __bsp_LED8_IS_ACTIVE_LOW__ )\r
+#define __bsp_LED8_TOGGLE__()     __bsp_LED_TOGGLE__  ( __bsp_LED8_BIT__, __bsp_LED8_PORT__, __bsp_LED8_DDR__, __bsp_LED8_IS_ACTIVE_LOW__ )\r
+#define __bsp_LED8_IS_ON__()      __bsp_LED_IS_ON__   ( __bsp_LED8_BIT__, __bsp_LED8_PORT__, __bsp_LED8_DDR__, __bsp_LED8_IS_ACTIVE_LOW__ )\r
+#define __bsp_LED8_CONFIG__()     __bsp_LED_CONFIG__  ( __bsp_LED8_BIT__, __bsp_LED8_PORT__, __bsp_LED8_DDR__, __bsp_LED8_IS_ACTIVE_LOW__ )\r
+#elif (__bsp_NUM_LED8_DEFINES__ == 0)\r
+#define __bsp_LED8_TURN_ON__()    /* no LED */\r
+#define __bsp_LED8_TURN_OFF__()   /* no LED */\r
+#define __bsp_LED8_TOGGLE__()     /* no LED */\r
+#define __bsp_LED8_IS_ON__()      /* no LED */  0\r
+#define __bsp_LED8_CONFIG__()     /* no LED */\r
+#else\r
+#error "ERROR: Incomplete number of macros for LED8."\r
+#endif\r
+\r
+\r
+/* ************************************************************************************************\r
+ *                                   Compile Time Integrity Checks\r
+ * ************************************************************************************************\r
+ */\r
+\r
+/* -------------------- number of LEDs defined -------------------- */\r
+#ifndef __bsp_NUM_LEDS__\r
+#error "ERROR: Number of LEDs is not specified."\r
+#else\r
+#if ((__bsp_NUM_LEDS__ > 8) || (__bsp_NUM_LEDS__ < 0))\r
+#error "ERROR: Unsupported number of LEDs specified.  Maximum is eight."\r
+#endif\r
+#endif\r
+\r
+#if (((__bsp_NUM_LED1_DEFINES__ != 0) + \\r
+      (__bsp_NUM_LED2_DEFINES__ != 0) + \\r
+      (__bsp_NUM_LED3_DEFINES__ != 0) + \\r
+      (__bsp_NUM_LED4_DEFINES__ != 0) + \\r
+      (__bsp_NUM_LED5_DEFINES__ != 0) + \\r
+      (__bsp_NUM_LED6_DEFINES__ != 0) + \\r
+      (__bsp_NUM_LED7_DEFINES__ != 0) + \\r
+      (__bsp_NUM_LED8_DEFINES__ != 0)) != __bsp_NUM_LEDS__)\r
+#error "ERROR: Inconsistency between defined macros and specified number of LEDs."\r
+#endif\r
+\r
+/* -------------------- blink delay loop count -------------------- */\r
+#ifndef __bsp_LED_BLINK_LOOP_COUNT__\r
+#error "ERROR: Blink delay count is missing."\r
+#endif\r
+\r
+/**************************************************************************************************\r
+ */\r
+#endif\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/Components/bsp/drivers/code/bsp_leds.c b/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/Components/bsp/drivers/code/bsp_leds.c
new file mode 100755 (executable)
index 0000000..4bc83e0
--- /dev/null
@@ -0,0 +1,107 @@
+/**************************************************************************************************\r
+  Revised:        $Date: 2007-07-06 11:19:00 -0700 (Fri, 06 Jul 2007) $\r
+  Revision:       $Revision: 13579 $\r
+\r
+  Copyright 2007 Texas Instruments Incorporated.  All rights reserved.\r
+\r
+  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+  the terms of a software license agreement between the user who downloaded the software,\r
+  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+  License. The License limits your use, and you acknowledge, that the Software may not be\r
+  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+  perform, display or sell this Software and/or its documentation for any purpose.\r
+\r
+  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+\r
+  Should you have any questions regarding your right to use this Software,\r
+  contact Texas Instruments Incorporated at www.TI.com. \r
+**************************************************************************************************/\r
+\r
+/* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+ *   BSP (Board Support Package)\r
+ *   Generic LED driver code file.\r
+ * =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+ */\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                            Includes\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#include "bsp_leds.h"\r
+#include "bsp_led_defs.h"\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                             Macros\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#define BSP_CONFIG_LED1()    __bsp_LED1_CONFIG__()\r
+#define BSP_CONFIG_LED2()    __bsp_LED2_CONFIG__()\r
+#define BSP_CONFIG_LED3()    __bsp_LED3_CONFIG__()\r
+#define BSP_CONFIG_LED4()    __bsp_LED4_CONFIG__()\r
+#define BSP_CONFIG_LED5()    __bsp_LED5_CONFIG__()\r
+#define BSP_CONFIG_LED6()    __bsp_LED6_CONFIG__()\r
+#define BSP_CONFIG_LED7()    __bsp_LED7_CONFIG__()\r
+#define BSP_CONFIG_LED8()    __bsp_LED8_CONFIG__()\r
+\r
+#ifdef __bsp_LED_EXTENDED_CONFIG__\r
+#define BSP_LED_EXTENDED_CONFIG()  __bsp_LED_EXTENDED_CONFIG__()\r
+#else\r
+#define BSP_LED_EXTENDED_CONFIG()\r
+#endif\r
+\r
+\r
+/**************************************************************************************************\r
+ * @fn          BSP_InitLeds\r
+ *\r
+ * @brief       Initialize LED hardware and driver.\r
+ *\r
+ * @param       none\r
+ *\r
+ * @return      none\r
+ **************************************************************************************************\r
+ */\r
+void BSP_InitLeds(void)\r
+{\r
+  /* configure LEDs */\r
+  BSP_CONFIG_LED1();\r
+  BSP_CONFIG_LED2();\r
+  BSP_CONFIG_LED3();\r
+  BSP_CONFIG_LED4();\r
+  BSP_CONFIG_LED5();\r
+  BSP_CONFIG_LED6();\r
+  BSP_CONFIG_LED7();\r
+  BSP_CONFIG_LED8();\r
+\r
+  /* peform extended configuration if needed */\r
+  BSP_LED_EXTENDED_CONFIG();\r
+\r
+  /* turn all LEDs off as power-up default */\r
+  BSP_TURN_OFF_LED1();\r
+  BSP_TURN_OFF_LED2();\r
+  BSP_TURN_OFF_LED3();\r
+  BSP_TURN_OFF_LED4();\r
+  BSP_TURN_OFF_LED5();\r
+  BSP_TURN_OFF_LED6();\r
+  BSP_TURN_OFF_LED7();\r
+  BSP_TURN_OFF_LED8();\r
+}\r
+\r
+\r
+/**************************************************************************************************\r
+*/\r
+\r
+   \r
+   \r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/Components/bsp/mcus/bsp_msp430_defs.h b/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/Components/bsp/mcus/bsp_msp430_defs.h
new file mode 100755 (executable)
index 0000000..af9357f
--- /dev/null
@@ -0,0 +1,141 @@
+/**************************************************************************************************\r
+  Filename:       bsp_msp430_defs.h\r
+  Revised:        $Date: 2009-10-11 18:52:46 -0700 (Sun, 11 Oct 2009) $\r
+  Revision:       $Revision: 20897 $\r
+\r
+  Copyright 2007-2009 Texas Instruments Incorporated.  All rights reserved.\r
+\r
+  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+  the terms of a software license agreement between the user who downloaded the software,\r
+  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+  License. The License limits your use, and you acknowledge, that the Software may not be\r
+  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+  perform, display or sell this Software and/or its documentation for any purpose.\r
+\r
+  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+\r
+  Should you have any questions regarding your right to use this Software,\r
+  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+/* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+ *   BSP (Board Support Package)\r
+ *   MCU : Texas Instruments MSP430 family\r
+ *   Microcontroller definition file.\r
+ * =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+ */\r
+\r
+#ifndef BSP_MSP430_DEFS_H\r
+#define BSP_MSP430_DEFS_H\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                          Defines\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#define BSP_MCU_MSP430\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                     Compiler Abstraction\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+\r
+/* ---------------------- IAR Compiler ---------------------- */\r
+#ifdef __IAR_SYSTEMS_ICC__\r
+#define BSP_COMPILER_IAR\r
+\r
+#if (__VER__ < 342)\r
+  #error "ERROR: This IAR compiler port requires at least revision v3.42A."\r
+/*\r
+ *  Compiler versions previous to v3.42A do not have the universal msp430.h include file.\r
+ *  To use an earlier version of the compiler, replace the above #error statement with\r
+ *  the appropriate, device specific #include statement.\r
+ */\r
+#endif\r
+\r
+/* Workaround for release v3.42A - the msp430.h file did not include support for some devices */\r
+#if ((__VER__ == 342) && (__SUBVERSION__ == 'A')) && \\r
+     (defined (__MSP430F1610__) || defined (__MSP430F1611__) || defined (__MSP430F1612__))\r
+#include <msp430x16x.h>\r
+#else\r
+#include <msp430.h>\r
+#endif\r
+\r
+#define __bsp_ISTATE_T__            istate_t\r
+#define __bsp_ISR_FUNCTION__(f,v)   __bsp_QUOTED_PRAGMA__(vector=v) __interrupt void f(void); \\r
+                                    __bsp_QUOTED_PRAGMA__(vector=v) __interrupt void f(void)\r
+\r
+/* Initialization call provided in IAR environment before standard C-startup */\r
+#include <intrinsics.h>\r
+#define BSP_EARLY_INIT(void) __intrinsic int __low_level_init(void)\r
+\r
+/* ---------------------- Code Composer ---------------------- */\r
+#elif (defined __TI_COMPILER_VERSION__) && (defined __MSP430__)\r
+#define BSP_COMPILER_CODE_COMPOSER\r
+\r
+/* At time of 1.1.0 release, CC430 support not in msp430.h */\r
+#if (__CC430F6137__)\r
+#include <cc430x613x.h>\r
+#else\r
+#include <msp430.h>\r
+#endif\r
+\r
+#define __bsp_ISTATE_T__            unsigned short\r
+#define __bsp_ISR_FUNCTION__(f,v)   __bsp_QUOTED_PRAGMA__(vector=v) __interrupt void f(void)\r
+\r
+/* Initialization call provided in CCE environment before standard C-startup */\r
+// [BM] Cannot have a second low level init! Already done by application!\r
+//#define BSP_EARLY_INIT(void)  int _system_pre_init(void)\r
+       \r
+/* ------------------ Unrecognized Compiler ------------------ */\r
+#else\r
+#error "ERROR: Unknown compiler."\r
+#endif\r
+\r
+#if (defined BSP_COMPILER_IAR) || (defined BSP_COMPILER_CODE_COMPOSER)\r
+#include <intrinsics.h>\r
+#define __bsp_ENABLE_INTERRUPTS__()       __enable_interrupt()\r
+#define __bsp_DISABLE_INTERRUPTS__()      __disable_interrupt()\r
+#define __bsp_INTERRUPTS_ARE_ENABLED__()  (__get_SR_register() & GIE)\r
+\r
+#define __bsp_GET_ISTATE__()              __get_interrupt_state()\r
+#define __bsp_RESTORE_ISTATE__(x)         __set_interrupt_state(x)\r
+\r
+#define __bsp_QUOTED_PRAGMA__(x)          _Pragma(#x)\r
+\r
+#endif\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                          Common\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#define __bsp_LITTLE_ENDIAN__   1\r
+#define __bsp_CODE_MEMSPACE__   /* blank */\r
+#define __bsp_XDATA_MEMSPACE__  /* blank */\r
+\r
+typedef   signed char     int8_t;\r
+typedef   signed short    int16_t;\r
+typedef   signed long     int32_t;\r
+\r
+typedef   unsigned char   uint8_t;\r
+typedef   unsigned short  uint16_t;\r
+typedef   unsigned long   uint32_t;\r
+\r
+#ifndef NULL\r
+#define NULL 0\r
+#endif\r
+\r
+/**************************************************************************************************\r
+ */\r
+#endif\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/Components/mrfi/mrfi.c b/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/Components/mrfi/mrfi.c
new file mode 100755 (executable)
index 0000000..5b7337b
--- /dev/null
@@ -0,0 +1,87 @@
+/**************************************************************************************************\r
+  Revised:        $Date: 2007-07-06 11:19:00 -0700 (Fri, 06 Jul 2007) $\r
+  Revision:       $Revision: 13579 $\r
+\r
+  Copyright 2007 Texas Instruments Incorporated.  All rights reserved.\r
+\r
+  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+  the terms of a software license agreement between the user who downloaded the software,\r
+  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+  License. The License limits your use, and you acknowledge, that the Software may not be\r
+  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+  perform, display or sell this Software and/or its documentation for any purpose.\r
+\r
+  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+\r
+  Should you have any questions regarding your right to use this Software,\r
+  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+/* ~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=\r
+ *   MRFI (Minimal RF Interface)\r
+ *   Top-level code file.\r
+ * ~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=\r
+ */\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                          Includes\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#include "mrfi_defs.h"\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                       C Code Includes\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+\r
+/* ----- Radio Family 1 ----- */\r
+#if (defined MRFI_RADIO_FAMILY1)\r
+#include "radios/family1/mrfi_radio.c"\r
+#include "radios/family1/mrfi_spi.c"\r
+#include "radios/common/mrfi_f1f2.c"\r
+#include "bsp_external/mrfi_board.c"\r
+\r
+/* ----- Radio Family 2 ----- */\r
+#elif (defined MRFI_RADIO_FAMILY2)\r
+#include "radios/family2/mrfi_radio.c"\r
+#include "radios/common/mrfi_f1f2.c"\r
+\r
+/* ----- Radio Family 3 ----- */\r
+#elif (defined MRFI_RADIO_FAMILY3)\r
+#include "bsp_external/mrfi_board.c"\r
+#include "radios/family3/mrfi_spi.c"\r
+#include "radios/family3/mrfi_radio.c"\r
+\r
+/* ----- Radio Family 4 ----- */\r
+#elif (defined MRFI_RADIO_FAMILY4)\r
+#include "radios/family4/mrfi_radio.c"\r
+\r
+/* ----- Radio Family 5 ----- */\r
+#elif (defined MRFI_RADIO_FAMILY5)\r
+#include "radios/family5/mrfi_radio.c"\r
+#include "radios/family5/mrfi_radio_interface.c"\r
+\r
+/* ----- Radio Family 6 ----- */\r
+#elif (defined MRFI_RADIO_FAMILY6)\r
+#include "radios/family6/mrfi_radio.c"\r
+\r
+#else\r
+#error "ERROR: Radio family is not defined."\r
+#endif\r
+\r
+\r
+/**************************************************************************************************\r
+ */\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/Components/mrfi/mrfi.h b/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/Components/mrfi/mrfi.h
new file mode 100755 (executable)
index 0000000..ca49e02
--- /dev/null
@@ -0,0 +1,182 @@
+/**************************************************************************************************\r
+  Revised:        $Date: 2007-07-06 11:19:00 -0700 (Fri, 06 Jul 2007) $\r
+  Revision:       $Revision: 13579 $\r
+\r
+  Copyright 2007 Texas Instruments Incorporated.  All rights reserved.\r
+\r
+  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+  the terms of a software license agreement between the user who downloaded the software,\r
+  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+  License. The License limits your use, and you acknowledge, that the Software may not be\r
+  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+  perform, display or sell this Software and/or its documentation for any purpose.\r
+\r
+  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+\r
+  Should you have any questions regarding your right to use this Software,\r
+  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+/* ~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=\r
+ *   MRFI (Minimal RF Interface)\r
+ *   Include file for all MRFI services.\r
+ * ~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=\r
+ */\r
+\r
+#ifndef MRFI_H\r
+#define MRFI_H\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                          Includes\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#include "bsp.h"\r
+#include "mrfi_defs.h"\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                          Defines\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#define MRFI_NUM_LOGICAL_CHANS           __mrfi_NUM_LOGICAL_CHANS__\r
+\r
+#define MRFI_NUM_POWER_SETTINGS          __mrfi_NUM_POWER_SETTINGS__\r
+\r
+/* return values for MRFI_Transmit */\r
+#define MRFI_TX_RESULT_SUCCESS        0\r
+#define MRFI_TX_RESULT_FAILED         1\r
+\r
+/* transmit type parameter for MRFI_Transmit */\r
+#define MRFI_TX_TYPE_FORCED           0\r
+#define MRFI_TX_TYPE_CCA              1\r
+\r
+/* Network header size definition */\r
+/* *********************************  NOTE  ****************************************\r
+ * There is a dependency here that really shouldn't exist. A reimplementation\r
+ * is necessary to avoid it.\r
+ *\r
+ * MRFI allocates the frame buffer which means it needs to know at compile time\r
+ * how big the buffer is. This means in must know the NWK header size, the\r
+ * maximum NWK and User application payload sizes and whether Security is enabled.\r
+ * ********************************************************************************\r
+ */\r
+#ifndef SMPL_SECURE\r
+#define  NWK_HDR_SIZE   3\r
+#define  NWK_PAYLOAD    MAX_NWK_PAYLOAD\r
+#else\r
+#define  NWK_HDR_SIZE   6\r
+#define  NWK_PAYLOAD    (MAX_NWK_PAYLOAD+4)\r
+#endif\r
+\r
+/* if external code has defined a maximum payload, use that instead of default */\r
+#ifdef MAX_APP_PAYLOAD\r
+#ifndef MAX_NWK_PAYLOAD\r
+#error ERROR: MAX_NWK_PAYLOAD not defined\r
+#endif\r
+#if MAX_APP_PAYLOAD < NWK_PAYLOAD\r
+#define MAX_PAYLOAD  NWK_PAYLOAD\r
+#else\r
+#define MAX_PAYLOAD  MAX_APP_PAYLOAD\r
+#endif\r
+#define MRFI_MAX_PAYLOAD_SIZE  (MAX_PAYLOAD+NWK_HDR_SIZE) /* SimpliciTI payload size plus six byte overhead */\r
+#endif\r
+\r
+\r
+/* frame definitions */\r
+#define MRFI_ADDR_SIZE              __mrfi_ADDR_SIZE__\r
+#ifndef MRFI_MAX_PAYLOAD_SIZE\r
+#define MRFI_MAX_PAYLOAD_SIZE       __mrfi_MAX_PAYLOAD_SIZE__\r
+#endif\r
+#define MRFI_MAX_FRAME_SIZE         (MRFI_MAX_PAYLOAD_SIZE + __mrfi_FRAME_OVERHEAD_SIZE__)\r
+#define MRFI_RX_METRICS_SIZE        __mrfi_RX_METRICS_SIZE__\r
+#define MRFI_RX_METRICS_RSSI_OFS    __mrfi_RX_METRICS_RSSI_OFS__\r
+#define MRFI_RX_METRICS_CRC_LQI_OFS __mrfi_RX_METRICS_CRC_LQI_OFS__\r
+\r
+/* Radio States */\r
+#define MRFI_RADIO_STATE_UNKNOWN  0\r
+#define MRFI_RADIO_STATE_OFF      1\r
+#define MRFI_RADIO_STATE_IDLE     2\r
+#define MRFI_RADIO_STATE_RX       3\r
+\r
+/* Platform constant used to calculate worst-case for an application\r
+ * acknowledgment delay. Used in the NWK_REPLY_DELAY() macro.\r
+ *\r
+\r
+                                      processing time on peer\r
+                                      |   round trip\r
+                                      |   |      max number of replays\r
+                                      |   |      |             number of backoff opportunities\r
+                                      |   |      |             |         average number of backoffs\r
+                                      |   |      |             |         |                                    */\r
+#define   PLATFORM_FACTOR_CONSTANT   (2 + 2*(MAX_HOPS*(MRFI_CCA_RETRIES*(8*MRFI_BACKOFF_PERIOD_USECS)/1000)))\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                          Macros\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#define MRFI_GET_PAYLOAD_LEN(p)         __mrfi_GET_PAYLOAD_LEN__(p)\r
+#define MRFI_SET_PAYLOAD_LEN(p,x)       __mrfi_SET_PAYLOAD_LEN__(p,x)\r
+\r
+#define MRFI_P_DST_ADDR(p)              __mrfi_P_DST_ADDR__(p)\r
+#define MRFI_P_SRC_ADDR(p)              __mrfi_P_SRC_ADDR__(p)\r
+#define MRFI_P_PAYLOAD(p)               __mrfi_P_PAYLOAD__(p)\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                          Typdefs\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+typedef struct\r
+{\r
+  uint8_t frame[MRFI_MAX_FRAME_SIZE];\r
+  uint8_t rxMetrics[MRFI_RX_METRICS_SIZE];\r
+} mrfiPacket_t;\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                         Prototypes\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+void    MRFI_Init(void);\r
+uint8_t MRFI_Transmit(mrfiPacket_t *, uint8_t);\r
+void    MRFI_Receive(mrfiPacket_t *);\r
+void    MRFI_RxCompleteISR(void); /* populated by code using MRFI */\r
+uint8_t MRFI_GetRadioState(void);\r
+void    MRFI_RxOn(void);\r
+void    MRFI_RxIdle(void);\r
+int8_t  MRFI_Rssi(void);\r
+void    MRFI_SetLogicalChannel(uint8_t);\r
+uint8_t MRFI_SetRxAddrFilter(uint8_t *);\r
+void    MRFI_EnableRxAddrFilter(void);\r
+void    MRFI_DisableRxAddrFilter(void);\r
+void    MRFI_Sleep(void);\r
+void    MRFI_WakeUp(void);\r
+uint8_t MRFI_RandomByte(void);\r
+void    MRFI_DelayMs(uint16_t);\r
+void    MRFI_ReplyDelay(void);\r
+void    MRFI_PostKillSem(void);\r
+void    MRFI_SetRFPwr(uint8_t);\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                       Global Constants\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+extern const uint8_t mrfiBroadcastAddr[];\r
+\r
+\r
+/**************************************************************************************************\r
+ */\r
+#endif\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/Components/mrfi/mrfi_defs.h b/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/Components/mrfi/mrfi_defs.h
new file mode 100755 (executable)
index 0000000..2e1c546
--- /dev/null
@@ -0,0 +1,226 @@
+/**************************************************************************************************\r
+  Revised:        $Date: 2009-01-13 16:32:00 -0700 (Wed, 13 Jan 2009) $\r
+  Revision:       $Revision: 18768 $\r
+\r
+  Copyright 2007-2009 Texas Instruments Incorporated.  All rights reserved.\r
+\r
+  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+  the terms of a software license agreement between the user who downloaded the software,\r
+  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+  License. The License limits your use, and you acknowledge, that the Software may not be\r
+  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+  perform, display or sell this Software and/or its documentation for any purpose.\r
+\r
+  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+\r
+  Should you have any questions regarding your right to use this Software,\r
+  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+/* ~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=\r
+ *   MRFI (Minimal RF Interface)\r
+ *   Definition and abstraction for radio targets.\r
+ * ~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=\r
+ */\r
+#ifndef MRFI_DEFS_H\r
+#define MRFI_DEFS_H\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                          Includes\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#include "bsp.h"\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                       Common Defines\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#define MRFI_CCA_RETRIES        4\r
+\r
+#define MRFI_ASSERT(x)          BSP_ASSERT(x)\r
+#define MRFI_FORCE_ASSERT()     BSP_FORCE_ASSERT()\r
+#define MRFI_ASSERTS_ARE_ON     BSP_ASSERTS_ARE_ON\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                    Radio Family Assigment\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+\r
+/* ------ Radio Family 1 ------ */\r
+#if (defined MRFI_CC1100) /* Sub 1 GHz RF Transceiver */ || \\r
+    (defined MRFI_CC1101) /* Sub 1 GHz RF Transceiver */ || \\r
+    (defined MRFI_CC1100E_470)  /* Sub 1 GHz RF Transceiver (CC1100E Asia) */ || \\r
+    (defined MRFI_CC1100E_950)  /* Sub 1 GHz RF Transceiver (CC1100E Asia) */ || \\r
+    (defined MRFI_CC2500) /* 2.4 GHz RF Transceiver */\r
+#define MRFI_RADIO_FAMILY1\r
+\r
+/* ------ Radio Family 2 ------ */\r
+#elif (defined MRFI_CC1110) /* Sub 1 GHz SoC */                     || \\r
+      (defined MRFI_CC1111) /* Sub 1 GHz SoC with USB controller */ || \\r
+      (defined MRFI_CC2510) /* 2.4 GHz SoC */                       || \\r
+      (defined MRFI_CC2511) /* 2.4 GHz SoC with USB controller */\r
+#define MRFI_RADIO_FAMILY2\r
+\r
+/* ------ Radio Family 3 ------ */\r
+#elif (defined MRFI_CC2420) /* 2.4 GHz IEEE 802.15.4 RF Transceiver */ || \\r
+      (defined MRFI_CC2520) /* 2.4 GHz IEEE 802.15.4 RF Transceiver */\r
+\r
+#define MRFI_RADIO_FAMILY3\r
+\r
+/* ------ Radio Family 4 ------ */\r
+#elif (defined MRFI_CC2430) /* 2.4 GHz IEEE 802.15.4 SoC */ || \\r
+      (defined MRFI_CC2431) /* 2.4 GHz IEEE 802.15.4 SoC */\r
+#define MRFI_RADIO_FAMILY4\r
+\r
+/* ------ Radio Family 5 ------ */\r
+#elif (defined MRFI_CC430)  /* Sub 1 GHz MSP SoC */\r
+#define MRFI_RADIO_FAMILY5\r
+\r
+/* ------ Radio Family 6 ------ */\r
+#elif (defined MRFI_CC2530) /* 2.4 GHz IEEE 802.15.4 SoC */\r
+\r
+#define MRFI_RADIO_FAMILY6\r
+\r
+#else\r
+#error "ERROR: Unknown or missing radio selection."\r
+#endif\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                Radio Family 1 / Radio Family 2 / Radio Family 5\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#if (defined MRFI_RADIO_FAMILY1) || (defined MRFI_RADIO_FAMILY2) || (defined MRFI_RADIO_FAMILY5)\r
+\r
+#define __mrfi_LENGTH_FIELD_SIZE__      1\r
+#define __mrfi_ADDR_SIZE__              4\r
+#define __mrfi_MAX_PAYLOAD_SIZE__       20\r
+\r
+#define __mrfi_RX_METRICS_SIZE__        2\r
+#define __mrfi_RX_METRICS_RSSI_OFS__    0\r
+#define __mrfi_RX_METRICS_CRC_LQI_OFS__ 1\r
+#define __mrfi_RX_METRICS_CRC_OK_MASK__ 0x80\r
+#define __mrfi_RX_METRICS_LQI_MASK__    0x7F\r
+\r
+#define __mrfi_NUM_LOGICAL_CHANS__      4\r
+#define __mrfi_NUM_POWER_SETTINGS__     3\r
+\r
+#define __mrfi_BACKOFF_PERIOD_USECS__   250\r
+\r
+#define __mrfi_LENGTH_FIELD_OFS__       0\r
+#define __mrfi_DST_ADDR_OFS__           (__mrfi_LENGTH_FIELD_OFS__ + __mrfi_LENGTH_FIELD_SIZE__)\r
+#define __mrfi_SRC_ADDR_OFS__           (__mrfi_DST_ADDR_OFS__ + __mrfi_ADDR_SIZE__)\r
+#define __mrfi_PAYLOAD_OFS__            (__mrfi_SRC_ADDR_OFS__ + __mrfi_ADDR_SIZE__)\r
+\r
+#define __mrfi_HEADER_SIZE__            (2 * __mrfi_ADDR_SIZE__)\r
+#define __mrfi_FRAME_OVERHEAD_SIZE__    (__mrfi_LENGTH_FIELD_SIZE__ + __mrfi_HEADER_SIZE__)\r
+\r
+#define __mrfi_GET_PAYLOAD_LEN__(p)     ((p)->frame[__mrfi_LENGTH_FIELD_OFS__] - __mrfi_HEADER_SIZE__)\r
+#define __mrfi_SET_PAYLOAD_LEN__(p,x)   st( (p)->frame[__mrfi_LENGTH_FIELD_OFS__] = x + __mrfi_HEADER_SIZE__; )\r
+\r
+#endif\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                Radio Family 3 / Radio Family 4 / Radio Family 6\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#if (defined MRFI_RADIO_FAMILY3) || (defined MRFI_RADIO_FAMILY4) || (defined MRFI_RADIO_FAMILY6)\r
+\r
+#define __mrfi_LENGTH_FIELD_SIZE__      1\r
+#define __mrfi_FCF_SIZE__               2\r
+#define __mrfi_DSN_SIZE__               1\r
+#define __mrfi_ADDR_SIZE__              4\r
+#define __mrfi_MAX_PAYLOAD_SIZE__       20\r
+\r
+#define __mrfi_RX_METRICS_SIZE__        2\r
+#define __mrfi_RX_METRICS_RSSI_OFS__    0\r
+#define __mrfi_RX_METRICS_CRC_LQI_OFS__ 1\r
+#define __mrfi_RX_METRICS_CRC_OK_MASK__ 0x80\r
+#define __mrfi_RX_METRICS_LQI_MASK__    0x7F\r
+\r
+#define __mrfi_NUM_LOGICAL_CHANS__      4\r
+#define __mrfi_NUM_POWER_SETTINGS__     3\r
+\r
+#define __mrfi_BACKOFF_PERIOD_USECS__   250\r
+\r
+#define __mrfi_LENGTH_FIELD_OFS__       0\r
+#define __mrfi_FCF_OFS__                (__mrfi_LENGTH_FIELD_OFS__ +  __mrfi_LENGTH_FIELD_SIZE__)\r
+#define __mrfi_DSN_OFS__                (__mrfi_FCF_OFS__          +  __mrfi_FCF_SIZE__)\r
+#define __mrfi_DST_ADDR_OFS__           (__mrfi_DSN_OFS__          +  __mrfi_DSN_SIZE__)\r
+#define __mrfi_SRC_ADDR_OFS__           (__mrfi_DST_ADDR_OFS__     +  __mrfi_ADDR_SIZE__)\r
+#define __mrfi_PAYLOAD_OFS__            (__mrfi_SRC_ADDR_OFS__     +  __mrfi_ADDR_SIZE__)\r
+\r
+#define __mrfi_HEADER_SIZE__            ((2 * __mrfi_ADDR_SIZE__) + __mrfi_FCF_SIZE__ + __mrfi_DSN_SIZE__)\r
+#define __mrfi_FRAME_OVERHEAD_SIZE__    (__mrfi_LENGTH_FIELD_SIZE__ + __mrfi_HEADER_SIZE__)\r
+\r
+#define __mrfi_GET_PAYLOAD_LEN__(p)     ((p)->frame[__mrfi_LENGTH_FIELD_OFS__] - __mrfi_HEADER_SIZE__)\r
+#define __mrfi_SET_PAYLOAD_LEN__(p,x)   st( (p)->frame[__mrfi_LENGTH_FIELD_OFS__] = x + __mrfi_HEADER_SIZE__; )\r
+\r
+#endif\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                   Radio Family Commonality\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#define __mrfi_P_DST_ADDR__(p)          (&((p)->frame[__mrfi_DST_ADDR_OFS__]))\r
+#define __mrfi_P_SRC_ADDR__(p)          (&((p)->frame[__mrfi_SRC_ADDR_OFS__]))\r
+#define __mrfi_P_PAYLOAD__(p)           (&((p)->frame[__mrfi_PAYLOAD_OFS__]))\r
+\r
+\r
+/* ************************************************************************************************\r
+ *                                   Compile Time Integrity Checks\r
+ * ************************************************************************************************\r
+ */\r
+\r
+/* verify that only one supported radio is selected */\r
+#define MRFI_NUM_SUPPORTED_RADIOS_SELECTED   ((defined MRFI_CC1100) + \\r
+                                              (defined MRFI_CC1101) + \\r
+                                              (defined MRFI_CC1110) + \\r
+                                              (defined MRFI_CC1111) + \\r
+                                              (defined MRFI_CC1100E_470) + \\r
+                                              (defined MRFI_CC1100E_950) + \\r
+                                              (defined MRFI_CC2500) + \\r
+                                              (defined MRFI_CC2510) + \\r
+                                              (defined MRFI_CC2511) + \\r
+                                              (defined MRFI_CC2430) + \\r
+                                              (defined MRFI_CC2431) + \\r
+                                              (defined MRFI_CC2520) + \\r
+                                              (defined MRFI_CC430)  + \\r
+                                              (defined MRFI_CC2530))\r
+#if (MRFI_NUM_SUPPORTED_RADIOS_SELECTED == 0)\r
+#error "ERROR: A valid radio is not selected."\r
+#elif (MRFI_NUM_SUPPORTED_RADIOS_SELECTED > 1)\r
+#error "ERROR: More than one radio is selected."\r
+#endif\r
+\r
+/* verify that a radio family is selected */\r
+#if (!defined MRFI_RADIO_FAMILY1) && \\r
+    (!defined MRFI_RADIO_FAMILY2) && \\r
+    (!defined MRFI_RADIO_FAMILY3) && \\r
+    (!defined MRFI_RADIO_FAMILY4) && \\r
+    (!defined MRFI_RADIO_FAMILY5) && \\r
+    (!defined MRFI_RADIO_FAMILY6)\r
+#error "ERROR: A radio family has not been assigned."\r
+#endif\r
+\r
+\r
+/**************************************************************************************************\r
+ */\r
+#endif\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/Components/mrfi/radios/family5/mrfi_radio.c b/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/Components/mrfi/radios/family5/mrfi_radio.c
new file mode 100755 (executable)
index 0000000..9de4b6a
--- /dev/null
@@ -0,0 +1,1778 @@
+/**************************************************************************************************\r
+  Revised:        $Date: 2009-11-23 07:50:43 -0800 (Mon, 23 Nov 2009) $\r
+  Revision:       $Revision: 21225 $\r
+\r
+  Copyright 2008-2009 Texas Instruments Incorporated.  All rights reserved.\r
+\r
+  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+  the terms of a software license agreement between the user who downloaded the software,\r
+  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+  License. The License limits your use, and you acknowledge, that the Software may not be\r
+  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+  perform, display or sell this Software and/or its documentation for any purpose.\r
+\r
+  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS?\r
+  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+\r
+  Should you have any questions regarding your right to use this Software,\r
+  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+/* ~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=\r
+ *   MRFI (Minimal RF Interface)\r
+ *   Radios: CC430\r
+ *   Primary code file for supported radios.\r
+ * ~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=\r
+ */\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                          Includes\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#include <string.h>\r
+#include "mrfi.h"\r
+#include "bsp.h"\r
+#include "bsp_macros.h"\r
+#include "bsp_external/mrfi_board_defs.h"\r
+#include "mrfi_defs.h"\r
+#include "mrfi_radio_interface.h"\r
+#include "smartrf/CC430/smartrf_CC430.h"\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                    Global Constants\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+const uint8_t mrfiBroadcastAddr[] = { 0xFF, 0xFF, 0xFF, 0xFF };\r
+\r
+/* verify number of table entries matches the corresponding #define */\r
+BSP_STATIC_ASSERT(MRFI_ADDR_SIZE == ((sizeof(mrfiBroadcastAddr)/sizeof(mrfiBroadcastAddr[0])) * sizeof(mrfiBroadcastAddr[0])));\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                          Defines\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#if (defined MRFI_CC430)\r
+  #define MRFI_RSSI_OFFSET    74   /* no units */\r
+#else\r
+  #error "ERROR: RSSI offset value not defined for this radio"\r
+#endif\r
+\r
+#define MRFI_LENGTH_FIELD_OFS               __mrfi_LENGTH_FIELD_OFS__\r
+#define MRFI_LENGTH_FIELD_SIZE              __mrfi_LENGTH_FIELD_SIZE__\r
+#define MRFI_HEADER_SIZE                    __mrfi_HEADER_SIZE__\r
+#define MRFI_FRAME_BODY_OFS                 __mrfi_DST_ADDR_OFS__\r
+#define MRFI_BACKOFF_PERIOD_USECS           __mrfi_BACKOFF_PERIOD_USECS__\r
+\r
+#define MRFI_RANDOM_OFFSET                   67\r
+#define MRFI_RANDOM_MULTIPLIER              109\r
+#define MRFI_MIN_SMPL_FRAME_SIZE            (MRFI_HEADER_SIZE + NWK_HDR_SIZE)\r
+\r
+/* rx metrics definitions, known as appended "packet status bytes" in datasheet parlance */\r
+#define MRFI_RX_METRICS_CRC_OK_MASK         __mrfi_RX_METRICS_CRC_OK_MASK__\r
+#define MRFI_RX_METRICS_LQI_MASK            __mrfi_RX_METRICS_LQI_MASK__\r
+\r
+\r
+/* ---------- Radio Abstraction ---------- */\r
+\r
+#define MRFI_RADIO_PARTNUM          0x00\r
+#define MRFI_RADIO_VERSION          0x06\r
+\r
+/* GDO0 == PA_PD signal */\r
+#define MRFI_SETTING_IOCFG0     27\r
+\r
+/* GDO1 == RSSI_VALID signal */\r
+#define MRFI_SETTING_IOCFG1     30\r
+\r
+/* Main Radio Control State Machine control configuration:\r
+ * Auto Calibrate - when going from IDLE to RX/TX\r
+ * XOSC is OFF in Sleep state.\r
+ */\r
+#define MRFI_SETTING_MCSM0      (0x10)\r
+\r
+/* Main Radio Control State Machine control configuration:\r
+ * - Remain RX state after RX\r
+ * - Go to IDLE after TX\r
+ * - RSSI below threshold and NOT receiving.\r
+ */\r
+#define MRFI_SETTING_MCSM1      0x3C\r
+\r
+/*\r
+ *  Packet Length - Setting for maximum allowed packet length.\r
+ *  The PKTLEN setting does not include the length field but maximum frame size does.\r
+ *  Subtract length field size from maximum frame size to get value for PKTLEN.\r
+ */\r
+#define MRFI_SETTING_PKTLEN     (MRFI_MAX_FRAME_SIZE - MRFI_LENGTH_FIELD_SIZE)\r
+\r
+/* Packet automation control - Original value except WHITE_DATA is extracted from SmartRF setting. */\r
+#define MRFI_SETTING_PKTCTRL0   (0x05 | (SMARTRF_SETTING_PKTCTRL0 & BV(6)))\r
+\r
+/* FIFO threshold - this register has fields that need to be configured for the CC1101 */\r
+#define MRFI_SETTING_FIFOTHR    (0x07 | (SMARTRF_SETTING_FIFOTHR & (BV(4)|BV(5)|BV(6)|BV(7))))\r
+\r
+/* Max time we can be in a critical section within the delay function.\r
+ * This could be fine-tuned by observing the overhead is calling the bsp delay\r
+ * function. The overhead should be very small compared to this value.\r
+ */\r
+#define MRFI_MAX_DELAY_US 16 /* usec */\r
+\r
+/* Packet automation control - base value is power up value whick has APPEND_STATUS enabled; no CRC autoflush */\r
+#define PKTCTRL1_BASE_VALUE         BV(2)\r
+#define PKTCTRL1_ADDR_FILTER_OFF    PKTCTRL1_BASE_VALUE\r
+#define PKTCTRL1_ADDR_FILTER_ON     (PKTCTRL1_BASE_VALUE | (BV(0)|BV(1)))\r
+\r
+#ifdef MRFI_ASSERTS_ARE_ON\r
+#define RX_FILTER_ADDR_INITIAL_VALUE  0xFF\r
+#endif\r
+\r
+  /* The SW timer is calibrated by adjusting the call to the microsecond delay\r
+   * routine. This allows maximum calibration control with repects to the longer\r
+   * times requested by applicationsd and decouples internal from external calls\r
+   * to the microsecond routine which can be calibrated independently.\r
+   */\r
+#if defined(SW_TIMER)\r
+#define APP_USEC_VALUE    1000\r
+#else\r
+#define APP_USEC_VALUE    1000\r
+#endif\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                           Macros\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#define MRFI_ENABLE_SYNC_PIN_INT()                  (RF1AIE |= BV(9))\r
+#define MRFI_DISABLE_SYNC_PIN_INT()                 (RF1AIE &= ~BV(9))\r
+#define MRFI_CLEAR_SYNC_PIN_INT_FLAG()              (RF1AIFG &= ~BV(9))\r
+#define MRFI_SYNC_PIN_INT_IS_ENABLED()              (RF1AIE & BV(9))\r
+#define MRFI_SYNC_PIN_IS_HIGH()                     (RF1AIN & BV(9))\r
+#define MRFI_SYNC_PIN_INT_FLAG_IS_SET()             (RF1AIFG & BV(9))\r
+\r
+\r
+#define MRFI_CLEAR_PAPD_PIN_INT_FLAG()              (RF1AIFG &= ~BV(0))\r
+#define MRFI_PAPD_PIN_IS_HIGH()                     (RF1AIN & BV(0))\r
+#define MRFI_PAPD_INT_FLAG_IS_SET()                 (RF1AIFG & BV(0))\r
+\r
+\r
+/* RSSI valid signal is available on the GDO_1 */\r
+#define MRFI_RSSI_VALID_WAIT()  while(!(RF1AIN & BV(1)));\r
+\r
+\r
+/* Abstract radio interface calls. Could use these later to\r
+ * merge code from similar radio but different interface.\r
+ */\r
+#define MRFI_STROBE(cmd)                      mrfiRadioInterfaceCmdStrobe(cmd)\r
+#define MRFI_RADIO_REG_READ(reg)              mrfiRadioInterfaceReadReg(reg)\r
+#define MRFI_RADIO_REG_WRITE(reg, value)      mrfiRadioInterfaceWriteReg(reg, value)\r
+#define MRFI_RADIO_WRITE_TX_FIFO(pData, len)  mrfiRadioInterfaceWriteTxFifo(pData, len)\r
+#define MRFI_RADIO_READ_RX_FIFO(pData, len)   mrfiRadioInterfaceReadRxFifo(pData, len)\r
+\r
+\r
+#define MRFI_STROBE_IDLE_AND_WAIT()              \\r
+{                                                \\r
+  MRFI_STROBE( SIDLE );                          \\r
+  /* Wait for XOSC to be stable and radio in IDLE state */ \\r
+  while (MRFI_STROBE( SNOP ) & 0xF0) ;           \\r
+}\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                    Local Constants\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+const uint8_t mrfiRadioCfg[][2] =\r
+{\r
+  /* internal radio configuration */\r
+  {  IOCFG0,    MRFI_SETTING_IOCFG0       }, /* Configure GDO_0 to output PA_PD signal (low during TX, high otherwise). */\r
+  {  IOCFG1,    MRFI_SETTING_IOCFG1       }, /* Configure GDO_1 to output RSSI_VALID signal (high when RSSI is valid, low otherwise). */\r
+  {  MCSM1,     MRFI_SETTING_MCSM1        }, /* CCA mode, RX_OFF_MODE and TX_OFF_MODE */\r
+  {  MCSM0,     MRFI_SETTING_MCSM0        }, /* AUTO_CAL and XOSC state in sleep */\r
+  {  PKTLEN,    MRFI_SETTING_PKTLEN       },\r
+  {  PKTCTRL0,  MRFI_SETTING_PKTCTRL0     },\r
+  {  FIFOTHR,   MRFI_SETTING_FIFOTHR      },\r
+\r
+/* imported SmartRF radio configuration */\r
+\r
+  {  FSCTRL1,   SMARTRF_SETTING_FSCTRL1   },\r
+  {  FSCTRL0,   SMARTRF_SETTING_FSCTRL0   },\r
+  {  FREQ2,     SMARTRF_SETTING_FREQ2     },\r
+  {  FREQ1,     SMARTRF_SETTING_FREQ1     },\r
+  {  FREQ0,     SMARTRF_SETTING_FREQ0     },\r
+  {  MDMCFG4,   SMARTRF_SETTING_MDMCFG4   },\r
+  {  MDMCFG3,   SMARTRF_SETTING_MDMCFG3   },\r
+  {  MDMCFG2,   SMARTRF_SETTING_MDMCFG2   },\r
+  {  MDMCFG1,   SMARTRF_SETTING_MDMCFG1   },\r
+  {  MDMCFG0,   SMARTRF_SETTING_MDMCFG0   },\r
+  {  DEVIATN,   SMARTRF_SETTING_DEVIATN   },\r
+  {  FOCCFG,    SMARTRF_SETTING_FOCCFG    },\r
+  {  BSCFG,     SMARTRF_SETTING_BSCFG     },\r
+  {  AGCCTRL2,  SMARTRF_SETTING_AGCCTRL2  },\r
+  {  AGCCTRL1,  SMARTRF_SETTING_AGCCTRL1  },\r
+  {  AGCCTRL0,  SMARTRF_SETTING_AGCCTRL0  },\r
+  {  FREND1,    SMARTRF_SETTING_FREND1    },\r
+  {  FREND0,    SMARTRF_SETTING_FREND0    },\r
+  {  FSCAL3,    SMARTRF_SETTING_FSCAL3    },\r
+  {  FSCAL2,    SMARTRF_SETTING_FSCAL2    },\r
+  {  FSCAL1,    SMARTRF_SETTING_FSCAL1    },\r
+  {  FSCAL0,    SMARTRF_SETTING_FSCAL0    },\r
+  {  TEST2,     SMARTRF_SETTING_TEST2     },\r
+  {  TEST1,     SMARTRF_SETTING_TEST1     },\r
+  {  TEST0,     SMARTRF_SETTING_TEST0     },\r
+};\r
+\r
+\r
+/*\r
+ *  Logical channel table - this table translates logical channel into\r
+ *  actual radio channel number.  Channel 0, the default channel, is\r
+ *  determined by the channel exported from SmartRF Studio.  The other\r
+ *  table entries are derived from that default.  Each derived channel is\r
+ *  masked with 0xFF to prevent generation of an illegal channel number.\r
+ *\r
+ *  This table is easily customized.  Just replace or add entries as needed.\r
+ *  If the number of entries changes, the corresponding #define must also\r
+ *  be adjusted.  It is located in mrfi_defs.h and is called __mrfi_NUM_LOGICAL_CHANS__.\r
+ *  The static assert below ensures that there is no mismatch.\r
+ */\r
+// [BM] Changed channel assignment to comply with local regulations\r
+#ifdef ISM_EU \r
+static const uint8_t mrfiLogicalChanTable[] =\r
+{\r
+  0,\r
+  50,\r
+  80,\r
+  110\r
+};\r
+#else\r
+       #ifdef ISM_US\r
+       static const uint8_t mrfiLogicalChanTable[] =\r
+       {\r
+         20,\r
+         50,\r
+         80,\r
+         110\r
+       };\r
+       #else\r
+               #ifdef ISM_LF\r
+               static const uint8_t mrfiLogicalChanTable[] =\r
+               {\r
+                 0,\r
+                 50,\r
+                 80,\r
+                 110\r
+               };              \r
+               #else\r
+                       #error "Wrong ISM band specified (valid are ISM_LF, ISM_EU and ISM_US)"\r
+               #endif\r
+       #endif\r
+#endif\r
+//static const uint8_t mrfiLogicalChanTable[] =\r
+//{\r
+//  SMARTRF_SETTING_CHANNR,\r
+//  50,\r
+//  80,\r
+//  110\r
+//};\r
+/* verify number of table entries matches the corresponding #define */\r
+BSP_STATIC_ASSERT(__mrfi_NUM_LOGICAL_CHANS__ == ((sizeof(mrfiLogicalChanTable)/sizeof(mrfiLogicalChanTable[0])) * sizeof(mrfiLogicalChanTable[0])));\r
+\r
+/*\r
+ *  RF Power setting table - this table translates logical power value\r
+ *  to radio register setting.  The logical power value is used directly\r
+ *  as an index into the power setting table. The values in the table are\r
+ *  from low to high. The default settings set 3 values: -20 dBm, -10 dBm,\r
+ *  and 0 dBm. The default at startup is the highest value. Note that these\r
+ *  are approximate depending on the radio. Information is taken from the\r
+ *  data sheet.\r
+ *\r
+ *  This table is easily customized.  Just replace or add entries as needed.\r
+ *  If the number of entries changes, the corresponding #define must also\r
+ *  be adjusted.  It is located in mrfi_defs.h and is called __mrfi_NUM_POWER_SETTINGS__.\r
+ *  The static assert below ensures that there is no mismatch.\r
+ *\r
+ * For the CC430 use the CC1100 values.\r
+ */\r
+static const uint8_t mrfiRFPowerTable[] =\r
+{\r
+// [BM] Changed default output power to comply with dongle settings\r
+  0x0F,\r
+  0x27,\r
+// [BM] Increase output power from -0.3dBm to +1.4dBm (433MHz) / +1.1dBm (868MHz) / +1.3dBm (915MHz) to compensate antenna loss  \r
+#ifdef ISM_EU \r
+  0x8C\r
+#else\r
+  #ifdef ISM_US\r
+    0x8B\r
+  #else\r
+       #ifdef ISM_LF\r
+               0x8D\r
+       #else\r
+           #error "Wrong ISM band specified (valid are ISM_LF, ISM_EU and ISM_US)"\r
+    #endif\r
+  #endif\r
+#endif\r
+};\r
+//static const uint8_t mrfiRFPowerTable[] =\r
+//{\r
+//  0x0D,\r
+//  0x34,\r
+//  0x8E\r
+//};\r
+\r
+/* verify number of table entries matches the corresponding #define */\r
+BSP_STATIC_ASSERT(__mrfi_NUM_POWER_SETTINGS__ == ((sizeof(mrfiRFPowerTable)/sizeof(mrfiRFPowerTable[0])) * sizeof(mrfiRFPowerTable[0])));\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                       Local Prototypes\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+static void Mrfi_SyncPinRxIsr(void);\r
+static void Mrfi_RxModeOn(void);\r
+static void Mrfi_RandomBackoffDelay(void);\r
+static void Mrfi_RxModeOff(void);\r
+static void Mrfi_DelayUsec(uint16_t howLong);\r
+static void Mrfi_DelayUsecSem(uint16_t howLong);\r
+static int8_t Mrfi_CalculateRssi(uint8_t rawValue);\r
+static uint8_t Mrfi_RxAddrIsFiltered(uint8_t * pAddr);\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                       Local Variables\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+static uint8_t mrfiRadioState  = MRFI_RADIO_STATE_UNKNOWN;\r
+static mrfiPacket_t mrfiIncomingPacket;\r
+static uint8_t mrfiRndSeed = 0;\r
+\r
+/* reply delay support */\r
+static volatile uint8_t  sKillSem = 0;\r
+static volatile uint8_t  sReplyDelayContext = 0;\r
+static          uint16_t sReplyDelayScalar = 0;\r
+static          uint16_t sBackoffHelper = 0;\r
+\r
+static uint8_t mrfiRxFilterEnabled = 0;\r
+static uint8_t mrfiRxFilterAddr[MRFI_ADDR_SIZE] = { RX_FILTER_ADDR_INITIAL_VALUE };\r
+\r
+/* These counters are only for diagnostic purpose */\r
+static uint32_t crcFail = 0;\r
+static uint32_t crcPass = 0;\r
+static uint32_t noFrame = 0;\r
+\r
+// [BM] Radio frequency offset read from calibration memory\r
+// Compensates crystal deviation from 26MHz nominal value\r
+extern unsigned char rf_frequoffset;\r
+\r
+/**************************************************************************************************\r
+ * @fn          MRFI_Init\r
+ *\r
+ * @brief       Initialize MRFI.\r
+ *\r
+ * @param       none\r
+ *\r
+ * @return      none\r
+ **************************************************************************************************\r
+ */\r
+void MRFI_Init(void)\r
+{\r
+  /* ------------------------------------------------------------------\r
+   *    Radio power-up reset\r
+   *   ----------------------\r
+   */\r
+  memset(&mrfiIncomingPacket, 0x0, sizeof(mrfiIncomingPacket));\r
+\r
+  /* Initialize the radio interface */\r
+  mrfiRadioInterfaceInit();\r
+\r
+  /* Strobe Reset: Resets the radio and puts it in SLEEP state. */\r
+  MRFI_STROBE( SRES );\r
+\r
+  /* verify the correct radio is installed */\r
+  MRFI_ASSERT( MRFI_RADIO_REG_READ( PARTNUM ) == MRFI_RADIO_PARTNUM );  /* incorrect radio specified */\r
+  MRFI_ASSERT( MRFI_RADIO_REG_READ( VERSION ) == MRFI_RADIO_VERSION );  /* incorrect radio specified  */\r
+\r
+  /* Put radio in Idle state */\r
+  MRFI_STROBE_IDLE_AND_WAIT();\r
+\r
+\r
+  /* ------------------------------------------------------------------\r
+   *    Configure radio\r
+   *   -----------------\r
+   */\r
+\r
+  /* Configure Radio interrupts:\r
+   *\r
+   * RF1AIN_0 => Programmed to PA_PD signal.\r
+   *             Configure it to interrupt on falling edge.\r
+   *\r
+   * RF1AIN_1 => Programmed to RSSI Valid signal.\r
+   *             No need to configure for interrupt. This value will be read\r
+   *             through polling.\r
+   *\r
+   * RF1AIN_9 => Rising edge indicates SYNC sent/received and\r
+   *             Falling edge indicates end of packet.\r
+   *             Configure it to interrupt on falling edge.\r
+   */\r
+\r
+  /* Select Interrupt edge for PA_PD and SYNC signal:\r
+   * Interrupt Edge select register: 1 == Interrupt on High to Low transition.\r
+   */\r
+  RF1AIES = BV(0) | BV(9);\r
+\r
+  /* Write the power output to the PA_TABLE and verify the write operation.  */\r
+  {\r
+    uint8_t      readbackPATableValue = 0;\r
+    bspIState_t  s;\r
+\r
+    BSP_ENTER_CRITICAL_SECTION(s);\r
+\r
+    while( !(RF1AIFCTL1 & RFINSTRIFG));\r
+    RF1AINSTRW = 0x7E51;                    /* PA Table write (burst) */\r
+\r
+    while( !(RF1AIFCTL1 & RFINSTRIFG));\r
+    RF1AINSTRB = RF_SNOP;                   /* reset pointer */\r
+\r
+    while( !(RF1AIFCTL1 & RFINSTRIFG));\r
+    RF1AINSTRB = 0xFE;                      /* PA Table read (burst) */\r
+\r
+    while( !(RF1AIFCTL1 & RFDINIFG));\r
+    RF1ADINB    = 0x00;                     /* dummy write */\r
+\r
+    while( !(RF1AIFCTL1 & RFDOUTIFG));\r
+    readbackPATableValue = RF1ADOUT0B;\r
+\r
+    MRFI_ASSERT(readbackPATableValue == 0x51);\r
+\r
+    while( !(RF1AIFCTL1 & RFINSTRIFG));\r
+    RF1AINSTRB = RF_SNOP;\r
+\r
+    BSP_EXIT_CRITICAL_SECTION(s);\r
+  }\r
+\r
+  /* initialize radio registers */\r
+  {\r
+    uint8_t i;\r
+\r
+    for (i=0; i<(sizeof(mrfiRadioCfg)/sizeof(mrfiRadioCfg[0])); i++)\r
+    {\r
+      MRFI_RADIO_REG_WRITE(mrfiRadioCfg[i][0], mrfiRadioCfg[i][1]);\r
+    }\r
+  }\r
+\r
+  /* Confirm that the values were written correctly.\r
+   */\r
+  {\r
+    uint8_t i;\r
+\r
+    for (i=0; i<(sizeof(mrfiRadioCfg)/sizeof(mrfiRadioCfg[0])); i++)\r
+    {\r
+        MRFI_ASSERT( mrfiRadioCfg[i][1] == MRFI_RADIO_REG_READ(mrfiRadioCfg[i][0]) );\r
+    }\r
+  }\r
+\r
+  // [BM] Apply global frequency offset to FSCTRL0\r
+  MRFI_STROBE_IDLE_AND_WAIT();\r
+  MRFI_RADIO_REG_WRITE(FSCTRL0, rf_frequoffset);\r
+  \r
+  /* set default channel */\r
+  MRFI_SetLogicalChannel( 0 );\r
+\r
+  /* Set default power level */\r
+  MRFI_SetRFPwr(MRFI_NUM_POWER_SETTINGS- 1);\r
+\r
+  /* Generate Random seed:\r
+   * We will use the RSSI value to generate our random seed.\r
+   */\r
+\r
+  /* Put the radio in RX state */\r
+  MRFI_STROBE( SRX );\r
+\r
+  /* delay for the rssi to be valid */\r
+  MRFI_RSSI_VALID_WAIT();\r
+\r
+  {\r
+    uint8_t i;\r
+    for(i=0; i<16; i++)\r
+    {\r
+      /* use most random bit of rssi to populate the random seed */\r
+      mrfiRndSeed = (mrfiRndSeed << 1) | (MRFI_RADIO_REG_READ(RSSI) & 0x01);\r
+    }\r
+  }\r
+\r
+  /* Force the seed to be non-zero by setting one bit, just in case... */\r
+  mrfiRndSeed |= 0x0080;\r
+\r
+  /* Turn off RF. */\r
+  Mrfi_RxModeOff();\r
+\r
+  /* Strobe Power Down (SPWD): puts the radio in SLEEP state. */\r
+  /* Chip bug: Radio does not come out of this SLEEP when put to sleep\r
+   * using the SPWD cmd. However, it does wakes up if SXOFF was used to\r
+   * put it to sleep.\r
+   */\r
+  MRFI_STROBE( SXOFF );\r
+\r
+  /* Initial radio state is IDLE state */\r
+  mrfiRadioState = MRFI_RADIO_STATE_OFF;\r
+\r
+  /*****************************************************************************************\r
+   *                            Compute reply delay scalar\r
+   *\r
+   * Formula from data sheet for all the narrow band radios is:\r
+   *\r
+   *                (256 + DATAR_Mantissa) * 2^(DATAR_Exponent)\r
+   * DATA_RATE =    ------------------------------------------ * f(xosc)\r
+   *                                    2^28\r
+   *\r
+   * To try and keep some accuracy we change the exponent of the denominator\r
+   * to (28 - (exponent from the configuration register)) so we do a division\r
+   * by a smaller number. We find the power of 2 by shifting.\r
+   *\r
+   * The maximum delay needed depends on the MAX_APP_PAYLOAD parameter. Figure\r
+   * out how many bits that will be when overhead is included. Bits/bits-per-second\r
+   * is seconds to transmit (or receive) the maximum frame. We multiply this number\r
+   * by 1000 to find the time in milliseconds. We then additionally multiply by\r
+   * 10 so we can add 5 and divide by 10 later, thus rounding up to the number of\r
+   * milliseconds. This last won't matter for slow transmissions but for faster ones\r
+   * we want to err on the side of being conservative and making sure the radio is on\r
+   * to receive the reply. The semaphore monitor will shut it down. The delay adds in\r
+   * a fudge factor that includes processing time on peer plus lags in Rx and processing\r
+   * time on receiver's side.\r
+   *\r
+   * Note that we assume a 26 MHz clock for the radio...\r
+   * ***************************************************************************************\r
+   */\r
+#define   MRFI_RADIO_OSC_FREQ         26000000\r
+#define   PHY_PREAMBLE_SYNC_BYTES     8\r
+\r
+  {\r
+    uint32_t dataRate, bits;\r
+    uint16_t exponent, mantissa;\r
+\r
+    /* mantissa is in MDMCFG3 */\r
+    mantissa = 256 + SMARTRF_SETTING_MDMCFG3;\r
+\r
+    /* exponent is lower nibble of MDMCFG4. */\r
+    exponent = 28 - (SMARTRF_SETTING_MDMCFG4 & 0x0F);\r
+\r
+    /* we can now get data rate */\r
+    dataRate = mantissa * (MRFI_RADIO_OSC_FREQ>>exponent);\r
+\r
+    bits = ((uint32_t)((PHY_PREAMBLE_SYNC_BYTES + MRFI_MAX_FRAME_SIZE)*8))*10000;\r
+\r
+    /* processing on the peer + the Tx/Rx time plus more */\r
+    sReplyDelayScalar = PLATFORM_FACTOR_CONSTANT + (((bits/dataRate)+5)/10);\r
+\r
+    /* This helper value is used to scale the backoffs during CCA. At very\r
+     * low data rates we need to backoff longer to prevent continual sampling\r
+     * of valid frames which take longer to send at lower rates. Use the scalar\r
+     * we just calculated divided by 32. With the backoff algorithm backing\r
+     * off up to 16 periods this will result in waiting up to about 1/2 the total\r
+     * scalar value. For high data rates this does not contribute at all. Value\r
+     * is in microseconds.\r
+     */\r
+    sBackoffHelper = MRFI_BACKOFF_PERIOD_USECS + (sReplyDelayScalar>>5)*1000;\r
+  }\r
+\r
+  /* Clean out buffer to protect against spurious frames */\r
+  memset(mrfiIncomingPacket.frame, 0x00, sizeof(mrfiIncomingPacket.frame));\r
+  memset(mrfiIncomingPacket.rxMetrics, 0x00, sizeof(mrfiIncomingPacket.rxMetrics));\r
+\r
+  /* enable global interrupts */\r
+  BSP_ENABLE_INTERRUPTS();\r
+}\r
+\r
+\r
+/**************************************************************************************************\r
+ * @fn          MRFI_Transmit\r
+ *\r
+ * @brief       Transmit a packet using CCA algorithm.\r
+ *\r
+ * @param       pPacket - pointer to packet to transmit\r
+ *\r
+ * @return      Return code indicates success or failure of transmit:\r
+ *                  MRFI_TX_RESULT_SUCCESS - transmit succeeded\r
+ *                  MRFI_TX_RESULT_FAILED  - transmit failed because CCA failed\r
+ **************************************************************************************************\r
+ */\r
+uint8_t MRFI_Transmit(mrfiPacket_t * pPacket, uint8_t txType)\r
+{\r
+  uint8_t ccaRetries;\r
+  uint8_t txBufLen;\r
+  uint8_t returnValue = MRFI_TX_RESULT_SUCCESS;\r
+\r
+  /* radio must be awake to transmit */\r
+  MRFI_ASSERT( mrfiRadioState != MRFI_RADIO_STATE_OFF );\r
+\r
+  /* Turn off reciever. We can ignore/drop incoming packets during transmit. */\r
+  Mrfi_RxModeOff();\r
+\r
+  /* compute number of bytes to write to transmit FIFO */\r
+  txBufLen = pPacket->frame[MRFI_LENGTH_FIELD_OFS] + MRFI_LENGTH_FIELD_SIZE;\r
+\r
+  /* ------------------------------------------------------------------\r
+   *    Write packet to transmit FIFO\r
+   *   --------------------------------\r
+   */\r
+  MRFI_RADIO_WRITE_TX_FIFO(&(pPacket->frame[0]), txBufLen);\r
+\r
+\r
+  /* ------------------------------------------------------------------\r
+   *    Immediate transmit\r
+   *   ---------------------\r
+   */\r
+  if (txType == MRFI_TX_TYPE_FORCED)\r
+  {\r
+    /* Issue the TX strobe. */\r
+    MRFI_STROBE( STX );\r
+\r
+    /* Wait for transmit to complete */\r
+    while(!MRFI_SYNC_PIN_INT_FLAG_IS_SET());\r
+\r
+    /* Clear the interrupt flag */\r
+    MRFI_CLEAR_SYNC_PIN_INT_FLAG();\r
+  }\r
+  else\r
+  {\r
+    /* ------------------------------------------------------------------\r
+     *    CCA transmit\r
+     *   ---------------\r
+     */\r
+\r
+    MRFI_ASSERT( txType == MRFI_TX_TYPE_CCA );\r
+\r
+    /* set number of CCA retries */\r
+    ccaRetries = MRFI_CCA_RETRIES;\r
+\r
+\r
+    /* ===============================================================================\r
+     *    Main Loop\r
+     *  =============\r
+     */\r
+    for (;;)\r
+    {\r
+      /* Radio must be in RX mode for CCA to happen.\r
+       * Otherwise it will transmit without CCA happening.\r
+       */\r
+\r
+      /* Can not use the Mrfi_RxModeOn() function here since it turns on the\r
+       * Rx interrupt, which we don't want in this case.\r
+       */\r
+      MRFI_STROBE( SRX );\r
+\r
+      /* wait for the rssi to be valid. */\r
+      MRFI_RSSI_VALID_WAIT();\r
+\r
+      /*\r
+       *  Clear the PA_PD pin interrupt flag.  This flag, not the interrupt itself,\r
+       *  is used to capture the transition that indicates a transmit was started.\r
+       *  The pin level cannot be used to indicate transmit success as timing may\r
+       *  prevent the transition from being detected.  The interrupt latch captures\r
+       *  the event regardless of timing.\r
+       */\r
+      MRFI_CLEAR_PAPD_PIN_INT_FLAG();\r
+\r
+      /* send strobe to initiate transmit */\r
+      MRFI_STROBE( STX );\r
+\r
+      /* Delay long enough for the PA_PD signal to indicate a\r
+       * successful transmit. This is the 250 XOSC periods\r
+       * (9.6 us for a 26 MHz crystal).\r
+       * Found out that we need a delay of atleast 25 us on CC1100 to see\r
+       * the PA_PD signal change. Hence keeping the same for CC430\r
+       */\r
+      Mrfi_DelayUsec(25);\r
+\r
+\r
+      /* PA_PD signal goes from HIGH to LOW when going from RX to TX state.\r
+       * This transition is trapped as a falling edge interrupt flag\r
+       * to indicate that CCA passed and the transmit has started.\r
+       */\r
+      if (MRFI_PAPD_INT_FLAG_IS_SET())\r
+      {\r
+        /* ------------------------------------------------------------------\r
+        *    Clear Channel Assessment passed.\r
+        *   ----------------------------------\r
+        */\r
+\r
+        /* Clear the PA_PD int flag */\r
+        MRFI_CLEAR_PAPD_PIN_INT_FLAG();\r
+\r
+        /* PA_PD signal stays LOW while in TX state and goes back to HIGH when\r
+         * the radio transitions to RX state.\r
+         */\r
+        /* wait for transmit to complete */\r
+        while (!MRFI_PAPD_PIN_IS_HIGH());\r
+\r
+        /* transmit done, break */\r
+        break;\r
+      }\r
+      else\r
+      {\r
+        /* ------------------------------------------------------------------\r
+         *    Clear Channel Assessment failed.\r
+         *   ----------------------------------\r
+         */\r
+\r
+        /* Turn off radio and save some power during backoff */\r
+\r
+        /* NOTE: Can't use Mrfi_RxModeOff() - since it tries to update the\r
+         * sync signal status which we are not using during the TX operation.\r
+         */\r
+        MRFI_STROBE_IDLE_AND_WAIT();\r
+\r
+        /* flush the receive FIFO of any residual data */\r
+        MRFI_STROBE( SFRX );\r
+\r
+        /* Retry ? */\r
+        if (ccaRetries != 0)\r
+        {\r
+          /* delay for a random number of backoffs */\r
+          Mrfi_RandomBackoffDelay();\r
+\r
+          /* decrement CCA retries before loop continues */\r
+          ccaRetries--;\r
+        }\r
+        else /* No CCA retries are left, abort */\r
+        {\r
+          /* set return value for failed transmit and break */\r
+          returnValue = MRFI_TX_RESULT_FAILED;\r
+          break;\r
+        }\r
+      } /* CCA Failed */\r
+    } /* CCA loop */\r
+  }/* txType is CCA */\r
+\r
+\r
+  /* Done with TX. Clean up time... */\r
+\r
+  /* Radio is already in IDLE state */\r
+\r
+  /*\r
+   * Flush the transmit FIFO.  It must be flushed so that\r
+   * the next transmit can start with a clean slate.\r
+   */\r
+  MRFI_STROBE( SFTX );\r
+\r
+  /* If the radio was in RX state when transmit was attempted,\r
+   * put it back to Rx On state.\r
+   */\r
+  if(mrfiRadioState == MRFI_RADIO_STATE_RX)\r
+  {\r
+    Mrfi_RxModeOn();\r
+  }\r
+\r
+  return( returnValue );\r
+}\r
+\r
+/**************************************************************************************************\r
+ * @fn          MRFI_Receive\r
+ *\r
+ * @brief       Copies last packet received to the location specified.\r
+ *              This function is meant to be called after the ISR informs\r
+ *              higher level code that there is a newly received packet.\r
+ *\r
+ * @param       pPacket - pointer to location of where to copy received packet\r
+ *\r
+ * @return      none\r
+ **************************************************************************************************\r
+ */\r
+void MRFI_Receive(mrfiPacket_t * pPacket)\r
+{\r
+  *pPacket = mrfiIncomingPacket;\r
+}\r
+\r
+/**************************************************************************************************\r
+ * @fn          Mrfi_SyncPinRxIsr\r
+ *\r
+ * @brief       This interrupt is called when the SYNC signal transition from high to low.\r
+ *              The sync signal is routed to the sync pin which is a GPIO pin.  This high-to-low\r
+ *              transition signifies a receive has completed.  The SYNC signal also goes from\r
+ *              high to low when a transmit completes.   This is protected against within the\r
+ *              transmit function by disabling sync pin interrupts until transmit completes.\r
+ *\r
+ * @param       none\r
+ *\r
+ * @return      none\r
+ **************************************************************************************************\r
+ */\r
+static void Mrfi_SyncPinRxIsr(void)\r
+{\r
+  uint8_t frameLen = 0x00;\r
+  uint8_t rxBytes;\r
+\r
+  /* We should receive this interrupt only in RX state\r
+   * Should never receive it if RX was turned On only for\r
+   * some internal mrfi processing like - during CCA.\r
+   * Otherwise something is terribly wrong.\r
+   */\r
+  MRFI_ASSERT( mrfiRadioState == MRFI_RADIO_STATE_RX );\r
+\r
+  /* ------------------------------------------------------------------\r
+   *    Get RXBYTES\r
+   *   -------------\r
+   */\r
+\r
+  /*\r
+   *  Read the RXBYTES register from the radio.\r
+   *  Bit description of RXBYTES register:\r
+   *    bit 7     - RXFIFO_OVERFLOW, set if receive overflow occurred\r
+   *    bits 6:0  - NUM_BYTES, number of bytes in receive FIFO\r
+   *\r
+   *  Due a chip bug, the RXBYTES register must read the same value twice\r
+   *  in a row to guarantee an accurate value.\r
+   */\r
+  {\r
+    uint8_t rxBytesVerify;\r
+\r
+    rxBytesVerify = MRFI_RADIO_REG_READ( RXBYTES );\r
+\r
+    do\r
+    {\r
+      rxBytes = rxBytesVerify;\r
+      rxBytesVerify = MRFI_RADIO_REG_READ( RXBYTES );\r
+    }\r
+    while (rxBytes != rxBytesVerify);\r
+  }\r
+\r
+\r
+  /* ------------------------------------------------------------------\r
+   *    FIFO empty?\r
+   *   -------------\r
+   */\r
+\r
+  /*\r
+   *  See if the receive FIFIO is empty before attempting to read from it.\r
+   *  It is possible nothing the FIFO is empty even though the interrupt fired.\r
+   *  This can happen if address check is enabled and a non-matching packet is\r
+   *  received.  In that case, the radio automatically removes the packet from\r
+   *  the FIFO.\r
+   */\r
+  if (rxBytes == 0)\r
+  {\r
+    /* receive FIFO is empty - do nothing, skip to end */\r
+  }\r
+  else\r
+  {\r
+    /* receive FIFO is not empty, continue processing */\r
+\r
+    /* ------------------------------------------------------------------\r
+     *    Process frame length\r
+     *   ----------------------\r
+     */\r
+\r
+    /* read the first byte from FIFO - the packet length */\r
+    MRFI_RADIO_READ_RX_FIFO(&frameLen, MRFI_LENGTH_FIELD_SIZE);\r
+\r
+\r
+    /*\r
+     *  Make sure that the frame length just read corresponds to number of bytes in the buffer.\r
+     *  If these do not match up something is wrong.\r
+     *\r
+     *  This can happen for several reasons:\r
+     *   1) Incoming packet has an incorrect format or is corrupted.\r
+     *   2) The receive FIFO overflowed.  Overflow is indicated by the high\r
+     *      bit of rxBytes.  This guarantees the value of rxBytes value will not\r
+     *      match the number of bytes in the FIFO for overflow condition.\r
+     *   3) Interrupts were blocked for an abnormally long time which\r
+     *      allowed a following packet to at least start filling the\r
+     *      receive FIFO.  In this case, all received and partially received\r
+     *      packets will be lost - the packet in the FIFO and the packet coming in.\r
+     *      This is the price the user pays if they implement a giant\r
+     *      critical section.\r
+     *   4) A failed transmit forced radio to IDLE state to flush the transmit FIFO.\r
+     *      This could cause an active receive to be cut short.\r
+     *\r
+     *  Also check the sanity of the length to guard against rogue frames.\r
+     */\r
+    if ((rxBytes != (frameLen + MRFI_LENGTH_FIELD_SIZE + MRFI_RX_METRICS_SIZE))           ||\r
+        ((frameLen + MRFI_LENGTH_FIELD_SIZE) > MRFI_MAX_FRAME_SIZE) ||\r
+        (frameLen < MRFI_MIN_SMPL_FRAME_SIZE)\r
+       )\r
+    {\r
+      bspIState_t s;\r
+      noFrame++;\r
+\r
+      /* mismatch between bytes-in-FIFO and frame length */\r
+\r
+      /*\r
+       *  Flush receive FIFO to reset receive.  Must go to IDLE state to do this.\r
+       *  The critical section guarantees a transmit does not occur while cleaning up.\r
+       */\r
+      BSP_ENTER_CRITICAL_SECTION(s);\r
+      MRFI_STROBE_IDLE_AND_WAIT();\r
+      MRFI_STROBE( SFRX );\r
+      MRFI_STROBE( SRX );\r
+      BSP_EXIT_CRITICAL_SECTION(s);\r
+\r
+      /* flush complete, skip to end */\r
+    }\r
+    else\r
+    {\r
+      /* bytes-in-FIFO and frame length match up - continue processing */\r
+\r
+      /* ------------------------------------------------------------------\r
+       *    Get packet\r
+       *   ------------\r
+       */\r
+\r
+      /* clean out buffer to help protect against spurious frames */\r
+      memset(mrfiIncomingPacket.frame, 0x00, sizeof(mrfiIncomingPacket.frame));\r
+\r
+      /* set length field */\r
+      mrfiIncomingPacket.frame[MRFI_LENGTH_FIELD_OFS] = frameLen;\r
+\r
+      /* get packet from FIFO */\r
+      MRFI_RADIO_READ_RX_FIFO(&(mrfiIncomingPacket.frame[MRFI_FRAME_BODY_OFS]), frameLen);\r
+\r
+      /* get receive metrics from FIFO */\r
+      MRFI_RADIO_READ_RX_FIFO(&(mrfiIncomingPacket.rxMetrics[0]), MRFI_RX_METRICS_SIZE);\r
+\r
+\r
+      /* ------------------------------------------------------------------\r
+       *    CRC check\r
+       *   ------------\r
+       */\r
+\r
+      /*\r
+       *  Note!  Automatic CRC check is not, and must not, be enabled.  This feature\r
+       *  flushes the *entire* receive FIFO when CRC fails.  If this feature is\r
+       *  enabled it is possible to be reading from the FIFO and have a second\r
+       *  receive occur that fails CRC and automatically flushes the receive FIFO.\r
+       *  This could cause reads from an empty receive FIFO which puts the radio\r
+       *  into an undefined state.\r
+       */\r
+\r
+      /* determine if CRC failed */\r
+      if (!(mrfiIncomingPacket.rxMetrics[MRFI_RX_METRICS_CRC_LQI_OFS] & MRFI_RX_METRICS_CRC_OK_MASK))\r
+      {\r
+        /* CRC failed - do nothing, skip to end */\r
+        crcFail++;\r
+      }\r
+      else\r
+      {\r
+        /* CRC passed - continue processing */\r
+        crcPass++;\r
+\r
+        /* ------------------------------------------------------------------\r
+         *    Filtering\r
+         *   -----------\r
+         */\r
+\r
+        /* if address is not filtered, receive is successful */\r
+        if (!Mrfi_RxAddrIsFiltered(MRFI_P_DST_ADDR(&mrfiIncomingPacket)))\r
+        {\r
+          {\r
+            /* ------------------------------------------------------------------\r
+             *    Receive successful\r
+             *   --------------------\r
+             */\r
+\r
+            /* Convert the raw RSSI value and do offset compensation for this radio */\r
+            mrfiIncomingPacket.rxMetrics[MRFI_RX_METRICS_RSSI_OFS] =\r
+                Mrfi_CalculateRssi(mrfiIncomingPacket.rxMetrics[MRFI_RX_METRICS_RSSI_OFS]);\r
+\r
+            /* Remove the CRC valid bit from the LQI byte */\r
+            mrfiIncomingPacket.rxMetrics[MRFI_RX_METRICS_CRC_LQI_OFS] =\r
+              (mrfiIncomingPacket.rxMetrics[MRFI_RX_METRICS_CRC_LQI_OFS] & MRFI_RX_METRICS_LQI_MASK);\r
+\r
+\r
+            /* call external, higher level "receive complete" processing routine */\r
+            MRFI_RxCompleteISR();\r
+          }\r
+        }\r
+      }\r
+    }\r
+  }\r
+\r
+  /* ------------------------------------------------------------------\r
+   *    End of function\r
+   *   -------------------\r
+   */\r
+}\r
+\r
+/**************************************************************************************************\r
+ * @fn          Mrfi_RxModeOn\r
+ *\r
+ * @brief       Put radio into receive mode.\r
+ *\r
+ * @param       none\r
+ *\r
+ * @return      none\r
+ **************************************************************************************************\r
+ */\r
+static void Mrfi_RxModeOn(void)\r
+{\r
+  /* clear any residual receive interrupt */\r
+  MRFI_CLEAR_SYNC_PIN_INT_FLAG();\r
+\r
+  /* send strobe to enter receive mode */\r
+  MRFI_STROBE( SRX );\r
+\r
+  /* enable receive interrupts */\r
+  MRFI_ENABLE_SYNC_PIN_INT();\r
+}\r
+\r
+/**************************************************************************************************\r
+ * @fn          MRFI_RxOn\r
+ *\r
+ * @brief       Turn on the receiver.  No harm is done if this function is called when\r
+ *              receiver is already on.\r
+ *\r
+ * @param       none\r
+ *\r
+ * @return      none\r
+ **************************************************************************************************\r
+ */\r
+void MRFI_RxOn(void)\r
+{\r
+  /* radio must be awake before we can move it to RX state */\r
+  MRFI_ASSERT( mrfiRadioState != MRFI_RADIO_STATE_OFF );\r
+\r
+  /* if radio is off, turn it on */\r
+  if(mrfiRadioState != MRFI_RADIO_STATE_RX)\r
+  {\r
+    mrfiRadioState = MRFI_RADIO_STATE_RX;\r
+    Mrfi_RxModeOn();\r
+  }\r
+}\r
+\r
+/**************************************************************************************************\r
+ * @fn          Mrfi_RxModeOff\r
+ *\r
+ * @brief       -\r
+ *\r
+ * @param       none\r
+ *\r
+ * @return      none\r
+ **************************************************************************************************\r
+ */\r
+static void Mrfi_RxModeOff(void)\r
+{\r
+  /* disable receive interrupts */\r
+  MRFI_DISABLE_SYNC_PIN_INT();\r
+\r
+  /* turn off radio */\r
+  MRFI_STROBE_IDLE_AND_WAIT();\r
+\r
+  /* flush the receive FIFO of any residual data */\r
+  MRFI_STROBE( SFRX );\r
+\r
+  /* clear receive interrupt */\r
+  MRFI_CLEAR_SYNC_PIN_INT_FLAG();\r
+}\r
+\r
+\r
+/**************************************************************************************************\r
+ * @fn          MRFI_RxIdle\r
+ *\r
+ * @brief       Put radio in idle mode (receiver if off).  No harm is done this function is\r
+ *              called when radio is already idle.\r
+ *\r
+ * @param       none\r
+ *\r
+ * @return      none\r
+ **************************************************************************************************\r
+ */\r
+void MRFI_RxIdle(void)\r
+{\r
+  /* radio must be awake to move it to idle mode */\r
+  MRFI_ASSERT( mrfiRadioState != MRFI_RADIO_STATE_OFF );\r
+\r
+  /* if radio is on, turn it off */\r
+  if(mrfiRadioState == MRFI_RADIO_STATE_RX)\r
+  {\r
+    Mrfi_RxModeOff();\r
+    mrfiRadioState = MRFI_RADIO_STATE_IDLE;\r
+  }\r
+}\r
+\r
+\r
+/**************************************************************************************************\r
+ * @fn          MRFI_Sleep\r
+ *\r
+ * @brief       Request radio go to sleep.\r
+ *\r
+ * @param       none\r
+ *\r
+ * @return      none\r
+ **************************************************************************************************\r
+ */\r
+void MRFI_Sleep(void)\r
+{\r
+  bspIState_t s;\r
+\r
+  /* Critical section necessary for watertight testing and\r
+   * setting of state variables.\r
+   */\r
+  BSP_ENTER_CRITICAL_SECTION(s);\r
+\r
+  /* If radio is not asleep, put it to sleep */\r
+  if(mrfiRadioState != MRFI_RADIO_STATE_OFF)\r
+  {\r
+    /* go to idle so radio is in a known state before sleeping */\r
+    MRFI_RxIdle();\r
+\r
+    /* Strobe Power Down (SPWD): puts the radio in SLEEP state. */\r
+    /* Chip bug: Radio does not come out of this SLEEP when put to sleep\r
+     * using the SPWD cmd. However, it does wakes up if SXOFF was used to\r
+     * put it to sleep.\r
+     */\r
+    MRFI_STROBE( SXOFF );\r
+\r
+    /* Our new state is OFF */\r
+    mrfiRadioState = MRFI_RADIO_STATE_OFF;\r
+  }\r
+\r
+  BSP_EXIT_CRITICAL_SECTION(s);\r
+}\r
+\r
+\r
+/**************************************************************************************************\r
+ * @fn          MRFI_WakeUp\r
+ *\r
+ * @brief       Wake up radio from sleep state.\r
+ *\r
+ * @param       none\r
+ *\r
+ * @return      none\r
+ **************************************************************************************************\r
+ */\r
+void MRFI_WakeUp(void)\r
+{\r
+  /* if radio is already awake, just ignore wakeup request */\r
+  if(mrfiRadioState != MRFI_RADIO_STATE_OFF)\r
+  {\r
+    return;\r
+  }\r
+\r
+  MRFI_STROBE_IDLE_AND_WAIT();\r
+\r
+  /* enter idle mode */\r
+  mrfiRadioState = MRFI_RADIO_STATE_IDLE;\r
+}\r
+\r
+\r
+/**************************************************************************************************\r
+ * @fn          MRFI_RadioIsr\r
+ *\r
+ * @brief       Radio Interface interrupts as well as Radio interrupts are\r
+ *              mapped to this interrupt vector.\r
+ *\r
+ * @param       -\r
+ *\r
+ * @return      -\r
+ **************************************************************************************************\r
+ */\r
+// [BM] Changed because CC1101_VECTOR ISR is declared of source code and this handler is called indirect\r
+//BSP_ISR_FUNCTION( MRFI_RadioIsr, CC1101_VECTOR )\r
+void MRFI_RadioIsr(void)\r
+{\r
+  uint16_t coreIntSource = RF1AIV;            /* Radio Core      interrupt register */\r
+  uint16_t interfaceIntSource = RF1AIFIV;     /* Radio Interface interrupt register */\r
+\r
+  /* Interface interrupt */\r
+  if(interfaceIntSource)\r
+  {\r
+    if(interfaceIntSource == RF1AIFIV_RFERRIFG)\r
+    {\r
+      uint16_t interfaceError = RF1AIFERRV;\r
+\r
+      if(interfaceError == RF1AIFERRV_LVERR)\r
+      {\r
+        /* Low core voltage error */\r
+      }\r
+      else if(interfaceError == RF1AIFERRV_OPERR)\r
+      {\r
+        /* Operand error */\r
+      }\r
+      else if(interfaceError == RF1AIFERRV_OUTERR)\r
+      {\r
+        /* output data not available error */\r
+      }\r
+      else if(interfaceError == RF1AIFERRV_OPOVERR)\r
+      {\r
+        /* Operand overwrite error */\r
+      }\r
+      else\r
+      {\r
+        /* Can't possibly happen. If interface error flag was set,\r
+         * then one of the interface errors must be set.\r
+         */\r
+        MRFI_FORCE_ASSERT();\r
+      }\r
+\r
+      /* Assert anyways. No error handling implemented. */\r
+      MRFI_FORCE_ASSERT();\r
+    }\r
+    else\r
+    {\r
+      /* Not expecting any other interface interrupts (data in/out, status/instr in, fifo rx/tx) */\r
+      MRFI_FORCE_ASSERT();\r
+    }\r
+  }\r
+\r
+  /* Radio Core interrupt */\r
+  if(coreIntSource)\r
+  {\r
+    /* Check for SYNC interrupt */\r
+    if(coreIntSource == RF1AIV_RFIFG9)\r
+    {\r
+      if(MRFI_SYNC_PIN_INT_IS_ENABLED())\r
+      {\r
+        /*  clear the sync pin interrupt, run sync pin ISR */\r
+        /*\r
+         *  NOTE!  The following macro clears the interrupt flag but it also *must*\r
+         *  reset the interrupt capture.  In other words, if a second interrupt\r
+         *  occurs after the flag is cleared it must be processed, i.e. this interrupt\r
+         *  exits then immediately starts again.  Most microcontrollers handle this\r
+         *  naturally but it must be verified for every target.\r
+         */\r
+        MRFI_CLEAR_SYNC_PIN_INT_FLAG();\r
+\r
+        Mrfi_SyncPinRxIsr();\r
+      }\r
+      else\r
+      {\r
+        /* Fatal error. SYNC interrupt is not supposed to happen at this time. */\r
+        MRFI_FORCE_ASSERT();\r
+      }\r
+    }\r
+    else\r
+    {\r
+      /* Fatal error. No other Radio interurpt is enabled. */\r
+      MRFI_FORCE_ASSERT();\r
+    }\r
+  }\r
+}\r
+\r
+\r
+/**************************************************************************************************\r
+ * @fn          MRFI_Rssi\r
+ *\r
+ * @brief       Returns "live" RSSI value\r
+ *\r
+ * @param       none\r
+ *\r
+ * @return      RSSI value in units of dBm.\r
+ **************************************************************************************************\r
+ */\r
+int8_t MRFI_Rssi(void)\r
+{\r
+  uint8_t regValue;\r
+\r
+  /* Radio must be in RX state to measure rssi. */\r
+  MRFI_ASSERT( mrfiRadioState == MRFI_RADIO_STATE_RX );\r
+\r
+  /* Wait for the RSSI to be valid:\r
+   * Just having the Radio ON is not enough to read\r
+   * the correct RSSI value. The Radio must in RX mode for\r
+   * a certain duration. This duration depends on\r
+   * the baud rate and the received signal strength itself.\r
+   */\r
+  MRFI_RSSI_VALID_WAIT();\r
+\r
+  /* Read the RSSI value */\r
+  regValue = MRFI_RADIO_REG_READ( RSSI );\r
+\r
+  /* convert and do offset compensation */\r
+  return( Mrfi_CalculateRssi(regValue) );\r
+}\r
+\r
+\r
+/**************************************************************************************************\r
+ * @fn          Mrfi_CalculateRssi\r
+ *\r
+ * @brief       Does binary to decimal conversion and offset compensation.\r
+ *\r
+ * @param       none\r
+ *\r
+ * @return      RSSI value in units of dBm.\r
+ **************************************************************************************************\r
+ */\r
+int8_t Mrfi_CalculateRssi(uint8_t rawValue)\r
+{\r
+  int16_t rssi;\r
+\r
+  /* The raw value is in 2's complement and in half db steps. Convert it to\r
+   * decimal taking into account the offset value.\r
+   */\r
+  if(rawValue >= 128)\r
+  {\r
+    rssi = (int16_t)(rawValue - 256)/2 - MRFI_RSSI_OFFSET;\r
+  }\r
+  else\r
+  {\r
+    rssi = (rawValue/2) - MRFI_RSSI_OFFSET;\r
+  }\r
+\r
+  /* Restrict this value to least value can be held in an 8 bit signed int */\r
+  if(rssi < -128)\r
+  {\r
+    rssi = -128;\r
+  }\r
+\r
+  return rssi;\r
+}\r
+\r
+/**************************************************************************************************\r
+ * @fn          MRFI_RandomByte\r
+ *\r
+ * @brief       Returns a random byte. This is a pseudo-random number generator.\r
+ *              The generated sequence will repeat every 256 values.\r
+ *              The sequence itself depends on the initial seed value.\r
+ *\r
+ * @param       none\r
+ *\r
+ * @return      a random byte\r
+ **************************************************************************************************\r
+ */\r
+uint8_t MRFI_RandomByte(void)\r
+{\r
+  mrfiRndSeed = (mrfiRndSeed*MRFI_RANDOM_MULTIPLIER) + MRFI_RANDOM_OFFSET;\r
+\r
+  return mrfiRndSeed;\r
+}\r
+\r
+/**************************************************************************************************\r
+ * @fn          Mrfi_RandomBackoffDelay\r
+ *\r
+ * @brief       -\r
+ *\r
+ * @param       none\r
+ *\r
+ * @return      none\r
+ **************************************************************************************************\r
+ */\r
+static void Mrfi_RandomBackoffDelay(void)\r
+{\r
+  uint8_t backoffs;\r
+  uint8_t i;\r
+\r
+  /* calculate random value for backoffs - 1 to 16 */\r
+  backoffs = (MRFI_RandomByte() & 0x0F) + 1;\r
+\r
+  /* delay for randomly computed number of backoff periods */\r
+  for (i=0; i<backoffs; i++)\r
+  {\r
+    Mrfi_DelayUsec( sBackoffHelper );\r
+  }\r
+}\r
+\r
+/****************************************************************************************************\r
+ * @fn          Mrfi_DelayUsec\r
+ *\r
+ * @brief       Execute a delay loop using HW timer. The macro actually used to do the delay\r
+ *              is not thread-safe. This routine makes the delay execution thread-safe by breaking\r
+ *              up the requested delay up into small chunks and executing each chunk as a critical\r
+ *              section. The chunk size is choosen to be the smallest value used by MRFI. The delay\r
+ *              is only approximate because of the overhead computations. It errs on the side of\r
+ *              being too long.\r
+ *\r
+ * input parameters\r
+ * @param   howLong - number of microseconds to delay\r
+ *\r
+ * @return      none\r
+ ****************************************************************************************************\r
+ */\r
+static void Mrfi_DelayUsec(uint16_t howLong)\r
+{\r
+  bspIState_t s;\r
+  uint16_t count = howLong/MRFI_MAX_DELAY_US;\r
+\r
+  if (howLong)\r
+  {\r
+    do\r
+    {\r
+      BSP_ENTER_CRITICAL_SECTION(s);\r
+      BSP_DELAY_USECS(MRFI_MAX_DELAY_US);\r
+      BSP_EXIT_CRITICAL_SECTION(s);\r
+    } while (count--);\r
+  }\r
+\r
+  return;\r
+}\r
+\r
+/****************************************************************************************************\r
+ * @fn          Mrfi_DelayUsecSem\r
+ *\r
+ * @brief       Execute a delay loop using a HW timer. See comments for Mrfi_DelayUsec().\r
+ *              Delay specified number of microseconds checking semaphore for\r
+ *              early-out. Run in a separate thread when the reply delay is\r
+ *              invoked. Cleaner then trying to make MRFI_DelayUsec() thread-safe\r
+ *              and reentrant.\r
+ *\r
+ * input parameters\r
+ * @param   howLong - number of microseconds to delay\r
+ *\r
+ * @return      none\r
+ ****************************************************************************************************\r
+ */\r
+static void Mrfi_DelayUsecSem(uint16_t howLong)\r
+{\r
+  bspIState_t s;\r
+  uint16_t count = howLong/MRFI_MAX_DELAY_US;\r
+\r
+  if (howLong)\r
+  {\r
+    do\r
+    {\r
+      BSP_ENTER_CRITICAL_SECTION(s);\r
+      BSP_DELAY_USECS(MRFI_MAX_DELAY_US);\r
+      BSP_EXIT_CRITICAL_SECTION(s);\r
+      if (sKillSem)\r
+      {\r
+        break;\r
+      }\r
+    } while (count--);\r
+  }\r
+\r
+  return;\r
+}\r
+\r
+/**************************************************************************************************\r
+ * @fn          MRFI_DelayMs\r
+ *\r
+ * @brief       Delay the specified number of milliseconds.\r
+ *\r
+ * @param       milliseconds - delay time\r
+ *\r
+ * @return      none\r
+ **************************************************************************************************\r
+ */\r
+void MRFI_DelayMs(uint16_t milliseconds)\r
+{\r
+  while (milliseconds)\r
+  {\r
+    Mrfi_DelayUsec( APP_USEC_VALUE );\r
+    milliseconds--;\r
+  }\r
+}\r
+\r
+/**************************************************************************************************\r
+ * @fn          MRFI_ReplyDelay\r
+ *\r
+ * @brief       Delay number of milliseconds scaled by data rate. Check semaphore for\r
+ *              early-out. Run in a separate thread when the reply delay is\r
+ *              invoked. Cleaner then trying to make MRFI_DelayMs() thread-safe\r
+ *              and reentrant.\r
+ *\r
+ * @param       none\r
+ *\r
+ * @return      none\r
+ **************************************************************************************************\r
+ */\r
+void MRFI_ReplyDelay(void)\r
+{\r
+  bspIState_t s;\r
+  uint16_t    milliseconds = sReplyDelayScalar;\r
+\r
+  BSP_ENTER_CRITICAL_SECTION(s);\r
+  sReplyDelayContext = 1;\r
+  BSP_EXIT_CRITICAL_SECTION(s);\r
+\r
+  while (milliseconds)\r
+  {\r
+    Mrfi_DelayUsecSem( APP_USEC_VALUE );\r
+    if (sKillSem)\r
+    {\r
+      break;\r
+    }\r
+    milliseconds--;\r
+  }\r
+\r
+  BSP_ENTER_CRITICAL_SECTION(s);\r
+  sKillSem           = 0;\r
+  sReplyDelayContext = 0;\r
+  BSP_EXIT_CRITICAL_SECTION(s);\r
+}\r
+\r
+/**************************************************************************************************\r
+ * @fn          MRFI_PostKillSem\r
+ *\r
+ * @brief       Post to the loop-kill semaphore that will be checked by the iteration loops\r
+ *              that control the delay thread.\r
+ *\r
+ * @param       none\r
+ *\r
+ * @return      none\r
+ **************************************************************************************************\r
+ */\r
+void MRFI_PostKillSem(void)\r
+{\r
+\r
+  if (sReplyDelayContext)\r
+  {\r
+    sKillSem = 1;\r
+  }\r
+\r
+  return;\r
+}\r
+\r
+/**************************************************************************************************\r
+ * @fn          MRFI_GetRadioState\r
+ *\r
+ * @brief       Returns the current radio state.\r
+ *\r
+ * @param       none\r
+ *\r
+ * @return      radio state - off/idle/rx\r
+ **************************************************************************************************\r
+ */\r
+uint8_t MRFI_GetRadioState(void)\r
+{\r
+  return mrfiRadioState;\r
+}\r
+\r
+\r
+/**************************************************************************************************\r
+ * @fn          MRFI_SetLogicalChannel\r
+ *\r
+ * @brief       Set logical channel.\r
+ *\r
+ * @param       chan - logical channel number\r
+ *\r
+ * @return      none\r
+ **************************************************************************************************\r
+ */\r
+void MRFI_SetLogicalChannel(uint8_t chan)\r
+{\r
+  /* logical channel is not valid? */\r
+  MRFI_ASSERT( chan < MRFI_NUM_LOGICAL_CHANS );\r
+\r
+  /* make sure radio is off before changing channels */\r
+  Mrfi_RxModeOff();\r
+\r
+  MRFI_RADIO_REG_WRITE( CHANNR, mrfiLogicalChanTable[chan] );\r
+\r
+  /* turn radio back on if it was on before channel change */\r
+  if(mrfiRadioState == MRFI_RADIO_STATE_RX)\r
+  {\r
+    Mrfi_RxModeOn();\r
+  }\r
+}\r
+\r
+/**************************************************************************************************\r
+ * @fn          MRFI_SetRFPwr\r
+ *\r
+ * @brief       Set ouput RF power level.\r
+ *\r
+ * @param       level - power level to be set\r
+ *\r
+ * @return      none\r
+ **************************************************************************************************\r
+ */\r
+void MRFI_SetRFPwr(uint8_t level)\r
+{\r
+  /* Power level is not valid? */\r
+  MRFI_ASSERT( level < MRFI_NUM_POWER_SETTINGS );\r
+\r
+  MRFI_RADIO_REG_WRITE(PATABLE, mrfiRFPowerTable[level]);\r
+\r
+  return;\r
+}\r
+/**************************************************************************************************\r
+ * @fn          MRFI_SetRxAddrFilter\r
+ *\r
+ * @brief       Set the address used for filtering received packets.\r
+ *\r
+ * @param       pAddr - pointer to address to use for filtering\r
+ *\r
+ * @return      zero     : successfully set filter address\r
+ *              non-zero : illegal address\r
+ **************************************************************************************************\r
+ */\r
+uint8_t MRFI_SetRxAddrFilter(uint8_t * pAddr)\r
+{\r
+  /*\r
+   *  If first byte of filter address match fir byte of broadcast address,\r
+   *  there is a conflict with hardware filtering.\r
+   */\r
+  if (pAddr[0] == mrfiBroadcastAddr[0])\r
+  {\r
+    /* unable to set filter address */\r
+    return( 1 );\r
+  }\r
+\r
+  /*\r
+   *  Set the hardware address register.  The hardware address filtering only recognizes\r
+   *  a single byte but this does provide at least some automatic hardware filtering.\r
+   */\r
+  MRFI_RADIO_REG_WRITE( ADDR, pAddr[0] );\r
+\r
+  /* save a copy of the filter address */\r
+  {\r
+    uint8_t i;\r
+\r
+    for (i=0; i<MRFI_ADDR_SIZE; i++)\r
+    {\r
+      mrfiRxFilterAddr[i] = pAddr[i];\r
+    }\r
+  }\r
+\r
+  /* successfully set filter address */\r
+  return( 0 );\r
+}\r
+\r
+\r
+/**************************************************************************************************\r
+ * @fn          MRFI_EnableRxAddrFilter\r
+ *\r
+ * @brief       Enable received packet filtering.\r
+ *\r
+ * @param       none\r
+ *\r
+ * @return      none\r
+ **************************************************************************************************\r
+ */\r
+void MRFI_EnableRxAddrFilter(void)\r
+{\r
+  MRFI_ASSERT(mrfiRxFilterAddr[0] != mrfiBroadcastAddr[0]); /* filter address must be set before enabling filter */\r
+\r
+  /* set flag to indicate filtering is enabled */\r
+  mrfiRxFilterEnabled = 1;\r
+\r
+  /* enable hardware filtering on the radio */\r
+  MRFI_RADIO_REG_WRITE( PKTCTRL1, PKTCTRL1_ADDR_FILTER_ON );\r
+}\r
+\r
+\r
+/**************************************************************************************************\r
+ * @fn          MRFI_DisableRxAddrFilter\r
+ *\r
+ * @brief       Disable received packet filtering.\r
+ *\r
+ * @param       pAddr - pointer to address to test for filtering\r
+ *\r
+ * @return      none\r
+ **************************************************************************************************\r
+ */\r
+void MRFI_DisableRxAddrFilter(void)\r
+{\r
+  /* clear flag that indicates filtering is enabled */\r
+  mrfiRxFilterEnabled = 0;\r
+\r
+  /* disable hardware filtering on the radio */\r
+  MRFI_RADIO_REG_WRITE( PKTCTRL1, PKTCTRL1_ADDR_FILTER_OFF );\r
+}\r
+\r
+\r
+/**************************************************************************************************\r
+ * @fn          Mrfi_RxAddrIsFiltered\r
+ *\r
+ * @brief       Determine if address is filtered.\r
+ *\r
+ * @param       none\r
+ *\r
+ * @return      zero     : address is not filtered\r
+ *              non-zero : address is filtered\r
+ **************************************************************************************************\r
+ */\r
+uint8_t Mrfi_RxAddrIsFiltered(uint8_t * pAddr)\r
+{\r
+  uint8_t i;\r
+  uint8_t addrByte;\r
+  uint8_t filterAddrMatches;\r
+  uint8_t broadcastAddrMatches;\r
+\r
+  /* first check to see if filtering is even enabled */\r
+  if (!mrfiRxFilterEnabled)\r
+  {\r
+    /*\r
+     *  Filtering is not enabled, so by definition the address is\r
+     *  not filtered.  Return zero to indicate address is not filtered.\r
+     */\r
+    return( 0 );\r
+  }\r
+\r
+  /* clear address byte match counts */\r
+  filterAddrMatches    = 0;\r
+  broadcastAddrMatches = 0;\r
+\r
+  /* loop through address to see if there is a match to filter address of broadcast address */\r
+  for (i=0; i<MRFI_ADDR_SIZE; i++)\r
+  {\r
+    /* get byte from address to check */\r
+    addrByte = pAddr[i];\r
+\r
+    /* compare byte to filter address byte */\r
+    if (addrByte == mrfiRxFilterAddr[i])\r
+    {\r
+      filterAddrMatches++;\r
+    }\r
+    if (addrByte == mrfiBroadcastAddr[i])\r
+    {\r
+      broadcastAddrMatches++;\r
+    }\r
+  }\r
+\r
+  /*\r
+   *  If address is *not* filtered, either the "filter address match count" or\r
+   *  the "broadcast address match count" will equal the total number of bytes\r
+   *  in the address.\r
+   */\r
+  if ((broadcastAddrMatches == MRFI_ADDR_SIZE) || (filterAddrMatches == MRFI_ADDR_SIZE))\r
+  {\r
+    /* address *not* filtered, return zero */\r
+    return( 0 );\r
+  }\r
+  else\r
+  {\r
+    /* address filtered, return non-zero */\r
+    return( 1 );\r
+  }\r
+}\r
+\r
+\r
+/**************************************************************************************************\r
+ *                                  Compile Time Integrity Checks\r
+ **************************************************************************************************\r
+ */\r
+\r
+/* calculate maximum value for PKTLEN and verify it directly */\r
+#define MRFI_RADIO_TX_FIFO_SIZE     64  /* from datasheet */\r
+#define MRFI_RADIO_MAX_PKTLEN       (MRFI_RADIO_TX_FIFO_SIZE - MRFI_LENGTH_FIELD_SIZE - MRFI_RX_METRICS_SIZE)\r
+#if (MRFI_RADIO_MAX_PKTLEN != 61)\r
+#error "ERROR:  The maximum value for PKTLEN is not correct."\r
+#endif\r
+\r
+/* verify setting for PKTLEN does not exceed maximum */\r
+#if (MRFI_SETTING_PKTLEN > MRFI_RADIO_MAX_PKTLEN)\r
+#error "ERROR:  Maximum possible value for PKTLEN exceeded.  Decrease value of maximum payload."\r
+#endif\r
+\r
+/* verify largest possible packet fits within FIFO buffer */\r
+#if ((MRFI_MAX_FRAME_SIZE + MRFI_RX_METRICS_SIZE) > MRFI_RADIO_TX_FIFO_SIZE)\r
+#error "ERROR:  Maximum possible packet length exceeds FIFO buffer.  Decrease value of maximum payload."\r
+#endif\r
+\r
+/* verify that the SmartRF file supplied is compatible */\r
+#if ((!defined SMARTRF_RADIO_CC430))\r
+  #error "ERROR:  The SmartRF export file is not compatible."\r
+#endif\r
+\r
+/*\r
+ *  These asserts happen if there is extraneous compiler padding of arrays.\r
+ *  Modify compiler settings for no padding, or, if that is not possible,\r
+ *  comment out the offending asserts.\r
+ */\r
+BSP_STATIC_ASSERT(sizeof(mrfiRadioCfg) == ((sizeof(mrfiRadioCfg)/sizeof(mrfiRadioCfg[0])) * sizeof(mrfiRadioCfg[0])));\r
+\r
+\r
+/*\r
+ *  These asserts happen if there is extraneous compiler padding of arrays.\r
+ *  Modify compiler settings for no padding, or, if that is not possible,\r
+ *  comment out the offending asserts.\r
+ */\r
+BSP_STATIC_ASSERT(sizeof(mrfiLogicalChanTable) == ((sizeof(mrfiLogicalChanTable)/sizeof(mrfiLogicalChanTable[0])) * sizeof(mrfiLogicalChanTable[0])));\r
+BSP_STATIC_ASSERT(sizeof(mrfiBroadcastAddr) == ((sizeof(mrfiBroadcastAddr)/sizeof(mrfiBroadcastAddr[0])) * sizeof(mrfiBroadcastAddr[0])));\r
+\r
+/**************************************************************************************************\r
+*/\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/Components/mrfi/radios/family5/mrfi_radio_interface.c b/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/Components/mrfi/radios/family5/mrfi_radio_interface.c
new file mode 100755 (executable)
index 0000000..99c5bd9
--- /dev/null
@@ -0,0 +1,374 @@
+/**************************************************************************************************\r
+  Revised:        $Date: 2009-11-23 07:50:43 -0800 (Mon, 23 Nov 2009) $\r
+  Revision:       $Revision: 21225 $\r
+\r
+  Copyright 2008-2009 Texas Instruments Incorporated.  All rights reserved.\r
+\r
+  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+  the terms of a software license agreement between the user who downloaded the software,\r
+  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+  License. The License limits your use, and you acknowledge, that the Software may not be\r
+  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+  perform, display or sell this Software and/or its documentation for any purpose.\r
+\r
+  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS?\r
+  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+\r
+  Should you have any questions regarding your right to use this Software,\r
+  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+/* ~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=\r
+ *   MRFI (Minimal RF Interface)\r
+ *   Radios: CC430\r
+ *   Radio Interface (RIF) code.\r
+ * ~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=\r
+ */\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                          Includes\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#include "mrfi_radio_interface.h"\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                            Defines\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                            Macros\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#define MRFI_RADIO_STATUS_READ_CLEAR()  RF1AIFCTL1 &= ~(RFSTATIFG);\r
+\r
+#define MRFI_RADIO_STATUS_READ_WAIT()  while( !(RF1AIFCTL1 & RFSTATIFG) );\r
+#define MRFI_RADIO_INST_WRITE_WAIT()   while( !(RF1AIFCTL1 & RFINSTRIFG));\r
+#define MRFI_RADIO_DATA_WRITE_WAIT()   while( !(RF1AIFCTL1 & RFDINIFG)  );\r
+#define MRFI_RADIO_DATA_READ_WAIT()    while( !(RF1AIFCTL1 & RFDOUTIFG) );\r
+\r
+#define MRFI_RIF_DEBUG\r
+#ifdef MRFI_RIF_DEBUG\r
+#define MRFI_RIF_ASSERT(x)      BSP_ASSERT(x)\r
+#else\r
+#define MRFI_RIF_ASSERT(x)\r
+#endif\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                       Local Prototypes\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+\r
+\r
+/**************************************************************************************************\r
+ * @fn          mrfiRadioInterfaceInit\r
+ *\r
+ * @brief       Initialize the Radio Interface\r
+ *\r
+ * @param       none\r
+ *\r
+ * @return      none\r
+ **************************************************************************************************\r
+ */\r
+void mrfiRadioInterfaceInit(void)\r
+{\r
+  /* Enable interrupt on interface error.\r
+   * The code behaves differently between different runs on the debugger, and seemingly fails\r
+   * due to error flags on the bench. The code does not fail, however, on functional tests.\r
+   * This points to problems with the debugger that need to be sorted through carefully.\r
+   * For the time being, remove the following line, since it will likely cause operational\r
+   * failures.\r
+   */\r
+  // RF1AIFCTL1 |= RFERRIE;\r
+}\r
+\r
+\r
+/**************************************************************************************************\r
+ * @fn          mrfiRadioInterfaceCmdStrobe\r
+ *\r
+ * @brief       Send command strobe to the radio.  Returns status byte read during transfer\r
+ *              of strobe command.\r
+ *\r
+ * @param       addr - address of register to strobe\r
+ *\r
+ * @return      status byte of radio\r
+ **************************************************************************************************\r
+ */\r
+uint8_t mrfiRadioInterfaceCmdStrobe(uint8_t addr)\r
+{\r
+  uint8_t statusByte, gdoState;\r
+  mrfiRIFIState_t s;\r
+\r
+  /* Check for invalid address.\r
+   * 0xBD is for SNOP with MSP set to read the bytes available in RX FIFO.\r
+   */\r
+  MRFI_RIF_ASSERT( (addr == 0xBD) || (addr >= RF_SRES) && (addr <= RF_SNOP));\r
+\r
+  /* Lock out access to Radio IF */\r
+  MRFI_RIF_ENTER_CRITICAL_SECTION(s);\r
+\r
+  /* Clear the Status read flag */\r
+  MRFI_RADIO_STATUS_READ_CLEAR();\r
+\r
+  /* Wait for radio to be ready for next instruction */\r
+  MRFI_RADIO_INST_WRITE_WAIT();\r
+\r
+  if ((addr > RF_SRES) && (addr < RF_SNOP))\r
+  {\r
+    /* buffer IOCFG2 state */\r
+    gdoState = MRFI_RADIO_REG_READ(IOCFG2);\r
+\r
+    /* c-ready to GDO2 */\r
+    MRFI_RADIO_REG_WRITE(IOCFG2, 0x29);\r
+\r
+    RF1AINSTRB = addr;\r
+\r
+    /* chip at sleep mode */\r
+    if ((RF1AIN & 0x04) == 0x04)\r
+    {\r
+      if ( (addr == RF_SXOFF) || (addr == RF_SPWD) || (addr == RF_SWOR) )\r
+      {\r
+        /* Do nothing */\r
+      }\r
+      else\r
+      {\r
+        /* c-ready */\r
+        while ((RF1AIN & 0x04) == 0x04);\r
+\r
+        /* Delay should be 760us */\r
+        Mrfi_DelayUsec(760);\r
+      }\r
+    }\r
+\r
+    /* restore IOCFG2 setting */\r
+    MRFI_RADIO_REG_WRITE(IOCFG2, gdoState);\r
+  }\r
+  else\r
+  {\r
+    /* chip active mode */\r
+    RF1AINSTRB = addr;\r
+  }\r
+\r
+  /* Read status byte */\r
+  statusByte = RF1ASTAT0B;\r
+\r
+  /* Allow access to Radio IF */\r
+  MRFI_RIF_EXIT_CRITICAL_SECTION(s);\r
+\r
+  /* return the status byte */\r
+  return statusByte;\r
+}\r
+\r
+\r
+/**************************************************************************************************\r
+ * @fn          mrfiRadioInterfaceReadReg\r
+ *\r
+ * @brief       Read value from radio register.\r
+ *\r
+ * @param       addr - address of register\r
+ *\r
+ * @return      register value\r
+ **************************************************************************************************\r
+ */\r
+uint8_t mrfiRadioInterfaceReadReg(uint8_t addr)\r
+{\r
+  mrfiRIFIState_t s;\r
+  uint8_t regValue;\r
+\r
+  /* Check for valid range. 0x3E is for PATABLE access */\r
+  MRFI_RIF_ASSERT( (addr <= 0x3B) || (addr == 0x3E) );\r
+\r
+  /* Lock out access to Radio IF */\r
+  MRFI_RIF_ENTER_CRITICAL_SECTION(s);\r
+\r
+  /* Wait for radio to be ready for next instruction */\r
+  MRFI_RADIO_INST_WRITE_WAIT();\r
+\r
+  if( (addr <= 0x2E) || (addr == 0x3E))\r
+  {\r
+    /* Write cmd: read the Configuration register */\r
+    RF1AINSTR1B = (0x80 | addr);\r
+  }\r
+  else\r
+  {\r
+    /* Write cmd: read the Status register */\r
+    RF1AINSTR1B = (0xC0 | addr);\r
+  }\r
+\r
+  /* Read out the register value */\r
+  regValue   = RF1ADOUT1B; //auto read\r
+\r
+  /* Allow access to Radio IF */\r
+  MRFI_RIF_EXIT_CRITICAL_SECTION(s);\r
+\r
+  return( regValue);\r
+}\r
+\r
+\r
+/**************************************************************************************************\r
+ * @fn          mrfiRadioInterfaceWriteReg\r
+ *\r
+ * @brief       Write value to radio register.\r
+ *\r
+ * @param       addr  - address of register\r
+ * @param       value - register value to write\r
+ *\r
+ * @return      none\r
+ **************************************************************************************************\r
+ */\r
+void mrfiRadioInterfaceWriteReg(uint8_t addr, uint8_t value)\r
+{\r
+  mrfiRIFIState_t s;\r
+\r
+  /* Check for valid range. 0x3E is for PATABLE access */\r
+  MRFI_RIF_ASSERT((addr <= 0x2E) || (addr == 0x3E));\r
+\r
+  /* Lock out access to Radio IF */\r
+  MRFI_RIF_ENTER_CRITICAL_SECTION(s);\r
+\r
+  /* Wait for radio to be ready for next instruction */\r
+  MRFI_RADIO_INST_WRITE_WAIT();\r
+\r
+  /* Write cmd: 'write to register' */\r
+  RF1AINSTRB = (0x00 | addr);\r
+\r
+  /* Wait for radio to be ready to accept the data */\r
+  MRFI_RADIO_DATA_WRITE_WAIT();\r
+\r
+  /* Write the register value */\r
+  RF1ADINB   = value; /* value to be written to the radio register */\r
+\r
+  /* Allow access to Radio IF */\r
+  MRFI_RIF_EXIT_CRITICAL_SECTION(s);\r
+}\r
+\r
+\r
+/**************************************************************************************************\r
+ * @fn          mrfiRadioInterfaceWriteTxFifo\r
+ *\r
+ * @brief       Write data to radio transmit FIFO.\r
+ *\r
+ * @param       pData - pointer for storing write data\r
+ * @param       len   - length of data in bytes\r
+ *\r
+ * @return      none\r
+ **************************************************************************************************\r
+ */\r
+void mrfiRadioInterfaceWriteTxFifo(uint8_t * pData, uint8_t len)\r
+{\r
+  mrfiRIFIState_t s;\r
+\r
+  MRFI_RIF_ASSERT(len != 0); /* zero length is not allowed */\r
+\r
+  /* Lock out access to Radio IF */\r
+  MRFI_RIF_ENTER_CRITICAL_SECTION(s);\r
+\r
+  /* Wait for radio to be ready for next instruction */\r
+  MRFI_RADIO_INST_WRITE_WAIT();\r
+\r
+  /* Write cmd: TXFIFOWR */\r
+  RF1AINSTRB = 0x7F;\r
+\r
+  do\r
+  {\r
+    /* Wait for radio to be ready to accept the data */\r
+    MRFI_RADIO_DATA_WRITE_WAIT();\r
+\r
+    /* Write one byte to FIFO */\r
+    RF1ADINB   = *pData;\r
+\r
+    pData++;\r
+    len--;\r
+\r
+  }while(len);\r
+\r
+  /* Allow access to Radio IF */\r
+  MRFI_RIF_EXIT_CRITICAL_SECTION(s);\r
+}\r
+\r
+\r
+/**************************************************************************************************\r
+ * @fn          mrfiRadioInterfaceReadRxFifo\r
+ *\r
+ * @brief       Read data from radio receive FIFO.\r
+ *\r
+ * @param       pData - pointer for storing read data\r
+ * @param       len   - length of data in bytes\r
+ *\r
+ * @return      none\r
+ **************************************************************************************************\r
+ */\r
+uint8_t method = 2;\r
+void mrfiRadioInterfaceReadRxFifo(uint8_t * pData, uint8_t len)\r
+{\r
+  mrfiRIFIState_t s;\r
+\r
+  MRFI_RIF_ASSERT(len != 0); /* zero length is not allowed */\r
+\r
+  /* Lock out access to Radio IF */\r
+  MRFI_RIF_ENTER_CRITICAL_SECTION(s);\r
+\r
+  if(method == 1)\r
+  {\r
+    /* Wait for radio to be ready for next instruction */\r
+    MRFI_RADIO_INST_WRITE_WAIT();\r
+\r
+    /* Write cmd: RXFIFORD */\r
+    RF1AINSTRB = 0xFF;\r
+\r
+    do\r
+    {\r
+      /* dummy write */\r
+      RF1ADINB = 0;\r
+\r
+      /* Wait for data to be available for reading */\r
+      MRFI_RADIO_DATA_READ_WAIT();\r
+\r
+      /* Read one byte from FIFO */\r
+      *pData = RF1ADOUT0B;\r
+\r
+      pData++;\r
+      len--;\r
+\r
+    }while(len);\r
+  }\r
+\r
+  if(method == 2)\r
+  {\r
+    do\r
+    {\r
+      /* Wait for radio to be ready for next instruction */\r
+      MRFI_RADIO_INST_WRITE_WAIT();\r
+\r
+      /* Write cmd: SNGLRXRD */\r
+      RF1AINSTR1B = 0xBF;\r
+\r
+      /* Read byte from FIFO */\r
+      *pData  = RF1ADOUT1B; //auto read register\r
+\r
+      pData++;\r
+      len--;\r
+\r
+    }while(len);\r
+  }\r
+\r
+  /* Allow access to Radio IF */\r
+  MRFI_RIF_EXIT_CRITICAL_SECTION(s);\r
+}\r
+\r
+\r
+/**************************************************************************************************\r
+*/\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/Components/mrfi/radios/family5/mrfi_radio_interface.h b/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/Components/mrfi/radios/family5/mrfi_radio_interface.h
new file mode 100755 (executable)
index 0000000..ebdacfc
--- /dev/null
@@ -0,0 +1,150 @@
+/**************************************************************************************************\r
+  Revised:        $Date: 2007-07-06 11:19:00 -0700 (Fri, 06 Jul 2007) $\r
+  Revision:       $Revision: 13579 $\r
+\r
+  Copyright 2007 Texas Instruments Incorporated.  All rights reserved.\r
+\r
+  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+  the terms of a software license agreement between the user who downloaded the software,\r
+  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+  License. The License limits your use, and you acknowledge, that the Software may not be\r
+  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+  perform, display or sell this Software and/or its documentation for any purpose.\r
+\r
+  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+\r
+  Should you have any questions regarding your right to use this Software,\r
+  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+/* ~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=\r
+ *   MRFI (Minimal RF Interface)\r
+ *   Radio interface code for CC430\r
+ * ~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=\r
+ */\r
+\r
+#ifndef MRFI_RADIO_INTERFACE_H\r
+#define MRFI_RADIO_INTERFACE_H\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                         Includes\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#include "bsp.h"\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                          Defines\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+\r
+/* configuration registers */\r
+#define IOCFG2      0x00      /*  IOCFG2   - GDO2 output pin configuration  */\r
+#define IOCFG1      0x01      /*  IOCFG1   - GDO1 output pin configuration  */\r
+#define IOCFG0      0x02      /*  IOCFG1   - GDO0 output pin configuration  */\r
+#define FIFOTHR     0x03      /*  FIFOTHR  - RX FIFO and TX FIFO thresholds */\r
+#define SYNC1       0x04      /*  SYNC1    - Sync word, high byte */\r
+#define SYNC0       0x05      /*  SYNC0    - Sync word, low byte */\r
+#define PKTLEN      0x06      /*  PKTLEN   - Packet length */\r
+#define PKTCTRL1    0x07      /*  PKTCTRL1 - Packet automation control */\r
+#define PKTCTRL0    0x08      /*  PKTCTRL0 - Packet automation control */\r
+#define ADDR        0x09      /*  ADDR     - Device address */\r
+#define CHANNR      0x0A      /*  CHANNR   - Channel number */\r
+#define FSCTRL1     0x0B      /*  FSCTRL1  - Frequency synthesizer control */\r
+#define FSCTRL0     0x0C      /*  FSCTRL0  - Frequency synthesizer control */\r
+#define FREQ2       0x0D      /*  FREQ2    - Frequency control word, high byte */\r
+#define FREQ1       0x0E      /*  FREQ1    - Frequency control word, middle byte */\r
+#define FREQ0       0x0F      /*  FREQ0    - Frequency control word, low byte */\r
+#define MDMCFG4     0x10      /*  MDMCFG4  - Modem configuration */\r
+#define MDMCFG3     0x11      /*  MDMCFG3  - Modem configuration */\r
+#define MDMCFG2     0x12      /*  MDMCFG2  - Modem configuration */\r
+#define MDMCFG1     0x13      /*  MDMCFG1  - Modem configuration */\r
+#define MDMCFG0     0x14      /*  MDMCFG0  - Modem configuration */\r
+#define DEVIATN     0x15      /*  DEVIATN  - Modem deviation setting */\r
+#define MCSM2       0x16      /*  MCSM2    - Main Radio Control State Machine configuration */\r
+#define MCSM1       0x17      /*  MCSM1    - Main Radio Control State Machine configuration */\r
+#define MCSM0       0x18      /*  MCSM0    - Main Radio Control State Machine configuration */\r
+#define FOCCFG      0x19      /*  FOCCFG   - Frequency Offset Compensation configuration */\r
+#define BSCFG       0x1A      /*  BSCFG    - Bit Synchronization configuration */\r
+#define AGCCTRL2    0x1B      /*  AGCCTRL2 - AGC control */\r
+#define AGCCTRL1    0x1C      /*  AGCCTRL1 - AGC control */\r
+#define AGCCTRL0    0x1D      /*  AGCCTRL0 - AGC control */\r
+#define WOREVT1     0x1E      /*  WOREVT1  - High byte Event0 timeout */\r
+#define WOREVT0     0x1F      /*  WOREVT0  - Low byte Event0 timeout */\r
+#define WORCTRL     0x20      /*  WORCTRL  - Wake On Radio control */\r
+#define FREND1      0x21      /*  FREND1   - Front end RX configuration */\r
+#define FREND0      0x22      /*  FREDN0   - Front end TX configuration */\r
+#define FSCAL3      0x23      /*  FSCAL3   - Frequency synthesizer calibration */\r
+#define FSCAL2      0x24      /*  FSCAL2   - Frequency synthesizer calibration */\r
+#define FSCAL1      0x25      /*  FSCAL1   - Frequency synthesizer calibration */\r
+#define FSCAL0      0x26      /*  FSCAL0   - Frequency synthesizer calibration */\r
+#define RCCTRL1     0x27      /*  RCCTRL1  - RC oscillator configuration */\r
+#define RCCTRL0     0x28      /*  RCCTRL0  - RC oscillator configuration */\r
+#define FSTEST      0x29      /*  FSTEST   - Frequency synthesizer calibration control */\r
+#define PTEST       0x2A      /*  PTEST    - Production test */\r
+#define AGCTEST     0x2B      /*  AGCTEST  - AGC test */\r
+#define TEST2       0x2C      /*  TEST2    - Various test settings */\r
+#define TEST1       0x2D      /*  TEST1    - Various test settings */\r
+#define TEST0       0x2E      /*  TEST0    - Various test settings */\r
+\r
+/* status registers */\r
+#define PARTNUM     0x30      /*  PARTNUM    - Chip ID */\r
+#define VERSION     0x31      /*  VERSION    - Chip ID */\r
+#define FREQEST     0x32      /*  FREQEST    \96 Frequency Offset Estimate from demodulator */\r
+#define LQI         0x33      /*  LQI        \96 Demodulator estimate for Link Quality */\r
+#define RSSI        0x34      /*  RSSI       \96 Received signal strength indication */\r
+#define MARCSTATE   0x35      /*  MARCSTATE  \96 Main Radio Control State Machine state */\r
+#define WORTIME1    0x36      /*  WORTIME1   \96 High byte of WOR time */\r
+#define WORTIME0    0x37      /*  WORTIME0   \96 Low byte of WOR time */\r
+#define PKTSTATUS   0x38      /*  PKTSTATUS  \96 Current GDOx status and packet status */\r
+#define VCO_VC_DAC  0x39      /*  VCO_VC_DAC \96 Current setting from PLL calibration module */\r
+#define TXBYTES     0x3A      /*  TXBYTES    \96 Underflow and number of bytes */\r
+#define RXBYTES     0x3B      /*  RXBYTES    \96 Overflow and number of bytes */\r
+\r
+/* burst write registers */\r
+#define PATABLE     0x3E      /*  PATABLE - PA control settings table */\r
+\r
+/* command strobe registers */\r
+#define SRES        0x30      /*  SRES    - Reset chip. */\r
+#define SFSTXON     0x31      /*  SFSTXON - Enable and calibrate frequency synthesizer. */\r
+#define SXOFF       0x32      /*  SXOFF   - Turn off crystal oscillator. */\r
+#define SCAL        0x33      /*  SCAL    - Calibrate frequency synthesizer and turn it off. */\r
+#define SRX         0x34      /*  SRX     - Enable RX. Perform calibration if enabled. */\r
+#define STX         0x35      /*  STX     - Enable TX. If in RX state, only enable TX if CCA passes. */\r
+#define SIDLE       0x36      /*  SIDLE   - Exit RX / TX, turn off frequency synthesizer. */\r
+#define SRSVD       0x37      /*  SRVSD   - Reserved.  Do not use. */\r
+#define SWOR        0x38      /*  SWOR    - Start automatic RX polling sequence (Wake-on-Radio) */\r
+#define SPWD        0x39      /*  SPWD    - Enter power down mode when CSn goes high. */\r
+#define SFRX        0x3A      /*  SFRX    - Flush the RX FIFO buffer. */\r
+#define SFTX        0x3B      /*  SFTX    - Flush the TX FIFO buffer. */\r
+#define SWORRST     0x3C      /*  SWORRST - Reset real time clock. */\r
+#define SNOP        0x3D      /*  SNOP    - No operation. Returns status byte. */\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                         Prototypes\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+void mrfiRadioInterfaceInit(void);\r
+void mrfiRadioInterfaceWriteReg(uint8_t addr, uint8_t value);\r
+void mrfiRadioInterfaceWriteTxFifo(uint8_t * pWriteData, uint8_t len);\r
+void mrfiRadioInterfaceReadRxFifo(uint8_t * pReadData, uint8_t len);\r
+\r
+uint8_t mrfiRadioInterfaceCmdStrobe(uint8_t addr);\r
+uint8_t mrfiRadioInterfaceReadReg(uint8_t addr);\r
+\r
+/**************************************************************************************************\r
+ */\r
+#endif\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/Components/mrfi/smartrf/CC1101/smartrf_CC1101.h b/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/Components/mrfi/smartrf/CC1101/smartrf_CC1101.h
new file mode 100755 (executable)
index 0000000..f014b1a
--- /dev/null
@@ -0,0 +1,130 @@
+/***************************************************************\r
+ *  SmartRF Studio(tm) Export\r
+ *\r
+ *  Radio register settings specifed with C-code\r
+ *  compatible #define statements.\r
+ *\r
+ ***************************************************************/\r
+\r
+#ifndef SMARTRF_CC1101_H\r
+#define SMARTRF_CC1101_H\r
+\r
+// ISM_EU configuration\r
+//\r
+// Chipcon\r
+// Product = CC1101\r
+// Chip version = A   (VERSION = 0x04)\r
+// Crystal accuracy = 10 ppm\r
+// X-tal frequency = 26 MHz\r
+// RF output power = 0 dBm\r
+// RX filterbandwidth = 232.142857 kHz\r
+// Deviation = 32 kHz\r
+// Datarate = 76.766968 kBaud\r
+// Modulation = (1) GFSK\r
+// Manchester enable = (0) Manchester disabled\r
+// RF Frequency = 869.524963 MHz\r
+// Channel spacing = 199.951172 kHz\r
+// Channel number = 0\r
+// Optimization = -\r
+// Sync mode = (3) 30/32 sync word bits detected\r
+// Format of RX/TX data = (0) Normal mode, use FIFOs for RX and TX\r
+// CRC operation = (1) CRC calculation in TX and CRC check in RX enabled\r
+// Forward Error Correction = (0) FEC disabled\r
+// Length configuration = (1) Variable length packets, packet length configured by the first received byte after sync word.\r
+// Packetlength = 255\r
+// Preamble count = (2)  4 bytes\r
+// Append status = 1\r
+// Address check = (0) No address check\r
+// FIFO autoflush = 0\r
+// Device address = 0\r
+// GDO0 signal selection = ( 6) Asserts when sync word has been sent / received, and de-asserts at the end of the packet\r
+// GDO2 signal selection = (41) CHIP_RDY\r
+\r
+// ISM_US configuration\r
+//\r
+// Chipcon\r
+// Product = CC1101\r
+// Chip version = A   (VERSION = 0x04)\r
+// Crystal accuracy = 10 ppm\r
+// X-tal frequency = 26 MHz\r
+// RF output power = 0 dBm\r
+// RX filterbandwidth = 232.142857 kHz\r
+// Deviation = 32 kHz\r
+// Datarate = 76.766968 kBaud\r
+// Modulation = (1) GFSK\r
+// Manchester enable = (0) Manchester disabled\r
+// RF Frequency = 905.998993 MHz\r
+// Channel spacing = 199.951172 kHz\r
+// Channel number = 0\r
+// Optimization = -\r
+// Sync mode = (3) 30/32 sync word bits detected\r
+// Format of RX/TX data = (0) Normal mode, use FIFOs for RX and TX\r
+// CRC operation = (1) CRC calculation in TX and CRC check in RX enabled\r
+// Forward Error Correction = (0) FEC disabled\r
+// Length configuration = (1) Variable length packets, packet length configured by the first received byte after sync word.\r
+// Packetlength = 255\r
+// Preamble count = (2)  4 bytes\r
+// Append status = 1\r
+// Address check = (0) No address check\r
+// FIFO autoflush = 0\r
+// Device address = 0\r
+// GDO0 signal selection = ( 6) Asserts when sync word has been sent / received, and de-asserts at the end of the packet\r
+// GDO2 signal selection = (41) CHIP_RDY\r
+\r
+#define SMARTRF_RADIO_CC1101\r
+\r
+#define SMARTRF_SETTING_FSCTRL1    0x08\r
+#define SMARTRF_SETTING_FSCTRL0    0x00\r
+#ifdef ISM_EU\r
+       #define SMARTRF_SETTING_FREQ2      0x21\r
+       #define SMARTRF_SETTING_FREQ1      0x71\r
+       #define SMARTRF_SETTING_FREQ0      0x7A\r
+#else\r
+  #ifdef ISM_US  \r
+    // 902MHz (CHANNR=20->906MHz)\r
+    #define SMARTRF_SETTING_FREQ2      0x22\r
+    #define SMARTRF_SETTING_FREQ1      0xB1\r
+    #define SMARTRF_SETTING_FREQ0      0x3B\r
+  #else\r
+       #ifdef ISM_LF\r
+               // 433.92MHz\r
+           #define SMARTRF_SETTING_FREQ2      0x10\r
+           #define SMARTRF_SETTING_FREQ1      0xB0\r
+           #define SMARTRF_SETTING_FREQ0      0x71\r
+       #else\r
+               #error "Wrong ISM band specified (valid are ISM_LF, ISM_EU and ISM_US)"\r
+       #endif // ISM_LF\r
+  #endif // ISM_US\r
+#endif // ISM_EU\r
+#define SMARTRF_SETTING_MDMCFG4    0x7B\r
+#define SMARTRF_SETTING_MDMCFG3    0x83\r
+#define SMARTRF_SETTING_MDMCFG2    0x13\r
+#define SMARTRF_SETTING_MDMCFG1    0x22\r
+#define SMARTRF_SETTING_MDMCFG0    0xF8\r
+#define SMARTRF_SETTING_CHANNR     0x00\r
+#define SMARTRF_SETTING_DEVIATN    0x42\r
+#define SMARTRF_SETTING_FREND1     0xB6\r
+#define SMARTRF_SETTING_FREND0     0x10\r
+#define SMARTRF_SETTING_MCSM0      0x18\r
+#define SMARTRF_SETTING_FOCCFG     0x1D\r
+#define SMARTRF_SETTING_BSCFG      0x1C\r
+#define SMARTRF_SETTING_AGCCTRL2   0xC7\r
+#define SMARTRF_SETTING_AGCCTRL1   0x00\r
+#define SMARTRF_SETTING_AGCCTRL0   0xB2\r
+#define SMARTRF_SETTING_FSCAL3     0xEA\r
+#define SMARTRF_SETTING_FSCAL2     0x2A\r
+#define SMARTRF_SETTING_FSCAL1     0x00\r
+#define SMARTRF_SETTING_FSCAL0     0x1F\r
+#define SMARTRF_SETTING_FSTEST     0x59\r
+#define SMARTRF_SETTING_TEST2      0x81\r
+#define SMARTRF_SETTING_TEST1      0x35\r
+#define SMARTRF_SETTING_TEST0      0x09\r
+#define SMARTRF_SETTING_FIFOTHR    0x47\r
+#define SMARTRF_SETTING_IOCFG2     0x29\r
+#define SMARTRF_SETTING_IOCFG0D    0x06\r
+#define SMARTRF_SETTING_PKTCTRL1   0x04\r
+#define SMARTRF_SETTING_PKTCTRL0   0x05\r
+#define SMARTRF_SETTING_ADDR       0x00\r
+#define SMARTRF_SETTING_PKTLEN     0xFF\r
+\r
+#endif // SMARTRF_CC1101_H\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/Components/mrfi/smartrf/CC430/smartrf_CC430.h b/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/Components/mrfi/smartrf/CC430/smartrf_CC430.h
new file mode 100755 (executable)
index 0000000..fc6b49e
--- /dev/null
@@ -0,0 +1,164 @@
+/***************************************************************\r
+ *  SmartRF Studio(tm) Export\r
+ *\r
+ *  Radio register settings specifed with C-code\r
+ *  compatible #define statements.\r
+ *\r
+ ***************************************************************/\r
+\r
+#ifndef SMARTRF_CC430_H\r
+#define SMARTRF_CC430_H\r
+\r
+// [BM] Modified radio settings for 433MHz, 868MHz, 915MHz \r
+\r
+// ISM_LF configuration\r
+//\r
+// Chipcon\r
+// Product = CC1101\r
+// Chip version = A   (VERSION = 0x04)\r
+// Crystal accuracy = 10 ppm\r
+// X-tal frequency = 26 MHz\r
+// RF output power = 0 dBm\r
+// RX filterbandwidth = 232.142857 kHz\r
+// Deviation = 32 kHz\r
+// Datarate = 76.766968 kBaud\r
+// Modulation = (1) GFSK\r
+// Manchester enable = (0) Manchester disabled\r
+// RF Frequency = 433.92 MHz\r
+// Channel spacing = 199.951172 kHz\r
+// Channel number = 0\r
+// Optimization = -\r
+// Sync mode = (3) 30/32 sync word bits detected\r
+// Format of RX/TX data = (0) Normal mode, use FIFOs for RX and TX\r
+// CRC operation = (1) CRC calculation in TX and CRC check in RX enabled\r
+// Forward Error Correction = (0) FEC disabled\r
+// Length configuration = (1) Variable length packets, packet length configured by the first received byte after sync word.\r
+// Packetlength = 255\r
+// Preamble count = (2)  4 bytes\r
+// Append status = 1\r
+// Address check = (0) No address check\r
+// FIFO autoflush = 0\r
+// Device address = 0\r
+// GDO0 signal selection = ( 6) Asserts when sync word has been sent / received, and de-asserts at the end of the packet\r
+// GDO2 signal selection = (41) CHIP_RDY\r
+\r
+// ISM_EU configuration\r
+//\r
+// Chipcon\r
+// Product = CC1101\r
+// Chip version = A   (VERSION = 0x04)\r
+// Crystal accuracy = 10 ppm\r
+// X-tal frequency = 26 MHz\r
+// RF output power = 0 dBm\r
+// RX filterbandwidth = 232.142857 kHz\r
+// Deviation = 32 kHz\r
+// Datarate = 76.766968 kBaud\r
+// Modulation = (1) GFSK\r
+// Manchester enable = (0) Manchester disabled\r
+// RF Frequency = 869.524963 MHz\r
+// Channel spacing = 199.951172 kHz\r
+// Channel number = 0\r
+// Optimization = -\r
+// Sync mode = (3) 30/32 sync word bits detected\r
+// Format of RX/TX data = (0) Normal mode, use FIFOs for RX and TX\r
+// CRC operation = (1) CRC calculation in TX and CRC check in RX enabled\r
+// Forward Error Correction = (0) FEC disabled\r
+// Length configuration = (1) Variable length packets, packet length configured by the first received byte after sync word.\r
+// Packetlength = 255\r
+// Preamble count = (2)  4 bytes\r
+// Append status = 1\r
+// Address check = (0) No address check\r
+// FIFO autoflush = 0\r
+// Device address = 0\r
+// GDO0 signal selection = ( 6) Asserts when sync word has been sent / received, and de-asserts at the end of the packet\r
+// GDO2 signal selection = (41) CHIP_RDY\r
+\r
+// ISM_US configuration\r
+//\r
+// Chipcon\r
+// Product = CC1101\r
+// Chip version = A   (VERSION = 0x04)\r
+// Crystal accuracy = 10 ppm\r
+// X-tal frequency = 26 MHz\r
+// RF output power = 0 dBm\r
+// RX filterbandwidth = 232.142857 kHz\r
+// Deviation = 32 kHz\r
+// Datarate = 76.766968 kBaud\r
+// Modulation = (1) GFSK\r
+// Manchester enable = (0) Manchester disabled\r
+// RF Frequency = 905.998993 MHz\r
+// Channel spacing = 199.951172 kHz\r
+// Channel number = 0\r
+// Optimization = -\r
+// Sync mode = (3) 30/32 sync word bits detected\r
+// Format of RX/TX data = (0) Normal mode, use FIFOs for RX and TX\r
+// CRC operation = (1) CRC calculation in TX and CRC check in RX enabled\r
+// Forward Error Correction = (0) FEC disabled\r
+// Length configuration = (1) Variable length packets, packet length configured by the first received byte after sync word.\r
+// Packetlength = 255\r
+// Preamble count = (2)  4 bytes\r
+// Append status = 1\r
+// Address check = (0) No address check\r
+// FIFO autoflush = 0\r
+// Device address = 0\r
+// GDO0 signal selection = ( 6) Asserts when sync word has been sent / received, and de-asserts at the end of the packet\r
+// GDO2 signal selection = (41) CHIP_RDY\r
+\r
+#define SMARTRF_RADIO_CC430\r
+\r
+#define SMARTRF_SETTING_FSCTRL1    0x08\r
+#define SMARTRF_SETTING_FSCTRL0    0x00\r
+#ifdef ISM_EU\r
+       // 869.50MHz\r
+       #define SMARTRF_SETTING_FREQ2      0x21\r
+       #define SMARTRF_SETTING_FREQ1      0x71\r
+       #define SMARTRF_SETTING_FREQ0      0x7A\r
+#else\r
+  #ifdef ISM_US  \r
+    // 902MHz (CHANNR=20->906MHz)\r
+    #define SMARTRF_SETTING_FREQ2      0x22\r
+    #define SMARTRF_SETTING_FREQ1      0xB1\r
+    #define SMARTRF_SETTING_FREQ0      0x3B\r
+  #else\r
+       #ifdef ISM_LF\r
+               // 433.92MHz\r
+           #define SMARTRF_SETTING_FREQ2      0x10\r
+           #define SMARTRF_SETTING_FREQ1      0xB0\r
+           #define SMARTRF_SETTING_FREQ0      0x71\r
+       #else\r
+               #error "Wrong ISM band specified (valid are ISM_LF, ISM_EU and ISM_US)"\r
+       #endif // ISM_LF\r
+  #endif // ISM_US\r
+#endif // ISM_EU\r
+#define SMARTRF_SETTING_MDMCFG4    0x7B\r
+#define SMARTRF_SETTING_MDMCFG3    0x83\r
+#define SMARTRF_SETTING_MDMCFG2    0x13\r
+#define SMARTRF_SETTING_MDMCFG1    0x22\r
+#define SMARTRF_SETTING_MDMCFG0    0xF8\r
+#define SMARTRF_SETTING_CHANNR     0x00\r
+#define SMARTRF_SETTING_DEVIATN    0x42\r
+#define SMARTRF_SETTING_FREND1     0xB6\r
+#define SMARTRF_SETTING_FREND0     0x10\r
+#define SMARTRF_SETTING_MCSM0      0x18\r
+#define SMARTRF_SETTING_FOCCFG     0x1D\r
+#define SMARTRF_SETTING_BSCFG      0x1C\r
+#define SMARTRF_SETTING_AGCCTRL2   0xC7\r
+#define SMARTRF_SETTING_AGCCTRL1   0x00\r
+#define SMARTRF_SETTING_AGCCTRL0   0xB2\r
+#define SMARTRF_SETTING_FSCAL3     0xEA\r
+#define SMARTRF_SETTING_FSCAL2     0x2A\r
+#define SMARTRF_SETTING_FSCAL1     0x00\r
+#define SMARTRF_SETTING_FSCAL0     0x1F\r
+#define SMARTRF_SETTING_FSTEST     0x59\r
+#define SMARTRF_SETTING_TEST2      0x81\r
+#define SMARTRF_SETTING_TEST1      0x35\r
+#define SMARTRF_SETTING_TEST0      0x09\r
+#define SMARTRF_SETTING_FIFOTHR    0x47\r
+#define SMARTRF_SETTING_IOCFG2     0x29\r
+#define SMARTRF_SETTING_IOCFG0D    0x06\r
+#define SMARTRF_SETTING_PKTCTRL1   0x04\r
+#define SMARTRF_SETTING_PKTCTRL0   0x05\r
+#define SMARTRF_SETTING_ADDR       0x00\r
+#define SMARTRF_SETTING_PKTLEN     0xFF\r
+\r
+#endif // SMARTRF_CC430_H\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/Components/nwk/nwk.c b/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/Components/nwk/nwk.c
new file mode 100755 (executable)
index 0000000..e02c77c
--- /dev/null
@@ -0,0 +1,1078 @@
+/**************************************************************************************************\r
+  Filename:       nwk.c\r
+  Revised:        $Date: 2009-03-11 15:29:07 -0700 (Wed, 11 Mar 2009) $\r
+  Revision:       $Revision: 19382 $\r
+  Author          $Author: lfriedman $\r
+\r
+  Description:    This file supports the SimpliciTI network layer.\r
+\r
+  Copyright 2007-2009 Texas Instruments Incorporated. All rights reserved.\r
+\r
+  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+  the terms of a software license agreement between the user who downloaded the software,\r
+  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+  License. The License limits your use, and you acknowledge, that the Software may not be\r
+  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+  perform, display or sell this Software and/or its documentation for any purpose.\r
+\r
+  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+\r
+  Should you have any questions regarding your right to use this Software,\r
+  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+/******************************************************************************\r
+ * INCLUDES\r
+ */\r
+#include <string.h>\r
+#include "bsp.h"\r
+#include "mrfi.h"\r
+#include "nwk_types.h"\r
+#include "nwk_frame.h"\r
+#include "nwk.h"\r
+#include "nwk_app.h"\r
+#include "nwk_globals.h"\r
+#include "nwk_QMgmt.h"\r
+\r
+/******************************************************************************\r
+ * MACROS\r
+ */\r
+/************************* NETWORK MANIFEST CONSTANT SANITY CHECKS ****************************/\r
+#if !defined(ACCESS_POINT) && !defined(RANGE_EXTENDER) && !defined(END_DEVICE)\r
+#error ERROR: No SimpliciTI device type defined\r
+#endif\r
+\r
+#if defined(END_DEVICE) && !defined(RX_POLLS)\r
+#define RX_USER\r
+#endif\r
+\r
+#ifndef MAX_HOPS\r
+#define MAX_HOPS  3\r
+#elif MAX_HOPS > 4\r
+#error ERROR: MAX_HOPS must be 4 or fewer\r
+#endif\r
+\r
+#ifndef MAX_APP_PAYLOAD\r
+#error ERROR: MAX_APP_PAYLOAD must be defined\r
+#endif\r
+\r
+#if ( MAX_PAYLOAD < MAX_FREQ_APP_FRAME )\r
+#error ERROR: Application payload size too small for Frequency frame\r
+#endif\r
+\r
+#if ( MAX_PAYLOAD < MAX_JOIN_APP_FRAME )\r
+#error ERROR: Application payload size too small for Join frame\r
+#endif\r
+\r
+#if ( MAX_PAYLOAD < MAX_LINK_APP_FRAME )\r
+#error ERROR: Application payload size too small for Link frame\r
+#endif\r
+\r
+#if ( MAX_PAYLOAD < MAX_MGMT_APP_FRAME )\r
+#error ERROR: Application payload size too small for Management frame\r
+#endif\r
+\r
+#if ( MAX_PAYLOAD < MAX_SEC_APP_FRAME )\r
+#error ERROR: Application payload size too small for Security frame\r
+#endif\r
+\r
+#if ( MAX_PAYLOAD < MAX_PING_APP_FRAME )\r
+#error ERROR: Application payload size too small for Ping frame\r
+#endif\r
+\r
+#if NWK_FREQ_TBL_SIZE < 1\r
+#error ERROR: NWK_FREQ_TBL_SIZE must be > 0\r
+#endif\r
+\r
+/************************* END NETWORK MANIFEST CONSTANT SANITY CHECKS ************************/\r
+\r
+/******************************************************************************\r
+ * CONSTANTS AND DEFINES\r
+ */\r
+#define SYS_NUM_CONNECTIONS   (NUM_CONNECTIONS+1)\r
+\r
+/* Increment this if the persistentContext_t structure is changed. It will help\r
+ * detect the upgrade context: any saved values will have a version with a\r
+ * lower number.\r
+ */\r
+#define  CONNTABLEINFO_STRUCTURE_VERSION   1\r
+\r
+#define  SIZEOF_NV_OBJ   sizeof(sPersistInfo)\r
+\r
+/******************************************************************************\r
+ * TYPEDEFS\r
+ */\r
+/* This structure aggregates eveything necessary to save if we want to restore\r
+ * the connection information later.\r
+ */\r
+typedef struct\r
+{\r
+  const uint8_t    structureVersion; /* to dectect upgrades... */\r
+        uint8_t    numConnections;   /* count includes the UUD port/link ID */\r
+/* The next two are used to detect overlapping port assignments. When _sending_ a\r
+ * link frame the local port is assigned from the top down. When sending a _reply_\r
+ * the assignment is bottom up. Overlapping assignments are rejected. That said it\r
+ * is extremely unlikely that this will ever happen. If it does the test implemented\r
+ * here is overly cautious (it will reject assignments when it needn't). But we leave\r
+ * it that way on the assumption that it will never happen anyway.\r
+ */\r
+        uint8_t    curNextLinkPort;\r
+        uint8_t    curMaxReplyPort;\r
+        linkID_t   nextLinkID;\r
+#ifdef ACCESS_POINT\r
+        sfInfo_t   sSandFContext;\r
+#endif\r
+/* Connection table entries last... */\r
+        connInfo_t connStruct[SYS_NUM_CONNECTIONS];\r
+} persistentContext_t;\r
+\r
+/******************************************************************************\r
+ * LOCAL VARIABLES\r
+ */\r
+\r
+/* This will be overwritten if we restore the structure from NV for example.\r
+ * Note that restoring will not permit overwriting the version element as it\r
+ * is declared 'const'.\r
+ */\r
+static persistentContext_t sPersistInfo = {CONNTABLEINFO_STRUCTURE_VERSION};\r
+\r
+/******************************************************************************\r
+ * LOCAL FUNCTIONS\r
+ */\r
+static uint8_t map_lid2idx(linkID_t, uint8_t *);\r
+static void    initializeConnection(connInfo_t *);\r
+\r
+/******************************************************************************\r
+ * GLOBAL VARIABLES\r
+ */\r
+\r
+/******************************************************************************\r
+ * GLOBAL FUNCTIONS\r
+ */\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_nwkInit\r
+ *\r
+ * @brief       Initialize NWK conext.\r
+ *\r
+ * input parameters\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   Status of operation.\r
+ */\r
+smplStatus_t nwk_nwkInit(uint8_t (*f)(linkID_t))\r
+{\r
+  // [BM] Added variable\r
+  uint8_t i;\r
+       \r
+  /* Truly ugly initialization because CCE won't initialize properly. Must\r
+   * skip first const element. Yuk.\r
+   */\r
+  memset((((uint8_t *)&sPersistInfo)+1), 0x0, (sizeof(sPersistInfo)-1));\r
+  /* OK. The zeroed elements are set. Now go back and do fixups...  */\r
+\r
+  sPersistInfo.numConnections   = SYS_NUM_CONNECTIONS;\r
+  sPersistInfo.curNextLinkPort  = SMPL_PORT_USER_MAX;\r
+  sPersistInfo.curMaxReplyPort  = PORT_BASE_NUMBER;\r
+  sPersistInfo.nextLinkID       = 1;\r
+\r
+  /* initialize globals */\r
+  nwk_globalsInit();\r
+\r
+  /* initialize frame processing */\r
+  nwk_frameInit(f);\r
+\r
+  /* initialize queue manager */\r
+  nwk_QInit();\r
+       \r
+  /* initialize each network application. */\r
+  nwk_freqInit();\r
+  nwk_pingInit();\r
+  nwk_joinInit(f);\r
+  nwk_mgmtInit();\r
+  nwk_linkInit();\r
+  nwk_securityInit();\r
+  \r
+  // [BM] Workaround to enable stack restarting\r
+  for (i=0; i<SYS_NUM_CONNECTIONS; ++i)\r
+  {\r
+       sPersistInfo.connStruct[i].connState = CONNSTATE_FREE;\r
+  }\r
+\r
+  /* set up the last connection as the broadcast port mapped to the broadcast Link ID */\r
+  if (CONNSTATE_FREE == sPersistInfo.connStruct[NUM_CONNECTIONS].connState)\r
+  {\r
+    sPersistInfo.connStruct[NUM_CONNECTIONS].connState   = CONNSTATE_CONNECTED;\r
+    sPersistInfo.connStruct[NUM_CONNECTIONS].hops2target = MAX_HOPS;\r
+    sPersistInfo.connStruct[NUM_CONNECTIONS].portRx      = SMPL_PORT_USER_BCAST;\r
+    sPersistInfo.connStruct[NUM_CONNECTIONS].portTx      = SMPL_PORT_USER_BCAST;\r
+    sPersistInfo.connStruct[NUM_CONNECTIONS].thisLinkID  = SMPL_LINKID_USER_UUD;\r
+    /* set peer address to broadcast so it is used when Application sends to the broadcast Link ID */\r
+    memcpy(sPersistInfo.connStruct[NUM_CONNECTIONS].peerAddr, nwk_getBCastAddress(), NET_ADDR_SIZE);\r
+  }\r
+\r
+  return SMPL_SUCCESS;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_getNextConnection\r
+ *\r
+ * @brief       Return the next free connection structure if on is available.\r
+ *\r
+ * input parameters\r
+ *\r
+ * output parameters\r
+ *      The returned structure has the Rx port number populated based on the\r
+ *      free strucure found. This is the port queried when the app wants to\r
+ *      do a receive.\r
+ *\r
+ * @return   pointer to the new connInfo_t structure. NULL if there is\r
+ *           no room in connection structure array.\r
+ */\r
+connInfo_t *nwk_getNextConnection()\r
+{\r
+  uint8_t  i;\r
+\r
+  for (i=0; i<SYS_NUM_CONNECTIONS; ++i)\r
+  {\r
+    if (sPersistInfo.connStruct[i].connState == CONNSTATE_CONNECTED)\r
+    {\r
+      continue;\r
+    }\r
+    break;\r
+  }\r
+\r
+  if (SYS_NUM_CONNECTIONS == i)\r
+  {\r
+    return (connInfo_t *)0;\r
+  }\r
+\r
+  initializeConnection(&sPersistInfo.connStruct[i]);\r
+\r
+  return &sPersistInfo.connStruct[i];\r
+}\r
+\r
+/************************************************************************************\r
+ * @fn          initializeConnection\r
+ *\r
+ * @brief       Initialize some elements of a Connection table entry.\r
+ *\r
+ * input parameters\r
+ * @param   pCInfo  - pointer to Connection Table entry to initialize. The file\r
+ *                    scope variable holding the next link ID value is also updated.\r
+ *\r
+ * output parameters\r
+ * @param   pCInfo  - certain elements are set to specific values.\r
+ *\r
+ *\r
+ * @return   void\r
+ */\r
+static void initializeConnection(connInfo_t *pCInfo)\r
+{\r
+  linkID_t *locLID = &sPersistInfo.nextLinkID;\r
+  uint8_t   tmp;\r
+\r
+    /* this element will be populated during the exchange with the peer. */\r
+  pCInfo->portTx = 0;\r
+\r
+  pCInfo->connState  =  CONNSTATE_CONNECTED;\r
+  pCInfo->thisLinkID = *locLID;\r
+\r
+  /* Generate the next Link ID. This isn't foolproof. If the count wraps\r
+   * we can end up with confusing duplicates. We can protect aginst using\r
+   * one that is already in use but we can't protect against a stale Link ID\r
+   * remembered by an application that doesn't know its connection has been\r
+   * torn down. The test for 0 will hopefully never be true (indicating a wrap).\r
+   */\r
+  (*locLID)++;\r
+\r
+  while (!*locLID || (*locLID == SMPL_LINKID_USER_UUD) || map_lid2idx(*locLID, &tmp))\r
+  {\r
+    (*locLID)++;\r
+  }\r
+\r
+  return;\r
+}\r
+\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_freeConnection\r
+ *\r
+ * @brief       Return the connection structure to the free pool. Currently\r
+ *              this routine is only called when a link freame is sent and\r
+ *              no reply is received so the freeing steps are pretty simple.\r
+ *              But eventually this will be more complex so this place-holder\r
+ *              is introduced.\r
+ *\r
+ * input parameters\r
+ * @param   pCInfo    - pointer to entry to be freed\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   None.\r
+ */\r
+void nwk_freeConnection(connInfo_t *pCInfo)\r
+{\r
+#if NUM_CONNECTIONS > 0\r
+  pCInfo->connState = CONNSTATE_FREE;\r
+#endif\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_getConnInfo\r
+ *\r
+ * @brief       Return the connection info structure to which the input Link ID maps.\r
+ *\r
+ * input parameters\r
+ * @param   port    - port for which mapping desired\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   pointer to connInfo_t structure found. NULL if no mapping\r
+ *           found or entry not valid.\r
+ */\r
+connInfo_t *nwk_getConnInfo(linkID_t linkID)\r
+{\r
+  uint8_t idx, rc;\r
+\r
+  rc = map_lid2idx(linkID, &idx);\r
+\r
+  return (rc && (CONNSTATE_CONNECTED == sPersistInfo.connStruct[idx].connState)) ? &sPersistInfo.connStruct[idx] : (connInfo_t *)0;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_isLinkDuplicate\r
+ *\r
+ * @brief       Help determine if the link has already been established.. Defense\r
+ *              against duplicate link frames. This file owns the data structure\r
+ *              so the comparison is done here.\r
+ *\r
+ * input parameters\r
+ * @param   addr       - pointer to address of linker in question\r
+ * @param   remotePort - remote port number provided by linker\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   Returns pointer to connection entry if the address and remote Port\r
+ *           match an existing entry, otherwise 0.\r
+ */\r
+connInfo_t *nwk_isLinkDuplicate(uint8_t *addr, uint8_t remotePort)\r
+{\r
+#if NUM_CONNECTIONS > 0\r
+  uint8_t       i;\r
+  connInfo_t   *ptr = sPersistInfo.connStruct;\r
+\r
+  for (i=0; i<NUM_CONNECTIONS; ++i,++ptr)\r
+  {\r
+    if (CONNSTATE_CONNECTED == ptr->connState)\r
+    {\r
+      if (!(memcmp(ptr->peerAddr, addr, NET_ADDR_SIZE)) &&\r
+          (ptr->portTx == remotePort))\r
+      {\r
+        return ptr;\r
+      }\r
+    }\r
+  }\r
+#endif\r
+\r
+  return (connInfo_t *)NULL;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_findAddressMatch\r
+ *\r
+ * @brief       Used to look for an address match in the Connection table.\r
+ *              Match is based on source address in frame.\r
+ *\r
+ * input parameters\r
+ * @param   frame    - pointer to frame in question\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   Returns non-zero if a match is found, otherwise 0.\r
+ */\r
+uint8_t nwk_findAddressMatch(mrfiPacket_t *frame)\r
+{\r
+#if NUM_CONNECTIONS > 0\r
+  uint8_t       i;\r
+  connInfo_t   *ptr = sPersistInfo.connStruct;\r
+\r
+  for (i=0; i<NUM_CONNECTIONS; ++i,++ptr)\r
+  {\r
+\r
+    if (CONNSTATE_CONNECTED == ptr->connState)\r
+    {\r
+      if (!(memcmp(ptr->peerAddr, MRFI_P_SRC_ADDR(frame), NET_ADDR_SIZE)))\r
+      {\r
+        return 1;\r
+      }\r
+    }\r
+  }\r
+#endif\r
+\r
+  return 0;\r
+}\r
+\r
+#ifdef ACCESS_POINT\r
+/******************************************************************************\r
+ * @fn          nwk_getSFInfoPtr\r
+ *\r
+ * @brief       Get pointer to store-and-forward information object kept in the\r
+ *              NV object aggregate.\r
+ *\r
+ * input parameters\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   Returns pointer to the store-nad-forward object.\r
+ */\r
+sfInfo_t *nwk_getSFInfoPtr(void)\r
+{\r
+  return &sPersistInfo.sSandFContext;\r
+}\r
+\r
+#if defined(AP_IS_DATA_HUB)\r
+/***************************************************************************************\r
+ * @fn          nwk_saveJoinedDevice\r
+ *\r
+ * @brief       Save the address of a joining device on the Connection Table expecting\r
+ *              a Link frame to follow. Only for when AP is a data hub. We want to\r
+ *              use the space already allocated for a connection able entry instead\r
+ *              of having redundant arrays for alread-joined devices in the data hub\r
+ *              case.\r
+ *\r
+ * input parameters\r
+ * @param   frame  - pointer to frame containing address or joining device.\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   Returns non-zero if this is a new device and it is saved. Returns\r
+ *           0 if device already there or there is no room in the Connection\r
+ *           Table.\r
+ */\r
+uint8_t nwk_saveJoinedDevice(mrfiPacket_t *frame)\r
+{\r
+  uint8_t     i;\r
+  connInfo_t *avail = 0;\r
+  connInfo_t *ptr   = sPersistInfo.connStruct;\r
+\r
+  for (i=0; i<NUM_CONNECTIONS; ++i, ++ptr)\r
+  {\r
+    if ((ptr->connState == CONNSTATE_CONNECTED) || (ptr->connState == CONNSTATE_JOINED))\r
+    {\r
+      if (!memcmp(ptr->peerAddr, MRFI_P_SRC_ADDR(frame), NET_ADDR_SIZE))\r
+      {\r
+        return 0;\r
+      }\r
+    }\r
+    else\r
+    {\r
+      avail = ptr;\r
+    }\r
+  }\r
+\r
+  if (!avail)\r
+  {\r
+    return 0;\r
+  }\r
+\r
+  avail->connState = CONNSTATE_JOINED;\r
+  memcpy(avail->peerAddr, MRFI_P_SRC_ADDR(frame), NET_ADDR_SIZE);\r
+\r
+  return 1;\r
+}\r
+\r
+/***********************************************************************************\r
+ * @fn          nwk_findAlreadyJoined\r
+ *\r
+ * @brief       Used when AP is a data hub to look for an address match in the\r
+ *              Connection table for a device that is already enterd in the joined\r
+ *              state. This means that the Connection Table resource is already\r
+ *              allocated so the link-listen doesn't have to do it again. Match is\r
+ *              based on source address in frame. Thsi shoudl only be called from\r
+ *              the Link-listen context during the link frame reply.\r
+ *\r
+ *              If found the Connection Table entry is initialized as if it were\r
+ *              found using the nwk_getNextConnection() method.\r
+ *\r
+ * input parameters\r
+ * @param   frame    - pointer to frame in question\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   Returns pointer to Connection Table entry if match is found, otherwise\r
+ *           0. This call will only fail if the Connection Table was full when the\r
+ *           device tried to join initially.\r
+ */\r
+connInfo_t *nwk_findAlreadyJoined(mrfiPacket_t *frame)\r
+{\r
+  uint8_t     i;\r
+  connInfo_t *ptr = sPersistInfo.connStruct;\r
+\r
+  for (i=0; i<NUM_CONNECTIONS; ++i,++ptr)\r
+  {\r
+    /* Look for an entry in the JOINED state */\r
+    if (CONNSTATE_JOINED == ptr->connState)\r
+    {\r
+      /* Is this it? */\r
+      if (!(memcmp(&ptr->peerAddr, MRFI_P_SRC_ADDR(frame), NET_ADDR_SIZE)))\r
+      {\r
+        /* Yes. Initilize tabel entry and return the pointer. */\r
+        initializeConnection(ptr);\r
+        return ptr;\r
+      }\r
+    }\r
+  }\r
+\r
+  /* Nothing found... */\r
+  return (connInfo_t *)NULL;\r
+}\r
+#endif  /* AP_IS_DATA_HUB */\r
+#endif  /* ACCESS_POINT */\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_checkConnInfo\r
+ *\r
+ * @brief       Do a sanity/validity check on the connection info\r
+ *\r
+ * input parameters\r
+ * @param   ptr     - pointer to a valid connection info structure to validate\r
+ * @param   which   - Tx or Rx port checked\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   Status of operation.\r
+ */\r
+smplStatus_t nwk_checkConnInfo(connInfo_t *ptr, uint8_t which)\r
+{\r
+  uint8_t  port;\r
+\r
+  /* make sure port isn't null and that the entry is active */\r
+  port = (CHK_RX == which) ? ptr->portRx : ptr->portTx;\r
+  if (!port || (CONNSTATE_FREE == ptr->connState))\r
+  {\r
+    return SMPL_BAD_PARAM;\r
+  }\r
+\r
+  /* validate port number */\r
+  if (port < PORT_BASE_NUMBER)\r
+  {\r
+    return SMPL_BAD_PARAM;\r
+  }\r
+\r
+  return SMPL_SUCCESS;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_isConnectionValid\r
+ *\r
+ * @brief       Do a sanity/validity check on the frame target address by\r
+ *              validating frame against connection info\r
+ *\r
+ * input parameters\r
+ * @param   frame   - pointer to frame in question\r
+ *\r
+ * output parameters\r
+ * @param   lid   - link ID of found connection\r
+ *\r
+ * @return   0 if connection specified in frame is not valid, otherwise non-zero.\r
+ */\r
+uint8_t nwk_isConnectionValid(mrfiPacket_t *frame, linkID_t *lid)\r
+{\r
+  uint8_t       i;\r
+  connInfo_t   *ptr  = sPersistInfo.connStruct;\r
+  uint8_t       port = GET_FROM_FRAME(MRFI_P_PAYLOAD(frame), F_PORT_OS);\r
+\r
+  for (i=0; i<SYS_NUM_CONNECTIONS; ++i,++ptr)\r
+  {\r
+    if (CONNSTATE_CONNECTED == ptr->connState)\r
+    {\r
+      /* check port first since we're done if the port is the user bcast port. */\r
+      if (port == ptr->portRx)\r
+      {\r
+        /* yep...ports match. */\r
+        if ((SMPL_PORT_USER_BCAST == port) || !(memcmp(ptr->peerAddr, MRFI_P_SRC_ADDR(frame), NET_ADDR_SIZE)))\r
+        {\r
+          uint8_t rc = 1;\r
+\r
+          /* we're done. */\r
+          *lid = ptr->thisLinkID;\r
+#ifdef APP_AUTO_ACK\r
+          /* can't ack the broadcast port... */\r
+          if (!(SMPL_PORT_USER_BCAST == port))\r
+          {\r
+            if (GET_FROM_FRAME(MRFI_P_PAYLOAD(frame), F_ACK_REQ))\r
+            {\r
+              /* Ack requested. Send ack now */\r
+              nwk_sendAckReply(frame, ptr->portTx);\r
+            }\r
+            else if (GET_FROM_FRAME(MRFI_P_PAYLOAD(frame), F_ACK_RPLY))\r
+            {\r
+              /* This is a reply. Signal that it was received by resetting the\r
+               * saved transaction ID in the connection object if they match. The\r
+               * main thread is polling this value. The setting here is in the\r
+               * Rx ISR thread.\r
+               */\r
+              if (ptr->ackTID == GET_FROM_FRAME(MRFI_P_PAYLOAD(frame), F_TRACTID_OS))\r
+              {\r
+                ptr->ackTID = 0;\r
+              }\r
+              /* This causes the frame to be dropped. All ack frames are\r
+               * dropped.\r
+               */\r
+              rc = 0;\r
+            }\r
+          }\r
+#endif  /* APP_AUTO_ACK */\r
+          /* Unconditionally kill the reply delay semaphore. This used to be done\r
+           * unconditionally in the calling routine.\r
+           */\r
+          MRFI_PostKillSem();\r
+          return rc;\r
+        }\r
+      }\r
+    }\r
+  }\r
+\r
+  /* no matches */\r
+  return 0;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_allocateLocalRxPort\r
+ *\r
+ * @brief       Allocate a local port on which to receive frames from a peer.\r
+ *\r
+ *              Allocation differs depending on whether the allocation is for\r
+ *              a link reply frame or a link frame. In the former case we\r
+ *              know the address of the peer so we can ensure allocating a\r
+ *              unique port number for that address. The same port number can be\r
+ *              used mulitple times for distinct peers. Allocations are done from\r
+ *              the bottom of the namespace upward.\r
+ *\r
+ *              If allocation is for a link frame we do not yet know the peer\r
+ *              address so we must ensure the port number is unique now.\r
+ *              Allocations are done from the top of the namespace downward.\r
+ *\r
+ *              The two allocation methods track the extreme values used in each\r
+ *              case to detect overlap, i.e., exhausted namespace. This can only\r
+ *              happen if the number of connections supported is greater than the\r
+ *              total namespace available.\r
+ *\r
+ * input parameters\r
+ * @param   which   - Sending a link frame or a link reply frame\r
+ * @param   newPtr  - pointer to connection info structure to be populated\r
+ *\r
+ * output parameters\r
+ * @param   newPtr->portRx  - element is populated with port number.\r
+ *\r
+ * @return   Non-zero if port number assigned. 0 if no port available.\r
+ */\r
+uint8_t nwk_allocateLocalRxPort(uint8_t which, connInfo_t *newPtr)\r
+{\r
+#if NUM_CONNECTIONS > 0\r
+  uint8_t     num, i;\r
+  uint8_t     marker[NUM_CONNECTIONS];\r
+  connInfo_t *ptr = sPersistInfo.connStruct;\r
+\r
+  memset(&marker, 0x0, sizeof(marker));\r
+\r
+  for (i=0; i<NUM_CONNECTIONS; ++i,++ptr)\r
+  {\r
+    /* Mark the port number as used unless it's a statically allocated port */\r
+    if ((ptr != newPtr) && (CONNSTATE_CONNECTED == ptr->connState) && (ptr->portRx <= SMPL_PORT_USER_MAX))\r
+    {\r
+      if (LINK_SEND == which)\r
+      {\r
+        if (ptr->portRx > sPersistInfo.curNextLinkPort)\r
+        {\r
+          marker[SMPL_PORT_USER_MAX - ptr->portRx] = 1;\r
+        }\r
+      }\r
+      else if (!memcmp(ptr->peerAddr, newPtr->peerAddr, NET_ADDR_SIZE))\r
+      {\r
+          marker[ptr->portRx - PORT_BASE_NUMBER] = 1;\r
+      }\r
+    }\r
+  }\r
+\r
+  num = 0;\r
+  for (i=0; i<NUM_CONNECTIONS; ++i)\r
+  {\r
+    if (!marker[i])\r
+    {\r
+      if (LINK_REPLY == which)\r
+      {\r
+        num = PORT_BASE_NUMBER + i;\r
+      }\r
+      else\r
+      {\r
+        num = SMPL_PORT_USER_MAX - i;\r
+      }\r
+      break;\r
+    }\r
+  }\r
+\r
+  if (LINK_REPLY == which)\r
+  {\r
+    /* if the number we have doesn't overlap the assignment of ports used\r
+     * for sending link frames, use it.\r
+     */\r
+    if (num <= sPersistInfo.curNextLinkPort)\r
+    {\r
+      if (num > sPersistInfo.curMaxReplyPort)\r
+      {\r
+        /* remember maximum port number used */\r
+        sPersistInfo.curMaxReplyPort = num;\r
+      }\r
+    }\r
+    else\r
+    {\r
+      /* the port number we need has already been used in the other context. It may or\r
+       * may not have been used for the same address but we don't bother to check...we\r
+       * just reject the asignment. This is the overly cautious part but is extermely\r
+       * unlikely to ever occur.\r
+       */\r
+      num = 0;\r
+    }\r
+  }\r
+  else\r
+  {\r
+    /* if the number we have doesn't overlap the assignment of ports used\r
+     * for sending link frame replies, use it.\r
+     */\r
+    if (num >= sPersistInfo.curMaxReplyPort)\r
+    {\r
+      if (num == sPersistInfo.curNextLinkPort)\r
+      {\r
+        sPersistInfo.curNextLinkPort--;\r
+      }\r
+    }\r
+    else\r
+    {\r
+      /* the port number we need has already been used in the other context. It may or\r
+       * may not have been used for the same address but we don't bother to check...we\r
+       * just reject the asignment. This is the overly cautious part but is extermely\r
+       * unlikely to ever occur.\r
+       */\r
+      num = 0;\r
+    }\r
+  }\r
+\r
+  newPtr->portRx = num;\r
+\r
+  return num;\r
+#else\r
+  return 0;\r
+#endif  /* NUM_CONNECTIONS > 0 */\r
+\r
+}\r
+\r
+/*******************************************************************************\r
+ * @fn          nwk_isValidReply\r
+ *\r
+ * @brief       Examine a frame to see if it is a valid reply when compared with\r
+ *              expected parameters.\r
+ *\r
+ * input parameters\r
+ * @param   frame      - pointer to frmae being examined\r
+ * @param   tid        - expected transaction ID in application payload\r
+ * @param   infoOffset - offset to payload information containing reply hint\r
+ * @param   tidOffset  - offset to transaction ID in payload\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   reply category:\r
+ *               SMPL_NOT_REPLY: not a reply\r
+ *               SMPL_MY_REPLY : a reply that matches input parameters\r
+ *               SMPL_A_REPLY  : a reply but does not match input parameters\r
+ */\r
+uint8_t nwk_isValidReply(mrfiPacket_t *frame, uint8_t tid, uint8_t infoOffset, uint8_t tidOffset)\r
+{\r
+  uint8_t rc = SMPL_NOT_REPLY;\r
+\r
+  if ((*(MRFI_P_PAYLOAD(frame)+F_APP_PAYLOAD_OS+infoOffset) & NWK_APP_REPLY_BIT))\r
+  {\r
+    if ((*(MRFI_P_PAYLOAD(frame)+F_APP_PAYLOAD_OS+tidOffset) == tid) &&\r
+        !memcmp(MRFI_P_DST_ADDR(frame), nwk_getMyAddress(), NET_ADDR_SIZE))\r
+    {\r
+      rc = SMPL_MY_REPLY;\r
+    }\r
+    else\r
+    {\r
+      rc = SMPL_A_REPLY;\r
+    }\r
+  }\r
+\r
+  return rc;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          map_lid2idx\r
+ *\r
+ * @brief       Map link ID to index into connection table.\r
+ *\r
+ * input parameters\r
+ * @param   lid   - Link ID to be matched\r
+ *\r
+ * output parameters\r
+ * @param   idx   - populated with index into connection table\r
+ *\r
+ * @return   Non-zero if Link ID found and output is valid else 0.\r
+ */\r
+static uint8_t map_lid2idx(linkID_t lid, uint8_t *idx)\r
+{\r
+  uint8_t     i;\r
+  connInfo_t *ptr = sPersistInfo.connStruct;\r
+\r
+  for (i=0; i<SYS_NUM_CONNECTIONS; ++i, ++ptr)\r
+  {\r
+    if ((CONNSTATE_CONNECTED == ptr->connState) && (ptr->thisLinkID == lid))\r
+    {\r
+      *idx = i;\r
+      return 1;\r
+    }\r
+  }\r
+\r
+  return 0;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_findPeer\r
+ *\r
+ * @brief       Find connection entry for a peer\r
+ *\r
+ * input parameters\r
+ * @param   peerAddr   - address of peer\r
+ * @param   peerPort   - port on which this device was sending to peer.\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   Pointer to matching connection table entry else 0.\r
+ */\r
+connInfo_t *nwk_findPeer(addr_t *peerAddr, uint8_t peerPort)\r
+{\r
+  uint8_t     i;\r
+  connInfo_t *ptr = sPersistInfo.connStruct;\r
+\r
+  for (i=0; i<SYS_NUM_CONNECTIONS; ++i, ++ptr)\r
+  {\r
+    if (CONNSTATE_CONNECTED == ptr->connState)\r
+    {\r
+      if (!memcmp(peerAddr, ptr->peerAddr, NET_ADDR_SIZE))\r
+      {\r
+        if (peerPort == ptr->portTx)\r
+        {\r
+          return ptr;\r
+        }\r
+      }\r
+    }\r
+  }\r
+\r
+  return (connInfo_t *)NULL;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_checkAppMsgTID\r
+ *\r
+ * @brief       Compare received TID to last-seen TID to decide whether the\r
+ *              received message is a duplicate or we missed some.\r
+ *\r
+ * input parameters\r
+ * @param   lastTID   - last-seen TID\r
+ * @param   appMsgTID - TID from current application payload.\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   Returns zero if message with supplied TID should be discarded.\r
+ *           Otherwise returns non-zero. In this case the message should be\r
+ *           processed. The last-seen TID should be updated with the current\r
+ *           application payload TID.\r
+ *\r
+ */\r
+uint8_t nwk_checkAppMsgTID(appPTid_t lastTID, appPTid_t appMsgTID)\r
+{\r
+  uint8_t rc = 0;\r
+\r
+  /* If the values are equal this is a duplicate. We're done. */\r
+  if (lastTID != appMsgTID)\r
+  {\r
+    /* Is the new TID bigger? */\r
+    if (appMsgTID > lastTID)\r
+    {\r
+      /* In this case the current payload is OK unless we've received a late\r
+       * (duplicate) message that occurred just before the TID wrapped. This is\r
+       * considered a duplicate and we should discard it.\r
+       */\r
+      if (!(DUP_TID_AFTER_WRAP(lastTID, appMsgTID)))\r
+      {\r
+        rc = 1;\r
+      }\r
+    }\r
+    else\r
+    {\r
+      /* New TID is smaller. Accept the payload if this is the wrap case or we missed\r
+       * the specific wrap frame but are still within the range in which we assume\r
+       * we missed it. Otherwise is a genuine late frame so we should ignore it.\r
+       */\r
+      if (CHECK_TID_WRAP(lastTID, appMsgTID))\r
+      {\r
+        rc = 1;\r
+      }\r
+    }\r
+  }\r
+\r
+  return rc;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_getNumObjectFromMsg\r
+ *\r
+ * @brief       Get a numeric object from a message buffer. Take care of\r
+ *              alignment and endianess issues.\r
+ *\r
+ * input parameters\r
+ * @param   src     - pointer to object location in message buffer\r
+ * @param   objSize - size of numeric object\r
+ *\r
+ * output parameters\r
+ * @param   dest - pointer to numeric type variable receiving the object\r
+ *                 contains aligned number in correct endian order on return.\r
+ *\r
+ * @return   void. There is no warning if there is no case for the supplied\r
+ *                 object size. A simple copy is then done. Alignment is\r
+ *                 guaranteed only for object size cases defined (and\r
+ *                 vacuously size 1).\r
+ *\r
+ */\r
+void nwk_getNumObjectFromMsg(void *src, void *dest, uint8_t objSize)\r
+{\r
+  /* Take care of alignment */\r
+  memmove(dest, src, objSize);\r
+\r
+  /* Take care of endianess */\r
+  switch(objSize)\r
+  {\r
+    case 2:\r
+      *((uint16_t *)dest) = ntohs(*((uint16_t *)dest));\r
+      break;\r
+\r
+    case 4:\r
+      *((uint32_t *)dest) = ntohl(*((uint32_t *)dest));\r
+      break;\r
+  }\r
+\r
+  return;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_putNumObjectIntoMsg\r
+ *\r
+ * @brief       Put a numeric object into a message buffer. Take care of\r
+ *              alignment and endianess issues.\r
+ *\r
+ * input parameters\r
+ * @param   src     - pointer to numeric type variable providing the object\r
+ * @param   objSize - size of numeric object. Fuction works for object size 1.\r
+ *\r
+ * output parameters\r
+ * @param   dest - pointer to object location in message buffer where the\r
+ *                 correct endian order representation will be placed.\r
+ *\r
+ * @return   void. There is no warning if there is no case for the supplied\r
+ *                 object size. A simple copy is then done.\r
+ *\r
+ */\r
+void nwk_putNumObjectIntoMsg(void *src, void *dest, uint8_t objSize)\r
+{\r
+\r
+  uint8_t *ptr;\r
+  uint16_t u16;\r
+  uint32_t u32;\r
+\r
+  /* Take care of endianess */\r
+  switch(objSize)\r
+  {\r
+    case 1:\r
+      ptr = (uint8_t *)src;\r
+      break;\r
+\r
+    case 2:\r
+      u16 = htons(*((uint16_t *)src));\r
+      ptr = (uint8_t *)&u16;\r
+      break;\r
+\r
+    case 4:\r
+      u32 = htonl(*((uint32_t *)src));\r
+      ptr = (uint8_t *)&u32;\r
+      break;\r
+\r
+    default:\r
+      ptr = (uint8_t *)src;\r
+      break;\r
+  }\r
+\r
+  /* Take care of alignment */\r
+  memmove(dest, ptr, objSize);\r
+\r
+  return;\r
+}\r
+/******************************************************************************\r
+ * @fn          nwk_NVObj\r
+ *\r
+ * @brief       GET and SET support for NV object (connection context).\r
+ *\r
+ * input parameters\r
+ * @param   action  - GET or SET\r
+ * @param   val     - (GET/SET) pointer to NV IOCTL object.\r
+ *                    (SET) NV length and version values to be used for sanity\r
+ *                    checks.\r
+ *\r
+ * output parameters\r
+ * @param   val     - (GET) Version number of NV object, size of NV object and\r
+ *                          pointer to the connection context memory.\r
+ *                  - (SET) Pointer to the connection context memory.\r
+ *\r
+ * @return   SMPL_SUCCESS\r
+ *           SMPL_BAD_PARAM   Object version or size do not conform on a SET call\r
+ *                            or illegal action specified.\r
+ */\r
+smplStatus_t nwk_NVObj(ioctlAction_t action, ioctlNVObj_t *val)\r
+{\r
+#ifdef NVOBJECT_SUPPORT\r
+  smplStatus_t rc = SMPL_SUCCESS;\r
+\r
+  if (IOCTL_ACT_GET == action)\r
+  {\r
+    /* Populate helper objects */\r
+    val->objLen     = SIZEOF_NV_OBJ;\r
+    val->objVersion = sPersistInfo.structureVersion;\r
+    /* Set pointer to connection context if address of pointer is not null */\r
+    if (val->objPtr)\r
+    {\r
+      *(val->objPtr) = (uint8_t *)&sPersistInfo;\r
+    }\r
+  }\r
+  else\r
+  {\r
+    rc = SMPL_BAD_PARAM;\r
+  }\r
+\r
+  return rc;\r
+#else  /* NVOBJECT_SUPPORT */\r
+  return SMPL_BAD_PARAM;\r
+#endif\r
+}\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/Components/nwk/nwk.h b/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/Components/nwk/nwk.h
new file mode 100755 (executable)
index 0000000..6009f38
--- /dev/null
@@ -0,0 +1,159 @@
+/**************************************************************************************************\r
+  Filename:       nwk.h\r
+  Revised:        $Date: 2008-12-01 11:58:33 -0800 (Mon, 01 Dec 2008) $\r
+  Revision:       $Revision: 18551 $\r
+  Author:         $Author: lfriedman $\r
+\r
+  Description:    This header file supports the SimpliciTI network layer.\r
+\r
+  Copyright 2004-2007 Texas Instruments Incorporated. All rights reserved.\r
+\r
+  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+  the terms of a software license agreement between the user who downloaded the software,\r
+  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+  License. The License limits your use, and you acknowledge, that the Software may not be\r
+  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+  perform, display or sell this Software and/or its documentation for any purpose.\r
+\r
+  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+\r
+  Should you have any questions regarding your right to use this Software,\r
+  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+#ifndef NWK_H\r
+#define NWK_H\r
+\r
+\r
+/* well known ports*/\r
+#define SMPL_PORT_PING          0x01\r
+#define SMPL_PORT_LINK          0x02\r
+#define SMPL_PORT_JOIN          0x03\r
+#define SMPL_PORT_SECURITY      0x04\r
+#define SMPL_PORT_FREQ          0x05\r
+#define SMPL_PORT_MGMT          0x06\r
+\r
+#define SMPL_PORT_NWK_BCAST     0x1F\r
+#define SMPL_PORT_USER_BCAST    0x3F\r
+\r
+/* Unconnected User Datagram Link ID */\r
+#define SMPL_LINKID_USER_UUD    ((linkID_t) ~0)\r
+\r
+#define PORT_BASE_NUMBER        0x20\r
+\r
+/* Reserve the top of the User port namespace below the broadcast\r
+ * address for static allocation.\r
+ */\r
+#define PORT_USER_STATIC_NUM    1\r
+#define SMPL_PORT_STATIC_MAX    0x3E\r
+#define SMPL_PORT_USER_MAX      (SMPL_PORT_STATIC_MAX - PORT_USER_STATIC_NUM)\r
+\r
+\r
+/* to check connection info sanity */\r
+#define CHK_RX   0\r
+#define CHK_TX   1\r
+\r
+/* return types for validating a reply frame */\r
+#define SMPL_MY_REPLY    0\r
+#define SMPL_A_REPLY     1\r
+#define SMPL_NOT_REPLY   2\r
+\r
+/* when allocating local Rx port it depends on whether the allocation\r
+ * is being done as a result of a link or a link reply\r
+ */\r
+#define LINK_SEND   1\r
+#define LINK_REPLY  2\r
+\r
+#define  CONNSTATE_FREE       (0x00)\r
+#define  CONNSTATE_JOINED     (0x01)\r
+#define  CONNSTATE_CONNECTED  (0x02)\r
+\r
+typedef struct\r
+{\r
+  volatile uint8_t     connState;\r
+           uint8_t     hops2target;\r
+#ifdef APP_AUTO_ACK\r
+  volatile uint8_t     ackTID;\r
+#endif\r
+           uint8_t     peerAddr[NET_ADDR_SIZE];\r
+           rxMetrics_t sigInfo;\r
+           uint8_t     portRx;\r
+           uint8_t     portTx;\r
+           linkID_t    thisLinkID;\r
+#ifdef SMPL_SECURE\r
+           uint32_t    connTxCTR;\r
+           uint32_t    connRxCTR;\r
+#endif\r
+} connInfo_t;\r
+\r
+/****************************************************************************************\r
+ *                         Application Payload TID support\r
+ *\r
+ * Sometimes the receiving application uses a payload TID to determine if either it\r
+ * missed frames (received TID > (last-seen TID+1)) or is seeing a duplicate (received\r
+ * TID <= last-seen TID). Typically the TID simply increments for each successive frame.\r
+ * But when the count wraps there is a problem. The received TID should always be one\r
+ * more than the last TID. If it's equal, it's a duplicate. If it's less it's late. If\r
+ * it's one more it's the one we expect. If it's more than 1 more then we missed frames.\r
+ * Simple increments work for the wrap arithmetically. If the received TID is 0 and the last\r
+ * seen ID is the biggest number in the world -- 0xFF... depending on type we can detect\r
+ * the wrap. But if the receiver misses the 0 TID value for any reason or the biggest\r
+ * number in the world TID is missed then susbequent testing for missed or duplicate\r
+ * frames can get confused. We resolve this by allowing some leeway in the wrap testing.\r
+ * this testing is assisted by the following macros. Setting TID_VALID_WINDOW to 0\r
+ * will enforce a no leniency policy. In this case you'd better not miss either the\r
+ * biggest number or the 0. The CHECK_TID_WRAP macro is only needed if the received\r
+ * TID is less than the last-seen TID. The DUP_TID_AFTER_WRAP macro is only needed if the\r
+ * received TID is greater than 1 more than the last-seen TID.\r
+ ***************************************************************************************/\r
+#define MAX_APT           ((appPTid_t)~0)    /* max value of application payload TID type */\r
+#define TID_VALID_WINDOW  2                  /* window around max and 0 */\r
+\r
+#define CHECK_TID_WRAP(lastTID, newTID)   ((lastTID >= (MAX_APT - TID_VALID_WINDOW)) &&  \\r
+                                           (newTID <= TID_VALID_WINDOW)                  \\r
+                                          )\r
+#define DUP_TID_AFTER_WRAP(lastTID, newTID)     ((newTID >= (MAX_APT - TID_VALID_WINDOW)) &&  \\r
+                                                 (lastTID <= TID_VALID_WINDOW)                  \\r
+                                                )\r
+\r
+/* prototypes */\r
+smplStatus_t  nwk_nwkInit(uint8_t (*)(linkID_t));\r
+connInfo_t   *nwk_getNextConnection(void);\r
+void          nwk_freeConnection(connInfo_t *);\r
+uint8_t       nwk_getNextClientPort(void);\r
+connInfo_t   *nwk_getConnInfo(linkID_t port);\r
+connInfo_t   *nwk_isLinkDuplicate(uint8_t *, uint8_t);\r
+uint8_t       nwk_findAddressMatch(mrfiPacket_t *);\r
+smplStatus_t  nwk_checkConnInfo(connInfo_t *, uint8_t);\r
+uint8_t       nwk_isConnectionValid(mrfiPacket_t *, linkID_t *);\r
+uint8_t       nwk_allocateLocalRxPort(uint8_t, connInfo_t *);\r
+uint8_t       nwk_isValidReply(mrfiPacket_t *, uint8_t, uint8_t, uint8_t);\r
+connInfo_t   *nwk_findPeer(addr_t *, uint8_t);\r
+smplStatus_t  nwk_NVObj(ioctlAction_t, ioctlNVObj_t *);\r
+\r
+\r
+uint8_t       nwk_checkAppMsgTID(appPTid_t, appPTid_t);\r
+void          nwk_getNumObjectFromMsg(void *, void *, uint8_t);\r
+void          nwk_putNumObjectIntoMsg(void *, void *, uint8_t);\r
+#ifdef ACCESS_POINT\r
+sfInfo_t     *nwk_getSFInfoPtr(void);\r
+#ifdef AP_IS_DATA_HUB\r
+uint8_t       nwk_saveJoinedDevice(mrfiPacket_t *);\r
+connInfo_t   *nwk_findAlreadyJoined(mrfiPacket_t *);\r
+#endif\r
+#endif\r
+\r
+\r
+#endif\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/Components/nwk/nwk_QMgmt.c b/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/Components/nwk/nwk_QMgmt.c
new file mode 100755 (executable)
index 0000000..4cb34ea
--- /dev/null
@@ -0,0 +1,417 @@
+/**************************************************************************************************\r
+  Filename:       nwk_QMgmt.c\r
+  Revised:        $Date: 2009-03-10 17:01:56 -0700 (Tue, 10 Mar 2009) $\r
+  Revision:       $Revision: 19372 $\r
+  Author:         $Author: lfriedman $\r
+\r
+  Description:    This file supports the SimpliciTI input and output frame queues\r
+\r
+  Copyright 2007-2008 Texas Instruments Incorporated. All rights reserved.\r
+\r
+  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+  the terms of a software license agreement between the user who downloaded the software,\r
+  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+  License. The License limits your use, and you acknowledge, that the Software may not be\r
+  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+  perform, display or sell this Software and/or its documentation for any purpose.\r
+\r
+  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+\r
+  Should you have any questions regarding your right to use this Software,\r
+  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+\r
+/******************************************************************************\r
+ * INCLUDES\r
+ */\r
+#include <intrinsics.h>\r
+#include <string.h>\r
+#include "bsp.h"\r
+#include "mrfi.h"\r
+#include "nwk_types.h"\r
+#include "nwk.h"\r
+#include "nwk_frame.h"\r
+#include "nwk_QMgmt.h"\r
+#include "nwk_mgmt.h"     /* need offsets for poll frames */\r
+\r
+/******************************************************************************\r
+ * MACROS\r
+ */\r
+\r
+/******************************************************************************\r
+ * CONSTANTS AND DEFINES\r
+ */\r
+\r
+/******************************************************************************\r
+ * TYPEDEFS\r
+ */\r
+\r
+/******************************************************************************\r
+ * LOCAL VARIABLES\r
+ */\r
+\r
+#if SIZE_INFRAME_Q > 0\r
+static frameInfo_t   sInFrameQ[SIZE_INFRAME_Q];\r
+#else\r
+static frameInfo_t  *sInFrameQ = NULL;\r
+#endif  /* SIZE_INFRAME_Q > 0 */\r
+\r
+static frameInfo_t   sOutFrameQ[SIZE_OUTFRAME_Q];\r
+\r
+/******************************************************************************\r
+ * LOCAL FUNCTIONS\r
+ */\r
+\r
+/******************************************************************************\r
+ * GLOBAL VARIABLES\r
+ */\r
+\r
+/******************************************************************************\r
+ * GLOBAL FUNCTIONS\r
+ */\r
+\r
+/******************************************************************************\r
+* @fn          nwk_QInit\r
+* \r
+* @brief     Initialize the input and output frame queues to hold no packets. \r
+* \r
+* input parameters\r
+* \r
+* output parameters\r
+* \r
+* @return   void\r
+*/\r
+void nwk_QInit(void)\r
+{\r
+#if SIZE_INFRAME_Q > 0\r
+  memset(sInFrameQ, 0, sizeof(sInFrameQ));\r
+#endif  // SIZE_INFRAME_Q > 0\r
+  memset(sOutFrameQ, 0, sizeof(sOutFrameQ));\r
+}\r
\r
+/******************************************************************************\r
+ * @fn          nwk_QfindSlot\r
+ *\r
+ * @brief       Finds a slot to use to retrieve the frame from the radio. It\r
+ *              uses a LRU cast-out scheme. It is possible that this routine\r
+ *              finds no slot. This can happen if the queue is of size 1 or 2\r
+ *              and the Rx interrupt occurs during a retrieval call from an\r
+ *              application. There are meta-states for frames as the application\r
+ *              looks for the oldest frame on the port being requested.\r
+ *\r
+ *              This routine is running in interrupt context.\r
+ *\r
+ * input parameters\r
+ * @param   which   - INQ or OUTQ to search\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return      Pointer to oldest available frame in the queue\r
+ */\r
+frameInfo_t *nwk_QfindSlot(uint8_t which)\r
+{\r
+  frameInfo_t *pFI, *oldest= 0, *newFI = 0;\r
+  uint8_t        i, num, newOrder = 0, orderTest;\r
+\r
+  if (INQ == which)\r
+  {\r
+    pFI  = sInFrameQ;\r
+    num  = SIZE_INFRAME_Q;\r
+  }\r
+  else\r
+  {\r
+    pFI  = sOutFrameQ;\r
+    num  = SIZE_OUTFRAME_Q;\r
+  }\r
+\r
+  orderTest = num + 1;\r
+\r
+  for (i=0; i<num; ++i, ++pFI)\r
+  {\r
+    /* if frame is available it's a candidate. */\r
+    if (pFI->fi_usage != FI_AVAILABLE)\r
+    {\r
+      if (INQ == which)  /* TODO: do cast-out for Tx as well */\r
+      {\r
+\r
+        /* need to know the number of occupied slots so we know the age value\r
+         * for the unoccupied slot (if there is one).\r
+         */\r
+        newOrder++;\r
+\r
+        /* make sure nwk_retrieveFrame() is not processing this frame */\r
+        if (FI_INUSE_TRANSITION == pFI->fi_usage)\r
+        {\r
+          continue;\r
+        }\r
+        /* is this frame older than any we've seen? */\r
+        if (orderTest > pFI->orderStamp)\r
+        {\r
+          /* yes. */\r
+          oldest    = pFI;\r
+          orderTest = pFI->orderStamp;\r
+        }\r
+      }\r
+    }\r
+    else\r
+    {\r
+      if (OUTQ == which)  /* TODO: do cast-out for Tx as well */\r
+      {\r
+        return pFI;\r
+      }\r
+      newFI = pFI;\r
+    }\r
+  }\r
+\r
+  /* did we find anything? */\r
+  if (!newFI)\r
+  {\r
+    /* queue was full. cast-out happens here...unless... */\r
+    if (!oldest)\r
+    {\r
+      /* This can happen if the queue is only of size 1 or 2 and all\r
+       * the frames are in transition when the Rx interrupt occurs.\r
+       */\r
+      return (frameInfo_t *)0;\r
+    }\r
+    newFI = oldest;\r
+    nwk_QadjustOrder(which, newFI->orderStamp);\r
+    newFI->orderStamp = i;\r
+  }\r
+  else\r
+  {\r
+    /* mark the available slot. */\r
+    newFI->orderStamp = ++newOrder;\r
+  }\r
+\r
+  return newFI;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_QadjustOrder\r
+ *\r
+ * @brief       Adjusts the age of everyone in the queue newer than the frame\r
+ *              being removed.\r
+ *\r
+ * input parameters\r
+ * @param   which   - INQ or OUTQ to adjust\r
+ * @param   stamp   - value of frame being removed\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return      void\r
+ */\r
+void nwk_QadjustOrder(uint8_t which, uint8_t stamp)\r
+{\r
+  frameInfo_t *pFI;\r
+  uint8_t      i, num;\r
+  bspIState_t  intState;\r
+\r
+  if (INQ == which)\r
+  {\r
+    pFI  = sInFrameQ;\r
+    num  = SIZE_INFRAME_Q;\r
+  }\r
+  else\r
+  {\r
+/*    pFI  = sOutFrameQ; */\r
+/*    num  = SIZE_OUTFRAME_Q; */\r
+    return;\r
+  }\r
+\r
+  BSP_ENTER_CRITICAL_SECTION(intState);\r
+\r
+  for (i=0; i<num; ++i, ++pFI)\r
+  {\r
+    if ((pFI->fi_usage != FI_AVAILABLE) && (pFI->orderStamp > stamp))\r
+    {\r
+      pFI->orderStamp--;\r
+    }\r
+  }\r
+\r
+  BSP_EXIT_CRITICAL_SECTION(intState);\r
+\r
+  return;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_QfindOldest\r
+ *\r
+ * @brief       Look through frame queue and find the oldest available frame\r
+ *              in the context in question. Supports connection-based (user),\r
+ *              non-connection based (NWK applications), and the special case\r
+ *              of store-and-forward.\r
+ *\r
+ * input parameters\r
+ * @param   which      - INQ or OUTQ to adjust\r
+ * @param   rcvContext - context information for finding the oldest\r
+ * @param   usage      - normal usage or store-and-forward usage\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return      Pointer to frame that is the oldsest on the requested port, or\r
+ *              0 if there are none.\r
+ */\r
+frameInfo_t *nwk_QfindOldest(uint8_t which, rcvContext_t *rcv, uint8_t fi_usage)\r
+{\r
+  uint8_t      i, oldest, num, port;\r
+  uint8_t      uType, addr12Compare;\r
+  bspIState_t  intState;\r
+  frameInfo_t *fPtr = 0, *wPtr;\r
+  connInfo_t  *pCInfo = 0;\r
+  uint8_t     *pAddr1, *pAddr2, *pAddr3 = 0;\r
+\r
+  if (INQ == which)\r
+  {\r
+    wPtr   = sInFrameQ;\r
+    num    = SIZE_INFRAME_Q;\r
+    oldest = SIZE_INFRAME_Q+1;\r
+  }\r
+  else\r
+  {\r
+/*    pFI  = sOutFrameQ; */\r
+/*    num  = SIZE_OUTFRAME_Q; */\r
+    return 0;\r
+  }\r
+\r
+  if (RCV_APP_LID == rcv->type)\r
+  {\r
+    pCInfo = nwk_getConnInfo(rcv->t.lid);\r
+    if (!pCInfo)\r
+    {\r
+      return (frameInfo_t *)0;\r
+    }\r
+    port   = pCInfo->portRx;\r
+    pAddr2 = pCInfo->peerAddr;\r
+  }\r
+  else if (RCV_NWK_PORT == rcv->type)\r
+  {\r
+    port = rcv->t.port;\r
+  }\r
+#ifdef ACCESS_POINT\r
+  else if (RCV_RAW_POLL_FRAME == rcv->type)\r
+  {\r
+    port   = *(MRFI_P_PAYLOAD(rcv->t.pkt)+F_APP_PAYLOAD_OS+M_POLL_PORT_OS);\r
+    pAddr2 = MRFI_P_SRC_ADDR(rcv->t.pkt);\r
+    pAddr3 = MRFI_P_PAYLOAD(rcv->t.pkt)+F_APP_PAYLOAD_OS+M_POLL_ADDR_OS;\r
+  }\r
+#endif\r
+  else\r
+  {\r
+    return (frameInfo_t *)0;\r
+  }\r
+\r
+  uType = (USAGE_NORMAL == fi_usage) ? FI_INUSE_UNTIL_DEL : FI_INUSE_UNTIL_FWD;\r
+\r
+  for (i=0; i<num; ++i, ++wPtr)\r
+  {\r
+\r
+    BSP_ENTER_CRITICAL_SECTION(intState);   /* protect the frame states */\r
+\r
+    /* only check entries in use and waiting for this port */\r
+    if (uType == wPtr->fi_usage)\r
+    {\r
+      wPtr->fi_usage = FI_INUSE_TRANSITION;\r
+\r
+      BSP_EXIT_CRITICAL_SECTION(intState);  /* release hold */\r
+      /* message sent to this device? */\r
+      if (GET_FROM_FRAME(MRFI_P_PAYLOAD(&wPtr->mrfiPkt), F_PORT_OS) == port)\r
+      {\r
+        /* Port matches. If the port of interest is a NWK applicaiton we're a\r
+         * match...the NWK applications are not connection-based. If it is a\r
+         * NWK application we need to check the source address for disambiguation.\r
+         * Also need to check source address if it's a raw frame lookup (S&F frame)\r
+         */\r
+        if (RCV_APP_LID == rcv->type)\r
+        {\r
+          if (SMPL_PORT_USER_BCAST == port)\r
+          {\r
+            /* guarantee a match... */\r
+            pAddr1 = pCInfo->peerAddr;\r
+          }\r
+          else\r
+          {\r
+            pAddr1 = MRFI_P_SRC_ADDR(&wPtr->mrfiPkt);\r
+          }\r
+        }\r
+#ifdef ACCESS_POINT\r
+        else if (RCV_RAW_POLL_FRAME == rcv->type)\r
+        {\r
+          pAddr1 = MRFI_P_DST_ADDR(&wPtr->mrfiPkt);\r
+        }\r
+#endif\r
+\r
+        addr12Compare = memcmp(pAddr1, pAddr2, NET_ADDR_SIZE);\r
+        if (  (RCV_NWK_PORT == rcv->type) ||\r
+              (!pAddr3 && !addr12Compare) ||\r
+              (pAddr3 && !memcmp(pAddr3, MRFI_P_SRC_ADDR(&wPtr->mrfiPkt), NET_ADDR_SIZE))\r
+           )\r
+        {\r
+          if (wPtr->orderStamp < oldest)\r
+          {\r
+            if (fPtr)\r
+            {\r
+              /* restore previous oldest one */\r
+              fPtr->fi_usage = uType;\r
+            }\r
+            oldest = wPtr->orderStamp;\r
+            fPtr   = wPtr;\r
+            continue;\r
+          }\r
+          else\r
+          {\r
+            /* not oldest. restore state */\r
+            wPtr->fi_usage = uType;\r
+          }\r
+        }\r
+        else\r
+        {\r
+          /* not a match. restore state */\r
+          wPtr->fi_usage = uType;\r
+        }\r
+      }\r
+      else\r
+      {\r
+        /* wrong port. restore state */\r
+        wPtr->fi_usage = uType;\r
+      }\r
+    }\r
+    else\r
+    {\r
+      BSP_EXIT_CRITICAL_SECTION(intState);\r
+    }\r
+  }\r
+\r
+  return fPtr;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_getQ\r
+ *\r
+ * @brief       Get location of teh specified frame queue.\r
+ *\r
+ * input parameters\r
+ * @param   which   - INQ or OUTQ to get\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return      Pointer to frame queue\r
+ */\r
+frameInfo_t *nwk_getQ(uint8_t which)\r
+{\r
+  return (INQ == which) ? sInFrameQ : sOutFrameQ;\r
+}\r
+\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/Components/nwk/nwk_QMgmt.h b/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/Components/nwk/nwk_QMgmt.h
new file mode 100755 (executable)
index 0000000..aa5535b
--- /dev/null
@@ -0,0 +1,53 @@
+/**************************************************************************************************\r
+  Filename:       nwk_QMgmt.h\r
+  Revised:        $Date: 2009-01-17 15:14:16 -0800 (Sat, 17 Jan 2009) $\r
+  Revision:       $Revision: 18788 $\r
+  Author:         $Author: rlord $\r
+\r
+  Description:    This header file supports the SimpliciTI input and output frame queues.\r
+\r
+  Copyright 2007-2009 Texas Instruments Incorporated. All rights reserved.\r
+\r
+  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+  the terms of a software license agreement between the user who downloaded the software,\r
+  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+  License. The License limits your use, and you acknowledge, that the Software may not be\r
+  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+  perform, display or sell this Software and/or its documentation for any purpose.\r
+\r
+  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+\r
+  Should you have any questions regarding your right to use this Software,\r
+  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+#ifndef NWK_QMGMT_H\r
+#define NWK_QMGMT_H\r
+\r
+\r
+#define  INQ   1\r
+#define  OUTQ  2\r
+\r
+#define  USAGE_NORMAL  1\r
+#define  USAGE_FWD     2\r
+\r
+/* prototypes */\r
+void              nwk_QInit(void);\r
+frameInfo_t *nwk_QfindSlot(uint8_t);\r
+void              nwk_QadjustOrder(uint8_t, uint8_t);\r
+frameInfo_t *nwk_QfindOldest(uint8_t, rcvContext_t *, uint8_t);\r
+frameInfo_t *nwk_getQ(uint8_t);\r
+\r
+#endif  /* NWK_QMGMT_H */\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/Components/nwk/nwk_api.c b/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/Components/nwk/nwk_api.c
new file mode 100755 (executable)
index 0000000..da5c0b7
--- /dev/null
@@ -0,0 +1,858 @@
+/**************************************************************************************************\r
+  Filename:       nwk_api.c\r
+  Revised:        $Date: 2009-01-28 18:27:38 -0800 (Wed, 28 Jan 2009) $\r
+  Revision:       $Revision: 18875 $\r
+  Author:         $Author: lfriedman $\r
+\r
+  Description:    This file supports the SimpliciTI appliction layer API.\r
+\r
+  Copyright 2007-2009 Texas Instruments Incorporated. All rights reserved.\r
+\r
+  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+  the terms of a software license agreement between the user who downloaded the software,\r
+  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+  License. The License limits your use, and you acknowledge, that the Software may not be\r
+  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+  perform, display or sell this Software and/or its documentation for any purpose.\r
+\r
+  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+\r
+  Should you have any questions regarding your right to use this Software,\r
+  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+/******************************************************************************\r
+ * INCLUDES\r
+ */\r
+\r
+#include <string.h>\r
+#include "bsp.h"\r
+#include "mrfi.h"\r
+#include "nwk_types.h"\r
+#include "nwk_api.h"\r
+#include "nwk_frame.h"\r
+#include "nwk.h"\r
+#include "nwk_app.h"\r
+#include "mrfi.h"\r
+#include "nwk_globals.h"\r
+#include "nwk_freq.h"\r
+\r
+/******************************************************************************\r
+ * MACROS\r
+ */\r
+\r
+/******************************************************************************\r
+ * CONSTANTS AND DEFINES\r
+ */\r
+\r
+/* These defines are in support an application listening for a link frame to\r
+ * terminate after some amount of time. The intention is that this guard be\r
+ * the exception. The intention of the SimpliciTI design is that the\r
+ * temporal contiguity between the listen and the reception of the link frame\r
+ * from the peer be very tight. The SMPL_LinkListen() should be termninated\r
+ * by the reception of the link frame. But in case it does not receive the frame\r
+ * the support below allows intervention by the application.\r
+ */\r
+\r
+/* The intention is for user to modify just the following single value */\r
+#define LINKLISTEN_MILLISECONDS_2_WAIT    (5000)\r
+\r
+#define LINKLISTEN_POLL_PERIOD_MS         (10)\r
+#define LINKLISTEN_POLL_COUNT             ( (LINKLISTEN_MILLISECONDS_2_WAIT) / (LINKLISTEN_POLL_PERIOD_MS) )\r
+\r
+/******************************************************************************\r
+ * TYPEDEFS\r
+ */\r
+\r
+/******************************************************************************\r
+ * LOCAL VARIABLES\r
+ */\r
+// [BM] Workaround to enable multiple stack restarts \r
+// static uint8_t sInit_done = 0;\r
+uint8_t sInit_done = 0;\r
+\r
+/******************************************************************************\r
+ * LOCAL FUNCTIONS\r
+ */\r
+static uint8_t ioctlPreInitAccessIsOK(ioctlObject_t);\r
+\r
+/******************************************************************************\r
+ * GLOBAL VARIABLES\r
+ */\r
+\r
+/******************************************************************************\r
+ * GLOBAL FUNCTIONS\r
+ */\r
+\r
+/***********************************************************************************\r
+ * @fn          SMPL_Init\r
+ *\r
+ * @brief       Initialize the SimpliciTI stack.\r
+ *\r
+ * input parameters\r
+ * @param   f  - Pointer to call back function. Function called by NWK when\r
+ *               user application frame received. The callback is done in the\r
+ *               ISR thread. Argument is Link ID associated with frame. Function\r
+ *               returns 0 if frame is to be kept by NWK, otherwise 1. Frame\r
+ *               should be kept if application will do a SMPL_Receive() in the\r
+ *               user thread (recommended). Pointer may be NULL.\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   Status of operation:\r
+ *             SMPL_SUCCESS\r
+ *             SMPL_NO_JOIN     No Join reply. AP possibly not yet up.\r
+ *             SMPL_NO_CHANNEL  Only if Frequency Agility enabled. Channel scan\r
+ *                              failed. AP possibly not yet up.\r
+ */\r
+smplStatus_t SMPL_Init(uint8_t (*f)(linkID_t))\r
+{\r
+  smplStatus_t rc;\r
+\r
+  if (!sInit_done)\r
+  {\r
+    /* set up radio. */\r
+    MRFI_Init();\r
+\r
+    /* initialize network */\r
+    if ((rc=nwk_nwkInit(f)) != SMPL_SUCCESS)\r
+    {\r
+      return rc;\r
+    }\r
+\r
+    MRFI_WakeUp();\r
+#if defined( FREQUENCY_AGILITY )\r
+    {\r
+      freqEntry_t chan;\r
+\r
+      chan.logicalChan = 0;\r
+      /* ok to set default channel explicitly now that MRFI initialized. */\r
+      nwk_setChannel(&chan);\r
+    }\r
+#endif\r
+    /* don't turn Rx on if we're an end device that isn't always on. */\r
+#if !defined( END_DEVICE )\r
+    MRFI_RxOn();\r
+#endif\r
+\r
+#if defined( END_DEVICE )\r
+    /* All except End Devices are in promiscuous mode */\r
+    MRFI_SetRxAddrFilter((uint8_t *)nwk_getMyAddress());\r
+    MRFI_EnableRxAddrFilter();\r
+#endif\r
+  }\r
+  sInit_done = 1;\r
+\r
+  /* Join. if no AP or Join fails that status is returned. */\r
+  rc = nwk_join();\r
+\r
+  return rc;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          SMPL_LinkListen\r
+ *\r
+ * @brief       Listen for a link frame from a 'client' device.\r
+ *\r
+ * input parameters\r
+ *\r
+ * output parameters\r
+ * @param   linkID     - pointer to Link ID to be used by application to\r
+ *                       read and write to the linked peer.\r
+ *\r
+ * @return   status of operation.\r
+ *             SMPL_SUCCESS\r
+ *             SMPL_TIMEOUT  No link frame received during listen interval.\r
+*                            Interval set in #defines above. linkID not valid.\r
+ *\r
+ */\r
+\r
+smplStatus_t SMPL_LinkListen(linkID_t *linkID)\r
+{\r
+  uint8_t  radioState = MRFI_GetRadioState();\r
+  uint16_t i;\r
+  linkID_t locLinkID;\r
+\r
+  /* Set the context. We want to reject any link frames received if\r
+   * we're not listening. For example if we're an AP we are in\r
+   * promiscuous mode and we'll see any broadcast link frames.\r
+   */\r
+  nwk_setListenContext(LINK_LISTEN_ON);\r
+\r
+  NWK_CHECK_FOR_SETRX(radioState);\r
+\r
+  for (i=0; i<LINKLISTEN_POLL_COUNT; ++i)\r
+  {\r
+    /* check the semaphore. local port is assigned when the reply is sent. */\r
+    if ((locLinkID=nwk_getLocalLinkID()))\r
+    {\r
+      break;\r
+    }\r
+    NWK_DELAY(LINKLISTEN_POLL_PERIOD_MS);\r
+  }\r
+\r
+  NWK_CHECK_FOR_RESTORE_STATE(radioState);\r
+\r
+  /* If the listen is terminated without hearing a message and setting a\r
+   * link ID the listen context must be explicitly turned off.\r
+   */\r
+  if (!(locLinkID))\r
+  {\r
+    nwk_setListenContext(LINK_LISTEN_OFF);\r
+    return SMPL_TIMEOUT;\r
+  }\r
+\r
+  *linkID = locLinkID;\r
+\r
+  return SMPL_SUCCESS;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          SMPL_Send\r
+ *\r
+ * @brief       Send a message to a peer application. Old API kept for\r
+ *              backward compatibility. Calls the new SMPL_SendOpt() with\r
+ *              no options.\r
+ *\r
+ * input parameters\r
+ * @param   lid     - Link ID (port) from application\r
+ * @param   msg     - pointer to message from app to be sent\r
+ * @param   len     - length of enclosed message\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   Status of operation. On a filaure the frame buffer is discarded\r
+ *           and the Send call must be redone by the app.\r
+ *             SMPL_SUCCESS\r
+ *             SMPL_BAD_PARAM    No valid Connection Table entry for Link ID\r
+ *                               Data in Connection Table entry bad\r
+ *                               No message or message too long\r
+ *             SMPL_NOMEM        No room in output frame queue\r
+ *             SMPL_TX_CCA_FAIL  CCA failure.\r
+ */\r
+smplStatus_t SMPL_Send(linkID_t lid, uint8_t *msg, uint8_t len)\r
+{\r
+  return SMPL_SendOpt(lid, msg, len, SMPL_TXOPTION_NONE);\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          SMPL_SendOpt\r
+ *\r
+ * @brief       Send a message to a peer application.\r
+ *\r
+ * input parameters\r
+ * @param   lid     - Link ID (port) from application\r
+ * @param   msg     - pointer to message from app to be sent\r
+ * @param   len     - length of enclosed message\r
+ * @param   options - Transmit options (bit map)\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   Status of operation. On a filaure the frame buffer is discarded\r
+ *           and the Send call must be redone by the app.\r
+ *             SMPL_SUCCESS\r
+ *             SMPL_BAD_PARAM    No valid Connection Table entry for Link ID\r
+ *                               Data in Connection Table entry bad\r
+ *                               No message or message too long\r
+ *             SMPL_NOMEM        No room in output frame queue\r
+ *             SMPL_TX_CCA_FAIL  CCA failure.\r
+ *             SMPL_NO_ACK       If application auto acknowledgement enabled\r
+ *                               and no acknowledgement is received\r
+ */\r
+smplStatus_t SMPL_SendOpt(linkID_t lid, uint8_t *msg, uint8_t len, txOpt_t options)\r
+{\r
+  frameInfo_t  *pFrameInfo;\r
+  connInfo_t   *pCInfo     = nwk_getConnInfo(lid);\r
+  smplStatus_t  rc         = SMPL_BAD_PARAM;\r
+  uint8_t       radioState = MRFI_GetRadioState();\r
+  uint8_t       ackreq     = 0;\r
+#if defined(ACCESS_POINT)\r
+  uint8_t  loc;\r
+#endif\r
+\r
+  /* we have the connection info for this Link ID. make sure it is valid. */\r
+   if (!pCInfo || ((rc=nwk_checkConnInfo(pCInfo, CHK_TX)) != SMPL_SUCCESS))\r
+  {\r
+    return rc;\r
+  }\r
+\r
+  /* parameter sanity check... */\r
+  if (!msg || (len > MAX_APP_PAYLOAD))\r
+  {\r
+    return rc;\r
+  }\r
+\r
+  /* Build an outgoing message frame destined for the port from the\r
+   * connection info using the destination address also from the\r
+   * connection info.\r
+   */\r
+  if (SMPL_TXOPTION_NONE == options)\r
+  {\r
+    pFrameInfo = nwk_buildFrame(pCInfo->portTx, msg, len, pCInfo->hops2target);\r
+  }\r
+#if defined(APP_AUTO_ACK)\r
+  else if (options & SMPL_TXOPTION_ACKREQ)\r
+  {\r
+    if (SMPL_LINKID_USER_UUD != lid)\r
+    {\r
+      pFrameInfo = nwk_buildAckReqFrame(pCInfo->portTx, msg, len, pCInfo->hops2target, &pCInfo->ackTID);\r
+      ackreq     = 1;\r
+    }\r
+    else\r
+    {\r
+      /* can't request an ack on the UUD link ID */\r
+      return SMPL_BAD_PARAM;\r
+    }\r
+  }\r
+#endif  /* APP_AUTO_ACK */\r
+  else\r
+  {\r
+    return SMPL_BAD_PARAM;\r
+  }\r
+\r
+  if (!pFrameInfo)\r
+  {\r
+    return SMPL_NOMEM;\r
+  }\r
+  memcpy(MRFI_P_DST_ADDR(&pFrameInfo->mrfiPkt), pCInfo->peerAddr, NET_ADDR_SIZE);\r
+\r
+#if defined(SMPL_SECURE)\r
+  {\r
+    uint32_t *pUL = 0;\r
+\r
+    if (pCInfo->thisLinkID != SMPL_LINKID_USER_UUD)\r
+    {\r
+      pUL = &pCInfo->connTxCTR;\r
+    }\r
+    nwk_setSecureFrame(&pFrameInfo->mrfiPkt, len, pUL);\r
+  }\r
+#endif  /* SMPL_SECURE */\r
+\r
+#if defined(ACCESS_POINT)\r
+  /* If we are an AP trying to send to a polling device, don't do it.\r
+   * See if the target is a store-and-forward client.\r
+   */\r
+  if (nwk_isSandFClient(MRFI_P_DST_ADDR(&pFrameInfo->mrfiPkt), &loc))\r
+  {\r
+     pFrameInfo->fi_usage = FI_INUSE_UNTIL_FWD;\r
+     return SMPL_SUCCESS;\r
+  }\r
+  else\r
+#endif  /* ACCESS_POINT */\r
+  {\r
+    rc = nwk_sendFrame(pFrameInfo, MRFI_TX_TYPE_CCA);\r
+  }\r
+\r
+#if !defined(APP_AUTO_ACK)\r
+  /* save a little code space with this #if */\r
+  (void) ackreq;    /* keep compiler happy */\r
+  return rc;\r
+#else\r
+  /* we're done if the send failed or no ack requested. */\r
+  if (SMPL_SUCCESS != rc || !ackreq)\r
+  {\r
+    return rc;\r
+  }\r
+\r
+  NWK_CHECK_FOR_SETRX(radioState);\r
+  NWK_REPLY_DELAY();\r
+  NWK_CHECK_FOR_RESTORE_STATE(radioState);\r
+\r
+  {\r
+    bspIState_t intState;\r
+\r
+    /* If the saved TID hasn't been reset then we never got the ack. */\r
+    BSP_ENTER_CRITICAL_SECTION(intState);\r
+    if (pCInfo->ackTID)\r
+    {\r
+      pCInfo->ackTID = 0;\r
+      rc = SMPL_NO_ACK;\r
+    }\r
+    BSP_EXIT_CRITICAL_SECTION(intState);\r
+  }\r
+\r
+  return rc;\r
+#endif  /* APP_AUTO_ACK */\r
+}\r
+\r
+/**************************************************************************************\r
+ * @fn          SMPL_Receive\r
+ *\r
+ * @brief       Receive a message from a peer application.\r
+ *\r
+ * input parameters\r
+ * @param   lid     - Link ID (port) from application\r
+ *\r
+ *\r
+ * output parameters\r
+ * @param   msg     - pointer to where received message should be copied.\r
+ *                    buffer should be of size == MAX_APP_PAYLOAD\r
+ * @param   len     - pointer to receive length of received message\r
+ *\r
+ * @return    Status of operation.\r
+ *            Caller should not use the value returned in 'len' to decide\r
+ *            whether there is a frame or not. It could be useful to the\r
+ *            Caller to distinguish between no frame and a frame with no data.\r
+ *            For example, in the polling case a frame with no application payload\r
+ *            is the way the AP conveys that there are no frames waiting.\r
+ *\r
+ *              SMPL_SUCCESS\r
+ *\r
+ *              SMPL_BAD_PARAM  No valid Connection Table entry for Link ID\r
+ *                              Data in Connection Table entry bad\r
+ *              SMPL_NO_FRAME   No frame received.\r
+ *              SMPL_NO_PAYLOAD Frame received with no payload (not necessarily\r
+ *                              an error and could be deduced by application\r
+ *                              because the returned length will be 0)\r
+ *\r
+ *            Polling device only:\r
+ *\r
+ *              SMPL_TIMEOUT        No response from Access Point\r
+ *              SMPL_NO_AP_ADDRESS  Access Point address unknown\r
+ *              SMPL_TX_CCA_FAIL    Could not send poll frame\r
+ *              SMPL_NOMEM          No memory in output frame queue\r
+ *              SMPL_NO_CHANNEL     Frequency Agility enabled and could not find channel\r
+ */\r
+smplStatus_t SMPL_Receive(linkID_t lid, uint8_t *msg, uint8_t *len)\r
+{\r
+  connInfo_t  *pCInfo = nwk_getConnInfo(lid);\r
+  smplStatus_t rc = SMPL_BAD_PARAM;\r
+  rcvContext_t rcv;\r
+\r
+  if (!pCInfo || ((rc=nwk_checkConnInfo(pCInfo, CHK_RX)) != SMPL_SUCCESS))\r
+  {\r
+    return rc;\r
+  }\r
+\r
+  rcv.type  = RCV_APP_LID;\r
+  rcv.t.lid = lid;\r
+\r
+#if defined(RX_POLLS)\r
+  {\r
+    uint8_t numChans  = 1;\r
+#if defined(FREQUENCY_AGILITY)\r
+    freqEntry_t chans[NWK_FREQ_TBL_SIZE];\r
+    uint8_t     scannedB4 = 0;\r
+#endif\r
+\r
+    do\r
+    {\r
+      uint8_t radioState = MRFI_GetRadioState();\r
+\r
+      /* I'm polling. Do the poll to stimulate the sending of a frame. If the\r
+       * frame has application length of 0 it means there were no frames.  If\r
+       * no reply is received infer that the channel is changed. We then need\r
+       * to scan and then retry the poll on each channel returned.\r
+       */\r
+      if (SMPL_SUCCESS != (rc=nwk_poll(pCInfo->portRx, pCInfo->peerAddr)))\r
+      {\r
+        /* for some reason couldn't send the poll out. */\r
+        return rc;\r
+      }\r
+\r
+      /* do this before code block below which may reset it. */\r
+      numChans--;\r
+\r
+      /* Wait until there's a frame. if the len is 0 then return SMPL_NO_FRAME\r
+       * to the caller. In the poll case the AP always sends something.\r
+       */\r
+      NWK_CHECK_FOR_SETRX(radioState);\r
+      NWK_REPLY_DELAY();\r
+      NWK_CHECK_FOR_RESTORE_STATE(radioState);\r
+\r
+      /* TODO: deal with pending */\r
+      rc = nwk_retrieveFrame(&rcv, msg, len, 0, 0);\r
+\r
+#if defined(FREQUENCY_AGILITY)\r
+      if (SMPL_SUCCESS == rc)\r
+      {\r
+        /* we received something... */\r
+        return (*len) ? SMPL_SUCCESS : SMPL_NO_PAYLOAD;\r
+      }\r
+\r
+      /* No reply. scan for other channel(s) if we haven't already. Then set\r
+       * one and try again.\r
+       */\r
+      if (!scannedB4)\r
+      {\r
+        numChans  = nwk_scanForChannels(chans);\r
+        scannedB4 = 1;\r
+      }\r
+      if (numChans)\r
+      {\r
+        nwk_setChannel(&chans[numChans-1]);\r
+      }\r
+#else /*  FREQUENCY_AGILITY */\r
+      return (*len) ? rc : ((SMPL_SUCCESS == rc) ? SMPL_NO_PAYLOAD : SMPL_TIMEOUT);\r
+#endif\r
+    } while (numChans);\r
+  }\r
+\r
+#if defined(FREQUENCY_AGILITY)\r
+  return SMPL_NO_CHANNEL;\r
+#endif\r
+\r
+#else  /* RX_POLLS */\r
+  return nwk_retrieveFrame(&rcv, msg, len, 0, 0);\r
+#endif  /* RX_POLLS */\r
+}\r
+\r
+\r
+/******************************************************************************\r
+ * @fn          SMPL_Link\r
+ *\r
+ * @brief       Link to a peer.\r
+ *\r
+ * input parameters\r
+ *\r
+ * output parameters\r
+ * @param   lid     - pointer to where we should write the link ID to which the\r
+ *                    application will read and write.\r
+ *\r
+ * @return   Status of operation.\r
+ *             SMPL_SUCCESS\r
+ *             SMPL_NOMEM         No room to allocate local Rx port, no more\r
+ *                                room in Connection Table, or no room in\r
+ *                                output frame queue.\r
+ *             SMPL_NO_LINK       No reply frame during wait window.\r
+ *             SMPL_TX_CCA_FAIL   Could not send Link frame.\r
+ */\r
+smplStatus_t SMPL_Link(linkID_t *lid)\r
+{\r
+  return nwk_link(lid);\r
+}\r
+\r
+#if defined(EXTENDED_API)\r
+/**************************************************************************************\r
+ * @fn          SMPL_Unlink\r
+ *\r
+ * @brief       Tear down connection to a peer.\r
+ *\r
+ * input parameters\r
+ * @param   lid     - Link ID whose connection is to be terminated.\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   Status of operation. The Connection Table entry for the Link ID\r
+ *           is always freed successfuly. The returned status value is the\r
+ *           status of the _peer's_ connection tear-down as a result of the\r
+ *           message sent here.\r
+ *           SMPL_SUCCESS         Local and remote connection destroyed.\r
+ *           SMPL_BAD_PARAM       No local connection table entry for this Link ID\r
+ *           SMPL_TIMEOUT         No reply from peer.\r
+ *           SMPL_NO_PEER_UNLINK  Peer did not have a Connection Table entry for me.\r
+ */\r
+smplStatus_t SMPL_Unlink(linkID_t lid)\r
+{\r
+  return nwk_unlink(lid);\r
+}\r
+\r
+/**************************************************************************************\r
+ * @fn          SMPL_Ping\r
+ *\r
+ * @brief       Ping a peer. Synchronous call. Although a link ID is used it is the\r
+ *              NWK Ping application that is pinged, not the peer of this Link ID. The\r
+ *              peer is not expected to be the responder to the frame sent from here.\r
+ *              This API is a proxy for a real ping since the application doesn't\r
+ *              have direct access to SimpliciTI device addresses. Kind of hokey but a\r
+ *              useful keep-alive mechanism without having to support it with\r
+ *              user application service.\r
+ *\r
+ * input parameters\r
+ * @param   lid  - The link ID whose peer device address is used to direct the NWK Ping\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   Status of operation.\r
+ */\r
+smplStatus_t SMPL_Ping(linkID_t lid)\r
+{\r
+  return nwk_ping(lid);\r
+}\r
+\r
+/**************************************************************************************\r
+ * @fn          SMPL_Commission\r
+ *\r
+ * @brief       Commission a connection.\r
+ *\r
+ * input parameters\r
+ * @param   peerAddr  - Pointer to address of the peer for this connection\r
+ * @param    locPort  - Port on which to listen for messages from the peer\r
+ * @param    rmtPort  - Port on which to send messages to the peer.\r
+ * @param        lid  - Pointer to Link ID object. If content of location is\r
+ *                      non-zero on input the value is placed in the Connection\r
+ *                      object.\r
+ *\r
+ * output parameters\r
+ * @param        lid  - Pointer to Link ID object. If content of location is zero\r
+ *                      on input the value in the Connection object is stored there.\r
+ *\r
+ * @return   SMPL_SUCCESS\r
+ *           SMPL_NOMEM     - No room left in Connection table.\r
+ *           SMPL_BAD_PARAM - A pointer to a Link object was not supplied.\r
+ */\r
+smplStatus_t SMPL_Commission(addr_t *peerAddr, uint8_t locPort, uint8_t rmtPort, linkID_t *lid)\r
+{\r
+  connInfo_t   *pCInfo = nwk_getNextConnection();\r
+  smplStatus_t  rc     = SMPL_BAD_PARAM;\r
+\r
+  do {\r
+    if (pCInfo)\r
+    {\r
+      /* sanity checks... */\r
+\r
+      /* Check port info. */\r
+      if ((locPort > SMPL_PORT_STATIC_MAX) || (locPort < (SMPL_PORT_STATIC_MAX - PORT_USER_STATIC_NUM + 1)))\r
+      {\r
+        continue;\r
+      }\r
+\r
+      if ((rmtPort > SMPL_PORT_STATIC_MAX) || (rmtPort < (SMPL_PORT_STATIC_MAX - PORT_USER_STATIC_NUM + 1)))\r
+      {\r
+        continue;\r
+      }\r
+\r
+      /* Must supply a pointer to the Link ID object */\r
+      if (!lid)\r
+      {\r
+        /* No Link ID pointer supplied */\r
+        continue;\r
+      }\r
+\r
+      /* we're sane */\r
+\r
+      /* Use the value generated at connection object assign time. */\r
+      *lid = pCInfo->thisLinkID;\r
+\r
+      /* store peer's address */\r
+      memcpy(pCInfo->peerAddr, peerAddr, NET_ADDR_SIZE);\r
+\r
+      /* store port info */\r
+      pCInfo->portRx = locPort;\r
+      pCInfo->portTx = rmtPort;\r
+\r
+      pCInfo->hops2target = MAX_HOPS;\r
+\r
+      rc = SMPL_SUCCESS;\r
+    }\r
+    else\r
+    {\r
+      /* No room in Connection table */\r
+      rc = SMPL_NOMEM;\r
+    }\r
+  } while (0);\r
+\r
+  if ((SMPL_SUCCESS != rc) && pCInfo)\r
+  {\r
+    nwk_freeConnection(pCInfo);\r
+  }\r
+\r
+  return rc;\r
+}\r
+#endif   /* EXTENDED_API */\r
+\r
+/******************************************************************************\r
+ * @fn          SMPL_Ioctl\r
+ *\r
+ * @brief       This routine supplies the SimpliciTI IOCTL support.\r
+ *\r
+ * input parameters\r
+ * @param   object   - The IOCTL target object\r
+ * @param   action   - The IOCTL target action on the object\r
+ * @param   val      - pointer to value. exact forn depends on object type.\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   Status of action. Value depends on object, action, and result.\r
+ *\r
+ *           SMPL_BAD_PARAM is returned if this API is called before\r
+ *                          initialization and the object is not one of\r
+ *                          the valid exceptions.\r
+ */\r
+smplStatus_t SMPL_Ioctl(ioctlObject_t object, ioctlAction_t action, void *val)\r
+{\r
+  smplStatus_t rc;\r
+\r
+  /* if init hasn't occurred see if access is still valid */\r
+  if (!sInit_done && !ioctlPreInitAccessIsOK(object))\r
+  {\r
+    return SMPL_BAD_PARAM;\r
+  }\r
+\r
+  switch (object)\r
+  {\r
+#if defined(EXTENDED_API)\r
+    case IOCTL_OBJ_TOKEN:\r
+      {\r
+        ioctlToken_t *t = (ioctlToken_t *)val;\r
+\r
+        rc = SMPL_SUCCESS;\r
+        if (TT_LINK == t->tokenType)\r
+        {\r
+          if (IOCTL_ACT_SET == action)\r
+          {\r
+            nwk_setLinkToken(t->token.linkToken);\r
+          }\r
+          else if (IOCTL_ACT_GET == action)\r
+          {\r
+            nwk_getLinkToken(&t->token.linkToken);\r
+          }\r
+          else\r
+          {\r
+            rc = SMPL_BAD_PARAM;\r
+          }\r
+        }\r
+        else if (TT_JOIN == t->tokenType)\r
+        {\r
+          if (IOCTL_ACT_SET == action)\r
+          {\r
+            nwk_setJoinToken(t->token.joinToken);\r
+          }\r
+          else if (IOCTL_ACT_GET == action)\r
+          {\r
+            nwk_getJoinToken(&t->token.joinToken);\r
+          }\r
+          else\r
+          {\r
+            rc = SMPL_BAD_PARAM;\r
+          }\r
+        }\r
+        else\r
+        {\r
+          rc = SMPL_BAD_PARAM;\r
+        }\r
+      }\r
+      break;\r
+\r
+    case IOCTL_OBJ_NVOBJ:\r
+      rc = nwk_NVObj(action, (ioctlNVObj_t *)val);\r
+      break;\r
+#endif  /* EXTENDED_API */\r
+\r
+    case IOCTL_OBJ_CONNOBJ:\r
+      rc = nwk_connectionControl(action, val);\r
+      break;\r
+\r
+    case IOCTL_OBJ_ADDR:\r
+      if ((IOCTL_ACT_GET == action) || (IOCTL_ACT_SET == action))\r
+      {\r
+        rc = nwk_deviceAddress(action, (addr_t *)val);\r
+      }\r
+      else\r
+      {\r
+        rc = SMPL_BAD_PARAM;\r
+      }\r
+      break;\r
+\r
+    case IOCTL_OBJ_RAW_IO:\r
+      if (IOCTL_ACT_WRITE == action)\r
+      {\r
+        rc = nwk_rawSend((ioctlRawSend_t *)val);\r
+      }\r
+      else if (IOCTL_ACT_READ == action)\r
+      {\r
+        rc = nwk_rawReceive((ioctlRawReceive_t *)val);\r
+      }\r
+      else\r
+      {\r
+        rc = SMPL_BAD_PARAM;\r
+      }\r
+      break;\r
+\r
+    case IOCTL_OBJ_RADIO:\r
+      rc = nwk_radioControl(action, val);\r
+      break;\r
+\r
+#if defined(ACCESS_POINT)\r
+    case IOCTL_OBJ_AP_JOIN:\r
+      rc = nwk_joinContext(action);\r
+      break;\r
+#endif\r
+#if defined(FREQUENCY_AGILITY)\r
+    case IOCTL_OBJ_FREQ:\r
+      rc = nwk_freqControl(action, val);\r
+      break;\r
+#endif\r
+    case IOCTL_OBJ_FWVER:\r
+      if (IOCTL_ACT_GET == action)\r
+      {\r
+        memcpy(val, nwk_getFWVersion(), SMPL_FWVERSION_SIZE);\r
+        rc = SMPL_SUCCESS;\r
+      }\r
+      else\r
+      {\r
+        rc = SMPL_BAD_PARAM;\r
+      }\r
+      break;\r
+\r
+    case IOCTL_OBJ_PROTOVER:\r
+      if (IOCTL_ACT_GET == action)\r
+      {\r
+        *((uint8_t *)val) = nwk_getProtocolVersion();\r
+        rc = SMPL_SUCCESS;\r
+      }\r
+      else\r
+      {\r
+        rc = SMPL_BAD_PARAM;\r
+      }\r
+      break;\r
+\r
+    default:\r
+      rc = SMPL_BAD_PARAM;\r
+      break;\r
+  }\r
+\r
+  return rc;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          ioctlPreInitAccessIsOK\r
+ *\r
+ * @brief       Is the request legal yet? Most requests are not legal before\r
+ *              SMPL_Init().\r
+ *\r
+ * input parameters\r
+ * @param   object   - The IOCTL target object\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   Returns non-zero if request should be honored for further\r
+ *           processing, otherwise returns 0. This function does not\r
+ *           determine of the object-action pair are valid. It only knows\r
+ *           about exceptions, i.e., those that are valid before the\r
+ *           SMPL_Init() call.\r
+ *\r
+ */\r
+static uint8_t ioctlPreInitAccessIsOK(ioctlObject_t object)\r
+{\r
+  uint8_t rc;\r
+\r
+  /* Currently the only legal pre-init accesses are the address and\r
+   * the token objects.\r
+   */\r
+  switch (object)\r
+  {\r
+    case IOCTL_OBJ_ADDR:\r
+    case IOCTL_OBJ_TOKEN:\r
+      rc = 1;   /* legal */\r
+      break;\r
+\r
+    default:\r
+      rc = 0;   /* not legal when init not done */\r
+      break;\r
+  }\r
+\r
+  return rc;\r
+}\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/Components/nwk/nwk_api.h b/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/Components/nwk/nwk_api.h
new file mode 100755 (executable)
index 0000000..07ccf85
--- /dev/null
@@ -0,0 +1,56 @@
+/**************************************************************************************************\r
+  Filename:       nwk_api.h\r
+  Revised:        $Date: 2008-11-24 12:09:31 -0800 (Mon, 24 Nov 2008) $\r
+  Revision:       $Revision: 18508 $\r
+  Author:         $Author: lfriedman $\r
+\r
+  Description:    This header file supports the SimpliciTI appliction layer API.\r
+\r
+  Copyright 2004-2007 Texas Instruments Incorporated. All rights reserved.\r
+\r
+  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+  the terms of a software license agreement between the user who downloaded the software,\r
+  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+  License. The License limits your use, and you acknowledge, that the Software may not be\r
+  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+  perform, display or sell this Software and/or its documentation for any purpose.\r
+\r
+  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+\r
+  Should you have any questions regarding your right to use this Software,\r
+  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+#ifndef NWK_API_H\r
+#define NWK_API_H\r
+\r
+/* Tx options (bit map) */\r
+#define  SMPL_TXOPTION_NONE       ((txOpt_t)0x00)\r
+#define  SMPL_TXOPTION_ACKREQ     ((txOpt_t)0x01)\r
+\r
+smplStatus_t SMPL_Init(uint8_t (*)(linkID_t));\r
+smplStatus_t SMPL_Link(linkID_t *);\r
+smplStatus_t SMPL_LinkListen(linkID_t *);\r
+smplStatus_t SMPL_Send(linkID_t lid, uint8_t *msg, uint8_t len);\r
+smplStatus_t SMPL_SendOpt(linkID_t lid, uint8_t *msg, uint8_t len, txOpt_t);\r
+smplStatus_t SMPL_Receive(linkID_t lid, uint8_t *msg, uint8_t *len);\r
+smplStatus_t SMPL_Ioctl(ioctlObject_t, ioctlAction_t, void *);\r
+#ifdef EXTENDED_API\r
+smplStatus_t SMPL_Ping(linkID_t);\r
+smplStatus_t SMPL_Unlink(linkID_t);\r
+smplStatus_t SMPL_Commission(addr_t *, uint8_t, uint8_t, linkID_t *);\r
+#endif  /* EXTENDED_API */\r
+\r
+#endif\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/Components/nwk/nwk_app.h b/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/Components/nwk/nwk_app.h
new file mode 100755 (executable)
index 0000000..45883b4
--- /dev/null
@@ -0,0 +1,53 @@
+\r
+/**************************************************************************************************\r
+  Filename:       nwk_app.h\r
+  Revised:        $Date: 2007-07-10 11:21:35 -0700 (Tue, 10 Jul 2007) $\r
+  Revision:       $Revision: 14865 $\r
+  Author:         $Author: lfriedman $\r
+\r
+  Description:    This header file is for convenience and includes the headers for all the\r
+                  network applications.\r
+\r
+  Copyright 2004-2007 Texas Instruments Incorporated. All rights reserved.\r
+\r
+  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+  the terms of a software license agreement between the user who downloaded the software,\r
+  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+  License. The License limits your use, and you acknowledge, that the Software may not be\r
+  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+  perform, display or sell this Software and/or its documentation for any purpose.\r
+\r
+  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+\r
+  Should you have any questions regarding your right to use this Software,\r
+  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+\r
+\r
+\r
+#ifndef NWK_APP_H\r
+#define NWK_APP_H\r
+\r
+#include "nwk_freq.h"\r
+#include "nwk_ping.h"\r
+#include "nwk_link.h"\r
+#include "nwk_mgmt.h"\r
+#include "nwk_join.h"\r
+#include "nwk_security.h"\r
+#include "nwk_ioctl.h"\r
+\r
+#endif\r
+\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/Components/nwk/nwk_frame.c b/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/Components/nwk/nwk_frame.c
new file mode 100755 (executable)
index 0000000..4279b25
--- /dev/null
@@ -0,0 +1,948 @@
+/**************************************************************************************************\r
+  Filename:       nwk_frame.c\r
+  Revised:        $Date: 2009-03-10 16:21:40 -0700 (Tue, 10 Mar 2009) $\r
+  Revision:       $Revision: 19368 $\r
+  Author          $Author: lfriedman $\r
+\r
+  Description:    This file supports the SimpliciTI frame handling functions.\r
+\r
+  Copyright 2007-2009 Texas Instruments Incorporated. All rights reserved.\r
+\r
+  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+  the terms of a software license agreement between the user who downloaded the software,\r
+  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+  License. The License limits your use, and you acknowledge, that the Software may not be\r
+  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+  perform, display or sell this Software and/or its documentation for any purpose.\r
+\r
+  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+\r
+  Should you have any questions regarding your right to use this Software,\r
+  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+\r
+/******************************************************************************\r
+ * INCLUDES\r
+ */\r
+\r
+#include <string.h>\r
+#include "bsp.h"\r
+#include "mrfi.h"\r
+#include "nwk_types.h"\r
+#include "nwk_frame.h"\r
+#include "nwk.h"\r
+#include "nwk_app.h"\r
+#include "nwk_QMgmt.h"\r
+#include "nwk_globals.h"\r
+#include "nwk_mgmt.h"\r
+#include "nwk_security.h"\r
+\r
+/******************************************************************************\r
+ * MACROS\r
+ */\r
+\r
+/******************************************************************************\r
+ * CONSTANTS AND DEFINES\r
+ */\r
+\r
+/******************************************************************************\r
+ * TYPEDEFS\r
+ */\r
+\r
+/******************************************************************************\r
+ * LOCAL VARIABLES\r
+ */\r
+\r
+#if SIZE_INFRAME_Q > 0\r
+/* array of function pointers to handle NWK application frames */\r
+static  fhStatus_t (* const func[])(mrfiPacket_t *) = { nwk_processPing,\r
+                                                        nwk_processLink,\r
+                                                        nwk_processJoin,\r
+                                                        nwk_processSecurity,\r
+                                                        nwk_processFreq,\r
+                                                        nwk_processMgmt\r
+                                                      };\r
+#endif  /* SIZE_INFRAME_Q > 0 */\r
+\r
+static uint8_t sTRACTID = 0;\r
+\r
+static addr_t const *sMyAddr = NULL;\r
+\r
+static uint8_t  sMyRxType = 0, sMyTxType = 0;\r
+\r
+#if !defined(RX_POLLS)\r
+static uint8_t  (*spCallback)(linkID_t) = NULL;\r
+#endif\r
+\r
+/******************************************************************************\r
+ * LOCAL FUNCTIONS\r
+ */\r
+\r
+#if SIZE_INFRAME_Q > 0\r
+/* local helper functions for Rx devices */\r
+static void  dispatchFrame(frameInfo_t *);\r
+#if !defined(END_DEVICE)\r
+#if defined(ACCESS_POINT)\r
+/* only Access Points need to worry about duplicate S&F frames */\r
+uint8_t  isDupSandFFrame(mrfiPacket_t *);\r
+#endif /* ACCESS_POINT */\r
+#endif  /* !END_DEVICE */\r
+#endif  /* SIZE_INFRAME_Q > 0 */\r
+\r
+/******************************************************************************\r
+ * GLOBAL VARIABLES\r
+ */\r
+\r
+/******************************************************************************\r
+ * GLOBAL FUNCTIONS\r
+ */\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_frameInit\r
+ *\r
+ * @brief       Initialize network context.\r
+ *\r
+ * input parameters\r
+ *       pF - Pointer to callback function. If none intended should be NULL.\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return    void\r
+ */\r
+\r
+void nwk_frameInit(uint8_t (*pF)(linkID_t))\r
+{\r
+\r
+/****** Fill static values for the DEVICEINFO byte that will go in each frame ******/\r
+  /* Rx type when frame originates from this device. Set in nwk_buildFrame() */\r
+  /* Tx type when frame sent from this device. Set in nwk_sendframe() */\r
+#if !defined(END_DEVICE)\r
+    sMyRxType = F_RX_TYPE_USER_CTL;\r
+  #if defined(ACCESS_POINT)\r
+    sMyTxType = F_TX_DEVICE_AP;\r
+  #else\r
+    sMyTxType = F_TX_DEVICE_RE;\r
+  #endif\r
+#else\r
+    sMyTxType = F_TX_DEVICE_ED;\r
+  #if defined(RX_POLLS)\r
+    sMyRxType = F_RX_TYPE_POLLS;\r
+  #endif\r
+  #if defined(RX_USER)\r
+    sMyRxType = F_RX_TYPE_USER_CTL;\r
+  #endif\r
+#endif\r
+/****** DONE fill static values for the DEVICEINFO byte that will go in each frame ******/\r
+\r
+#if !defined(RX_POLLS)\r
+  spCallback = pF;\r
+#else\r
+  (void) pF;\r
+#endif\r
+\r
+  sMyAddr = nwk_getMyAddress();\r
+\r
+  while (!(sTRACTID=MRFI_RandomByte())) ;\r
+\r
+  return;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_buildFrame\r
+ *\r
+ * @brief       Builds an output frame for the port and message enclosed.\r
+ *              This routine prepends the frame header and populates the\r
+ *              frame in the output queue.\r
+ *\r
+ * input parameters\r
+ * @param   port    - port from application\r
+ * @param   msg     - pointer to message from app to be sent\r
+ * @param   len     - length of enclosed message\r
+ * @param   hops    - number of hops allowed. this is less than MAX_HOPS\r
+ *                    whenever the frame is being sent to the AP. this is to\r
+ *                    help mitigate the (short) broadcast storms\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   pointer to frameInfo_t structure created. NULL if there is\r
+ *           no room in output queue.\r
+ */\r
+frameInfo_t *nwk_buildFrame(uint8_t port, uint8_t *msg, uint8_t len, uint8_t hops)\r
+{\r
+  frameInfo_t  *fInfoPtr;\r
+\r
+  if (!(fInfoPtr=nwk_QfindSlot(OUTQ)))\r
+  {\r
+    return (frameInfo_t *)NULL;\r
+  }\r
+\r
+  MRFI_SET_PAYLOAD_LEN(&fInfoPtr->mrfiPkt, len+F_APP_PAYLOAD_OS);\r
+\r
+  PUT_INTO_FRAME(MRFI_P_PAYLOAD(&fInfoPtr->mrfiPkt), F_ENCRYPT_OS, 0);\r
+  PUT_INTO_FRAME(MRFI_P_PAYLOAD(&fInfoPtr->mrfiPkt), F_PORT_OS, port);\r
+  PUT_INTO_FRAME(MRFI_P_PAYLOAD(&fInfoPtr->mrfiPkt), F_TRACTID_OS, sTRACTID);\r
+  while (!(++sTRACTID)) ;  /* transaction ID can't be 0 */\r
+  PUT_INTO_FRAME(MRFI_P_PAYLOAD(&fInfoPtr->mrfiPkt), F_RX_TYPE, sMyRxType);\r
+  PUT_INTO_FRAME(MRFI_P_PAYLOAD(&fInfoPtr->mrfiPkt), F_HOP_COUNT, hops);\r
+\r
+  /* reset ack-relevant bits */\r
+  PUT_INTO_FRAME(MRFI_P_PAYLOAD(&fInfoPtr->mrfiPkt), F_ACK_REQ, 0);\r
+  PUT_INTO_FRAME(MRFI_P_PAYLOAD(&fInfoPtr->mrfiPkt), F_ACK_RPLY, 0);\r
+\r
+  /* reset forwarding bit */\r
+  PUT_INTO_FRAME(MRFI_P_PAYLOAD(&fInfoPtr->mrfiPkt), F_FWD_FRAME, 0);\r
+\r
+  memcpy(MRFI_P_PAYLOAD(&fInfoPtr->mrfiPkt)+F_APP_PAYLOAD_OS, msg, len);\r
+  memcpy(MRFI_P_SRC_ADDR(&fInfoPtr->mrfiPkt), sMyAddr, NET_ADDR_SIZE);\r
+\r
+  return fInfoPtr;\r
+}\r
+\r
+#if defined(APP_AUTO_ACK)\r
+/******************************************************************************\r
+ * @fn          nwk_buildAckReqFrame\r
+ *\r
+ * @brief       Builds an output frame for the port and message enclosed.\r
+ *              This routine prepends the frame header and populates the\r
+ *              frame in the output queue. The frame is set to request that\r
+ *              an ack frame be sent by the peer.\r
+ *\r
+ * input parameters\r
+ * @param   port    - port from application\r
+ * @param   msg     - pointer to message from app to be sent\r
+ * @param   len     - length of enclosed message\r
+ * @param   hops    - number of hops allowed. this is less than MAX_HOPS\r
+ *                    whenever the frame is being sent to the AP. this is to\r
+ *                    help mitigate the (short) broadcast storms\r
+ * @param   tid     - Transaction ID to insert in NWK header used to match\r
+ *                    the ack reply.\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   pointer to frameInfo_t structure created. NULL if there is\r
+ *           no room in output queue.\r
+ */\r
+frameInfo_t *nwk_buildAckReqFrame(uint8_t port, uint8_t *msg, uint8_t len, uint8_t hops, volatile uint8_t *tid)\r
+{\r
+  frameInfo_t *fInfoPtr;\r
+\r
+  /* Build a normal frame first. */\r
+  if (!(fInfoPtr=nwk_buildFrame(port, msg, len, hops)))\r
+  {\r
+    return (frameInfo_t *)NULL;\r
+  }\r
+\r
+  /* save TID  */\r
+  *tid = GET_FROM_FRAME(MRFI_P_PAYLOAD(&fInfoPtr->mrfiPkt), F_TRACTID_OS);\r
+  /* Set REQ_ACK bit */\r
+  PUT_INTO_FRAME(MRFI_P_PAYLOAD(&fInfoPtr->mrfiPkt), F_ACK_REQ, F_ACK_REQ_TYPE);\r
+\r
+  return fInfoPtr;\r
+}\r
+#endif  /* APP_AUTO_ACK */\r
+\r
+#if SIZE_INFRAME_Q > 0\r
+/******************************************************************************\r
+ * @fn          MRFI_RxCompleteISR\r
+ *\r
+ * @brief       Here on Rx interrupt from radio. Process received frame from the\r
+ *              radio Rx FIFO.\r
+ *\r
+ * input parameters\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return      void\r
+ */\r
+void MRFI_RxCompleteISR()\r
+{\r
+  frameInfo_t  *fInfoPtr;\r
+\r
+  /* room for more? */\r
+  if (fInfoPtr=nwk_QfindSlot(INQ))\r
+  {\r
+    MRFI_Receive(&fInfoPtr->mrfiPkt);\r
+\r
+    dispatchFrame(fInfoPtr);\r
+  }\r
+\r
+  return;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_retrieveFrame\r
+ *\r
+ * @brief       Retrieve frame from Rx frame queue. Invoked by application-level\r
+ *              code either app through SMPL_Receive() or IOCTL through raw Rx. This\r
+ *              should run in a user thread, not an ISR thread.\r
+ *\r
+ * input parameters\r
+ * @param    port    - port on which to get a frame\r
+ *\r
+ * output parameters\r
+ * @param    msg     - pointer to where app payload should be copied. Buffer\r
+ *                     allocated should be == MAX_APP_PAYLOAD.\r
+ *\r
+ * @param    len      - pointer to where payload length should be stored. Caller\r
+ *                      can check for non-zero when polling the port. initialized\r
+ *                      to 0 even if no frame is retrieved.\r
+ * @param    srcAddr  - if non-NULL, a pointer to where to copy the source address\r
+ *                      of the retrieved message.\r
+ * @param    hopCount - if non-NULL, a pointer to where to copy the hop count\r
+                        of the retrieved message.\r
+ *\r
+ * @return    SMPL_SUCCESS\r
+ *            SMPL_NO_FRAME  - no frame found for specified destination\r
+ *            SMPL_BAD_PARAM - no valid connection info for the Link ID\r
+ *\r
+ */\r
+smplStatus_t nwk_retrieveFrame(rcvContext_t *rcv, uint8_t *msg, uint8_t *len, addr_t *srcAddr, uint8_t *hopCount)\r
+{\r
+  frameInfo_t *fPtr;\r
+  uint8_t      done;\r
+\r
+  do {\r
+    /* look for a frame on requested port. */\r
+    *len = 0;\r
+    done = 1;\r
+\r
+    fPtr = nwk_QfindOldest(INQ, rcv, USAGE_NORMAL);\r
+    if (fPtr)\r
+    {\r
+      connInfo_t  *pCInfo = 0;\r
+\r
+      if (RCV_APP_LID == rcv->type)\r
+      {\r
+        pCInfo = nwk_getConnInfo(rcv->t.lid);\r
+        if (!pCInfo)\r
+        {\r
+          return SMPL_BAD_PARAM;\r
+        }\r
+#if defined(SMPL_SECURE)\r
+        /* decrypt here...we have all the context we need. */\r
+        {\r
+          uint32_t  ctr  = pCInfo->connRxCTR;\r
+          uint32_t *pctr = &ctr;\r
+          uint8_t   len  = MRFI_GET_PAYLOAD_LEN(&fPtr->mrfiPkt) - F_SEC_CTR_OS;\r
+\r
+          if (pCInfo->thisLinkID == SMPL_LINKID_USER_UUD)\r
+          {\r
+            pctr = NULL;\r
+          }\r
+#if defined(RX_POLLS)\r
+          else if ((F_APP_PAYLOAD_OS - F_SEC_CTR_OS) == len)\r
+          {\r
+            /* This was an empty poll reply frame generated by the AP.\r
+             * It uses the single-byte CTR value like network applications.\r
+             * We do not want to use the application layer counter in this case.\r
+             */\r
+            pctr = NULL;\r
+          }\r
+#endif\r
+          if (nwk_getSecureFrame(&fPtr->mrfiPkt, len, pctr))\r
+          {\r
+            if (pctr)\r
+            {\r
+              /* Update connection's counter. */\r
+              pCInfo->connRxCTR = ctr;\r
+            }\r
+          }\r
+          else\r
+          {\r
+            /* Frame bogus. Check for another frame. */\r
+            done = 0;\r
+            continue;\r
+          }\r
+        }\r
+#endif  /* SMPL_SECURE */\r
+      }\r
+\r
+      /* it's on the requested port. */\r
+      *len = MRFI_GET_PAYLOAD_LEN(&fPtr->mrfiPkt) - F_APP_PAYLOAD_OS;\r
+      memcpy(msg, MRFI_P_PAYLOAD(&fPtr->mrfiPkt)+F_APP_PAYLOAD_OS, *len);\r
+      /* save signal info */\r
+      if (pCInfo)\r
+      {\r
+        /* Save Rx metrics... */\r
+        pCInfo->sigInfo.rssi = fPtr->mrfiPkt.rxMetrics[MRFI_RX_METRICS_RSSI_OFS];\r
+        pCInfo->sigInfo.lqi  = fPtr->mrfiPkt.rxMetrics[MRFI_RX_METRICS_CRC_LQI_OFS];\r
+      }\r
+      if (srcAddr)\r
+      {\r
+        /* copy source address if requested */\r
+        memcpy(srcAddr, MRFI_P_SRC_ADDR(&fPtr->mrfiPkt), NET_ADDR_SIZE);\r
+      }\r
+      if (hopCount)\r
+      {\r
+        /* copy hop count if requested */\r
+        *hopCount = GET_FROM_FRAME(MRFI_P_PAYLOAD(&fPtr->mrfiPkt), F_HOP_COUNT);\r
+      }\r
+      /* input frame no longer needed. free it. */\r
+      nwk_QadjustOrder(INQ, fPtr->orderStamp);\r
+\r
+      fPtr->fi_usage = FI_AVAILABLE;\r
+      return SMPL_SUCCESS;\r
+    }\r
+  } while (!done);\r
+\r
+  return SMPL_NO_FRAME;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          dispatchFrame\r
+ *\r
+ * @brief       Received frame looks OK so far. Dispatch to either NWK app by\r
+ *              invoking the handler or the user's app by simply leaving the\r
+ *              frame in the queue and letting the app poll the port.\r
+ *\r
+ * input parameters\r
+ * @param   fiPtr    - frameInfo_t pointer to received frame\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   void\r
+ */\r
+static void dispatchFrame(frameInfo_t *fiPtr)\r
+{\r
+  uint8_t     port       = GET_FROM_FRAME(MRFI_P_PAYLOAD(&fiPtr->mrfiPkt), F_PORT_OS);\r
+  uint8_t     nwkAppSize = sizeof(func)/sizeof(func[0]);\r
+  fhStatus_t  rc;\r
+  linkID_t    lid;\r
+#if defined(ACCESS_POINT)\r
+  uint8_t loc;\r
+#endif\r
+#if !defined(END_DEVICE)\r
+  uint8_t isForMe;\r
+#endif\r
+\r
+  /* be sure it's not an echo... */\r
+  if (!memcmp(MRFI_P_SRC_ADDR(&fiPtr->mrfiPkt), sMyAddr, NET_ADDR_SIZE))\r
+  {\r
+    fiPtr->fi_usage = FI_AVAILABLE;\r
+    return;\r
+  }\r
+\r
+  /* Make sure encyrption bit conforms to our security support context. */\r
+#if defined(SMPL_SECURE)\r
+  if (!(GET_FROM_FRAME(MRFI_P_PAYLOAD(&fiPtr->mrfiPkt), F_ENCRYPT_OS)))\r
+  {\r
+    /* Encyrption bit is not on when when it should be */\r
+    fiPtr->fi_usage = FI_AVAILABLE;\r
+    return;\r
+  }\r
+#else\r
+  if (GET_FROM_FRAME(MRFI_P_PAYLOAD(&fiPtr->mrfiPkt), F_ENCRYPT_OS))\r
+  {\r
+    /* Encyrption bit is on when when it should not be */\r
+    fiPtr->fi_usage = FI_AVAILABLE;\r
+    return;\r
+  }\r
+#endif  /* SMPL_SECURE */\r
+\r
+  /* If it's a network application port dispatch to service routine. Dispose\r
+   * of frame depending on return code.\r
+   */\r
+  if (port && (port <= nwkAppSize))\r
+  {\r
+#if defined(SMPL_SECURE)\r
+    /* Non-connection-based frame. We can decode here if it was encrypted */\r
+    if (!nwk_getSecureFrame(&fiPtr->mrfiPkt, MRFI_GET_PAYLOAD_LEN(&fiPtr->mrfiPkt) - F_SEC_CTR_OS, 0))\r
+    {\r
+      fiPtr->fi_usage = FI_AVAILABLE;\r
+      return;\r
+    }\r
+#endif\r
+    rc = func[port-1](&fiPtr->mrfiPkt);\r
+    if (FHS_KEEP == rc)\r
+    {\r
+      fiPtr->fi_usage = FI_INUSE_UNTIL_DEL;\r
+    }\r
+#if !defined(END_DEVICE)\r
+    else if (FHS_REPLAY == rc)\r
+    {\r
+      /* an AP or an RE could be relaying a NWK application frame... */\r
+      nwk_replayFrame(fiPtr);\r
+    }\r
+#endif\r
+    else  /* rc == FHS_RELEASE (default...) */\r
+    {\r
+      fiPtr->fi_usage = FI_AVAILABLE;\r
+    }\r
+    return;\r
+  }\r
+  /* sanity check */\r
+  else if ((port != SMPL_PORT_USER_BCAST) && ((port < PORT_BASE_NUMBER) || (port > SMPL_PORT_STATIC_MAX)))\r
+  {\r
+    /* bogus port. drop frame */\r
+    fiPtr->fi_usage = FI_AVAILABLE;\r
+    return;\r
+  }\r
+\r
+  /* At this point we know the target is a user app. If this is an end device\r
+   * and we got this far save the frame and we're done. If we're an AP there\r
+   * are 3 cases: it's for us, it's for s store-and-forward client, or we need\r
+   * to replay the frame. If we're and RE and the frame didn't come from an RE\r
+   * and it's not for us, replay the frame.\r
+   */\r
+\r
+#if defined(END_DEVICE)\r
+  /* If we're s polling end device we only accept application frames from\r
+   * the AP. This prevents duplicate reception if we happen to be on when\r
+   * a linked peer sends.\r
+   */\r
+#if defined(RX_POLLS)\r
+  if (F_TX_DEVICE_ED != GET_FROM_FRAME(MRFI_P_PAYLOAD(&fiPtr->mrfiPkt), F_TX_DEVICE))\r
+  {\r
+    if (nwk_isConnectionValid(&fiPtr->mrfiPkt, &lid))\r
+    {\r
+      fiPtr->fi_usage = FI_INUSE_UNTIL_DEL;\r
+    }\r
+    else\r
+    {\r
+      fiPtr->fi_usage = FI_AVAILABLE;\r
+    }\r
+  }\r
+  else\r
+  {\r
+    fiPtr->fi_usage = FI_AVAILABLE;\r
+  }\r
+#else\r
+  /* it's destined for a user app. */\r
+  if (nwk_isConnectionValid(&fiPtr->mrfiPkt, &lid))\r
+  {\r
+    fiPtr->fi_usage = FI_INUSE_UNTIL_DEL;\r
+    if (spCallback && spCallback(lid))\r
+    {\r
+      fiPtr->fi_usage = FI_AVAILABLE;\r
+      return;\r
+    }\r
+  }\r
+  else\r
+  {\r
+    fiPtr->fi_usage = FI_AVAILABLE;\r
+  }\r
+#endif  /* RX_POLLS */\r
+\r
+#else   /* END_DEVICE */\r
+\r
+  /* We have an issue if the frame is broadcast to the UUD port. The AP (or RE) must\r
+   * handle this frame as if it were the target in case there is an application\r
+   * running that is listening on that port. But if it's a broadcast it must also be\r
+   * replayed. It isn't enough just to test for the UUD port because it could be a\r
+   * directed frame to another device. We must check explicitly for broadcast\r
+   * destination address.\r
+   */\r
+  isForMe = !memcmp(sMyAddr, MRFI_P_DST_ADDR(&fiPtr->mrfiPkt), NET_ADDR_SIZE);\r
+  if (isForMe || ((port == SMPL_PORT_USER_BCAST) && !memcmp(nwk_getBCastAddress(), MRFI_P_DST_ADDR(&fiPtr->mrfiPkt), NET_ADDR_SIZE)))\r
+  {\r
+    /* The folllowing test will succeed for the UUD port regardless of the\r
+     * source address.\r
+     */\r
+    if (nwk_isConnectionValid(&fiPtr->mrfiPkt, &lid))\r
+    {\r
+      /* If this is for the UUD port and we are here then the device is either\r
+       * an AP or an RE. In either case it must replay the UUD port frame if the\r
+       * frame is not "for me". But it also must handle it since it could have a\r
+       * UUD-listening application. Do the reply first and let the subsequent code\r
+       * correctly set the frame usage state. Note that the routine return can be\r
+       * from this code block. If not it will drop through to the bottom without\r
+       * doing a replay.\r
+       */\r
+      /* Do I need to replay it? */\r
+      if (!isForMe)\r
+      {\r
+        /* must be a broadcast for the UUD port */\r
+        nwk_replayFrame(fiPtr);\r
+      }\r
+      /* OK. Now I handle it... */\r
+      fiPtr->fi_usage = FI_INUSE_UNTIL_DEL;\r
+      if (spCallback && spCallback(lid))\r
+      {\r
+        fiPtr->fi_usage = FI_AVAILABLE;\r
+        return;\r
+      }\r
+    }\r
+    else\r
+    {\r
+      fiPtr->fi_usage = FI_AVAILABLE;\r
+    }\r
+  }\r
+#if defined( ACCESS_POINT )\r
+  /* Check to see if we need to save this for a S and F client. Otherwise,\r
+   * if it's not for us, get rid of it.\r
+   */\r
+  else if (nwk_isSandFClient(MRFI_P_DST_ADDR(&fiPtr->mrfiPkt), &loc))\r
+  {\r
+    /* Don't bother if it is a duplicate frame or if it's a forwarded frame\r
+     * echoed back from an RE.\r
+     */\r
+    if (!isDupSandFFrame(&fiPtr->mrfiPkt) &&\r
+        !(GET_FROM_FRAME(MRFI_P_PAYLOAD(&fiPtr->mrfiPkt), F_FWD_FRAME))\r
+       )\r
+    {\r
+#if defined(APP_AUTO_ACK)\r
+      /* Make sure ack request bit is off. Sender will have gone away. */\r
+      PUT_INTO_FRAME(MRFI_P_PAYLOAD(&fiPtr->mrfiPkt), F_ACK_REQ, 0);\r
+#endif\r
+      fiPtr->fi_usage = FI_INUSE_UNTIL_FWD;\r
+    }\r
+    else\r
+    {\r
+      fiPtr->fi_usage = FI_AVAILABLE;\r
+    }\r
+  }\r
+  else if (GET_FROM_FRAME(MRFI_P_PAYLOAD(&fiPtr->mrfiPkt), F_TX_DEVICE) == F_TX_DEVICE_AP)\r
+  {\r
+    /* I'm an AP and this frame came from an AP. Don't replay. */\r
+    fiPtr->fi_usage = FI_AVAILABLE;\r
+  }\r
+#elif defined( RANGE_EXTENDER )\r
+  else if (GET_FROM_FRAME(MRFI_P_PAYLOAD(&fiPtr->mrfiPkt), F_TX_DEVICE) == F_TX_DEVICE_RE)\r
+  {\r
+    /* I'm an RE and this frame came from an RE. Don't replay. */\r
+    fiPtr->fi_usage = FI_AVAILABLE;\r
+  }\r
+#endif\r
+  else\r
+  {\r
+    /* It's not for me and I'm either an AP or I'm an RE and the frame\r
+     * didn't come from an RE. Replay the frame.\r
+     */\r
+    nwk_replayFrame(fiPtr);\r
+  }\r
+#endif  /* !END_DEVICE */\r
+  return;\r
+}\r
+#endif   /* SIZE_INFRAME_Q > 0 */\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_sendFrame\r
+ *\r
+ * @brief       Send a frame by copying it to the radio Tx FIFO.\r
+ *\r
+ * input parameters\r
+ * @param   pFrameInfo   - pointer to frame to be sent\r
+ * @param   txOption     - do CCA or force frame out.\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return    SMPL_SUCCESS\r
+ *            SMPL_TX_CCA_FAIL Tx failed because of CCA failure.\r
+ *                             Tx FIFO flushed in this case.\r
+ */\r
+smplStatus_t nwk_sendFrame(frameInfo_t *pFrameInfo, uint8_t txOption)\r
+{\r
+  smplStatus_t rc;\r
+\r
+  /* set the type of device sending the frame in the header */\r
+  PUT_INTO_FRAME(MRFI_P_PAYLOAD(&pFrameInfo->mrfiPkt), F_TX_DEVICE, sMyTxType);\r
+\r
+  if (MRFI_TX_RESULT_SUCCESS == MRFI_Transmit(&pFrameInfo->mrfiPkt, txOption))\r
+  {\r
+    rc = SMPL_SUCCESS;\r
+  }\r
+  else\r
+  {\r
+    /* Tx failed -- probably CCA. free up frame buffer. We do not have NWK\r
+     * level retries. Let application do it.\r
+     */\r
+    rc = SMPL_TX_CCA_FAIL;\r
+  }\r
+\r
+  /* TX is done. free up the frame buffer */\r
+  pFrameInfo->fi_usage = FI_AVAILABLE;\r
+\r
+  return rc;\r
+}\r
+\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_getMyRxType\r
+ *\r
+ * @brief       Get my Rx type. Used to help populate the hops count in the\r
+ *              frame header to try and limit the broadcast storm. Info is\r
+ *              exchanged when linking.\r
+ *\r
+ * input parameters\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return      The address LSB.\r
+ */\r
+uint8_t nwk_getMyRxType(void)\r
+{\r
+  return sMyRxType;\r
+}\r
+\r
+#if defined(APP_AUTO_ACK)\r
+/******************************************************************************\r
+ * @fn          nwk_sendAckReply\r
+ *\r
+ * @brief       Send an acknowledgement reply frame.\r
+ *\r
+ * input parameters\r
+ * @param   frame   - pointer to frame with ack request.\r
+ * @param   port    - port on whcih reply expected.\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return      void\r
+ */\r
+void nwk_sendAckReply(mrfiPacket_t *frame, uint8_t port)\r
+{\r
+  mrfiPacket_t dFrame;\r
+  uint8_t      tid = GET_FROM_FRAME(MRFI_P_PAYLOAD(frame), F_TRACTID_OS);\r
+\r
+  /* set the type of device sending the frame in the header */\r
+  PUT_INTO_FRAME(MRFI_P_PAYLOAD(&dFrame), F_TX_DEVICE, sMyTxType);\r
+\r
+  /* set the listen type of device sending the frame in the header. */\r
+  PUT_INTO_FRAME(MRFI_P_PAYLOAD(&dFrame), F_RX_TYPE, sMyRxType);\r
+\r
+  /* destination address from received frame */\r
+  memcpy(MRFI_P_DST_ADDR(&dFrame), MRFI_P_SRC_ADDR(frame), NET_ADDR_SIZE);\r
+\r
+  /* source address */\r
+  memcpy(MRFI_P_SRC_ADDR(&dFrame), sMyAddr, NET_ADDR_SIZE);\r
+\r
+  /* port is the source the Tx port from the connection object */\r
+  PUT_INTO_FRAME(MRFI_P_PAYLOAD(&dFrame), F_PORT_OS, port);\r
+\r
+  /* frame length... */\r
+  MRFI_SET_PAYLOAD_LEN(&dFrame,F_APP_PAYLOAD_OS);\r
+\r
+  /* transaction ID taken from source frame */\r
+  PUT_INTO_FRAME(MRFI_P_PAYLOAD(&dFrame), F_TRACTID_OS, tid);\r
+\r
+  /* hop count... */\r
+  PUT_INTO_FRAME(MRFI_P_PAYLOAD(&dFrame), F_HOP_COUNT, MAX_HOPS);\r
+\r
+  /* set ACK field */\r
+  PUT_INTO_FRAME(MRFI_P_PAYLOAD(&dFrame), F_ACK_RPLY, F_ACK_RPLY_TYPE);\r
+  PUT_INTO_FRAME(MRFI_P_PAYLOAD(&dFrame), F_ACK_REQ, 0);\r
+\r
+   /* This is not a forwarded frame */\r
+  PUT_INTO_FRAME(MRFI_P_PAYLOAD(&dFrame), F_FWD_FRAME, 0);\r
+\r
+  /* Encryption state */\r
+#if !defined(SMPL_SECURE)\r
+  PUT_INTO_FRAME(MRFI_P_PAYLOAD(&dFrame), F_ENCRYPT_OS, 0);\r
+#else\r
+  PUT_INTO_FRAME(MRFI_P_PAYLOAD(&dFrame), F_ENCRYPT_OS, F_ENCRYPT_OS_MSK);\r
+  nwk_setSecureFrame(&dFrame, 0, 0);\r
+#endif\r
+\r
+  MRFI_Transmit(&dFrame, MRFI_TX_TYPE_FORCED);\r
+\r
+  return;\r
+}\r
+#endif /* APP_AUTO_ACK */\r
+\r
+#if !defined(END_DEVICE)\r
+/******************************************************************************\r
+ * @fn          nwk_replayFrame\r
+ *\r
+ * @brief       Deal with hop count on a Range Extender or Access Point replay.\r
+ *              Queue entry usage always left as available when done.\r
+ *\r
+ * input parameters\r
+ * @param   pFrameInfo   - pointer to frame information structure\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return      void\r
+ */\r
+void nwk_replayFrame(frameInfo_t *pFrameInfo)\r
+{\r
+  uint8_t  hops = GET_FROM_FRAME(MRFI_P_PAYLOAD(&pFrameInfo->mrfiPkt), F_HOP_COUNT);\r
+\r
+  /* if hops are zero, drop frame. othewise send it. */\r
+  if (hops--)\r
+  {\r
+    PUT_INTO_FRAME(MRFI_P_PAYLOAD(&pFrameInfo->mrfiPkt),F_HOP_COUNT,hops);\r
+    /* Don't care if the Tx fails because of TO. Either someone else\r
+     * will retransmit or the application itself will recover.\r
+     */\r
+#if defined(SMPL_SECURE)\r
+    /* If the frame was targeted to a NWK port it was decrypted on spec in\r
+     * the 'dispatchFrame()' method. It must be re-encypted in this case.\r
+     */\r
+    if (GET_FROM_FRAME(MRFI_P_PAYLOAD(&pFrameInfo->mrfiPkt), F_PORT_OS) <= SMPL_PORT_NWK_BCAST)\r
+    {\r
+      nwk_setSecureFrame(&pFrameInfo->mrfiPkt, MRFI_GET_PAYLOAD_LEN(&pFrameInfo->mrfiPkt)-F_APP_PAYLOAD_OS, 0);\r
+    }\r
+#endif\r
+    MRFI_DelayMs(1);\r
+    nwk_sendFrame(pFrameInfo, MRFI_TX_TYPE_CCA);\r
+  }\r
+  else\r
+  {\r
+    pFrameInfo->fi_usage = FI_AVAILABLE;\r
+  }\r
+  return;\r
+}\r
+\r
+#if defined(ACCESS_POINT)\r
+/******************************************************************************\r
+ * @fn          nwk_getSandFFrame\r
+ *\r
+ * @brief       Get any frame waiting for the client on the port supplied in\r
+ *              the frame payload.\r
+ *              TODO: support returning NWK application frames always. the\r
+ *              port requested in the call should be an user application port.\r
+ *              NWK app ports will never be in the called frame.\r
+ *              TODO: deal with broadcast NWK frames from AP.\r
+ *\r
+ * input parameters\r
+ * @param   frame   - pointer to frame in question\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return      pointer to frame if there is one, otherwise 0.\r
+ */\r
+frameInfo_t *nwk_getSandFFrame(mrfiPacket_t *frame, uint8_t osPort)\r
+{\r
+  uint8_t        i, port = *(MRFI_P_PAYLOAD(frame)+F_APP_PAYLOAD_OS+osPort);\r
+  frameInfo_t *fiPtr;\r
+  rcvContext_t rcv;\r
+\r
+  rcv.type  = RCV_RAW_POLL_FRAME;\r
+  rcv.t.pkt = frame;\r
+  /* check the input queue for messages sent by others. */\r
+  if (fiPtr=nwk_QfindOldest(INQ, &rcv, USAGE_FWD))\r
+  {\r
+    return fiPtr;\r
+  }\r
+\r
+  /* Check the output queue to see if we ourselves need to send anything.\r
+   * TODO: use the cast-out scheme for output queue so this routine finds\r
+   * the oldest in either queue.\r
+   */\r
+  fiPtr = nwk_getQ(OUTQ);\r
+  for (i=0; i<SIZE_OUTFRAME_Q; ++i, fiPtr++)\r
+  {\r
+    if (FI_INUSE_UNTIL_FWD == fiPtr->fi_usage)\r
+    {\r
+      if (!memcmp(MRFI_P_DST_ADDR(&fiPtr->mrfiPkt), MRFI_P_SRC_ADDR(frame), NET_ADDR_SIZE))\r
+      {\r
+        if (GET_FROM_FRAME(MRFI_P_PAYLOAD(&fiPtr->mrfiPkt), F_PORT_OS) == port)\r
+        {\r
+          return fiPtr;\r
+        }\r
+      }\r
+    }\r
+  }\r
+  return 0;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_SendEmptyPollRspFrame\r
+ *\r
+ * @brief       There are no frames waiting for the requester on the specified\r
+ *              port. Send a frame back to that port with no payload.\r
+ *\r
+ * input parameters\r
+ * @param   frame   - pointer to frame in question\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return      void\r
+ */\r
+void nwk_SendEmptyPollRspFrame(mrfiPacket_t *frame)\r
+{\r
+  mrfiPacket_t dFrame;\r
+  uint8_t      port = *(MRFI_P_PAYLOAD(frame)+F_APP_PAYLOAD_OS+M_POLL_PORT_OS);\r
+\r
+  /* set the type of device sending the frame in the header. we know it's an AP */\r
+  PUT_INTO_FRAME(MRFI_P_PAYLOAD(&dFrame), F_TX_DEVICE, F_TX_DEVICE_AP);\r
+  /* set the listen type of device sending the frame in the header. we know it's\r
+   * an AP is is probably always on...but use the static variable anyway.\r
+   */\r
+  PUT_INTO_FRAME(MRFI_P_PAYLOAD(&dFrame), F_RX_TYPE, sMyRxType);\r
+  /* destination address from received frame (polling device) */\r
+  memcpy(MRFI_P_DST_ADDR(&dFrame), MRFI_P_SRC_ADDR(frame), NET_ADDR_SIZE);\r
+  /* source address */\r
+  memcpy(MRFI_P_SRC_ADDR(&dFrame), MRFI_P_PAYLOAD(frame)+F_APP_PAYLOAD_OS+M_POLL_ADDR_OS, NET_ADDR_SIZE);\r
+  /* port is the port requested */\r
+  PUT_INTO_FRAME(MRFI_P_PAYLOAD(&dFrame), F_PORT_OS, port);\r
+  /* frame length... */\r
+  MRFI_SET_PAYLOAD_LEN(&dFrame,F_APP_PAYLOAD_OS);\r
+  /* transaction ID... */\r
+  PUT_INTO_FRAME(MRFI_P_PAYLOAD(&dFrame), F_TRACTID_OS, sTRACTID);\r
+  sTRACTID++;\r
+  /* hop count... */\r
+  PUT_INTO_FRAME(MRFI_P_PAYLOAD(&dFrame), F_HOP_COUNT, MAX_HOPS_FROM_AP);\r
+\r
+  /* Ack fields */\r
+  PUT_INTO_FRAME(MRFI_P_PAYLOAD(&dFrame), F_ACK_RPLY, 0);\r
+  PUT_INTO_FRAME(MRFI_P_PAYLOAD(&dFrame), F_ACK_REQ, 0);\r
+\r
+  /* This is logically a forwarded frame */\r
+  PUT_INTO_FRAME(MRFI_P_PAYLOAD(&dFrame), F_FWD_FRAME, F_FRAME_FWD_TYPE);\r
+\r
+  /* Encryption state */\r
+#if !defined(SMPL_SECURE)\r
+  PUT_INTO_FRAME(MRFI_P_PAYLOAD(&dFrame), F_ENCRYPT_OS, 0);\r
+#else\r
+  PUT_INTO_FRAME(MRFI_P_PAYLOAD(&dFrame), F_ENCRYPT_OS, F_ENCRYPT_OS_MSK);\r
+  nwk_setSecureFrame(&dFrame, 0, 0);\r
+#endif\r
+\r
+  MRFI_Transmit(&dFrame, MRFI_TX_TYPE_FORCED);\r
+\r
+  return;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          isDupSandFFrame\r
+ *\r
+ * @brief       Have we already stored this frame on behalf of a client?\r
+ *\r
+ * input parameters\r
+ * @param   frame   - pointer to frame in question\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return      Returns 1 if the frame is a duplicate, otherwise 0.\r
+ */\r
+uint8_t  isDupSandFFrame(mrfiPacket_t *frame)\r
+{\r
+  uint8_t      i, plLen = MRFI_GET_PAYLOAD_LEN(frame);\r
+  frameInfo_t *fiPtr;\r
+\r
+  /* check the input queue for duplicate S&F frame. */\r
+  fiPtr = nwk_getQ(INQ);\r
+  for (i=0; i<SIZE_INFRAME_Q; ++i, fiPtr++)\r
+  {\r
+    if (FI_INUSE_UNTIL_FWD == fiPtr->fi_usage)\r
+    {\r
+      /* compare everything except the DEVICE INFO byte. */\r
+      if (MRFI_GET_PAYLOAD_LEN(&fiPtr->mrfiPkt) == plLen                                   &&\r
+          !memcmp(MRFI_P_DST_ADDR(&fiPtr->mrfiPkt), MRFI_P_DST_ADDR(frame), NET_ADDR_SIZE) &&\r
+          !memcmp(MRFI_P_SRC_ADDR(&fiPtr->mrfiPkt), MRFI_P_SRC_ADDR(frame), NET_ADDR_SIZE) &&\r
+          !memcmp(MRFI_P_PAYLOAD(&fiPtr->mrfiPkt), MRFI_P_PAYLOAD(frame), 1)               &&\r
+          !memcmp(MRFI_P_PAYLOAD(&fiPtr->mrfiPkt)+F_TRACTID_OS, MRFI_P_PAYLOAD(frame)+F_TRACTID_OS, plLen-F_TRACTID_OS)\r
+          )\r
+      {\r
+        return 1;\r
+      }\r
+    }\r
+  }\r
+  return 0;\r
+}\r
+#endif  /* ACCESS_POINT */\r
+\r
+#endif  /* !END_DEVICE */\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/Components/nwk/nwk_frame.h b/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/Components/nwk/nwk_frame.h
new file mode 100755 (executable)
index 0000000..6c616f8
--- /dev/null
@@ -0,0 +1,151 @@
+/**************************************************************************************************\r
+  Filename:       nwk_frame.h\r
+  Revised:        $Date: 2008-12-23 13:49:41 -0800 (Tue, 23 Dec 2008) $\r
+  Revision:       $Revision: 18651 $\r
+  Author:         $Author: lfriedman $\r
+\r
+  Description:    This header file supports the SimpliciTI frame handling functions.\r
+\r
+  Copyright 2004-2007 Texas Instruments Incorporated. All rights reserved.\r
+\r
+  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+  the terms of a software license agreement between the user who downloaded the software,\r
+  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+  License. The License limits your use, and you acknowledge, that the Software may not be\r
+  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+  perform, display or sell this Software and/or its documentation for any purpose.\r
+\r
+  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+\r
+  Should you have any questions regarding your right to use this Software,\r
+  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+\r
+#ifndef NWK_FRAME_H\r
+#define NWK_FRAME_H\r
+\r
+/* Frame field defines and masks. Mask name must be field name with '_MSK' appended\r
+ * so the GET and PUT macros work correctly -- they use token pasting. Offset values\r
+ * are with respect to the MRFI payload and not the entire frame.\r
+ */\r
+#define F_PORT_OS         0\r
+#define F_PORT_OS_MSK     (0x3F)\r
+#define F_ENCRYPT_OS      0\r
+#define F_ENCRYPT_OS_MSK  (0x40)\r
+#define F_FWD_FRAME       0\r
+#define F_FWD_FRAME_MSK   (0x80)\r
+#define F_RX_TYPE         1\r
+#define F_RX_TYPE_MSK     (0x40)\r
+#define F_ACK_REQ         1\r
+#define F_ACK_REQ_MSK     (0x80)\r
+#define F_ACK_RPLY        1\r
+#define F_ACK_RPLY_MSK    (0x08)\r
+#define F_TX_DEVICE       1\r
+#define F_TX_DEVICE_MSK   (0x30)\r
+#define F_HOP_COUNT       1\r
+#define F_HOP_COUNT_MSK   (0x07)\r
+#define F_TRACTID_OS      2\r
+#define F_TRACTID_OS_MSK  (0xFF)\r
+#define SMPL_NWK_HDR_SIZE 3\r
+\r
+#ifdef SMPL_SECURE\r
+\r
+#define F_SECURE_OS       3\r
+\r
+#define F_SEC_CTR_OS      3       /* counter hint */\r
+#define F_SEC_CTR_OS_MSK  (0xFF)\r
+#define F_SEC_ICHK_OS     4       /* Message integrity check */\r
+#define F_SEC_ICHK_OS_MSK (0xFF)\r
+#define F_SEC_MAC_OS      5       /* Message authentication code */\r
+#define F_SEC_MAC_OS_MSK  (0xFF)\r
+\r
+#else\r
+\r
+#define F_SECURE_OS       0\r
+\r
+#endif  /* SMPL_SECURE */\r
+\r
+#define F_APP_PAYLOAD_OS  (SMPL_NWK_HDR_SIZE+F_SECURE_OS)\r
+\r
+/* sub field details. they are in the correct bit locations (already shifted) */\r
+#define F_RX_TYPE_USER_CTL       0x00    /* does not poll... */\r
+#define F_RX_TYPE_POLLS          0x40    /* polls for held messages */\r
+\r
+#define F_ACK_REQ_TYPE           0x80\r
+#define F_ACK_RPLY_TYPE          0x08\r
+#define F_FRAME_FWD_TYPE         0x80\r
+#define F_FRAME_ENCRYPT_TYPE     0x40\r
+\r
+/* device type fields */\r
+#define F_TX_DEVICE_ED           0x00    /* End Device */\r
+#define F_TX_DEVICE_RE           0x10    /* Range Extender */\r
+#define F_TX_DEVICE_AP           0x20    /* Access Point */\r
+\r
+/* macro to get a field from a frame buffer */\r
+#define GET_FROM_FRAME(b,f)  ((b)[f] & (f##_MSK))\r
+\r
+/* Macro to put a value 'v' into a frame buffer 'b'. 'v' value must already be shifted\r
+ * if necessary. 'b' is a byte array\r
+ */\r
+#define PUT_INTO_FRAME(b,f,v)  do {(b)[f] = ((b)[f] & ~(f##_MSK)) | (v); } while(0)\r
+\r
+\r
+/*       ****   frame information objects\r
+ * info kept on each frame object\r
+ */\r
+#define   FI_AVAILABLE         0   /* entry available for use */\r
+#define   FI_INUSE_UNTIL_DEL   1   /* in use. will be explicitly reclaimed */\r
+#define   FI_INUSE_UNTIL_TX    2   /* in use. will be reclaimed after Tx */\r
+#define   FI_INUSE_UNTIL_FWD   3   /* in use until forwarded by AP */\r
+#define   FI_INUSE_TRANSITION  4   /* being retrieved. do not delete in Rx ISR thread. */\r
+\r
+typedef struct\r
+{\r
+  uint8_t   rssi;\r
+  uint8_t   lqi;\r
+} sigInfo_t;\r
+\r
+typedef struct\r
+{\r
+  volatile uint8_t      fi_usage;\r
+           uint8_t      orderStamp;\r
+           mrfiPacket_t mrfiPkt;\r
+} frameInfo_t;\r
+\r
+\r
+/* prototypes */\r
+frameInfo_t  *nwk_buildFrame(uint8_t, uint8_t *msg, uint8_t len, uint8_t hops);\r
+#ifdef APP_AUTO_ACK\r
+frameInfo_t  *nwk_buildAckReqFrame(uint8_t, uint8_t *, uint8_t, uint8_t, volatile uint8_t *);\r
+#endif\r
+void          nwk_receiveFrame(void);\r
+void          nwk_frameInit(uint8_t (*)(linkID_t));\r
+smplStatus_t  nwk_retrieveFrame(rcvContext_t *, uint8_t *, uint8_t *, addr_t *, uint8_t *);\r
+smplStatus_t  nwk_sendFrame(frameInfo_t *, uint8_t txOption);\r
+frameInfo_t  *nwk_getSandFFrame(mrfiPacket_t *, uint8_t);\r
+uint8_t       nwk_getMyRxType(void);\r
+void          nwk_SendEmptyPollRspFrame(mrfiPacket_t *);\r
+#ifdef APP_AUTO_ACK\r
+void          nwk_sendAckReply(mrfiPacket_t *, uint8_t);\r
+#endif\r
+\r
+#ifndef END_DEVICE\r
+/* only APs and REs repeat frames */\r
+void  nwk_replayFrame(frameInfo_t *);\r
+#endif\r
+\r
+\r
+#endif\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/Components/nwk/nwk_globals.c b/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/Components/nwk/nwk_globals.c
new file mode 100755 (executable)
index 0000000..121b5e3
--- /dev/null
@@ -0,0 +1,258 @@
+/**************************************************************************************************\r
+  Filename:       nwk_globals.c\r
+  Revised:        $Date: 2009-10-27 20:48:11 -0700 (Tue, 27 Oct 2009) $\r
+  Revision:       $Revision: 20995 $\r
+\r
+  Description:    This file manages global NWK data.\r
+\r
+  Copyright 2007-2009 Texas Instruments Incorporated. All rights reserved.\r
+\r
+  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+  the terms of a software license agreement between the user who downloaded the software,\r
+  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+  License. The License limits your use, and you acknowledge, that the Software may not be\r
+  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+  perform, display or sell this Software and/or its documentation for any purpose.\r
+\r
+  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+\r
+  Should you have any questions regarding your right to use this Software,\r
+  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+\r
+/******************************************************************************\r
+ * INCLUDES\r
+ */\r
+#include <string.h>\r
+#include "bsp.h"\r
+#include "mrfi.h"\r
+#include "nwk_types.h"\r
+#include "nwk_globals.h"\r
+\r
+/******************************************************************************\r
+ * MACROS\r
+ */\r
+\r
+/******************************************************************************\r
+ * CONSTANTS AND DEFINES\r
+ */\r
+\r
+/******************************************************************************\r
+ * TYPEDEFS\r
+ */\r
+\r
+/******************************************************************************\r
+ * LOCAL VARIABLES\r
+ */\r
+static const addr_t   sMyROMAddress = THIS_DEVICE_ADDRESS;\r
+static addr_t         sAPAddress;\r
+static addr_t         sMyRAMAddress;\r
+static uint8_t        sRAMAddressIsSet = 0;\r
+\r
+/* Version number set as a 4 byte quantity. Each byte is a revision number\r
+ * in the form w.x.y.z. The subfields are each limited to values 0x0-0xFF.\r
+ */\r
+static const smplVersionInfo_t sVersionInfo = {\r
+                                                0x02,  /* protocol version */\r
+                                                0x01,  /* major revision number */\r
+                                                0x01,  /* minor revision number */\r
+                                                0x01,  /* maintenance release number */\r
+                                                0x00   /* special release */\r
+                                               };\r
+\r
+/******************************************************************************\r
+ * LOCAL FUNCTIONS\r
+ */\r
+\r
+/******************************************************************************\r
+ * GLOBAL VARIABLES\r
+ */\r
+\r
+/******************************************************************************\r
+ * GLOBAL FUNCTIONS\r
+ */\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_globalsInit\r
+ *\r
+ * @brief       Initialization of global symbols\r
+ *\r
+ * input parameters\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   void\r
+ */\r
+void nwk_globalsInit(void)\r
+{\r
+\r
+  memset(&sAPAddress, 0x00, sizeof(addr_t));\r
+\r
+  /* populate RAM address from ROM default if it hasn't laready been set\r
+   * using the IOCTL interface.\r
+   */\r
+  if (!sRAMAddressIsSet)\r
+  {\r
+    memcpy(&sMyRAMAddress, &sMyROMAddress, sizeof(addr_t));\r
+    sRAMAddressIsSet = 1;  /* RAM address is now valid */\r
+  }\r
+\r
+  return;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_getMyAddress\r
+ *\r
+ * @brief       Return a pointer to my address. It comes either from ROM as\r
+ *              set in the configuration file or it was set using the IOCTL\r
+ *              interface -- probably from random bytes.\r
+ *\r
+ * input parameters\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   pointer to a constant address type object.\r
+ */\r
+addr_t const *nwk_getMyAddress(void)\r
+{\r
+  /* This call supports returning a valid pointer before either the\r
+   * initialization or external setting of the address. But caller needs\r
+   * to be careful -- if this routine is called immediately it will return\r
+   * the ROM address. If the application then sets the address using the\r
+   * IOCTL before doing the SMPL_Init() the original pointer is no longer\r
+   * valid as it points to the wrong address.\r
+   */\r
+  return sRAMAddressIsSet ? &sMyRAMAddress : &sMyROMAddress;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_getFWVersion\r
+ *\r
+ * @brief       Return a pointer to the current firmware version string.\r
+ *\r
+ * input parameters\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   pointer to a constant uint16_t object.\r
+ */\r
+uint8_t const *nwk_getFWVersion()\r
+{\r
+  return sVersionInfo.fwVerString;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_getProtocolVersion\r
+ *\r
+ * @brief       Return the current protocol version.\r
+ *\r
+ * input parameters\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   Protocol version.\r
+ */\r
+uint8_t nwk_getProtocolVersion(void)\r
+{\r
+  return sVersionInfo.protocolVersion;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_setMyAddress\r
+ *\r
+ * @brief       Set my address object if it hasn't already been set. This call\r
+ *              is referenced by the IOCTL support used to change the device\r
+ *              address. It is effective only if the address has not already\r
+ *              been set.\r
+ *\r
+ * input parameters\r
+ *\r
+ * @param   addr  - pointer to the address object to be used to set my address.\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   Returns non-zero if request is respected, otherwise returns 0.\r
+ */\r
+uint8_t nwk_setMyAddress(addr_t *addr)\r
+{\r
+  uint8_t rc = 0;\r
+\r
+  if (!sRAMAddressIsSet)\r
+  {\r
+    memcpy(&sMyRAMAddress, addr, sizeof(addr_t));\r
+    sRAMAddressIsSet = 1;  /* RAM address is now valid */\r
+    rc = 1;\r
+  }\r
+\r
+  return rc;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_setAPAddress\r
+ *\r
+ * @brief       Set the AP's address. Called after the AP address is gleaned\r
+ *              from the Join reply.\r
+ *\r
+ * input parameters\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   void\r
+ */\r
+void nwk_setAPAddress(addr_t *addr)\r
+{\r
+\r
+  memcpy((void *)&sAPAddress, (void *)addr, NET_ADDR_SIZE);\r
+\r
+  return;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_getAPAddress\r
+ *\r
+ * @brief       Get the AP's address.\r
+ *\r
+ * input parameters\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   Pointer to a constant address object or null if the address has not\r
+ *           yet been set.\r
+ */\r
+addr_t const *nwk_getAPAddress(void)\r
+{\r
+  addr_t addr;\r
+\r
+  memset(&addr, 0x0, sizeof(addr));\r
+\r
+  return !memcmp(&sAPAddress, &addr, NET_ADDR_SIZE) ? 0 : &sAPAddress;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_getBCastAddress\r
+ *\r
+ * @brief       Get the network broadcast address.\r
+ *\r
+ * input parameters\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   Pointer to a constant address object.\r
+ */\r
+addr_t const *nwk_getBCastAddress(void)\r
+{\r
+  return (addr_t const *)mrfiBroadcastAddr;\r
+}\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/Components/nwk/nwk_globals.h b/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/Components/nwk/nwk_globals.h
new file mode 100755 (executable)
index 0000000..728c2ab
--- /dev/null
@@ -0,0 +1,51 @@
+/**************************************************************************************************\r
+  Filename:       nwk_globals.h\r
+  Revised:        $Date: 2008-07-30 11:22:21 -0700 (Wed, 30 Jul 2008) $\r
+  Revision:       $Revision: 17655 $\r
+  Author:         $Author: lfriedman $\r
+\r
+  Description:    This header file supports the management of NWK global symbols.\r
+\r
+  Copyright 2004-2007 Texas Instruments Incorporated. All rights reserved.\r
+\r
+  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+  the terms of a software license agreement between the user who downloaded the software,\r
+  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+  License. The License limits your use, and you acknowledge, that the Software may not be\r
+  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+  perform, display or sell this Software and/or its documentation for any purpose.\r
+\r
+  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+\r
+  Should you have any questions regarding your right to use this Software,\r
+  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+#ifndef NWK_GLOBALS_H\r
+#define NWK_GLOBALS_H\r
+\r
+\r
+/* Prototypes */\r
+void           nwk_globalsInit(void);\r
+addr_t const  *nwk_getMyAddress(void);\r
+uint8_t        nwk_setMyAddress(addr_t *addr);\r
+void           nwk_setAPAddress(addr_t *addr);\r
+addr_t const  *nwk_getAPAddress(void);\r
+addr_t const  *nwk_getBCastAddress(void);\r
+uint8_t const *nwk_getFWVersion(void);\r
+uint8_t        nwk_getProtocolVersion(void);\r
+\r
+\r
+#endif\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/Components/nwk/nwk_types.h b/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/Components/nwk/nwk_types.h
new file mode 100755 (executable)
index 0000000..bb277ba
--- /dev/null
@@ -0,0 +1,344 @@
+/**************************************************************************************************\r
+  Filename:       nwk_types.h\r
+  Revised:        $Date: 2009-01-13 11:31:14 -0800 (Tue, 13 Jan 2009) $\r
+  Revision:       $Revision: 18744 $\r
+  Author:         $Author: lfriedman $\r
+\r
+  Description:    This header file defines the SimpliciTI typedefs.\r
+\r
+  Copyright 2004-2007 Texas Instruments Incorporated. All rights reserved.\r
+\r
+  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+  the terms of a software license agreement between the user who downloaded the software,\r
+  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+  License. The License limits your use, and you acknowledge, that the Software may not be\r
+  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+  perform, display or sell this Software and/or its documentation for any purpose.\r
+\r
+  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+\r
+  Should you have any questions regarding your right to use this Software,\r
+  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+#ifndef NWK_TYPES_H\r
+#define NWK_TYPES_H\r
+\r
+#define NWK_TX_RETRY_COUNT    10\r
+#define NWK_RX_RETRY_COUNT    10\r
+\r
+#define NWK_APP_REPLY_BIT  (0x80)\r
+\r
+#define NET_ADDR_SIZE      MRFI_ADDR_SIZE   /* size of address in bytes */\r
+\r
+#ifdef  FREQUENCY_AGILITY\r
+#define NWK_FREQ_TBL_SIZE  MRFI_NUM_LOGICAL_CHANS\r
+#else\r
+#define NWK_FREQ_TBL_SIZE  1\r
+#endif\r
+\r
+typedef struct\r
+{\r
+  uint8_t  addr[NET_ADDR_SIZE];\r
+} addr_t;\r
+\r
+typedef uint8_t linkID_t;\r
+typedef uint8_t ccRadioStatus_t;\r
+\r
+\r
+/*      ***********************************************\r
+ *                   Begin IOCTL Support\r
+ *      ***********************************************\r
+ */\r
+enum ioctlObject  {\r
+  IOCTL_OBJ_FREQ,\r
+  IOCTL_OBJ_CRYPTKEY,\r
+  IOCTL_OBJ_RAW_IO,\r
+  IOCTL_OBJ_RADIO,\r
+  IOCTL_OBJ_AP_JOIN,\r
+  IOCTL_OBJ_ADDR,\r
+  IOCTL_OBJ_CONNOBJ,\r
+  IOCTL_OBJ_FWVER,\r
+  IOCTL_OBJ_PROTOVER,\r
+  IOCTL_OBJ_NVOBJ,\r
+  IOCTL_OBJ_TOKEN\r
+};\r
+\r
+enum ioctlAction  {\r
+  IOCTL_ACT_SET,\r
+  IOCTL_ACT_GET,\r
+  IOCTL_ACT_READ,\r
+  IOCTL_ACT_WRITE,\r
+  IOCTL_ACT_RADIO_SLEEP,\r
+  IOCTL_ACT_RADIO_AWAKE,\r
+  IOCTL_ACT_RADIO_SIGINFO,\r
+  IOCTL_ACT_RADIO_RSSI,\r
+  IOCTL_ACT_RADIO_RXON,\r
+  IOCTL_ACT_RADIO_RXIDLE,\r
+  IOCTL_ACT_RADIO_SETPWR,\r
+  IOCTL_ACT_ON,\r
+  IOCTL_ACT_OFF,\r
+  IOCTL_ACT_SCAN,\r
+  IOCTL_ACT_DELETE\r
+};\r
+\r
+typedef enum ioctlObject   ioctlObject_t;\r
+typedef enum ioctlAction   ioctlAction_t;\r
+\r
+enum ioctlLevel\r
+{\r
+  IOCTL_LEVEL_0,\r
+  IOCTL_LEVEL_1,\r
+  IOCTL_LEVEL_2\r
+};\r
+\r
+typedef enum ioctlLevel ioctlLevel_t;\r
+\r
+typedef struct\r
+{\r
+  addr_t   *addr;\r
+  uint8_t  *msg;\r
+  uint8_t   len;\r
+  uint8_t   port;\r
+} ioctlRawSend_t;\r
+\r
+typedef struct\r
+{\r
+  addr_t  *addr;\r
+  uint8_t *msg;\r
+  uint8_t  len;\r
+  uint8_t  port;\r
+  uint8_t  hopCount;\r
+} ioctlRawReceive_t;\r
+\r
+/*\r
+ * Signal information support\r
+ */\r
+typedef int8_t rssi_t;\r
+\r
+typedef struct\r
+{\r
+  rssi_t  rssi;\r
+  uint8_t lqi;\r
+} rxMetrics_t;\r
+\r
+typedef struct\r
+{\r
+  linkID_t     lid;        /* input: Link ID for which signal info desired */\r
+  rxMetrics_t  sigInfo;\r
+} ioctlRadioSiginfo_t;\r
+\r
+\r
+/*                      *** Begin SET/GET token support ***                */\r
+enum tokenType\r
+{\r
+  TT_LINK,      /* Token Type is Link */\r
+  TT_JOIN       /* Token Type is Join */\r
+};\r
+\r
+typedef enum tokenType tokenType_t;\r
+\r
+/* Create a union. If either token ever changes type it will make things easier. */\r
+typedef union\r
+{\r
+  uint32_t linkToken;\r
+  uint32_t joinToken;\r
+} token_t;\r
+\r
+typedef struct\r
+{\r
+  tokenType_t  tokenType;\r
+  token_t      token;\r
+} ioctlToken_t;\r
+/*                      *** End SET/GET token support ***                */\r
+\r
+\r
+/*\r
+ * Frequency Agility support\r
+ */\r
+typedef struct\r
+{\r
+  uint8_t logicalChan;\r
+} freqEntry_t;\r
+\r
+typedef struct\r
+{\r
+  uint8_t      numChan;\r
+  freqEntry_t *freq;\r
+} ioctlScanChan_t;\r
+\r
+/* Security typedefs to make things easier if they change types */\r
+typedef uint8_t  secMAC_t;\r
+typedef uint8_t  secFCS_t;\r
+\r
+/***************************************************************************************\r
+ *                                 ** NV Object support **\r
+ *\r
+ * The following object supports saving and restoring the information\r
+ * necessary to save and restore a device connection context.\r
+ *\r
+ * On a GET interface populates the IOCTL object with the version and length (in bytes)\r
+ * of the current static connection iformation area. In addition it populates the address\r
+ * pointed to by 'objPtr' with the base address of the connection context. At this point\r
+ * the caller can either copy to or from the address. Note that this is a dangerous\r
+ * interface, as the caller is provided with direct access to the connection context.\r
+ *\r
+ * When restoring the connection context some sanity checks are possible. If the\r
+ * version or length elements of the saved context do not match those of the current\r
+ * static object the static object should not be populated. If this sanity fails the\r
+ * caller is not provided with the pointer to the conneciton ocntext.\r
+ *\r
+ * This interface is fairly simple and it is possible to get the address of the\r
+ * connection context to do a restore by simply doing a GET call. This avoids the\r
+ * sanity checks. However, this is not recommended because there may be other side\r
+ * effects of doing a SET that are necessary when restoring a context and are done\r
+ * only when the proper option is used to restore the connection context.\r
+ *\r
+ *************************************************************************************/\r
+typedef struct\r
+{\r
+  uint8_t    objVersion;\r
+  uint16_t   objLen;\r
+  uint8_t  **objPtr;\r
+} ioctlNVObj_t;\r
+\r
+/*      ***********************************************\r
+ *                    End IOCTL Support\r
+ *      ***********************************************\r
+ */\r
+\r
+enum smplStatus  {\r
+  SMPL_SUCCESS,\r
+  SMPL_TIMEOUT,\r
+  SMPL_BAD_PARAM,\r
+  SMPL_NOMEM,\r
+  SMPL_NO_FRAME,\r
+  SMPL_NO_LINK,\r
+  SMPL_NO_JOIN,\r
+  SMPL_NO_CHANNEL,\r
+  SMPL_NO_PEER_UNLINK,\r
+  SMPL_TX_CCA_FAIL,\r
+  SMPL_NO_PAYLOAD,\r
+  SMPL_NO_AP_ADDRESS,\r
+  SMPL_NO_ACK\r
+};\r
+\r
+typedef enum smplStatus    smplStatus_t;\r
+\r
+/* NWK application frame handling status codes */\r
+enum fhStatus\r
+{\r
+  FHS_RELEASE,   /* handled in interrupt thread */\r
+  FHS_KEEP,      /* handled by background application */\r
+  FHS_REPLAY     /* non-ED case: NWK frame not for me that should be replayed */\r
+};\r
+\r
+typedef enum fhStatus   fhStatus_t;\r
+\r
+/********    BEGIN: Object support for parameter context in queue management *********/\r
+enum rcvType\r
+{\r
+  RCV_NWK_PORT,\r
+  RCV_APP_LID,\r
+  RCV_RAW_POLL_FRAME\r
+};\r
+\r
+typedef enum rcvType rcvType_t;\r
+\r
+/* Tx options type */\r
+typedef  uint16_t   txOpt_t;\r
+\r
+typedef struct\r
+{\r
+  rcvType_t   type;\r
+  union\r
+  {\r
+    linkID_t      lid;\r
+    uint8_t       port;\r
+    mrfiPacket_t *pkt;\r
+  } t;\r
+} rcvContext_t;\r
+/********    END: Object support for parameter context in queue management *********/\r
+\r
+#define SMPL_FWVERSION_SIZE  4\r
+\r
+typedef struct\r
+{\r
+  uint8_t  protocolVersion;\r
+  uint8_t  fwVerString[SMPL_FWVERSION_SIZE];\r
+} smplVersionInfo_t;\r
+\r
+/* The following typedef is used to standardize the application Transaction ID field.\r
+ * This field can be used for detection of out-of-order application payloads if this\r
+ * is an issue. There is no real reason to use more than a byte for this support. But\r
+ * if this typedef is anything other than uint8_t be sure to attend to alignment and\r
+ * endian issues.\r
+ */\r
+typedef uint8_t  appPTid_t;\r
+\r
+#ifdef ACCESS_POINT\r
+/* Store-and-forward client info object */\r
+typedef struct\r
+{\r
+  addr_t    clientAddr;\r
+  appPTid_t lastTID;\r
+} sfClientInfo_t;\r
+\r
+typedef struct\r
+{\r
+  uint8_t        curNumSFClients;\r
+  sfClientInfo_t sfClients[NUM_STORE_AND_FWD_CLIENTS];\r
+} sfInfo_t;\r
+#endif\r
+\r
+/****************************************************************************************\r
+ *                           SOME USEFUL MACROS\r
+ ****************************************************************************************/\r
+\r
+/* Delay loop support. Requires mrfi.h */\r
+#define NWK_DELAY(spin)   MRFI_DelayMs(spin)\r
+#define NWK_REPLY_DELAY() MRFI_ReplyDelay();\r
+\r
+/* Network applications may need to remember radio state because the user\r
+ * application may choose to turn Rx off. These macros help get and restore\r
+ * the radio Rx state. The macros should be in the same code block at the same level.\r
+ * The argument 's' is the 'current' radio state and should be set in the code block\r
+ * with a call to MRFI_GetRadioState() _before_ using the macros.\r
+ *\r
+ * Used extensively by NWK but user applications may use them as well. But it is\r
+ * much more liekly that an application will know the radio state since it likely\r
+ * will have set it with IOCTL calls. Requires mrfi.h.\r
+ */\r
+#define NWK_CHECK_FOR_SETRX(s)  if (MRFI_RADIO_STATE_RX != s)    \\r
+                                {                                \\r
+                                  if (MRFI_RADIO_STATE_OFF == s) \\r
+                                  {                              \\r
+                                    MRFI_WakeUp();               \\r
+                                  }                              \\r
+                                  MRFI_RxOn();                   \\r
+                                }\r
+\r
+#define NWK_CHECK_FOR_RESTORE_STATE(s) if (MRFI_RADIO_STATE_RX != s)    \\r
+                                       {                                \\r
+                                         if (MRFI_RADIO_STATE_OFF == s) \\r
+                                         {                              \\r
+                                           MRFI_Sleep();                \\r
+                                         }                              \\r
+                                         else                           \\r
+                                         {                              \\r
+                                           MRFI_RxIdle();               \\r
+                                         }                              \\r
+                                       }\r
+#endif\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/Components/nwk_applications/nwk_freq.c b/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/Components/nwk_applications/nwk_freq.c
new file mode 100755 (executable)
index 0000000..2a93c39
--- /dev/null
@@ -0,0 +1,619 @@
+/**************************************************************************************************\r
+  Filename:       nwk_freq.c\r
+  Revised:        $Date: 2008-12-10 13:50:46 -0800 (Wed, 10 Dec 2008) $\r
+  Revision:       $Revision: 18594 $\r
+  Author:         $Author: lfriedman $\r
+\r
+  Description:    This file supports the SimpliciTI Freq network application.\r
+\r
+  Copyright 2007-2009 Texas Instruments Incorporated. All rights reserved.\r
+\r
+  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+  the terms of a software license agreement between the user who downloaded the software,\r
+  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+  License. The License limits your use, and you acknowledge, that the Software may not be\r
+  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+  perform, display or sell this Software and/or its documentation for any purpose.\r
+\r
+  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+\r
+  Should you have any questions regarding your right to use this Software,\r
+  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+/******************************************************************************\r
+ * INCLUDES\r
+ */\r
+\r
+#include <string.h>\r
+#include "bsp.h"\r
+#include "mrfi.h"\r
+#include "nwk_types.h"\r
+#include "nwk.h"\r
+#include "nwk_frame.h"\r
+#include "nwk_freq.h"\r
+#include "nwk_globals.h"\r
+#include "nwk_api.h"\r
+#include "nwk_security.h"\r
+\r
+#if defined( FREQUENCY_AGILITY )\r
+/******************************************************************************\r
+ * MACROS\r
+ */\r
+\r
+/******************************************************************************\r
+ * CONSTANTS AND DEFINES\r
+ */\r
+\r
+/******************************************************************************\r
+ * TYPEDEFS\r
+ */\r
+\r
+/******************************************************************************\r
+ * LOCAL VARIABLES\r
+ */\r
+static freqEntry_t      sCurLogicalChan;\r
+static volatile uint8_t sTid = 0;\r
+\r
+/******************************************************************************\r
+ * LOCAL FUNCTIONS\r
+ */\r
+\r
+static fhStatus_t handle_freq_cmd(mrfiPacket_t *);\r
+static fhStatus_t send_ping_reply(mrfiPacket_t *);\r
+#ifndef ACCESS_POINT\r
+static uint8_t change_channel_cmd_is_valid(mrfiPacket_t *);\r
+#endif\r
+#ifdef RANGE_EXTENDER\r
+/* REs must replay frame before changing channels */\r
+static void       replayFirst(mrfiPacket_t *);\r
+#endif\r
+#ifdef ACCESS_POINT\r
+/* only the AP can broadcast this command */\r
+static void broadcast_channel_change(uint8_t);\r
+#else\r
+/* APs do not process this frame */\r
+static void change_channel_cmd(mrfiPacket_t *);\r
+#endif\r
+\r
+/******************************************************************************\r
+ * GLOBAL VARIABLES\r
+ */\r
+\r
+/******************************************************************************\r
+ * GLOBAL FUNCTIONS\r
+ */\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_freqInit\r
+ *\r
+ * @brief       Initialize NWK Frequency application.\r
+ *\r
+ * @return   none.\r
+ */\r
+void nwk_freqInit(void)\r
+{\r
+\r
+  memset(&sCurLogicalChan, 0x0, sizeof(sCurLogicalChan));\r
+\r
+  /* pick a random value to start the transaction ID for this app. */\r
+  sTid = MRFI_RandomByte();\r
+\r
+  return;\r
+}\r
+\r
+/***************************************************************************\r
+ * @fn          nwk_setChannel\r
+ *\r
+ * @brief       Set requested logical channel.  Accessed by application\r
+ *              through IOCTL interface\r
+ *\r
+ * input parameters\r
+ * @param   chan     - pointer to channel object of requested channel\r
+ *\r
+ * @return   status of operation:\r
+ *             SMPL_SUCCESS    if channel set\r
+ *             SMPL_BAD_PARAM  if requested channel is out of range\r
+ */\r
+smplStatus_t nwk_setChannel(freqEntry_t *chan)\r
+{\r
+  smplStatus_t rc = SMPL_BAD_PARAM;\r
+\r
+  if (chan->logicalChan < NWK_FREQ_TBL_SIZE)\r
+  {\r
+    MRFI_SetLogicalChannel(chan->logicalChan);\r
+    sCurLogicalChan = *chan;\r
+    rc = SMPL_SUCCESS;\r
+  }\r
+  return rc;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_getChannel\r
+ *\r
+ * @brief       Get current logical channel. Accessed by application through\r
+ *              IOCTL interface\r
+ *\r
+ * input parameters\r
+ * @param   chan     - pointer to channel object of requested channel\r
+ *\r
+ * output parameters\r
+ * @param   chan     - populated channel object\r
+ *\r
+ * @return   none.\r
+ */\r
+void nwk_getChannel(freqEntry_t *chan)\r
+{\r
+  *chan = sCurLogicalChan;\r
+\r
+  return;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          handle_freq_cmd\r
+ *\r
+ * @brief       Handle a Frequency application command.\r
+ *\r
+ * input parameters\r
+ * @param   frame     - pointer to frame with command context\r
+ *\r
+ * @return   Return FHS_RELEASE if caller should release frame otherwise\r
+ *           return FHS_REPLAY.\r
+ */\r
+static fhStatus_t handle_freq_cmd(mrfiPacket_t *frame)\r
+{\r
+  fhStatus_t rc = FHS_RELEASE;\r
+\r
+  switch (*(MRFI_P_PAYLOAD(frame)+F_APP_PAYLOAD_OS))\r
+  {\r
+    case FREQ_REQ_PING:\r
+      rc = send_ping_reply(frame);\r
+      break;\r
+\r
+#ifndef ACCESS_POINT\r
+    case FREQ_REQ_MOVE:\r
+#ifdef RANGE_EXTENDER\r
+      replayFirst(frame);\r
+#endif\r
+      /* Make sure the change channel Freq command came from\r
+       * a valid source before obeying.\r
+       */\r
+      if (change_channel_cmd_is_valid(frame))\r
+      {\r
+        change_channel_cmd(frame);\r
+      }\r
+      break;\r
+#endif\r
+\r
+#ifdef ACCESS_POINT\r
+    case FREQ_REQ_REQ_MOVE:\r
+      break;\r
+#endif\r
+    default:\r
+      break;\r
+  }\r
+\r
+  return rc;\r
+}\r
+\r
+#ifndef ACCESS_POINT\r
+/******************************************************************************\r
+ * @fn          change_channel_cmd_is_valid\r
+ *\r
+ * @brief       Check validity of a change channel command frame.\r
+ *\r
+ * input parameters\r
+ * @param   frame  - pointer to frame with command context\r
+ *\r
+ * @return   Returns non-zero if command is valid, otherwise returns 0.\r
+ *           Command is valid if either:\r
+ *             - frame is directed\r
+ *             - frame is from an AP and we know about that AP\r
+ *\r
+ *           It is possible that either we don't know about an AP or that\r
+ *           we do but this frame comes from another AP in range.\r
+ */\r
+static uint8_t change_channel_cmd_is_valid(mrfiPacket_t *frame)\r
+{\r
+  uint8_t rc = 0;\r
+  addr_t const *apAddr;\r
+\r
+  /* If this was a directed frame obey the command. */\r
+  if (!memcmp(MRFI_P_DST_ADDR(frame), nwk_getMyAddress(), NET_ADDR_SIZE))\r
+  {\r
+    rc = 1;\r
+  }\r
+  else\r
+  {\r
+    /* Do we know about an AP? If not assume frame bogus. */\r
+    apAddr = nwk_getAPAddress();\r
+    if (apAddr)\r
+    {\r
+      /* Yes, we know about an AP. Is that who sent it? */\r
+      if (!memcmp(apAddr, MRFI_P_SRC_ADDR(frame), NET_ADDR_SIZE))\r
+      {\r
+        /* OK. We obey. */\r
+        rc = 1;\r
+      }\r
+    }\r
+  }\r
+\r
+  return rc;\r
+}\r
+#endif   /* !ACCESS_POINT */\r
+\r
+#ifdef RANGE_EXTENDER\r
+/******************************************************************************\r
+ * @fn          replayFirst\r
+ *\r
+ * @brief       Range Extenders must replay the change-channel boradcast\r
+ *              frame before actually changing its own channel.\r
+ *\r
+ * input parameters\r
+ * @param   frame     - pointer to frame with command context\r
+ *\r
+ * @return   void\r
+ */\r
+\r
+/* This routine takes care of some awkwardness. From the dispatch thread all\r
+ * we have is a pointer to the mrfiPacket_t element in the frame buffer into\r
+ * which the frame was retrieved. But to call the replay routine we need the\r
+ * entire frame information structure frameInfo_t. This routine regenerates\r
+ * the frame information structure pointer and then calls the replay routine.\r
+ *\r
+ * This approach requires that the disptach thread guarantee that it will\r
+ * always pass a pointer to the mrfiPacket_t structure in the frame\r
+ * information structure and not a copy of the mrfipacket_t element. It is\r
+ * either the approach here or change all the NWK application dispatch routine\r
+ * argument types. This latter has the downside of interfering with any\r
+ * user-implemented NWK applications. It also needlessly complicates the argument\r
+ * handling: except for this instance all any routine needs is the mrfiPacket_t\r
+ * pointer.\r
+ */\r
+static void replayFirst(mrfiPacket_t *frame)\r
+{\r
+  frameInfo_t *fiptr;\r
+  uint16_t     offset = (uint16_t)&(((frameInfo_t *)0)->mrfiPkt);\r
+\r
+  fiptr = (frameInfo_t *)(((uint8_t *)frame) - ((uint8_t *)offset));\r
+\r
+  nwk_replayFrame(fiptr);\r
+\r
+  return;\r
+}\r
+#endif  /* RANGE_EXTENDER */\r
+\r
+#ifndef ACCESS_POINT\r
+/********************************************************************************\r
+ * @fn          change_channel_cmd\r
+ *\r
+ * @brief       Change to channel specified in received frame. Polling devices\r
+ *              might be awake when the broadcast occurs but we want the channel\r
+ *              change recovery to occur in a disciplined manner using the\r
+ *              polling code. Also, with certain Test sceanrios in which a\r
+ *              sleeping device is emulated we want to emulate 'missing' the\r
+ *              broadcast change-channel command.\r
+ *\r
+ * input parameters\r
+ * @param   frame     - pointer to frame containing target logical channel.\r
+ *\r
+ * @return   none.\r
+ */\r
+static void change_channel_cmd(mrfiPacket_t *frame)\r
+{\r
+#if !defined( RX_POLLS )\r
+  freqEntry_t chan;\r
+\r
+  chan.logicalChan = *(MRFI_P_PAYLOAD(frame)+F_APP_PAYLOAD_OS+F_CHAN_OS);\r
+\r
+  nwk_setChannel(&chan);\r
+#endif\r
+  return;\r
+}\r
+#endif  /* !ACCESS_POINT */\r
+\r
+/******************************************************************************\r
+ * @fn          send_ping_reply\r
+ *\r
+ * @brief       Send Frequency application ping reply.\r
+ *\r
+ * input parameters\r
+ * @param   frame     - pointer to frame from pinger.\r
+ *\r
+ * @return   FHS_RELEASE unless this isn't an Access Point. In this case for\r
+ *           flow to et this far it is a Range Extender, so replay the frame\r
+ *           by returning FHW_REPLAY\r
+ */\r
+static fhStatus_t send_ping_reply(mrfiPacket_t *frame)\r
+{\r
+#ifdef ACCESS_POINT\r
+  uint8_t      msg[FREQ_REQ_PING_FRAME_SIZE];\r
+  frameInfo_t *pOutFrame;\r
+\r
+  /* original request with reply bit on */\r
+  msg[FB_APP_INFO_OS] = *(MRFI_P_PAYLOAD(frame)+F_APP_PAYLOAD_OS) | NWK_APP_REPLY_BIT;\r
+  msg[FB_TID_OS]      = *(MRFI_P_PAYLOAD(frame)+F_APP_PAYLOAD_OS+FB_TID_OS);\r
+\r
+  if (pOutFrame = nwk_buildFrame(SMPL_PORT_FREQ, msg, sizeof(msg), MAX_HOPS_FROM_AP))\r
+  {\r
+    /* destination address is the source address of the received frame. */\r
+    memcpy(MRFI_P_DST_ADDR(&pOutFrame->mrfiPkt), MRFI_P_SRC_ADDR(frame), NET_ADDR_SIZE);\r
+    /* must use transaction ID of source frame */\r
+    PUT_INTO_FRAME(MRFI_P_PAYLOAD(&pOutFrame->mrfiPkt), F_TRACTID_OS, (GET_FROM_FRAME(MRFI_P_PAYLOAD(frame), F_TRACTID_OS)));\r
+#ifdef SMPL_SECURE\r
+    nwk_setSecureFrame(&pOutFrame->mrfiPkt, sizeof(msg), 0);\r
+#endif  /* SMPL_SECURE */\r
+    nwk_sendFrame(pOutFrame, MRFI_TX_TYPE_FORCED);\r
+  }\r
+\r
+  return FHS_RELEASE;\r
+#else\r
+  return FHS_REPLAY;\r
+#endif  /* ACCESS_POINT */\r
+}\r
+\r
+/****************************************************************************************\r
+ * @fn          nwk_processFreq\r
+ *\r
+ * @brief       Process a Frequency application frame.\r
+ *\r
+ * input parameters\r
+ * @param   frame     - pointer to frame\r
+ *\r
+ * @return   Disposition for frame: either release (FHS_RELEASE) or replay (FHS_REPLAY).\r
+ */\r
+fhStatus_t nwk_processFreq(mrfiPacket_t *frame)\r
+{\r
+  fhStatus_t rc = FHS_RELEASE;\r
+  uint8_t    replyType;\r
+\r
+  /* Make sure this is a reply and see if we sent this. Validate the\r
+   * packet for reception by client app.\r
+   */\r
+  if (SMPL_MY_REPLY == (replyType=nwk_isValidReply(frame, sTid, FB_APP_INFO_OS, FB_TID_OS)))\r
+  {\r
+    /* It's a match and it's a reply. Validate the received packet by\r
+     * returning a 1 so it can be received by the client app.\r
+     */\r
+    MRFI_PostKillSem();\r
+    rc = FHS_KEEP;\r
+  }\r
+#if !defined( END_DEVICE )\r
+  else if (SMPL_A_REPLY == replyType)\r
+  {\r
+    /* no match. if i'm not an ED this is a reply that should be passed on. */\r
+    rc = FHS_REPLAY;\r
+  }\r
+#endif  /* !END_DEVICE */\r
+  else if (SMPL_NOT_REPLY == replyType)\r
+  {\r
+    rc = handle_freq_cmd(frame);\r
+  }\r
+\r
+  return rc;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_scanForChannels\r
+ *\r
+ * @brief       Scan for channels by sending a ping frame on each channel in the\r
+ *              channel table and listen for a reply.\r
+ *\r
+ * input parameters\r
+ * @param  channels    - pointer to area to receive list of channels from which\r
+ *                       ping replies were received.\r
+ *\r
+ * output parameters\r
+ * @param   channels   - populated list of channels.\r
+ *\r
+ * @return   statuis of operation..\r
+ */\r
+uint8_t nwk_scanForChannels(freqEntry_t *channels)\r
+{\r
+  uint8_t      msg[FREQ_REQ_PING_FRAME_SIZE], i, num=0, notBcast = 1;\r
+  addr_t      *apAddr, retAddr;\r
+  uint8_t      radioState = MRFI_GetRadioState();\r
+  freqEntry_t  chan;\r
+  freqEntry_t  curChan;\r
+\r
+  union\r
+  {\r
+    ioctlRawSend_t    send;\r
+    ioctlRawReceive_t recv;\r
+  } ioctl_info;\r
+\r
+  nwk_getChannel(&curChan);\r
+\r
+  /* send to AP. If we don't know AP address, broadcast. */\r
+  apAddr = (addr_t *)nwk_getAPAddress();\r
+  if (!apAddr)\r
+  {\r
+    apAddr = (addr_t *)nwk_getBCastAddress();\r
+    notBcast = 0;\r
+  }\r
+\r
+  for (i=0; i<NWK_FREQ_TBL_SIZE; ++i)\r
+  {\r
+    chan.logicalChan = i;\r
+\r
+    nwk_setChannel(&chan);\r
+\r
+    ioctl_info.send.addr = apAddr;\r
+    ioctl_info.send.msg  = msg;\r
+    ioctl_info.send.len  = sizeof(msg);\r
+    ioctl_info.send.port = SMPL_PORT_FREQ;\r
+\r
+    msg[FB_APP_INFO_OS] = FREQ_REQ_PING;\r
+    msg[FB_TID_OS]      = sTid;\r
+\r
+    SMPL_Ioctl(IOCTL_OBJ_RAW_IO, IOCTL_ACT_WRITE, &ioctl_info.send);\r
+\r
+    ioctl_info.recv.port = SMPL_PORT_FREQ;\r
+    ioctl_info.recv.msg  = msg;\r
+    ioctl_info.recv.addr = &retAddr;\r
+\r
+    NWK_CHECK_FOR_SETRX(radioState);\r
+    NWK_REPLY_DELAY();\r
+    NWK_CHECK_FOR_RESTORE_STATE(radioState);\r
+\r
+    if (SMPL_SUCCESS == SMPL_Ioctl(IOCTL_OBJ_RAW_IO, IOCTL_ACT_READ, &ioctl_info.recv))\r
+    {\r
+      /* Once we know the Access Point we're related to we only accept\r
+       * ping replies from that one.\r
+       */\r
+      if (!notBcast || (notBcast && !memcmp(&retAddr, apAddr, NET_ADDR_SIZE)))\r
+      {\r
+        channels[num++].logicalChan = i;\r
+      }\r
+    }\r
+\r
+    sTid++;\r
+    if (num && notBcast)\r
+    {\r
+      /* we're done...only one possible channel if we know the AP address. */\r
+      break;\r
+    }\r
+    /* TODO: process encryption stuff */\r
+  }\r
+\r
+  /* reset original channel */\r
+  nwk_setChannel(&curChan);\r
+\r
+  return num;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_freqControl\r
+ *\r
+ * @brief       Handle application requests received through IOCTL interface.\r
+ *\r
+ * input parameters\r
+ * @param   action  - requested action\r
+ * @param   val     - pointer to parameters required/returned for action\r
+ *\r
+ * output parameters\r
+ * @param   val   - populated values if action was a retrieval action.\r
+ *\r
+ * @return   status of operation.\r
+ */\r
+smplStatus_t nwk_freqControl(ioctlAction_t action, void *val)\r
+{\r
+  smplStatus_t rc;\r
+\r
+  switch (action)\r
+  {\r
+    case IOCTL_ACT_SET:\r
+#ifdef ACCESS_POINT\r
+      broadcast_channel_change(((freqEntry_t *)val)->logicalChan);\r
+#endif  /* ACCESS_POINT */\r
+      rc = nwk_setChannel((freqEntry_t *)val);\r
+      break;\r
+\r
+    case IOCTL_ACT_GET:\r
+      nwk_getChannel((freqEntry_t *)val);\r
+      rc = SMPL_SUCCESS;\r
+      break;\r
+\r
+    case IOCTL_ACT_SCAN:\r
+      {\r
+        ioctlScanChan_t *sc = (ioctlScanChan_t *)val;\r
+\r
+        sc->numChan = nwk_scanForChannels(sc->freq);\r
+        rc = SMPL_SUCCESS;\r
+      }\r
+      break;\r
+\r
+    default:\r
+      rc = SMPL_BAD_PARAM;\r
+      break;\r
+  }\r
+\r
+  return rc;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          broadcast_channel_change\r
+ *\r
+* @brief       For Access Point only: broadcast a channel change frame.\r
+ *\r
+ * input parameters\r
+ * @param   idx  -  index into channel table of new (logical) channel\r
+ *\r
+ * @return   none.\r
+ */\r
+#ifdef ACCESS_POINT\r
+#define CC_REDUNDANCY      1   /* Change-channel redundancy count */\r
+static void broadcast_channel_change(uint8_t idx)\r
+{\r
+  ioctlRawSend_t send;\r
+  uint8_t        msg[FREQ_REQ_MOVE_FRAME_SIZE];\r
+  uint8_t        repeat = CC_REDUNDANCY;\r
+\r
+  if (idx >= NWK_FREQ_TBL_SIZE)\r
+  {\r
+    return;\r
+  }\r
+\r
+  msg[FB_APP_INFO_OS] = FREQ_REQ_MOVE;\r
+  msg[F_CHAN_OS]      = idx;\r
+\r
+  send.addr = (addr_t *)nwk_getBCastAddress();\r
+  send.msg  = msg;\r
+  send.len  = sizeof(msg);\r
+  send.port = SMPL_PORT_FREQ;\r
+\r
+  SMPL_Ioctl(IOCTL_OBJ_RAW_IO, IOCTL_ACT_WRITE, &send);\r
+  /* Redundancy addresses the fact that an RE (or any always-listening\r
+   * device) might miss the command\r
+   */\r
+  while (repeat--)\r
+  {\r
+    NWK_DELAY(250);\r
+    SMPL_Ioctl(IOCTL_OBJ_RAW_IO, IOCTL_ACT_WRITE, &send);\r
+  }\r
+}\r
+#endif  /* ACCESS_POINT */\r
+\r
+#else  /* FREQUENCY_AGILITY */\r
+\r
+/**********************************************************************************\r
+ * @fn          nwk_freqInit\r
+ *\r
+ * @brief       Initialize NWK Frequency application. Stub when Frequency Agility\r
+ *              not supported.\r
+ *\r
+ * @return   none.\r
+ */\r
+void nwk_freqInit(void)\r
+{\r
+  return;\r
+}\r
+\r
+/****************************************************************************************\r
+ * @fn          nwk_processFreq\r
+ *\r
+ * @brief       Process a Frequency application frame. Stub when Frequency Agility\r
+ *              not supported.\r
+ *\r
+ * input parameters\r
+ * @param   frame     - pointer to frame\r
+ *\r
+ * @return   Disposition for frame: either release (FHS_RELEASE) or replay (FHS_REPLAY).\r
+ */\r
+fhStatus_t nwk_processFreq(mrfiPacket_t *frame)\r
+{\r
+  return FHS_RELEASE;\r
+}\r
+\r
+#endif  /* FREQUENCY_AGILITY */\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/Components/nwk_applications/nwk_freq.h b/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/Components/nwk_applications/nwk_freq.h
new file mode 100755 (executable)
index 0000000..4cc5f11
--- /dev/null
@@ -0,0 +1,72 @@
+/**************************************************************************************************\r
+  Filename:       nwk_freq.h\r
+  Revised:        $Date: 2008-05-06 16:48:33 -0700 (Tue, 06 May 2008) $\r
+  Revision:       $Revision: 17025 $\r
+  Author:         $Author: lfriedman $\r
+\r
+  Description:    This header file supports the SimpliciTI Freq network application.\r
+\r
+  Copyright 2004-2007 Texas Instruments Incorporated. All rights reserved.\r
+\r
+  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+  the terms of a software license agreement between the user who downloaded the software,\r
+  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+  License. The License limits your use, and you acknowledge, that the Software may not be\r
+  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+  perform, display or sell this Software and/or its documentation for any purpose.\r
+\r
+  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+\r
+  Should you have any questions regarding your right to use this Software,\r
+  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+#ifndef NWK_FREQ_H\r
+#define NWK_FREQ_H\r
+\r
+/* application payload offsets */\r
+/*    both */\r
+#define FB_APP_INFO_OS     0\r
+#define FB_TID_OS          1\r
+\r
+/* Logical channel number for MOVE request. Frame brodcast so no TID\r
+ * is used. Channel number can occupy the TID location. Same offset\r
+ * used for channel change request. No reply to that frame. \r
+ */\r
+#define F_CHAN_OS          1\r
+\r
+/* MGMT frame application requests */\r
+#define  FREQ_REQ_MOVE        0x01\r
+#define  FREQ_REQ_PING        0x02\r
+#define  FREQ_REQ_REQ_MOVE    0x03\r
+\r
+/* change the following as protocol developed */\r
+#define MAX_FREQ_APP_FRAME    2\r
+\r
+/* set the out frame sizes */\r
+#define  FREQ_REQ_MOVE_FRAME_SIZE   2\r
+#define  FREQ_REQ_PING_FRAME_SIZE   2\r
+\r
+/* prototypes */\r
+void         nwk_freqInit(void);\r
+fhStatus_t   nwk_processFreq(mrfiPacket_t *);\r
+#if defined( FREQUENCY_AGILITY )\r
+smplStatus_t nwk_setChannel(freqEntry_t *);\r
+void         nwk_getChannel(freqEntry_t *);\r
+uint8_t      nwk_scanForChannels(freqEntry_t *);\r
+smplStatus_t nwk_freqControl(ioctlAction_t, void *);\r
+#endif\r
+\r
+#endif\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/Components/nwk_applications/nwk_ioctl.c b/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/Components/nwk_applications/nwk_ioctl.c
new file mode 100755 (executable)
index 0000000..0dcd14a
--- /dev/null
@@ -0,0 +1,349 @@
+\r
+/**************************************************************************************************\r
+  Filename:       nwk_ioctl.c\r
+  Revised:        $Date: 2009-01-13 11:31:14 -0800 (Tue, 13 Jan 2009) $\r
+  Revision:       $Revision: 18744 $\r
+  Author:         $Author: lfriedman $\r
+\r
+  Description:    This file supports the SimpliciTI IOCTL implmentation. This interface\r
+                  gives applications access to the "driver" network level functions\r
+                  when necessary.\r
+\r
+  Copyright 2004-2007 Texas Instruments Incorporated. All rights reserved.\r
+\r
+  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+  the terms of a software license agreement between the user who downloaded the software,\r
+  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+  License. The License limits your use, and you acknowledge, that the Software may not be\r
+  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+  perform, display or sell this Software and/or its documentation for any purpose.\r
+\r
+  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+\r
+  Should you have any questions regarding your right to use this Software,\r
+  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+\r
+/******************************************************************************\r
+ * INCLUDES\r
+ */\r
+#include <string.h>\r
+#include "bsp.h"\r
+#include "mrfi.h"\r
+#include "nwk_types.h"\r
+#include "nwk_frame.h"\r
+#include "nwk.h"\r
+#include "nwk_ioctl.h"\r
+#include "nwk_globals.h"\r
+#include "nwk_security.h"\r
+#ifdef ACCESS_POINT\r
+#include "nwk_join.h"\r
+#endif\r
+\r
+/******************************************************************************\r
+ * MACROS\r
+ */\r
+\r
+/******************************************************************************\r
+ * CONSTANTS AND DEFINES\r
+ */\r
+\r
+/******************************************************************************\r
+ * TYPEDEFS\r
+ */\r
+\r
+/******************************************************************************\r
+ * LOCAL VARIABLES\r
+ */\r
+\r
+/******************************************************************************\r
+ * LOCAL FUNCTIONS\r
+ */\r
+\r
+/******************************************************************************\r
+ * GLOBAL VARIABLES\r
+ */\r
+\r
+/******************************************************************************\r
+ * GLOBAL FUNCTIONS\r
+ */\r
+\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_rawSend\r
+ *\r
+ * @brief       Builds an outut frame based on information provided by the\r
+ *              caller. This function allows a raw transmission to the target\r
+ *              if the network address is known. this function is used a lot\r
+ *              to support NWK applications.\r
+ *\r
+ * input parameters\r
+ * @param   info    - pointer to strcuture containing info on how to build\r
+ *                    the outgoing frame.\r
+ * output parameters\r
+ *\r
+ * @return         SMPL_SUCCESS\r
+ *                 SMPL_NOMEM       - no room in output frame queue\r
+ *                 SMPL_TX_CCA_FAIL - CCA failure\r
+ */\r
+smplStatus_t nwk_rawSend(ioctlRawSend_t *info)\r
+{\r
+  frameInfo_t *pOutFrame;\r
+  uint8_t      hops;\r
+\r
+  /* If we know frame is going to or from the AP then we can reduce the hop\r
+   * count.\r
+   */\r
+  switch (info->port)\r
+  {\r
+    case SMPL_PORT_JOIN:\r
+    case SMPL_PORT_FREQ:\r
+    case SMPL_PORT_MGMT:\r
+      hops = MAX_HOPS_FROM_AP;\r
+      break;\r
+\r
+    default:\r
+      hops = MAX_HOPS;\r
+      break;\r
+  }\r
+\r
+  if (pOutFrame = nwk_buildFrame(info->port, info->msg, info->len, hops))\r
+  {\r
+    memcpy(MRFI_P_DST_ADDR(&pOutFrame->mrfiPkt), info->addr, NET_ADDR_SIZE);\r
+#ifdef SMPL_SECURE\r
+    nwk_setSecureFrame(&pOutFrame->mrfiPkt, info->len, 0);\r
+#endif  /* SMPL_SECURE */\r
+    return nwk_sendFrame(pOutFrame, MRFI_TX_TYPE_CCA);\r
+  }\r
+  return SMPL_NOMEM;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_rawReceive\r
+ *\r
+ * @brief       Retriievs specified from from the input frame queue. Additional\r
+ *              information such as source address and hop count may also be\r
+ *              retrieved\r
+ *\r
+ * input parameters\r
+ * @param   info    - pointer to structure containing info on what to retrieve\r
+ *\r
+ * output parameters - actually populated by nwk_retrieveFrame()\r
+ *      info->msg      - application payload copied here\r
+ *      info->len      - length of received application payload\r
+ *      info->addr     - if non-NULL points to memory to be populated with\r
+ *                       source address of retrieved frame.\r
+ *      info->hopCount - if non-NULL points to memory to be populated with\r
+ *                       hop count of retrieved frame.\r
+ *\r
+ * @return   Status of operation.\r
+ */\r
+smplStatus_t nwk_rawReceive(ioctlRawReceive_t *info)\r
+{\r
+  rcvContext_t rcv;\r
+\r
+  rcv.type   = RCV_NWK_PORT;\r
+  rcv.t.port = info->port;\r
+\r
+  return nwk_retrieveFrame(&rcv, info->msg, &info->len, info->addr, &info->hopCount);\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_radioControl\r
+ *\r
+ * @brief       Handle radio control functions.\r
+ *\r
+ * input parameters\r
+ * @param   action   - radio operation to perform. currently suppoerted:\r
+ *                         sleep/unsleep\r
+ * output parameters\r
+ *\r
+ * @return   Status of operation.\r
+ */\r
+smplStatus_t nwk_radioControl(ioctlAction_t action, void *val)\r
+{\r
+  smplStatus_t rc = SMPL_SUCCESS;\r
+\r
+  if (IOCTL_ACT_RADIO_SLEEP == action)\r
+  {\r
+    /* go to sleep mode. */\r
+    MRFI_RxIdle();\r
+    MRFI_Sleep();\r
+  }\r
+  else if (IOCTL_ACT_RADIO_AWAKE == action)\r
+  {\r
+    MRFI_WakeUp();\r
+\r
+#if !defined( END_DEVICE )\r
+    MRFI_RxOn();\r
+#endif\r
+\r
+  }\r
+  else if (IOCTL_ACT_RADIO_SIGINFO == action)\r
+  {\r
+    ioctlRadioSiginfo_t *pSigInfo = (ioctlRadioSiginfo_t *)val;\r
+    connInfo_t          *pCInfo   = nwk_getConnInfo(pSigInfo->lid);\r
+\r
+    if (!pCInfo)\r
+    {\r
+      return SMPL_BAD_PARAM;\r
+    }\r
+    memcpy(&pSigInfo->sigInfo, &pCInfo->sigInfo, sizeof(pCInfo->sigInfo));\r
+  }\r
+  else if (IOCTL_ACT_RADIO_RSSI == action)\r
+  {\r
+    *((rssi_t *)val) = MRFI_Rssi();\r
+  }\r
+  else if (IOCTL_ACT_RADIO_RXON == action)\r
+  {\r
+    MRFI_RxOn();\r
+  }\r
+  else if (IOCTL_ACT_RADIO_RXIDLE == action)\r
+  {\r
+    MRFI_RxIdle();\r
+  }\r
+#ifdef EXTENDED_API\r
+  else if (IOCTL_ACT_RADIO_SETPWR == action)\r
+  {\r
+    uint8_t idx;\r
+\r
+    switch (*(ioctlLevel_t *)val)\r
+    {\r
+      case IOCTL_LEVEL_2:\r
+        idx = 2;\r
+        break;\r
+\r
+      case IOCTL_LEVEL_1:\r
+        idx = 1;\r
+        break;\r
+\r
+      case IOCTL_LEVEL_0:\r
+        idx = 0;\r
+        break;\r
+\r
+      default:\r
+        return SMPL_BAD_PARAM;\r
+    }\r
+    MRFI_SetRFPwr(idx);\r
+    return SMPL_SUCCESS;\r
+  }\r
+#endif  /* EXTENDED_API */\r
+  else\r
+  {\r
+    rc = SMPL_BAD_PARAM;\r
+  }\r
+  return rc;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_joinContext\r
+ *\r
+ * @brief       For Access Points we need a way to support changing the Join\r
+ *              context. This will allow arbitration bewteen potentially nearby\r
+ *              Access Points when a new device is joining.\r
+ *\r
+ * input parameters\r
+ * @param   action  - Join context is either on or off.\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   Status of operation. Currently always succeeds.\r
+ */\r
+#ifdef ACCESS_POINT\r
+smplStatus_t nwk_joinContext(ioctlAction_t action)\r
+{\r
+  nwk_setJoinContext((IOCTL_ACT_ON == action) ? JOIN_CONTEXT_ON : JOIN_CONTEXT_OFF);\r
+\r
+  return SMPL_SUCCESS;\r
+}\r
+#endif\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_deviceAddress\r
+ *\r
+ * @brief       Set or Get this device address. The Set must be done before\r
+ *              SMPL_Init() for it to take effect. The Get is always legal but\r
+ *              the value could be invalid if it is called before a valid set\r
+ *              call is made.\r
+ *\r
+ * input parameters\r
+ * @param   action  - Gte or Set\r
+ * @param   addr    - pointer to address object containing value on Set\r
+ *\r
+ * output parameters\r
+ * @param   addr    - pointer to address object to receive value on Get.\r
+ *\r
+ * @return   SMPL_SUCCESS\r
+ *           SMPL_BAD_PARAM  Action request illegal or a Set request\r
+ *                           was not respected.\r
+ */\r
+smplStatus_t nwk_deviceAddress(ioctlAction_t action, addr_t *addr)\r
+{\r
+  smplStatus_t rc = SMPL_BAD_PARAM;\r
+\r
+  if (IOCTL_ACT_GET == action)\r
+  {\r
+    memcpy(addr, nwk_getMyAddress(), sizeof(addr_t));\r
+    rc = SMPL_SUCCESS;\r
+  }\r
+  else if (IOCTL_ACT_SET == action)\r
+  {\r
+    if (nwk_setMyAddress(addr))\r
+    {\r
+      rc = SMPL_SUCCESS;\r
+    }\r
+  }\r
+\r
+  return rc;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_connectionControl\r
+ *\r
+ * @brief       Access to connection table. Currently supports only deleting\r
+ *              a connection from the table.\r
+ *\r
+ * input parameters\r
+ * @param   action  - Connection control action (only delete is curently valid).\r
+ * @param   val     - pointer to Link ID of connection on which to operate.\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   SMPL_SUCCESS\r
+ *           SMPL_BAD_PARAM  Action is not delete\r
+ *                           Link ID is the UUD Link ID\r
+ *                           No connection table info for Link ID\r
+ */\r
+smplStatus_t nwk_connectionControl(ioctlAction_t action, void *val)\r
+{\r
+  connInfo_t *pCInfo;\r
+  linkID_t    lid = *((linkID_t *)val);\r
+\r
+  if (IOCTL_ACT_DELETE != action)\r
+  {\r
+    return SMPL_BAD_PARAM;\r
+  }\r
+\r
+  if ((SMPL_LINKID_USER_UUD == lid) ||\r
+      (!(pCInfo=nwk_getConnInfo(lid))))\r
+  {\r
+    return SMPL_BAD_PARAM;\r
+  }\r
+\r
+  nwk_freeConnection(pCInfo);\r
+\r
+  return SMPL_SUCCESS;\r
+}\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/Components/nwk_applications/nwk_ioctl.h b/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/Components/nwk_applications/nwk_ioctl.h
new file mode 100755 (executable)
index 0000000..fa5b961
--- /dev/null
@@ -0,0 +1,53 @@
+/**************************************************************************************************\r
+  Filename:       nwk_ioctl.h\r
+  Revised:        $Date: 2008-04-29 15:47:05 -0700 (Tue, 29 Apr 2008) $\r
+  Revision:       $Revision: 16972 $\r
+  Author:         $Author: lfriedman $\r
+\r
+  Description:    This header file supports the SimpliciTI IOCTL implmentation. This interface\r
+                  gives applications access to the "driver" network level functions\r
+                  when necessary.\r
+\r
+  Copyright 2004-2007 Texas Instruments Incorporated. All rights reserved.\r
+\r
+  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+  the terms of a software license agreement between the user who downloaded the software,\r
+  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+  License. The License limits your use, and you acknowledge, that the Software may not be\r
+  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+  perform, display or sell this Software and/or its documentation for any purpose.\r
+\r
+  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+\r
+  Should you have any questions regarding your right to use this Software,\r
+  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+\r
+\r
+#ifndef NWK_IOCTL_H\r
+#define NWK_IOCTL_H\r
+\r
+/* prototypes */\r
+smplStatus_t nwk_rawSend(ioctlRawSend_t *);\r
+smplStatus_t nwk_rawReceive(ioctlRawReceive_t *);\r
+smplStatus_t nwk_radioControl(ioctlAction_t, void *);\r
+smplStatus_t nwk_deviceAddress(ioctlAction_t, addr_t *);\r
+smplStatus_t nwk_connectionControl(ioctlAction_t, void *);\r
+#ifdef ACCESS_POINT\r
+smplStatus_t nwk_joinContext(ioctlAction_t);\r
+#endif\r
+\r
+#endif\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/Components/nwk_applications/nwk_join.c b/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/Components/nwk_applications/nwk_join.c
new file mode 100755 (executable)
index 0000000..b96325f
--- /dev/null
@@ -0,0 +1,583 @@
+/**************************************************************************************************\r
+  Filename:       nwk_join.c\r
+  Revised:        $Date: 2009-01-06 15:45:54 -0800 (Tue, 06 Jan 2009) $\r
+  Revision:       $Revision: 18697 $\r
+\r
+  Description:    This file supports the SimpliciTI Join network application.\r
+\r
+  Copyright 2007-2009 Texas Instruments Incorporated. All rights reserved.\r
+\r
+  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+  the terms of a software license agreement between the user who downloaded the software,\r
+  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+  License. The License limits your use, and you acknowledge, that the Software may not be\r
+  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+  perform, display or sell this Software and/or its documentation for any purpose.\r
+\r
+  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+\r
+  Should you have any questions regarding your right to use this Software,\r
+  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+\r
+/******************************************************************************\r
+ * INCLUDES\r
+ */\r
+#include <string.h>\r
+#include "bsp.h"\r
+#include "mrfi.h"\r
+#include "nwk_types.h"\r
+#include "nwk_api.h"\r
+#include "nwk_frame.h"\r
+#include "nwk.h"\r
+#include "nwk_link.h"\r
+#include "nwk_join.h"\r
+#include "nwk_globals.h"\r
+#include "nwk_freq.h"\r
+#include "nwk_security.h"\r
+#include "nwk_mgmt.h"\r
+\r
+/******************************************************************************\r
+ * MACROS\r
+ */\r
+\r
+/******************************************************************************\r
+ * CONSTANTS AND DEFINES\r
+ */\r
+\r
+/******************************************************************************\r
+ * TYPEDEFS\r
+ */\r
+\r
+/******************************************************************************\r
+ * LOCAL VARIABLES\r
+ */\r
+\r
+static          uint32_t sJoinToken = 0;\r
+static          uint8_t (*spCallback)(linkID_t) = NULL;\r
+static volatile uint8_t  sTid = 0;\r
+\r
+#ifdef ACCESS_POINT\r
+static sfInfo_t *spSandFContext = NULL;\r
+static uint8_t   sJoinOK = 0;\r
+#endif /* ACCESS_POINT */\r
+\r
+/******************************************************************************\r
+ * LOCAL FUNCTIONS\r
+ */\r
+#ifdef ACCESS_POINT\r
+static void     smpl_send_join_reply(mrfiPacket_t *frame);\r
+static uint32_t generateLinkToken(void);\r
+static void     handleJoinRequest(mrfiPacket_t *);\r
+#endif  /*  ACCESS_POINT */\r
+\r
+/******************************************************************************\r
+ * GLOBAL VARIABLES\r
+ */\r
+\r
+/******************************************************************************\r
+ * GLOBAL FUNCTIONS\r
+ */\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_joinInit\r
+ *\r
+ * @brief       Initialize Join application.\r
+ *\r
+ * input parameters\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   void\r
+ */\r
+void nwk_joinInit(uint8_t (*pf)(linkID_t))\r
+{\r
+  if (!sJoinToken) \r
+  {\r
+    sJoinToken = DEFAULT_JOIN_TOKEN;\r
+  }\r
+  \r
+  spCallback = pf;\r
+  (void) spCallback;  /* keep compiler happy if we don't use this */\r
+\r
+  sTid = MRFI_RandomByte() ;\r
+\r
+#ifdef ACCESS_POINT\r
+  /* set link token to something other than deafult if desired */\r
+  nwk_setLinkToken(generateLinkToken());\r
+#if defined(STARTUP_JOINCONTEXT_ON)\r
+  sJoinOK = 1;\r
+#elif defined(STARTUP_JOINCONTEXT_OFF)\r
+  sJoinOK = 0;\r
+#else\r
+#error ERROR: Must define either STARTUP_JOINCONTEXT_ON or STARTUP_JOINCONTEXT_OFF\r
+#endif\r
+  spSandFContext = nwk_getSFInfoPtr();\r
+#endif\r
+\r
+  return;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_setJoinToken\r
+ *\r
+ * @brief       Sets the join token.\r
+ *\r
+ * input parameters\r
+ * @param   token   - join token to be used on this network.\r
+ *\r
+ * output parameters\r
+ *         no room in output queue.\r
+ *\r
+ * @return   void\r
+ */\r
+void nwk_setJoinToken(uint32_t token)\r
+{\r
+  /* only set if the supplied token is non-zero. */\r
+  if (token)\r
+  {\r
+    sJoinToken = token;\r
+  }\r
+\r
+  return;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_getJoinToken\r
+ *\r
+ * @brief       Gets the current join token.\r
+ *\r
+ * input parameters\r
+ *\r
+ * output parameters\r
+ * @param   pToken   - pointer to the returned value.\r
+ *\r
+ * @return   Current link token\r
+ */\r
+void nwk_getJoinToken(uint32_t *pToken)\r
+{\r
+  /* only set if the supplied token is non-zero. */\r
+  if (pToken)\r
+  {\r
+    *pToken = sJoinToken;\r
+  }\r
+\r
+  return;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          generateLinkToken\r
+ *\r
+ * @brief       Generate the link token to be used for the network controlled\r
+ *              by this Access Point.\r
+ *\r
+ * input parameters\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   void\r
+ */\r
+#ifdef ACCESS_POINT\r
+static uint32_t generateLinkToken(void)\r
+{\r
+  return 0xDEADBEEF;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          smpl_send_join_reply\r
+ *\r
+ * @brief       Send the Join reply. Include the Link token. If the device is\r
+ *              a polling sleeper put it into the list of store-and-forward\r
+ *              clients.\r
+ *\r
+ * input parameters\r
+ * @param   frame     - join frame for which a reply is needed...maybe\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   void\r
+ */\r
+static void smpl_send_join_reply(mrfiPacket_t *frame)\r
+{\r
+  frameInfo_t *pOutFrame;\r
+  uint8_t      msg[JOIN_REPLY_FRAME_SIZE];\r
+\r
+  /* Is this a legacy frame? If so continue. Otherwise check verion.*/\r
+  if ((MRFI_GET_PAYLOAD_LEN(frame) - F_APP_PAYLOAD_OS) > JOIN_LEGACY_MSG_LENGTH)\r
+  {\r
+    /* see if protocol version is correct... */\r
+    if (*(MRFI_P_PAYLOAD(frame)+F_APP_PAYLOAD_OS+J_PROTOCOL_VERSION_OS) != nwk_getProtocolVersion())\r
+    {\r
+      /* Accommodation of protocol version differences can be noted or accomplished here.\r
+       * Otherwise, no match and the board goes back\r
+       */\r
+      return;\r
+    }\r
+  }\r
+\r
+\r
+  /* see if join token is correct */\r
+  {\r
+    uint32_t jt;\r
+\r
+    nwk_getNumObjectFromMsg(MRFI_P_PAYLOAD(frame)+F_APP_PAYLOAD_OS+J_JOIN_TOKEN_OS, &jt, sizeof(jt));\r
+    if (jt != sJoinToken)\r
+    {\r
+      return;\r
+    }\r
+  }\r
+\r
+  /* send reply with tid, the link token, and the encryption context */\r
+  {\r
+    uint32_t linkToken;\r
+\r
+    nwk_getLinkToken(&linkToken);\r
+    nwk_putNumObjectIntoMsg((void *)&linkToken, msg+JR_LINK_TOKEN_OS, sizeof(linkToken));\r
+  }\r
+  msg[JR_CRYPTKEY_SIZE_OS] = SEC_CRYPT_KEY_SIZE;\r
+  msg[JB_REQ_OS]           = JOIN_REQ_JOIN | NWK_APP_REPLY_BIT;\r
+  /* sender's tid... */\r
+  msg[JB_TID_OS]           = *(MRFI_P_PAYLOAD(frame)+F_APP_PAYLOAD_OS+JB_TID_OS);\r
+\r
+  if (pOutFrame = nwk_buildFrame(SMPL_PORT_JOIN, msg, sizeof(msg), MAX_HOPS_FROM_AP))\r
+  {\r
+    /* destination address is the source adddress of the received frame. */\r
+    memcpy(MRFI_P_DST_ADDR(&pOutFrame->mrfiPkt), MRFI_P_SRC_ADDR(frame), NET_ADDR_SIZE);\r
+\r
+#ifdef AP_IS_DATA_HUB\r
+    /* if source device supports ED objects save source address to detect duplicate joins */\r
+    if (*(MRFI_P_PAYLOAD(frame)+F_APP_PAYLOAD_OS+J_NUMCONN_OS))\r
+    {\r
+      if (nwk_saveJoinedDevice(frame) && spCallback)\r
+      {\r
+        spCallback(0);\r
+      }\r
+    }\r
+#endif\r
+  }\r
+  else\r
+  {\r
+    /* oops -- no room left for Tx frame. Don't send reply. */\r
+    return;\r
+  }\r
+\r
+  /* If this device polls we need to provide store-and-forward support */\r
+  if (GET_FROM_FRAME(MRFI_P_PAYLOAD(frame),F_RX_TYPE) == F_RX_TYPE_POLLS)\r
+  {\r
+    uint8_t loc;\r
+\r
+    /* Check duplicate status */\r
+    if (!nwk_isSandFClient(MRFI_P_SRC_ADDR(frame), &loc))\r
+    {\r
+      uint8_t        *pNumc   = &spSandFContext->curNumSFClients;\r
+      sfClientInfo_t *pClient = &spSandFContext->sfClients[*pNumc];\r
+\r
+      /* It's not a duplicate. Save it if there's room */\r
+      if (*pNumc < NUM_STORE_AND_FWD_CLIENTS)\r
+      {\r
+        memcpy(pClient->clientAddr.addr, MRFI_P_SRC_ADDR(frame), NET_ADDR_SIZE);\r
+        *pNumc = *pNumc + 1;\r
+      }\r
+      else\r
+      {\r
+        /* No room left. Just return and don't send reply. */\r
+        return;\r
+      }\r
+    }\r
+    else\r
+    {\r
+      /* We get here if it's a duplicate. We drop through and send reply.\r
+       * Reset the S&F marker in the Management application -- we should\r
+       * assume that the Client reset so the TID will be random. If this is\r
+       * simply a duplicate frame it causes no harm.\r
+       */\r
+      nwk_resetSFMarker(loc);\r
+    }\r
+  }\r
+\r
+#ifdef SMPL_SECURE\r
+    nwk_setSecureFrame(&pOutFrame->mrfiPkt, sizeof(msg), 0);\r
+#endif  /* SMPL_SECURE */\r
+\r
+  /* It's not S&F or it is but we're OK to send reply. */\r
+  nwk_sendFrame(pOutFrame, MRFI_TX_TYPE_FORCED);\r
+\r
+  return;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_join\r
+ *\r
+ * @brief       Stub Join function for Access Points.\r
+ *\r
+ * input parameters\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   Always returns SMPL_SUCCESS.\r
+ */\r
+smplStatus_t nwk_join(void)\r
+{\r
+  return SMPL_SUCCESS;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_isSandFClient\r
+ *\r
+ * @brief       Helper function to see if the destination of a frame we have is\r
+ *              one of AP's store-and-forward clients.\r
+ *\r
+ * input parameters\r
+ * @param   fPtr     - pointer to address in frame in question\r
+ *\r
+ * output parameters\r
+ * @param   entLoc   - pointer to receive entry location in array of clients.\r
+ *\r
+ * @return   Returns client info structure pointer if the destination is a\r
+ *           store-and-forward client, else 0.\r
+ */\r
+sfClientInfo_t *nwk_isSandFClient(uint8_t *pAddr, uint8_t *entLoc)\r
+{\r
+  uint8_t i;\r
+  sfClientInfo_t *pSFClient = spSandFContext->sfClients;\r
+\r
+  for (i=0; i<spSandFContext->curNumSFClients; ++i, ++pSFClient)\r
+  {\r
+    if (!memcmp(&pSFClient->clientAddr.addr, pAddr, NET_ADDR_SIZE))\r
+    {\r
+      *entLoc = i;\r
+      return pSFClient;\r
+    }\r
+  }\r
+\r
+  return 0;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_setJoinContext\r
+ *\r
+ * @brief       Helper function to set Join context for Access Point. This will\r
+ *              allow arbitration bewteen potentially nearby Access Points when\r
+ *              a new device is joining.\r
+ *\r
+ * input parameters\r
+ * @param   which   - Join context is either off or on\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   void\r
+ */\r
+void nwk_setJoinContext(uint8_t which)\r
+{\r
+  sJoinOK = (JOIN_CONTEXT_ON == which) ? 1 : 0;\r
+\r
+  return;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          handleJoinRequest\r
+ *\r
+ * @brief       Dispatches handler for specfic join request\r
+ *\r
+ * input parameters\r
+ *\r
+ * @param   frame - Join frame received\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   void\r
+ */\r
+static void handleJoinRequest(mrfiPacket_t *frame)\r
+{\r
+  if (JOIN_LEGACY_MSG_LENGTH == (MRFI_GET_PAYLOAD_LEN(frame) - F_APP_PAYLOAD_OS))\r
+  {\r
+    /* Legacy frame. Spoof a join request */\r
+    *(MRFI_P_PAYLOAD(frame)+F_APP_PAYLOAD_OS) = JOIN_REQ_JOIN;\r
+  }\r
+\r
+  switch (*(MRFI_P_PAYLOAD(frame)+F_APP_PAYLOAD_OS))\r
+  {\r
+    case JOIN_REQ_JOIN:\r
+      smpl_send_join_reply(frame);\r
+      break;\r
+\r
+    default:\r
+      break;\r
+  }\r
+\r
+  return;\r
+}\r
+\r
+#else  /* ACCESS_POINT */\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_join\r
+ *\r
+ * @brief       Join functioanlity for non-AP devices. Send the Join token\r
+ *              and wait for the reply.\r
+ *\r
+ * input parameters\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   Status of operation.\r
+ */\r
+smplStatus_t nwk_join(void)\r
+{\r
+  uint8_t      msg[JOIN_FRAME_SIZE];\r
+  uint32_t     linkToken;\r
+  addr_t       apAddr;\r
+  uint8_t      radioState = MRFI_GetRadioState();\r
+  smplStatus_t rc = SMPL_NO_JOIN;\r
+  union\r
+  {\r
+    ioctlRawSend_t    send;\r
+    ioctlRawReceive_t recv;\r
+  } ioctl_info;\r
+\r
+#if defined( FREQUENCY_AGILITY )\r
+  uint8_t  i, numChan;\r
+  freqEntry_t channels[NWK_FREQ_TBL_SIZE];\r
+\r
+  if (!(numChan=nwk_scanForChannels(channels)))\r
+  {\r
+    return SMPL_NO_CHANNEL;\r
+  }\r
+\r
+  for (i=0; i<numChan; ++i)\r
+  {\r
+    nwk_setChannel(&channels[i]);\r
+#else\r
+  {\r
+#endif\r
+\r
+    ioctl_info.send.addr = (addr_t *)nwk_getBCastAddress();\r
+    ioctl_info.send.msg  = msg;\r
+    ioctl_info.send.len  = sizeof(msg);\r
+    ioctl_info.send.port = SMPL_PORT_JOIN;\r
+\r
+    /* Put join token in */\r
+    nwk_putNumObjectIntoMsg((void *)&sJoinToken, msg+J_JOIN_TOKEN_OS, sizeof(sJoinToken));\r
+    /* set app info byte */\r
+    msg[JB_REQ_OS] = JOIN_REQ_JOIN;\r
+    msg[JB_TID_OS] = sTid;\r
+    /* Set number of connections supported. Used only by AP if it is\r
+     * a data hub.\r
+     */\r
+    msg[J_NUMCONN_OS] = NUM_CONNECTIONS;\r
+    /* protocol version number */\r
+    msg[J_PROTOCOL_VERSION_OS] = nwk_getProtocolVersion();\r
+\r
+    SMPL_Ioctl(IOCTL_OBJ_RAW_IO, IOCTL_ACT_WRITE, &ioctl_info.send);\r
+\r
+    ioctl_info.recv.port = SMPL_PORT_JOIN;\r
+    ioctl_info.recv.msg  = msg;\r
+    ioctl_info.recv.addr = &apAddr;    /* save AP address from reply */\r
+\r
+    NWK_CHECK_FOR_SETRX(radioState);\r
+    NWK_REPLY_DELAY();\r
+    NWK_CHECK_FOR_RESTORE_STATE(radioState);\r
+\r
+    if (SMPL_SUCCESS == SMPL_Ioctl(IOCTL_OBJ_RAW_IO, IOCTL_ACT_READ, &ioctl_info.recv))\r
+    {\r
+      uint8_t firstByte = msg[JB_REQ_OS] & (~NWK_APP_REPLY_BIT);\r
+\r
+      /* Sanity check for correct reply frame. Older version\r
+       * has the length instead of the request as the first byte.\r
+       */\r
+      if ((firstByte == JOIN_REQ_JOIN) ||\r
+          (firstByte == JOIN_REPLY_LEGACY_MSG_LENGTH)\r
+         )\r
+      {\r
+        /* join reply returns link token */\r
+        memcpy(&linkToken, msg+JR_LINK_TOKEN_OS, sizeof(linkToken));\r
+\r
+        nwk_setLinkToken(linkToken);\r
+        /* save AP address */\r
+        nwk_setAPAddress(&apAddr);\r
+        sTid++;   /* guard against duplicates */\r
+        rc = SMPL_SUCCESS;\r
+#if defined( FREQUENCY_AGILITY )\r
+        break;\r
+#endif\r
+      }\r
+    }\r
+    /* TODO: process encryption stuff */\r
+  }\r
+\r
+  return rc;\r
+\r
+}\r
+\r
+#endif /* ACCESS_POINT */\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_processJoin\r
+ *\r
+ * @brief       Processes a Join frame. If this is a reply let it go to the\r
+ *              application. Otherwise generate and send the reply.\r
+ *\r
+ * input parameters\r
+ * @param   frame     - Pointer to Join frame\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   Keep frame for application, release frame, or replay frame.\r
+ */\r
+fhStatus_t nwk_processJoin(mrfiPacket_t *frame)\r
+{\r
+  fhStatus_t rc = FHS_RELEASE;\r
+  uint8_t    replyType;\r
+\r
+  /* Make sure this is a reply and see if we sent this. Validate the\r
+   * packet for reception by client app.\r
+   */\r
+  if (SMPL_MY_REPLY == (replyType=nwk_isValidReply(frame, sTid, JB_REQ_OS, JB_TID_OS)))\r
+  {\r
+    /* It's a match and it's a reply. Validate the received packet by\r
+     * returning a 1 so it can be received by the client app.\r
+     */\r
+    MRFI_PostKillSem();\r
+    rc = FHS_KEEP;\r
+  }\r
+#if defined(ACCESS_POINT)\r
+  else if (SMPL_A_REPLY == replyType)\r
+  {\r
+    /* No match. If I'm not an ED this is a reply that should be passed on. */\r
+    rc = FHS_REPLAY;\r
+  }\r
+  else\r
+  {\r
+    /* Send reply if we're an Access Point otherwise ignore the frame. */\r
+    if ((SMPL_NOT_REPLY == replyType) && sJoinOK)\r
+    {\r
+      handleJoinRequest(frame);\r
+    }\r
+  }\r
+#elif defined(RANGE_EXTENDER)\r
+  else\r
+  {\r
+    /* Either a reply that has to be replayed or a request that\r
+     * also must be replayed.\r
+     */\r
+    rc = FHS_REPLAY;\r
+  }\r
+#endif /* not END_DEVICE */\r
+\r
+  (void) replyType;  /* keep compiler happy */\r
+\r
+  return rc;\r
+}\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/Components/nwk_applications/nwk_join.h b/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/Components/nwk_applications/nwk_join.h
new file mode 100755 (executable)
index 0000000..69ccc36
--- /dev/null
@@ -0,0 +1,91 @@
+/**************************************************************************************************\r
+  Filename:       nwk_join.h\r
+  Revised:        $Date: 2009-01-06 12:26:02 -0800 (Tue, 06 Jan 2009) $\r
+  Revision:       $Revision: 18693 $\r
+  Author:         $Author: lfriedman $\r
+\r
+  Description:    This header file supports the SimpliciTI Join network application.\r
+\r
+  Copyright 2004-2007 Texas Instruments Incorporated. All rights reserved.\r
+\r
+  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+  the terms of a software license agreement between the user who downloaded the software,\r
+  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+  License. The License limits your use, and you acknowledge, that the Software may not be\r
+  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+  perform, display or sell this Software and/or its documentation for any purpose.\r
+\r
+  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+\r
+  Should you have any questions regarding your right to use this Software,\r
+  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+\r
+#ifndef NWK_JOIN_H\r
+#define NWK_JOIN_H\r
+\r
+#define JOIN_CONTEXT_ON  (0x01)\r
+#define JOIN_CONTEXT_OFF (0x02)\r
+\r
+/* Macros needed for protocol backward compatibility */\r
+#define JOIN_LEGACY_MSG_LENGTH        7\r
+#define JOIN_REPLY_LEGACY_MSG_LENGTH  6\r
+\r
+/* place holder... */\r
+#define SEC_CRYPT_KEY_SIZE  0\r
+\r
+/* application payload offsets */\r
+/*    both */\r
+#define JB_REQ_OS                0\r
+#define JB_TID_OS                1\r
+/*    join frame */\r
+#define J_JOIN_TOKEN_OS          2\r
+#define J_NUMCONN_OS             6\r
+#define J_PROTOCOL_VERSION_OS    7\r
+/*    join reply frame */\r
+#define JR_LINK_TOKEN_OS         2\r
+#define JR_CRYPTKEY_SIZE_OS      6\r
+#define JR_CRYPTKEY_OS           7\r
+\r
+/* change the following as protocol developed */\r
+#define MAX_JOIN_APP_FRAME    (JR_CRYPTKEY_OS + SEC_CRYPT_KEY_SIZE)\r
+\r
+/* set out frame size */\r
+#define JOIN_FRAME_SIZE         8\r
+#define JOIN_REPLY_FRAME_SIZE   MAX_JOIN_APP_FRAME\r
+\r
+/* join requests\r
+ * NOTE: If aditional command codes are required do _not_ use the\r
+ *       value JOIN_REPLY_LEGACY_MSG_LENGTH. This numeral is used\r
+ *       to guarantee that legacy Join frames (from before release\r
+ *       1.0.6) work correctly. Don't ask.\r
+ */\r
+#define JOIN_REQ_JOIN       1\r
+\r
+/* prototypes */\r
+void            nwk_joinInit(uint8_t (*)(linkID_t));\r
+smplStatus_t    nwk_join(void);\r
+fhStatus_t      nwk_processJoin(mrfiPacket_t *);\r
+void            nwk_getJoinToken(uint32_t *);\r
+void            nwk_setJoinContext(uint8_t);\r
+void            nwk_setJoinToken(uint32_t);\r
+void            nwk_getJoinToken(uint32_t *);\r
+#ifdef ACCESS_POINT\r
+sfClientInfo_t *nwk_isSandFClient(uint8_t *, uint8_t *);\r
+#endif\r
+\r
+#endif\r
+\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/Components/nwk_applications/nwk_link.c b/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/Components/nwk_applications/nwk_link.c
new file mode 100755 (executable)
index 0000000..c7e2a19
--- /dev/null
@@ -0,0 +1,853 @@
+/**************************************************************************************************\r
+  Filename:       nwk_link.c\r
+  Revised:        $Date: 2008-12-23 13:54:27 -0800 (Tue, 23 Dec 2008) $\r
+  Revision:       $Revision: 18652 $\r
+  Author:         $Author: lfriedman $\r
+\r
+  Description:    This file supports the SimpliciTI Link network application.\r
+\r
+  Copyright 2007-2008 Texas Instruments Incorporated. All rights reserved.\r
+\r
+  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+  the terms of a software license agreement between the user who downloaded the software,\r
+  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+  License. The License limits your use, and you acknowledge, that the Software may not be\r
+  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+  perform, display or sell this Software and/or its documentation for any purpose.\r
+\r
+  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+\r
+  Should you have any questions regarding your right to use this Software,\r
+  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+\r
+/******************************************************************************\r
+ * INCLUDES\r
+ */\r
+\r
+#include <string.h>\r
+#include "bsp.h"\r
+#include "mrfi.h"\r
+#include "nwk_types.h"\r
+#include "nwk_api.h"\r
+#include "nwk_frame.h"\r
+#include "nwk.h"\r
+#include "nwk_link.h"\r
+#include "nwk_globals.h"\r
+#include "nwk_security.h"\r
+\r
+/******************************************************************************\r
+ * MACROS\r
+ */\r
+\r
+/******************************************************************************\r
+ * CONSTANTS AND DEFINES\r
+ */\r
+\r
+/******************************************************************************\r
+ * TYPEDEFS\r
+ */\r
+\r
+/******************************************************************************\r
+ * LOCAL VARIABLES\r
+ */\r
+static uint32_t          sLinkToken = 0;\r
+static volatile uint8_t  sListenActive = 0;\r
+#if NUM_CONNECTIONS > 0\r
+static volatile linkID_t sServiceLinkID[NUM_CONNECTIONS];\r
+#endif\r
+static volatile uint8_t  sNumLinkers = 0;\r
+static volatile uint8_t  sTid = 0;\r
+\r
+/******************************************************************************\r
+ * LOCAL FUNCTIONS\r
+ */\r
+\r
+#define  SENT_REPLY       1\r
+#define  SENT_NO_REPLY    2\r
+static uint8_t    smpl_send_link_reply(mrfiPacket_t *);\r
+static fhStatus_t handleLinkRequest(mrfiPacket_t *);\r
+#if defined(EXTENDED_API)\r
+static void       smpl_send_unlink_reply(mrfiPacket_t *);\r
+#endif\r
+\r
+\r
+/******************************************************************************\r
+ * GLOBAL VARIABLES\r
+ */\r
+\r
+/******************************************************************************\r
+ * GLOBAL FUNCTIONS\r
+ */\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_linkInit\r
+ *\r
+ * @brief       Initialize link app. Set link token to the default.\r
+ *\r
+ * input parameters\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   void\r
+ */\r
+void nwk_linkInit(void)\r
+{\r
+  if (!sLinkToken)\r
+  {\r
+    /* if the link token has not been set externally by the time we get here\r
+     * (such as by the ioctl token-setting interface) assign the default\r
+     */\r
+    sLinkToken = DEFAULT_LINK_TOKEN;\r
+  }\r
+\r
+  /* set a non-zero TID. */\r
+  while (!(sTid = MRFI_RandomByte()))  ;\r
+\r
+#if NUM_CONNECTIONS > 0\r
+  memset((void *)&sServiceLinkID, 0x0, sizeof(sServiceLinkID));\r
+#endif\r
+\r
+  return;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_setLinkToken\r
+ *\r
+ * @brief       Sets the link token received in a Join reply.\r
+ *\r
+ * input parameters\r
+ * @param   token   - Link token to be used on this network to link to any peer.\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   void\r
+ */\r
+void nwk_setLinkToken(uint32_t token)\r
+{\r
+  /* only set if the supplied token is non-zero. */\r
+  if (token)\r
+  {\r
+    sLinkToken = token;\r
+  }\r
+\r
+  return;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_getLinkToken\r
+ *\r
+ * @brief       Gets the current link token.\r
+ *\r
+ * input parameters\r
+ *\r
+ * output parameters\r
+ * @param   pToken   - pointer to the returned value.\r
+ *\r
+ * @return   Current link token\r
+ */\r
+void nwk_getLinkToken(uint32_t *pToken)\r
+{\r
+  /* only set if the supplied token is non-zero. */\r
+  if (pToken)\r
+  {\r
+    *pToken = sLinkToken;\r
+  }\r
+\r
+  return;\r
+}\r
+\r
+#if defined(EXTENDED_API)\r
+/******************************************************************************\r
+ * @fn          nwk_unlink\r
+ *\r
+ * @brief       Called from the application level to tear down a link.\r
+ *\r
+ * input parameters\r
+ *\r
+ * output parameters\r
+ * @param   lid     - Link ID assigned for this link\r
+ *\r
+ * @return   Status of the operation.\r
+ *           SMPL_SUCCESS\r
+ *           SMPL_BAD_PARAM       No connection table entry for this Link ID;\r
+ *                                SMPL_LINKID_USER_UUD not valid since it is not\r
+ *                                connection-based.\r
+ *           SMPL_TIMEOUT         No reply from peer.\r
+ *           SMPL_NO_PEER_UNLINK  Peer did not have a Connection Table entry for me.\r
+ */\r
+smplStatus_t nwk_unlink(linkID_t lid)\r
+{\r
+  uint8_t      msg[UNLINK_FRAME_SIZE];\r
+  connInfo_t  *pCInfo = nwk_getConnInfo(lid);\r
+  smplStatus_t rc     = SMPL_SUCCESS;\r
+  addr_t       addr;\r
+  union\r
+  {\r
+    ioctlRawSend_t    send;\r
+    ioctlRawReceive_t recv;\r
+  } ioctl_info;\r
+\r
+  /* is there connection info? */\r
+   if (!pCInfo || (lid == SMPL_LINKID_USER_UUD))\r
+  {\r
+    return SMPL_BAD_PARAM;\r
+  }\r
+\r
+  /* set request byte */\r
+  msg[LB_REQ_OS] = LINK_REQ_UNLINK;\r
+\r
+  /* set the transaction ID. this allows target to figure out duplicates */\r
+  msg[LB_TID_OS] = sTid;\r
+\r
+  /* remote port to be sent in message to help match connection */\r
+  msg[UL_RMT_PORT_OS] = pCInfo->portRx;\r
+\r
+  /* setup for ioctl raw I/O */\r
+  memcpy(addr.addr, pCInfo->peerAddr, NET_ADDR_SIZE);\r
+  ioctl_info.send.addr = &addr;\r
+  ioctl_info.send.msg  = msg;\r
+  ioctl_info.send.len  = sizeof(msg);\r
+  ioctl_info.send.port = SMPL_PORT_LINK;\r
+\r
+  SMPL_Ioctl(IOCTL_OBJ_RAW_IO, IOCTL_ACT_WRITE, &ioctl_info.send);\r
+\r
+  {\r
+    uint8_t spin       = NWK_RX_RETRY_COUNT;\r
+    uint8_t radioState = MRFI_GetRadioState();\r
+\r
+    ioctl_info.recv.port = SMPL_PORT_LINK;\r
+    ioctl_info.recv.msg  = msg;\r
+    ioctl_info.recv.addr = (addr_t *)0;\r
+\r
+    do\r
+    {\r
+      NWK_CHECK_FOR_SETRX(radioState);\r
+      NWK_REPLY_DELAY();\r
+      NWK_CHECK_FOR_RESTORE_STATE(radioState);\r
+\r
+      if (SMPL_SUCCESS == SMPL_Ioctl(IOCTL_OBJ_RAW_IO, IOCTL_ACT_READ, &ioctl_info.recv))\r
+      {\r
+        if ((msg[LB_REQ_OS] & (~NWK_APP_REPLY_BIT)) == LINK_REQ_UNLINK)\r
+        {\r
+          rc = (smplStatus_t)msg[ULR_RESULT_OS];\r
+          break;\r
+        }\r
+      }\r
+      if (!spin)\r
+      {\r
+        rc = SMPL_TIMEOUT;\r
+        break;\r
+      }\r
+      --spin;\r
+    } while (1);\r
+\r
+   /* it's ok to unconditionally invalidate connection object */\r
+    nwk_freeConnection(pCInfo);\r
+  }\r
+  return rc;\r
+}\r
+#endif  /* EXTENDED_API */\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_link\r
+ *\r
+ * @brief       Called from the application level to accomplish the link\r
+ *\r
+ * input parameters\r
+ *\r
+ * output parameters\r
+ * @param   lid     - pointer to Link ID (port) assigned for this link\r
+ *\r
+ * @return   Status of the operation.\r
+ */\r
+smplStatus_t nwk_link(linkID_t *lid)\r
+{\r
+  uint8_t       msg[LINK_FRAME_SIZE];\r
+  connInfo_t   *pCInfo = nwk_getNextConnection();\r
+  smplStatus_t  rc;\r
+\r
+  if (pCInfo)\r
+  {\r
+    addr_t              addr;\r
+    union\r
+    {\r
+      ioctlRawSend_t    send;\r
+      ioctlRawReceive_t recv;\r
+    } ioctl_info;\r
+\r
+    if (!nwk_allocateLocalRxPort(LINK_SEND, pCInfo))\r
+    {\r
+      nwk_freeConnection(pCInfo);\r
+      return SMPL_NOMEM;\r
+    }\r
+\r
+    memcpy(addr.addr, nwk_getBCastAddress(), NET_ADDR_SIZE);\r
+    ioctl_info.send.addr = &addr;\r
+    ioctl_info.send.msg  = msg;\r
+    ioctl_info.send.len  = sizeof(msg);\r
+    ioctl_info.send.port = SMPL_PORT_LINK;\r
+\r
+    /* Put link token in */\r
+    nwk_putNumObjectIntoMsg((void *)&sLinkToken, msg+L_LINK_TOKEN_OS, sizeof(sLinkToken));\r
+\r
+    /* set port to which the remote device should send */\r
+    msg[L_RMT_PORT_OS] = pCInfo->portRx;\r
+\r
+    /* set the transaction ID. this allows target to figure out duplicates */\r
+    msg[LB_TID_OS] = sTid;\r
+\r
+    /* set my Rx type */\r
+    msg[L_MY_RXTYPE_OS] = nwk_getMyRxType();\r
+\r
+    /* set request byte */\r
+    msg[LB_REQ_OS] = LINK_REQ_LINK;\r
+\r
+    /* protocol version number */\r
+    msg[L_PROTOCOL_VERSION_OS] = nwk_getProtocolVersion();\r
+\r
+#if defined(SMPL_SECURE)\r
+    pCInfo->connTxCTR = MRFI_RandomByte()                   | \\r
+                        ((uint32_t)(MRFI_RandomByte())<<8)  | \\r
+                        ((uint32_t)(MRFI_RandomByte())<<16) | \\r
+                        ((uint32_t)(MRFI_RandomByte())<<24);\r
+\r
+    nwk_putNumObjectIntoMsg((void *)&pCInfo->connTxCTR, (void *)&msg[L_CTR_OS], 4);\r
+#endif\r
+\r
+\r
+    if (SMPL_SUCCESS != (rc=SMPL_Ioctl(IOCTL_OBJ_RAW_IO, IOCTL_ACT_WRITE, &ioctl_info.send)))\r
+    {\r
+      return rc;\r
+    }\r
+\r
+    {\r
+      uint8_t radioState = MRFI_GetRadioState();\r
+\r
+      ioctl_info.recv.port = SMPL_PORT_LINK;\r
+      ioctl_info.recv.msg  = msg;\r
+      ioctl_info.recv.addr = (addr_t *)pCInfo->peerAddr;\r
+\r
+      NWK_CHECK_FOR_SETRX(radioState);\r
+      NWK_REPLY_DELAY();\r
+      NWK_CHECK_FOR_RESTORE_STATE(radioState);\r
+\r
+      if (SMPL_SUCCESS == SMPL_Ioctl(IOCTL_OBJ_RAW_IO, IOCTL_ACT_READ, &ioctl_info.recv))\r
+      {\r
+        uint8_t firstByte = msg[LB_REQ_OS] & (~NWK_APP_REPLY_BIT);\r
+\r
+        /* Sanity check for correct reply frame. Older version\r
+         * has the length instead of the request as the first byte.\r
+         */\r
+        if ((firstByte != LINK_REQ_LINK) &&\r
+            (firstByte != LINK_REPLY_LEGACY_MSG_LENGTH)\r
+           )\r
+        {\r
+          /* invalidate connection object */\r
+          nwk_freeConnection(pCInfo);\r
+          return SMPL_NO_LINK;\r
+\r
+        }\r
+      }\r
+      else\r
+      {\r
+        /* no successful receive */\r
+        nwk_freeConnection(pCInfo);\r
+        return SMPL_TIMEOUT;\r
+      }\r
+\r
+      pCInfo->connState = CONNSTATE_CONNECTED;\r
+      pCInfo->portTx    = msg[LR_RMT_PORT_OS];    /* link reply returns remote port */\r
+      *lid              = pCInfo->thisLinkID;     /* return our local port number */\r
+\r
+      /* Set hop count. If it's a polling device set the count to the\r
+       * distance to the AP. Otherwise, set it to the max less the remaining\r
+       * which will be the path taken for this frame. It will be no worse\r
+       * then tha max and probably will be better.\r
+       */\r
+      if (F_RX_TYPE_POLLS == msg[LR_MY_RXTYPE_OS])\r
+      {\r
+        pCInfo->hops2target = MAX_HOPS_FROM_AP;\r
+      }\r
+      else\r
+      {\r
+        /* Can't really use this trick because the device could move. If the\r
+         * devices are all static this may work unless the initial reception\r
+         * was marginal.\r
+         */\r
+#if defined(DEVICE_DOES_NOT_MOVE)\r
+        pCInfo->hops2target = MAX_HOPS - ioctl_info.recv.hopCount;\r
+#else\r
+        pCInfo->hops2target = MAX_HOPS;\r
+#endif\r
+      }\r
+\r
+#if defined(SMPL_SECURE)\r
+      nwk_getNumObjectFromMsg((void *)&msg[LR_CTR_OS], (void *)&pCInfo->connRxCTR, 4);\r
+#endif\r
+    }\r
+\r
+    /* guard against duplicates... */\r
+    ++sTid;\r
+    if (!sTid)\r
+    {\r
+      sTid = 1;\r
+    }\r
+    return SMPL_SUCCESS;\r
+  }\r
+\r
+  return SMPL_NOMEM;\r
+}\r
+\r
+#if defined(EXTENDED_API)\r
+/******************************************************************************\r
+ * @fn          smpl_send_unlink_reply\r
+ *\r
+ * @brief       Send the unlink reply to the device trying to unlink\r
+ *\r
+ * input parameters\r
+ * @param   frame   - frame received from linker\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   void\r
+ */\r
+static void smpl_send_unlink_reply(mrfiPacket_t *frame)\r
+{\r
+  connInfo_t  *pCInfo;\r
+  frameInfo_t *pOutFrame;\r
+  uint8_t      msg[UNLINK_REPLY_FRAME_SIZE];\r
+  smplStatus_t rc = SMPL_NO_PEER_UNLINK;\r
+\r
+  /* match the remote port and source address with a connection table entry */\r
+  if (pCInfo = nwk_findPeer((addr_t *)MRFI_P_SRC_ADDR(frame), *(MRFI_P_PAYLOAD(frame)+F_APP_PAYLOAD_OS+UL_RMT_PORT_OS)))\r
+  {\r
+    /* Note we unconditionally free the connection resources */\r
+    nwk_freeConnection(pCInfo);\r
+    rc = SMPL_SUCCESS;\r
+  }\r
+\r
+  /* set reply bit */\r
+  msg[LB_REQ_OS] = LINK_REQ_UNLINK | NWK_APP_REPLY_BIT;\r
+\r
+  /* sender's TID */\r
+  msg[LB_TID_OS] = *(MRFI_P_PAYLOAD(frame)+F_APP_PAYLOAD_OS+LB_TID_OS);\r
+\r
+  /* result of freeing local connection */\r
+  msg[ULR_RESULT_OS] = rc;\r
+\r
+  if (pOutFrame = nwk_buildFrame(SMPL_PORT_LINK, msg, sizeof(msg), MAX_HOPS))\r
+  {\r
+    /* destination address is the source adddress of the received frame. */\r
+    memcpy(MRFI_P_DST_ADDR(&pOutFrame->mrfiPkt), MRFI_P_SRC_ADDR(frame), NET_ADDR_SIZE);\r
+#if defined(SMPL_SECURE)\r
+    nwk_setSecureFrame(&pOutFrame->mrfiPkt, sizeof(msg), 0);\r
+#endif  /* SMPL_SECURE */\r
+    nwk_sendFrame(pOutFrame, MRFI_TX_TYPE_FORCED);\r
+  }\r
+}\r
+#endif  /* EXTENDED_API */\r
+\r
+/******************************************************************************\r
+ * @fn          smpl_send_link_reply\r
+ *\r
+ * @brief       Send the link reply to the device trying to link. This routine\r
+ *              will handle duplicates.\r
+ *\r
+ * input parameters\r
+ * @param   frame   - frame received from linker\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   Returns SENT_REPLY if reply sent, else SENT_NO_REPLY.\r
+ *           The return value is used as this routine unwinds to know\r
+ *           whether to replay the frame. An RE or AP can host an ED\r
+ *           object in which case it might send a reply (possibly from\r
+ *           a duplicate frame). If we do reply we do not want to replay.\r
+ */\r
+static uint8_t smpl_send_link_reply(mrfiPacket_t *frame)\r
+{\r
+#if NUM_CONNECTIONS > 0\r
+  frameInfo_t *pOutFrame;\r
+  connInfo_t  *pCInfo;\r
+  uint8_t      remotePort;\r
+  uint8_t      msg[LINK_REPLY_FRAME_SIZE];\r
+\r
+  /* Is this a legacy frame? If so continue. Otherwise check version.*/\r
+  if ((MRFI_GET_PAYLOAD_LEN(frame) - F_APP_PAYLOAD_OS) > LINK_LEGACY_MSG_LENGTH)\r
+  {\r
+    /* see if protocol version is correct... */\r
+    if (*(MRFI_P_PAYLOAD(frame)+F_APP_PAYLOAD_OS+L_PROTOCOL_VERSION_OS) != nwk_getProtocolVersion())\r
+    {\r
+      /* Accommodation of protocol version differences can be noted or accomplished here.\r
+       * This field was also checked in the join transaction but it is checked again here\r
+       * because that check may not have occurred if thre is no AP in this topology.\r
+       * Otherwise, no match and the board goes back\r
+       */\r
+      return SENT_NO_REPLY;\r
+    }\r
+  }\r
+\r
+  /* see if token is correct */\r
+  {\r
+    uint32_t lt;\r
+\r
+    nwk_getNumObjectFromMsg(MRFI_P_PAYLOAD(frame)+F_APP_PAYLOAD_OS+L_LINK_TOKEN_OS, &lt, sizeof(lt));\r
+    if (lt != sLinkToken)\r
+    {\r
+      return SENT_NO_REPLY;\r
+    }\r
+  }\r
+\r
+  /* if we get here the token matched. */\r
+\r
+  /* is this a duplicate request? */\r
+  remotePort = *(MRFI_P_PAYLOAD(frame)+F_APP_PAYLOAD_OS+L_RMT_PORT_OS);\r
+  if (pCInfo=nwk_isLinkDuplicate(MRFI_P_SRC_ADDR(frame), remotePort))\r
+  {\r
+    /* resend reply */\r
+    msg[LB_REQ_OS] = LINK_REQ_LINK | NWK_APP_REPLY_BIT;\r
+\r
+    /* sender's TID */\r
+    msg[LB_TID_OS] = *(MRFI_P_PAYLOAD(frame)+F_APP_PAYLOAD_OS+LB_TID_OS);\r
+\r
+    /* Send reply with the local port number so the remote device knows where to\r
+     * send packets.\r
+     */\r
+    msg[LR_RMT_PORT_OS] = pCInfo->portRx;\r
+\r
+    /* put my Rx type in there. used to know how to set hops when sending back. */\r
+    msg[LR_MY_RXTYPE_OS] = nwk_getMyRxType();\r
+#if defined(SMPL_SECURE)\r
+    /* Set the Tx counter value for peer's Rx counter object */\r
+    nwk_putNumObjectIntoMsg((void *)&pCInfo->connTxCTR, (void *)&msg[LR_CTR_OS], 4);\r
+    /* We also need to save the newly generated Rx counter value. */\r
+    nwk_getNumObjectFromMsg((void *)(MRFI_P_PAYLOAD(frame)+F_APP_PAYLOAD_OS+L_CTR_OS), (void *)&pCInfo->connRxCTR, 4);\r
+#endif\r
+    if (pOutFrame = nwk_buildFrame(SMPL_PORT_LINK, msg, sizeof(msg), MAX_HOPS-(GET_FROM_FRAME(MRFI_P_PAYLOAD(frame),F_HOP_COUNT))))\r
+    {\r
+      /* destination address is the source adddress of the received frame. */\r
+      memcpy(MRFI_P_DST_ADDR(&pOutFrame->mrfiPkt), MRFI_P_SRC_ADDR(frame), NET_ADDR_SIZE);\r
+#if defined(SMPL_SECURE)\r
+      nwk_setSecureFrame(&pOutFrame->mrfiPkt, sizeof(msg), 0);\r
+#endif  /* SMPL_SECURE */\r
+      nwk_sendFrame(pOutFrame, MRFI_TX_TYPE_FORCED);\r
+    }\r
+    return SENT_REPLY;\r
+  }\r
+\r
+  if (!sListenActive)\r
+  {\r
+    /* We've checked for duplicate and resent reply. In that case we weren't listening\r
+     * so just go back`.\r
+     */\r
+    return SENT_NO_REPLY;\r
+  }\r
+\r
+  /* room to link? */\r
+#if defined(AP_IS_DATA_HUB)\r
+  pCInfo = nwk_findAlreadyJoined(frame);\r
+\r
+  if (!pCInfo)\r
+#endif\r
+  {\r
+    pCInfo = nwk_getNextConnection();\r
+  }\r
+\r
+  if (pCInfo)\r
+  {\r
+    /* yes there's room and it's not a dup. address. */\r
+    memcpy(&pCInfo->peerAddr, MRFI_P_SRC_ADDR(frame), NET_ADDR_SIZE);\r
+\r
+    if (!nwk_allocateLocalRxPort(LINK_REPLY, pCInfo))\r
+    {\r
+      nwk_freeConnection(pCInfo);\r
+      /* we're done with the packet */\r
+      return SENT_REPLY;\r
+    }\r
+\r
+    /* The local Rx port is the one returned in the connection structure. The\r
+     * caller is waiting on this to be set. The code here is running in an ISR\r
+     * thread so the caller will see this change after RETI.\r
+     */\r
+    if (NUM_CONNECTIONS == sNumLinkers)\r
+    {\r
+      /* Something is wrong -- no room to stack Link request */\r
+      nwk_freeConnection(pCInfo);\r
+      /* we're done with the packet */\r
+      return SENT_REPLY;\r
+    }\r
+    sServiceLinkID[sNumLinkers++] = pCInfo->thisLinkID;\r
+\r
+    /* save the remote Tx port */\r
+    pCInfo->portTx = remotePort;\r
+\r
+    /* connection is valid... */\r
+    pCInfo->connState = CONNSTATE_CONNECTED;\r
+\r
+    /* Set hop count. If it's a polling device set the count to the\r
+     * distance to the AP. otherwise, set it to the max less the remaining\r
+     * which will be the path taken for this frame. It will be no worse\r
+     * then tha max and probably will be better.\r
+     */\r
+    if (F_RX_TYPE_POLLS == *(MRFI_P_PAYLOAD(frame)+F_APP_PAYLOAD_OS+L_MY_RXTYPE_OS))\r
+    {\r
+      /* It polls. so. we'll be sending to the AP which will store the\r
+       * frame. The AP is only MAX_HOPS_FROM_AP hops away from us.\r
+       */\r
+      pCInfo->hops2target = MAX_HOPS_FROM_AP;\r
+    }\r
+    else\r
+    {\r
+      /* Can't really use this trick because the device could move. If the\r
+       * devices are all static this may work unless the initial reception\r
+       * was marginal.\r
+       */\r
+#if defined(DEVICE_DOES_NOT_MOVE)\r
+      pCInfo->hops2target = MAX_HOPS - GET_FROM_FRAME(MRFI_P_PAYLOAD(frame), F_HOP_COUNT);\r
+#else\r
+      pCInfo->hops2target = MAX_HOPS;\r
+#endif\r
+    }\r
+    /* Send reply with the local port number so the remote device knows where to\r
+     * send packets.\r
+     */\r
+    msg[LR_RMT_PORT_OS]  = pCInfo->portRx;\r
+\r
+    /* put my Rx type in there. used to know how to set hops when sending back. */\r
+    msg[LR_MY_RXTYPE_OS] = nwk_getMyRxType();\r
+\r
+    msg[LB_REQ_OS] = LINK_REQ_LINK | NWK_APP_REPLY_BIT;\r
+\r
+    /* sender's TID */\r
+    msg[LB_TID_OS] = *(MRFI_P_PAYLOAD(frame)+F_APP_PAYLOAD_OS+LB_TID_OS);\r
+#if defined(SMPL_SECURE)\r
+    nwk_getNumObjectFromMsg((void *)(MRFI_P_PAYLOAD(frame)+F_APP_PAYLOAD_OS+L_CTR_OS), (void *)&pCInfo->connRxCTR, 4);\r
+    pCInfo->connTxCTR = MRFI_RandomByte()                   | \\r
+                        ((uint32_t)(MRFI_RandomByte())<<8)  | \\r
+                        ((uint32_t)(MRFI_RandomByte())<<16) | \\r
+                        ((uint32_t)(MRFI_RandomByte())<<24);\r
+\r
+    nwk_putNumObjectIntoMsg((void *)&pCInfo->connTxCTR, (void *)&msg[LR_CTR_OS], 4);\r
+#endif\r
+    if (pOutFrame = nwk_buildFrame(SMPL_PORT_LINK, msg, sizeof(msg), MAX_HOPS-(GET_FROM_FRAME(MRFI_P_PAYLOAD(frame),F_HOP_COUNT))))\r
+    {\r
+      /* destination address is the source adddress of the received frame. */\r
+      memcpy(MRFI_P_DST_ADDR(&pOutFrame->mrfiPkt), MRFI_P_SRC_ADDR(frame), NET_ADDR_SIZE);\r
+#if defined(SMPL_SECURE)\r
+      nwk_setSecureFrame(&pOutFrame->mrfiPkt, sizeof(msg), 0);\r
+#endif\r
+      if (SMPL_SUCCESS != nwk_sendFrame(pOutFrame, MRFI_TX_TYPE_FORCED))\r
+      {\r
+        /* better release the connection structure */\r
+        nwk_freeConnection(pCInfo);\r
+      }\r
+    }\r
+    else\r
+    {\r
+      /* better release the connection structure */\r
+      nwk_freeConnection(pCInfo);\r
+    }\r
+  }\r
+  /* we're done with the packet */\r
+  return SENT_REPLY;\r
+#else\r
+  return SENT_NO_REPLY;\r
+#endif  /* NUM_CONNECTIONS */\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_processLink\r
+ *\r
+ * @brief       Process Link frame. Just save the frame for the Link app if it\r
+ *              a reply. If it isn't a reply, send the reply in this thread.\r
+ *\r
+ * input parameters\r
+ * @param   frame   - pointer to frame to be processed\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   Keep frame for application, release frame, or replay frame..\r
+ */\r
+fhStatus_t nwk_processLink(mrfiPacket_t *frame)\r
+{\r
+  fhStatus_t   rc;\r
+  uint8_t      replyType;\r
+\r
+  /* If we sent this then this is the reply. Validate the\r
+   * packet for reception by client app. If we didn't send\r
+   * it then we are the target. send the reply.\r
+   */\r
+  if (SMPL_MY_REPLY == (replyType=nwk_isValidReply(frame, sTid, LB_REQ_OS, LB_TID_OS)))\r
+  {\r
+    /* It's a match and it's a reply. Validate the received packet by\r
+     * returning a 1 so it can be received by the client app.\r
+     */\r
+    MRFI_PostKillSem();\r
+    rc = FHS_KEEP;\r
+  }\r
+#if !defined( END_DEVICE )\r
+  else if (SMPL_A_REPLY == replyType)\r
+  {\r
+    /* no match. if i'm not an ED this is a reply that should be passed on. */\r
+    rc = FHS_REPLAY;\r
+  }\r
+#endif  /* !END_DEVICE */\r
+  else\r
+  {\r
+    /* No, we didn't send it. Process request assuming it's\r
+     * intended for us.\r
+     */\r
+    rc = handleLinkRequest(frame);\r
+  }\r
+\r
+  (void) replyType;  /* keep compiler happy when ED built... */\r
+\r
+  return rc;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_getLocalLinkID\r
+ *\r
+ * @brief       This routine checks to see if a service port has been assigned\r
+ *              as a result of a link reply frame being received. It is the means\r
+ *              by which the user thread knows that the waiting is over for the\r
+ *              link listen. the value is set in an interrupt thread.\r
+ *\r
+ * input parameters\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   Local port assigned when the link reply was received.\r
+ */\r
+linkID_t nwk_getLocalLinkID(void)\r
+{\r
+  linkID_t    lid = 0;\r
+#if NUM_CONNECTIONS > 0\r
+  uint8_t     i;\r
+  bspIState_t intState;\r
+\r
+\r
+  BSP_ENTER_CRITICAL_SECTION(intState);\r
+  if (sNumLinkers)\r
+  {\r
+    sNumLinkers--;\r
+    BSP_EXIT_CRITICAL_SECTION(intState);\r
+\r
+    nwk_setListenContext(LINK_LISTEN_OFF);\r
+    lid = sServiceLinkID[0];\r
+    /* If more than one Link frame has been processed without an intervening\r
+     * Listen assume that there will be another Link Listen call that will\r
+     * poll for completion which has already occurred. Age any existing entries.\r
+     * This code was added to deal with the possibility of mulitple EDs being\r
+     * activated simultaneously in the AP-as-data-hub example. This opens a\r
+     * window of opportunity for a "typical" scenario to get hosed. But for\r
+     * a "typical" scenario to get hosed a number of improbable events have to\r
+     * occur. These are deemed far less likely than the multiple-ED-activation\r
+     * scenario in the AP-as-dat-hub case.\r
+     */\r
+    for (i=0; i<sNumLinkers; ++i)\r
+    {\r
+      sServiceLinkID[i] = sServiceLinkID[i+1];\r
+    }\r
+  }\r
+  else\r
+  {\r
+    BSP_EXIT_CRITICAL_SECTION(intState);\r
+  }\r
+#endif  /* NUM_CONNECTIONS */\r
+\r
+  return lid;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_setListenContext\r
+ *\r
+ * @brief       Sets the context when a LinkListen is executed. This prevents\r
+ *              processing other link frames from being confused with the real\r
+ *              one. Without this semaphore other broadcast link messages\r
+ *              could wait int the input queue and accidently be processed if\r
+ *              a listen is done later.\r
+ *\r
+ * input parameters\r
+ *\r
+ * @param   context - listen on or off\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   void\r
+ */\r
+void nwk_setListenContext(uint8_t context)\r
+{\r
+  sListenActive = (context == LINK_LISTEN_ON) ? 1 : 0;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          handleLinkRequest\r
+ *\r
+ * @brief       Dispatches handler for specfic link request\r
+ *\r
+ * input parameters\r
+ *\r
+ * @param   frame - Link frame received\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   void\r
+ */\r
+static fhStatus_t handleLinkRequest(mrfiPacket_t *frame)\r
+{\r
+  fhStatus_t rc = FHS_RELEASE;\r
+  uint8_t    isReplySent;\r
+\r
+  if (LINK_LEGACY_MSG_LENGTH == (MRFI_GET_PAYLOAD_LEN(frame) - F_APP_PAYLOAD_OS))\r
+  {\r
+    /* Legacy frame. Spoof a link request */\r
+    *(MRFI_P_PAYLOAD(frame)+F_APP_PAYLOAD_OS) = LINK_REQ_LINK;\r
+  }\r
+\r
+  switch (*(MRFI_P_PAYLOAD(frame)+F_APP_PAYLOAD_OS))\r
+  {\r
+    case LINK_REQ_LINK:\r
+      isReplySent = smpl_send_link_reply(frame);\r
+#if !defined(END_DEVICE)\r
+      /* If I am an AP or RE and not listening I need to replay frame.\r
+       * The exception is if I am an AP or RE hosting an End Device\r
+       * object and I just sent a reply frame to a duplicate link frame\r
+       * for which I was not listening. In this case don't replay.\r
+       */\r
+      if (!sListenActive && (SENT_REPLY != isReplySent))\r
+      {\r
+        rc = FHS_REPLAY;\r
+      }\r
+#endif   /* !END_DEVICE */\r
+      break;\r
+\r
+#if defined(EXTENDED_API)\r
+    case LINK_REQ_UNLINK:\r
+      smpl_send_unlink_reply(frame);\r
+      break;\r
+#endif\r
+\r
+    default:\r
+      break;\r
+  }\r
+\r
+  /* keep compiler happy if I'm compiled as an End Device */\r
+  (void) isReplySent;\r
+\r
+  return rc;\r
+}\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/Components/nwk_applications/nwk_link.h b/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/Components/nwk_applications/nwk_link.h
new file mode 100755 (executable)
index 0000000..6abc1e2
--- /dev/null
@@ -0,0 +1,106 @@
+/**************************************************************************************************\r
+  Filename:       nwk_link.h\r
+  Revised:        $Date: 2008-12-10 16:52:14 -0800 (Wed, 10 Dec 2008) $\r
+  Revision:       $Revision: 18596 $\r
+  Author:         $Author: lfriedman $\r
+\r
+  Description:    This header file supports the SimpliciTI Join network application.\r
+\r
+  Copyright 2004-2007 Texas Instruments Incorporated. All rights reserved.\r
+\r
+  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+  the terms of a software license agreement between the user who downloaded the software,\r
+  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+  License. The License limits your use, and you acknowledge, that the Software may not be\r
+  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+  perform, display or sell this Software and/or its documentation for any purpose.\r
+\r
+  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+\r
+  Should you have any questions regarding your right to use this Software,\r
+  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+#ifndef NWK_LINK_H\r
+#define NWK_LINK_H\r
+\r
+/* Macros needed for protocol backward compatibility */\r
+#define LINK_LEGACY_MSG_LENGTH       8\r
+#define LINK_REPLY_LEGACY_MSG_LENGTH 3\r
+\r
+\r
+#define LINK_LISTEN_ON   0\r
+#define LINK_LISTEN_OFF  1\r
+\r
+/* application payload offsets */\r
+/*    both */\r
+#define LB_REQ_OS         0\r
+#define LB_TID_OS         1\r
+\r
+/*    link frame */\r
+#define L_LINK_TOKEN_OS        2\r
+#define L_RMT_PORT_OS          6\r
+#define L_MY_RXTYPE_OS         7\r
+#define L_PROTOCOL_VERSION_OS  8\r
+#define L_CTR_OS               9\r
+/*    link reply frame */\r
+#define LR_RMT_PORT_OS         2\r
+#define LR_MY_RXTYPE_OS        3\r
+#define LR_CTR_OS              4\r
+\r
+/*    unlink frame */\r
+#define UL_RMT_PORT_OS        2\r
+/*    unlink reply frame */\r
+#define ULR_RESULT_OS         2\r
+\r
+/* change the following as protocol developed */\r
+#ifndef SMPL_SECURE\r
+#define MAX_LINK_APP_FRAME      9\r
+#else\r
+#define MAX_LINK_APP_FRAME      13\r
+#endif\r
+\r
+/* frame sizes */\r
+#ifndef SMPL_SECURE\r
+#define LINK_FRAME_SIZE         9\r
+#define LINK_REPLY_FRAME_SIZE   4\r
+#else\r
+#define LINK_FRAME_SIZE         13\r
+#define LINK_REPLY_FRAME_SIZE   8\r
+#endif\r
+#define UNLINK_FRAME_SIZE       3\r
+#define UNLINK_REPLY_FRAME_SIZE 3\r
+\r
+/* link requests\r
+ * NOTE: If aditional command codes are required do _not_ use the\r
+ *       value LINK_REPLY_LEGACY_MSG_LENGTH. This numeral is used\r
+ *       to guarantee that legacy Link frames (from before release\r
+ *       1.0.6) work correctly. Don't ask.\r
+ */\r
+\r
+#define LINK_REQ_LINK       1\r
+#define LINK_REQ_UNLINK     2\r
+\r
+/* prototypes */\r
+fhStatus_t   nwk_processLink(mrfiPacket_t *);\r
+linkID_t     nwk_getLocalLinkID(void);\r
+void         nwk_linkInit(void);\r
+smplStatus_t nwk_link(linkID_t *);\r
+smplStatus_t nwk_unlink(linkID_t);\r
+void         nwk_setLinkToken(uint32_t);\r
+void         nwk_getLinkToken(uint32_t *);\r
+void         nwk_setListenContext(uint8_t);\r
+\r
+#endif\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/Components/nwk_applications/nwk_mgmt.c b/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/Components/nwk_applications/nwk_mgmt.c
new file mode 100755 (executable)
index 0000000..ec2eb0e
--- /dev/null
@@ -0,0 +1,349 @@
+/**************************************************************************************************\r
+  Filename:       nwk_mgmt.c\r
+  Revised:        $Date: 2009-01-06 15:45:54 -0800 (Tue, 06 Jan 2009) $\r
+  Revision:       $Revision: 18697 $\r
+  Author:         $Author: lfriedman $\r
+\r
+  Description:    This file supports the SimpliciTI Mgmt network application.\r
+\r
+  Copyright 2007-2009 Texas Instruments Incorporated. All rights reserved.\r
+\r
+  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+  the terms of a software license agreement between the user who downloaded the software,\r
+  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+  License. The License limits your use, and you acknowledge, that the Software may not be\r
+  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+  perform, display or sell this Software and/or its documentation for any purpose.\r
+\r
+  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+\r
+  Should you have any questions regarding your right to use this Software,\r
+  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+\r
+/******************************************************************************\r
+ * INCLUDES\r
+ */\r
+#include <string.h>\r
+#include "bsp.h"\r
+#include "mrfi.h"\r
+#include "nwk_types.h"\r
+#include "nwk_api.h"\r
+#include "nwk_frame.h"\r
+#include "nwk.h"\r
+#include "nwk_mgmt.h"\r
+#include "nwk_join.h"\r
+#include "nwk_globals.h"\r
+#include "nwk_QMgmt.h"\r
+\r
+/******************************************************************************\r
+ * MACROS\r
+ */\r
+\r
+/******************************************************************************\r
+ * CONSTANTS AND DEFINES\r
+ */\r
+\r
+/******************************************************************************\r
+ * TYPEDEFS\r
+ */\r
+\r
+/******************************************************************************\r
+ * LOCAL VARIABLES\r
+ */\r
+#ifndef ACCESS_POINT\r
+static addr_t const *sAPAddr = NULL;\r
+#else\r
+static uint8_t sSFMarker[NUM_STORE_AND_FWD_CLIENTS] = {0};\r
+#endif\r
+\r
+static volatile uint8_t sTid = 0;\r
+\r
+/******************************************************************************\r
+ * LOCAL FUNCTIONS\r
+ */\r
+static void  smpl_send_mgmt_reply(mrfiPacket_t *);\r
+#ifdef ACCESS_POINT\r
+static void  send_poll_reply(mrfiPacket_t *);\r
+#endif\r
+\r
+/******************************************************************************\r
+ * GLOBAL VARIABLES\r
+ */\r
+\r
+/******************************************************************************\r
+ * GLOBAL FUNCTIONS\r
+ */\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_mgmtInit\r
+ *\r
+ * @brief       Initialize Management functions.\r
+ *\r
+ * input parameters\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   void\r
+ */\r
+\r
+void nwk_mgmtInit(void)\r
+{\r
+  sTid = MRFI_RandomByte();\r
+\r
+#ifdef ACCESS_POINT\r
+  memset(&sSFMarker, 0x0, sizeof(sSFMarker));\r
+#endif\r
+\r
+  return;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_processMgmt\r
+ *\r
+ * @brief       Process Management frame. Just save the frame for the Management\r
+ *              app it it is a reply. If it isn't a reply, send the reply in this\r
+ *              thread.\r
+ *\r
+ * input parameters\r
+ * @param   frame   - pointer to frame to be processed\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   Keep frame for application, release frame, or replay frame.\r
+ */\r
+fhStatus_t nwk_processMgmt(mrfiPacket_t *frame)\r
+{\r
+  fhStatus_t   rc;\r
+  uint8_t      replyType;\r
+\r
+  /* If we sent this then this is the reply. Validate the\r
+   * packet for reception by client app. If we didn't send\r
+   * it then we are the target. send the reply.\r
+   */\r
+  if (SMPL_MY_REPLY == (replyType=nwk_isValidReply(frame, sTid, MB_APP_INFO_OS, MB_TID_OS)))\r
+  {\r
+    /* It's a match and it's a reply. Validate the received packet by\r
+     * returning a 1 so it can be received by the client app.\r
+     */\r
+    MRFI_PostKillSem();\r
+    rc = FHS_KEEP;\r
+  }\r
+#if !defined( END_DEVICE )\r
+  else if (SMPL_A_REPLY == replyType)\r
+  {\r
+    /* no match. if i'm not an ED this is a reply that should be passed on. */\r
+    rc = FHS_REPLAY;\r
+  }\r
+#endif  /* !END_DEVICE */\r
+  else\r
+  {\r
+    /* no, we didn't send it. send reply if it's intended for us */\r
+    if (!memcmp(MRFI_P_DST_ADDR(frame), nwk_getMyAddress(), NET_ADDR_SIZE))\r
+    {\r
+      smpl_send_mgmt_reply(frame);\r
+\r
+      /* we're done with the frame. */\r
+      rc = FHS_RELEASE;\r
+    }\r
+    else\r
+    {\r
+      rc = FHS_REPLAY;\r
+    }\r
+  }\r
+\r
+  (void) replyType;  /* keep compiler happy */\r
+\r
+  return rc;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          smpl_send_mgmt_reply\r
+ *\r
+ * @brief       Send appropriate reply to Management frame.\r
+ *\r
+ * input parameters\r
+ * @param  frame  - Pointer to frame for which reply required.\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   void\r
+ */\r
+static void smpl_send_mgmt_reply(mrfiPacket_t *frame)\r
+{\r
+#ifdef ACCESS_POINT\r
+  /* what kind of management frame is this? */\r
+  switch (*(MRFI_P_PAYLOAD(frame)+F_APP_PAYLOAD_OS+MB_APP_INFO_OS))\r
+  {\r
+    case MGMT_REQ_POLL:\r
+      send_poll_reply(frame);\r
+      break;\r
+\r
+    default:\r
+      break;\r
+  }\r
+#endif  /* ACCESS_POINT */\r
+  return;\r
+}\r
+\r
+\r
+#ifdef ACCESS_POINT\r
+/******************************************************************************\r
+ * @fn          send_poll_reply\r
+ *\r
+ * @brief       Send reply to polling frame.\r
+ *\r
+ * input parameters\r
+ * @param  frame  - Pointer to frame for which reply required.\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   void\r
+ */\r
+static void send_poll_reply(mrfiPacket_t *frame)\r
+{\r
+  uint8_t         msgtid = *(MRFI_P_PAYLOAD(frame)+F_APP_PAYLOAD_OS+MB_TID_OS);\r
+  frameInfo_t    *pOutFrame;\r
+  sfClientInfo_t *pClientInfo;\r
+  uint8_t         loc;\r
+\r
+  /* Make sure this guy is really a client. We can tell from the source address. */\r
+  if (!(pClientInfo=nwk_isSandFClient(MRFI_P_SRC_ADDR(frame), &loc)))\r
+  {\r
+    /* TODO: maybe send an error frame? */\r
+    return;\r
+  }\r
+\r
+  /* If we have to resync the TID then do it based on the first\r
+   * poll frame we see\r
+  */\r
+  if (!sSFMarker[loc])\r
+  {\r
+    /* If the marker flag is null then it has been initialized, i.e.,\r
+     * there has been a reset. In this case infer that we need to update\r
+     * a (probably) stale last TID. The test will always be true the first\r
+     * time through after a client is established even when an NV restore\r
+     * did not take place but this does no harm.\r
+     */\r
+    pClientInfo->lastTID = msgtid;\r
+    sSFMarker[loc]       = 1;\r
+  }\r
+  /* If we've seen this poll frame before ignore it. Otherwise we\r
+   * may send a stored frame when we shouldn't.\r
+   */\r
+  else if (nwk_checkAppMsgTID(pClientInfo->lastTID, msgtid))\r
+  {\r
+    pClientInfo->lastTID = msgtid;\r
+  }\r
+  else\r
+  {\r
+    return;\r
+  }\r
+\r
+  if (pOutFrame = nwk_getSandFFrame(frame, M_POLL_PORT_OS))\r
+  {\r
+    /* We need to adjust the order in the queue in this case. Currently\r
+     * we know it is in the input queue and that this adjustment is safe\r
+     * because we're in an ISR thread. This is a fragile fix, though, and\r
+     * should be revisited when time permits.\r
+     */\r
+    nwk_QadjustOrder(INQ, pOutFrame->orderStamp);\r
+\r
+    /* reset hop count... */\r
+    PUT_INTO_FRAME(MRFI_P_PAYLOAD(&pOutFrame->mrfiPkt), F_HOP_COUNT, MAX_HOPS_FROM_AP);\r
+    /* It's gonna be a forwarded frame. */\r
+    PUT_INTO_FRAME(MRFI_P_PAYLOAD(&pOutFrame->mrfiPkt), F_FWD_FRAME, 0x80);\r
+\r
+    nwk_sendFrame(pOutFrame, MRFI_TX_TYPE_FORCED);\r
+  }\r
+  else\r
+  {\r
+    nwk_SendEmptyPollRspFrame(frame);\r
+  }\r
+\r
+  return;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_resetSFMarker\r
+ *\r
+ * @brief       Reset S&F cklient marker so the TIDs resync.\r
+ *\r
+ * input parameters\r
+ * @param  idx  - index of the client that should be reset.\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   void\r
+ */\r
+void nwk_resetSFMarker(uint8_t idx)\r
+{\r
+  sSFMarker[idx] = 0;\r
+\r
+  return;\r
+}\r
+\r
+#else  /* ACCESS_POINT */\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_poll\r
+ *\r
+ * @brief       Poll S&F server for any waiting frames.\r
+ *\r
+ * input parameters\r
+ * @param  port  - Port on peer.\r
+ * @param  addr  - SimpliciTI address of peer.\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   SMPL_SUCCESS\r
+ *           SMPL_NO_AP_ADDRESS - We don't know Access Point's address\r
+ *           SMPL_NOMEM         - no room in output frame queue\r
+ *           SMPL_TX_CCA_FAIL   - CCA failure\r
+ */\r
+smplStatus_t nwk_poll(uint8_t port, uint8_t *addr)\r
+{\r
+  uint8_t        msg[MGMT_POLL_FRAME_SIZE];\r
+  ioctlRawSend_t send;\r
+\r
+  msg[MB_APP_INFO_OS] = MGMT_REQ_POLL;\r
+  msg[MB_TID_OS]      = sTid;\r
+  msg[M_POLL_PORT_OS] = port;\r
+  memcpy(msg+M_POLL_ADDR_OS, addr, NET_ADDR_SIZE);\r
+\r
+  /* it's OK to increment the TID here because the reply will not be\r
+   * matched based on this number. The reply to the poll comes back\r
+   * to the client port, not the Management port.\r
+   */\r
+  sTid++;\r
+\r
+  if (!sAPAddr)\r
+  {\r
+    sAPAddr = nwk_getAPAddress();\r
+    if (!sAPAddr)\r
+    {\r
+      return SMPL_NO_AP_ADDRESS;\r
+    }\r
+  }\r
+  send.addr = (addr_t *)sAPAddr;\r
+  send.msg  = msg;\r
+  send.len  = sizeof(msg);\r
+  send.port = SMPL_PORT_MGMT;\r
+\r
+  return SMPL_Ioctl(IOCTL_OBJ_RAW_IO, IOCTL_ACT_WRITE, &send);\r
+}\r
+\r
+#endif /* ACCESS_POINT */\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/Components/nwk_applications/nwk_mgmt.h b/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/Components/nwk_applications/nwk_mgmt.h
new file mode 100755 (executable)
index 0000000..d913abb
--- /dev/null
@@ -0,0 +1,67 @@
+/**************************************************************************************************\r
+  Filename:       nwk_mgmt.h\r
+  Revised:        $Date: 2009-01-06 15:45:54 -0800 (Tue, 06 Jan 2009) $\r
+  Revision:       $Revision: 18697 $\r
+  Author:         $Author: lfriedman $\r
+\r
+  Description:    This header file supports the SimpliciTI Mgmt network application.\r
+\r
+  Copyright 2004-2007 Texas Instruments Incorporated. All rights reserved.\r
+\r
+  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+  the terms of a software license agreement between the user who downloaded the software,\r
+  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+  License. The License limits your use, and you acknowledge, that the Software may not be\r
+  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+  perform, display or sell this Software and/or its documentation for any purpose.\r
+\r
+  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+\r
+  Should you have any questions regarding your right to use this Software,\r
+  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+\r
+#ifndef NWK_MGMT_H\r
+#define NWK_MGMT_H\r
+\r
+/* MGMT frame application requests */\r
+#define  MGMT_REQ_POLL        0x01\r
+\r
+/* change the following as protocol developed */\r
+#define MAX_MGMT_APP_FRAME    7\r
+\r
+/* application payload offsets */\r
+/*    both */\r
+#define MB_APP_INFO_OS           0\r
+#define MB_TID_OS                1\r
+\r
+/*    Poll frame */\r
+#define M_POLL_PORT_OS          2\r
+#define M_POLL_ADDR_OS          3\r
+\r
+/* change the following as protocol developed */\r
+#define MAX_MGMT_APP_FRAME    7\r
+\r
+/* frame sizes */\r
+#define MGMT_POLL_FRAME_SIZE  7\r
+\r
+/* prototypes */\r
+void         nwk_mgmtInit(void);\r
+fhStatus_t   nwk_processMgmt(mrfiPacket_t *);\r
+smplStatus_t nwk_poll(uint8_t, uint8_t *);\r
+void         nwk_resetSFMarker(uint8_t);\r
+\r
+#endif\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/Components/nwk_applications/nwk_ping.c b/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/Components/nwk_applications/nwk_ping.c
new file mode 100755 (executable)
index 0000000..2e55a48
--- /dev/null
@@ -0,0 +1,314 @@
+/**************************************************************************************************\r
+  Filename:       nwk_ping.c\r
+  Revised:        $Date: 2009-01-18 16:01:08 -0800 (Sun, 18 Jan 2009) $\r
+  Revision:       $Revision: 18796 $\r
+  Author:         $Author: lfriedman $\r
+\r
+  Description:    This file supports the SimpliciTI Ping network application.\r
+\r
+  Copyright 2007-2009 Texas Instruments Incorporated. All rights reserved.\r
+\r
+  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+  the terms of a software license agreement between the user who downloaded the software,\r
+  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+  License. The License limits your use, and you acknowledge, that the Software may not be\r
+  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+  perform, display or sell this Software and/or its documentation for any purpose.\r
+\r
+  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+\r
+  Should you have any questions regarding your right to use this Software,\r
+  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+\r
+/******************************************************************************\r
+ * INCLUDES\r
+ */\r
+#include <string.h>\r
+#include "bsp.h"\r
+#include "mrfi.h"\r
+#include "nwk_types.h"\r
+#include "nwk_frame.h"\r
+#include "nwk.h"\r
+#include "nwk_ping.h"\r
+#include "nwk_globals.h"\r
+#include "nwk_api.h"\r
+#include "nwk_freq.h"\r
+#include "nwk_security.h"\r
+\r
+/******************************************************************************\r
+ * MACROS\r
+ */\r
+\r
+/******************************************************************************\r
+ * CONSTANTS AND DEFINES\r
+ */\r
+\r
+/******************************************************************************\r
+ * TYPEDEFS\r
+ */\r
+\r
+/******************************************************************************\r
+ * LOCAL VARIABLES\r
+ */\r
+\r
+static volatile uint8_t sTid = 0;\r
+\r
+/******************************************************************************\r
+ * LOCAL FUNCTIONS\r
+ */\r
+static void smpl_send_ping_reply(mrfiPacket_t *);\r
+static void handlePingRequest(mrfiPacket_t *);\r
+\r
+/******************************************************************************\r
+ * GLOBAL VARIABLES\r
+ */\r
+\r
+/******************************************************************************\r
+ * GLOBAL FUNCTIONS\r
+ */\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_pingInit\r
+ *\r
+ * @brief       Initialize Ping application.\r
+ *\r
+ * input parameters\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   void\r
+ */\r
+void nwk_pingInit(void)\r
+{\r
+  sTid = MRFI_RandomByte();\r
+\r
+  return;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_ping\r
+ *\r
+ * @brief       Called from the application level to ping a peer. A small\r
+ *              payload is sent that includes a tid to detect correct reply.\r
+ *              Caller does not supply payload.\r
+ *\r
+ * input parameters\r
+ * @param   lid     - Link ID representing peer to ping\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   SMPL_SUCCESS   valid reply received\r
+ *           SMPL_TIMEOUT   no valid reply received\r
+ *           SMPL_NO_CHANNEL  no channels returned on a scan\r
+ */\r
+smplStatus_t nwk_ping(linkID_t lid)\r
+{\r
+  connInfo_t  *pCInfo   = nwk_getConnInfo(lid);\r
+  smplStatus_t rc       = SMPL_BAD_PARAM;\r
+  uint8_t      done     = 0;\r
+  uint8_t      repeatIt = 2;\r
+  uint8_t      msg[MAX_PING_APP_FRAME];\r
+  uint8_t      radioState = MRFI_GetRadioState();\r
+  union\r
+  {\r
+    ioctlRawSend_t    send;\r
+    ioctlRawReceive_t recv;\r
+  } ioctl_info;\r
+\r
+  if (!pCInfo || (SMPL_LINKID_USER_UUD == lid))\r
+  {\r
+    /* either link ID bogus or tried to ping the unconnected user datagram link ID. */\r
+    return rc;\r
+  }\r
+\r
+  do\r
+  {\r
+#if defined(FREQUENCY_AGILITY) && !defined(ACCESS_POINT)\r
+    uint8_t     i, numChan;\r
+    freqEntry_t channels[NWK_FREQ_TBL_SIZE];\r
+\r
+    if (repeatIt == 2)\r
+    {\r
+      /* If FA enabled, first time through set up so that the 'for'\r
+       * loop checks the current channel. This saves time (no scan)\r
+       * and is very likely to succeed. Populate the proper strucure.\r
+       */\r
+      SMPL_Ioctl(IOCTL_OBJ_FREQ, IOCTL_ACT_GET, channels);\r
+      numChan = 1;\r
+    }\r
+    else\r
+    {\r
+      /* If we get here we must scan for the channel we're now on */\r
+      if (!(numChan=nwk_scanForChannels(channels)))\r
+      {\r
+        return SMPL_NO_CHANNEL;\r
+      }\r
+    }\r
+    /* Either we scan next time through or we're done */\r
+    repeatIt--;\r
+\r
+    /* this loop Pings on each channel (probably only 1) looking\r
+     * for peer.\r
+     */\r
+    for (i=0; i<numChan && !done; ++i)\r
+    {\r
+      nwk_setChannel(&channels[i]);\r
+#else\r
+    {\r
+      repeatIt = 0;\r
+#endif  /* defined(FREQUENCY_AGILITY) && !defined(ACCESS_POINT) */\r
+\r
+      ioctl_info.send.addr = (addr_t *)pCInfo->peerAddr;\r
+      ioctl_info.send.msg  = msg;\r
+      ioctl_info.send.len  = sizeof(msg);\r
+      ioctl_info.send.port = SMPL_PORT_PING;\r
+\r
+      /* fill in msg */\r
+      msg[PB_REQ_OS] = PING_REQ_PING;\r
+      msg[PB_TID_OS] = sTid;\r
+\r
+      SMPL_Ioctl(IOCTL_OBJ_RAW_IO, IOCTL_ACT_WRITE, &ioctl_info.send);\r
+\r
+      ioctl_info.recv.port = SMPL_PORT_PING;\r
+      ioctl_info.recv.msg  = msg;\r
+      ioctl_info.recv.addr = 0;\r
+\r
+      NWK_CHECK_FOR_SETRX(radioState);\r
+      NWK_REPLY_DELAY();\r
+      NWK_CHECK_FOR_RESTORE_STATE(radioState);\r
+\r
+      if (SMPL_SUCCESS == SMPL_Ioctl(IOCTL_OBJ_RAW_IO, IOCTL_ACT_READ, &ioctl_info.recv))\r
+      {\r
+        repeatIt = 0;\r
+        done     = 1;\r
+        sTid++;   /* guard against duplicates */\r
+      }\r
+    }\r
+  } while (repeatIt);\r
+\r
+  return done ? SMPL_SUCCESS : SMPL_TIMEOUT;\r
+\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          smpl_send_ping_reply\r
+ *\r
+ * @brief       Send a reply to a ping request.\r
+ *\r
+ * input parameters\r
+ * @param   frame     - pointer to frame containing request\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   void\r
+ */\r
+static void smpl_send_ping_reply(mrfiPacket_t *frame)\r
+{\r
+  frameInfo_t *pOutFrame;\r
+\r
+  /* Build the reply frame. The application payload is the one included in the\r
+   * received frame payload.\r
+   */\r
+  if (pOutFrame = nwk_buildFrame(SMPL_PORT_PING, MRFI_P_PAYLOAD(frame)+F_APP_PAYLOAD_OS, MRFI_GET_PAYLOAD_LEN(frame)-F_APP_PAYLOAD_OS, MAX_HOPS))\r
+  {\r
+    /* destination address is the source adddress of the received frame. */\r
+    memcpy(MRFI_P_DST_ADDR(&pOutFrame->mrfiPkt), MRFI_P_SRC_ADDR(frame), NET_ADDR_SIZE);\r
+\r
+    /* turn on the reply bit in the application payload */\r
+    *(MRFI_P_PAYLOAD(&pOutFrame->mrfiPkt)+F_APP_PAYLOAD_OS+PB_REQ_OS) |= NWK_APP_REPLY_BIT;\r
+#ifdef SMPL_SECURE\r
+    nwk_setSecureFrame(&pOutFrame->mrfiPkt, MRFI_GET_PAYLOAD_LEN(frame)-F_APP_PAYLOAD_OS, 0);\r
+#endif  /* SMPL_SECURE */\r
+    nwk_sendFrame(pOutFrame, MRFI_TX_TYPE_FORCED);\r
+  }\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_processPing\r
+ *\r
+ * @brief       Ping network application frame handler.\r
+ *\r
+ * input parameters\r
+ * @param   frame   - pointer to frame in question\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return    Keep frame for application, release frame, or replay frame.\r
+ */\r
+fhStatus_t nwk_processPing(mrfiPacket_t *frame)\r
+{\r
+  fhStatus_t   rc;\r
+  uint8_t      replyType;\r
+\r
+  /* If we sent this then this is the reply. Validate the\r
+   * packet for reception by client app. If we didn't send\r
+   * it then we are the target. Send the reply.\r
+   */\r
+  replyType = nwk_isValidReply(frame, sTid, PB_REQ_OS, PB_TID_OS);\r
+  if (SMPL_MY_REPLY == replyType)\r
+  {\r
+    /* It's a match and it's a reply. Validate the received packet by\r
+     * returning a 1 so it can be received by the client app.\r
+     */\r
+    MRFI_PostKillSem();\r
+    rc = FHS_KEEP;\r
+  }\r
+#if !defined( END_DEVICE )\r
+  else if (SMPL_A_REPLY == replyType)\r
+  {\r
+    /* no match. If I'm not an ED this is a reply that should be passed on. */\r
+    rc = FHS_REPLAY;\r
+  }\r
+#endif  /* !END_DEVICE */\r
+  else\r
+  {\r
+    /* No, we didn't send it. Send reply assuming it's a Ping intended for us. */\r
+    handlePingRequest(frame);\r
+\r
+    rc = FHS_RELEASE;\r
+  }\r
+\r
+  return rc;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          handlePingRequest\r
+ *\r
+ * @brief       Dispatches handler for specfic Ping request\r
+ *\r
+ * input parameters\r
+ *\r
+ * @param   frame - Ping frame received\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   void\r
+ */\r
+static void handlePingRequest(mrfiPacket_t *frame)\r
+{\r
+  switch (*(MRFI_P_PAYLOAD(frame)+F_APP_PAYLOAD_OS))\r
+  {\r
+    case PING_REQ_PING:\r
+      smpl_send_ping_reply(frame);\r
+      break;\r
+\r
+    default:\r
+      break;\r
+  }\r
+\r
+  return;\r
+}\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/Components/nwk_applications/nwk_ping.h b/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/Components/nwk_applications/nwk_ping.h
new file mode 100755 (executable)
index 0000000..c7dd3be
--- /dev/null
@@ -0,0 +1,58 @@
+/**************************************************************************************************\r
+  Filename:       nwk_ping.h\r
+  Revised:        $Date: 2008-05-14 14:22:31 -0700 (Wed, 14 May 2008) $\r
+  Revision:       $Revision: 17075 $\r
+  Author:         $Author: lfriedman $\r
+\r
+  Description:    This file supports the SimpliciTI Ping network application.\r
+\r
+  Copyright 2004-2007 Texas Instruments Incorporated. All rights reserved.\r
+\r
+  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+  the terms of a software license agreement between the user who downloaded the software,\r
+  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+  License. The License limits your use, and you acknowledge, that the Software may not be\r
+  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+  perform, display or sell this Software and/or its documentation for any purpose.\r
+\r
+  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+\r
+  Should you have any questions regarding your right to use this Software,\r
+  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+\r
+#ifndef NWK_PING_H\r
+#define NWK_PING_H\r
+\r
+/* change the following as protocol developed */\r
+#define MAX_PING_APP_FRAME    2\r
+\r
+/* application payload offsets */\r
+/*    both */\r
+#define PB_REQ_OS     0\r
+#define PB_TID_OS     1\r
+\r
+\r
+/* ping requests */\r
+#define PING_REQ_PING       1\r
+\r
+/* prototypes */\r
+fhStatus_t   nwk_processPing(mrfiPacket_t *);\r
+void         nwk_pingInit(void);\r
+smplStatus_t nwk_ping(linkID_t);\r
+\r
+\r
+#endif\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/Components/nwk_applications/nwk_security.c b/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/Components/nwk_applications/nwk_security.c
new file mode 100755 (executable)
index 0000000..5ee4acc
--- /dev/null
@@ -0,0 +1,549 @@
+/**************************************************************************************************\r
+  Filename:       nwk_security.c\r
+  Revised:        $Date: 2009-01-20 14:05:46 -0800 (Tue, 20 Jan 2009) $\r
+  Revision:       $Revision: 18816 $\r
+  Author:         $Author: lfriedman $\r
+\r
+  Description:    This file supports the SimpliciTI Security network application.\r
+\r
+  Copyright 2008-2009 Texas Instruments Incorporated. All rights reserved.\r
+\r
+  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+  the terms of a software license agreement between the user who downloaded the software,\r
+  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+  License. The License limits your use, and you acknowledge, that the Software may not be\r
+  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+  perform, display or sell this Software and/or its documentation for any purpose.\r
+\r
+  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+\r
+  Should you have any questions regarding your right to use this Software,\r
+  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+/******************************************************************************\r
+ * INCLUDES\r
+ */\r
+\r
+#include <string.h>     /* needed for NULL */\r
+#include "mrfi.h"\r
+#include "nwk_types.h"\r
+#include "nwk_security.h"\r
+#include "nwk_frame.h"\r
+#include "nwk.h"\r
+\r
+#ifdef SMPL_SECURE\r
+\r
+/*                   *** GENERAL SECURITY OUTLINE ***\r
+ *\r
+ * We are using XTEA (eXtended Tiny Encryption Algorithm) with a fixed\r
+ * number of rounds (32). We have removed the parameters from the API\r
+ * we harvested from the public domain.\r
+ *\r
+ * We are using a CTR-like mode. We use the 64-bit block cipher function of the\r
+ * XTEA code to encipher a concatenation of the 32-bit initialization vector and\r
+ * a 32-bit counter that increments each block. We encrypt using a fixed 128-bit\r
+ * key. The resulting 64-bit output is XOR'ed with the message. If the message is\r
+ * longer than 64 bits we encipher the next block (incrementing the counter) and\r
+ * continue until the message is exhausted. If the last cipher block is longer\r
+ * than the message we simply discard the remaining cipher block.\r
+ */\r
+\r
+\r
+/******************************************************************************\r
+ * MACROS\r
+ */\r
+\r
+/******************************************************************************\r
+ * CONSTANTS AND DEFINES\r
+ */\r
+\r
+/* The counter can be off by quite a bit because the number of cipher\r
+ * blocks can easily be more than 1 per frame. Value limited to a\r
+ * maximum of 255.\r
+ */\r
+#define CTR_WINDOW  255\r
+\r
+#if (CTR_WINDOW > 255) || (CTR_WINDOW < 0)\r
+#error ERROR: 0 <= CTR_WINDOW < 256\r
+#endif\r
+\r
+/* Number of rounds for XTEA algorithm. A parameter in the public domain code\r
+ * but we fix it here at 32.\r
+ */\r
+#define NUM_ROUNDS  32\r
+\r
+/* Key and cipher block size constants */\r
+#define SMPL_KEYSIZE_BYTES    16\r
+#define SMPL_KEYSIZE_LONGS     4\r
+\r
+/******************************************************************************\r
+ * TYPEDEFS\r
+ */\r
+/* Union used to access key as both a string and as unsigned longs */\r
+typedef union\r
+{\r
+  uint8_t  keyS[SMPL_KEYSIZE_BYTES];\r
+  uint32_t keyL[SMPL_KEYSIZE_LONGS];\r
+} key_t;\r
+\r
+\r
+/******************************************************************************\r
+ * LOCAL VARIABLES\r
+ */\r
+/* 32-bit Initialization vector */\r
+static uint32_t const sIV = 0x87654321;\r
+\r
+/* 128-bit (16 byte) key. Initialized as string but fetched and used in XTEA\r
+ * encryption as 4 unsigned longs. Endianess could count if the peers are on\r
+ * two different MCUs. Endianess is rectified in initialization code.\r
+ *\r
+ * Initialization _MUST_ be done as a string (or character array). Though it\r
+ * won't matter how the initialization is done if both peers are the same\r
+ * endianness, good prectice will initialize these as a string (or character\r
+ * array) so that the endianess reconciliation works properly for all cases.\r
+ */\r
+static key_t sKey = {"SimpliciTI's Key"};\r
+\r
+/* Constant set as an authentication code. Note that since it is a\r
+ * fixed value as opposed to a hash of the message it does not provide\r
+ * an integrity check. It will only differentiate two message encryptions\r
+ * with the same LSB but different MSB components. Thus it helps guard\r
+ * against replays.\r
+ */\r
+static secMAC_t const sMAC = 0xA5;\r
+\r
+/* This is the 64-bit cipher block target. It is this 64-bit block that\r
+ * is XOR'ed with the actual message to be encrypted.\r
+ */\r
+static uint32_t sMsg[2] = {0, 0};\r
+\r
+/******************************************************************************\r
+ * LOCAL FUNCTIONS\r
+ */\r
+static secFCS_t calcFCS(uint8_t *, uint8_t);\r
+static void     msg_encipher(uint8_t *, uint8_t, uint32_t *);\r
+static void     msg_decipher(uint8_t *, uint8_t, uint32_t *);\r
+static void     xtea_encipher(void);\r
+\r
+#endif  /* SMPL_SECURE */\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_securityInit\r
+ *\r
+ * @brief       Initialize Security network application.\r
+ *\r
+ * input parameters\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return      void\r
+ */\r
+void nwk_securityInit(void)\r
+{\r
+#ifdef SMPL_SECURE\r
+  uint8_t  i;\r
+\r
+  /* The key is set as a string. But the XTEA routines operate on 32-bit\r
+   * unsigned longs. Endianess should be taken into account and we do that\r
+   * here by treating the key as being an array of unsigned longs in\r
+   * network order.\r
+   */\r
+  for (i=0; i<sizeof(sKey.keyL)/sizeof(uint32_t); ++i)\r
+  {\r
+    sKey.keyL[i] = ntohl(sKey.keyL[i]);\r
+  }\r
+\r
+#endif  /* SMPL_SECURE */\r
+  return;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_processSecurity\r
+ *\r
+ * @brief       Security network application frame handler.\r
+ *\r
+ * input parameters\r
+ * @param   frame   - pointer to frame in question\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return    Keep frame for application, release frame, or replay frame.\r
+ */\r
+fhStatus_t nwk_processSecurity(mrfiPacket_t *frame)\r
+{\r
+  return FHS_RELEASE;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          msg_encipher\r
+ *\r
+ * @brief       Encipher a message using the XTEA algorithm and the modified\r
+ *              CTR mode method.\r
+ *\r
+ * input parameters\r
+ * @param   msg      - pointer to message to encipher\r
+ * @param   len      - length of message\r
+ * @param   cntStart - pointer to the counter used in the cipher block.\r
+ *\r
+ * output parameters\r
+ * @param   cntStart - counter is updated during encryption.\r
+ *\r
+ * @return      void\r
+ */\r
+#ifdef SMPL_SECURE\r
+static void msg_encipher(uint8_t *msg, uint8_t len, uint32_t *cntStart)\r
+{\r
+  uint8_t  i, idx, done;\r
+  uint8_t *mptr = (uint8_t *)&sMsg[0];\r
+  uint32_t ctr;\r
+\r
+  if ((NULL == msg) || !len)\r
+  {\r
+    return;\r
+  }\r
+\r
+  /* set local counter from input */\r
+  ctr = *cntStart;\r
+\r
+  idx  = 0;\r
+  done = 0;\r
+  do\r
+  {\r
+    /* Set block to be enciphered. 1st 32 bits are the IV. The second\r
+     * 32 bits are the current CTR value.\r
+     */\r
+    sMsg[0] = sIV;\r
+    sMsg[1] = ctr;\r
+    /* encrypt */\r
+    xtea_encipher();\r
+    /* increment counter for next time. */\r
+    ctr++;\r
+    /* XOR ciphered block with message to be sent. Only operate\r
+     * up to and including the last message byte which may not\r
+     * be on a cipher block boundary (64 bits == 8 bytes).\r
+     */\r
+    for (i=0; i<sizeof(sMsg) && idx<len; ++i, ++idx)\r
+    {\r
+      msg[idx] ^= mptr[i];\r
+    }\r
+\r
+    if (idx >= len)\r
+    {\r
+      /* we're done */\r
+      done = 1;\r
+    }\r
+  } while (!done);\r
+\r
+  /* return counter value start for next time */\r
+  *cntStart = ctr;\r
+\r
+  return;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          msg_decipher\r
+ *\r
+ * @brief       Decipher a message using the XTEA algorithm and the modified\r
+ *              CTR mode method.\r
+ *\r
+ * input parameters\r
+ * @param   msg      - pointer to message to decipher\r
+ * @param   len      - length of message\r
+ * @param   cntStart - pointer to the counter used in the cipher block.\r
+ *\r
+ * output parameters\r
+ * @param   cntStart - counter is updated during decryption.\r
+ *\r
+ * @return      void\r
+ */\r
+static void msg_decipher(uint8_t *msg, uint8_t len, uint32_t *cntStart)\r
+{\r
+  msg_encipher(msg, len, cntStart);\r
+\r
+  return;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          xtea_encipher\r
+ *\r
+ * @brief       XTEA encipher algorithm. Calling arguments removed from public\r
+ *              domain code and static-scope values used instead.\r
+ *\r
+ * input parameters\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return      void\r
+ */\r
+void xtea_encipher(void)\r
+{\r
+  uint32_t v0=sMsg[0], v1=sMsg[1];\r
+  uint16_t i;\r
+  uint32_t sum=0, delta=0x9E3779B9;\r
+\r
+  for(i=0; i<NUM_ROUNDS; i++)\r
+  {\r
+    v0  += (((v1 << 4) ^ (v1 >> 5)) + v1) ^ (sum + sKey.keyL[sum & 3]);\r
+    sum += delta;\r
+    v1  += (((v0 << 4) ^ (v0 >> 5)) + v0) ^ (sum + sKey.keyL[(sum>>11) & 3]);\r
+  }\r
+\r
+  sMsg[0]=v0;\r
+  sMsg[1]=v1;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_setSecureFrame\r
+ *\r
+ * @brief       Called from NWK to secure a frame.\r
+ *\r
+ * input parameters\r
+ * @param   frame   - pointer to frame to secure\r
+ * @param   msglen  - length of message\r
+ * @param   ctr     - pointer to the counter used in the cipher block. This will\r
+ *                    be NULL if a network application is sending a frame. Since\r
+ *                    these are not connection-based there is no counter sync\r
+ *                    issue but we still need a counter value. A random value\r
+ *                    is used.\r
+ *\r
+ * output parameters\r
+ * @param   cntStart - counter is updated during encryption.\r
+ *\r
+ * @return      void\r
+ */\r
+void nwk_setSecureFrame(mrfiPacket_t *frame, uint8_t msglen, uint32_t *ctr)\r
+{\r
+  uint32_t locCnt;\r
+\r
+  /* If an encrypted frame is to be sent to a non-connection based port use a\r
+   * random number as the lsb counter value. In this case only the lsb is used\r
+   * for a counter value during decryption. Not as secure but there are still\r
+   * the 32 bits in the IV.\r
+   */\r
+  locCnt = ctr ? *ctr : MRFI_RandomByte();\r
+\r
+  /* place counter value into frame */\r
+  PUT_INTO_FRAME(MRFI_P_PAYLOAD(frame), F_SEC_CTR_OS, (uint8_t)(locCnt & 0xFF));\r
+\r
+  /* Put MAC value in */\r
+  nwk_putNumObjectIntoMsg((void *)&sMAC, (void *)(MRFI_P_PAYLOAD(frame)+F_SEC_MAC_OS), sizeof(secMAC_t));\r
+\r
+  /* Put FCS value in */\r
+  {\r
+    secFCS_t fcs = calcFCS(MRFI_P_PAYLOAD(frame)+F_SEC_MAC_OS, msglen+sizeof(secMAC_t));\r
+\r
+    nwk_putNumObjectIntoMsg((void *)&fcs, (void *)(MRFI_P_PAYLOAD(frame)+F_SEC_ICHK_OS), sizeof(secFCS_t));\r
+  }\r
+\r
+  /* Encrypt frame */\r
+  msg_encipher(MRFI_P_PAYLOAD(frame)+F_SEC_ICHK_OS, msglen+sizeof(secMAC_t)+sizeof(secFCS_t), &locCnt);\r
+\r
+  /* Set the Encryption bit */\r
+  PUT_INTO_FRAME(MRFI_P_PAYLOAD(frame), F_ENCRYPT_OS, F_ENCRYPT_OS_MSK);\r
+\r
+  /* Update the counter if it was a "real" counter. */\r
+  if (ctr)\r
+  {\r
+    *ctr = locCnt;\r
+  }\r
+\r
+  return;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          calcFCS\r
+ *\r
+ * @brief       Calculate the frame check sequence. Currently it's just a\r
+ *              cumulative XOR of each byte starting with the MAC byte. The\r
+ *              FCS is placed in front of the MAC after the counter hint and is\r
+ *              included in the encryption.\r
+ *\r
+ * input parameters\r
+ * @param   msg      - pointer to message\r
+ * @param   len      - length of message\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return      Returns the FCS using the typedef.\r
+ */\r
+static secFCS_t calcFCS(uint8_t *msg, uint8_t len)\r
+{\r
+  uint8_t  i;\r
+  secFCS_t result = 0;\r
+\r
+  for (i=0; i<len; ++i)\r
+  {\r
+    result ^= *(msg+i);\r
+  }\r
+\r
+  return result;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_getSecureFrame\r
+ *\r
+ * @brief       Called from NWK to get a secure a frame and decrypt.\r
+ *\r
+ * input parameters\r
+ * @param   frame    - pointer to frame containing encrypted message\r
+ * @param   msglen   - length of message\r
+ * @param   ctr      - pointer to the counter used in the cipher block. This will\r
+ *                     be NULL if a network applicaiton is getting a frame. Since\r
+ *                     these are not connection-nbased there is no counter sync\r
+ *                     issue but we still need a counter value.\r
+ *\r
+ * output parameters\r
+ * @param   cntStart - counter is updated during decryption. If decryption fails\r
+ *                     this value is not changed.\r
+ *\r
+ * @return      Returns non-zero if frame decryption is valid, otherwise returns 0.\r
+ */\r
+uint8_t nwk_getSecureFrame(mrfiPacket_t *frame, uint8_t msglen, uint32_t *ctr)\r
+{\r
+  uint8_t  rc = 1;\r
+  uint8_t  done = 0;\r
+  uint8_t  cntHint = GET_FROM_FRAME(MRFI_P_PAYLOAD(frame), F_SEC_CTR_OS);\r
+  uint32_t locCnt, frameCnt;\r
+\r
+  /* Construct proposed CTR values */\r
+\r
+  /* Just like encryption, we may be talking to a non-connection based\r
+   * peer in which case the counter value is represented by the lsb byte\r
+   * conveyed in the frame.\r
+   */\r
+  locCnt = ctr ? *ctr : cntHint;\r
+\r
+  frameCnt = (locCnt & 0xFFFFFF00) + cntHint;\r
+\r
+  do\r
+  {\r
+    /* See if counters match */\r
+    if (locCnt == frameCnt)\r
+    {\r
+      /* When the counters appear to match is the only time we actually decipher\r
+       * the message. It is the only time we can do so since out-of-sync lsb counter\r
+       * values guarantees that something is wrong somewhere. Decryption is successful\r
+       * only if the MAC and FCS values match. The message is left as-is after the\r
+       * decipher attempt. Either it appears valid or is doesn't and is discarded.\r
+       * There is no recovery attempt if the counters match but the MAC or FCS do\r
+       * not. It is considered a rogue message.\r
+       */\r
+      msg_decipher(MRFI_P_PAYLOAD(frame)+F_SEC_ICHK_OS, msglen-1, &locCnt);\r
+\r
+      /* Get MAC and make sure it matches. A failure can occur if a replayed frame happens\r
+       * to have the correct counter sync value but was encoded with the wrong complete\r
+       * counter value. Otherwise the MAC values must match when the counter values are equal.\r
+       */\r
+      {\r
+        secMAC_t mac;\r
+\r
+        nwk_getNumObjectFromMsg((void *)(MRFI_P_PAYLOAD(frame)+F_SEC_MAC_OS), (void *)&mac, sizeof(secMAC_t));\r
+        if (mac != sMAC)\r
+        {\r
+          rc = 0;\r
+        }\r
+      }\r
+\r
+      /* FCS check... */\r
+      {\r
+        secFCS_t fcs;\r
+\r
+        nwk_getNumObjectFromMsg((void *)(MRFI_P_PAYLOAD(frame)+F_SEC_ICHK_OS), (void *)&fcs, sizeof(secFCS_t));\r
+        if (fcs != calcFCS(MRFI_P_PAYLOAD(frame)+F_SEC_MAC_OS, msglen-1-sizeof(secMAC_t)))\r
+        {\r
+          rc = 0;\r
+        }\r
+      }\r
+\r
+      /* we're done. */\r
+      done = 1;\r
+    }\r
+    else\r
+    {\r
+      /* Uh oh. Counters don't match. Try and resync. We need to distinguish among\r
+       * missed frames, duplicates and rogues plus account for counter wrap.\r
+       */\r
+      if (frameCnt > locCnt)\r
+      {\r
+        /* frameCnt is bigger. Second part of test below takes care of\r
+         * the unlikely case of a complete counter wrap (msb's all 0) in\r
+         * which case the test will incorrectly fail when the count is\r
+         * actually within the (wrapped) window. #ifdef'ed to avoid compiler\r
+         * warning in case user sets CNT_WINDOW to 0 (pointless comparison of\r
+         * unsigned value).\r
+         */\r
+        if (((frameCnt-CTR_WINDOW) <= locCnt)\r
+#if CTR_WINDOW > 0\r
+            || (frameCnt < CTR_WINDOW)\r
+#endif\r
+           )\r
+        {\r
+          /* Value within window. We probably missed something. Adjust and decipher.\r
+           * If locCnt is less because it wrapped and frameCnt didn't it means that\r
+           * it's a duplicate or late frame. In that case the following will lead to\r
+           * a decryption that fails sanity checks which is OK because the frame will\r
+           * be correctly rejected.\r
+           */\r
+          locCnt = frameCnt;\r
+        }\r
+        else\r
+        {\r
+          /* It's either a rogue or a really old duplicate packet. In either case\r
+           * we dismiss the frame.\r
+           */\r
+          rc   = 0;\r
+          done = 1;\r
+        }\r
+      }\r
+      else\r
+      {\r
+        /* locCnt is bigger. The only way the frame can be valid is if the\r
+         * counter wrapped causing frameCnt to appear to be smaller. Wrap the\r
+         * counter and decrypt. If the frame isn't valid, i.e., it's late,\r
+         * a duplicate, or a rogue, the decryption will fail sanity checks and\r
+         * the frame will be correctly rejected. The following arithmetic works\r
+         * correctly without a special test for the complete counter wrap case.\r
+         */\r
+        frameCnt += 0x100;   /* wrap the hint-based counter */\r
+        if (((frameCnt-CTR_WINDOW) <= locCnt))\r
+        {\r
+          /* An lsb wrap but still within window. We probably missed something.\r
+           * Adjust (with wrap) and decrypt.\r
+           */\r
+          locCnt = frameCnt;\r
+        }\r
+        else\r
+        {\r
+          /* rogue frame */\r
+          rc   = 0;\r
+          done = 1;\r
+        }\r
+      }\r
+    }\r
+  } while (!done);\r
+\r
+  if (ctr && rc)\r
+  {\r
+    /* Only update the counter if the count was a "real" one and the\r
+     * decryption succeeded.\r
+     */\r
+    *ctr = locCnt;\r
+  }\r
+\r
+  return rc;\r
+}\r
+\r
+#endif  /* SMPL_SECURE */\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/Components/nwk_applications/nwk_security.h b/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/Components/nwk_applications/nwk_security.h
new file mode 100755 (executable)
index 0000000..212ce8f
--- /dev/null
@@ -0,0 +1,48 @@
+/**************************************************************************************************\r
+  Filename:       nwk_security.h\r
+  Revised:        $Date: 2009-01-09 15:02:17 -0800 (Fri, 09 Jan 2009) $\r
+  Revision:       $Revision: 18728 $\r
+  Author:         $Author: lfriedman $\r
+\r
+  Description:    This file supports the SimpliciTI Security network application.\r
+\r
+  Copyright 2004-2007 Texas Instruments Incorporated. All rights reserved.\r
+\r
+  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+  the terms of a software license agreement between the user who downloaded the software,\r
+  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+  License. The License limits your use, and you acknowledge, that the Software may not be\r
+  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+  perform, display or sell this Software and/or its documentation for any purpose.\r
+\r
+  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+\r
+  Should you have any questions regarding your right to use this Software,\r
+  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+\r
+#ifndef NWK_SECURITY_H\r
+#define NWK_SECURITY_H\r
+\r
+/* change the following as Security application is developed */\r
+#define MAX_SEC_APP_FRAME    0\r
+\r
+/* prototypes  */\r
+void       nwk_securityInit(void);\r
+fhStatus_t nwk_processSecurity(mrfiPacket_t *);\r
+void       nwk_setSecureFrame(mrfiPacket_t *, uint8_t, uint32_t *);\r
+uint8_t    nwk_getSecureFrame(mrfiPacket_t *, uint8_t, uint32_t *);\r
+#endif\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/simpliciti.h b/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/simpliciti.h
new file mode 100755 (executable)
index 0000000..f528db8
--- /dev/null
@@ -0,0 +1,163 @@
+// *************************************************************************************************\r
+//\r
+//     Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/ \r
+//      \r
+//      \r
+//       Redistribution and use in source and binary forms, with or without \r
+//       modification, are permitted provided that the following conditions \r
+//       are met:\r
+//     \r
+//         Redistributions of source code must retain the above copyright \r
+//         notice, this list of conditions and the following disclaimer.\r
+//      \r
+//         Redistributions in binary form must reproduce the above copyright\r
+//         notice, this list of conditions and the following disclaimer in the \r
+//         documentation and/or other materials provided with the   \r
+//         distribution.\r
+//      \r
+//         Neither the name of Texas Instruments Incorporated nor the names of\r
+//         its contributors may be used to endorse or promote products derived\r
+//         from this software without specific prior written permission.\r
+//     \r
+//       THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \r
+//       "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT \r
+//       LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//       A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT \r
+//       OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, \r
+//       SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT \r
+//       LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//       DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//       THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT \r
+//       (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE \r
+//       OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+//\r
+// SimpliciTI packet size (TX only mode)\r
+// -------------------------------------\r
+// \r
+//             * packet rate                   (100/3) packets/second = 33.3 packets/second                            \r
+//             * packet length                 28 bytes \r
+//             * packet structure              4 bytes         preamble \r
+//                                                             4 bytes         sync \r
+//                                                             1 bytes         length \r
+//                                                             1 bytes         address \r
+//                                                             16 bytes        data\r
+//                                                                      12 byte network data\r
+//                                                                      4  byte user data\r
+//                                                             2 bytes         crc \r
+//\r
+// SimpliciTI frequency overview\r
+// -----------------------------\r
+//\r
+// CC430_End_Device_433MHz.lib (433MHz ISM band)\r
+//\r
+//             * base frequency                433.92 MHz\r
+//             * deviation                             32 kHz\r
+//             * channel spacing               25 kHz\r
+//             * used channel number   0 (frequency agility/hopping disabled)\r
+//             * data rate                             76.8 kBaud\r
+//             * output power                  1.4 dBm\r
+//             * duty                                  9,6% (TX only mode, 32 packets / second)\r
+//\r
+// CC430_End_Device_868MHz.lib (868MHz ISM band)\r
+//\r
+//             * base frequency                869.525 MHz\r
+//             * deviation                             32 kHz\r
+//             * channel spacing               25 kHz\r
+//             * used channel number   0 (frequency agility/hopping disabled)\r
+//             * data rate                             76.8 kBaud\r
+//             * output power                  1.1 dBm\r
+//             * duty                                  9,6% (TX only mode, 32 packets / second)\r
+//\r
+// CC430_End_Device_915MHz.lib (915MHz ISM band)\r
+//\r
+//             * base frequency                902.000 MHz\r
+//             * deviation                             32 kHz\r
+//             * channel spacing               200 kHz\r
+//             * used channel number   20 (frequency agility/hopping disabled)\r
+//             * data rate                             76.8 kBaud\r
+//             * output power                  1.3 dBm\r
+//             * duty                                  9.6% (TX only mode, 32 packets / second)\r
+//\r
+// *************************************************************************************************\r
+\r
+// ---------------------------------------------------------------\r
+// Generic defines and variables\r
+\r
+// Entry point into SimpliciTI library\r
+extern unsigned char simpliciti_link(void);\r
+\r
+// 4 byte device address overrides device address set during compile time\r
+extern unsigned char simpliciti_ed_address[4];\r
+\r
+// Maximum data length\r
+#define SIMPLICITI_MAX_PAYLOAD_LENGTH          (32u)\r
+\r
+// Data to send / receive \r
+extern unsigned char simpliciti_data[SIMPLICITI_MAX_PAYLOAD_LENGTH];\r
+\r
+// Flag contains status information and triggers to send data or to exit SimpliciTI library\r
+// Control is done from outside SimpliciTI library\r
+extern unsigned char simpliciti_flag;\r
+#define SIMPLICITI_STATUS_LINKING                      (BIT0)  \r
+#define SIMPLICITI_STATUS_LINKED                       (BIT1)\r
+#define SIMPLICITI_STATUS_ERROR                            (BIT2)\r
+#define SIMPLICITI_TRIGGER_SEND_DATA           (BIT3)\r
+#define SIMPLICITI_TRIGGER_RECEIVED_DATA           (BIT4)\r
+#define SIMPLICITI_TRIGGER_STOP                            (BIT5)\r
+\r
+// Radio frequency offset read from calibration memory\r
+// Compensates crystal deviation from 26MHz nominal value\r
+extern unsigned char rf_frequoffset;\r
+\r
+// Macros\r
+#define getFlag(val, flag)                                             ((val&flag)==flag)\r
+#define setFlag(val, flag)                                             (val|=flag)\r
+#define clearFlag(val, flag)                                   (val&=(~flag))\r
+#define toggleFlag(val, flag)                                  (val^=flag)\r
+\r
+\r
+// ---------------------------------------------------------------\r
+// SimpliciTI RX only\r
+\r
+// Entry point into SimpliciTI library\r
+extern void simpliciti_main_tx_only(void);\r
+\r
+// Callback function to read data from acceleration sensor or buttons and trigger sending \r
+extern void simpliciti_get_ed_data_callback(void);\r
+\r
+\r
+// ---------------------------------------------------------------\r
+// SimpliciTI Sync\r
+\r
+// Sync data length\r
+#define BM_SYNC_DATA_LENGTH                     (19u)\r
+\r
+// Device data  (0)TYPE   (1) - (18) DATA \r
+#define SYNC_ED_TYPE_R2R                        (1u)\r
+#define SYNC_ED_TYPE_MEMORY                     (2u)\r
+#define SYNC_ED_TYPE_STATUS                     (3u)\r
+\r
+// Host data    (0)CMD    (1) - (18) DATA \r
+#define SYNC_AP_CMD_NOP                         (1u)\r
+#define SYNC_AP_CMD_GET_STATUS                                 (2u)\r
+#define SYNC_AP_CMD_SET_WATCH                   (3u)\r
+#define SYNC_AP_CMD_GET_MEMORY_BLOCKS_MODE_1           (4u)\r
+#define SYNC_AP_CMD_GET_MEMORY_BLOCKS_MODE_2           (5u)\r
+#define SYNC_AP_CMD_ERASE_MEMORY                (6u)\r
+#define SYNC_AP_CMD_EXIT                                               (7u)\r
+\r
+\r
+// Entry point into SimpliciTI library\r
+extern void simpliciti_main_sync(void);\r
+\r
+// Callback function to decode access point command\r
+extern void simpliciti_sync_decode_ap_cmd_callback(void);\r
+\r
+// Callback function to read data from application and trigger sending\r
+extern void simpliciti_sync_get_data_callback(unsigned int index);\r
+\r
+// Send reply packets (>0), 0=no need to reply\r
+extern unsigned char simpliciti_reply_count;\r
+\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/simpliciti_readme.txt b/chronos-ti/Software Projects/Chronos Watch/IAR/Data Logger/simpliciti/simpliciti_readme.txt
new file mode 100755 (executable)
index 0000000..d1ff81d
--- /dev/null
@@ -0,0 +1,46 @@
+Some notes about the SimpliciTI configuration used in this project\r
+\r
+- The source code is based on the SimpliciTI 1.1.1 release.\r
+\r
+- A full SimpliciTI installation contains configurations for many targets and device types. To avoid confusion,\r
+  only the configuration (End Device) and target files (CC430EM) required for the eZ430-Chronos have been used.\r
+\r
+- All source code files have been copied into the project physically. Symbolic links have been replaced with\r
+  the real source code file. \r
+  \r
+- Due to the indirect inclusion scheme of hardware-dependent source code, some source code files have been\r
+  excluded from build. However, they will be included through higher level source code.  \r
+\r
+- Some modifications where required to the original source code. All these changes have been marked with [BM].\r
+\r
+       bsp_board.c/BSP_InitBoard(void)                 Changed from TA0 to TA1 for delay function, because TA0 is already occupied.\r
+\r
+       bsp_msp430_defs.h/BSP_EarlyInit(void)   Function removed, because SimpliciTI must run in watch context\r
+\r
+       mrfi_radio_interface.c/mrfiRadioInterfaceCmdStrobe(uint8_t addr)\r
+                                                                                       Added code to properly synchronize with radio interface. Otherwise\r
+                                                                                       interface could get stuck.\r
+                                                                                       \r
+       mrfi_radio.c                                                    Changed channel assignment (mrfiLogicalChanTable) for three ISM bands\r
+                                                                                       Changed power output settings (mrfiRFPowerTable) for three ISM bands\r
+                               \r
+       mrfi_radio.c/MRFI_Init(void)                    Added frequency offset correction to use calibrated frequency offset\r
+                                                                                       when starting RF communication\r
+                                                                                       \r
+       mrfi_radio.c/MRFI_RadioIsr(void)                Changed radio ISR to normal function, since we have a shared radio ISR\r
+       \r
+       nwk_api.c                                                               Made variable sInit_done globally available to allow SimpliciTI to shutdown \r
+                                                                                       and restart multiple times\r
+       \r
+       nwk.c/nwk_nwkInit                                               Added workaround to allow allow SimpliciTI to shutdown \r
+                                                                                       and restart multiple times\r
+\r
+- If you (for whatever reason) want to upgrade to a newer version of SimpliciTI, please bear in mind that\r
+\r
+       a) the access point SimpliciTI version is 1.1.1 (and cannot be updated)\r
+\r
+       b) the workarounds used here to enable SimpliciTI to shutdown and restart multiple times might not necessarily\r
+          work when used with later revisions\r
+                  \r
+          \r
+       
\ No newline at end of file
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/bluerobin/BlueRobin_RX_433MHz.r43 b/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/bluerobin/BlueRobin_RX_433MHz.r43
new file mode 100755 (executable)
index 0000000..6bc0263
Binary files /dev/null and b/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/bluerobin/BlueRobin_RX_433MHz.r43 differ
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/bluerobin/BlueRobin_RX_868MHz.r43 b/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/bluerobin/BlueRobin_RX_868MHz.r43
new file mode 100755 (executable)
index 0000000..beb04a4
Binary files /dev/null and b/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/bluerobin/BlueRobin_RX_868MHz.r43 differ
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/bluerobin/BlueRobin_RX_915MHz.r43 b/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/bluerobin/BlueRobin_RX_915MHz.r43
new file mode 100755 (executable)
index 0000000..17a47b4
Binary files /dev/null and b/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/bluerobin/BlueRobin_RX_915MHz.r43 differ
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/bluerobin/BlueRobin_RX_API.h b/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/bluerobin/BlueRobin_RX_API.h
new file mode 100755 (executable)
index 0000000..049c99f
--- /dev/null
@@ -0,0 +1,157 @@
+// *************************************************************************************************\r
+//\r
+// Copyright 2009 BM innovations GmbH (www.bm-innovations.com), all rights reserved.\r
+//\r
+// This trial version of the "BlueRobin(TM) receiver library for the Texas Instruments\r
+// CC430 SoC" may be used for non-profit non-commercial purposes only. If you want to use\r
+// BlueRobin(TM) in a commercial project, please contact the copyright holder for a\r
+// separate license agreement.\r
+//\r
+// By using this trial version of the "BlueRobin(TM) receiver library for the Texas Instruments\r
+// CC430 SoC", you implicitly agree that you will not modify, adapt, disassemble, decompile,\r
+// reverse engineer, translate or otherwise attempt to discover the source code of the\r
+// "BlueRobin(TM) receiver library for the Texas Instruments CC430 SoC".\r
+//\r
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY\r
+// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\r
+// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\r
+//\r
+// IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\r
+// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\r
+// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\r
+// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\r
+// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\r
+// THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+//\r
+// Public header for eZ430-Chronos specific BlueRobin(TM) receiver library.\r
+//\r
+// The following BlueRobin(TM) profiles are supported by this build\r
+//   - heart rate (HR) transmitter\r
+//\r
+// The following number of channels is supported: 1\r
+//\r
+// *************************************************************************************************\r
+//\r
+// BlueRobin(TM) packet size\r
+// -------------------------\r
+//\r
+//              * average packet rate   1 packet/875 msec = ~1.14 packets/second\r
+//              * payload per packet    5 bytes\r
+//\r
+// BlueRobin(TM) frequency overview\r
+// (Please note: Settings apply for the transmitter side, i.e. the USB dongle)\r
+// ----------------------------------------------------------------------\r
+//\r
+// Bluerobin_RX_433MHz.lib (433MHz ISM band)\r
+//\r
+//              * frequency                             433.30 MHz - 434.00 MHz\r
+//              * deviation                             95 kHz\r
+//              * channels                              3\r
+//              * data rate                             250 kBaud\r
+//\r
+// Bluerobin_RX_868MHz.lib (868MHz ISM band)\r
+//\r
+//              * frequency                             868.25 MHz - 868.95 MHz\r
+//              * deviation                             95 kHz\r
+//              * channels                              3\r
+//              * data rate                             250 kBaud\r
+//\r
+//\r
+// Bluerobin_RX_915MHz.lib (915MHz ISM band)\r
+//\r
+//              * frequency                             914.35 MHz - 917.75 MHz\r
+//              * deviation                             95 kHz\r
+//              * channels                              34\r
+//              * data rate                             250 kBaud\r
+//\r
+// *************************************************************************************************\r
+\r
+#ifndef BRRX_API_H_\r
+#define BRRX_API_H_\r
+\r
+// *************************************************************************************************\r
+// Include section\r
+\r
+// *************************************************************************************************\r
+// Defines section\r
+\r
+// List of all possible channel states\r
+typedef enum\r
+{\r
+    TX_OFF = 0,                 // Powerdown mode\r
+    TX_ACTIVE,                  // Active mode\r
+    TX_SEARCH                   // Search mode\r
+} brtx_state_t;\r
+\r
+// Transmitter to channel assignment\r
+#define HR_CHANNEL           (0)\r
+\r
+// *************************************************************************************************\r
+// API section\r
+\r
+// ----------------------------------------------------------\r
+// Functions for initializing and controlling the library\r
+\r
+// Initialize several global variables.\r
+void BRRX_Init_v(void);\r
+\r
+// Set delay after which a channel will be switched off if no new data can be received.\r
+// Param1: Powerdown delay in packet intervals (875 ms)\r
+void BRRX_SetPowerdownDelay_v(u8 Delay_u8);\r
+\r
+// Set timeout when searching for a transmitter\r
+// Param1: Search timeout in seconds\r
+void BRRX_SetSearchTimeout_v(u8 Timeout_u8);\r
+\r
+// Set reduction of valid signal level in learn mode.\r
+// Param1: Reduction of signal level\r
+void BRRX_SetSignalLevelReduction_v(u8 Reduction_u8);\r
+\r
+// Set ID for a channel. To search for an unknown transmitter the ID has to be set to 0.\r
+// Can be only executed on channels currently in powerdown mode.\r
+// Param1: Channel index\r
+// Param2: New ID\r
+void BRRX_SetID_v(u8 Index_u8, u32 ID_u32);\r
+\r
+// Get current ID of channel.\r
+// Return: Current ID of channel\r
+// Param1: Channel index\r
+u32 BRRX_GetID_u32(u8 Index_u8);\r
+\r
+// Start reception on one or all channels.\r
+// Param1: Channel index (use 0xFF to start all channels)\r
+void BRRX_Start_v(u8 Index_u8);\r
+\r
+// Stop reception on one or all channels.\r
+// Param1: Channel index (0xFF for all channels)\r
+void BRRX_Stop_v(u8 Index_u8);\r
+\r
+// Get current state of a channel\r
+// Param1: Channel index\r
+brtx_state_t BRRX_GetState_t(u8 Index_u8);\r
+\r
+// ----------------------------------------------------------\r
+// eZ430-Chronos specific functions\r
+\r
+// Get current heart rate.\r
+// Return: Heart rate in bpm\r
+u8 BRRX_GetHeartRate_u8(void);\r
+\r
+// Get current distance.\r
+// Return: Distance in 10m steps.\r
+u16 BRRX_GetDistance_u16(void);\r
+\r
+// Get current speed.\r
+// Return: Speed in 0.1km/h steps. Trial version is limited to 25.5km/h.\r
+u8 BRRX_GetSpeed_u8(void);\r
+\r
+// ----------------------------------------------------------\r
+// Radio-related functions\r
+\r
+// RX packet end service function\r
+// Must be called by CC1101_VECTOR ISR\r
+void BlueRobin_RadioISR_v(void);\r
+\r
+#endif                          /*BRRX_API_H_ */\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/bluerobin/bm.h b/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/bluerobin/bm.h
new file mode 100755 (executable)
index 0000000..781b1e1
--- /dev/null
@@ -0,0 +1,480 @@
+// *************************************************************************************************\r
+//\r
+// Copyright 2009 BM innovations GmbH (www.bm-innovations.com), all rights reserved.\r
+//\r
+// This trial version of the "BlueRobin(TM) receiver library for the Texas Instruments\r
+// CC430 SoC" may be used for non-profit non-commercial purposes only. If you want to use\r
+// BlueRobin(TM) in a commercial project, please contact the copyright holder for a\r
+// separate license agreement.\r
+//\r
+// By using this trial version of the "BlueRobin(TM) receiver library for the Texas Instruments\r
+// CC430 SoC", you implicitly agree that you will not modify, adapt, disassemble, decompile,\r
+// reverse engineer, translate or otherwise attempt to discover the source code of the\r
+// "BlueRobin(TM) receiver library for the Texas Instruments CC430 SoC".\r
+//\r
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY\r
+// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\r
+// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\r
+//\r
+// IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\r
+// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\r
+// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\r
+// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\r
+// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\r
+// THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+// Standard definitions, have to be included in every source and header file.\r
+// *************************************************************************************************\r
+\r
+#ifndef __BM_H\r
+#define __BM_H\r
+\r
+#if (defined __IAR_SYSTEMS_ASM) || (defined __IAR_SYSTEMS_ASM__)\r
+#    define _ASSEMBLER_USED_\r
+#endif\r
+\r
+#ifndef _ASSEMBLER_USED_\r
+#    include <stddef.h>\r
+#endif\r
+\r
+#ifndef FALSE\r
+// the classic false\r
+#    define FALSE (0 == 1)\r
+#endif\r
+\r
+#ifndef TRUE\r
+// the classic true\r
+#    define TRUE  (1 == 1)\r
+#endif\r
+\r
+#ifndef USE_RAW_ATTR\r
+// per default this feature is disabled\r
+#    define USE_RAW_ATTR FALSE\r
+#endif\r
+\r
+// *************************************************************************************************\r
+// First Section: Basic Data Types\r
+// *************************************************************************************************\r
+\r
+// Fundamental #definitions\r
+// CPU target idents are used for target dependent compilations\r
+\r
+// Texas Instruments MSP430\r
+#define _TI_MSP430_  (16)\r
+\r
+// Find the currently running compiler\r
+// and make the related #define's\r
+\r
+// _IAR_TID_                target ID from IAR compilers\r
+// _CPU_TID_                remap to enum of processor target numbers\r
+// _CPU_8BIT_INT_           type for 8 bit int\r
+// _CPU_16BIT_INT_          type for 16 bit int\r
+// _CPU_32BIT_INT_          type for 32 bit int\r
+// _CPU_32BIT_FLOAT_        type for 32 bit float\r
+// _CPU_64BIT_FLOAT_        type for 64 bit float\r
+// INTERRUPT                declares an interrupt service routine without an entry in the vector\r
+// table\r
+// ISR(vector)              declares an interrupt service routine which is added in vector table at\r
+// offset vector\r
+// MONITOR                  declares a function atomic\r
+// INTERRUPTS_ENABLE        remap to the intrinsic for enable interrupts\r
+// INTERRUPTS_DISABLE       remap to the intrinsic for disable interrupts\r
+// NO_OPERATION             remap to the intrinsic for no operation\r
+// _CPU_DIRECTION_OUT_1_    if TRUE the direction register indicates with an 1: direction is output\r
+// _CPU_EDGE_HIGH_LOW_1_    if TRUE the edge select register indicates with an 1: trigger on high\r
+// low\r
+// NO_INIT                  declare a variable as not initialized\r
+// INLINE_FUNC              declare a function as inline for release builds\r
+\r
+#if ((defined __IAR_SYSTEMS_ICC) || (defined __IAR_SYSTEMS_ASM)) && (__IAR_SYSTEMS_ICC__ < 2)\r
+// Found IAR Compiler with classic IAR frontend\r
+#    ifndef _IAR_TID_\r
+#        define _IAR_TID_ ((__TID__ >> 8) & 0x7f)\r
+#    endif\r
+\r
+#    define INTERRUPT   interrupt\r
+#    define ISR(vector) interrupt[(vector)]\r
+#    define MONITOR     monitor\r
+\r
+#    if ((_IAR_TID_) == 43)\r
+// Found Texas Instruments MSP430 CPU\r
+#        define _CPU_TID_             _TI_MSP430_\r
+#        define _CPU_DIRECTION_OUT_1_ TRUE\r
+#        define _CPU_EDGE_HIGH_LOW_1_ TRUE\r
+#        define INTERRUPTS_ENABLE()   _EINT()\r
+// WA for HW bug, add a NOP\r
+#        define INTERRUPTS_DISABLE()  { _DINT(); _NOP(); }\r
+#        define NO_OPERATION()        _NOP()\r
+\r
+#    else\r
+#        error "Unknown IAR Compiler, the file bm.h has to be expanded !"\r
+#    endif\r
+\r
+#elif defined __IAR_SYSTEMS_ICC__\r
+// Found IAR Compiler with EDG frontend\r
+#    define _IAR_TID_ ((__TID__ >> 8) & 0x7f)\r
+\r
+#    if USE_RAW_ATTR == TRUE\r
+// Use the raw attribute in ISR's\r
+#        define _RAW __raw\r
+#    else\r
+// Empty define RAW as it is not used\r
+#        define _RAW\r
+#    endif\r
+#    define INTERRUPT   _RAW __interrupt\r
+#    define MONITOR     __monitor\r
+#    define NO_INIT     __no_init\r
+#    define INTERRUPTS_ENABLE()   __enable_interrupt()\r
+#    define INTERRUPTS_DISABLE()  __disable_interrupt()\r
+#    define NO_OPERATION()        __no_operation()\r
+\r
+#    ifndef DEBUG\r
+// Force inlining of function in release builds\r
+#        define INLINE_FUNC PRAGMA(inline = forced)\r
+#    else\r
+// Do not force inlining of function in debug builds\r
+#        define INLINE_FUNC\r
+#    endif\r
+\r
+#    if (!defined CODECHECK) && (!defined __DA_C__)\r
+// Define to a new way of using #pragmas in preprocessor\r
+#        define PRAGMA(x) _Pragma(# x)\r
+#        define ISR(x) PRAGMA(vector = (x)) INTERRUPT\r
+#    endif\r
+\r
+#    if ((_IAR_TID_) == 43)\r
+// Found Texas Instruments MSP430 CPU  (V2)\r
+#        define _CPU_TID_             _TI_MSP430_\r
+#        define _CPU_DIRECTION_OUT_1_ TRUE\r
+#        define _CPU_EDGE_HIGH_LOW_1_ TRUE\r
+#        define _CPU_64BIT_INT_       long long\r
+#        if __VER__ < 220\r
+// WA for HW bug, add a nop after DINT, Compiler has a bugfix since version 2.20\r
+#            undef  INTERRUPTS_DISABLE\r
+#            define INTERRUPTS_DISABLE()  { __disable_interrupt(); __no_operation(); }\r
+#        endif\r
+\r
+#    else\r
+#        error "Unknown new IAR Compiler, the file bm.h has to be expanded !"\r
+#    endif\r
+\r
+#elif defined __CCE__\r
+// Found CCE Compiler\r
+#    define INTERRUPT   __interrupt\r
+#    define MONITOR             // __monitor\r
+#    define NO_INIT     __no_init\r
+#    define INTERRUPTS_ENABLE()   __enable_interrupt()\r
+#    define INTERRUPTS_DISABLE()  __disable_interrupt()\r
+#    define NO_OPERATION()        __no_operation()\r
+\r
+#    ifndef DEBUG\r
+// Force inlining of function in release builds\r
+#        define INLINE_FUNC PRAGMA(inline = forced)\r
+#    else\r
+// Do not force inlining of function in debug builds\r
+#        define INLINE_FUNC\r
+#    endif\r
+\r
+// Found Texas Instruments MSP430 CPU  (V2)\r
+#    define _CPU_TID_             _TI_MSP430_\r
+#    define _CPU_DIRECTION_OUT_1_ TRUE\r
+#    define _CPU_EDGE_HIGH_LOW_1_ TRUE\r
+//#define _CPU_64BIT_INT_       long long\r
+\r
+//  #endif\r
+\r
+#else\r
+#    error "Unknown Compiler, the file bm.h has to be expanded !"\r
+#endif\r
+\r
+#ifndef _ASSEMBLER_USED_\r
+// Get the limits to autodetect the size of integral types\r
+#    include <limits.h>\r
+// Get floats to autodetect the size of float types\r
+#    include <float.h>\r
+\r
+// ***********************************************************************************************\r
+//\r
+// Common basic data types\r
+//\r
+// ***********************************************************************************************\r
+#    if UCHAR_MAX == 0xFFu\r
+#        define _CPU_8BIT_INT_ char\r
+#    else\r
+#        error "unable to get size of u8 automatically"\r
+#    endif\r
+\r
+#    if USHRT_MAX == 0xFFFFu\r
+#        define _CPU_16BIT_INT_ short\r
+#    elif UINT_MAX == 0xFFFFu\r
+#        define _CPU_16BIT_INT_ int\r
+#    else\r
+#        error "unable to get size of u16 automatically"\r
+#    endif\r
+\r
+#    if USHRT_MAX == 0xFFFFFFFFu\r
+#        define _CPU_32BIT_INT_ short\r
+#    elif UINT_MAX == 0xFFFFFFFFu\r
+#        define _CPU_32BIT_INT_ int\r
+#    elif ULONG_MAX == 0xFFFFFFFFu\r
+#        define _CPU_32BIT_INT_ long\r
+#    else\r
+#        error "unable to get size of u32 automatically"\r
+#    endif\r
+\r
+#    ifdef __IAR_SYSTEMS_ICC__\r
+#        if __IAR_SYSTEMS_ICC__ > 1\r
+#            define _CPU_32BIT_FLOAT_ float\r
+#            if __DOUBLE_SIZE__ == 8\r
+#                define _CPU_64BIT_FLOAT_ double\r
+#            endif\r
+#        endif\r
+#    endif\r
+\r
+#    ifndef _CPU_32BIT_FLOAT_\r
+#        if FLT_MANT_DIG == 24\r
+#            define _CPU_32BIT_FLOAT_ float\r
+#        elif DBL_MANT_DIG == 24\r
+#            define _CPU_32BIT_FLOAT_ double\r
+#        else\r
+#            error "unable to get size of f32 automatically"\r
+#        endif\r
+\r
+#        if DBL_MANT_DIG == 53\r
+#            define _CPU_64BIT_FLOAT_ double\r
+#        endif\r
+#    endif\r
+\r
+// ***********************************************************************************************\r
+//\r
+// Following lines #typedef the basic data types in a compiler independent way.\r
+//\r
+// ***********************************************************************************************\r
+\r
+#    ifdef _CPU_8BIT_INT_\r
+// unsigned 8 bit\r
+typedef unsigned _CPU_8BIT_INT_ u8;\r
+// unsigned 8 bit max value\r
+#        define U8_MAX (0xFFU)\r
+// signed 8 bit max value\r
+typedef signed _CPU_8BIT_INT_ s8;\r
+// signed 8 bit min value\r
+#        define S8_MIN (-127 - 1)\r
+// signed 8 bit max value\r
+#        define S8_MAX (127)\r
+#    endif\r
+\r
+#    ifdef _CPU_16BIT_INT_\r
+// unsigned 16 bit\r
+typedef unsigned _CPU_16BIT_INT_ u16;\r
+// unsigned 16 bit max value\r
+#        define U16_MAX (0xFFFFU)\r
+// signed 16 bit\r
+typedef signed _CPU_16BIT_INT_ s16;\r
+// signed 16 bit min value\r
+#        define S16_MIN (-32767 - 1)\r
+// signed 16 bit max value\r
+#        define S16_MAX (32767)\r
+#    endif\r
+\r
+#    ifdef _CPU_32BIT_INT_\r
+// unsigned 32 bit\r
+typedef unsigned _CPU_32BIT_INT_ u32;\r
+// unsigned 32 bit max value\r
+#        define U32_MAX (0xFFFFFFFFUL)\r
+// signed 32 bit\r
+typedef signed _CPU_32BIT_INT_ s32;\r
+// signed 32 bit min value\r
+#        define S32_MIN (-2147483647L - 1L)\r
+// signed 32 bit max value\r
+#        define S32_MAX (2147483647L)\r
+#    endif\r
+\r
+#    ifdef _CPU_64BIT_INT_\r
+// unsigned 64 bit\r
+typedef unsigned _CPU_64BIT_INT_ u64;\r
+// signed 64 bit\r
+typedef signed _CPU_64BIT_INT_ s64;\r
+#    endif\r
+\r
+#    ifdef _CPU_32BIT_FLOAT_\r
+// float 32 bit\r
+typedef _CPU_32BIT_FLOAT_ f32;\r
+// number of digits in mantissa of f32\r
+#        define F32_MANT_DIG   (24)\r
+// epsilon for f32\r
+#        define F32_EPSILON    (1.192092896e-07)\r
+// number of digits of precision of f32\r
+#        define F32_DIG        (6)\r
+// exponent min of f32\r
+#        define F32_MIN_EXP    (-125)\r
+// min positive value of f32\r
+#        define F32_MIN        (1.175494351e-38)\r
+// decimal exponent min of f32\r
+#        define F32_MIN_10_EXP (-37)\r
+// exponent max of f32\r
+#        define F32_MAX_EXP    (128)\r
+// max value of f32\r
+#        define F32_MAX        (3.402823466e+38)\r
+// decimal exponent max of f32\r
+#        define F32_MAX_10_EXP (38)\r
+#    endif\r
+\r
+#    ifdef _CPU_64BIT_FLOAT_\r
+// float 64 bit\r
+typedef _CPU_64BIT_FLOAT_ f64;\r
+// number of digits in mantissa of f64\r
+#        define F64_MANT_DIG   (53)\r
+// epsilon for f64\r
+#        define F64_EPSILON    (2.2204460492503131e-016)\r
+// number of digits of precision of f64\r
+#        define F64_DIG        (15)\r
+// exponent min of f64\r
+#        define F64_MIN_EXP    (-1021)\r
+// min positive value of f64\r
+#        define F64_MIN        (2.2250738585072014e-308)\r
+// decimal exponent min of f64\r
+#        define F64_MIN_10_EXP (-307)\r
+// exponent max of f64\r
+#        define F64_MAX_EXP    (1024)\r
+// max value of f64\r
+#        define F64_MAX        (1.7976931348623158e+308)\r
+// decimal exponent max of f64\r
+#        define F64_MAX_10_EXP (308)\r
+#    endif\r
+\r
+typedef unsigned char BYTE;\r
+typedef unsigned int WORD;\r
+typedef unsigned long DWORD;\r
+\r
+#endif                          // _ASSMEBLER_USED_\r
+\r
+// A macro that calculates the number of bits of a given type\r
+#ifndef BITSIZEOF\r
+#    define BITSIZEOF(type) (sizeof(type) * CHAR_BIT)\r
+#endif\r
+\r
+/* A macro that generates a bit mask according to a given bit number.\r
+ * Example:\r
+ * - BIT(0) expands to 1 (== 0x01)\r
+ * - BIT(3) expands to 8 (== 0x08)\r
+ */\r
+#define BIT(x) (1uL << (x))\r
+\r
+/* A macro that generates a bit mask according to a given bit number with a cast to type.\r
+ * The difference to BIT(X) is the additional type argument T that is used to cast the type of the\r
+ * constant 1 and the type of the result as well.\r
+ * Example:\r
+ * - BIT_T(u8,0)  expands to (u8)1  (== 0x01)\r
+ * - BIT_T(u32,3) expands to (u32)8 (== 0x08L)\r
+ */\r
+#define BIT_T(t, x) ((t)((t)1 << (x)))\r
+\r
+/* A macro to calculate the position of the highest bit.\r
+ * The result is same as LOG2 in case only one bit is set. Use with constant values only because\r
+ * of code size.\r
+ */\r
+#define BIT_HIGHEST(Input_u32) (     \\r
+        ((Input_u32) & BIT(31)) ? 31 : ( \\r
+            ((Input_u32) & BIT(30)) ? 30 : ( \\r
+                ((Input_u32) & BIT(29)) ? 29 : ( \\r
+                    ((Input_u32) & BIT(28)) ? 28 : ( \\r
+                        ((Input_u32) & BIT(27)) ? 27 : ( \\r
+                            ((Input_u32) & BIT(26)) ? 26 : ( \\r
+                                ((Input_u32) & BIT(25)) ? 25 : ( \\r
+                                    ((Input_u32) & BIT(24)) ? 24 : ( \\r
+                                        ((Input_u32) & BIT(23)) ? 23 : ( \\r
+                                            ((Input_u32) & BIT(22)) ? 22 : ( \\r
+                                                ((Input_u32) & BIT(21)) ? 21 : ( \\r
+                                                    ((Input_u32) & BIT(20)) ? 20 : ( \\r
+                                                        ((Input_u32) & BIT(19)) ? 19 : ( \\r
+                                                            ((Input_u32) & BIT(18)) ? 18 : ( \\r
+                                                                ((Input_u32) & BIT(17)) ? 17 : ( \\r
+                                                                    ((Input_u32) & BIT(16)) ? 16 : ( \\r
+                                                                        ((Input_u32) & \\r
+                                                                         BIT(15)) ? 15 : ( \\r
+                                                                            ((Input_u32) & \\r
+                                                                             BIT(14)) ? 14 : ( \\r
+                                                                                ((Input_u32) & \\r
+                                                                                 BIT(13)) ? 13 : ( \\r
+                                                                                    ((Input_u32) & \\r
+                                                                                     BIT(12)) ? 12 \\r
+                                                                                    : ( \\r
+                                                                                        ((Input_u32) \\r
+                                                                                         & BIT(11)) \\r
+                                                                                        ? 11 : ( \\r
+                                                                                            (( \\r
+                                                                                                 Input_u32) \\r
+                                                                                             & BIT( \\r
+                                                                                                 10)) ? 10 : ( \\r
+                                                                                                (( \\r
+                                                                                                     Input_u32) \\r
+                                                                                                 & \\r
+                                                                                                 BIT(9)) ?  9 : ( \\r
+                                                                                                    (( \\r
+                                                                                                         Input_u32) \\r
+                                                                                                     & \\r
+                                                                                                     BIT(8)) ?  8 : ( \\r
+                                                                                                        (( \\r
+                                                                                                             Input_u32) \\r
+                                                                                                         & \\r
+                                                                                                         BIT(7)) ?  7 : ( \\r
+                                                                                                            (( \\r
+                                                                                                                 Input_u32) \\r
+                                                                                                             & \\r
+                                                                                                             BIT(6)) ?  6 : ( \\r
+                                                                                                                (( \\r
+                                                                                                                     Input_u32) \\r
+                                                                                                                 & \\r
+                                                                                                                 BIT(5)) ?  5 : ( \\r
+                                                                                                                    (( \\r
+                                                                                                                         Input_u32) \\r
+                                                                                                                     & \\r
+                                                                                                                     BIT(4)) ?  4 : ( \\r
+                                                                                                                        (( \\r
+                                                                                                                             Input_u32) \\r
+                                                                                                                         & \\r
+                                                                                                                         BIT(3)) ?  3 : ( \\r
+                                                                                                                            (( \\r
+                                                                                                                                 Input_u32) \\r
+                                                                                                                             & \\r
+                                                                                                                             BIT(2)) ?  2 : ( \\r
+                                                                                                                                (( \\r
+                                                                                                                                     Input_u32) \\r
+                                                                                                                                 & \\r
+                                                                                                                                 BIT(1)) ?  1 : ( \\r
+                                                                                                                                    (( \\r
+                                                                                                                                         Input_u32) \\r
+                                                                                                                                     & \\r
+                                                                                                                                     BIT(0)) ?  0 :  -1uL))))))))))))))))))))))))))))))))\r
+\r
+#ifndef MONITOR\r
+#    define MONITOR\r
+#endif\r
+\r
+#ifndef NO_INIT\r
+#    define NO_INIT\r
+#endif\r
+\r
+#ifndef INTERRUPT\r
+#    define INTERRUPT\r
+#endif\r
+\r
+#ifndef ISR\r
+#    define ISR(ignore)\r
+#endif\r
+\r
+#ifndef INLINE_FUNC\r
+#    define INLINE_FUNC\r
+#endif\r
+\r
+#ifndef INTERRUPTS_ENABLE\r
+#    define INTERRUPTS_ENABLE()\r
+#endif\r
+\r
+#ifndef INTERRUPTS_DISABLE\r
+#    define INTERRUPTS_DISABLE()\r
+#endif\r
+\r
+#endif                          // __BM_H\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/change_record.txt b/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/change_record.txt
new file mode 100755 (executable)
index 0000000..37f7597
--- /dev/null
@@ -0,0 +1,38 @@
+V1.6 (21.11.2010)\r
+Fixed following bugs\r
+- rfsimpliciti.c/simpliciti_sync_decode_ap_cmd_callback(),\r
+- timer.c/TIMER0_A0_ISR(),                                             LCD shows "done" after successfully received data\r
+- main.c/wakeup_event(),\r
+- rfbsl.c/sx_rfbsl()                                                   rfBSL requires two button presses in order to update watch \r
+- timer.c/Timer0_A3_Start()                                            Fixed register read (Asynchronous)\r
+- timer.c/Timer0_A4_Delay()                                            Fixed register read (Asynchronous)\r
+                                                                       Avoid unwanted flag changes caused by interrupt methods\r
+                                                                       After timeout the accelerometer menu shows "----"\r
+- port.c/PORT2_ISR() and timer.c/TIMER0_A0_ISR()                       Changes the menu if the pressed time from STAR or NUM button are between "short(50ms)" and "long(3s)" \r
+                                                                       The backlight stays 3 seconds on\r
+- display.c                                                            Removed file display1.c. The content is now in display.c \r
+- display.h                                                            Fixed LCD_UNIT_L1_PER_S_MASK bit\r
+\r
+Other changes:\r
+- adc12.c and adc12.h                                                  Removed commented function and #defines\r
+- battery.c                                                            Removed commented function\r
+- DCO settling time                                                    Set to 375000 cycles\r
+________________________________________________________________________________________________________________________________________________\r
+V1.5 (16.03.2010)\r
+Fixed following bugs\r
+- main.c/init_application()                                            Changed XT1 drive level to highest to avoid ACLK noise when turning on backlight.\r
+- main.c/wakeup_event(), timer.c/TIMER0_A0_ISR()                       Modified key lock procedure.\r
+- vti_ps.c/ps_get_temp()                                               Negative °C are now converted correctly to Kelvin\r
+- altitude.c/mx_altitude()                                             Enabled fast mode when changing altitude offset\r
+- ports.c/PORT2_ISR()                                                  Disabled stopwatch stop when watch buttons are locked\r
+\r
+Other changes\r
+- main.c/read_calibration_values()                                     Added range check for rf_frequoffset variable\r
+                                                                       Added bytes for altitude offset correction and s/w version\r
+- altitude.h, altitude.c                                               Added initial altitude offset correction \r
+- SimpliciTI                                                           Added SimpliciTI sources to project. Upgraded to Version 1.1.1.\r
+- RFBSL                                                                        Added wireless update support\r
+- Button names                                                         Changed button names from M1/M2/S1/S2/BL to STAR/NUM/UP/DOWN/BACKLIGHT\r
+__________________________________________________________________________________________________________________________________________________                                                                                                     \r
+V1.4 (22.11.2009)\r
+First version released to manufacturing.
\ No newline at end of file
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/driver/adc12.c b/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/driver/adc12.c
new file mode 100755 (executable)
index 0000000..07f13cc
--- /dev/null
@@ -0,0 +1,164 @@
+// *************************************************************************************************\r
+//\r
+//      Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//        Redistribution and use in source and binary forms, with or without\r
+//        modification, are permitted provided that the following conditions\r
+//        are met:\r
+//\r
+//          Redistributions of source code must retain the above copyright\r
+//          notice, this list of conditions and the following disclaimer.\r
+//\r
+//          Redistributions in binary form must reproduce the above copyright\r
+//          notice, this list of conditions and the following disclaimer in the\r
+//          documentation and/or other materials provided with the\r
+//          distribution.\r
+//\r
+//          Neither the name of Texas Instruments Incorporated nor the names of\r
+//          its contributors may be used to endorse or promote products derived\r
+//          from this software without specific prior written permission.\r
+//\r
+//        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+// ADC12 functions.\r
+// *************************************************************************************************\r
+\r
+// *************************************************************************************************\r
+// Include section\r
+\r
+// system\r
+#include <project.h>\r
+\r
+// driver\r
+#include "adc12.h"\r
+#include "timer.h"\r
+\r
+// *************************************************************************************************\r
+// Prototypes section\r
+\r
+// *************************************************************************************************\r
+// Defines section\r
+\r
+// *************************************************************************************************\r
+// Global Variable section\r
+u16 adc12_result;\r
+u8 adc12_data_ready;\r
+\r
+// *************************************************************************************************\r
+// Extern section\r
+\r
+// *************************************************************************************************\r
+// @fn          adc12_single_conversion\r
+// @brief       Init ADC12.      Do single conversion. Turn off ADC12.\r
+// @param       u16 ref                  Select reference\r
+//                              u16 sht          Sample-and-hold time\r
+//                              u16 channel      Channel of the conversion\r
+// @return      u16 adc12_result Return ADC result\r
+// *************************************************************************************************\r
+u16 adc12_single_conversion(u16 ref, u16 sht, u16 channel)\r
+{\r
+    // Initialize the shared reference module\r
+    REFCTL0 |= REFMSTR + ref + REFON;   // Enable internal reference (1.5V or 2.5V)\r
+\r
+    // Initialize ADC12_A\r
+    ADC12CTL0 = sht + ADC12ON;          // Set sample time\r
+    ADC12CTL1 = ADC12SHP;               // Enable sample timer\r
+    ADC12MCTL0 = ADC12SREF_1 + channel; // ADC input channel\r
+    ADC12IE = 0x001;                    // ADC_IFG upon conv result-ADCMEMO\r
+\r
+    // Wait 2 ticks (66us) to allow internal reference to settle\r
+    Timer0_A4_Delay(2);\r
+\r
+    // Start ADC12\r
+    ADC12CTL0 |= ADC12ENC;\r
+\r
+    // Clear data ready flag\r
+    adc12_data_ready = 0;\r
+\r
+    // Sampling and conversion start\r
+    ADC12CTL0 |= ADC12SC;\r
+\r
+    // Delay to get next ADC value\r
+    Timer0_A4_Delay(5);\r
+    while (!adc12_data_ready) ;\r
+\r
+    // Shut down ADC12\r
+    ADC12CTL0 &= ~(ADC12ENC | ADC12SC | sht);\r
+    ADC12CTL0 &= ~ADC12ON;\r
+\r
+    // Shut down reference voltage\r
+    REFCTL0 &= ~(REFMSTR + ref + REFON);\r
+\r
+    ADC12IE = 0;\r
+\r
+    // Return ADC result\r
+    return (adc12_result);\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          ADC12ISR\r
+// @brief       Store ADC12 conversion result. Set flag to indicate data ready.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+#pragma vector=ADC12_VECTOR\r
+__interrupt void ADC12ISR(void)\r
+{\r
+    switch (__even_in_range(ADC12IV, 34))\r
+    {\r
+        case 0:\r
+            break;                    // Vector  0:  No interrupt\r
+        case 2:\r
+            break;                    // Vector  2:  ADC overflow\r
+        case 4:\r
+            break;                    // Vector  4:  ADC timing overflow\r
+        case 6:                       // Vector  6:  ADC12IFG0\r
+            adc12_result = ADC12MEM0; // Move results, IFG is cleared\r
+            adc12_data_ready = 1;\r
+            _BIC_SR_IRQ(LPM3_bits);   // Exit active CPU\r
+            break;\r
+        case 8:\r
+            break;                    // Vector  8:  ADC12IFG1\r
+        case 10:\r
+            break;                    // Vector 10:  ADC12IFG2\r
+        case 12:\r
+            break;                    // Vector 12:  ADC12IFG3\r
+        case 14:\r
+            break;                    // Vector 14:  ADC12IFG4\r
+        case 16:\r
+            break;                    // Vector 16:  ADC12IFG5\r
+        case 18:\r
+            break;                    // Vector 18:  ADC12IFG6\r
+        case 20:\r
+            break;                    // Vector 20:  ADC12IFG7\r
+        case 22:\r
+            break;                    // Vector 22:  ADC12IFG8\r
+        case 24:\r
+            break;                    // Vector 24:  ADC12IFG9\r
+        case 26:\r
+            break;                    // Vector 26:  ADC12IFG10\r
+        case 28:\r
+            break;                    // Vector 28:  ADC12IFG11\r
+        case 30:\r
+            break;                    // Vector 30:  ADC12IFG12\r
+        case 32:\r
+            break;                    // Vector 32:  ADC12IFG13\r
+        case 34:\r
+            break;                    // Vector 34:  ADC12IFG14\r
+        default:\r
+            break;\r
+    }\r
+}\r
+\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/driver/adc12.h b/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/driver/adc12.h
new file mode 100755 (executable)
index 0000000..90fc327
--- /dev/null
@@ -0,0 +1,57 @@
+// *************************************************************************************************\r
+//\r
+//      Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//        Redistribution and use in source and binary forms, with or without\r
+//        modification, are permitted provided that the following conditions\r
+//        are met:\r
+//\r
+//          Redistributions of source code must retain the above copyright\r
+//          notice, this list of conditions and the following disclaimer.\r
+//\r
+//          Redistributions in binary form must reproduce the above copyright\r
+//          notice, this list of conditions and the following disclaimer in the\r
+//          documentation and/or other materials provided with the\r
+//          distribution.\r
+//\r
+//          Neither the name of Texas Instruments Incorporated nor the names of\r
+//          its contributors may be used to endorse or promote products derived\r
+//          from this software without specific prior written permission.\r
+//\r
+//        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+\r
+#ifndef ADC12_H_\r
+#define ADC12_H_\r
+\r
+// *************************************************************************************************\r
+// Include section\r
+\r
+// *************************************************************************************************\r
+// Prototypes section\r
+extern u16 adc12_single_conversion(u16 ref, u16 sht, u16 channel);\r
+\r
+// *************************************************************************************************\r
+// Defines section\r
+\r
+// *************************************************************************************************\r
+// Global Variable section\r
+extern u16 adc12_result;\r
+extern u8 adc12_data_ready;\r
+\r
+// *************************************************************************************************\r
+// Extern section\r
+\r
+#endif                          /*ADC12_H_ */\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/driver/buzzer.c b/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/driver/buzzer.c
new file mode 100755 (executable)
index 0000000..9ac581a
--- /dev/null
@@ -0,0 +1,220 @@
+// *************************************************************************************************\r
+//\r
+//      Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//        Redistribution and use in source and binary forms, with or without\r
+//        modification, are permitted provided that the following conditions\r
+//        are met:\r
+//\r
+//          Redistributions of source code must retain the above copyright\r
+//          notice, this list of conditions and the following disclaimer.\r
+//\r
+//          Redistributions in binary form must reproduce the above copyright\r
+//          notice, this list of conditions and the following disclaimer in the\r
+//          documentation and/or other materials provided with the\r
+//          distribution.\r
+//\r
+//          Neither the name of Texas Instruments Incorporated nor the names of\r
+//          its contributors may be used to endorse or promote products derived\r
+//          from this software without specific prior written permission.\r
+//\r
+//        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+// Buzzer functions.\r
+// *************************************************************************************************\r
+\r
+// *************************************************************************************************\r
+// Include section\r
+\r
+// system\r
+#include "project.h"\r
+\r
+// driver\r
+#include "buzzer.h"\r
+#include "timer.h"\r
+#include "display.h"\r
+\r
+// logic\r
+#include "alarm.h"\r
+\r
+// *************************************************************************************************\r
+// Prototypes section\r
+void toggle_buzzer(void);\r
+void countdown_buzzer(void);\r
+\r
+// *************************************************************************************************\r
+// Defines section\r
+\r
+// *************************************************************************************************\r
+// Global Variable section\r
+struct buzzer sBuzzer;\r
+\r
+// *************************************************************************************************\r
+// Extern section\r
+//extern u16 timer0_A3_ticks_g;\r
+\r
+// *************************************************************************************************\r
+// @fn          reset_buzzer\r
+// @brief       Init buzzer variables\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void reset_buzzer(void)\r
+{\r
+    sBuzzer.time = 0;\r
+    sBuzzer.state = BUZZER_OFF;\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          start_buzzer\r
+// @brief       Start buzzer output for a number of cylces\r
+// @param       u8 cycles               Keep buzzer output for number of cycles\r
+//                              u16 on_time         Output buzzer for "on_time" ACLK ticks\r
+//                              u16 off_time    Do not output buzzer for "off_time" ACLK ticks\r
+// @return      none\r
+// *************************************************************************************************\r
+void start_buzzer(u8 cycles, u16 on_time, u16 off_time)\r
+{\r
+    // Store new buzzer duration while buzzer is off\r
+    if (sBuzzer.time == 0)\r
+    {\r
+        sBuzzer.time = cycles;\r
+        sBuzzer.on_time = on_time;\r
+        sBuzzer.off_time = off_time;\r
+\r
+        // Need to init every time, because SimpliciTI claims same timer\r
+        // Reset TA1R, set up mode, TA1 runs from 32768Hz ACLK\r
+        TA1CTL = TACLR | MC_1 | TASSEL__ACLK;\r
+\r
+        // Set PWM frequency\r
+        TA1CCR0 = BUZZER_TIMER_STEPS;\r
+\r
+        // Enable IRQ, set output mode "toggle"\r
+        TA1CCTL0 = OUTMOD_4;\r
+\r
+        // Allow buzzer PWM output on P2.7\r
+        P2SEL |= BIT7;\r
+\r
+        // Activate Timer0_A3 periodic interrupts\r
+        fptr_Timer0_A3_function = toggle_buzzer;\r
+        Timer0_A3_Start(sBuzzer.on_time);\r
+\r
+        // Preload timer advance variable\r
+        sTimer.timer0_A3_ticks = sBuzzer.off_time;\r
+\r
+        // Start with buzzer output on\r
+        sBuzzer.state = BUZZER_ON_OUTPUT_ENABLED;\r
+    }\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          toggle_buzzer\r
+// @brief       Keeps track of buzzer on/off duty cycle\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void toggle_buzzer(void)\r
+{\r
+    // Turn off buzzer\r
+    if (sBuzzer.state == BUZZER_ON_OUTPUT_ENABLED)\r
+    {\r
+        // Stop PWM timer\r
+        TA1CTL &= ~(BIT4 | BIT5);\r
+\r
+        // Reset and disable buzzer PWM output\r
+        P2OUT &= ~BIT7;\r
+        P2SEL &= ~BIT7;\r
+\r
+        // Update buzzer state\r
+        sBuzzer.state = BUZZER_ON_OUTPUT_DISABLED;\r
+\r
+        // Reload Timer0_A4 IRQ to restart output\r
+        sTimer.timer0_A3_ticks = sBuzzer.on_time;\r
+    }\r
+    else                        // Turn on buzzer\r
+    {\r
+        // Decrement buzzer total cycles\r
+        countdown_buzzer();\r
+\r
+        // Reload Timer0_A4 to stop output if sBuzzer.time > 0\r
+        if (sBuzzer.state != BUZZER_OFF)\r
+        {\r
+            // Reset timer TA1\r
+            TA1R = 0;\r
+            TA1CTL |= MC_1;\r
+\r
+            // Enable buzzer PWM output\r
+            P2SEL |= BIT7;\r
+\r
+            // Update buzzer state\r
+            sBuzzer.state = BUZZER_ON_OUTPUT_ENABLED;\r
+\r
+            // Reload Timer0_A4 IRQ to turn off output\r
+            sTimer.timer0_A3_ticks = sBuzzer.off_time;\r
+        }\r
+    }\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          stop_buzzer\r
+// @brief       Stop buzzer output\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void stop_buzzer(void)\r
+{\r
+    // Stop PWM timer\r
+    TA1CTL &= ~(BIT4 | BIT5);\r
+\r
+    // Disable buzzer PWM output\r
+    P2OUT &= ~BIT7;\r
+    P2SEL &= ~BIT7;\r
+\r
+    // Clear PWM timer interrupt\r
+    TA1CCTL0 &= ~CCIE;\r
+\r
+    // Disable periodic start/stop interrupts\r
+    Timer0_A3_Stop();\r
+\r
+    // Clear variables\r
+    reset_buzzer();\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          is_buzzer\r
+// @brief       Check if buzzer is operating\r
+// @param       none\r
+// @return      u8              1 = Buzzer is operating, 0 = Buzzer is off\r
+// *************************************************************************************************\r
+u8 is_buzzer(void)\r
+{\r
+    return (sBuzzer.state != BUZZER_OFF);\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          countdown_buzzer\r
+// @brief       Decrement active buzzer time. Turn off buzzer if cycle end reached.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void countdown_buzzer(void)\r
+{\r
+    // Stop buzzer when reaching 0 cycles\r
+    if (--sBuzzer.time == 0)\r
+    {\r
+        stop_buzzer();\r
+    }\r
+}\r
+\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/driver/buzzer.h b/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/driver/buzzer.h
new file mode 100755 (executable)
index 0000000..59fbba9
--- /dev/null
@@ -0,0 +1,87 @@
+// *************************************************************************************************\r
+//\r
+//      Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//        Redistribution and use in source and binary forms, with or without\r
+//        modification, are permitted provided that the following conditions\r
+//        are met:\r
+//\r
+//          Redistributions of source code must retain the above copyright\r
+//          notice, this list of conditions and the following disclaimer.\r
+//\r
+//          Redistributions in binary form must reproduce the above copyright\r
+//          notice, this list of conditions and the following disclaimer in the\r
+//          documentation and/or other materials provided with the\r
+//          distribution.\r
+//\r
+//          Neither the name of Texas Instruments Incorporated nor the names of\r
+//          its contributors may be used to endorse or promote products derived\r
+//          from this software without specific prior written permission.\r
+//\r
+//        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+\r
+#ifndef BUZZER_H_\r
+#define BUZZER_H_\r
+\r
+// *************************************************************************************************\r
+// Include section\r
+\r
+// *************************************************************************************************\r
+// Prototypes section\r
+extern void reset_buzzer(void);\r
+extern void start_buzzer(u8 cycles, u16 on_time, u16 off_time);\r
+extern void stop_buzzer(void);\r
+extern void toggle_buzzer(void);\r
+extern u8 is_buzzer(void);\r
+extern void countdown_buzzer(void);\r
+\r
+// *************************************************************************************************\r
+// Defines section\r
+\r
+// Buzzer states\r
+#define BUZZER_OFF                                                      (0u)\r
+#define BUZZER_ON_OUTPUT_DISABLED                       (1u)\r
+#define BUZZER_ON_OUTPUT_ENABLED                        (2u)\r
+\r
+// Buzzer output signal frequency = 32,768kHz/(BUZZER_TIMER_STEPS+1)/2 = 2.7kHz\r
+#define BUZZER_TIMER_STEPS                                      (5u)\r
+\r
+// Buzzer on time\r
+#define BUZZER_ON_TICKS                                         (CONV_MS_TO_TICKS(20))\r
+\r
+// Buzzer off time\r
+#define BUZZER_OFF_TICKS                                        (CONV_MS_TO_TICKS(200))\r
+\r
+// *************************************************************************************************\r
+// Global Variable section\r
+struct buzzer\r
+{\r
+    // Keep output for "time" seconds\r
+    u8 time;\r
+\r
+    // On/off duty\r
+    u16 on_time;\r
+    u16 off_time;\r
+\r
+    // Current buzzer output state\r
+    u8 state;\r
+};\r
+extern struct buzzer sBuzzer;\r
+\r
+// *************************************************************************************************\r
+// Extern section\r
+\r
+#endif                          /*BUZZER_H_ */\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/driver/display.c b/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/driver/display.c
new file mode 100755 (executable)
index 0000000..46a5d70
--- /dev/null
@@ -0,0 +1,759 @@
+// *************************************************************************************************\r
+//\r
+//      Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//        Redistribution and use in source and binary forms, with or without\r
+//        modification, are permitted provided that the following conditions\r
+//        are met:\r
+//\r
+//          Redistributions of source code must retain the above copyright\r
+//          notice, this list of conditions and the following disclaimer.\r
+//\r
+//          Redistributions in binary form must reproduce the above copyright\r
+//          notice, this list of conditions and the following disclaimer in the\r
+//          documentation and/or other materials provided with the\r
+//          distribution.\r
+//\r
+//          Neither the name of Texas Instruments Incorporated nor the names of\r
+//          its contributors may be used to endorse or promote products derived\r
+//          from this software without specific prior written permission.\r
+//\r
+//        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+// Display functions.\r
+// *************************************************************************************************\r
+\r
+// *************************************************************************************************\r
+// Include section\r
+\r
+// system\r
+#include <project.h>\r
+#include <string.h>\r
+\r
+// driver\r
+#include "display.h"\r
+\r
+// logic\r
+#include "clock.h"\r
+#include "user.h"\r
+#include "date.h"\r
+#include "stopwatch.h"\r
+#include "temperature.h"\r
+\r
+// *************************************************************************************************\r
+// Prototypes section\r
+void write_lcd_mem(u8 * lcdmem, u8 bits, u8 bitmask, u8 state);\r
+void clear_line(u8 line);\r
+void display_symbol(u8 symbol, u8 mode);\r
+void display_char(u8 segment, u8 chr, u8 mode);\r
+void display_chars(u8 segments, u8 * str, u8 mode);\r
+\r
+// *************************************************************************************************\r
+// Defines section\r
+\r
+// *************************************************************************************************\r
+// Global Variable section\r
+\r
+// Table with memory bit assignment for digits "0" to "9" and characters "A" to "Z"\r
+const u8 lcd_font[] = {\r
+    SEG_A + SEG_B + SEG_C + SEG_D + SEG_E + SEG_F,         // Displays "0"\r
+    SEG_B + SEG_C,                                         // Displays "1"\r
+    SEG_A + SEG_B + SEG_D + SEG_E + SEG_G,                 // Displays "2"\r
+    SEG_A + SEG_B + SEG_C + SEG_D + SEG_G,                 // Displays "3"\r
+    SEG_B + SEG_C + SEG_F + SEG_G,                         // Displays "4"\r
+    SEG_A + SEG_C + SEG_D + SEG_F + SEG_G,                 // Displays "5"\r
+    SEG_A + SEG_C + SEG_D + SEG_E + SEG_F + SEG_G,         // Displays "6"\r
+    SEG_A + SEG_B + SEG_C,                                 // Displays "7"\r
+    SEG_A + SEG_B + SEG_C + SEG_D + SEG_E + SEG_F + SEG_G, // Displays "8"\r
+    SEG_A + SEG_B + SEG_C + SEG_D + SEG_F + SEG_G,         // Displays "9"\r
+    0,                                                     // Displays " "\r
+    0,                                                     // Displays " "\r
+    0,                                                     // Displays " "\r
+    0,                                                     // Displays " "\r
+    0,                                                     // Displays " "\r
+    SEG_D + SEG_E + SEG_G,                                 // Displays "c"\r
+    0,                                                     // Displays " "\r
+    SEG_A + SEG_B + SEG_C + SEG_E + SEG_F + SEG_G,         // Displays "A"\r
+    SEG_C + SEG_D + SEG_E + SEG_F + SEG_G,                 // Displays "b"\r
+    SEG_A + SEG_D + SEG_E + SEG_F,                         // Displays "C"\r
+    SEG_B + SEG_C + SEG_D + SEG_E + SEG_G,                 // Displays "d"\r
+    SEG_A + +SEG_D + SEG_E + SEG_F + SEG_G,                // Displays "E"\r
+    SEG_A + SEG_E + SEG_F + SEG_G,                         // Displays "F"\r
+    //  SEG_A+      SEG_C+SEG_D+SEG_E+SEG_F+SEG_G,       // Displays "G"\r
+    SEG_A + SEG_B + SEG_C + SEG_D + SEG_F + SEG_G,         // Displays "g"\r
+    SEG_B + SEG_C + SEG_E + SEG_F + SEG_G,                 // Displays "H"\r
+    SEG_E + SEG_F,                                         // Displays "I"\r
+    SEG_A + SEG_B + SEG_C + SEG_D,                         // Displays "J"\r
+    //              SEG_B+SEG_C+      SEG_E+SEG_F+SEG_G,     // Displays "k"\r
+    SEG_D + SEG_E + SEG_F + SEG_G,                         // Displays "k"\r
+    SEG_D + SEG_E + SEG_F,                                 // Displays "L"\r
+    SEG_A + SEG_B + SEG_C + SEG_E + SEG_F,                 // Displays "M"\r
+    SEG_C + SEG_E + SEG_G,                                 // Displays "n"\r
+    SEG_C + SEG_D + SEG_E + SEG_G,                         // Displays "o"\r
+    SEG_A + SEG_B + SEG_E + SEG_F + SEG_G,                 // Displays "P"\r
+    SEG_A + SEG_B + SEG_C + SEG_D + SEG_E + SEG_F,         // Displays "Q"\r
+    SEG_E + SEG_G,                                         // Displays "r"\r
+    SEG_A + SEG_C + SEG_D + SEG_F + SEG_G,                 // Displays "S"\r
+    SEG_D + SEG_E + SEG_F + SEG_G,                         // Displays "t"\r
+    SEG_C + SEG_D + SEG_E,                                 // Displays "u"\r
+    SEG_C + SEG_D + SEG_E,                                 // Displays "u"\r
+    SEG_G,                                                 // Displays "-"\r
+    SEG_B + SEG_C + +SEG_E + SEG_F + SEG_G,                // Displays "X"\r
+    SEG_B + SEG_C + SEG_D + SEG_F + SEG_G,                 // Displays "Y"\r
+    SEG_A + SEG_B + SEG_D + SEG_E + SEG_G,                 // Displays "Z"\r
+};\r
+\r
+// Table with memory address for each display element\r
+const u8 *segments_lcdmem[] = {\r
+    LCD_SYMB_AM_MEM,\r
+    LCD_SYMB_PM_MEM,\r
+    LCD_SYMB_ARROW_UP_MEM,\r
+    LCD_SYMB_ARROW_DOWN_MEM,\r
+    LCD_SYMB_PERCENT_MEM,\r
+    LCD_SYMB_TOTAL_MEM,\r
+    LCD_SYMB_AVERAGE_MEM,\r
+    LCD_SYMB_MAX_MEM,\r
+    LCD_SYMB_BATTERY_MEM,\r
+    LCD_UNIT_L1_FT_MEM,\r
+    LCD_UNIT_L1_K_MEM,\r
+    LCD_UNIT_L1_M_MEM,\r
+    LCD_UNIT_L1_I_MEM,\r
+    LCD_UNIT_L1_PER_S_MEM,\r
+    LCD_UNIT_L1_PER_H_MEM,\r
+    LCD_UNIT_L1_DEGREE_MEM,\r
+    LCD_UNIT_L2_KCAL_MEM,\r
+    LCD_UNIT_L2_KM_MEM,\r
+    LCD_UNIT_L2_MI_MEM,\r
+    LCD_ICON_HEART_MEM,\r
+    LCD_ICON_STOPWATCH_MEM,\r
+    LCD_ICON_RECORD_MEM,\r
+    LCD_ICON_ALARM_MEM,\r
+    LCD_ICON_BEEPER1_MEM,\r
+    LCD_ICON_BEEPER2_MEM,\r
+    LCD_ICON_BEEPER3_MEM,\r
+    LCD_SEG_L1_3_MEM,\r
+    LCD_SEG_L1_2_MEM,\r
+    LCD_SEG_L1_1_MEM,\r
+    LCD_SEG_L1_0_MEM,\r
+    LCD_SEG_L1_COL_MEM,\r
+    LCD_SEG_L1_DP1_MEM,\r
+    LCD_SEG_L1_DP0_MEM,\r
+    LCD_SEG_L2_5_MEM,\r
+    LCD_SEG_L2_4_MEM,\r
+    LCD_SEG_L2_3_MEM,\r
+    LCD_SEG_L2_2_MEM,\r
+    LCD_SEG_L2_1_MEM,\r
+    LCD_SEG_L2_0_MEM,\r
+    LCD_SEG_L2_COL1_MEM,\r
+    LCD_SEG_L2_COL0_MEM,\r
+    LCD_SEG_L2_DP_MEM,\r
+};\r
+\r
+// Table with bit mask for each display element\r
+const u8 segments_bitmask[] = {\r
+    LCD_SYMB_AM_MASK,\r
+    LCD_SYMB_PM_MASK,\r
+    LCD_SYMB_ARROW_UP_MASK,\r
+    LCD_SYMB_ARROW_DOWN_MASK,\r
+    LCD_SYMB_PERCENT_MASK,\r
+    LCD_SYMB_TOTAL_MASK,\r
+    LCD_SYMB_AVERAGE_MASK,\r
+    LCD_SYMB_MAX_MASK,\r
+    LCD_SYMB_BATTERY_MASK,\r
+    LCD_UNIT_L1_FT_MASK,\r
+    LCD_UNIT_L1_K_MASK,\r
+    LCD_UNIT_L1_M_MASK,\r
+    LCD_UNIT_L1_I_MASK,\r
+    LCD_UNIT_L1_PER_S_MASK,\r
+    LCD_UNIT_L1_PER_H_MASK,\r
+    LCD_UNIT_L1_DEGREE_MASK,\r
+    LCD_UNIT_L2_KCAL_MASK,\r
+    LCD_UNIT_L2_KM_MASK,\r
+    LCD_UNIT_L2_MI_MASK,\r
+    LCD_ICON_HEART_MASK,\r
+    LCD_ICON_STOPWATCH_MASK,\r
+    LCD_ICON_RECORD_MASK,\r
+    LCD_ICON_ALARM_MASK,\r
+    LCD_ICON_BEEPER1_MASK,\r
+    LCD_ICON_BEEPER2_MASK,\r
+    LCD_ICON_BEEPER3_MASK,\r
+    LCD_SEG_L1_3_MASK,\r
+    LCD_SEG_L1_2_MASK,\r
+    LCD_SEG_L1_1_MASK,\r
+    LCD_SEG_L1_0_MASK,\r
+    LCD_SEG_L1_COL_MASK,\r
+    LCD_SEG_L1_DP1_MASK,\r
+    LCD_SEG_L1_DP0_MASK,\r
+    LCD_SEG_L2_5_MASK,\r
+    LCD_SEG_L2_4_MASK,\r
+    LCD_SEG_L2_3_MASK,\r
+    LCD_SEG_L2_2_MASK,\r
+    LCD_SEG_L2_1_MASK,\r
+    LCD_SEG_L2_0_MASK,\r
+    LCD_SEG_L2_COL1_MASK,\r
+    LCD_SEG_L2_COL0_MASK,\r
+    LCD_SEG_L2_DP_MASK,\r
+};\r
+\r
+// Quick integer to array conversion table for most common integer values\r
+const u8 int_to_array_conversion_table[][3] = {\r
+    "000", "001", "002", "003", "004", "005", "006", "007", "008", "009", "010", "011", "012",\r
+    "013", "014", "015",\r
+    "016", "017", "018", "019", "020", "021", "022", "023", "024", "025", "026", "027", "028",\r
+    "029", "030", "031",\r
+    "032", "033", "034", "035", "036", "037", "038", "039", "040", "041", "042", "043", "044",\r
+    "045", "046", "047",\r
+    "048", "049", "050", "051", "052", "053", "054", "055", "056", "057", "058", "059", "060",\r
+    "061", "062", "063",\r
+    "064", "065", "066", "067", "068", "069", "070", "071", "072", "073", "074", "075", "076",\r
+    "077", "078", "079",\r
+    "080", "081", "082", "083", "084", "085", "086", "087", "088", "089", "090", "091", "092",\r
+    "093", "094", "095",\r
+    "096", "097", "098", "099", "100", "101", "102", "103", "104", "105", "106", "107", "108",\r
+    "109", "110", "111",\r
+    "112", "113", "114", "115", "116", "117", "118", "119", "120", "121", "122", "123", "124",\r
+    "125", "126", "127",\r
+    "128", "129", "130", "131", "132", "133", "134", "135", "136", "137", "138", "139", "140",\r
+    "141", "142", "143",\r
+    "144", "145", "146", "147", "148", "149", "150", "151", "152", "153", "154", "155", "156",\r
+    "157", "158", "159",\r
+    "160", "161", "162", "163", "164", "165", "166", "167", "168", "169", "170", "171", "172",\r
+    "173", "174", "175",\r
+    "176", "177", "178", "179", "180",\r
+};\r
+\r
+// Display flags\r
+volatile s_display_flags display;\r
+\r
+// Global return string for int_to_array function\r
+u8 int_to_array_str[8];\r
+\r
+// *************************************************************************************************\r
+// Extern section\r
+extern void (*fptr_lcd_function_line1)(u8 line, u8 update);\r
+extern void (*fptr_lcd_function_line2)(u8 line, u8 update);\r
+\r
+// *************************************************************************************************\r
+// @fn          lcd_init\r
+// @brief       Erase LCD memory. Init LCD peripheral.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void lcd_init(void)\r
+{\r
+    // Clear entire display memory\r
+    LCDBMEMCTL |= LCDCLRBM + LCDCLRM;\r
+\r
+    // LCD_FREQ = ACLK/16/8 = 256Hz\r
+    // Frame frequency = 256Hz/4 = 64Hz, LCD mux 4, LCD on\r
+    LCDBCTL0 = (LCDDIV0 + LCDDIV1 + LCDDIV2 + LCDDIV3) | (LCDPRE0 + LCDPRE1) | LCD4MUX | LCDON;\r
+\r
+    // LCB_BLK_FREQ = ACLK/8/4096 = 1Hz\r
+    LCDBBLKCTL = LCDBLKPRE0 | LCDBLKPRE1 | LCDBLKDIV0 | LCDBLKDIV1 | LCDBLKDIV2 | LCDBLKMOD0;\r
+\r
+    // I/O to COM outputs\r
+    P5SEL |= (BIT5 | BIT6 | BIT7);\r
+    P5DIR |= (BIT5 | BIT6 | BIT7);\r
+\r
+    // Activate LCD output\r
+    LCDBPCTL0 = 0xFFFF;         // Select LCD segments S0-S15\r
+    LCDBPCTL1 = 0x00FF;         // Select LCD segments S16-S22\r
+\r
+#ifdef USE_LCD_CHARGE_PUMP\r
+    // Charge pump voltage generated internally, internal bias (V2-V4) generation\r
+    LCDBVCTL = LCDCPEN | VLCD_2_72;\r
+#endif\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          clear_display_all\r
+// @brief       Erase LINE1 and LINE2 segments. Clear also function-specific content.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void clear_display_all(void)\r
+{\r
+    // Clear generic content\r
+    clear_line(LINE1);\r
+    clear_line(LINE2);\r
+\r
+    // Clean up function-specific content\r
+    fptr_lcd_function_line1(LINE1, DISPLAY_LINE_CLEAR);\r
+    fptr_lcd_function_line2(LINE2, DISPLAY_LINE_CLEAR);\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          clear_display\r
+// @brief       Erase LINE1 and LINE2 segments. Keep icons.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void clear_display(void)\r
+{\r
+    clear_line(LINE1);\r
+    clear_line(LINE2);\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          clear_line\r
+// @brief       Erase segments of a given line.\r
+// @param       u8 line LINE1, LINE2\r
+// @return      none\r
+// *************************************************************************************************\r
+void clear_line(u8 line)\r
+{\r
+    display_chars(switch_seg(line, LCD_SEG_L1_3_0, LCD_SEG_L2_5_0), NULL, SEG_OFF);\r
+    if (line == LINE1)\r
+    {\r
+        display_symbol(LCD_SEG_L1_DP1, SEG_OFF);\r
+        display_symbol(LCD_SEG_L1_DP0, SEG_OFF);\r
+        display_symbol(LCD_SEG_L1_COL, SEG_OFF);\r
+    }\r
+    else                        // line == LINE2\r
+    {\r
+        display_symbol(LCD_SEG_L2_DP, SEG_OFF);\r
+        display_symbol(LCD_SEG_L2_COL1, SEG_OFF);\r
+        display_symbol(LCD_SEG_L2_COL0, SEG_OFF);\r
+    }\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          write_segment\r
+// @brief       Write to one or multiple LCD segments\r
+// @param       lcdmem          Pointer to LCD byte memory\r
+//                              bits            Segments to address\r
+//                              bitmask         Bitmask for particular display item\r
+//                              mode            On, off or blink segments\r
+// @return\r
+// *************************************************************************************************\r
+void write_lcd_mem(u8 * lcdmem, u8 bits, u8 bitmask, u8 state)\r
+{\r
+    if (state == SEG_ON)\r
+    {\r
+        // Clear segments before writing\r
+        *lcdmem = (u8) (*lcdmem & ~bitmask);\r
+\r
+        // Set visible segments\r
+        *lcdmem = (u8) (*lcdmem | bits);\r
+    }\r
+    else if (state == SEG_OFF)\r
+    {\r
+        // Clear segments\r
+        *lcdmem = (u8) (*lcdmem & ~bitmask);\r
+    }\r
+    else if (state == SEG_ON_BLINK_ON)\r
+    {\r
+        // Clear visible / blink segments before writing\r
+        *lcdmem = (u8) (*lcdmem & ~bitmask);\r
+        *(lcdmem + 0x20) = (u8) (*(lcdmem + 0x20) & ~bitmask);\r
+\r
+        // Set visible / blink segments\r
+        *lcdmem = (u8) (*lcdmem | bits);\r
+        *(lcdmem + 0x20) = (u8) (*(lcdmem + 0x20) | bits);\r
+    }\r
+    else if (state == SEG_ON_BLINK_OFF)\r
+    {\r
+        // Clear visible segments before writing\r
+        *lcdmem = (u8) (*lcdmem & ~bitmask);\r
+\r
+        // Set visible segments\r
+        *lcdmem = (u8) (*lcdmem | bits);\r
+\r
+        // Clear blink segments\r
+        *(lcdmem + 0x20) = (u8) (*(lcdmem + 0x20) & ~bitmask);\r
+    }\r
+    else if (state == SEG_OFF_BLINK_OFF)\r
+    {\r
+        // Clear segments\r
+        *lcdmem = (u8) (*lcdmem & ~bitmask);\r
+\r
+        // Clear blink segments\r
+        *(lcdmem + 0x20) = (u8) (*(lcdmem + 0x20) & ~bitmask);\r
+    }\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          int_to_array\r
+// @brief       Generic integer to array routine. Converts integer n to string.\r
+//                              Default conversion result has leading zeros, e.g. "00123"\r
+//                              Option to convert leading '0' into whitespace (blanks)\r
+// @param       u32 n                   integer to convert\r
+//                              u8 digits               number of digits\r
+//                              u8 blanks               fill up result string with number of\r
+// whitespaces instead of leading zeros\r
+// @return      u8                              string\r
+// *************************************************************************************************\r
+u8 *int_to_array(u32 n, u8 digits, u8 blanks)\r
+{\r
+    u8 i;\r
+    u8 digits1 = digits;\r
+\r
+    // Preset result string\r
+    memcpy(int_to_array_str, "0000000", 7);\r
+\r
+    // Return empty string if number of digits is invalid (valid range for digits: 1-7)\r
+    if ((digits == 0) || (digits > 7))\r
+        return (int_to_array_str);\r
+\r
+    // Numbers 0 .. 180 can be copied from int_to_array_conversion_table without conversion\r
+    if (n <= 180)\r
+    {\r
+        if (digits >= 3)\r
+        {\r
+            memcpy(int_to_array_str + (digits - 3), int_to_array_conversion_table[n], 3);\r
+        }\r
+        else                    // digits == 1 || 2\r
+        {\r
+            memcpy(int_to_array_str, int_to_array_conversion_table[n] + (3 - digits), digits);\r
+        }\r
+    }\r
+    else                        // For n > 180 need to calculate string content\r
+    {\r
+        // Calculate digits from least to most significant number\r
+        do\r
+        {\r
+            int_to_array_str[digits - 1] = n % 10 + '0';\r
+            n /= 10;\r
+        }\r
+        while (--digits > 0);\r
+    }\r
+\r
+    // Remove specified number of leading '0', always keep last one\r
+    i = 0;\r
+    while ((int_to_array_str[i] == '0') && (i < digits1 - 1))\r
+    {\r
+        if (blanks > 0)\r
+        {\r
+            // Convert only specified number of leading '0'\r
+            int_to_array_str[i] = ' ';\r
+            blanks--;\r
+        }\r
+        i++;\r
+    }\r
+\r
+    return (int_to_array_str);\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          display_value\r
+// @brief       Generic decimal display routine. Used exclusively by set_value function.\r
+// @param       u8 segments                     LCD segments where value is displayed\r
+//                              u32 value                       Integer value to be displayed\r
+//                              u8 digits                       Number of digits to convert\r
+//                              u8 blanks                       Number of leadings blanks in\r
+// int_to_array result string\r
+// @return      none\r
+// *************************************************************************************************\r
+void display_value(u8 segments, u32 value, u8 digits, u8 blanks)\r
+{\r
+    u8 *str;\r
+\r
+    str = int_to_array(value, digits, blanks);\r
+\r
+    // Display string in blink mode\r
+    display_chars(segments, str, SEG_ON_BLINK_ON);\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          display_hours\r
+// @brief       Display hours in 24H / 12H time format.\r
+// @param       u8 segments     Segments where to display hour data\r
+//                              u32 value               Hour data\r
+//                              u8 digits               Must be "2"\r
+//                              u8 blanks               Must be "0"\r
+// @return      none\r
+// *************************************************************************************************\r
+void display_hours(u8 segments, u32 value, u8 digits, u8 blanks)\r
+{\r
+    u8 hours;\r
+\r
+    if (sys.flag.use_metric_units)\r
+    {\r
+        // Display hours in 24H time format\r
+        display_value(segments, (u16) value, digits, blanks);\r
+    }\r
+    else\r
+    {\r
+        // convert internal 24H time format to 12H time format\r
+        hours = convert_hour_to_12H_format(value);\r
+\r
+        // display hours in 12H time format\r
+        display_value(segments, hours, digits, blanks);\r
+        display_am_pm_symbol(value);\r
+    }\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          display_am_pm_symbol\r
+// @brief       Display AM or PM symbol.\r
+// @param       u8 hour         24H internal time format\r
+// @return      none\r
+// *************************************************************************************************\r
+void display_am_pm_symbol(u8 hour)\r
+{\r
+    // Display AM/PM symbol\r
+    if (is_hour_am(hour))\r
+    {\r
+        display_symbol(LCD_SYMB_AM, SEG_ON);\r
+    }\r
+    else\r
+    {\r
+        // Clear AM segments first - required when changing from AM to PM\r
+        display_symbol(LCD_SYMB_AM, SEG_OFF);\r
+        display_symbol(LCD_SYMB_PM, SEG_ON);\r
+    }\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          display_symbol\r
+// @brief       Switch symbol on or off on LCD.\r
+// @param       u8 symbol               A valid LCD symbol (index 0..42)\r
+//                              u8 state                SEG_ON, SEG_OFF, SEG_BLINK\r
+// @return      none\r
+// *************************************************************************************************\r
+void display_symbol(u8 symbol, u8 mode)\r
+{\r
+    u8 *lcdmem;\r
+    u8 bits;\r
+    u8 bitmask;\r
+\r
+    if (symbol <= LCD_SEG_L2_DP)\r
+    {\r
+        // Get LCD memory address for symbol from table\r
+        lcdmem = (u8 *) segments_lcdmem[symbol];\r
+\r
+        // Get bits for symbol from table\r
+        bits = segments_bitmask[symbol];\r
+\r
+        // Bitmask for symbols equals bits\r
+        bitmask = bits;\r
+\r
+        // Write LCD memory\r
+        write_lcd_mem(lcdmem, bits, bitmask, mode);\r
+    }\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          display_char\r
+// @brief       Write to 7-segment characters.\r
+// @param       u8 segment              A valid LCD segment\r
+//                              u8 chr                  Character to display\r
+//                              u8 mode         SEG_ON, SEG_OFF, SEG_BLINK\r
+// @return      none\r
+// *************************************************************************************************\r
+void display_char(u8 segment, u8 chr, u8 mode)\r
+{\r
+    u8 *lcdmem;                 // Pointer to LCD memory\r
+    u8 bitmask;                 // Bitmask for character\r
+    u8 bits, bits1;             // Bits to write\r
+\r
+    // Write to single 7-segment character\r
+    if ((segment >= LCD_SEG_L1_3) && (segment <= LCD_SEG_L2_DP))\r
+    {\r
+        // Get LCD memory address for segment from table\r
+        lcdmem = (u8 *) segments_lcdmem[segment];\r
+\r
+        // Get bitmask for character from table\r
+        bitmask = segments_bitmask[segment];\r
+\r
+        // Get bits from font set\r
+        if ((chr >= 0x30) && (chr <= 0x5A))\r
+        {\r
+            // Use font set\r
+            bits = lcd_font[chr - 0x30];\r
+        }\r
+        else if (chr == 0x2D)\r
+        {\r
+            // '-' not in font set\r
+            bits = BIT1;\r
+        }\r
+        else\r
+        {\r
+            // Other characters map to ' ' (blank)\r
+            bits = 0;\r
+        }\r
+\r
+        // When addressing LINE2 7-segment characters need to swap high- and low-nibble,\r
+        // because LCD COM/SEG assignment is mirrored against LINE1\r
+        if (segment >= LCD_SEG_L2_5)\r
+        {\r
+            bits1 = ((bits << 4) & 0xF0) | ((bits >> 4) & 0x0F);\r
+            bits = bits1;\r
+\r
+            // When addressing LCD_SEG_L2_5, need to convert ASCII '1' and 'L' to 1 bit,\r
+            // because LCD COM/SEG assignment is special for this incomplete character\r
+            if (segment == LCD_SEG_L2_5)\r
+            {\r
+                if ((chr == '1') || (chr == 'L'))\r
+                    bits = BIT7;\r
+            }\r
+        }\r
+\r
+        // Physically write to LCD memory\r
+        write_lcd_mem(lcdmem, bits, bitmask, mode);\r
+    }\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          display_chars\r
+// @brief       Write to consecutive 7-segment characters.\r
+// @param       u8 segments     LCD segment array\r
+//                              u8 * str                Pointer to a string\r
+//                              u8 mode             SEG_ON, SEG_OFF, SEG_BLINK\r
+// @return      none\r
+// *************************************************************************************************\r
+void display_chars(u8 segments, u8 * str, u8 mode)\r
+{\r
+    u8 i;\r
+    u8 length = 0;              // Write length\r
+    u8 char_start;              // Starting point for consecutive write\r
+\r
+    switch (segments)\r
+    {\r
+        // LINE1\r
+        case LCD_SEG_L1_3_0:\r
+            length = 4;\r
+            char_start = LCD_SEG_L1_3;\r
+            break;\r
+        case LCD_SEG_L1_2_0:\r
+            length = 3;\r
+            char_start = LCD_SEG_L1_2;\r
+            break;\r
+        case LCD_SEG_L1_1_0:\r
+            length = 2;\r
+            char_start = LCD_SEG_L1_1;\r
+            break;\r
+        case LCD_SEG_L1_3_1:\r
+            length = 3;\r
+            char_start = LCD_SEG_L1_3;\r
+            break;\r
+        case LCD_SEG_L1_3_2:\r
+            length = 2;\r
+            char_start = LCD_SEG_L1_3;\r
+            break;\r
+\r
+        // LINE2\r
+        case LCD_SEG_L2_5_0:\r
+            length = 6;\r
+            char_start = LCD_SEG_L2_5;\r
+            break;\r
+        case LCD_SEG_L2_4_0:\r
+            length = 5;\r
+            char_start = LCD_SEG_L2_4;\r
+            break;\r
+        case LCD_SEG_L2_3_0:\r
+            length = 4;\r
+            char_start = LCD_SEG_L2_3;\r
+            break;\r
+        case LCD_SEG_L2_2_0:\r
+            length = 3;\r
+            char_start = LCD_SEG_L2_2;\r
+            break;\r
+        case LCD_SEG_L2_1_0:\r
+            length = 2;\r
+            char_start = LCD_SEG_L2_1;\r
+            break;\r
+        case LCD_SEG_L2_5_4:\r
+            length = 2;\r
+            char_start = LCD_SEG_L2_5;\r
+            break;\r
+        case LCD_SEG_L2_5_2:\r
+            length = 4;\r
+            char_start = LCD_SEG_L2_5;\r
+            break;\r
+        case LCD_SEG_L2_3_2:\r
+            length = 2;\r
+            char_start = LCD_SEG_L2_3;\r
+            break;\r
+        case LCD_SEG_L2_4_2:\r
+            length = 3;\r
+            char_start = LCD_SEG_L2_4;\r
+            break;\r
+    }\r
+\r
+    // Write to consecutive digits\r
+    for (i = 0; i < length; i++)\r
+    {\r
+        // Use single character routine to write display memory\r
+        display_char(char_start + i, *(str + i), mode);\r
+    }\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          switch_seg\r
+// @brief       Returns index of 7-segment character. Required for display routines that can draw\r
+//                              information on both lines.\r
+// @param       u8 line             LINE1 or LINE2\r
+//                              u8 index1               Index of LINE1\r
+//                              u8 index2               Index of LINE2\r
+// @return      uint8\r
+// *************************************************************************************************\r
+u8 switch_seg(u8 line, u8 index1, u8 index2)\r
+{\r
+    if (line == LINE1)\r
+    {\r
+        return index1;\r
+    }\r
+    else                        // line == LINE2\r
+    {\r
+        return index2;\r
+    }\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          start_blink\r
+// @brief       Start blinking.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void start_blink(void)\r
+{\r
+    LCDBBLKCTL |= LCDBLKMOD0;\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          stop_blink\r
+// @brief       Stop blinking.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void stop_blink(void)\r
+{\r
+    LCDBBLKCTL &= ~LCDBLKMOD0;\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          stop_blink\r
+// @brief       Clear blinking memory.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void clear_blink_mem(void)\r
+{\r
+    LCDBMEMCTL |= LCDCLRBM;\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          set_blink_rate\r
+// @brief       Set blink rate register bits.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void set_blink_rate(u8 bits)\r
+{\r
+    LCDBBLKCTL &= ~(BIT7 | BIT6 | BIT5);\r
+    LCDBBLKCTL |= bits;\r
+}\r
+\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/driver/display.h b/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/driver/display.h
new file mode 100755 (executable)
index 0000000..3674a4e
--- /dev/null
@@ -0,0 +1,338 @@
+// *************************************************************************************************\r
+//\r
+//      Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//        Redistribution and use in source and binary forms, with or without\r
+//        modification, are permitted provided that the following conditions\r
+//        are met:\r
+//\r
+//          Redistributions of source code must retain the above copyright\r
+//          notice, this list of conditions and the following disclaimer.\r
+//\r
+//          Redistributions in binary form must reproduce the above copyright\r
+//          notice, this list of conditions and the following disclaimer in the\r
+//          documentation and/or other materials provided with the\r
+//          distribution.\r
+//\r
+//          Neither the name of Texas Instruments Incorporated nor the names of\r
+//          its contributors may be used to endorse or promote products derived\r
+//          from this software without specific prior written permission.\r
+//\r
+//        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+\r
+#ifndef __DISPLAY_H\r
+#define __DISPLAY_H\r
+\r
+// *************************************************************************************************\r
+// Include section\r
+\r
+#include <project.h>\r
+\r
+// *************************************************************************************************\r
+// Extern section\r
+\r
+// Constants defined in library\r
+extern const u8 lcd_font[];\r
+extern const u8 *segments_lcdmem[];\r
+extern const u8 segments_bitmask[];\r
+extern const u8 int_to_array_conversion_table[][3];\r
+\r
+// *************************************************************************************************\r
+// Global Variable section\r
+\r
+// Set of display flags\r
+typedef union\r
+{\r
+    struct\r
+    {\r
+        // Line1 + Line2 + Icons\r
+        u16 full_update : 1;            // 1 = Redraw all content\r
+        u16 partial_update : 1;         // 1 = Update changes\r
+\r
+        // Line only\r
+        u16 line1_full_update : 1;      // 1 = Redraw Line1 content\r
+        u16 line2_full_update : 1;      // 1 = Redraw Line2 content\r
+\r
+        // Logic module data update flags\r
+        u16 update_time : 1;            // 1 = Time was updated\r
+        u16 update_stopwatch : 1;       // 1 = Stopwatch was updated\r
+        u16 update_temperature : 1;     // 1 = Temperature was updated\r
+        u16 update_battery_voltage : 1; // 1 = Battery voltage was updated\r
+        u16 update_date : 1;            // 1 = Date was updated\r
+        u16 update_alarm : 1;           // 1 = Alarm time was updated\r
+        u16 update_acceleration : 1;    // 1 = Acceleration data was updated\r
+    } flag;\r
+    u16 all_flags;                      // Shortcut to all display flags (for reset)\r
+} s_display_flags;\r
+\r
+extern volatile s_display_flags display;\r
+\r
+// *************************************************************************************************\r
+// Defines section\r
+\r
+// Display function modes\r
+#define DISPLAY_LINE_UPDATE_FULL                (BIT0)\r
+#define DISPLAY_LINE_UPDATE_PARTIAL             (BIT1)\r
+#define DISPLAY_LINE_CLEAR                              (BIT2)\r
+\r
+// Definitions for line view style\r
+#define DISPLAY_DEFAULT_VIEW                    (0u)\r
+#define DISPLAY_ALTERNATIVE_VIEW                (1u)\r
+\r
+// Definitions for line access\r
+#define LINE1                                                   (1u)\r
+#define LINE2                                                   (2u)\r
+\r
+// LCD display modes\r
+#define SEG_OFF                                 (0u)\r
+#define SEG_ON                                  (1u)\r
+#define SEG_ON_BLINK_ON                 (2u)\r
+#define SEG_ON_BLINK_OFF                (3u)\r
+#define SEG_OFF_BLINK_OFF               (4u)\r
+\r
+// 7-segment character bit assignments\r
+#define SEG_A                   (BIT4)\r
+#define SEG_B                   (BIT5)\r
+#define SEG_C                   (BIT6)\r
+#define SEG_D                   (BIT7)\r
+#define SEG_E                   (BIT2)\r
+#define SEG_F                   (BIT0)\r
+#define SEG_G                   (BIT1)\r
+\r
+// ------------------------------------------\r
+// LCD symbols for easier access\r
+//\r
+// xxx_SEG_xxx          = Seven-segment character (sequence 5-4-3-2-1-0)\r
+// xxx_SYMB_xxx         = Display symbol, e.g. "AM" for ante meridiem\r
+// xxx_UNIT_xxx         = Display unit, e.g. "km/h" for kilometers per hour\r
+// xxx_ICON_xxx         = Display icon, e.g. heart to indicate reception of heart rate data\r
+// xxx_L1_xxx           = Item is part of Line1 information\r
+// xxx_L2_xxx           = Item is part of Line2 information\r
+\r
+// Symbols for Line1\r
+#define LCD_SYMB_AM                                     0\r
+#define LCD_SYMB_PM                                     1\r
+#define LCD_SYMB_ARROW_UP                       2\r
+#define LCD_SYMB_ARROW_DOWN                     3\r
+#define LCD_SYMB_PERCENT                        4\r
+\r
+// Symbols for Line2\r
+#define LCD_SYMB_TOTAL                          5\r
+#define LCD_SYMB_AVERAGE                        6\r
+#define LCD_SYMB_MAX                            7\r
+#define LCD_SYMB_BATTERY                        8\r
+\r
+// Units for Line1\r
+#define LCD_UNIT_L1_FT                          9\r
+#define LCD_UNIT_L1_K                           10\r
+#define LCD_UNIT_L1_M                           11\r
+#define LCD_UNIT_L1_I                           12\r
+#define LCD_UNIT_L1_PER_S                       13\r
+#define LCD_UNIT_L1_PER_H                       14\r
+#define LCD_UNIT_L1_DEGREE                      15\r
+\r
+// Units for Line2\r
+#define LCD_UNIT_L2_KCAL                        16\r
+#define LCD_UNIT_L2_KM                          17\r
+#define LCD_UNIT_L2_MI                          18\r
+\r
+// Icons\r
+#define LCD_ICON_HEART                          19\r
+#define LCD_ICON_STOPWATCH                      20\r
+#define LCD_ICON_RECORD                         21\r
+#define LCD_ICON_ALARM                          22\r
+#define LCD_ICON_BEEPER1                        23\r
+#define LCD_ICON_BEEPER2                        24\r
+#define LCD_ICON_BEEPER3                        25\r
+\r
+// Line1 7-segments\r
+#define LCD_SEG_L1_3                            26\r
+#define LCD_SEG_L1_2                            27\r
+#define LCD_SEG_L1_1                            28\r
+#define LCD_SEG_L1_0                            29\r
+#define LCD_SEG_L1_COL                          30\r
+#define LCD_SEG_L1_DP1                          31\r
+#define LCD_SEG_L1_DP0                          32\r
+\r
+// Line2 7-segments\r
+#define LCD_SEG_L2_5                            33\r
+#define LCD_SEG_L2_4                            34\r
+#define LCD_SEG_L2_3                            35\r
+#define LCD_SEG_L2_2                            36\r
+#define LCD_SEG_L2_1                            37\r
+#define LCD_SEG_L2_0                            38\r
+#define LCD_SEG_L2_COL1                         39\r
+#define LCD_SEG_L2_COL0                         40\r
+#define LCD_SEG_L2_DP                           41\r
+\r
+// Line1 7-segment arrays\r
+#define LCD_SEG_L1_3_0                          70\r
+#define LCD_SEG_L1_2_0                          71\r
+#define LCD_SEG_L1_1_0                          72\r
+#define LCD_SEG_L1_3_1                          73\r
+#define LCD_SEG_L1_3_2                          74\r
+\r
+// Line2 7-segment arrays\r
+#define LCD_SEG_L2_5_0                          90\r
+#define LCD_SEG_L2_4_0                          91\r
+#define LCD_SEG_L2_3_0                          92\r
+#define LCD_SEG_L2_2_0                          93\r
+#define LCD_SEG_L2_1_0                          94\r
+#define LCD_SEG_L2_5_2                          95\r
+#define LCD_SEG_L2_3_2                          96\r
+#define LCD_SEG_L2_5_4                          97\r
+#define LCD_SEG_L2_4_2                          98\r
+\r
+// LCD controller memory map\r
+#define LCD_MEM_1                               ((u8*)0x0A20)\r
+#define LCD_MEM_2                               ((u8*)0x0A21)\r
+#define LCD_MEM_3                               ((u8*)0x0A22)\r
+#define LCD_MEM_4                               ((u8*)0x0A23)\r
+#define LCD_MEM_5                               ((u8*)0x0A24)\r
+#define LCD_MEM_6                               ((u8*)0x0A25)\r
+#define LCD_MEM_7                               ((u8*)0x0A26)\r
+#define LCD_MEM_8                               ((u8*)0x0A27)\r
+#define LCD_MEM_9                               ((u8*)0x0A28)\r
+#define LCD_MEM_10                              ((u8*)0x0A29)\r
+#define LCD_MEM_11                              ((u8*)0x0A2A)\r
+#define LCD_MEM_12                              ((u8*)0x0A2B)\r
+\r
+// Memory assignment\r
+#define LCD_SEG_L1_0_MEM                        (LCD_MEM_6)\r
+#define LCD_SEG_L1_1_MEM                        (LCD_MEM_4)\r
+#define LCD_SEG_L1_2_MEM                        (LCD_MEM_3)\r
+#define LCD_SEG_L1_3_MEM                        (LCD_MEM_2)\r
+#define LCD_SEG_L1_COL_MEM                      (LCD_MEM_1)\r
+#define LCD_SEG_L1_DP1_MEM                      (LCD_MEM_1)\r
+#define LCD_SEG_L1_DP0_MEM                      (LCD_MEM_5)\r
+#define LCD_SEG_L2_0_MEM                        (LCD_MEM_8)\r
+#define LCD_SEG_L2_1_MEM                        (LCD_MEM_9)\r
+#define LCD_SEG_L2_2_MEM                        (LCD_MEM_10)\r
+#define LCD_SEG_L2_3_MEM                        (LCD_MEM_11)\r
+#define LCD_SEG_L2_4_MEM                        (LCD_MEM_12)\r
+#define LCD_SEG_L2_5_MEM                        (LCD_MEM_12)\r
+#define LCD_SEG_L2_COL1_MEM                     (LCD_MEM_1)\r
+#define LCD_SEG_L2_COL0_MEM                     (LCD_MEM_5)\r
+#define LCD_SEG_L2_DP_MEM                       (LCD_MEM_9)\r
+#define LCD_SYMB_AM_MEM                         (LCD_MEM_1)\r
+#define LCD_SYMB_PM_MEM                         (LCD_MEM_1)\r
+#define LCD_SYMB_ARROW_UP_MEM           (LCD_MEM_1)\r
+#define LCD_SYMB_ARROW_DOWN_MEM         (LCD_MEM_1)\r
+#define LCD_SYMB_PERCENT_MEM            (LCD_MEM_5)\r
+#define LCD_SYMB_TOTAL_MEM                      (LCD_MEM_11)\r
+#define LCD_SYMB_AVERAGE_MEM            (LCD_MEM_10)\r
+#define LCD_SYMB_MAX_MEM                        (LCD_MEM_8)\r
+#define LCD_SYMB_BATTERY_MEM            (LCD_MEM_7)\r
+#define LCD_UNIT_L1_FT_MEM                      (LCD_MEM_5)\r
+#define LCD_UNIT_L1_K_MEM                       (LCD_MEM_5)\r
+#define LCD_UNIT_L1_M_MEM                       (LCD_MEM_7)\r
+#define LCD_UNIT_L1_I_MEM                       (LCD_MEM_7)\r
+#define LCD_UNIT_L1_PER_S_MEM           (LCD_MEM_5)\r
+#define LCD_UNIT_L1_PER_H_MEM           (LCD_MEM_7)\r
+#define LCD_UNIT_L1_DEGREE_MEM          (LCD_MEM_5)\r
+#define LCD_UNIT_L2_KCAL_MEM            (LCD_MEM_7)\r
+#define LCD_UNIT_L2_KM_MEM                      (LCD_MEM_7)\r
+#define LCD_UNIT_L2_MI_MEM                      (LCD_MEM_7)\r
+#define LCD_ICON_HEART_MEM                      (LCD_MEM_2)\r
+#define LCD_ICON_STOPWATCH_MEM          (LCD_MEM_3)\r
+#define LCD_ICON_RECORD_MEM                     (LCD_MEM_1)\r
+#define LCD_ICON_ALARM_MEM                      (LCD_MEM_4)\r
+#define LCD_ICON_BEEPER1_MEM            (LCD_MEM_5)\r
+#define LCD_ICON_BEEPER2_MEM            (LCD_MEM_6)\r
+#define LCD_ICON_BEEPER3_MEM            (LCD_MEM_7)\r
+\r
+// Bit masks for write access\r
+#define LCD_SEG_L1_0_MASK                       (BIT2 + BIT1 + BIT0 + BIT7 + BIT6 + BIT5 + BIT4)\r
+#define LCD_SEG_L1_1_MASK                       (BIT2 + BIT1 + BIT0 + BIT7 + BIT6 + BIT5 + BIT4)\r
+#define LCD_SEG_L1_2_MASK                       (BIT2 + BIT1 + BIT0 + BIT7 + BIT6 + BIT5 + BIT4)\r
+#define LCD_SEG_L1_3_MASK                       (BIT2 + BIT1 + BIT0 + BIT7 + BIT6 + BIT5 + BIT4)\r
+#define LCD_SEG_L1_COL_MASK                     (BIT5)\r
+#define LCD_SEG_L1_DP1_MASK                     (BIT6)\r
+#define LCD_SEG_L1_DP0_MASK                     (BIT2)\r
+#define LCD_SEG_L2_0_MASK                       (BIT3 + BIT2 + BIT1 + BIT0 + BIT6 + BIT5 + BIT4)\r
+#define LCD_SEG_L2_1_MASK                       (BIT3 + BIT2 + BIT1 + BIT0 + BIT6 + BIT5 + BIT4)\r
+#define LCD_SEG_L2_2_MASK                       (BIT3 + BIT2 + BIT1 + BIT0 + BIT6 + BIT5 + BIT4)\r
+#define LCD_SEG_L2_3_MASK                       (BIT3 + BIT2 + BIT1 + BIT0 + BIT6 + BIT5 + BIT4)\r
+#define LCD_SEG_L2_4_MASK                       (BIT3 + BIT2 + BIT1 + BIT0 + BIT6 + BIT5 + BIT4)\r
+#define LCD_SEG_L2_5_MASK                       (BIT7)\r
+#define LCD_SEG_L2_COL1_MASK            (BIT4)\r
+#define LCD_SEG_L2_COL0_MASK            (BIT0)\r
+#define LCD_SEG_L2_DP_MASK                      (BIT7)\r
+#define LCD_SYMB_AM_MASK                        (BIT1 + BIT0)\r
+#define LCD_SYMB_PM_MASK                        (BIT0)\r
+#define LCD_SYMB_ARROW_UP_MASK          (BIT2)\r
+#define LCD_SYMB_ARROW_DOWN_MASK        (BIT3)\r
+#define LCD_SYMB_PERCENT_MASK           (BIT4)\r
+#define LCD_SYMB_TOTAL_MASK                     (BIT7)\r
+#define LCD_SYMB_AVERAGE_MASK           (BIT7)\r
+#define LCD_SYMB_MAX_MASK                       (BIT7)\r
+#define LCD_SYMB_BATTERY_MASK           (BIT7)\r
+#define LCD_UNIT_L1_FT_MASK                     (BIT5)\r
+#define LCD_UNIT_L1_K_MASK                      (BIT6)\r
+#define LCD_UNIT_L1_M_MASK                      (BIT1)\r
+#define LCD_UNIT_L1_I_MASK                      (BIT0)\r
+#define LCD_UNIT_L1_PER_S_MASK          (BIT7)\r
+#define LCD_UNIT_L1_PER_H_MASK          (BIT2)\r
+#define LCD_UNIT_L1_DEGREE_MASK         (BIT1)\r
+#define LCD_UNIT_L2_KCAL_MASK           (BIT4)\r
+#define LCD_UNIT_L2_KM_MASK                     (BIT5)\r
+#define LCD_UNIT_L2_MI_MASK                     (BIT6)\r
+#define LCD_ICON_HEART_MASK                     (BIT3)\r
+#define LCD_ICON_STOPWATCH_MASK         (BIT3)\r
+#define LCD_ICON_RECORD_MASK            (BIT7)\r
+#define LCD_ICON_ALARM_MASK                     (BIT3)\r
+#define LCD_ICON_BEEPER1_MASK           (BIT3)\r
+#define LCD_ICON_BEEPER2_MASK           (BIT3)\r
+#define LCD_ICON_BEEPER3_MASK           (BIT3)\r
+\r
+// *************************************************************************************************\r
+// API section\r
+\r
+// Physical LCD memory write\r
+extern void write_lcd_mem(u8 * lcdmem, u8 bits, u8 bitmask, u8 state);\r
+\r
+// Display init / clear\r
+extern void lcd_init(void);\r
+extern void clear_display(void);\r
+extern void clear_display_all(void);\r
+extern void clear_line(u8 line);\r
+\r
+// Blinking function\r
+extern void start_blink(void);\r
+extern void stop_blink(void);\r
+extern void clear_blink_mem(void);\r
+extern void set_blink_rate(u8 bits);\r
+\r
+// Character / symbol draw functions\r
+extern void display_char(u8 segment, u8 chr, u8 mode);\r
+extern void display_chars(u8 segments, u8 * str, u8 mode);\r
+extern void display_symbol(u8 symbol, u8 mode);\r
+\r
+// Time display function\r
+extern void DisplayTime(u8 updateMode);\r
+extern void display_am_pm_symbol(u8 timeAM);\r
+\r
+// Set_value display functions\r
+extern void display_value(u8 segments, u32 value, u8 digits, u8 blanks);\r
+extern void display_hours(u8 segments, u32 value, u8 digits, u8 blanks);\r
+\r
+// Integer to string conversion\r
+extern u8 *int_to_array(u32 n, u8 digits, u8 blanks);\r
+\r
+// Segment index helper function\r
+extern u8 switch_seg(u8 line, u8 index1, u8 index2);\r
+\r
+#endif     /*DISPLAY_H_ */\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/driver/ez430_chronos_drivers.r43 b/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/driver/ez430_chronos_drivers.r43
new file mode 100755 (executable)
index 0000000..45b9a2a
Binary files /dev/null and b/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/driver/ez430_chronos_drivers.r43 differ
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/driver/pmm.c b/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/driver/pmm.c
new file mode 100755 (executable)
index 0000000..6d53a7c
--- /dev/null
@@ -0,0 +1,78 @@
+//****************************************************************************//\r
+// Function Library for setting the PMM\r
+//\r
+//  This file is used in conjunction with PMM.c to set the core\r
+//  voltage level of a device. To set a core voltage level, call\r
+//  SetVCore(level). See RF project(s) for example usage.\r
+//\r
+//  Original programm                                           Stefan Schauer\r
+//  Rev 1.1: changed VCoreUp to fit with recommended flow (09/04/2008)\r
+//\r
+//****************************************************************************//\r
+#include "cc430x613x.h"\r
+#include "pmm.h"\r
+\r
+//****************************************************************************//\r
+// Set VCore level\r
+// SetVCore level is called from the user API\r
+//****************************************************************************//\r
+void SetVCore(unsigned char level)                                   // Note: change level by one\r
+                                                                     // step only\r
+{\r
+    unsigned char actLevel;\r
+\r
+    do\r
+    {\r
+        actLevel = PMMCTL0_L & PMMCOREV_3;\r
+        if (actLevel < level)\r
+            SetVCoreUp(++actLevel);                                  // Set VCore (step by step)\r
+        if (actLevel > level)\r
+            SetVCoreDown(--actLevel);                                // Set VCore (step by step)\r
+    }\r
+    while (actLevel != level);\r
+}\r
+\r
+//****************************************************************************//\r
+// Set VCore up\r
+//****************************************************************************//\r
+void SetVCoreUp(unsigned char level)                                 // Note: change level by one\r
+                                                                     // step only\r
+{\r
+    // Open PMM module registers for write access\r
+    PMMCTL0_H = 0xA5;\r
+\r
+    // Set SVS/M high side to new level\r
+    SVSMHCTL = SVSHE + SVSHRVL0 * level + SVMHE + SVSMHRRL0 * level;\r
+\r
+    SVSMLCTL = SVSLE + SVMLE + SVSMLRRL0 * level;                    // Set SVM new Level\r
+    while ((PMMIFG & SVSMLDLYIFG) == 0) ;                            // Wait till SVM is settled\r
+                                                                     // (Delay)\r
+    PMMCTL0_L = PMMCOREV0 * level;                                   // Set VCore to x\r
+    PMMIFG &= ~(SVMLVLRIFG + SVMLIFG);                               // Clear already set flags\r
+    if ((PMMIFG & SVMLIFG))\r
+        while ((PMMIFG & SVMLVLRIFG) == 0) ;                         // Wait till level is reached\r
+\r
+    SVSMLCTL = SVSLE + SVSLRVL0 * level + SVMLE + SVSMLRRL0 * level; // Set SVS/M Low side to new\r
+                                                                     // level\r
+    PMMCTL0_H = 0x00;                                                // Lock PMM module registers\r
+                                                                     // for write access\r
+}\r
+\r
+//****************************************************************************//\r
+// Set VCore down\r
+//****************************************************************************//\r
+void SetVCoreDown(unsigned char level)\r
+{\r
+    PMMCTL0_H = 0xA5;                                                // Open PMM module registers\r
+                                                                     // for write access\r
+    SVSMLCTL = SVSLE + SVSLRVL0 * level + SVMLE + SVSMLRRL0 * level; // Set SVS/M Low side to new\r
+                                                                     // level\r
+    while ((PMMIFG & SVSMLDLYIFG) == 0) ;                            // Wait till SVM is settled\r
+                                                                     // (Delay)\r
+    PMMCTL0_L = (level * PMMCOREV0);                                 // Set VCore to 1.85 V for Max\r
+                                                                     // Speed.\r
+    PMMCTL0_H = 0x00;                                                // Lock PMM module registers\r
+                                                                     // for write access\r
+}\r
+\r
+//****************************************************************************//\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/driver/pmm.h b/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/driver/pmm.h
new file mode 100755 (executable)
index 0000000..170008f
--- /dev/null
@@ -0,0 +1,43 @@
+//====================================================================\r
+//    File: PMM.h\r
+//\r
+//    This file is used in conjunction with PMM.c to set the core\r
+//    voltage level of a device. To set a core voltage level, call\r
+//    SetVCore(level). See RF project(s) for example usage.\r
+//\r
+//    Version 1.0 first\r
+//    07/14/07\r
+//\r
+//====================================================================\r
+\r
+#ifndef __PMM\r
+#define __PMM\r
+\r
+//====================================================================\r
+\r
+/**\r
+ * Set the VCore to a new level\r
+ *\r
+ * \param level       PMM level ID\r
+ */\r
+void SetVCore(unsigned char level);\r
+\r
+//====================================================================\r
+\r
+/**\r
+ * Set the VCore to a new higher level\r
+ *\r
+ * \param level       PMM level ID\r
+ */\r
+void SetVCoreUp(unsigned char level);\r
+\r
+//====================================================================\r
+\r
+/**\r
+ * Set the VCore to a new Lower level\r
+ *\r
+ * \param level       PMM level ID\r
+ */\r
+void SetVCoreDown(unsigned char level);\r
+\r
+#endif                          /* __PMM */\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/driver/ports.c b/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/driver/ports.c
new file mode 100755 (executable)
index 0000000..cd086c3
--- /dev/null
@@ -0,0 +1,455 @@
+// *************************************************************************************************\r
+//\r
+//      Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//        Redistribution and use in source and binary forms, with or without\r
+//        modification, are permitted provided that the following conditions\r
+//        are met:\r
+//\r
+//          Redistributions of source code must retain the above copyright\r
+//          notice, this list of conditions and the following disclaimer.\r
+//\r
+//          Redistributions in binary form must reproduce the above copyright\r
+//          notice, this list of conditions and the following disclaimer in the\r
+//          documentation and/or other materials provided with the\r
+//          distribution.\r
+//\r
+//          Neither the name of Texas Instruments Incorporated nor the names of\r
+//          its contributors may be used to endorse or promote products derived\r
+//          from this software without specific prior written permission.\r
+//\r
+//        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+// Button entry functions.\r
+// *************************************************************************************************\r
+\r
+// *************************************************************************************************\r
+// Include section\r
+\r
+// system\r
+#include "project.h"\r
+\r
+// driver\r
+#include "ports.h"\r
+#include "buzzer.h"\r
+#include "vti_as.h"\r
+#include "vti_ps.h"\r
+#include "timer.h"\r
+#include "display.h"\r
+\r
+// logic\r
+#include "clock.h"\r
+#include "alarm.h"\r
+#include "rfsimpliciti.h"\r
+#include "simpliciti.h"\r
+#include "altitude.h"\r
+#include "stopwatch.h"\r
+\r
+// *************************************************************************************************\r
+// Prototypes section\r
+void button_repeat_on(u16 msec);\r
+void button_repeat_off(void);\r
+void button_repeat_function(void);\r
+\r
+// *************************************************************************************************\r
+// Defines section\r
+\r
+// Macro for button IRQ\r
+#define IRQ_TRIGGERED(flags, bit)               ((flags & bit) == bit)\r
+\r
+// *************************************************************************************************\r
+// Global Variable section\r
+volatile s_button_flags button;\r
+volatile struct struct_button sButton;\r
+\r
+// *************************************************************************************************\r
+// Extern section\r
+extern void (*fptr_Timer0_A3_function)(void);\r
+\r
+// *************************************************************************************************\r
+// @fn          init_buttons\r
+// @brief       Init and enable button interrupts.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void init_buttons(void)\r
+{\r
+    // Set button ports to input\r
+    BUTTONS_DIR &= ~ALL_BUTTONS;\r
+\r
+    // Enable internal pull-downs\r
+    BUTTONS_OUT &= ~ALL_BUTTONS;\r
+    BUTTONS_REN |= ALL_BUTTONS;\r
+\r
+    // IRQ triggers on rising edge\r
+    BUTTONS_IES &= ~ALL_BUTTONS;\r
+\r
+    // Reset IRQ flags\r
+    BUTTONS_IFG &= ~ALL_BUTTONS;\r
+\r
+    // Enable button interrupts\r
+    BUTTONS_IE |= ALL_BUTTONS;\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          PORT2_ISR\r
+// @brief       Interrupt service routine for\r
+//                                      - buttons\r
+//                                      - acceleration sensor CMA_INT\r
+//                                      - pressure sensor DRDY\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+#pragma vector=PORT2_VECTOR\r
+__interrupt void PORT2_ISR(void)\r
+{\r
+    // Clear flags\r
+    u8 int_flag, int_enable;\r
+    u8 buzzer = 0;\r
+    u8 simpliciti_button_event = 0;\r
+    static u8 simpliciti_button_repeat = 0;\r
+\r
+    // Remember interrupt enable bits\r
+    int_enable = BUTTONS_IE;\r
+\r
+    if ((!button.flag.star_long) && (!button.flag.num_long))\r
+    {\r
+        // Clear button flags\r
+        button.all_flags = 0;\r
+\r
+        // Store valid button interrupt flag\r
+        int_flag = BUTTONS_IFG & int_enable;\r
+\r
+        // ---------------------------------------------------\r
+        // While SimpliciTI stack is active, buttons behave differently:\r
+        //  - Store button events in SimpliciTI packet data\r
+        //  - Exit SimpliciTI when button DOWN was pressed\r
+        if (is_rf())\r
+        {\r
+            // Erase previous button press after a number of resends (increase number if link\r
+            // quality is low)\r
+            // This will create a series of packets containing the same button press\r
+            // Necessary because we have no acknowledge\r
+            // Filtering (edge detection) will be done by receiver software\r
+            if (simpliciti_button_repeat++ > 6)\r
+            {\r
+                simpliciti_data[0] &= ~0xF0;\r
+                simpliciti_button_repeat = 0;\r
+            }\r
+\r
+            if ((int_flag & BUTTON_STAR_PIN) == BUTTON_STAR_PIN)\r
+            {\r
+                simpliciti_data[0] |= SIMPLICITI_BUTTON_STAR;\r
+                simpliciti_button_event = 1;\r
+            }\r
+            else if ((int_flag & BUTTON_NUM_PIN) == BUTTON_NUM_PIN)\r
+            {\r
+                simpliciti_data[0] |= SIMPLICITI_BUTTON_NUM;\r
+                simpliciti_button_event = 1;\r
+            }\r
+            else if ((int_flag & BUTTON_UP_PIN) == BUTTON_UP_PIN)\r
+            {\r
+                simpliciti_data[0] |= SIMPLICITI_BUTTON_UP;\r
+                simpliciti_button_event = 1;\r
+            }\r
+            else if ((int_flag & BUTTON_DOWN_PIN) == BUTTON_DOWN_PIN)\r
+            {\r
+                simpliciti_flag |= SIMPLICITI_TRIGGER_STOP;\r
+            }\r
+\r
+            // Trigger packet sending inside SimpliciTI stack\r
+            if (simpliciti_button_event)\r
+                simpliciti_flag |= SIMPLICITI_TRIGGER_SEND_DATA;\r
+        }\r
+        else                    // Normal operation\r
+        {\r
+            // Debounce buttons\r
+            if ((int_flag & ALL_BUTTONS) != 0)\r
+            {\r
+                // Disable PORT2 IRQ\r
+                __disable_interrupt();\r
+                BUTTONS_IE = 0x00;\r
+                __enable_interrupt();\r
+\r
+                // Debounce delay 1\r
+                Timer0_A4_Delay(CONV_MS_TO_TICKS(BUTTONS_DEBOUNCE_TIME_IN));\r
+\r
+                // Reset inactivity detection\r
+                sTime.last_activity = sTime.system_time;\r
+            }\r
+\r
+            // ---------------------------------------------------\r
+            // STAR button IRQ\r
+            if (IRQ_TRIGGERED(int_flag, BUTTON_STAR_PIN))\r
+            {\r
+                // Filter bouncing noise\r
+                if (BUTTON_STAR_IS_PRESSED)\r
+                {\r
+                    button.flag.star = 1;\r
+                    button.flag.star_not_long = 0;\r
+                    // Generate button click\r
+                    buzzer = 1;\r
+                }\r
+                else if ((BUTTONS_IES & BUTTON_STAR_PIN) == BUTTON_STAR_PIN)\r
+                {\r
+                    button.flag.star = 1;\r
+                    button.flag.star_not_long = 0;\r
+                    BUTTONS_IES &= ~BUTTON_STAR_PIN;\r
+                }\r
+            }\r
+            // ---------------------------------------------------\r
+            // NUM button IRQ\r
+            else if (IRQ_TRIGGERED(int_flag, BUTTON_NUM_PIN))\r
+            {\r
+                // Filter bouncing noise\r
+                if (BUTTON_NUM_IS_PRESSED)\r
+                {\r
+                    button.flag.num = 1;\r
+                    button.flag.num_not_long = 0;\r
+                    // Generate button click\r
+                    buzzer = 1;\r
+                }\r
+                else if ((BUTTONS_IES & BUTTON_NUM_PIN) == BUTTON_NUM_PIN)\r
+                {\r
+                    button.flag.num = 1;\r
+                    button.flag.num_not_long = 0;\r
+                    BUTTONS_IES &= ~BUTTON_NUM_PIN;\r
+                }\r
+            }\r
+            // ---------------------------------------------------\r
+            // UP button IRQ\r
+            else if (IRQ_TRIGGERED(int_flag, BUTTON_UP_PIN))\r
+            {\r
+                // Filter bouncing noise\r
+                if (BUTTON_UP_IS_PRESSED)\r
+                {\r
+                    button.flag.up = 1;\r
+\r
+                    // Generate button click\r
+                    buzzer = 1;\r
+                }\r
+            }\r
+            // ---------------------------------------------------\r
+            // DOWN button IRQ\r
+            else if (IRQ_TRIGGERED(int_flag, BUTTON_DOWN_PIN))\r
+            {\r
+                // Filter bouncing noise\r
+                if (BUTTON_DOWN_IS_PRESSED)\r
+                {\r
+                    button.flag.down = 1;\r
+\r
+                    // Generate button click\r
+                    buzzer = 1;\r
+\r
+                    // Faster reaction for stopwatch stop button press\r
+                    if (is_stopwatch() && !sys.flag.lock_buttons)\r
+                    {\r
+                        stop_stopwatch();\r
+                        button.flag.down = 0;\r
+                    }\r
+                }\r
+            }\r
+            // ---------------------------------------------------\r
+            // B/L button IRQ\r
+            else if (IRQ_TRIGGERED(int_flag, BUTTON_BACKLIGHT_PIN))\r
+            {\r
+                // Filter bouncing noise\r
+                if (BUTTON_BACKLIGHT_IS_PRESSED)\r
+                {\r
+                    sButton.backlight_status = 1;\r
+                    sButton.backlight_timeout = 0;\r
+                    P2OUT |= BUTTON_BACKLIGHT_PIN;\r
+                    P2DIR |= BUTTON_BACKLIGHT_PIN;\r
+                }\r
+            }\r
+        }\r
+\r
+        // Trying to lock/unlock buttons?\r
+        if (button.flag.num && button.flag.down)\r
+        {\r
+            // No buzzer output\r
+            buzzer = 0;\r
+            button.all_flags = 0;\r
+        }\r
+\r
+        // Generate button click when button was activated\r
+        if (buzzer)\r
+        {\r
+            // Any button event stops active alarm\r
+            if (sAlarm.state == ALARM_ON)\r
+            {\r
+                stop_alarm();\r
+                button.all_flags = 0;\r
+            }\r
+            else if (!sys.flag.up_down_repeat_enabled)\r
+            {\r
+                start_buzzer(1, CONV_MS_TO_TICKS(20), CONV_MS_TO_TICKS(150));\r
+            }\r
+\r
+            // Debounce delay 2\r
+            Timer0_A4_Delay(CONV_MS_TO_TICKS(BUTTONS_DEBOUNCE_TIME_OUT));\r
+        }\r
+\r
+        // ---------------------------------------------------\r
+        // Acceleration sensor IRQ\r
+        if (IRQ_TRIGGERED(int_flag, AS_INT_PIN))\r
+        {\r
+            // Get data from sensor\r
+            request.flag.acceleration_measurement = 1;\r
+        }\r
+\r
+        // ---------------------------------------------------\r
+        // Pressure sensor IRQ\r
+        if (IRQ_TRIGGERED(int_flag, PS_INT_PIN))\r
+        {\r
+            // Get data from sensor\r
+            request.flag.altitude_measurement = 1;\r
+        }\r
+\r
+        // ---------------------------------------------------\r
+        // Safe long button event detection\r
+        if (button.flag.star || button.flag.num)\r
+        {\r
+            // Additional debounce delay to enable safe high detection - 50ms\r
+            Timer0_A4_Delay(CONV_MS_TO_TICKS(BUTTONS_DEBOUNCE_TIME_LEFT));\r
+\r
+            // Check if this button event is short enough\r
+            if (BUTTON_STAR_IS_PRESSED)\r
+            {\r
+                // Change interrupt edge to detect button release\r
+                BUTTONS_IES |= BUTTON_STAR_PIN;\r
+                button.flag.star = 0;\r
+                // This flag is used to detect if the user released the button before the\r
+                // time for a long button press (3s)\r
+                button.flag.star_not_long = 1;\r
+            }\r
+            if (BUTTON_NUM_IS_PRESSED)\r
+            {\r
+                // Change interrupt edge to detect button release\r
+                BUTTONS_IES |= BUTTON_NUM_PIN;\r
+                button.flag.num = 0;\r
+                // This flag is used to detect if the user released the button before the\r
+                // time for a long button press (3s)\r
+                button.flag.num_not_long = 1;\r
+            }\r
+        }\r
+\r
+    }\r
+    // Reenable PORT2 IRQ\r
+    __disable_interrupt();\r
+    BUTTONS_IFG = 0x00;\r
+    BUTTONS_IE = int_enable;\r
+    __enable_interrupt();\r
+\r
+    // Exit from LPM3/LPM4 on RETI\r
+    __bic_SR_register_on_exit(LPM4_bits);\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          button_repeat_on\r
+// @brief       Start button auto repeat timer.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void button_repeat_on(u16 msec)\r
+{\r
+    // Set button repeat flag\r
+    sys.flag.up_down_repeat_enabled = 1;\r
+\r
+    // Set Timer0_A3 function pointer to button repeat function\r
+    fptr_Timer0_A3_function = button_repeat_function;\r
+\r
+    // Timer0_A3 IRQ triggers every 200ms\r
+    Timer0_A3_Start(CONV_MS_TO_TICKS(msec));\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          button_repeat_off\r
+// @brief       Stop button auto repeat timer.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void button_repeat_off(void)\r
+{\r
+    // Clear button repeat flag\r
+    sys.flag.up_down_repeat_enabled = 0;\r
+\r
+    // Timer0_A3 IRQ repeats with 4Hz\r
+    Timer0_A3_Stop();\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          button_repeat_function\r
+// @brief       Check at regular intervals if button is pushed continuously\r
+//                              and trigger virtual button event.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void button_repeat_function(void)\r
+{\r
+    static u8 start_delay = 10; // Wait for 2 seconds before starting auto up/down\r
+    u8 repeat = 0;\r
+\r
+    // If buttons UP or DOWN are continuously high, repeatedly set button flag\r
+    if (BUTTON_UP_IS_PRESSED)\r
+    {\r
+        if (start_delay == 0)\r
+        {\r
+            // Generate a virtual button event\r
+            button.flag.up = 1;\r
+            repeat = 1;\r
+        }\r
+        else\r
+        {\r
+            start_delay--;\r
+        }\r
+    }\r
+    else if (BUTTON_DOWN_IS_PRESSED)\r
+    {\r
+        if (start_delay == 0)\r
+        {\r
+            // Generate a virtual button event\r
+            button.flag.down = 1;\r
+            repeat = 1;\r
+        }\r
+        else\r
+        {\r
+            start_delay--;\r
+        }\r
+    }\r
+    else\r
+    {\r
+        // Reset repeat counter\r
+        sButton.repeats = 0;\r
+        start_delay = 10;\r
+\r
+        // Enable blinking\r
+        start_blink();\r
+    }\r
+\r
+    // If virtual button event is generated, stop blinking and reset timeout counter\r
+    if (repeat)\r
+    {\r
+        // Increase repeat counter\r
+        sButton.repeats++;\r
+\r
+        // Reset inactivity detection counter\r
+        sTime.last_activity = sTime.system_time;\r
+\r
+        // Disable blinking\r
+        stop_blink();\r
+    }\r
+}\r
+\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/driver/ports.h b/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/driver/ports.h
new file mode 100755 (executable)
index 0000000..fcb731f
--- /dev/null
@@ -0,0 +1,130 @@
+// *************************************************************************************************\r
+//\r
+//      Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//        Redistribution and use in source and binary forms, with or without\r
+//        modification, are permitted provided that the following conditions\r
+//        are met:\r
+//\r
+//          Redistributions of source code must retain the above copyright\r
+//          notice, this list of conditions and the following disclaimer.\r
+//\r
+//          Redistributions in binary form must reproduce the above copyright\r
+//          notice, this list of conditions and the following disclaimer in the\r
+//          documentation and/or other materials provided with the\r
+//          distribution.\r
+//\r
+//          Neither the name of Texas Instruments Incorporated nor the names of\r
+//          its contributors may be used to endorse or promote products derived\r
+//          from this software without specific prior written permission.\r
+//\r
+//        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+\r
+#ifndef PORTS_H_\r
+#define PORTS_H_\r
+\r
+// *************************************************************************************************\r
+// Defines section\r
+\r
+// Port, pins and interrupt resources for buttons\r
+#define BUTTONS_IN              (P2IN)\r
+#define BUTTONS_OUT                             (P2OUT)\r
+#define BUTTONS_DIR             (P2DIR)\r
+#define BUTTONS_REN                             (P2REN)\r
+#define BUTTONS_IE              (P2IE)\r
+#define BUTTONS_IES             (P2IES)\r
+#define BUTTONS_IFG             (P2IFG)\r
+#define BUTTONS_IRQ_VECT2       (PORT2_VECTOR)\r
+\r
+// Button ports\r
+#define BUTTON_STAR_PIN         (BIT2)\r
+#define BUTTON_NUM_PIN          (BIT1)\r
+#define BUTTON_UP_PIN           (BIT4)\r
+#define BUTTON_DOWN_PIN         (BIT0)\r
+#define BUTTON_BACKLIGHT_PIN    (BIT3)\r
+#define ALL_BUTTONS                             (BUTTON_STAR_PIN + BUTTON_NUM_PIN + BUTTON_UP_PIN + \\r
+                                                 BUTTON_DOWN_PIN + BUTTON_BACKLIGHT_PIN)\r
+\r
+// Macros for button press detection\r
+#define BUTTON_STAR_IS_PRESSED          ((BUTTONS_IN & BUTTON_STAR_PIN) == BUTTON_STAR_PIN)\r
+#define BUTTON_NUM_IS_PRESSED           ((BUTTONS_IN & BUTTON_NUM_PIN) == BUTTON_NUM_PIN)\r
+#define BUTTON_UP_IS_PRESSED            ((BUTTONS_IN & BUTTON_UP_PIN) == BUTTON_UP_PIN)\r
+#define BUTTON_DOWN_IS_PRESSED          ((BUTTONS_IN & BUTTON_DOWN_PIN) == BUTTON_DOWN_PIN)\r
+#define BUTTON_BACKLIGHT_IS_PRESSED     ((BUTTONS_IN & BUTTON_BACKLIGHT_PIN) == \\r
+                                         BUTTON_BACKLIGHT_PIN)\r
+#define NO_BUTTON_IS_PRESSED            ((BUTTONS_IN & ALL_BUTTONS) == 0)\r
+\r
+// Macros for button release detection\r
+#define BUTTON_STAR_IS_RELEASED                 ((BUTTONS_IN & BUTTON_STAR_PIN) == 0)\r
+#define BUTTON_NUM_IS_RELEASED                  ((BUTTONS_IN & BUTTON_NUM_PIN) == 0)\r
+#define BUTTON_UP_IS_RELEASED                   (BUTTONS_IN & BUTTON_UP_PIN) == 0)\r
+#define BUTTON_DOWN_IS_RELEASED                 ((BUTTONS_IN & BUTTON_DOWN_PIN) == 0)\r
+#define BUTTON_BACKLIGHT_IS_RELEASED    ((BUTTONS_IN & BUTTON_BACKLIGHT_PIN) == 0)\r
+\r
+// Button debounce time (msec)\r
+#define BUTTONS_DEBOUNCE_TIME_IN        (5u)\r
+#define BUTTONS_DEBOUNCE_TIME_OUT       (250u)\r
+#define BUTTONS_DEBOUNCE_TIME_LEFT      (50u)\r
+\r
+// Detect if STAR / NUM button is held low continuously\r
+#define LEFT_BUTTON_LONG_TIME           (2u)\r
+\r
+// Backlight time  (sec)\r
+#define BACKLIGHT_TIME_ON                       (3u)\r
+\r
+// Leave set_value() function after some seconds of user inactivity\r
+#define INACTIVITY_TIME                 (30u)\r
+\r
+// Set of button flags\r
+typedef union\r
+{\r
+    struct\r
+    {\r
+        // Manual button events\r
+        u16 star : 1;           // Short STAR button press\r
+        u16 num : 1;            // Short NUM button press\r
+        u16 up : 1;             // Short UP button press\r
+        u16 down : 1;           // Short DOWN button press\r
+        u16 backlight : 1;      // Short BACKLIGHT button press\r
+        u16 star_long : 1;      // Long STAR button press\r
+        u16 num_long : 1;       // Long NUM button press\r
+        u16 star_not_long : 1;  // Between short and long STAR button press\r
+        u16 num_not_long : 1;   // Between short and long NUM button press\r
+    } flag;\r
+    u16 all_flags;              // Shortcut to all display flags (for reset)\r
+} s_button_flags;\r
+extern volatile s_button_flags button;\r
+\r
+struct struct_button\r
+{\r
+    u8 star_timeout;            // this variable is incremented each second if STAR button is still\r
+                                // pressed\r
+    u8 num_timeout;             // this variable is incremented each second if NUM button is still\r
+                                // pressed\r
+    u8 backlight_timeout;       // controls the timeout for the backlight\r
+    u8 backlight_status;        // 1 case backlight is on\r
+    s16 repeats;\r
+};\r
+extern volatile struct struct_button sButton;\r
+\r
+// *************************************************************************************************\r
+// Extern section\r
+extern void button_repeat_on(u16 msec);\r
+extern void button_repeat_off(void);\r
+extern void button_repeat_function(void);\r
+extern void init_buttons(void);\r
+\r
+#endif                          /*PORTS_H_ */\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/driver/radio.c b/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/driver/radio.c
new file mode 100755 (executable)
index 0000000..276d929
--- /dev/null
@@ -0,0 +1,187 @@
+// *************************************************************************************************\r
+//\r
+//      Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//        Redistribution and use in source and binary forms, with or without\r
+//        modification, are permitted provided that the following conditions\r
+//        are met:\r
+//\r
+//          Redistributions of source code must retain the above copyright\r
+//          notice, this list of conditions and the following disclaimer.\r
+//\r
+//          Redistributions in binary form must reproduce the above copyright\r
+//          notice, this list of conditions and the following disclaimer in the\r
+//          documentation and/or other materials provided with the\r
+//          distribution.\r
+//\r
+//          Neither the name of Texas Instruments Incorporated nor the names of\r
+//          its contributors may be used to endorse or promote products derived\r
+//          from this software without specific prior written permission.\r
+//\r
+//        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+// Radio core access functions. Taken from TI reference code for CC430.\r
+// *************************************************************************************************\r
+\r
+// system\r
+#include "project.h"\r
+\r
+// driver\r
+#include "rf1a.h"\r
+#include "timer.h"\r
+\r
+// logic\r
+#include "rfsimpliciti.h"\r
+#include "bluerobin.h"\r
+\r
+// *************************************************************************************************\r
+// Extern section\r
+\r
+// SimpliciTI CC430 radio ISR - located in SimpliciTi library\r
+extern void MRFI_RadioIsr(void);\r
+\r
+// BlueRobin CC430 radio ISR - located in BlueRobin library\r
+extern void BlueRobin_RadioISR_v(void);\r
+\r
+// *************************************************************************************************\r
+// @fn          radio_reset\r
+// @brief       Reset radio core.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void radio_reset(void)\r
+{\r
+    volatile u16 i;\r
+    u8 x;\r
+\r
+    // Reset radio core\r
+    Strobe(RF_SRES);\r
+    // Wait before checking IDLE\r
+    for (i = 0; i < 100; i++) ;\r
+    do\r
+    {\r
+        x = Strobe(RF_SIDLE);\r
+    }\r
+    while ((x & 0x70) != 0x00);\r
+\r
+    // Clear radio error register\r
+    RF1AIFERR = 0;\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          radio_powerdown\r
+// @brief       Put radio to SLEEP mode.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void radio_powerdown(void)\r
+{\r
+    // Chip bug: Radio does not come out of this SLEEP when put to sleep\r
+    // using the SPWD cmd. However, it does wakes up if SXOFF was used to\r
+    // put it to sleep.\r
+\r
+    // Powerdown radio\r
+    Strobe(RF_SIDLE);\r
+    Strobe(RF_SPWD);\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          radio_sxoff\r
+// @brief       Put radio to SLEEP mode (XTAL off only).\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void radio_sxoff(void)\r
+{\r
+    // Chip bug: Radio does not come out of this SLEEP when put to sleep\r
+    // using the SPWD cmd. However, it does wakes up if SXOFF was used to\r
+    // put it to sleep.\r
+\r
+    // Powerdown radio\r
+    Strobe(RF_SIDLE);\r
+    Strobe(RF_SXOFF);\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          open_radio\r
+// @brief       Prepare radio for RF communication.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void open_radio(void)\r
+{\r
+    // Reset radio core\r
+    radio_reset();\r
+\r
+    // Enable radio IRQ\r
+    RF1AIFG &= ~BIT4;           // Clear a pending interrupt\r
+    RF1AIE |= BIT4;             // Enable the interrupt\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          close_radio\r
+// @brief       Shutdown radio for RF communication.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void close_radio(void)\r
+{\r
+    // Disable radio IRQ\r
+    RF1AIFG = 0;\r
+    RF1AIE = 0;\r
+\r
+    // Reset radio core\r
+    radio_reset();\r
+\r
+    // Put radio to sleep\r
+    radio_powerdown();\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          GDOx_ISR\r
+// @brief       GDO0/2 ISR to detect received packet.\r
+//                              In BlueRobin mode:  capture packet end time and decode received\r
+// packet\r
+//                              In SimpliciTI mode: go to SimpliciTI handler\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+#pragma vector=CC1101_VECTOR\r
+__interrupt void radio_ISR(void)\r
+{\r
+    u8 rf1aivec = RF1AIV;\r
+\r
+    // Forward to SimpliciTI interrupt service routine\r
+    if (is_rf())\r
+    {\r
+        MRFI_RadioIsr();\r
+    }\r
+    else                                  // BlueRobin packet end interrupt service routine\r
+    {\r
+        if (rf1aivec == RF1AIV_RFIFG9)\r
+        {\r
+            if ((sBlueRobin.state == BLUEROBIN_SEARCHING) ||\r
+                (sBlueRobin.state == BLUEROBIN_CONNECTED))\r
+            {\r
+                BlueRobin_RadioISR_v();\r
+            }\r
+        }\r
+        else if (rf1aivec == RF1AIV_NONE) // RF1A interface interrupt (error etc.)\r
+        {\r
+            asm ("     nop"); // break here\r
+        }\r
+    }\r
+}\r
+\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/driver/radio.h b/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/driver/radio.h
new file mode 100755 (executable)
index 0000000..f4c1bb9
--- /dev/null
@@ -0,0 +1,48 @@
+// *************************************************************************************************\r
+//\r
+//      Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//        Redistribution and use in source and binary forms, with or without\r
+//        modification, are permitted provided that the following conditions\r
+//        are met:\r
+//\r
+//          Redistributions of source code must retain the above copyright\r
+//          notice, this list of conditions and the following disclaimer.\r
+//\r
+//          Redistributions in binary form must reproduce the above copyright\r
+//          notice, this list of conditions and the following disclaimer in the\r
+//          documentation and/or other materials provided with the\r
+//          distribution.\r
+//\r
+//          Neither the name of Texas Instruments Incorporated nor the names of\r
+//          its contributors may be used to endorse or promote products derived\r
+//          from this software without specific prior written permission.\r
+//\r
+//        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+\r
+#ifndef RADIO_H_\r
+#define RADIO_H_\r
+\r
+extern void radio_reset(void);\r
+extern void radio_powerdown(void);\r
+extern void radio_sxoff(void);\r
+extern void radio_idle(void);\r
+extern void open_radio(void);\r
+extern void close_radio(void);\r
+extern void pmm_set_high_current_mode(void);\r
+extern void pmm_set_low_current_mode(void);\r
+\r
+#endif                          /*RADIO_H_ */\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/driver/rf1a.c b/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/driver/rf1a.c
new file mode 100755 (executable)
index 0000000..9f3b5be
--- /dev/null
@@ -0,0 +1,233 @@
+// *************************************************************************************************\r
+//\r
+// Actual revision: $Revision: $\r
+// Revision label:  $Name: $\r
+// Revision state:  $State: $\r
+//\r
+// *************************************************************************************************\r
+// Radio core access functions. Taken from TI reference code for CC430.\r
+// *************************************************************************************************\r
+\r
+// *************************************************************************************************\r
+// Include section\r
+\r
+// system\r
+#include <project.h>\r
+\r
+// driver\r
+#include "rf1a.h"\r
+\r
+// *************************************************************************************************\r
+// Global section\r
+\r
+// *************************************************************************************************\r
+// Define section\r
+#define st(x)                                           do { x } while (__LINE__ == -1)\r
+#define ENTER_CRITICAL_SECTION(x)       st(x = __get_interrupt_state(); __disable_interrupt(); )\r
+#define EXIT_CRITICAL_SECTION(x)    __set_interrupt_state(x)\r
+\r
+// *************************************************************************************************\r
+// @fn          Strobe\r
+// @brief       Send command to radio.\r
+// @param       unsigned char strobe    Command to radio\r
+// @return      statusByte                              Radio core status\r
+// *************************************************************************************************\r
+unsigned char Strobe(unsigned char strobe)\r
+{\r
+    u8 statusByte = 0;\r
+    u16 int_state, gdo_state;\r
+\r
+    // Check for valid strobe command\r
+    if ((strobe == 0xBD) || ((strobe > RF_SRES) && (strobe < RF_SNOP)))\r
+    {\r
+        ENTER_CRITICAL_SECTION(int_state);\r
+\r
+        // Clear the Status read flag\r
+        RF1AIFCTL1 &= ~(RFSTATIFG);\r
+\r
+        // Wait for radio to be ready for next instruction\r
+        while (!(RF1AIFCTL1 & RFINSTRIFG)) ;\r
+\r
+        // Write the strobe instruction\r
+        if ((strobe > RF_SRES) && (strobe < RF_SNOP))\r
+        {\r
+\r
+            gdo_state = ReadSingleReg(IOCFG2);         // buffer IOCFG2 state\r
+            WriteSingleReg(IOCFG2, 0x29);              // c-ready to GDO2\r
+\r
+            RF1AINSTRB = strobe;\r
+            if ((RF1AIN & 0x04) == 0x04)               // chip at sleep mode\r
+            {\r
+                if ((strobe == RF_SXOFF) || (strobe == RF_SPWD) || (strobe == RF_SWOR))\r
+                {\r
+                }\r
+                else\r
+                {\r
+                    while ((RF1AIN & 0x04) == 0x04) ;  // c-ready ?\r
+                    __delay_cycles(9800);              // Delay for ~810usec at 12MHz CPU clock\r
+                }\r
+            }\r
+            WriteSingleReg(IOCFG2, gdo_state);         // restore IOCFG2 setting\r
+        }\r
+        else                                           // chip active mode\r
+        {\r
+            RF1AINSTRB = strobe;\r
+        }\r
+        statusByte = RF1ASTATB;\r
+        while (!(RF1AIFCTL1 & RFSTATIFG)) ;\r
+        EXIT_CRITICAL_SECTION(int_state);\r
+    }\r
+    return statusByte;\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          ResetRadioCore\r
+// @brief       Software reset radio core.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void ResetRadioCore(void)\r
+{\r
+    Strobe(RF_SRES);            // Reset the Radio Core\r
+    Strobe(RF_SNOP);            // Reset Radio Pointer\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          ReadSingleReg\r
+// @brief       Read byte from register.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+unsigned char ReadSingleReg(unsigned char addr)\r
+{\r
+    unsigned char x;\r
+    u16 int_state;\r
+\r
+    ENTER_CRITICAL_SECTION(int_state);\r
+\r
+    RF1AINSTR1B = (addr | RF_REGRD);\r
+    x = RF1ADOUT1B;\r
+\r
+    EXIT_CRITICAL_SECTION(int_state);\r
+\r
+    return x;\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          WriteSingleReg\r
+// @brief       Write byte to register.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void WriteSingleReg(unsigned char addr, unsigned char value)\r
+{\r
+    volatile unsigned int i;\r
+    u16 int_state;\r
+\r
+    ENTER_CRITICAL_SECTION(int_state);\r
+\r
+    while (!(RF1AIFCTL1 & RFINSTRIFG)) ;           // Wait for the Radio to be ready for the next\r
+                                                   // instruction\r
+\r
+    RF1AINSTRW = ((addr | RF_REGWR) << 8) + value; // Send address + Instruction\r
+    while (!(RFDINIFG & RF1AIFCTL1)) ;\r
+\r
+    i = RF1ADOUTB;                                 // Reset RFDOUTIFG flag which contains status\r
+                                                   // byte\r
+\r
+    EXIT_CRITICAL_SECTION(int_state);\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          ReadBurstReg\r
+// @brief       Read sequence of bytes from register.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void ReadBurstReg(unsigned char addr, unsigned char *buffer, unsigned char count)\r
+{\r
+    unsigned int i;\r
+    u16 int_state;\r
+\r
+    ENTER_CRITICAL_SECTION(int_state);\r
+\r
+    while (!(RF1AIFCTL1 & RFINSTRIFG)) ;     // Wait for the Radio to be ready for next instruction\r
+    RF1AINSTR1B = (addr | RF_REGRD);         // Send address + Instruction\r
+\r
+    for (i = 0; i < (count - 1); i++)\r
+    {\r
+        while (!(RFDOUTIFG & RF1AIFCTL1)) ;  // Wait for the Radio Core to update the RF1ADOUTB reg\r
+        buffer[i] = RF1ADOUT1B;              // Read DOUT from Radio Core + clears RFDOUTIFG\r
+        // Also initiates auo-read for next DOUT byte\r
+    }\r
+    buffer[count - 1] = RF1ADOUT0B;          // Store the last DOUT from Radio Core\r
+\r
+    EXIT_CRITICAL_SECTION(int_state);\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          WriteBurstReg\r
+// @brief       Write sequence of bytes to register.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void WriteBurstReg(unsigned char addr, unsigned char *buffer, unsigned char count)\r
+{\r
+    // Write Burst works wordwise not bytewise - bug known already\r
+    unsigned char i;\r
+    u16 int_state;\r
+\r
+    ENTER_CRITICAL_SECTION(int_state);\r
+\r
+    while (!(RF1AIFCTL1 & RFINSTRIFG)) ;               // Wait for the Radio to be ready for next\r
+                                                       // instruction\r
+    RF1AINSTRW = ((addr | RF_REGWR) << 8) + buffer[0]; // Send address + Instruction\r
+\r
+    for (i = 1; i < count; i++)\r
+    {\r
+        RF1ADINB = buffer[i];                          // Send data\r
+        while (!(RFDINIFG & RF1AIFCTL1)) ;             // Wait for TX to finish\r
+    }\r
+    i = RF1ADOUTB;                                     // Reset RFDOUTIFG flag which contains status\r
+                                                       // byte\r
+\r
+    EXIT_CRITICAL_SECTION(int_state);\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          WritePATable\r
+// @brief       Write data to power table\r
+// @param       unsigned char value             Value to write\r
+// @return      none\r
+// *************************************************************************************************\r
+void WritePATable(unsigned char value)\r
+{\r
+    unsigned char readbackPATableValue = 0;\r
+    u16 int_state;\r
+\r
+    ENTER_CRITICAL_SECTION(int_state);\r
+\r
+    while (readbackPATableValue != value)\r
+    {\r
+        while (!(RF1AIFCTL1 & RFINSTRIFG)) ;\r
+        RF1AINSTRW = 0x7E00 + value; // PA Table write (burst)\r
+\r
+        while (!(RF1AIFCTL1 & RFINSTRIFG)) ;\r
+        RF1AINSTRB = RF_SNOP;        // reset pointer\r
+\r
+        while (!(RF1AIFCTL1 & RFINSTRIFG)) ;\r
+        RF1AINSTRB = 0xFE;           // PA Table read (burst)\r
+\r
+        while (!(RF1AIFCTL1 & RFDINIFG)) ;\r
+        RF1ADINB = 0x00;             //dummy write\r
+\r
+        while (!(RF1AIFCTL1 & RFDOUTIFG)) ;\r
+        readbackPATableValue = RF1ADOUT0B;\r
+\r
+        while (!(RF1AIFCTL1 & RFINSTRIFG)) ;\r
+        RF1AINSTRB = RF_SNOP;\r
+    }\r
+\r
+    EXIT_CRITICAL_SECTION(int_state);\r
+}\r
+\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/driver/rf1a.h b/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/driver/rf1a.h
new file mode 100755 (executable)
index 0000000..f1acd1c
--- /dev/null
@@ -0,0 +1,20 @@
+// *************************************************************************************************\r
+//\r
+// Actual revision: $Revision: $\r
+// Revision label:  $Name: $\r
+// Revision state:  $State: $\r
+//\r
+// *************************************************************************************************\r
+// Radio core access functions. Taken from TI reference code for CC430.\r
+// *************************************************************************************************\r
+\r
+// *************************************************************************************************\r
+// Prototype section\r
+unsigned char Strobe(unsigned char strobe);\r
+unsigned char ReadSingleReg(unsigned char addr);\r
+void WriteSingleReg(unsigned char addr, unsigned char value);\r
+void ReadBurstReg(unsigned char addr, unsigned char *buffer, unsigned char count);\r
+void WriteBurstReg(unsigned char addr, unsigned char *buffer, unsigned char count);\r
+void ResetRadioCore(void);\r
+void WritePATable(unsigned char value);\r
+void WaitForXT2(void);\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/driver/timer.c b/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/driver/timer.c
new file mode 100755 (executable)
index 0000000..8cd2811
--- /dev/null
@@ -0,0 +1,576 @@
+// *************************************************************************************************\r
+//\r
+//      Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//        Redistribution and use in source and binary forms, with or without\r
+//        modification, are permitted provided that the following conditions\r
+//        are met:\r
+//\r
+//          Redistributions of source code must retain the above copyright\r
+//          notice, this list of conditions and the following disclaimer.\r
+//\r
+//          Redistributions in binary form must reproduce the above copyright\r
+//          notice, this list of conditions and the following disclaimer in the\r
+//          documentation and/or other materials provided with the\r
+//          distribution.\r
+//\r
+//          Neither the name of Texas Instruments Incorporated nor the names of\r
+//          its contributors may be used to endorse or promote products derived\r
+//          from this software without specific prior written permission.\r
+//\r
+//        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+// Timer service routines.\r
+// *************************************************************************************************\r
+\r
+// *************************************************************************************************\r
+// Include section\r
+\r
+// system\r
+#include "project.h"\r
+\r
+// driver\r
+#include "timer.h"\r
+#include "ports.h"\r
+#include "buzzer.h"\r
+#include "vti_ps.h"\r
+#include "vti_as.h"\r
+#include "display.h"\r
+\r
+// logic\r
+#include "clock.h"\r
+#include "battery.h"\r
+#include "stopwatch.h"\r
+#include "alarm.h"\r
+#include "altitude.h"\r
+#include "display.h"\r
+#include "rfsimpliciti.h"\r
+#include "simpliciti.h"\r
+#include "acceleration.h"\r
+#include "bluerobin.h"\r
+#include "temperature.h"\r
+\r
+// *************************************************************************************************\r
+// Prototypes section\r
+void Timer0_Init(void);\r
+void Timer0_Stop(void);\r
+void Timer0_A1_Start(void);\r
+void Timer0_A1_Stop(void);\r
+void Timer0_A3_Start(u16 ticks);\r
+void Timer0_A3_Stop(void);\r
+void Timer0_A4_Delay(u16 ticks);\r
+\r
+void (*fptr_Timer0_A3_function)(void);\r
+\r
+// *************************************************************************************************\r
+// Defines section\r
+\r
+// *************************************************************************************************\r
+// Global Variable section\r
+struct timer sTimer;\r
+\r
+// *************************************************************************************************\r
+// Extern section\r
+extern void BRRX_TimerTask_v(void);\r
+extern void to_lpm(void);\r
+\r
+// *************************************************************************************************\r
+// @fn          Timer0_Init\r
+// @brief       Set Timer0 to a period of 1 or 2 sec. IRQ TACCR0 is asserted when timer overflows.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void Timer0_Init(void)\r
+{\r
+    // Set interrupt frequency to 1Hz\r
+    TA0CCR0 = 32768 - 1;\r
+\r
+    // Enable timer interrupt\r
+    TA0CCTL0 |= CCIE;\r
+\r
+    // Clear and start timer now\r
+    // Continuous mode: Count to 0xFFFF and restart from 0 again - 1sec timing will be generated by\r
+    // ISR\r
+    TA0CTL |= TASSEL0 + MC1 + TACLR;\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          Timer0_Start\r
+// @brief       Start Timer0.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void Timer0_Start(void)\r
+{\r
+    // Start Timer0 in continuous mode\r
+    TA0CTL |= MC_2;\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          Timer0_Stop\r
+// @brief       Stop and reset Timer0.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void Timer0_Stop(void)\r
+{\r
+    // Stop Timer0\r
+    TA0CTL &= ~MC_2;\r
+\r
+    // Set Timer0 count register to 0x0000\r
+    TA0R = 0;\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          Timer0_A3_Start\r
+// @brief       Trigger IRQ every "ticks" microseconds\r
+// @param       ticks (1 tick = 1/32768 sec)\r
+// @return      none\r
+// *************************************************************************************************\r
+void Timer0_A3_Start(u16 ticks)\r
+{\r
+    u16 value = 0;\r
+\r
+    // Store timer ticks in global variable\r
+    sTimer.timer0_A3_ticks = ticks;\r
+\r
+    // Delay based on current counter value\r
+    // To make sure this value is correctly read\r
+    while (value != TA0R)\r
+        value = TA0R;\r
+    value += ticks;\r
+\r
+    // Update CCR\r
+    TA0CCR3 = value;\r
+\r
+    // Reset IRQ flag\r
+    TA0CCTL3 &= ~CCIFG;\r
+\r
+    // Enable timer interrupt\r
+    TA0CCTL3 |= CCIE;\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          Timer0_A3_Stop\r
+// @brief       Stop Timer0_A3.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void Timer0_A3_Stop(void)\r
+{\r
+    // Clear timer interrupt\r
+    TA0CCTL3 &= ~CCIE;\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          Timer0_A4_Delay\r
+// @brief       Wait for some microseconds\r
+// @param       ticks (1 tick = 1/32768 sec)\r
+// @return      none\r
+// *************************************************************************************************\r
+void Timer0_A4_Delay(u16 ticks)\r
+{\r
+    u16 value = 0;\r
+\r
+    // Exit immediately if Timer0 not running - otherwise we'll get stuck here\r
+    if ((TA0CTL & (BIT4 | BIT5)) == 0)\r
+        return;\r
+\r
+    // Disable timer interrupt\r
+    TA0CCTL4 &= ~CCIE;\r
+\r
+    // Clear delay_over flag\r
+    sys.flag.delay_over = 0;\r
+\r
+    // Add delay to current timer value\r
+    // To make sure this value is correctly read\r
+    while (value != TA0R)\r
+        value = TA0R;\r
+    value += ticks;\r
+\r
+    // Update CCR\r
+    TA0CCR4 = value;\r
+\r
+    // Reset IRQ flag\r
+    TA0CCTL4 &= ~CCIFG;\r
+\r
+    // Enable timer interrupt\r
+    TA0CCTL4 |= CCIE;\r
+\r
+    // Wait for timer IRQ\r
+    while (1)\r
+    {\r
+        // Delay in LPM\r
+        to_lpm();               // will also set GIE again\r
+\r
+#ifdef USE_WATCHDOG\r
+        // Service watchdog\r
+        WDTCTL = WDTPW + WDTIS__512K + WDTSSEL__ACLK + WDTCNTCL;\r
+#endif\r
+        // Redraw stopwatch display\r
+        if (is_stopwatch())\r
+            display_stopwatch(LINE2, DISPLAY_LINE_UPDATE_PARTIAL);\r
+\r
+        // Check stop condition\r
+        // disable interrupt to prevent flag's change caused by interrupt methods\r
+        __disable_interrupt();\r
+        if (sys.flag.delay_over)\r
+            break;\r
+    }\r
+    __enable_interrupt();\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          TIMER0_A0_ISR\r
+// @brief       IRQ handler for TIMER0_A0 IRQ\r
+//                              Timer0_A0       1/1sec clock tick                       (serviced by\r
+// function TIMER0_A0_ISR)\r
+//                              Timer0_A1\r
+//                                                               (serviced by function\r
+// TIMER0_A1_5_ISR)\r
+//                              Timer0_A2       1/100 sec Stopwatch                     (serviced by\r
+// function TIMER0_A1_5_ISR)\r
+//                              Timer0_A3       Configurable periodic IRQ       (serviced by\r
+// function TIMER0_A1_5_ISR)\r
+//                              Timer0_A4       One-time delay                          (serviced by\r
+// function TIMER0_A1_5_ISR)\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+#pragma vector = TIMER0_A0_VECTOR\r
+__interrupt void TIMER0_A0_ISR(void)\r
+{\r
+    static u8 button_lock_counter = 0;\r
+\r
+    // Disable IE\r
+    TA0CCTL0 &= ~CCIE;\r
+    // Reset IRQ flag\r
+    TA0CCTL0 &= ~CCIFG;\r
+    // Add 1 sec to TACCR0 register (IRQ will be asserted at 0x7FFF and 0xFFFF = 1 sec intervals)\r
+    TA0CCR0 += 32768;\r
+    // Enable IE\r
+    TA0CCTL0 |= CCIE;\r
+\r
+    // Add 1 second to global time\r
+    clock_tick();\r
+\r
+    // Set clock update flag\r
+    display.flag.update_time = 1;\r
+\r
+    // While SimpliciTI stack operates or BlueRobin searches, freeze system state\r
+    if (is_rf() || is_bluerobin_searching())\r
+    {\r
+        // SimpliciTI automatic timeout\r
+        if (sRFsmpl.timeout == 0)\r
+        {\r
+            simpliciti_flag |= SIMPLICITI_TRIGGER_STOP;\r
+        }\r
+        else\r
+        {\r
+            sRFsmpl.timeout--;\r
+        }\r
+\r
+        // switch message after received packet\r
+        if (sRFsmpl.mode == SIMPLICITI_SYNC)\r
+        {\r
+            if (sRFsmpl.display_sync_done == 0)\r
+            {\r
+                display_chars(LCD_SEG_L2_5_0, (u8 *) "  SYNC", SEG_ON);\r
+            }\r
+            else\r
+            {\r
+                sRFsmpl.display_sync_done--;\r
+            }\r
+        }\r
+        // Exit from LPM3 on RETI\r
+        _BIC_SR_IRQ(LPM3_bits);\r
+        return;\r
+    }\r
+\r
+    // -------------------------------------------------------------------\r
+    // Service modules that require 1/min processing\r
+    if (sTime.drawFlag >= 2)\r
+    {\r
+        // Measure battery voltage to keep track of remaining battery life\r
+        request.flag.voltage_measurement = 1;\r
+\r
+        // Check if alarm needs to be turned on\r
+        check_alarm();\r
+    }\r
+\r
+    // -------------------------------------------------------------------\r
+    // Service active modules that require 1/s processing\r
+\r
+    // Generate alarm signal\r
+    if (sAlarm.state == ALARM_ON)\r
+    {\r
+        // Decrement alarm duration counter\r
+        if (sAlarm.duration-- > 0)\r
+        {\r
+            request.flag.buzzer = 1;\r
+        }\r
+        else\r
+        {\r
+            sAlarm.duration = ALARM_ON_DURATION;\r
+            stop_alarm();\r
+        }\r
+    }\r
+\r
+    // Do a temperature measurement each second while menu item is active\r
+    if (is_temp_measurement())\r
+        request.flag.temperature_measurement = 1;\r
+\r
+    // Do a pressure measurement each second while menu item is active\r
+    if (is_altitude_measurement())\r
+    {\r
+        // Countdown altitude measurement timeout while menu item is active\r
+        sAlt.timeout--;\r
+\r
+        // Stop measurement when timeout has elapsed\r
+        if (sAlt.timeout == 0)\r
+        {\r
+            stop_altitude_measurement();\r
+            // Show ---- m/ft\r
+            display_chars(LCD_SEG_L1_3_0, (u8 *) "----", SEG_ON);\r
+            // Clear up/down arrow\r
+            display_symbol(LCD_SYMB_ARROW_UP, SEG_OFF);\r
+            display_symbol(LCD_SYMB_ARROW_DOWN, SEG_OFF);\r
+        }\r
+\r
+        // In case we missed the IRQ due to debouncing, get data now\r
+        if ((PS_INT_IN & PS_INT_PIN) == PS_INT_PIN)\r
+            request.flag.altitude_measurement = 1;\r
+    }\r
+\r
+    // Count down timeout\r
+    if (is_acceleration_measurement())\r
+    {\r
+        // Countdown acceleration measurement timeout\r
+        sAccel.timeout--;\r
+\r
+        // Stop measurement when timeout has elapsed\r
+        if (sAccel.timeout == 0)\r
+        {\r
+            as_stop();\r
+            // Show ----\r
+            display_chars(LCD_SEG_L1_3_0, (u8 *) "----", SEG_ON);\r
+            // Clear up/down arrow\r
+            display_symbol(LCD_SYMB_ARROW_UP, SEG_OFF);\r
+            display_symbol(LCD_SYMB_ARROW_DOWN, SEG_OFF);\r
+            display_symbol(LCD_SEG_L1_DP1, SEG_OFF);\r
+        }\r
+\r
+        // If DRDY is (still) high, request data again\r
+        if ((AS_INT_IN & AS_INT_PIN) == AS_INT_PIN)\r
+            request.flag.acceleration_measurement = 1;\r
+    }\r
+\r
+    // If BlueRobin transmitter is connected, get data from API\r
+    if (is_bluerobin())\r
+        get_bluerobin_data();\r
+\r
+    // If battery is low, decrement display counter\r
+    if (sys.flag.low_battery)\r
+    {\r
+        if (sBatt.lobatt_display-- == 0)\r
+        {\r
+            message.flag.prepare = 1;\r
+            message.flag.type_lobatt = 1;\r
+            sBatt.lobatt_display = BATTERY_LOW_MESSAGE_CYCLE;\r
+        }\r
+    }\r
+\r
+    // If a message has to be displayed, set display flag\r
+    if (message.all_flags)\r
+    {\r
+        if (message.flag.prepare)\r
+        {\r
+            message.flag.prepare = 0;\r
+            message.flag.show = 1;\r
+        }\r
+        else if (message.flag.erase)    // message cycle is over, so erase it\r
+        {\r
+            message.flag.erase = 0;\r
+            display.flag.full_update = 1;\r
+        }\r
+    }\r
+\r
+    // -------------------------------------------------------------------\r
+    // Check idle timeout, set timeout flag\r
+    if (sys.flag.idle_timeout_enabled)\r
+    {\r
+        if (sTime.system_time - sTime.last_activity > INACTIVITY_TIME)\r
+            sys.flag.idle_timeout = 1;  //setFlag(sysFlag_g, SYS_TIMEOUT_IDLE);\r
+    }\r
+\r
+    // -------------------------------------------------------------------\r
+    // Turn the Backlight off after timeout\r
+    if (sButton.backlight_status == 1)\r
+    {\r
+        if (sButton.backlight_timeout > BACKLIGHT_TIME_ON)\r
+        {\r
+            //turn off Backlight\r
+            P2OUT &= ~BUTTON_BACKLIGHT_PIN;\r
+            P2DIR &= ~BUTTON_BACKLIGHT_PIN;\r
+            sButton.backlight_timeout = 0;\r
+            sButton.backlight_status = 0;\r
+        }\r
+        else\r
+        {\r
+            sButton.backlight_timeout++;\r
+        }\r
+    }\r
+\r
+    // -------------------------------------------------------------------\r
+    // Detect continuous button high states\r
+\r
+    // Trying to lock/unlock buttons?\r
+    if (BUTTON_NUM_IS_PRESSED && BUTTON_DOWN_IS_PRESSED)\r
+    {\r
+        if (button_lock_counter++ > LEFT_BUTTON_LONG_TIME)\r
+        {\r
+            // Toggle lock / unlock buttons flag\r
+            sys.flag.lock_buttons = ~sys.flag.lock_buttons;\r
+\r
+            // Show "buttons are locked/unlocked" message synchronously with next second tick\r
+            message.flag.prepare = 1;\r
+            if (sys.flag.lock_buttons)\r
+                message.flag.type_locked = 1;\r
+            else\r
+                message.flag.type_unlocked = 1;\r
+\r
+            // Reset button lock counter\r
+            button_lock_counter = 0;\r
+        }\r
+    }\r
+    else                        // Trying to create a long button press?\r
+    {\r
+        // Reset button lock counter\r
+        button_lock_counter = 0;\r
+\r
+        if (BUTTON_STAR_IS_PRESSED)\r
+        {\r
+            sButton.star_timeout++;\r
+\r
+            // Check if button was held low for some seconds\r
+            if (sButton.star_timeout > LEFT_BUTTON_LONG_TIME)\r
+            {\r
+                button.flag.star_long = 1;\r
+                button.flag.star_not_long = 0;\r
+                sButton.star_timeout = 0;\r
+                // Return interrupt edge to normal value\r
+                BUTTONS_IES &= ~BUTTON_STAR_PIN;\r
+            }\r
+        }\r
+        else                    // there was a button press not long enough\r
+        {\r
+            sButton.star_timeout = 0;\r
+        }\r
+\r
+        if (BUTTON_NUM_IS_PRESSED)\r
+        {\r
+            sButton.num_timeout++;\r
+\r
+            // Check if button was held low for some seconds\r
+            if (sButton.num_timeout > LEFT_BUTTON_LONG_TIME)\r
+            {\r
+                button.flag.num_long = 1;\r
+                button.flag.num_not_long = 0;\r
+                sButton.num_timeout = 0;\r
+                // Return interrupt edge to normal value\r
+                BUTTONS_IES &= ~BUTTON_NUM_PIN;\r
+            }\r
+        }\r
+        else                    // there was a button press not long enough\r
+        {\r
+            sButton.num_timeout = 0;\r
+        }\r
+    }\r
+\r
+    // Exit from LPM3 on RETI\r
+    _BIC_SR_IRQ(LPM3_bits);\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          Timer0_A1_5_ISR\r
+// @brief       IRQ handler for timer IRQ.\r
+//                              Timer0_A0       1/1sec clock tick (serviced by function\r
+// TIMER0_A0_ISR)\r
+//                              Timer0_A1       BlueRobin timer\r
+//                              Timer0_A2       1/100 sec Stopwatch\r
+//                              Timer0_A3       Configurable periodic IRQ (used by button_repeat and\r
+// buzzer)\r
+//                              Timer0_A4       One-time delay\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+#pragma vector = TIMER0_A1_VECTOR\r
+__interrupt void TIMER0_A1_5_ISR(void)\r
+{\r
+    u16 value = 0;\r
+\r
+    switch (TA0IV)\r
+    {\r
+        // Timer0_A1    BlueRobin timer\r
+        case 0x02:             // Timer0_A1 handler\r
+            BRRX_TimerTask_v();\r
+            break;\r
+\r
+        // Timer0_A2    1/1 or 1/100 sec Stopwatch\r
+        case 0x04:             // Timer0_A2 handler\r
+            // Disable IE\r
+            TA0CCTL2 &= ~CCIE;\r
+            // Reset IRQ flag\r
+            TA0CCTL2 &= ~CCIFG;\r
+            // Load CCR register with next capture point\r
+            update_stopwatch_timer();\r
+            // Enable timer interrupt\r
+            TA0CCTL2 |= CCIE;\r
+            // Increase stopwatch counter\r
+            stopwatch_tick();\r
+            break;\r
+\r
+        // Timer0_A3    Configurable periodic IRQ (used by button_repeat and buzzer)\r
+        case 0x06:             // Disable IE\r
+            TA0CCTL3 &= ~CCIE;\r
+            // Reset IRQ flag\r
+            TA0CCTL3 &= ~CCIFG;\r
+            // Store new value in CCR\r
+            // To make sure this value is correctly read\r
+            while (value != TA0R)\r
+                value = TA0R;\r
+            value += sTimer.timer0_A3_ticks;\r
+            // Load CCR register with next capture point\r
+            TA0CCR3 = value;\r
+            // Enable timer interrupt\r
+            TA0CCTL3 |= CCIE;\r
+            // Call function handler\r
+            fptr_Timer0_A3_function();\r
+            break;\r
+\r
+        // Timer0_A4    One-time delay\r
+        case 0x08:             // Disable IE\r
+            TA0CCTL4 &= ~CCIE;\r
+            // Reset IRQ flag\r
+            TA0CCTL4 &= ~CCIFG;\r
+            // Set delay over flag\r
+            sys.flag.delay_over = 1;\r
+            break;\r
+    }\r
+\r
+    // Exit from LPM3 on RETI\r
+    _BIC_SR_IRQ(LPM3_bits);\r
+}\r
+\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/driver/timer.h b/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/driver/timer.h
new file mode 100755 (executable)
index 0000000..89e0e53
--- /dev/null
@@ -0,0 +1,71 @@
+// *************************************************************************************************\r
+//\r
+//      Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//        Redistribution and use in source and binary forms, with or without\r
+//        modification, are permitted provided that the following conditions\r
+//        are met:\r
+//\r
+//          Redistributions of source code must retain the above copyright\r
+//          notice, this list of conditions and the following disclaimer.\r
+//\r
+//          Redistributions in binary form must reproduce the above copyright\r
+//          notice, this list of conditions and the following disclaimer in the\r
+//          documentation and/or other materials provided with the\r
+//          distribution.\r
+//\r
+//          Neither the name of Texas Instruments Incorporated nor the names of\r
+//          its contributors may be used to endorse or promote products derived\r
+//          from this software without specific prior written permission.\r
+//\r
+//        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+\r
+#ifndef TIMER_H_\r
+#define TIMER_H_\r
+\r
+// *************************************************************************************************\r
+// Include section\r
+\r
+// *************************************************************************************************\r
+// Prototypes section\r
+extern void Timer0_Init(void);\r
+extern void Timer0_Start(void);\r
+extern void Timer0_Stop(void);\r
+extern void Timer0_A3_Start(u16 ticks);\r
+extern void Timer0_A3_Stop(void);\r
+extern void Timer0_A4_Delay(u16 ticks);\r
+\r
+extern void (*fptr_Timer0_A3_function)(void);\r
+\r
+// *************************************************************************************************\r
+// Defines section\r
+struct timer\r
+{\r
+    // Timer0_A3 periodic delay\r
+    u16 timer0_A3_ticks;\r
+};\r
+extern struct timer sTimer;\r
+\r
+// Trigger reset when all buttons are pressed\r
+#define BUTTON_RESET_SEC                (3u)\r
+\r
+// *************************************************************************************************\r
+// Global Variable section\r
+\r
+// *************************************************************************************************\r
+// Extern section\r
+\r
+#endif                          /*TIMER_H_ */\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/driver/vti_as.c b/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/driver/vti_as.c
new file mode 100755 (executable)
index 0000000..bede10d
--- /dev/null
@@ -0,0 +1,360 @@
+// *************************************************************************************************\r
+//\r
+//      Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//        Redistribution and use in source and binary forms, with or without\r
+//        modification, are permitted provided that the following conditions\r
+//        are met:\r
+//\r
+//          Redistributions of source code must retain the above copyright\r
+//          notice, this list of conditions and the following disclaimer.\r
+//\r
+//          Redistributions in binary form must reproduce the above copyright\r
+//          notice, this list of conditions and the following disclaimer in the\r
+//          documentation and/or other materials provided with the\r
+//          distribution.\r
+//\r
+//          Neither the name of Texas Instruments Incorporated nor the names of\r
+//          its contributors may be used to endorse or promote products derived\r
+//          from this software without specific prior written permission.\r
+//\r
+//        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+// VTI CMA3000-D0x acceleration sensor driver functions\r
+// *************************************************************************************************\r
+\r
+// *************************************************************************************************\r
+// Include section\r
+\r
+// system\r
+#include "project.h"\r
+\r
+// logic\r
+#include "simpliciti.h"\r
+\r
+// driver\r
+#include "vti_as.h"\r
+#include "timer.h"\r
+#include "display.h"\r
+\r
+// *************************************************************************************************\r
+// Prototypes section\r
+void as_start(void);\r
+void as_stop(void);\r
+u8 as_read_register(u8 bAddress);\r
+u8 as_write_register(u8 bAddress, u8 bData);\r
+\r
+// *************************************************************************************************\r
+// Defines section\r
+\r
+// =================================================================================================\r
+// CMA3000-D0x acceleration sensor configuration\r
+// =================================================================================================\r
+// DCO frequency division factor determining speed of the acceleration sensor SPI interface\r
+// Speed in Hz = 12MHz / AS_BR_DIVIDER (max. 500kHz)\r
+#define AS_BR_DIVIDER        (30u)\r
+\r
+// Acceleration measurement range in g\r
+// Valid ranges are: 2 and 8\r
+#define AS_RANGE             (2u)\r
+\r
+// Sample rate for acceleration values in Hz\r
+// Valid sample rates for 2g range are:     100, 400\r
+// Valid sample rates for 8g range are: 40, 100, 400\r
+#define AS_SAMPLE_RATE       (100u)\r
+\r
+// *************************************************************************************************\r
+// Global Variable section\r
+\r
+// Global flag for proper acceleration sensor operation\r
+u8 as_ok;\r
+\r
+// *************************************************************************************************\r
+// Extern section\r
+\r
+// *************************************************************************************************\r
+// @fn          as_init\r
+// @brief       Setup acceleration sensor connection, do not power up yet\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void as_init(void)\r
+{\r
+#ifdef AS_DISCONNECT\r
+    // Deactivate connection to acceleration sensor\r
+    AS_PWR_OUT &= ~AS_PWR_PIN;                             // Power off\r
+    AS_INT_OUT &= ~AS_INT_PIN;                             // Pin to low to avoid floating pins\r
+    AS_SPI_OUT &= ~(AS_SDO_PIN + AS_SDI_PIN + AS_SCK_PIN); // Pin to low to avoid floating pins\r
+    AS_CSN_OUT &= ~AS_CSN_PIN;                             // Pin to low to avoid floating pins\r
+    AS_INT_DIR |= AS_INT_PIN;                              // Pin to output to avoid floating pins\r
+    AS_SPI_DIR |= AS_SDO_PIN + AS_SDI_PIN + AS_SCK_PIN;    // Pin to output to avoid floating pins\r
+    AS_CSN_DIR |= AS_CSN_PIN;                              // Pin to output to avoid floating pins\r
+    AS_PWR_DIR |= AS_PWR_PIN;                              // Power pin to output direction\r
+#else\r
+    AS_INT_DIR &= ~AS_INT_PIN;                             // Input\r
+    AS_SPI_DIR &= ~AS_SDI_PIN;                             // Input\r
+    AS_SPI_DIR |= AS_SDO_PIN + AS_SCK_PIN;                 // Output\r
+    AS_SPI_SEL |= AS_SDO_PIN + AS_SDI_PIN + AS_SCK_PIN;    // Port pins to SDO, SDI and SCK function\r
+    AS_CSN_OUT |= AS_CSN_PIN;                              // CSN=1\r
+    AS_CSN_DIR |= AS_CSN_PIN;                              //\r
+    AS_PWR_OUT |= AS_PWR_PIN;                              // VDD=1\r
+    AS_PWR_DIR |= AS_PWR_PIN;                              //\r
+#endif\r
+\r
+    // Reset global sensor flag\r
+    as_ok = 1;\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          as_start\r
+// @brief       Power-up and initialize acceleration sensor\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void as_start(void)\r
+{\r
+    volatile u16 Counter_u16;\r
+    u8 bConfig;                                         //, bStatus;\r
+\r
+    // Initialize SPI interface to acceleration sensor\r
+    AS_SPI_CTL0 |= UCSYNC | UCMST | UCMSB               // SPI master, 8 data bits,  MSB first,\r
+        | UCCKPH;                                       //  clock idle low, data output on falling\r
+                                                        // edge\r
+    AS_SPI_CTL1 |= UCSSEL1;                             // SMCLK as clock source\r
+    AS_SPI_BR0 = AS_BR_DIVIDER;                         // Low byte of division factor for baud rate\r
+    AS_SPI_BR1 = 0x00;                                  // High byte of division factor for baud\r
+                                                        // rate\r
+    AS_SPI_CTL1 &= ~UCSWRST;                            // Start SPI hardware\r
+\r
+    // Initialize interrupt pin for data read out from acceleration sensor\r
+    AS_INT_IES &= ~AS_INT_PIN;                          // Interrupt on rising edge\r
+\r
+#ifdef AS_DISCONNECT\r
+    // Enable interrupt\r
+    AS_INT_DIR &= ~AS_INT_PIN;                          // Switch INT pin to input\r
+    AS_SPI_DIR &= ~AS_SDI_PIN;                          // Switch SDI pin to input\r
+    AS_SPI_REN |= AS_SDI_PIN;                           // Pulldown on SDI pin\r
+    AS_SPI_SEL |= AS_SDO_PIN + AS_SDI_PIN + AS_SCK_PIN; // Port pins to SDO, SDI and SCK function\r
+    AS_CSN_OUT |= AS_CSN_PIN;                           // Deselect acceleration sensor\r
+    AS_PWR_OUT |= AS_PWR_PIN;                           // Power on active high\r
+#endif\r
+\r
+    // Delay of >5ms required between switching on power and configuring sensor\r
+    Timer0_A4_Delay(CONV_MS_TO_TICKS(10));\r
+\r
+    // Initialize interrupt pin for data read out from acceleration sensor\r
+    AS_INT_IFG &= ~AS_INT_PIN;                          // Reset flag\r
+    AS_INT_IE |= AS_INT_PIN;                            // Enable interrupt\r
+\r
+    // Configure sensor and start to sample data\r
+#if (AS_RANGE == 2)\r
+    bConfig = 0x80;\r
+#    if (AS_SAMPLE_RATE == 100)\r
+    bConfig |= 0x02;\r
+#    elif (AS_SAMPLE_RATE == 400)\r
+    bConfig |= 0x04;\r
+#    else\r
+#        error "Sample rate not supported"\r
+#    endif\r
+#elif (AS_RANGE == 8)\r
+    bConfig = 0x00;\r
+#    if (AS_SAMPLE_RATE == 40)\r
+    bConfig |= 0x06;\r
+#    elif (AS_SAMPLE_RATE == 100)\r
+    bConfig |= 0x02;\r
+#    elif (AS_SAMPLE_RATE == 400)\r
+    bConfig |= 0x04;\r
+#    else\r
+#        error "Sample rate not supported"\r
+#    endif\r
+#else\r
+#    error "Measurement range not supported"\r
+#endif\r
+\r
+    // Reset sensor\r
+    as_write_register(0x04, 0x02);\r
+    as_write_register(0x04, 0x0A);\r
+    as_write_register(0x04, 0x04);\r
+\r
+    // Wait 5 ms before starting sensor output\r
+    Timer0_A4_Delay(CONV_MS_TO_TICKS(5));\r
+\r
+    // Set 2g measurement range, start to output data with 100Hz rate\r
+    as_write_register(0x02, bConfig);\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          as_stop\r
+// @brief       Power down acceleration sensor\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void as_stop(void)\r
+{\r
+    // Disable interrupt\r
+    AS_INT_IE &= ~AS_INT_PIN;                              // Disable interrupt\r
+\r
+#ifdef AS_DISCONNECT\r
+    // Power-down sensor\r
+    AS_PWR_OUT &= ~AS_PWR_PIN;                             // Power off\r
+    AS_INT_OUT &= ~AS_INT_PIN;                             // Pin to low to avoid floating pins\r
+    AS_SPI_OUT &= ~(AS_SDO_PIN + AS_SDI_PIN + AS_SCK_PIN); // Pins to low to avoid floating pins\r
+    AS_SPI_SEL &= ~(AS_SDO_PIN + AS_SDI_PIN + AS_SCK_PIN); // Port pins to I/O function\r
+    AS_CSN_OUT &= ~AS_CSN_PIN;                             // Pin to low to avoid floating pins\r
+    AS_INT_DIR |= AS_INT_PIN;                              // Pin to output to avoid floating pins\r
+    AS_SPI_DIR |= AS_SDO_PIN + AS_SDI_PIN + AS_SCK_PIN;    // Pins to output to avoid floating pins\r
+    AS_CSN_DIR |= AS_CSN_PIN;                              // Pin to output to avoid floating pins\r
+#else\r
+    // Reset sensor -> sensor to powerdown\r
+    as_write_register(0x04, 0x02);\r
+    as_write_register(0x04, 0x0A);\r
+    as_write_register(0x04, 0x04);\r
+#endif\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          as_read_register\r
+// @brief       Read a byte from the acceleration sensor\r
+// @param       u8 bAddress                     Register address\r
+// @return      u8 bResult                      Register content\r
+//                                                                      If the returned value is 0,\r
+// there was an error.\r
+// *************************************************************************************************\r
+u8 as_read_register(u8 bAddress)\r
+{\r
+    u8 bResult;\r
+    u16 timeout;\r
+\r
+    // Exit function if an error was detected previously\r
+    if (!as_ok)\r
+        return (0);\r
+\r
+    bAddress <<= 2;                                         // Address to be shifted left by 2 and\r
+                                                            // RW bit to be reset\r
+\r
+    AS_SPI_REN &= ~AS_SDI_PIN;                              // Pulldown on SDI pin not required\r
+    AS_CSN_OUT &= ~AS_CSN_PIN;                              // Select acceleration sensor\r
+\r
+    bResult = AS_RX_BUFFER;                                 // Read RX buffer just to clear\r
+                                                            // interrupt flag\r
+\r
+    AS_TX_BUFFER = bAddress;                                // Write address to TX buffer\r
+\r
+    timeout = SPI_TIMEOUT;\r
+    while (!(AS_IRQ_REG & AS_RX_IFG) && (--timeout > 0)) ;  // Wait until new data was written into\r
+                                                            // RX buffer\r
+    if (timeout == 0)\r
+    {\r
+        as_ok = 0;\r
+        return (0);\r
+    }\r
+    bResult = AS_RX_BUFFER;                                 // Read RX buffer just to clear\r
+                                                            // interrupt flag\r
+\r
+    AS_TX_BUFFER = 0;                                       // Write dummy data to TX buffer\r
+\r
+    timeout = SPI_TIMEOUT;\r
+    while (!(AS_IRQ_REG & AS_RX_IFG) && (--timeout > 0)) ;  // Wait until new data was written into\r
+                                                            // RX buffer\r
+    if (timeout == 0)\r
+    {\r
+        as_ok = 0;\r
+        return (0);\r
+    }\r
+    bResult = AS_RX_BUFFER;                                 // Read RX buffer\r
+\r
+    AS_CSN_OUT |= AS_CSN_PIN;                               // Deselect acceleration sensor\r
+    AS_SPI_REN |= AS_SDI_PIN;                               // Pulldown on SDI pin required again\r
+\r
+    // Return new data from RX buffer\r
+    return bResult;\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          as_write_register\r
+// @brief               Write a byte to the acceleration sensor\r
+// @param       u8 bAddress                     Register address\r
+//                              u8 bData                        Data to write\r
+// @return      u8 0 or bResult         Register content.\r
+//                                                                      If the returned value is 0,\r
+// there was an error.\r
+// *************************************************************************************************\r
+u8 as_write_register(u8 bAddress, u8 bData)\r
+{\r
+    u8 bResult;\r
+    u16 timeout;\r
+\r
+    // Exit function if an error was detected previously\r
+    if (!as_ok)\r
+        return (0);\r
+\r
+    bAddress <<= 2;                                         // Address to be shifted left by 1\r
+    bAddress |= BIT1;                                       // RW bit to be set\r
+\r
+    AS_SPI_REN &= ~AS_SDI_PIN;                              // Pulldown on SDI pin not required\r
+    AS_CSN_OUT &= ~AS_CSN_PIN;                              // Select acceleration sensor\r
+\r
+    bResult = AS_RX_BUFFER;                                 // Read RX buffer just to clear\r
+                                                            // interrupt flag\r
+\r
+    AS_TX_BUFFER = bAddress;                                // Write address to TX buffer\r
+\r
+    timeout = SPI_TIMEOUT;\r
+    while (!(AS_IRQ_REG & AS_RX_IFG) && (--timeout > 0)) ;  // Wait until new data was written into\r
+                                                            // RX buffer\r
+    if (timeout == 0)\r
+    {\r
+        as_ok = 0;\r
+        return (0);\r
+    }\r
+    bResult = AS_RX_BUFFER;                                 // Read RX buffer just to clear\r
+                                                            // interrupt flag\r
+\r
+    AS_TX_BUFFER = bData;                                   // Write data to TX buffer\r
+\r
+    timeout = SPI_TIMEOUT;\r
+    while (!(AS_IRQ_REG & AS_RX_IFG) && (--timeout > 0)) ;  // Wait until new data was written into\r
+                                                            // RX buffer\r
+    if (timeout == 0)\r
+    {\r
+        as_ok = 0;\r
+        return (0);\r
+    }\r
+    bResult = AS_RX_BUFFER;                                 // Read RX buffer\r
+\r
+    AS_CSN_OUT |= AS_CSN_PIN;                               // Deselect acceleration sensor\r
+    AS_SPI_REN |= AS_SDI_PIN;                               // Pulldown on SDI pin required again\r
+\r
+    return bResult;\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          as_get_data\r
+// @brief       Service routine to read acceleration values.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void as_get_data(u8 * data)\r
+{\r
+    // Exit if sensor is not powered up\r
+    if ((AS_PWR_OUT & AS_PWR_PIN) != AS_PWR_PIN)\r
+        return;\r
+\r
+    // Store X/Y/Z acceleration data in buffer\r
+    *(data + 0) = as_read_register(0x06);\r
+    *(data + 1) = as_read_register(0x07);\r
+    *(data + 2) = as_read_register(0x08);\r
+}\r
+\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/driver/vti_as.h b/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/driver/vti_as.h
new file mode 100755 (executable)
index 0000000..358a948
--- /dev/null
@@ -0,0 +1,106 @@
+// *************************************************************************************************\r
+//\r
+//      Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//        Redistribution and use in source and binary forms, with or without\r
+//        modification, are permitted provided that the following conditions\r
+//        are met:\r
+//\r
+//          Redistributions of source code must retain the above copyright\r
+//          notice, this list of conditions and the following disclaimer.\r
+//\r
+//          Redistributions in binary form must reproduce the above copyright\r
+//          notice, this list of conditions and the following disclaimer in the\r
+//          documentation and/or other materials provided with the\r
+//          distribution.\r
+//\r
+//          Neither the name of Texas Instruments Incorporated nor the names of\r
+//          its contributors may be used to endorse or promote products derived\r
+//          from this software without specific prior written permission.\r
+//\r
+//        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+\r
+#ifndef VTI_AS_H_\r
+#define VTI_AS_H_\r
+\r
+// *************************************************************************************************\r
+// Include section\r
+\r
+// *************************************************************************************************\r
+// Prototypes section\r
+extern void as_init(void);\r
+extern void as_start(void);\r
+extern void as_stop(void);\r
+extern u8 as_read_register(u8 bAddress);\r
+extern u8 as_write_register(u8 bAddress, u8 bData);\r
+extern void as_get_data(u8 * data);\r
+\r
+// *************************************************************************************************\r
+// Defines section\r
+\r
+// Disconnect power supply for acceleration sensor when not used\r
+#define AS_DISCONNECT\r
+\r
+// Port and pin resource for SPI interface to acceleration sensor\r
+// SDO=MOSI=P1.6, SDI=MISO=P1.5, SCK=P1.7\r
+#define AS_SPI_IN            (P1IN)\r
+#define AS_SPI_OUT           (P1OUT)\r
+#define AS_SPI_DIR           (P1DIR)\r
+#define AS_SPI_SEL           (P1SEL)\r
+#define AS_SPI_REN           (P1REN)\r
+#define AS_SDO_PIN           (BIT6)\r
+#define AS_SDI_PIN           (BIT5)\r
+#define AS_SCK_PIN           (BIT7)\r
+\r
+// CSN=PJ.1\r
+#define AS_CSN_OUT                       (PJOUT)\r
+#define AS_CSN_DIR                       (PJDIR)\r
+#define AS_CSN_PIN           (BIT1)\r
+\r
+#define AS_TX_BUFFER         (UCA0TXBUF)\r
+#define AS_RX_BUFFER         (UCA0RXBUF)\r
+#define AS_TX_IFG            (UCTXIFG)\r
+#define AS_RX_IFG            (UCRXIFG)\r
+#define AS_IRQ_REG           (UCA0IFG)\r
+#define AS_SPI_CTL0          (UCA0CTL0)\r
+#define AS_SPI_CTL1          (UCA0CTL1)\r
+#define AS_SPI_BR0           (UCA0BR0)\r
+#define AS_SPI_BR1           (UCA0BR1)\r
+\r
+// Port and pin resource for power-up of acceleration sensor, VDD=PJ.0\r
+#define AS_PWR_OUT           (PJOUT)\r
+#define AS_PWR_DIR           (PJDIR)\r
+#define AS_PWR_PIN           (BIT0)\r
+\r
+// Port, pin and interrupt resource for interrupt from acceleration sensor, CMA_INT=P2.5\r
+#define AS_INT_IN            (P2IN)\r
+#define AS_INT_OUT           (P2OUT)\r
+#define AS_INT_DIR           (P2DIR)\r
+#define AS_INT_IE            (P2IE)\r
+#define AS_INT_IES           (P2IES)\r
+#define AS_INT_IFG           (P2IFG)\r
+#define AS_INT_PIN           (BIT5)\r
+\r
+// SPI timeout to detect sensor failure\r
+#define SPI_TIMEOUT                      (1000u)\r
+\r
+// *************************************************************************************************\r
+// Global Variable section\r
+\r
+// *************************************************************************************************\r
+// Extern section\r
+\r
+#endif                          /*VTI_AS_H_ */\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/driver/vti_ps.c b/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/driver/vti_ps.c
new file mode 100755 (executable)
index 0000000..645f17e
--- /dev/null
@@ -0,0 +1,559 @@
+// *************************************************************************************************\r
+//\r
+//      Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//        Redistribution and use in source and binary forms, with or without\r
+//        modification, are permitted provided that the following conditions\r
+//        are met:\r
+//\r
+//          Redistributions of source code must retain the above copyright\r
+//          notice, this list of conditions and the following disclaimer.\r
+//\r
+//          Redistributions in binary form must reproduce the above copyright\r
+//          notice, this list of conditions and the following disclaimer in the\r
+//          documentation and/or other materials provided with the\r
+//          distribution.\r
+//\r
+//          Neither the name of Texas Instruments Incorporated nor the names of\r
+//          its contributors may be used to endorse or promote products derived\r
+//          from this software without specific prior written permission.\r
+//\r
+//        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+// VTI SCP1000-D0x pressure sensor driver functions\r
+// *************************************************************************************************\r
+\r
+// *************************************************************************************************\r
+// Include section\r
+\r
+// system\r
+#include "project.h"\r
+\r
+// driver\r
+#include "vti_ps.h"\r
+#include "timer.h"\r
+\r
+// *************************************************************************************************\r
+// Prototypes section\r
+u16 ps_read_register(u8 address, u8 mode);\r
+u8 ps_write_register(u8 address, u8 data);\r
+u8 ps_twi_read(u8 ack);\r
+void twi_delay(void);\r
+\r
+// *************************************************************************************************\r
+// Defines section\r
+\r
+// *************************************************************************************************\r
+// Global Variable section\r
+\r
+// VTI pressure (hPa) to altitude (m) conversion tables\r
+const s16 h0[17] =\r
+{ -153, 0, 111, 540, 989, 1457, 1949, 2466, 3012, 3591, 4206, 4865, 5574, 6344, 7185, 8117, 9164 };\r
+const u16 p0[17] =\r
+{ 1031, 1013, 1000, 950, 900, 850, 800, 750, 700, 650, 600, 550, 500, 450, 400, 350, 300 };\r
+\r
+float p[17];\r
+\r
+// Global flag for proper pressure sensor operation\r
+u8 ps_ok;\r
+\r
+// *************************************************************************************************\r
+// Extern section\r
+\r
+// *************************************************************************************************\r
+// @fn          ps_init\r
+// @brief       Init pressure sensor I/O\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void ps_init(void)\r
+{\r
+    volatile u8 success, status, eeprom, timeout;\r
+\r
+    PS_INT_DIR &= ~PS_INT_PIN;             // DRDY is input\r
+    PS_INT_IES &= ~PS_INT_PIN;             // Interrupt on DRDY rising edge\r
+    PS_TWI_OUT |= PS_SCL_PIN + PS_SDA_PIN; // SCL and SDA are outputs by default\r
+    PS_TWI_DIR |= PS_SCL_PIN + PS_SDA_PIN; // SCL and SDA are outputs by default\r
+\r
+    // Reset global ps_ok flag\r
+    ps_ok = 0;\r
+\r
+    // 100msec delay to allow VDD stabilisation\r
+    Timer0_A4_Delay(CONV_MS_TO_TICKS(100));\r
+\r
+    // Reset pressure sensor -> powerdown sensor\r
+    success = ps_write_register(0x06, 0x01);\r
+\r
+    // 100msec delay\r
+    Timer0_A4_Delay(CONV_MS_TO_TICKS(100));\r
+\r
+    // Check if STATUS register BIT0 is cleared\r
+    status = ps_read_register(0x07, PS_TWI_8BIT_ACCESS);\r
+    if (((status & BIT0) == 0) && (status != 0))\r
+    {\r
+        // Check EEPROM checksum in DATARD8 register\r
+        eeprom = ps_read_register(0x7F, PS_TWI_8BIT_ACCESS);\r
+        if (eeprom == 0x01)\r
+            ps_ok = 1;\r
+        else\r
+            ps_ok = 0;\r
+    }\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          ps_start\r
+// @brief       Init pressure sensor registers and start sampling\r
+// @param       none\r
+// @return      u8              1=Sensor started, 0=Sensor did not start\r
+// *************************************************************************************************\r
+void ps_start(void)\r
+{\r
+    // Start sampling data in ultra low power mode\r
+    ps_write_register(0x03, 0x0B);\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          ps_stop\r
+// @brief       Power down pressure sensor\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void ps_stop(void)\r
+{\r
+    // Put sensor to standby\r
+    ps_write_register(0x03, 0x00);\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          ps_twi_sda\r
+// @brief       Control SDA line\r
+// @param       u8 condition            PS_TWI_SEND_START, PS_TWI_SEND_RESTART, PS_TWI_SEND_STOP\r
+//                                                                      PS_TWI_CHECK_ACK\r
+// @return      u8                                      1=ACK, 0=NACK\r
+// *************************************************************************************************\r
+u8 ps_twi_sda(u8 condition)\r
+{\r
+    u8 sda = 0;\r
+\r
+    if (condition == PS_TWI_SEND_START)\r
+    {\r
+        PS_TWI_SDA_OUT;         // SDA is output\r
+        PS_TWI_SCL_HI;\r
+        twi_delay();\r
+        PS_TWI_SDA_LO;\r
+        twi_delay();\r
+        PS_TWI_SCL_LO;          // SCL 1-0 transition while SDA=0\r
+        twi_delay();\r
+    }\r
+    else if (condition == PS_TWI_SEND_RESTART)\r
+    {\r
+        PS_TWI_SDA_OUT;         // SDA is output\r
+        PS_TWI_SCL_LO;\r
+        PS_TWI_SDA_HI;\r
+        twi_delay();\r
+        PS_TWI_SCL_HI;\r
+        twi_delay();\r
+        PS_TWI_SDA_LO;\r
+        twi_delay();\r
+        PS_TWI_SCL_LO;\r
+        twi_delay();\r
+    }\r
+    else if (condition == PS_TWI_SEND_STOP)\r
+    {\r
+        PS_TWI_SDA_OUT;         // SDA is output\r
+        PS_TWI_SDA_LO;\r
+        twi_delay();\r
+        PS_TWI_SCL_LO;\r
+        twi_delay();\r
+        PS_TWI_SCL_HI;\r
+        twi_delay();\r
+        PS_TWI_SDA_HI;          // SDA 0-1 transition while SCL=1\r
+        twi_delay();\r
+    }\r
+    else if (condition == PS_TWI_CHECK_ACK)\r
+    {\r
+        PS_TWI_SDA_IN;          // SDA is input\r
+        PS_TWI_SCL_LO;\r
+        twi_delay();\r
+        PS_TWI_SCL_HI;\r
+        twi_delay();\r
+        sda = PS_TWI_IN & PS_SDA_PIN;\r
+        PS_TWI_SCL_LO;\r
+    }\r
+\r
+    // Return value will only be evaluated when checking device ACK\r
+    return (sda == 0);\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          twi_delay\r
+// @brief       Delay between TWI signal edges.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void twi_delay(void)\r
+{\r
+    asm ("     nop");\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          ps_twi_write\r
+// @brief       Clock out bits through SDA.\r
+// @param       u8 data         Byte to send\r
+// @return      none\r
+// *************************************************************************************************\r
+void ps_twi_write(u8 data)\r
+{\r
+    u8 i, mask;\r
+\r
+    // Set mask byte to 10000000b\r
+    mask = BIT0 << 7;\r
+\r
+    PS_TWI_SDA_OUT;             // SDA is output\r
+\r
+    for (i = 8; i > 0; i--)\r
+    {\r
+        PS_TWI_SCL_LO;          // SCL=0\r
+        if ((data & mask) == mask)\r
+        {\r
+            PS_TWI_SDA_HI;      // SDA=1\r
+        }\r
+        else\r
+        {\r
+            PS_TWI_SDA_LO;      // SDA=0\r
+        }\r
+        mask = mask >> 1;\r
+        twi_delay();\r
+        PS_TWI_SCL_HI;          // SCL=1\r
+        twi_delay();\r
+    }\r
+\r
+    PS_TWI_SCL_LO;              // SCL=0\r
+    PS_TWI_SDA_IN;              // SDA is input\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          ps_twi_read\r
+// @brief       Read bits from SDA\r
+// @param       u8 ack          1=Send ACK after read, 0=Send NACK after read\r
+// @return      u8                      Bits read\r
+// *************************************************************************************************\r
+u8 ps_twi_read(u8 ack)\r
+{\r
+    u8 i;\r
+    u8 data = 0;\r
+\r
+    PS_TWI_SDA_IN;              // SDA is input\r
+\r
+    for (i = 0; i < 8; i++)\r
+    {\r
+        PS_TWI_SCL_LO;          // SCL=0\r
+        twi_delay();\r
+        PS_TWI_SCL_HI;          // SCL=0\r
+        twi_delay();\r
+\r
+        // Shift captured bits to left\r
+        data = data << 1;\r
+\r
+        // Capture new bit\r
+        if ((PS_TWI_IN & PS_SDA_PIN) == PS_SDA_PIN)\r
+            data |= BIT0;\r
+    }\r
+\r
+    PS_TWI_SDA_OUT;             // SDA is output\r
+\r
+    // 1 aditional clock phase to generate master ACK\r
+    PS_TWI_SCL_LO;              // SCL=0\r
+    if (ack == 1)\r
+        PS_TWI_SDA_LO           // Send ack -> continue read\r
+        else\r
+            PS_TWI_SDA_HI       // Send nack -> stop read\r
+            twi_delay();\r
+    PS_TWI_SCL_HI;              // SCL=0\r
+    twi_delay();\r
+    PS_TWI_SCL_LO;\r
+\r
+    return (data);\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          as_write_register\r
+// @brief               Write a byte to the pressure sensor\r
+// @param       u8 address                      Register address\r
+//                              u8 data                 Data to write\r
+// @return      u8\r
+// *************************************************************************************************\r
+u8 ps_write_register(u8 address, u8 data)\r
+{\r
+    volatile u8 success;\r
+\r
+    ps_twi_sda(PS_TWI_SEND_START);            // Generate start condition\r
+\r
+    ps_twi_write((0x11 << 1) | PS_TWI_WRITE); // Send 7bit device address 0x11 + write bit '0'\r
+    success = ps_twi_sda(PS_TWI_CHECK_ACK);   // Check ACK from device\r
+    if (!success)\r
+        return (0);\r
+\r
+    ps_twi_write(address);                    // Send 8bit register address\r
+    success = ps_twi_sda(PS_TWI_CHECK_ACK);   // Check ACK from device\r
+    if (!success)\r
+        return (0);\r
+\r
+    ps_twi_write(data);                       // Send 8bit data to register\r
+    success = ps_twi_sda(PS_TWI_CHECK_ACK);   // Check ACK from device\r
+    // Slave does not send this ACK\r
+    // if (!success) return (0);\r
+\r
+    ps_twi_sda(PS_TWI_SEND_STOP);             // Generate stop condition\r
+\r
+    return (1);\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          ps_read_register\r
+// @brief       Read a byte from the pressure sensor\r
+// @param       u8 address              Register address\r
+//                              u8      mode            PS_TWI_8BIT_ACCESS, PS_TWI_16BIT_ACCESS\r
+// @return      u16                         Register content\r
+// *************************************************************************************************\r
+u16 ps_read_register(u8 address, u8 mode)\r
+{\r
+    u8 success;\r
+    u16 data = 0;\r
+\r
+    ps_twi_sda(PS_TWI_SEND_START);            // Generate start condition\r
+\r
+    ps_twi_write((0x11 << 1) | PS_TWI_WRITE); // Send 7bit device address 0x11 + write bit '0'\r
+    success = ps_twi_sda(PS_TWI_CHECK_ACK);   // Check ACK from device\r
+    if (!success)\r
+        return (0);\r
+\r
+    ps_twi_write(address);                    // Send 8bit register address\r
+    success = ps_twi_sda(PS_TWI_CHECK_ACK);   // Check ACK from device\r
+    if (!success)\r
+        return (0);\r
+\r
+    ps_twi_sda(PS_TWI_SEND_RESTART);          // Generate restart condition\r
+\r
+    ps_twi_write((0x11 << 1) | PS_TWI_READ);  // Send 7bit device address 0x11 + read bit '1'\r
+    success = ps_twi_sda(PS_TWI_CHECK_ACK);   // Check ACK from device\r
+    if (!success)\r
+        return (0);\r
+\r
+    if (mode == PS_TWI_16BIT_ACCESS)\r
+    {\r
+        data = ps_twi_read(1) << 8;           // Read MSB 8bit data from register\r
+        data |= ps_twi_read(0);               // Read LSB 8bit data from register\r
+    }\r
+    else\r
+    {\r
+        data = ps_twi_read(0);                // Read 8bit data from register\r
+    }\r
+\r
+    ps_twi_sda(PS_TWI_SEND_STOP);             // Generate stop condition\r
+\r
+    return (data);\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          ps_get_pa\r
+// @brief       Read out pressure. Format is Pa. Range is 30000 .. 120000 Pa.\r
+// @param       none\r
+// @return      u32             15-bit pressure sensor value (Pa)\r
+// *************************************************************************************************\r
+u32 ps_get_pa(void)\r
+{\r
+    volatile u32 data = 0;\r
+\r
+    // Get 3 MSB from DATARD8 register\r
+    data = ps_read_register(0x7F, PS_TWI_8BIT_ACCESS);\r
+    data = ((data & 0x07) << 8) << 8;\r
+\r
+    // Get 16 LSB from DATARD16 register\r
+    data |= ps_read_register(0x80, PS_TWI_16BIT_ACCESS);\r
+\r
+    // Convert decimal value to Pa\r
+    data = (data >> 2);\r
+\r
+    return (data);\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          ps_get_temp\r
+// @brief       Read out temperature.\r
+// @param       none\r
+// @return      u16             13-bit temperature value in xx.x K format\r
+// *************************************************************************************************\r
+u16 ps_get_temp(void)\r
+{\r
+    volatile u16 data = 0;\r
+    u16 temp = 0;\r
+    u8 is_negative = 0;\r
+    u16 kelvin;\r
+\r
+    // Get 13 bit from TEMPOUT register\r
+    data = ps_read_register(0x81, PS_TWI_16BIT_ACCESS);\r
+\r
+    // Convert negative temperatures\r
+    if ((data & BIT(13)) == BIT(13))\r
+    {\r
+        // Sign extend temperature\r
+        data |= 0xC000;\r
+        // Convert two's complement\r
+        data = ~data;\r
+        data += 1;\r
+        is_negative = 1;\r
+    }\r
+\r
+    temp = data / 2;\r
+\r
+    // Convert from °C to K\r
+    if (is_negative)\r
+        kelvin = 2732 - temp;\r
+    else\r
+        kelvin = temp + 2732;\r
+\r
+    return (kelvin);\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          init_pressure_table\r
+// @brief       Init pressure table with constants\r
+// @param       u32             p               Pressure (Pa)\r
+// @return      u16                             Altitude (m)\r
+// *************************************************************************************************\r
+void init_pressure_table(void)\r
+{\r
+    u8 i;\r
+\r
+    for (i = 0; i < 17; i++)\r
+        p[i] = p0[i];\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          update_pressure_table\r
+// @brief       Calculate pressure table for reference altitude.\r
+//                              Implemented straight from VTI reference code.\r
+// @param       s16             href    Reference height\r
+//                              u32             p_meas  Pressure (Pa)\r
+//                              u16             t_meas  Temperature (10*K)\r
+// @return      none\r
+// *************************************************************************************************\r
+void update_pressure_table(s16 href, u32 p_meas, u16 t_meas)\r
+{\r
+    const float Invt00 = 0.003470415;\r
+    const float coefp = 0.00006;\r
+    volatile float p_fact;\r
+    volatile float p_noll;\r
+    volatile float hnoll;\r
+    volatile float h_low = 0;\r
+    volatile float t0;\r
+    u8 i;\r
+\r
+    // Typecast arguments\r
+    volatile float fl_href = href;\r
+    volatile float fl_p_meas = (float)p_meas / 100;     // Convert from Pa to hPa\r
+    volatile float fl_t_meas = (float)t_meas / 10;      // Convert from 10 K to 1 K\r
+\r
+    t0 = fl_t_meas + (0.0065 * fl_href);\r
+\r
+    hnoll = fl_href / (t0 * Invt00);\r
+\r
+    for (i = 0; i <= 15; i++)\r
+    {\r
+        if (h0[i] > hnoll)\r
+            break;\r
+        h_low = h0[i];\r
+    }\r
+\r
+    p_noll =\r
+        (float)(hnoll -\r
+                h_low) *\r
+        (1 -\r
+         (hnoll -\r
+          (float)h0[i]) *\r
+         coefp) * ((float)p0[i] - (float)p0[i - 1]) / ((float)h0[i] - h_low) + (float)p0[i - 1];\r
+\r
+    // Calculate multiplicator\r
+    p_fact = fl_p_meas / p_noll;\r
+\r
+    // Apply correction factor to pressure table\r
+    for (i = 0; i <= 16; i++)\r
+    {\r
+        p[i] = p0[i] * p_fact;\r
+    }\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          conv_pa_to_meter\r
+// @brief       Convert pressure (Pa) to altitude (m) using a conversion table\r
+//                              Implemented straight from VTI reference code.\r
+// @param       u32             p_meas  Pressure (Pa)\r
+//                              u16             t_meas  Temperature (10*K)\r
+// @return      s16                             Altitude (m)\r
+// *************************************************************************************************\r
+s16 conv_pa_to_meter(u32 p_meas, u16 t_meas)\r
+{\r
+    const float coef2 = 0.0007;\r
+    const float Invt00 = 0.003470415;\r
+    volatile float hnoll;\r
+    volatile float t0;\r
+    volatile float p_low;\r
+    volatile float fl_h;\r
+    volatile s16 h;\r
+    u8 i;\r
+\r
+    // Typecast arguments\r
+    volatile float fl_p_meas = (float)p_meas / 100;     // Convert from Pa to hPa\r
+    volatile float fl_t_meas = (float)t_meas / 10;      // Convert from 10 K to 1 K\r
+\r
+    for (i = 0; i <= 16; i++)\r
+    {\r
+        if (p[i] < fl_p_meas)\r
+            break;\r
+        p_low = p[i];\r
+    }\r
+\r
+    if (i == 0)\r
+    {\r
+        hnoll = (float)(fl_p_meas - p[0]) / (p[1] - p[0]) * ((float)(h0[1] - h0[0]));\r
+    }\r
+    else if (i < 15)\r
+    {\r
+        hnoll =\r
+            (float)(fl_p_meas -\r
+                    p_low) *\r
+            (1 -\r
+             (fl_p_meas -\r
+              p[i]) * coef2) / (p[i] - p_low) * ((float)(h0[i] - h0[i - 1])) + h0[i - 1];\r
+    }\r
+    else if (i == 15)\r
+    {\r
+        hnoll =\r
+            (float)(fl_p_meas - p_low) / (p[i] - p_low) * ((float)(h0[i] - h0[i - 1])) + h0[i - 1];\r
+    }\r
+    else                        // i==16\r
+    {\r
+        hnoll = (float)(fl_p_meas - p[16]) / (p[16] - p[15]) * ((float)(h0[16] - h0[15])) + h0[16];\r
+    }\r
+\r
+    // Compensate temperature error\r
+    t0 = fl_t_meas / (1 - hnoll * Invt00 * 0.0065);\r
+    fl_h = Invt00 * t0 * hnoll;\r
+    h = (u16) fl_h;\r
+\r
+    return (h);\r
+}\r
+\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/driver/vti_ps.h b/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/driver/vti_ps.h
new file mode 100755 (executable)
index 0000000..e044695
--- /dev/null
@@ -0,0 +1,99 @@
+// *************************************************************************************************\r
+//\r
+//      Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//        Redistribution and use in source and binary forms, with or without\r
+//        modification, are permitted provided that the following conditions\r
+//        are met:\r
+//\r
+//          Redistributions of source code must retain the above copyright\r
+//          notice, this list of conditions and the following disclaimer.\r
+//\r
+//          Redistributions in binary form must reproduce the above copyright\r
+//          notice, this list of conditions and the following disclaimer in the\r
+//          documentation and/or other materials provided with the\r
+//          distribution.\r
+//\r
+//          Neither the name of Texas Instruments Incorporated nor the names of\r
+//          its contributors may be used to endorse or promote products derived\r
+//          from this software without specific prior written permission.\r
+//\r
+//        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+\r
+#ifndef VTI_PS_H_\r
+#define VTI_PS_H_\r
+\r
+// *************************************************************************************************\r
+// Include section\r
+\r
+// *************************************************************************************************\r
+// Prototypes section\r
+extern void ps_init(void);\r
+extern void ps_start(void);\r
+extern void ps_stop(void);\r
+extern u32 ps_get_pa(void);\r
+extern u16 ps_get_temp(void);\r
+extern void init_pressure_table(void);\r
+extern void update_pressure_table(s16 href, u32 p_meas, u16 t_meas);\r
+extern s16 conv_pa_to_meter(u32 p_meas, u16 t_meas);\r
+\r
+// *************************************************************************************************\r
+// Defines section\r
+\r
+// Port and pin resource for TWI interface to pressure sensor\r
+// SCL=PJ.3, SDA=PJ.2, DRDY=P2.6\r
+#define PS_TWI_IN            (PJIN)\r
+#define PS_TWI_OUT           (PJOUT)\r
+#define PS_TWI_DIR           (PJDIR)\r
+#define PS_TWI_REN           (PJREN)\r
+#define PS_SCL_PIN           (BIT3)\r
+#define PS_SDA_PIN           (BIT2)\r
+\r
+// Port, pin and interrupt resource for interrupt from acceleration sensor, DRDY=P2.6\r
+#define PS_INT_IN            (P2IN)\r
+#define PS_INT_OUT           (P2OUT)\r
+#define PS_INT_DIR           (P2DIR)\r
+#define PS_INT_IE            (P2IE)\r
+#define PS_INT_IES           (P2IES)\r
+#define PS_INT_IFG           (P2IFG)\r
+#define PS_INT_PIN           (BIT6)\r
+\r
+// TWI defines\r
+#define PS_TWI_WRITE            (0u)\r
+#define PS_TWI_READ                     (1u)\r
+\r
+#define PS_TWI_SEND_START       (0u)\r
+#define PS_TWI_SEND_RESTART     (1u)\r
+#define PS_TWI_SEND_STOP        (2u)\r
+#define PS_TWI_CHECK_ACK        (3u)\r
+\r
+#define PS_TWI_8BIT_ACCESS      (0u)\r
+#define PS_TWI_16BIT_ACCESS     (1u)\r
+\r
+#define PS_TWI_SCL_HI           { PS_TWI_OUT |=  PS_SCL_PIN; }\r
+#define PS_TWI_SCL_LO           { PS_TWI_OUT &= ~PS_SCL_PIN; }\r
+#define PS_TWI_SDA_HI           { PS_TWI_OUT |=  PS_SDA_PIN; }\r
+#define PS_TWI_SDA_LO           { PS_TWI_OUT &= ~PS_SDA_PIN; }\r
+#define PS_TWI_SDA_IN           { PS_TWI_OUT |=  PS_SDA_PIN; PS_TWI_DIR &= ~PS_SDA_PIN; }\r
+#define PS_TWI_SDA_OUT          { PS_TWI_DIR |=  PS_SDA_PIN; }\r
+\r
+// *************************************************************************************************\r
+// Global Variable section\r
+\r
+// *************************************************************************************************\r
+// Extern section\r
+\r
+#endif                          /*VTI_PS_H_ */\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/ez430_chronos.ewd b/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/ez430_chronos.ewd
new file mode 100755 (executable)
index 0000000..7fdec66
--- /dev/null
@@ -0,0 +1,2107 @@
+<?xml version="1.0" encoding="iso-8859-1"?>\r
+\r
+<project>\r
+  <fileVersion>2</fileVersion>\r
+  <configuration>\r
+    <name>915MHz - Limited IAR Kickstart (USA)</name>\r
+    <toolchain>\r
+      <name>MSP430</name>\r
+    </toolchain>\r
+    <debug>1</debug>\r
+    <settings>\r
+      <name>C-SPY</name>\r
+      <archiveVersion>4</archiveVersion>\r
+      <data>\r
+        <version>25</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>CInput</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>MacOverride</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>MacFile</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>IProcessor</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>GoToEnable</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>GoToName</name>\r
+          <state>main</state>\r
+        </option>\r
+        <option>\r
+          <name>DynDriver</name>\r
+          <state>430FET</state>\r
+        </option>\r
+        <option>\r
+          <name>dDllSlave</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>DdfFileSlave</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>DdfOverride</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>DdfFileName</name>\r
+          <state>$TOOLKIT_DIR$\config\CC430F6137.ddf</state>\r
+        </option>\r
+        <option>\r
+          <name>ProcTMS</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CExtraOptionsCheck</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CExtraOptions</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>ProcMSP430X</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CompilerDataModel</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>IVBASE</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OCImagesSuppressCheck1</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OCImagesPath1</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>OCImagesSuppressCheck2</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OCImagesPath2</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>OCImagesSuppressCheck3</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OCImagesPath3</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>CPUTAG</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>L092Mode</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OCImagesOffset1</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>OCImagesOffset2</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>OCImagesOffset3</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>OCImagesUse1</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OCImagesUse2</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OCImagesUse3</name>\r
+          <state>0</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>430FET</name>\r
+      <archiveVersion>1</archiveVersion>\r
+      <data>\r
+        <version>22</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>CFetMandatory</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Erase</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>EMUVerifyDownloadP7</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>EraseOptionSlaveP7</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>ExitBreakpointP7</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>PutcharBreakpointP7</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>GetcharBreakpointP7</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>derivativeP7</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>ParallelPortP7</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>TargetVoltage</name>\r
+          <state>3.3</state>\r
+        </option>\r
+        <option>\r
+          <name>AllowLockedFlashAccessP7</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>EMUAttach</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AttachOptionSlave</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CRadioProtocolType</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CCRadioModuleTypeSlave</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>EEMLevel</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>DiasbleMemoryCache</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>NeedLockedFlashAccess</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>UsbComPort</name>\r
+          <state>Automatic</state>\r
+        </option>\r
+        <option>\r
+          <name>FetConnection</name>\r
+          <version>2</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>SoftwareBreakpointEnable</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>RadioSoftwareBreakpointType</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>TargetSettlingtime</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AllowAccessToBSL</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OTargetVccTypeDefault</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCBetaDll</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>GPassword</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>DebugLPM5</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>LPM5Slave</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CRadioAutoManualType</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>ExternalCodeDownload</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCVCCDefault</name>\r
+          <state>1</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>SIM430</name>\r
+      <archiveVersion>1</archiveVersion>\r
+      <data>\r
+        <version>4</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>SimOddAddressCheckP7</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CSimMandatory</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>derivativeSim</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>SimEnablePSP</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>SimPspOverrideConfig</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>SimPspConfigFile</name>\r
+          <state>$TOOLKIT_DIR$\CONFIG\test.psp.config</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <debuggerPlugins>\r
+      <plugin>\r
+        <file>$TOOLKIT_DIR$\plugins\Lcd\lcd.ewplugin</file>\r
+        <loadFlag>0</loadFlag>\r
+      </plugin>\r
+      <plugin>\r
+        <file>$TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin</file>\r
+        <loadFlag>0</loadFlag>\r
+      </plugin>\r
+      <plugin>\r
+        <file>$TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin</file>\r
+        <loadFlag>0</loadFlag>\r
+      </plugin>\r
+      <plugin>\r
+        <file>$TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin</file>\r
+        <loadFlag>0</loadFlag>\r
+      </plugin>\r
+      <plugin>\r
+        <file>$TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin</file>\r
+        <loadFlag>0</loadFlag>\r
+      </plugin>\r
+      <plugin>\r
+        <file>$EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin</file>\r
+        <loadFlag>1</loadFlag>\r
+      </plugin>\r
+      <plugin>\r
+        <file>$EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin</file>\r
+        <loadFlag>0</loadFlag>\r
+      </plugin>\r
+      <plugin>\r
+        <file>$EW_DIR$\common\plugins\Stack\Stack.ENU.ewplugin</file>\r
+        <loadFlag>1</loadFlag>\r
+      </plugin>\r
+      <plugin>\r
+        <file>$EW_DIR$\common\plugins\SymList\SymList.ENU.ewplugin</file>\r
+        <loadFlag>1</loadFlag>\r
+      </plugin>\r
+    </debuggerPlugins>\r
+  </configuration>\r
+  <configuration>\r
+    <name>868MHz - Limited IAR Kickstart (Europe)</name>\r
+    <toolchain>\r
+      <name>MSP430</name>\r
+    </toolchain>\r
+    <debug>1</debug>\r
+    <settings>\r
+      <name>C-SPY</name>\r
+      <archiveVersion>4</archiveVersion>\r
+      <data>\r
+        <version>25</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>CInput</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>MacOverride</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>MacFile</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>IProcessor</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>GoToEnable</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>GoToName</name>\r
+          <state>main</state>\r
+        </option>\r
+        <option>\r
+          <name>DynDriver</name>\r
+          <state>430FET</state>\r
+        </option>\r
+        <option>\r
+          <name>dDllSlave</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>DdfFileSlave</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>DdfOverride</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>DdfFileName</name>\r
+          <state>$TOOLKIT_DIR$\config\CC430F6137.ddf</state>\r
+        </option>\r
+        <option>\r
+          <name>ProcTMS</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CExtraOptionsCheck</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CExtraOptions</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>ProcMSP430X</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CompilerDataModel</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>IVBASE</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OCImagesSuppressCheck1</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OCImagesPath1</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>OCImagesSuppressCheck2</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OCImagesPath2</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>OCImagesSuppressCheck3</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OCImagesPath3</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>CPUTAG</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>L092Mode</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OCImagesOffset1</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>OCImagesOffset2</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>OCImagesOffset3</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>OCImagesUse1</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OCImagesUse2</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OCImagesUse3</name>\r
+          <state>0</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>430FET</name>\r
+      <archiveVersion>1</archiveVersion>\r
+      <data>\r
+        <version>22</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>CFetMandatory</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Erase</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>EMUVerifyDownloadP7</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>EraseOptionSlaveP7</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>ExitBreakpointP7</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>PutcharBreakpointP7</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>GetcharBreakpointP7</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>derivativeP7</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>ParallelPortP7</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>TargetVoltage</name>\r
+          <state>3.3</state>\r
+        </option>\r
+        <option>\r
+          <name>AllowLockedFlashAccessP7</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>EMUAttach</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AttachOptionSlave</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CRadioProtocolType</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CCRadioModuleTypeSlave</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>EEMLevel</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>DiasbleMemoryCache</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>NeedLockedFlashAccess</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>UsbComPort</name>\r
+          <state>Automatic</state>\r
+        </option>\r
+        <option>\r
+          <name>FetConnection</name>\r
+          <version>2</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>SoftwareBreakpointEnable</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>RadioSoftwareBreakpointType</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>TargetSettlingtime</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AllowAccessToBSL</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OTargetVccTypeDefault</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCBetaDll</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>GPassword</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>DebugLPM5</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>LPM5Slave</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CRadioAutoManualType</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>ExternalCodeDownload</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCVCCDefault</name>\r
+          <state>1</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>SIM430</name>\r
+      <archiveVersion>1</archiveVersion>\r
+      <data>\r
+        <version>4</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>SimOddAddressCheckP7</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CSimMandatory</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>derivativeSim</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>SimEnablePSP</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>SimPspOverrideConfig</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>SimPspConfigFile</name>\r
+          <state>$TOOLKIT_DIR$\CONFIG\test.psp.config</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <debuggerPlugins>\r
+      <plugin>\r
+        <file>$TOOLKIT_DIR$\plugins\Lcd\lcd.ewplugin</file>\r
+        <loadFlag>1</loadFlag>\r
+      </plugin>\r
+      <plugin>\r
+        <file>$TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin</file>\r
+        <loadFlag>0</loadFlag>\r
+      </plugin>\r
+      <plugin>\r
+        <file>$TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin</file>\r
+        <loadFlag>0</loadFlag>\r
+      </plugin>\r
+      <plugin>\r
+        <file>$TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin</file>\r
+        <loadFlag>0</loadFlag>\r
+      </plugin>\r
+      <plugin>\r
+        <file>$TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin</file>\r
+        <loadFlag>0</loadFlag>\r
+      </plugin>\r
+      <plugin>\r
+        <file>$EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin</file>\r
+        <loadFlag>1</loadFlag>\r
+      </plugin>\r
+      <plugin>\r
+        <file>$EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin</file>\r
+        <loadFlag>0</loadFlag>\r
+      </plugin>\r
+      <plugin>\r
+        <file>$EW_DIR$\common\plugins\Stack\Stack.ENU.ewplugin</file>\r
+        <loadFlag>1</loadFlag>\r
+      </plugin>\r
+      <plugin>\r
+        <file>$EW_DIR$\common\plugins\SymList\SymList.ENU.ewplugin</file>\r
+        <loadFlag>1</loadFlag>\r
+      </plugin>\r
+    </debuggerPlugins>\r
+  </configuration>\r
+  <configuration>\r
+    <name>433MHz - Limited IAR Kickstart (Other regions)</name>\r
+    <toolchain>\r
+      <name>MSP430</name>\r
+    </toolchain>\r
+    <debug>1</debug>\r
+    <settings>\r
+      <name>C-SPY</name>\r
+      <archiveVersion>4</archiveVersion>\r
+      <data>\r
+        <version>25</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>CInput</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>MacOverride</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>MacFile</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>IProcessor</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>GoToEnable</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>GoToName</name>\r
+          <state>main</state>\r
+        </option>\r
+        <option>\r
+          <name>DynDriver</name>\r
+          <state>430FET</state>\r
+        </option>\r
+        <option>\r
+          <name>dDllSlave</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>DdfFileSlave</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>DdfOverride</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>DdfFileName</name>\r
+          <state>$TOOLKIT_DIR$\config\CC430F6137.ddf</state>\r
+        </option>\r
+        <option>\r
+          <name>ProcTMS</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CExtraOptionsCheck</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CExtraOptions</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>ProcMSP430X</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CompilerDataModel</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>IVBASE</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OCImagesSuppressCheck1</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OCImagesPath1</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>OCImagesSuppressCheck2</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OCImagesPath2</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>OCImagesSuppressCheck3</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OCImagesPath3</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>CPUTAG</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>L092Mode</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OCImagesOffset1</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>OCImagesOffset2</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>OCImagesOffset3</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>OCImagesUse1</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OCImagesUse2</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OCImagesUse3</name>\r
+          <state>0</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>430FET</name>\r
+      <archiveVersion>1</archiveVersion>\r
+      <data>\r
+        <version>22</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>CFetMandatory</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Erase</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>EMUVerifyDownloadP7</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>EraseOptionSlaveP7</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>ExitBreakpointP7</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>PutcharBreakpointP7</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>GetcharBreakpointP7</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>derivativeP7</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>ParallelPortP7</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>TargetVoltage</name>\r
+          <state>3.3</state>\r
+        </option>\r
+        <option>\r
+          <name>AllowLockedFlashAccessP7</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>EMUAttach</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AttachOptionSlave</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CRadioProtocolType</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CCRadioModuleTypeSlave</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>EEMLevel</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>DiasbleMemoryCache</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>NeedLockedFlashAccess</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>UsbComPort</name>\r
+          <state>Automatic</state>\r
+        </option>\r
+        <option>\r
+          <name>FetConnection</name>\r
+          <version>2</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>SoftwareBreakpointEnable</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>RadioSoftwareBreakpointType</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>TargetSettlingtime</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AllowAccessToBSL</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OTargetVccTypeDefault</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCBetaDll</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>GPassword</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>DebugLPM5</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>LPM5Slave</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CRadioAutoManualType</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>ExternalCodeDownload</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCVCCDefault</name>\r
+          <state>1</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>SIM430</name>\r
+      <archiveVersion>1</archiveVersion>\r
+      <data>\r
+        <version>4</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>SimOddAddressCheckP7</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CSimMandatory</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>derivativeSim</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>SimEnablePSP</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>SimPspOverrideConfig</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>SimPspConfigFile</name>\r
+          <state>$TOOLKIT_DIR$\CONFIG\test.psp.config</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <debuggerPlugins>\r
+      <plugin>\r
+        <file>$TOOLKIT_DIR$\plugins\Lcd\lcd.ewplugin</file>\r
+        <loadFlag>0</loadFlag>\r
+      </plugin>\r
+      <plugin>\r
+        <file>$TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin</file>\r
+        <loadFlag>0</loadFlag>\r
+      </plugin>\r
+      <plugin>\r
+        <file>$TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin</file>\r
+        <loadFlag>0</loadFlag>\r
+      </plugin>\r
+      <plugin>\r
+        <file>$TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin</file>\r
+        <loadFlag>0</loadFlag>\r
+      </plugin>\r
+      <plugin>\r
+        <file>$TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin</file>\r
+        <loadFlag>0</loadFlag>\r
+      </plugin>\r
+      <plugin>\r
+        <file>$EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin</file>\r
+        <loadFlag>1</loadFlag>\r
+      </plugin>\r
+      <plugin>\r
+        <file>$EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin</file>\r
+        <loadFlag>0</loadFlag>\r
+      </plugin>\r
+      <plugin>\r
+        <file>$EW_DIR$\common\plugins\Stack\Stack.ENU.ewplugin</file>\r
+        <loadFlag>1</loadFlag>\r
+      </plugin>\r
+      <plugin>\r
+        <file>$EW_DIR$\common\plugins\SymList\SymList.ENU.ewplugin</file>\r
+        <loadFlag>1</loadFlag>\r
+      </plugin>\r
+    </debuggerPlugins>\r
+  </configuration>\r
+  <configuration>\r
+    <name>915MHz - Unrestricted IAR Workbench (USA)</name>\r
+    <toolchain>\r
+      <name>MSP430</name>\r
+    </toolchain>\r
+    <debug>1</debug>\r
+    <settings>\r
+      <name>C-SPY</name>\r
+      <archiveVersion>4</archiveVersion>\r
+      <data>\r
+        <version>25</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>CInput</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>MacOverride</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>MacFile</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>IProcessor</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>GoToEnable</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>GoToName</name>\r
+          <state>main</state>\r
+        </option>\r
+        <option>\r
+          <name>DynDriver</name>\r
+          <state>430FET</state>\r
+        </option>\r
+        <option>\r
+          <name>dDllSlave</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>DdfFileSlave</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>DdfOverride</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>DdfFileName</name>\r
+          <state>$TOOLKIT_DIR$\config\CC430F6137.ddf</state>\r
+        </option>\r
+        <option>\r
+          <name>ProcTMS</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CExtraOptionsCheck</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CExtraOptions</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>ProcMSP430X</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CompilerDataModel</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>IVBASE</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OCImagesSuppressCheck1</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OCImagesPath1</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>OCImagesSuppressCheck2</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OCImagesPath2</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>OCImagesSuppressCheck3</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OCImagesPath3</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>CPUTAG</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>L092Mode</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OCImagesOffset1</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>OCImagesOffset2</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>OCImagesOffset3</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>OCImagesUse1</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OCImagesUse2</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OCImagesUse3</name>\r
+          <state>0</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>430FET</name>\r
+      <archiveVersion>1</archiveVersion>\r
+      <data>\r
+        <version>22</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>CFetMandatory</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Erase</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>EMUVerifyDownloadP7</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>EraseOptionSlaveP7</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>ExitBreakpointP7</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>PutcharBreakpointP7</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>GetcharBreakpointP7</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>derivativeP7</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>ParallelPortP7</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>TargetVoltage</name>\r
+          <state>3.3</state>\r
+        </option>\r
+        <option>\r
+          <name>AllowLockedFlashAccessP7</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>EMUAttach</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AttachOptionSlave</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CRadioProtocolType</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CCRadioModuleTypeSlave</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>EEMLevel</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>DiasbleMemoryCache</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>NeedLockedFlashAccess</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>UsbComPort</name>\r
+          <state>Automatic</state>\r
+        </option>\r
+        <option>\r
+          <name>FetConnection</name>\r
+          <version>2</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>SoftwareBreakpointEnable</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>RadioSoftwareBreakpointType</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>TargetSettlingtime</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AllowAccessToBSL</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OTargetVccTypeDefault</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCBetaDll</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>GPassword</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>DebugLPM5</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>LPM5Slave</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CRadioAutoManualType</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>ExternalCodeDownload</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCVCCDefault</name>\r
+          <state>1</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>SIM430</name>\r
+      <archiveVersion>1</archiveVersion>\r
+      <data>\r
+        <version>4</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>SimOddAddressCheckP7</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CSimMandatory</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>derivativeSim</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>SimEnablePSP</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>SimPspOverrideConfig</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>SimPspConfigFile</name>\r
+          <state>$TOOLKIT_DIR$\CONFIG\test.psp.config</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <debuggerPlugins>\r
+      <plugin>\r
+        <file>$TOOLKIT_DIR$\plugins\Lcd\lcd.ewplugin</file>\r
+        <loadFlag>0</loadFlag>\r
+      </plugin>\r
+      <plugin>\r
+        <file>$TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin</file>\r
+        <loadFlag>0</loadFlag>\r
+      </plugin>\r
+      <plugin>\r
+        <file>$TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin</file>\r
+        <loadFlag>0</loadFlag>\r
+      </plugin>\r
+      <plugin>\r
+        <file>$TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin</file>\r
+        <loadFlag>0</loadFlag>\r
+      </plugin>\r
+      <plugin>\r
+        <file>$TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin</file>\r
+        <loadFlag>0</loadFlag>\r
+      </plugin>\r
+      <plugin>\r
+        <file>$EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin</file>\r
+        <loadFlag>1</loadFlag>\r
+      </plugin>\r
+      <plugin>\r
+        <file>$EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin</file>\r
+        <loadFlag>0</loadFlag>\r
+      </plugin>\r
+      <plugin>\r
+        <file>$EW_DIR$\common\plugins\Stack\Stack.ENU.ewplugin</file>\r
+        <loadFlag>1</loadFlag>\r
+      </plugin>\r
+      <plugin>\r
+        <file>$EW_DIR$\common\plugins\SymList\SymList.ENU.ewplugin</file>\r
+        <loadFlag>1</loadFlag>\r
+      </plugin>\r
+    </debuggerPlugins>\r
+  </configuration>\r
+  <configuration>\r
+    <name>868MHz - Unrestricted IAR Workbench (Europe)</name>\r
+    <toolchain>\r
+      <name>MSP430</name>\r
+    </toolchain>\r
+    <debug>1</debug>\r
+    <settings>\r
+      <name>C-SPY</name>\r
+      <archiveVersion>4</archiveVersion>\r
+      <data>\r
+        <version>25</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>CInput</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>MacOverride</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>MacFile</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>IProcessor</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>GoToEnable</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>GoToName</name>\r
+          <state>main</state>\r
+        </option>\r
+        <option>\r
+          <name>DynDriver</name>\r
+          <state>430FET</state>\r
+        </option>\r
+        <option>\r
+          <name>dDllSlave</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>DdfFileSlave</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>DdfOverride</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>DdfFileName</name>\r
+          <state>$TOOLKIT_DIR$\config\CC430F6137.ddf</state>\r
+        </option>\r
+        <option>\r
+          <name>ProcTMS</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CExtraOptionsCheck</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CExtraOptions</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>ProcMSP430X</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CompilerDataModel</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>IVBASE</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OCImagesSuppressCheck1</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OCImagesPath1</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>OCImagesSuppressCheck2</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OCImagesPath2</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>OCImagesSuppressCheck3</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OCImagesPath3</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>CPUTAG</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>L092Mode</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OCImagesOffset1</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>OCImagesOffset2</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>OCImagesOffset3</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>OCImagesUse1</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OCImagesUse2</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OCImagesUse3</name>\r
+          <state>0</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>430FET</name>\r
+      <archiveVersion>1</archiveVersion>\r
+      <data>\r
+        <version>22</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>CFetMandatory</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Erase</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>EMUVerifyDownloadP7</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>EraseOptionSlaveP7</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>ExitBreakpointP7</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>PutcharBreakpointP7</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>GetcharBreakpointP7</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>derivativeP7</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>ParallelPortP7</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>TargetVoltage</name>\r
+          <state>3.3</state>\r
+        </option>\r
+        <option>\r
+          <name>AllowLockedFlashAccessP7</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>EMUAttach</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AttachOptionSlave</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CRadioProtocolType</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CCRadioModuleTypeSlave</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>EEMLevel</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>DiasbleMemoryCache</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>NeedLockedFlashAccess</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>UsbComPort</name>\r
+          <state>Automatic</state>\r
+        </option>\r
+        <option>\r
+          <name>FetConnection</name>\r
+          <version>2</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>SoftwareBreakpointEnable</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>RadioSoftwareBreakpointType</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>TargetSettlingtime</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AllowAccessToBSL</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OTargetVccTypeDefault</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCBetaDll</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>GPassword</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>DebugLPM5</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>LPM5Slave</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CRadioAutoManualType</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>ExternalCodeDownload</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCVCCDefault</name>\r
+          <state>1</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>SIM430</name>\r
+      <archiveVersion>1</archiveVersion>\r
+      <data>\r
+        <version>4</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>SimOddAddressCheckP7</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CSimMandatory</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>derivativeSim</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>SimEnablePSP</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>SimPspOverrideConfig</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>SimPspConfigFile</name>\r
+          <state>$TOOLKIT_DIR$\CONFIG\test.psp.config</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <debuggerPlugins>\r
+      <plugin>\r
+        <file>$TOOLKIT_DIR$\plugins\Lcd\lcd.ewplugin</file>\r
+        <loadFlag>1</loadFlag>\r
+      </plugin>\r
+      <plugin>\r
+        <file>$TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin</file>\r
+        <loadFlag>0</loadFlag>\r
+      </plugin>\r
+      <plugin>\r
+        <file>$TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin</file>\r
+        <loadFlag>0</loadFlag>\r
+      </plugin>\r
+      <plugin>\r
+        <file>$TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin</file>\r
+        <loadFlag>0</loadFlag>\r
+      </plugin>\r
+      <plugin>\r
+        <file>$TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin</file>\r
+        <loadFlag>0</loadFlag>\r
+      </plugin>\r
+      <plugin>\r
+        <file>$EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin</file>\r
+        <loadFlag>1</loadFlag>\r
+      </plugin>\r
+      <plugin>\r
+        <file>$EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin</file>\r
+        <loadFlag>0</loadFlag>\r
+      </plugin>\r
+      <plugin>\r
+        <file>$EW_DIR$\common\plugins\Stack\Stack.ENU.ewplugin</file>\r
+        <loadFlag>1</loadFlag>\r
+      </plugin>\r
+      <plugin>\r
+        <file>$EW_DIR$\common\plugins\SymList\SymList.ENU.ewplugin</file>\r
+        <loadFlag>1</loadFlag>\r
+      </plugin>\r
+    </debuggerPlugins>\r
+  </configuration>\r
+  <configuration>\r
+    <name>433MHz - Unrestricted IAR Workbench (Other regions)</name>\r
+    <toolchain>\r
+      <name>MSP430</name>\r
+    </toolchain>\r
+    <debug>1</debug>\r
+    <settings>\r
+      <name>C-SPY</name>\r
+      <archiveVersion>4</archiveVersion>\r
+      <data>\r
+        <version>25</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>CInput</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>MacOverride</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>MacFile</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>IProcessor</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>GoToEnable</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>GoToName</name>\r
+          <state>main</state>\r
+        </option>\r
+        <option>\r
+          <name>DynDriver</name>\r
+          <state>430FET</state>\r
+        </option>\r
+        <option>\r
+          <name>dDllSlave</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>DdfFileSlave</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>DdfOverride</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>DdfFileName</name>\r
+          <state>$TOOLKIT_DIR$\config\CC430F6137.ddf</state>\r
+        </option>\r
+        <option>\r
+          <name>ProcTMS</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CExtraOptionsCheck</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CExtraOptions</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>ProcMSP430X</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CompilerDataModel</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>IVBASE</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OCImagesSuppressCheck1</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OCImagesPath1</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>OCImagesSuppressCheck2</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OCImagesPath2</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>OCImagesSuppressCheck3</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OCImagesPath3</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>CPUTAG</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>L092Mode</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OCImagesOffset1</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>OCImagesOffset2</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>OCImagesOffset3</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>OCImagesUse1</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OCImagesUse2</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OCImagesUse3</name>\r
+          <state>0</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>430FET</name>\r
+      <archiveVersion>1</archiveVersion>\r
+      <data>\r
+        <version>22</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>CFetMandatory</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Erase</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>EMUVerifyDownloadP7</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>EraseOptionSlaveP7</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>ExitBreakpointP7</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>PutcharBreakpointP7</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>GetcharBreakpointP7</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>derivativeP7</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>ParallelPortP7</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>TargetVoltage</name>\r
+          <state>3.3</state>\r
+        </option>\r
+        <option>\r
+          <name>AllowLockedFlashAccessP7</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>EMUAttach</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AttachOptionSlave</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CRadioProtocolType</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CCRadioModuleTypeSlave</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>EEMLevel</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>DiasbleMemoryCache</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>NeedLockedFlashAccess</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>UsbComPort</name>\r
+          <state>Automatic</state>\r
+        </option>\r
+        <option>\r
+          <name>FetConnection</name>\r
+          <version>2</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>SoftwareBreakpointEnable</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>RadioSoftwareBreakpointType</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>TargetSettlingtime</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AllowAccessToBSL</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OTargetVccTypeDefault</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCBetaDll</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>GPassword</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>DebugLPM5</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>LPM5Slave</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CRadioAutoManualType</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>ExternalCodeDownload</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCVCCDefault</name>\r
+          <state>1</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>SIM430</name>\r
+      <archiveVersion>1</archiveVersion>\r
+      <data>\r
+        <version>4</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>SimOddAddressCheckP7</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CSimMandatory</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>derivativeSim</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>SimEnablePSP</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>SimPspOverrideConfig</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>SimPspConfigFile</name>\r
+          <state>$TOOLKIT_DIR$\CONFIG\test.psp.config</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <debuggerPlugins>\r
+      <plugin>\r
+        <file>$TOOLKIT_DIR$\plugins\Lcd\lcd.ewplugin</file>\r
+        <loadFlag>0</loadFlag>\r
+      </plugin>\r
+      <plugin>\r
+        <file>$TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin</file>\r
+        <loadFlag>0</loadFlag>\r
+      </plugin>\r
+      <plugin>\r
+        <file>$TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin</file>\r
+        <loadFlag>0</loadFlag>\r
+      </plugin>\r
+      <plugin>\r
+        <file>$TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin</file>\r
+        <loadFlag>0</loadFlag>\r
+      </plugin>\r
+      <plugin>\r
+        <file>$TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin</file>\r
+        <loadFlag>0</loadFlag>\r
+      </plugin>\r
+      <plugin>\r
+        <file>$EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin</file>\r
+        <loadFlag>1</loadFlag>\r
+      </plugin>\r
+      <plugin>\r
+        <file>$EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin</file>\r
+        <loadFlag>0</loadFlag>\r
+      </plugin>\r
+      <plugin>\r
+        <file>$EW_DIR$\common\plugins\Stack\Stack.ENU.ewplugin</file>\r
+        <loadFlag>1</loadFlag>\r
+      </plugin>\r
+      <plugin>\r
+        <file>$EW_DIR$\common\plugins\SymList\SymList.ENU.ewplugin</file>\r
+        <loadFlag>1</loadFlag>\r
+      </plugin>\r
+    </debuggerPlugins>\r
+  </configuration>\r
+</project>\r
+\r
+\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/ez430_chronos.ewp b/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/ez430_chronos.ewp
new file mode 100755 (executable)
index 0000000..6e63043
--- /dev/null
@@ -0,0 +1,6028 @@
+<?xml version="1.0" encoding="iso-8859-1"?>\r
+\r
+<project>\r
+  <fileVersion>2</fileVersion>\r
+  <configuration>\r
+    <name>915MHz - Limited IAR Kickstart (USA)</name>\r
+    <toolchain>\r
+      <name>MSP430</name>\r
+    </toolchain>\r
+    <debug>1</debug>\r
+    <settings>\r
+      <name>General</name>\r
+      <archiveVersion>7</archiveVersion>\r
+      <data>\r
+        <version>27</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>ExePath</name>\r
+          <state>915MHz - Limited IAR Kickstart (USA)\Exe</state>\r
+        </option>\r
+        <option>\r
+          <name>ObjPath</name>\r
+          <state>915MHz - Limited IAR Kickstart (USA)\Obj</state>\r
+        </option>\r
+        <option>\r
+          <name>ListPath</name>\r
+          <state>915MHz - Limited IAR Kickstart (USA)\List</state>\r
+        </option>\r
+        <option>\r
+          <name>PosIndCode</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Hardware Multiplier</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>GOutputBinary</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AssemblerOnly</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OGDouble</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>GRuntimeLibSelect</name>\r
+          <version>0</version>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>RTDescription</name>\r
+          <state>Use the normal configuration of the C/EC++ runtime library. No locale interface, C locale, no file descriptor support, no multibytes in printf and scanf, and no hex floats in strtod.</state>\r
+        </option>\r
+        <option>\r
+          <name>RTConfigPath</name>\r
+          <state>$TOOLKIT_DIR$\LIB\DLIB\dl430xsfn.h</state>\r
+        </option>\r
+        <option>\r
+          <name>RTLibraryPath</name>\r
+          <state>$TOOLKIT_DIR$\LIB\DLIB\dl430xsfn.r43</state>\r
+        </option>\r
+        <option>\r
+          <name>Input variant</name>\r
+          <version>0</version>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Input description</name>\r
+          <state>No specifier n, no float or long long.</state>\r
+        </option>\r
+        <option>\r
+          <name>Output variant</name>\r
+          <version>0</version>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Output description</name>\r
+          <state>No specifier a or A.</state>\r
+        </option>\r
+        <option>\r
+          <name>GRuntimeLibSelectSlave</name>\r
+          <version>0</version>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OGCore</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>GeneralEnableMisra</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>GeneralMisraVerbose</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OGChipSelectMenu</name>\r
+          <state>CC430F6137    CC430F6137</state>\r
+        </option>\r
+        <option>\r
+          <name>GStackHeapOverride</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>GStackSize2</name>\r
+          <state>100</state>\r
+        </option>\r
+        <option>\r
+          <name>GHeapSize2</name>\r
+          <state>80</state>\r
+        </option>\r
+        <option>\r
+          <name>RadioDataModelType</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>GHeap20Size</name>\r
+          <state>80</state>\r
+        </option>\r
+        <option>\r
+          <name>GeneralMisraRules98</name>\r
+          <version>0</version>\r
+          <state>1000111110110101101110011100111111101110011011000101110111101101100111111111111100110011111001110111001111111111111111111111111</state>\r
+        </option>\r
+        <option>\r
+          <name>RadioHeapSizeType</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>RadioHardwareMultiplierType</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>GeneralMisraVer</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>GeneralMisraRules04</name>\r
+          <version>0</version>\r
+          <state>111101110010111111111000110111111111111111111111111110010111101111010101111111111111111111111111101111111011111001111011111011111111111111111</state>\r
+        </option>\r
+        <option>\r
+          <name>RadioL092ModelType</name>\r
+          <state>0</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>ICC430</name>\r
+      <archiveVersion>4</archiveVersion>\r
+      <data>\r
+        <version>30</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>CCDefines</name>\r
+          <state>ISM_US</state>\r
+          <state>__CC430F6137__</state>\r
+        </option>\r
+        <option>\r
+          <name>CCPreprocFile</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCPreprocComments</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCPreprocLine</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCListCFile</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCListCMnemonics</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCListCMessages</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCListAssFile</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCListAssSource</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCEnableRemarks</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCDiagSuppress</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>CCDiagRemark</name>\r
+          <state>Pa082</state>\r
+        </option>\r
+        <option>\r
+          <name>CCDiagWarning</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>CCDiagError</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>IObjPrefix2</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CCRequirePrototypes</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCAllowList</name>\r
+          <version>1</version>\r
+          <state>11111</state>\r
+        </option>\r
+        <option>\r
+          <name>CCObjUseModuleName</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCObjModuleName</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>CCDebugInfo</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>IProcessor</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCDiagWarnAreErr</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCCharIs</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CCExt</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCMultibyteSupport</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCMigrationPreprocExtentions</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCCompilerRuntimeInfo</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>IDoubleSize</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OutputFile</name>\r
+          <state>$FILE_BNAME$.r43</state>\r
+        </option>\r
+        <option>\r
+          <name>CCLibConfigHeader</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OCCR4Utilize</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OCCR5Utilize</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CPIC</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>IExtraOptionsCheck</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>IExtraOptions</name>\r
+          <state>-f"$PROJ_DIR$\simpliciti\Applications\configuration\End Device\smpl_config.dat"</state>\r
+          <state>-f"$PROJ_DIR$\simpliciti\Applications\configuration\smpl_nwk_config.dat"</state>\r
+        </option>\r
+        <option>\r
+          <name>PreInclude</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>CCOverrideModuleTypeDefault</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCRadioModuleType</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCRadioModuleTypeSlave</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>newCCIncludePaths</name>\r
+          <state>$PROJ_DIR$\</state>\r
+          <state>$PROJ_DIR$\include\</state>\r
+          <state>$PROJ_DIR$\driver\</state>\r
+          <state>$PROJ_DIR$\logic\</state>\r
+          <state>$PROJ_DIR$\bluerobin\</state>\r
+          <state>$PROJ_DIR$\simpliciti\</state>\r
+          <state>$PROJ_DIR$\bluerobin\code</state>\r
+          <state>$PROJ_DIR$\bluerobin\lib</state>\r
+          <state>$PROJ_DIR$\bluerobin\lib\br_rx</state>\r
+        </option>\r
+        <option>\r
+          <name>CCStdIncCheck</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CompilerMisraOverride</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OI430X</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>ReduceStack</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Save20bit</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CompilerDataModel</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CCOptLevel</name>\r
+          <state>3</state>\r
+        </option>\r
+        <option>\r
+          <name>CCOptStrategy</name>\r
+          <version>0</version>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CCOptLevelSlave</name>\r
+          <state>3</state>\r
+        </option>\r
+        <option>\r
+          <name>CInput</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CompilerMisraRules98</name>\r
+          <version>0</version>\r
+          <state>1000111110110101101110011100111111101110011011000101110111101101100111111111111100110011111001110111001111111111111111111111111</state>\r
+        </option>\r
+        <option>\r
+          <name>CompilerMisraRules04</name>\r
+          <version>0</version>\r
+          <state>111101110010111111111000110111111111111111111111111110010111101111010101111111111111111111111111101111111011111001111011111011111111111111111</state>\r
+        </option>\r
+        <option>\r
+          <name>IccLang</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>IccCDialect</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>IccAllowVLA</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>IccCppDialect</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>IccRelaxedFpPrecision</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCPUTAG</name>\r
+          <state>1</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>A430</name>\r
+      <archiveVersion>4</archiveVersion>\r
+      <data>\r
+        <version>13</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>AObjPrefix</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>ACaseSensitivity</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>MacroChars</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AWarnEnable</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AWarnWhat</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AWarnOne</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>AWarnRange1</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>AWarnRange2</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>ADefines</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>AList</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AListHeader</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>AListing</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Includes</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>MacDefs</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>MacExps</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>MacExec</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OnlyAssed</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>MultiLine</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>PageLengthCheck</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>PageLength</name>\r
+          <state>80</state>\r
+        </option>\r
+        <option>\r
+          <name>TabSpacing</name>\r
+          <state>8</state>\r
+        </option>\r
+        <option>\r
+          <name>AXRef</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AXRefDefines</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AXRefInternal</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AXRefDual</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>ADebug</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>ADebugType</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>IProcessor</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AMaxErrOn</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AMaxErrNum</name>\r
+          <state>100</state>\r
+        </option>\r
+        <option>\r
+          <name>OutputFile</name>\r
+          <state>$FILE_BNAME$.r43</state>\r
+        </option>\r
+        <option>\r
+          <name>AMultibyteSupport</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AExtraOptionsCheck</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AExtraOptions</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>OA1M</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>AIgnoreStdInclude</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AStdIncludes</name>\r
+          <state>$TOOLKIT_DIR$\INC\</state>\r
+        </option>\r
+        <option>\r
+          <name>AUserIncludes</name>\r
+          <state></state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>CUSTOM</name>\r
+      <archiveVersion>3</archiveVersion>\r
+      <data>\r
+        <extensions></extensions>\r
+        <cmdline></cmdline>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>BICOMP</name>\r
+      <archiveVersion>0</archiveVersion>\r
+      <data/>\r
+    </settings>\r
+    <settings>\r
+      <name>BUILDACTION</name>\r
+      <archiveVersion>1</archiveVersion>\r
+      <data>\r
+        <prebuild></prebuild>\r
+        <postbuild></postbuild>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>XLINK</name>\r
+      <archiveVersion>4</archiveVersion>\r
+      <data>\r
+        <version>22</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>XOutOverride</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OutputFile</name>\r
+          <state>ez430_chronos_915MHz.d43</state>\r
+        </option>\r
+        <option>\r
+          <name>OutputFormat</name>\r
+          <version>11</version>\r
+          <state>33</state>\r
+        </option>\r
+        <option>\r
+          <name>FormatVariant</name>\r
+          <version>8</version>\r
+          <state>2</state>\r
+        </option>\r
+        <option>\r
+          <name>SecondaryOutputFile</name>\r
+          <state>(None for the selected format)</state>\r
+        </option>\r
+        <option>\r
+          <name>XDefines</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>AlwaysOutput</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OverlapWarnings</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>NoGlobalCheck</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>XList</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>SegmentMap</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>ListSymbols</name>\r
+          <state>2</state>\r
+        </option>\r
+        <option>\r
+          <name>PageLengthCheck</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>PageLength</name>\r
+          <state>80</state>\r
+        </option>\r
+        <option>\r
+          <name>XIncludes</name>\r
+          <state>$TOOLKIT_DIR$\LIB\</state>\r
+        </option>\r
+        <option>\r
+          <name>ModuleStatus</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>XclOverride</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>XclFile</name>\r
+          <state>$TOOLKIT_DIR$\CONFIG\lnkCC430F6137.xcl</state>\r
+        </option>\r
+        <option>\r
+          <name>XclFileSlave</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>DoFill</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>FillerByte</name>\r
+          <state>0xFF</state>\r
+        </option>\r
+        <option>\r
+          <name>DoCrc</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CrcSize</name>\r
+          <version>0</version>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CrcAlgo</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CrcPoly</name>\r
+          <state>0x11021</state>\r
+        </option>\r
+        <option>\r
+          <name>CrcCompl</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>RangeCheckAlternatives</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>SuppressAllWarn</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>SuppressDiags</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>TreatAsWarn</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>TreatAsErr</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>ModuleLocalSym</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CrcBitOrder</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>XHardwareMul</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>IncludeSuppressed</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>ModuleSummary</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>XlinkStackSize</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>XlinkCodeModel</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>xcProgramEntryLabel</name>\r
+          <state>__program_start</state>\r
+        </option>\r
+        <option>\r
+          <name>DebugInformation</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>RuntimeControl</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>IoEmulation</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>XcRTLibraryFile</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OXLibIOConfig</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>XLibraryHeap</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>AllowExtraOutput</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>GenerateExtraOutput</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>XExtraOutOverride</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>ExtraOutputFile</name>\r
+          <state>ez430_chronos.a43</state>\r
+        </option>\r
+        <option>\r
+          <name>ExtraOutputFormat</name>\r
+          <version>11</version>\r
+          <state>23</state>\r
+        </option>\r
+        <option>\r
+          <name>ExtraFormatVariant</name>\r
+          <version>8</version>\r
+          <state>2</state>\r
+        </option>\r
+        <option>\r
+          <name>xcOverrideProgramEntryLabel</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>xcProgramEntryLabelSelect</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>ListOutputFormat</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>BufferedTermOutput</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>XExtraOptionsCheck</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>XExtraOptions</name>\r
+          <state>--ks_version</state>\r
+        </option>\r
+        <option>\r
+          <name>OverlaySystemMap</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>RawBinaryFile</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>RawBinarySymbol</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>RawBinarySegment</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>RawBinaryAlign</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>XLinkMisraHandler</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CrcAlign</name>\r
+          <state>2</state>\r
+        </option>\r
+        <option>\r
+          <name>CrcInitialValue</name>\r
+          <state>0x0</state>\r
+        </option>\r
+        <option>\r
+          <name>XLibraryHeap20</name>\r
+          <state>1</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>XAR</name>\r
+      <archiveVersion>4</archiveVersion>\r
+      <data>\r
+        <version>0</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>XAROutOverride</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>XARInputs</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>OutputFile</name>\r
+          <state></state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>BILINK</name>\r
+      <archiveVersion>0</archiveVersion>\r
+      <data/>\r
+    </settings>\r
+  </configuration>\r
+  <configuration>\r
+    <name>868MHz - Limited IAR Kickstart (Europe)</name>\r
+    <toolchain>\r
+      <name>MSP430</name>\r
+    </toolchain>\r
+    <debug>1</debug>\r
+    <settings>\r
+      <name>General</name>\r
+      <archiveVersion>7</archiveVersion>\r
+      <data>\r
+        <version>27</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>ExePath</name>\r
+          <state>868MHz - Limited IAR Kickstart (Europe)\Exe</state>\r
+        </option>\r
+        <option>\r
+          <name>ObjPath</name>\r
+          <state>868MHz - Limited IAR Kickstart (Europe)\Obj</state>\r
+        </option>\r
+        <option>\r
+          <name>ListPath</name>\r
+          <state>868MHz - Limited IAR Kickstart (Europe)\List</state>\r
+        </option>\r
+        <option>\r
+          <name>PosIndCode</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Hardware Multiplier</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>GOutputBinary</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AssemblerOnly</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OGDouble</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>GRuntimeLibSelect</name>\r
+          <version>0</version>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>RTDescription</name>\r
+          <state>Use the normal configuration of the C/EC++ runtime library. No locale interface, C locale, no file descriptor support, no multibytes in printf and scanf, and no hex floats in strtod.</state>\r
+        </option>\r
+        <option>\r
+          <name>RTConfigPath</name>\r
+          <state>$TOOLKIT_DIR$\LIB\DLIB\dl430xsfn.h</state>\r
+        </option>\r
+        <option>\r
+          <name>RTLibraryPath</name>\r
+          <state>$TOOLKIT_DIR$\LIB\DLIB\dl430xsfn.r43</state>\r
+        </option>\r
+        <option>\r
+          <name>Input variant</name>\r
+          <version>0</version>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Input description</name>\r
+          <state>No specifier n, no float or long long.</state>\r
+        </option>\r
+        <option>\r
+          <name>Output variant</name>\r
+          <version>0</version>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Output description</name>\r
+          <state>No specifier a or A.</state>\r
+        </option>\r
+        <option>\r
+          <name>GRuntimeLibSelectSlave</name>\r
+          <version>0</version>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OGCore</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>GeneralEnableMisra</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>GeneralMisraVerbose</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OGChipSelectMenu</name>\r
+          <state>CC430F6137    CC430F6137</state>\r
+        </option>\r
+        <option>\r
+          <name>GStackHeapOverride</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>GStackSize2</name>\r
+          <state>80</state>\r
+        </option>\r
+        <option>\r
+          <name>GHeapSize2</name>\r
+          <state>80</state>\r
+        </option>\r
+        <option>\r
+          <name>RadioDataModelType</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>GHeap20Size</name>\r
+          <state>80</state>\r
+        </option>\r
+        <option>\r
+          <name>GeneralMisraRules98</name>\r
+          <version>0</version>\r
+          <state>1000111110110101101110011100111111101110011011000101110111101101100111111111111100110011111001110111001111111111111111111111111</state>\r
+        </option>\r
+        <option>\r
+          <name>RadioHeapSizeType</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>RadioHardwareMultiplierType</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>GeneralMisraVer</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>GeneralMisraRules04</name>\r
+          <version>0</version>\r
+          <state>111101110010111111111000110111111111111111111111111110010111101111010101111111111111111111111111101111111011111001111011111011111111111111111</state>\r
+        </option>\r
+        <option>\r
+          <name>RadioL092ModelType</name>\r
+          <state>0</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>ICC430</name>\r
+      <archiveVersion>4</archiveVersion>\r
+      <data>\r
+        <version>30</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>CCDefines</name>\r
+          <state>ISM_EU</state>\r
+          <state>__CC430F6137__</state>\r
+        </option>\r
+        <option>\r
+          <name>CCPreprocFile</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCPreprocComments</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCPreprocLine</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCListCFile</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCListCMnemonics</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCListCMessages</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCListAssFile</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCListAssSource</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCEnableRemarks</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCDiagSuppress</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>CCDiagRemark</name>\r
+          <state>Pa082</state>\r
+        </option>\r
+        <option>\r
+          <name>CCDiagWarning</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>CCDiagError</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>IObjPrefix2</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CCRequirePrototypes</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCAllowList</name>\r
+          <version>1</version>\r
+          <state>11111</state>\r
+        </option>\r
+        <option>\r
+          <name>CCObjUseModuleName</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCObjModuleName</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>CCDebugInfo</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>IProcessor</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCDiagWarnAreErr</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCCharIs</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CCExt</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCMultibyteSupport</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCMigrationPreprocExtentions</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCCompilerRuntimeInfo</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>IDoubleSize</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OutputFile</name>\r
+          <state>$FILE_BNAME$.r43</state>\r
+        </option>\r
+        <option>\r
+          <name>CCLibConfigHeader</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OCCR4Utilize</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OCCR5Utilize</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CPIC</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>IExtraOptionsCheck</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>IExtraOptions</name>\r
+          <state>-f"$PROJ_DIR$\simpliciti\Applications\configuration\End Device\smpl_config.dat"</state>\r
+          <state>-f"$PROJ_DIR$\simpliciti\Applications\configuration\smpl_nwk_config.dat"</state>\r
+        </option>\r
+        <option>\r
+          <name>PreInclude</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>CCOverrideModuleTypeDefault</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCRadioModuleType</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCRadioModuleTypeSlave</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>newCCIncludePaths</name>\r
+          <state>$PROJ_DIR$\</state>\r
+          <state>$PROJ_DIR$\include\</state>\r
+          <state>$PROJ_DIR$\driver\</state>\r
+          <state>$PROJ_DIR$\logic\</state>\r
+          <state>$PROJ_DIR$\bluerobin\</state>\r
+          <state>$PROJ_DIR$\simpliciti\</state>\r
+          <state>$PROJ_DIR$\bluerobin\code</state>\r
+          <state>$PROJ_DIR$\bluerobin\lib</state>\r
+          <state>$PROJ_DIR$\bluerobin\lib\br_rx</state>\r
+        </option>\r
+        <option>\r
+          <name>CCStdIncCheck</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CompilerMisraOverride</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OI430X</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>ReduceStack</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Save20bit</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CompilerDataModel</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CCOptLevel</name>\r
+          <state>3</state>\r
+        </option>\r
+        <option>\r
+          <name>CCOptStrategy</name>\r
+          <version>0</version>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CCOptLevelSlave</name>\r
+          <state>3</state>\r
+        </option>\r
+        <option>\r
+          <name>CInput</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CompilerMisraRules98</name>\r
+          <version>0</version>\r
+          <state>1000111110110101101110011100111111101110011011000101110111101101100111111111111100110011111001110111001111111111111111111111111</state>\r
+        </option>\r
+        <option>\r
+          <name>CompilerMisraRules04</name>\r
+          <version>0</version>\r
+          <state>111101110010111111111000110111111111111111111111111110010111101111010101111111111111111111111111101111111011111001111011111011111111111111111</state>\r
+        </option>\r
+        <option>\r
+          <name>IccLang</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>IccCDialect</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>IccAllowVLA</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>IccCppDialect</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>IccRelaxedFpPrecision</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCPUTAG</name>\r
+          <state>1</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>A430</name>\r
+      <archiveVersion>4</archiveVersion>\r
+      <data>\r
+        <version>13</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>AObjPrefix</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>ACaseSensitivity</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>MacroChars</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AWarnEnable</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AWarnWhat</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AWarnOne</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>AWarnRange1</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>AWarnRange2</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>ADefines</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>AList</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AListHeader</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>AListing</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Includes</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>MacDefs</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>MacExps</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>MacExec</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OnlyAssed</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>MultiLine</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>PageLengthCheck</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>PageLength</name>\r
+          <state>80</state>\r
+        </option>\r
+        <option>\r
+          <name>TabSpacing</name>\r
+          <state>8</state>\r
+        </option>\r
+        <option>\r
+          <name>AXRef</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AXRefDefines</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AXRefInternal</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AXRefDual</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>ADebug</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>ADebugType</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>IProcessor</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AMaxErrOn</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AMaxErrNum</name>\r
+          <state>100</state>\r
+        </option>\r
+        <option>\r
+          <name>OutputFile</name>\r
+          <state>$FILE_BNAME$.r43</state>\r
+        </option>\r
+        <option>\r
+          <name>AMultibyteSupport</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AExtraOptionsCheck</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AExtraOptions</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>OA1M</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>AIgnoreStdInclude</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AStdIncludes</name>\r
+          <state>$TOOLKIT_DIR$\INC\</state>\r
+        </option>\r
+        <option>\r
+          <name>AUserIncludes</name>\r
+          <state></state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>CUSTOM</name>\r
+      <archiveVersion>3</archiveVersion>\r
+      <data>\r
+        <extensions></extensions>\r
+        <cmdline></cmdline>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>BICOMP</name>\r
+      <archiveVersion>0</archiveVersion>\r
+      <data/>\r
+    </settings>\r
+    <settings>\r
+      <name>BUILDACTION</name>\r
+      <archiveVersion>1</archiveVersion>\r
+      <data>\r
+        <prebuild></prebuild>\r
+        <postbuild></postbuild>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>XLINK</name>\r
+      <archiveVersion>4</archiveVersion>\r
+      <data>\r
+        <version>22</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>XOutOverride</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OutputFile</name>\r
+          <state>ez430_chronos_868MHz.d43</state>\r
+        </option>\r
+        <option>\r
+          <name>OutputFormat</name>\r
+          <version>11</version>\r
+          <state>33</state>\r
+        </option>\r
+        <option>\r
+          <name>FormatVariant</name>\r
+          <version>8</version>\r
+          <state>2</state>\r
+        </option>\r
+        <option>\r
+          <name>SecondaryOutputFile</name>\r
+          <state>(None for the selected format)</state>\r
+        </option>\r
+        <option>\r
+          <name>XDefines</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>AlwaysOutput</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OverlapWarnings</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>NoGlobalCheck</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>XList</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>SegmentMap</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>ListSymbols</name>\r
+          <state>2</state>\r
+        </option>\r
+        <option>\r
+          <name>PageLengthCheck</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>PageLength</name>\r
+          <state>80</state>\r
+        </option>\r
+        <option>\r
+          <name>XIncludes</name>\r
+          <state>$TOOLKIT_DIR$\LIB\</state>\r
+        </option>\r
+        <option>\r
+          <name>ModuleStatus</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>XclOverride</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>XclFile</name>\r
+          <state>$TOOLKIT_DIR$\CONFIG\lnkCC430F6137.xcl</state>\r
+        </option>\r
+        <option>\r
+          <name>XclFileSlave</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>DoFill</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>FillerByte</name>\r
+          <state>0xFF</state>\r
+        </option>\r
+        <option>\r
+          <name>DoCrc</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CrcSize</name>\r
+          <version>0</version>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CrcAlgo</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CrcPoly</name>\r
+          <state>0x11021</state>\r
+        </option>\r
+        <option>\r
+          <name>CrcCompl</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>RangeCheckAlternatives</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>SuppressAllWarn</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>SuppressDiags</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>TreatAsWarn</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>TreatAsErr</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>ModuleLocalSym</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CrcBitOrder</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>XHardwareMul</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>IncludeSuppressed</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>ModuleSummary</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>XlinkStackSize</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>XlinkCodeModel</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>xcProgramEntryLabel</name>\r
+          <state>__program_start</state>\r
+        </option>\r
+        <option>\r
+          <name>DebugInformation</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>RuntimeControl</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>IoEmulation</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>XcRTLibraryFile</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OXLibIOConfig</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>XLibraryHeap</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>AllowExtraOutput</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>GenerateExtraOutput</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>XExtraOutOverride</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>ExtraOutputFile</name>\r
+          <state>ez430_chronos.a43</state>\r
+        </option>\r
+        <option>\r
+          <name>ExtraOutputFormat</name>\r
+          <version>11</version>\r
+          <state>23</state>\r
+        </option>\r
+        <option>\r
+          <name>ExtraFormatVariant</name>\r
+          <version>8</version>\r
+          <state>2</state>\r
+        </option>\r
+        <option>\r
+          <name>xcOverrideProgramEntryLabel</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>xcProgramEntryLabelSelect</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>ListOutputFormat</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>BufferedTermOutput</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>XExtraOptionsCheck</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>XExtraOptions</name>\r
+          <state>--ks_version</state>\r
+        </option>\r
+        <option>\r
+          <name>OverlaySystemMap</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>RawBinaryFile</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>RawBinarySymbol</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>RawBinarySegment</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>RawBinaryAlign</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>XLinkMisraHandler</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CrcAlign</name>\r
+          <state>2</state>\r
+        </option>\r
+        <option>\r
+          <name>CrcInitialValue</name>\r
+          <state>0x0</state>\r
+        </option>\r
+        <option>\r
+          <name>XLibraryHeap20</name>\r
+          <state>1</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>XAR</name>\r
+      <archiveVersion>4</archiveVersion>\r
+      <data>\r
+        <version>0</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>XAROutOverride</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>XARInputs</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>OutputFile</name>\r
+          <state></state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>BILINK</name>\r
+      <archiveVersion>0</archiveVersion>\r
+      <data/>\r
+    </settings>\r
+  </configuration>\r
+  <configuration>\r
+    <name>433MHz - Limited IAR Kickstart (Other regions)</name>\r
+    <toolchain>\r
+      <name>MSP430</name>\r
+    </toolchain>\r
+    <debug>1</debug>\r
+    <settings>\r
+      <name>General</name>\r
+      <archiveVersion>7</archiveVersion>\r
+      <data>\r
+        <version>27</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>ExePath</name>\r
+          <state>433MHz - Limited IAR Kickstart (Other regions)\Exe</state>\r
+        </option>\r
+        <option>\r
+          <name>ObjPath</name>\r
+          <state>433MHz - Limited IAR Kickstart (Other regions)\Obj</state>\r
+        </option>\r
+        <option>\r
+          <name>ListPath</name>\r
+          <state>433MHz - Limited IAR Kickstart (Other regions)\List</state>\r
+        </option>\r
+        <option>\r
+          <name>PosIndCode</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Hardware Multiplier</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>GOutputBinary</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AssemblerOnly</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OGDouble</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>GRuntimeLibSelect</name>\r
+          <version>0</version>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>RTDescription</name>\r
+          <state>Use the normal configuration of the C/EC++ runtime library. No locale interface, C locale, no file descriptor support, no multibytes in printf and scanf, and no hex floats in strtod.</state>\r
+        </option>\r
+        <option>\r
+          <name>RTConfigPath</name>\r
+          <state>$TOOLKIT_DIR$\LIB\DLIB\dl430xsfn.h</state>\r
+        </option>\r
+        <option>\r
+          <name>RTLibraryPath</name>\r
+          <state>$TOOLKIT_DIR$\LIB\DLIB\dl430xsfn.r43</state>\r
+        </option>\r
+        <option>\r
+          <name>Input variant</name>\r
+          <version>0</version>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Input description</name>\r
+          <state>No specifier n, no float or long long.</state>\r
+        </option>\r
+        <option>\r
+          <name>Output variant</name>\r
+          <version>0</version>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Output description</name>\r
+          <state>No specifier a or A.</state>\r
+        </option>\r
+        <option>\r
+          <name>GRuntimeLibSelectSlave</name>\r
+          <version>0</version>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OGCore</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>GeneralEnableMisra</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>GeneralMisraVerbose</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OGChipSelectMenu</name>\r
+          <state>CC430F6137    CC430F6137</state>\r
+        </option>\r
+        <option>\r
+          <name>GStackHeapOverride</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>GStackSize2</name>\r
+          <state>80</state>\r
+        </option>\r
+        <option>\r
+          <name>GHeapSize2</name>\r
+          <state>80</state>\r
+        </option>\r
+        <option>\r
+          <name>RadioDataModelType</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>GHeap20Size</name>\r
+          <state>80</state>\r
+        </option>\r
+        <option>\r
+          <name>GeneralMisraRules98</name>\r
+          <version>0</version>\r
+          <state>1000111110110101101110011100111111101110011011000101110111101101100111111111111100110011111001110111001111111111111111111111111</state>\r
+        </option>\r
+        <option>\r
+          <name>RadioHeapSizeType</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>RadioHardwareMultiplierType</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>GeneralMisraVer</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>GeneralMisraRules04</name>\r
+          <version>0</version>\r
+          <state>111101110010111111111000110111111111111111111111111110010111101111010101111111111111111111111111101111111011111001111011111011111111111111111</state>\r
+        </option>\r
+        <option>\r
+          <name>RadioL092ModelType</name>\r
+          <state>0</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>ICC430</name>\r
+      <archiveVersion>4</archiveVersion>\r
+      <data>\r
+        <version>30</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>CCDefines</name>\r
+          <state>ISM_LF</state>\r
+          <state>__CC430F6137__</state>\r
+        </option>\r
+        <option>\r
+          <name>CCPreprocFile</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCPreprocComments</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCPreprocLine</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCListCFile</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCListCMnemonics</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCListCMessages</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCListAssFile</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCListAssSource</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCEnableRemarks</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCDiagSuppress</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>CCDiagRemark</name>\r
+          <state>Pa082</state>\r
+        </option>\r
+        <option>\r
+          <name>CCDiagWarning</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>CCDiagError</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>IObjPrefix2</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CCRequirePrototypes</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCAllowList</name>\r
+          <version>1</version>\r
+          <state>11111</state>\r
+        </option>\r
+        <option>\r
+          <name>CCObjUseModuleName</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCObjModuleName</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>CCDebugInfo</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>IProcessor</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCDiagWarnAreErr</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCCharIs</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CCExt</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCMultibyteSupport</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCMigrationPreprocExtentions</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCCompilerRuntimeInfo</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>IDoubleSize</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OutputFile</name>\r
+          <state>$FILE_BNAME$.r43</state>\r
+        </option>\r
+        <option>\r
+          <name>CCLibConfigHeader</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OCCR4Utilize</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OCCR5Utilize</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CPIC</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>IExtraOptionsCheck</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>IExtraOptions</name>\r
+          <state>-f"$PROJ_DIR$\simpliciti\Applications\configuration\End Device\smpl_config.dat"</state>\r
+          <state>-f"$PROJ_DIR$\simpliciti\Applications\configuration\smpl_nwk_config.dat"</state>\r
+        </option>\r
+        <option>\r
+          <name>PreInclude</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>CCOverrideModuleTypeDefault</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCRadioModuleType</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCRadioModuleTypeSlave</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>newCCIncludePaths</name>\r
+          <state>$PROJ_DIR$\</state>\r
+          <state>$PROJ_DIR$\include\</state>\r
+          <state>$PROJ_DIR$\driver\</state>\r
+          <state>$PROJ_DIR$\logic\</state>\r
+          <state>$PROJ_DIR$\bluerobin\</state>\r
+          <state>$PROJ_DIR$\simpliciti\</state>\r
+          <state>$PROJ_DIR$\bluerobin\code</state>\r
+          <state>$PROJ_DIR$\bluerobin\lib</state>\r
+          <state>$PROJ_DIR$\bluerobin\lib\br_rx</state>\r
+        </option>\r
+        <option>\r
+          <name>CCStdIncCheck</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CompilerMisraOverride</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OI430X</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>ReduceStack</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Save20bit</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CompilerDataModel</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CCOptLevel</name>\r
+          <state>3</state>\r
+        </option>\r
+        <option>\r
+          <name>CCOptStrategy</name>\r
+          <version>0</version>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CCOptLevelSlave</name>\r
+          <state>3</state>\r
+        </option>\r
+        <option>\r
+          <name>CInput</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CompilerMisraRules98</name>\r
+          <version>0</version>\r
+          <state>1000111110110101101110011100111111101110011011000101110111101101100111111111111100110011111001110111001111111111111111111111111</state>\r
+        </option>\r
+        <option>\r
+          <name>CompilerMisraRules04</name>\r
+          <version>0</version>\r
+          <state>111101110010111111111000110111111111111111111111111110010111101111010101111111111111111111111111101111111011111001111011111011111111111111111</state>\r
+        </option>\r
+        <option>\r
+          <name>IccLang</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>IccCDialect</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>IccAllowVLA</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>IccCppDialect</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>IccRelaxedFpPrecision</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCPUTAG</name>\r
+          <state>1</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>A430</name>\r
+      <archiveVersion>4</archiveVersion>\r
+      <data>\r
+        <version>13</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>AObjPrefix</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>ACaseSensitivity</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>MacroChars</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AWarnEnable</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AWarnWhat</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AWarnOne</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>AWarnRange1</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>AWarnRange2</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>ADefines</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>AList</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AListHeader</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>AListing</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Includes</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>MacDefs</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>MacExps</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>MacExec</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OnlyAssed</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>MultiLine</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>PageLengthCheck</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>PageLength</name>\r
+          <state>80</state>\r
+        </option>\r
+        <option>\r
+          <name>TabSpacing</name>\r
+          <state>8</state>\r
+        </option>\r
+        <option>\r
+          <name>AXRef</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AXRefDefines</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AXRefInternal</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AXRefDual</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>ADebug</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>ADebugType</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>IProcessor</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AMaxErrOn</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AMaxErrNum</name>\r
+          <state>100</state>\r
+        </option>\r
+        <option>\r
+          <name>OutputFile</name>\r
+          <state>$FILE_BNAME$.r43</state>\r
+        </option>\r
+        <option>\r
+          <name>AMultibyteSupport</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AExtraOptionsCheck</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AExtraOptions</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>OA1M</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>AIgnoreStdInclude</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AStdIncludes</name>\r
+          <state>$TOOLKIT_DIR$\INC\</state>\r
+        </option>\r
+        <option>\r
+          <name>AUserIncludes</name>\r
+          <state></state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>CUSTOM</name>\r
+      <archiveVersion>3</archiveVersion>\r
+      <data>\r
+        <extensions></extensions>\r
+        <cmdline></cmdline>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>BICOMP</name>\r
+      <archiveVersion>0</archiveVersion>\r
+      <data/>\r
+    </settings>\r
+    <settings>\r
+      <name>BUILDACTION</name>\r
+      <archiveVersion>1</archiveVersion>\r
+      <data>\r
+        <prebuild></prebuild>\r
+        <postbuild></postbuild>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>XLINK</name>\r
+      <archiveVersion>4</archiveVersion>\r
+      <data>\r
+        <version>22</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>XOutOverride</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OutputFile</name>\r
+          <state>ez430_chronos_433MHz.d43</state>\r
+        </option>\r
+        <option>\r
+          <name>OutputFormat</name>\r
+          <version>11</version>\r
+          <state>33</state>\r
+        </option>\r
+        <option>\r
+          <name>FormatVariant</name>\r
+          <version>8</version>\r
+          <state>2</state>\r
+        </option>\r
+        <option>\r
+          <name>SecondaryOutputFile</name>\r
+          <state>(None for the selected format)</state>\r
+        </option>\r
+        <option>\r
+          <name>XDefines</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>AlwaysOutput</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OverlapWarnings</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>NoGlobalCheck</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>XList</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>SegmentMap</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>ListSymbols</name>\r
+          <state>2</state>\r
+        </option>\r
+        <option>\r
+          <name>PageLengthCheck</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>PageLength</name>\r
+          <state>80</state>\r
+        </option>\r
+        <option>\r
+          <name>XIncludes</name>\r
+          <state>$TOOLKIT_DIR$\LIB\</state>\r
+        </option>\r
+        <option>\r
+          <name>ModuleStatus</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>XclOverride</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>XclFile</name>\r
+          <state>$TOOLKIT_DIR$\CONFIG\lnkCC430F6137.xcl</state>\r
+        </option>\r
+        <option>\r
+          <name>XclFileSlave</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>DoFill</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>FillerByte</name>\r
+          <state>0xFF</state>\r
+        </option>\r
+        <option>\r
+          <name>DoCrc</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CrcSize</name>\r
+          <version>0</version>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CrcAlgo</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CrcPoly</name>\r
+          <state>0x11021</state>\r
+        </option>\r
+        <option>\r
+          <name>CrcCompl</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>RangeCheckAlternatives</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>SuppressAllWarn</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>SuppressDiags</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>TreatAsWarn</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>TreatAsErr</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>ModuleLocalSym</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CrcBitOrder</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>XHardwareMul</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>IncludeSuppressed</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>ModuleSummary</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>XlinkStackSize</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>XlinkCodeModel</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>xcProgramEntryLabel</name>\r
+          <state>__program_start</state>\r
+        </option>\r
+        <option>\r
+          <name>DebugInformation</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>RuntimeControl</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>IoEmulation</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>XcRTLibraryFile</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OXLibIOConfig</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>XLibraryHeap</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>AllowExtraOutput</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>GenerateExtraOutput</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>XExtraOutOverride</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>ExtraOutputFile</name>\r
+          <state>ez430_chronos.a43</state>\r
+        </option>\r
+        <option>\r
+          <name>ExtraOutputFormat</name>\r
+          <version>11</version>\r
+          <state>23</state>\r
+        </option>\r
+        <option>\r
+          <name>ExtraFormatVariant</name>\r
+          <version>8</version>\r
+          <state>2</state>\r
+        </option>\r
+        <option>\r
+          <name>xcOverrideProgramEntryLabel</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>xcProgramEntryLabelSelect</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>ListOutputFormat</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>BufferedTermOutput</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>XExtraOptionsCheck</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>XExtraOptions</name>\r
+          <state>--ks_version</state>\r
+        </option>\r
+        <option>\r
+          <name>OverlaySystemMap</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>RawBinaryFile</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>RawBinarySymbol</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>RawBinarySegment</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>RawBinaryAlign</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>XLinkMisraHandler</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CrcAlign</name>\r
+          <state>2</state>\r
+        </option>\r
+        <option>\r
+          <name>CrcInitialValue</name>\r
+          <state>0x0</state>\r
+        </option>\r
+        <option>\r
+          <name>XLibraryHeap20</name>\r
+          <state>1</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>XAR</name>\r
+      <archiveVersion>4</archiveVersion>\r
+      <data>\r
+        <version>0</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>XAROutOverride</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>XARInputs</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>OutputFile</name>\r
+          <state></state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>BILINK</name>\r
+      <archiveVersion>0</archiveVersion>\r
+      <data/>\r
+    </settings>\r
+  </configuration>\r
+  <configuration>\r
+    <name>915MHz - Unrestricted IAR Workbench (USA)</name>\r
+    <toolchain>\r
+      <name>MSP430</name>\r
+    </toolchain>\r
+    <debug>1</debug>\r
+    <settings>\r
+      <name>General</name>\r
+      <archiveVersion>7</archiveVersion>\r
+      <data>\r
+        <version>27</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>ExePath</name>\r
+          <state>915MHz - Unrestricted IAR Workbench (USA)\Exe</state>\r
+        </option>\r
+        <option>\r
+          <name>ObjPath</name>\r
+          <state>915MHz - Unrestricted IAR Workbench (USA)\Obj</state>\r
+        </option>\r
+        <option>\r
+          <name>ListPath</name>\r
+          <state>915MHz - Unrestricted IAR Workbench (USA)\List</state>\r
+        </option>\r
+        <option>\r
+          <name>PosIndCode</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Hardware Multiplier</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>GOutputBinary</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AssemblerOnly</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OGDouble</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>GRuntimeLibSelect</name>\r
+          <version>0</version>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>RTDescription</name>\r
+          <state>Use the normal configuration of the C/EC++ runtime library. No locale interface, C locale, no file descriptor support, no multibytes in printf and scanf, and no hex floats in strtod.</state>\r
+        </option>\r
+        <option>\r
+          <name>RTConfigPath</name>\r
+          <state>$TOOLKIT_DIR$\LIB\DLIB\dl430xsfn.h</state>\r
+        </option>\r
+        <option>\r
+          <name>RTLibraryPath</name>\r
+          <state>$TOOLKIT_DIR$\LIB\DLIB\dl430xsfn.r43</state>\r
+        </option>\r
+        <option>\r
+          <name>Input variant</name>\r
+          <version>0</version>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Input description</name>\r
+          <state>No specifier n, no float or long long.</state>\r
+        </option>\r
+        <option>\r
+          <name>Output variant</name>\r
+          <version>0</version>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Output description</name>\r
+          <state>No specifier a or A.</state>\r
+        </option>\r
+        <option>\r
+          <name>GRuntimeLibSelectSlave</name>\r
+          <version>0</version>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OGCore</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>GeneralEnableMisra</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>GeneralMisraVerbose</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OGChipSelectMenu</name>\r
+          <state>CC430F6137    CC430F6137</state>\r
+        </option>\r
+        <option>\r
+          <name>GStackHeapOverride</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>GStackSize2</name>\r
+          <state>80</state>\r
+        </option>\r
+        <option>\r
+          <name>GHeapSize2</name>\r
+          <state>80</state>\r
+        </option>\r
+        <option>\r
+          <name>RadioDataModelType</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>GHeap20Size</name>\r
+          <state>80</state>\r
+        </option>\r
+        <option>\r
+          <name>GeneralMisraRules98</name>\r
+          <version>0</version>\r
+          <state>1000111110110101101110011100111111101110011011000101110111101101100111111111111100110011111001110111001111111111111111111111111</state>\r
+        </option>\r
+        <option>\r
+          <name>RadioHeapSizeType</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>RadioHardwareMultiplierType</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>GeneralMisraVer</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>GeneralMisraRules04</name>\r
+          <version>0</version>\r
+          <state>111101110010111111111000110111111111111111111111111110010111101111010101111111111111111111111111101111111011111001111011111011111111111111111</state>\r
+        </option>\r
+        <option>\r
+          <name>RadioL092ModelType</name>\r
+          <state>0</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>ICC430</name>\r
+      <archiveVersion>4</archiveVersion>\r
+      <data>\r
+        <version>30</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>CCDefines</name>\r
+          <state>ISM_US</state>\r
+          <state>MRFI_CC430</state>\r
+          <state>__CC430F6137__</state>\r
+        </option>\r
+        <option>\r
+          <name>CCPreprocFile</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCPreprocComments</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCPreprocLine</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCListCFile</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCListCMnemonics</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCListCMessages</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCListAssFile</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCListAssSource</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCEnableRemarks</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCDiagSuppress</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>CCDiagRemark</name>\r
+          <state>Pa082</state>\r
+        </option>\r
+        <option>\r
+          <name>CCDiagWarning</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>CCDiagError</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>IObjPrefix2</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CCRequirePrototypes</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCAllowList</name>\r
+          <version>1</version>\r
+          <state>11111</state>\r
+        </option>\r
+        <option>\r
+          <name>CCObjUseModuleName</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCObjModuleName</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>CCDebugInfo</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>IProcessor</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCDiagWarnAreErr</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCCharIs</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CCExt</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCMultibyteSupport</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCMigrationPreprocExtentions</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCCompilerRuntimeInfo</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>IDoubleSize</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OutputFile</name>\r
+          <state>$FILE_BNAME$.r43</state>\r
+        </option>\r
+        <option>\r
+          <name>CCLibConfigHeader</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OCCR4Utilize</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OCCR5Utilize</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CPIC</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>IExtraOptionsCheck</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>IExtraOptions</name>\r
+          <state>-f"$PROJ_DIR$\simpliciti\Applications\configuration\End Device\smpl_config.dat"</state>\r
+          <state>-f"$PROJ_DIR$\simpliciti\Applications\configuration\smpl_nwk_config.dat"</state>\r
+        </option>\r
+        <option>\r
+          <name>PreInclude</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>CCOverrideModuleTypeDefault</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCRadioModuleType</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCRadioModuleTypeSlave</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>newCCIncludePaths</name>\r
+          <state>$PROJ_DIR$\</state>\r
+          <state>$PROJ_DIR$\include\</state>\r
+          <state>$PROJ_DIR$\driver\</state>\r
+          <state>$PROJ_DIR$\logic\</state>\r
+          <state>$PROJ_DIR$\bluerobin\</state>\r
+          <state>$PROJ_DIR$\simpliciti\</state>\r
+          <state>$PROJ_DIR$\bluerobin\code</state>\r
+          <state>$PROJ_DIR$\bluerobin\lib</state>\r
+          <state>$PROJ_DIR$\bluerobin\lib\br_rx</state>\r
+          <state>$PROJ_DIR$\simpliciti\Components\bsp</state>\r
+          <state>$PROJ_DIR$\simpliciti\Components\bsp\drivers</state>\r
+          <state>$PROJ_DIR$\simpliciti\Components\bsp\boards\CC430EM</state>\r
+          <state>$PROJ_DIR$\simpliciti\Components\mrfi</state>\r
+          <state>$PROJ_DIR$\simpliciti\Components\nwk</state>\r
+          <state>$PROJ_DIR$\simpliciti\Components\nwk_applications</state>\r
+        </option>\r
+        <option>\r
+          <name>CCStdIncCheck</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CompilerMisraOverride</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OI430X</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>ReduceStack</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Save20bit</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CompilerDataModel</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CCOptLevel</name>\r
+          <state>3</state>\r
+        </option>\r
+        <option>\r
+          <name>CCOptStrategy</name>\r
+          <version>0</version>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CCOptLevelSlave</name>\r
+          <state>3</state>\r
+        </option>\r
+        <option>\r
+          <name>CInput</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CompilerMisraRules98</name>\r
+          <version>0</version>\r
+          <state>1000111110110101101110011100111111101110011011000101110111101101100111111111111100110011111001110111001111111111111111111111111</state>\r
+        </option>\r
+        <option>\r
+          <name>CompilerMisraRules04</name>\r
+          <version>0</version>\r
+          <state>111101110010111111111000110111111111111111111111111110010111101111010101111111111111111111111111101111111011111001111011111011111111111111111</state>\r
+        </option>\r
+        <option>\r
+          <name>IccLang</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>IccCDialect</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>IccAllowVLA</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>IccCppDialect</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>IccRelaxedFpPrecision</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCPUTAG</name>\r
+          <state>1</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>A430</name>\r
+      <archiveVersion>4</archiveVersion>\r
+      <data>\r
+        <version>13</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>AObjPrefix</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>ACaseSensitivity</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>MacroChars</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AWarnEnable</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AWarnWhat</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AWarnOne</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>AWarnRange1</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>AWarnRange2</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>ADefines</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>AList</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AListHeader</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>AListing</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Includes</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>MacDefs</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>MacExps</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>MacExec</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OnlyAssed</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>MultiLine</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>PageLengthCheck</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>PageLength</name>\r
+          <state>80</state>\r
+        </option>\r
+        <option>\r
+          <name>TabSpacing</name>\r
+          <state>8</state>\r
+        </option>\r
+        <option>\r
+          <name>AXRef</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AXRefDefines</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AXRefInternal</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AXRefDual</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>ADebug</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>ADebugType</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>IProcessor</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AMaxErrOn</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AMaxErrNum</name>\r
+          <state>100</state>\r
+        </option>\r
+        <option>\r
+          <name>OutputFile</name>\r
+          <state>$FILE_BNAME$.r43</state>\r
+        </option>\r
+        <option>\r
+          <name>AMultibyteSupport</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AExtraOptionsCheck</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AExtraOptions</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>OA1M</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>AIgnoreStdInclude</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AStdIncludes</name>\r
+          <state>$TOOLKIT_DIR$\INC\</state>\r
+        </option>\r
+        <option>\r
+          <name>AUserIncludes</name>\r
+          <state></state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>CUSTOM</name>\r
+      <archiveVersion>3</archiveVersion>\r
+      <data>\r
+        <extensions></extensions>\r
+        <cmdline></cmdline>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>BICOMP</name>\r
+      <archiveVersion>0</archiveVersion>\r
+      <data/>\r
+    </settings>\r
+    <settings>\r
+      <name>BUILDACTION</name>\r
+      <archiveVersion>1</archiveVersion>\r
+      <data>\r
+        <prebuild></prebuild>\r
+        <postbuild></postbuild>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>XLINK</name>\r
+      <archiveVersion>4</archiveVersion>\r
+      <data>\r
+        <version>22</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>XOutOverride</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OutputFile</name>\r
+          <state>ez430_chronos_915MHz.d43</state>\r
+        </option>\r
+        <option>\r
+          <name>OutputFormat</name>\r
+          <version>11</version>\r
+          <state>33</state>\r
+        </option>\r
+        <option>\r
+          <name>FormatVariant</name>\r
+          <version>8</version>\r
+          <state>2</state>\r
+        </option>\r
+        <option>\r
+          <name>SecondaryOutputFile</name>\r
+          <state>(None for the selected format)</state>\r
+        </option>\r
+        <option>\r
+          <name>XDefines</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>AlwaysOutput</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OverlapWarnings</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>NoGlobalCheck</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>XList</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>SegmentMap</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>ListSymbols</name>\r
+          <state>2</state>\r
+        </option>\r
+        <option>\r
+          <name>PageLengthCheck</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>PageLength</name>\r
+          <state>80</state>\r
+        </option>\r
+        <option>\r
+          <name>XIncludes</name>\r
+          <state>$TOOLKIT_DIR$\LIB\</state>\r
+        </option>\r
+        <option>\r
+          <name>ModuleStatus</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>XclOverride</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>XclFile</name>\r
+          <state>$TOOLKIT_DIR$\CONFIG\lnkCC430F6137.xcl</state>\r
+        </option>\r
+        <option>\r
+          <name>XclFileSlave</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>DoFill</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>FillerByte</name>\r
+          <state>0xFF</state>\r
+        </option>\r
+        <option>\r
+          <name>DoCrc</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CrcSize</name>\r
+          <version>0</version>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CrcAlgo</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CrcPoly</name>\r
+          <state>0x11021</state>\r
+        </option>\r
+        <option>\r
+          <name>CrcCompl</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>RangeCheckAlternatives</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>SuppressAllWarn</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>SuppressDiags</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>TreatAsWarn</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>TreatAsErr</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>ModuleLocalSym</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CrcBitOrder</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>XHardwareMul</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>IncludeSuppressed</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>ModuleSummary</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>XlinkStackSize</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>XlinkCodeModel</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>xcProgramEntryLabel</name>\r
+          <state>__program_start</state>\r
+        </option>\r
+        <option>\r
+          <name>DebugInformation</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>RuntimeControl</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>IoEmulation</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>XcRTLibraryFile</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OXLibIOConfig</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>XLibraryHeap</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>AllowExtraOutput</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>GenerateExtraOutput</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>XExtraOutOverride</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>ExtraOutputFile</name>\r
+          <state>ez430_chronos.a43</state>\r
+        </option>\r
+        <option>\r
+          <name>ExtraOutputFormat</name>\r
+          <version>11</version>\r
+          <state>23</state>\r
+        </option>\r
+        <option>\r
+          <name>ExtraFormatVariant</name>\r
+          <version>8</version>\r
+          <state>2</state>\r
+        </option>\r
+        <option>\r
+          <name>xcOverrideProgramEntryLabel</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>xcProgramEntryLabelSelect</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>ListOutputFormat</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>BufferedTermOutput</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>XExtraOptionsCheck</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>XExtraOptions</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>OverlaySystemMap</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>RawBinaryFile</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>RawBinarySymbol</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>RawBinarySegment</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>RawBinaryAlign</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>XLinkMisraHandler</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CrcAlign</name>\r
+          <state>2</state>\r
+        </option>\r
+        <option>\r
+          <name>CrcInitialValue</name>\r
+          <state>0x0</state>\r
+        </option>\r
+        <option>\r
+          <name>XLibraryHeap20</name>\r
+          <state>1</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>XAR</name>\r
+      <archiveVersion>4</archiveVersion>\r
+      <data>\r
+        <version>0</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>XAROutOverride</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>XARInputs</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>OutputFile</name>\r
+          <state></state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>BILINK</name>\r
+      <archiveVersion>0</archiveVersion>\r
+      <data/>\r
+    </settings>\r
+  </configuration>\r
+  <configuration>\r
+    <name>868MHz - Unrestricted IAR Workbench (Europe)</name>\r
+    <toolchain>\r
+      <name>MSP430</name>\r
+    </toolchain>\r
+    <debug>1</debug>\r
+    <settings>\r
+      <name>General</name>\r
+      <archiveVersion>7</archiveVersion>\r
+      <data>\r
+        <version>27</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>ExePath</name>\r
+          <state>868MHz - Unrestricted IAR Workbench (Europe)\Exe</state>\r
+        </option>\r
+        <option>\r
+          <name>ObjPath</name>\r
+          <state>868MHz - Unrestricted IAR Workbench (Europe)\Obj</state>\r
+        </option>\r
+        <option>\r
+          <name>ListPath</name>\r
+          <state>868MHz - Unrestricted IAR Workbench (Europe)\List</state>\r
+        </option>\r
+        <option>\r
+          <name>PosIndCode</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Hardware Multiplier</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>GOutputBinary</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AssemblerOnly</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OGDouble</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>GRuntimeLibSelect</name>\r
+          <version>0</version>\r
+          <state>2</state>\r
+        </option>\r
+        <option>\r
+          <name>RTDescription</name>\r
+          <state>Use the full configuration of the C/EC++ runtime library. Full locale interface, C locale, file descriptor support, multibytes in printf and scanf, and hex floats in strtod.</state>\r
+        </option>\r
+        <option>\r
+          <name>RTConfigPath</name>\r
+          <state>$TOOLKIT_DIR$\LIB\DLIB\dl430xsff.h</state>\r
+        </option>\r
+        <option>\r
+          <name>RTLibraryPath</name>\r
+          <state>$TOOLKIT_DIR$\LIB\DLIB\dl430xsff.r43</state>\r
+        </option>\r
+        <option>\r
+          <name>Input variant</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Input description</name>\r
+          <state>Full formatting.</state>\r
+        </option>\r
+        <option>\r
+          <name>Output variant</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Output description</name>\r
+          <state>Full formatting.</state>\r
+        </option>\r
+        <option>\r
+          <name>GRuntimeLibSelectSlave</name>\r
+          <version>0</version>\r
+          <state>2</state>\r
+        </option>\r
+        <option>\r
+          <name>OGCore</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>GeneralEnableMisra</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>GeneralMisraVerbose</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OGChipSelectMenu</name>\r
+          <state>CC430F6137    CC430F6137</state>\r
+        </option>\r
+        <option>\r
+          <name>GStackHeapOverride</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>GStackSize2</name>\r
+          <state>120</state>\r
+        </option>\r
+        <option>\r
+          <name>GHeapSize2</name>\r
+          <state>120</state>\r
+        </option>\r
+        <option>\r
+          <name>RadioDataModelType</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>GHeap20Size</name>\r
+          <state>80</state>\r
+        </option>\r
+        <option>\r
+          <name>GeneralMisraRules98</name>\r
+          <version>0</version>\r
+          <state>1000111110110101101110011100111111101110011011000101110111101101100111111111111100110011111001110111001111111111111111111111111</state>\r
+        </option>\r
+        <option>\r
+          <name>RadioHeapSizeType</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>RadioHardwareMultiplierType</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>GeneralMisraVer</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>GeneralMisraRules04</name>\r
+          <version>0</version>\r
+          <state>111101110010111111111000110111111111111111111111111110010111101111010101111111111111111111111111101111111011111001111011111011111111111111111</state>\r
+        </option>\r
+        <option>\r
+          <name>RadioL092ModelType</name>\r
+          <state>0</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>ICC430</name>\r
+      <archiveVersion>4</archiveVersion>\r
+      <data>\r
+        <version>30</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>CCDefines</name>\r
+          <state>ISM_EU</state>\r
+          <state>MRFI_CC430</state>\r
+          <state>__CC430F6137__</state>\r
+        </option>\r
+        <option>\r
+          <name>CCPreprocFile</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCPreprocComments</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCPreprocLine</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCListCFile</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCListCMnemonics</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCListCMessages</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCListAssFile</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCListAssSource</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCEnableRemarks</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCDiagSuppress</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>CCDiagRemark</name>\r
+          <state>Pa082</state>\r
+        </option>\r
+        <option>\r
+          <name>CCDiagWarning</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>CCDiagError</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>IObjPrefix2</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CCRequirePrototypes</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCAllowList</name>\r
+          <version>1</version>\r
+          <state>11111</state>\r
+        </option>\r
+        <option>\r
+          <name>CCObjUseModuleName</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCObjModuleName</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>CCDebugInfo</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>IProcessor</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCDiagWarnAreErr</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCCharIs</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CCExt</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCMultibyteSupport</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCMigrationPreprocExtentions</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCCompilerRuntimeInfo</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>IDoubleSize</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OutputFile</name>\r
+          <state>$FILE_BNAME$.r43</state>\r
+        </option>\r
+        <option>\r
+          <name>CCLibConfigHeader</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OCCR4Utilize</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OCCR5Utilize</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CPIC</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>IExtraOptionsCheck</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>IExtraOptions</name>\r
+          <state>-f"$PROJ_DIR$\simpliciti\Applications\configuration\End Device\smpl_config.dat"</state>\r
+          <state>-f"$PROJ_DIR$\simpliciti\Applications\configuration\smpl_nwk_config.dat"</state>\r
+        </option>\r
+        <option>\r
+          <name>PreInclude</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>CCOverrideModuleTypeDefault</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCRadioModuleType</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCRadioModuleTypeSlave</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>newCCIncludePaths</name>\r
+          <state>$PROJ_DIR$\</state>\r
+          <state>$PROJ_DIR$\include\</state>\r
+          <state>$PROJ_DIR$\driver\</state>\r
+          <state>$PROJ_DIR$\logic\</state>\r
+          <state>$PROJ_DIR$\bluerobin\</state>\r
+          <state>$PROJ_DIR$\simpliciti\</state>\r
+          <state>$PROJ_DIR$\bluerobin\code</state>\r
+          <state>$PROJ_DIR$\bluerobin\lib</state>\r
+          <state>$PROJ_DIR$\bluerobin\lib\br_rx</state>\r
+          <state>$PROJ_DIR$\simpliciti\Components\bsp</state>\r
+          <state>$PROJ_DIR$\simpliciti\Components\bsp\drivers</state>\r
+          <state>$PROJ_DIR$\simpliciti\Components\bsp\boards\CC430EM</state>\r
+          <state>$PROJ_DIR$\simpliciti\Components\mrfi</state>\r
+          <state>$PROJ_DIR$\simpliciti\Components\nwk</state>\r
+          <state>$PROJ_DIR$\simpliciti\Components\nwk_applications</state>\r
+        </option>\r
+        <option>\r
+          <name>CCStdIncCheck</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CompilerMisraOverride</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OI430X</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>ReduceStack</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Save20bit</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CompilerDataModel</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CCOptLevel</name>\r
+          <state>3</state>\r
+        </option>\r
+        <option>\r
+          <name>CCOptStrategy</name>\r
+          <version>0</version>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CCOptLevelSlave</name>\r
+          <state>3</state>\r
+        </option>\r
+        <option>\r
+          <name>CInput</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CompilerMisraRules98</name>\r
+          <version>0</version>\r
+          <state>1000111110110101101110011100111111101110011011000101110111101101100111111111111100110011111001110111001111111111111111111111111</state>\r
+        </option>\r
+        <option>\r
+          <name>CompilerMisraRules04</name>\r
+          <version>0</version>\r
+          <state>111101110010111111111000110111111111111111111111111110010111101111010101111111111111111111111111101111111011111001111011111011111111111111111</state>\r
+        </option>\r
+        <option>\r
+          <name>IccLang</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>IccCDialect</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>IccAllowVLA</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>IccCppDialect</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>IccRelaxedFpPrecision</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCPUTAG</name>\r
+          <state>1</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>A430</name>\r
+      <archiveVersion>4</archiveVersion>\r
+      <data>\r
+        <version>13</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>AObjPrefix</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>ACaseSensitivity</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>MacroChars</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AWarnEnable</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AWarnWhat</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AWarnOne</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>AWarnRange1</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>AWarnRange2</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>ADefines</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>AList</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AListHeader</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>AListing</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Includes</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>MacDefs</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>MacExps</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>MacExec</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OnlyAssed</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>MultiLine</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>PageLengthCheck</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>PageLength</name>\r
+          <state>80</state>\r
+        </option>\r
+        <option>\r
+          <name>TabSpacing</name>\r
+          <state>8</state>\r
+        </option>\r
+        <option>\r
+          <name>AXRef</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AXRefDefines</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AXRefInternal</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AXRefDual</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>ADebug</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>ADebugType</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>IProcessor</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AMaxErrOn</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AMaxErrNum</name>\r
+          <state>100</state>\r
+        </option>\r
+        <option>\r
+          <name>OutputFile</name>\r
+          <state>$FILE_BNAME$.r43</state>\r
+        </option>\r
+        <option>\r
+          <name>AMultibyteSupport</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AExtraOptionsCheck</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AExtraOptions</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>OA1M</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>AIgnoreStdInclude</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AStdIncludes</name>\r
+          <state>$TOOLKIT_DIR$\INC\</state>\r
+        </option>\r
+        <option>\r
+          <name>AUserIncludes</name>\r
+          <state></state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>CUSTOM</name>\r
+      <archiveVersion>3</archiveVersion>\r
+      <data>\r
+        <extensions></extensions>\r
+        <cmdline></cmdline>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>BICOMP</name>\r
+      <archiveVersion>0</archiveVersion>\r
+      <data/>\r
+    </settings>\r
+    <settings>\r
+      <name>BUILDACTION</name>\r
+      <archiveVersion>1</archiveVersion>\r
+      <data>\r
+        <prebuild></prebuild>\r
+        <postbuild></postbuild>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>XLINK</name>\r
+      <archiveVersion>4</archiveVersion>\r
+      <data>\r
+        <version>22</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>XOutOverride</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OutputFile</name>\r
+          <state>ez430_chronos_868MHz.d43</state>\r
+        </option>\r
+        <option>\r
+          <name>OutputFormat</name>\r
+          <version>11</version>\r
+          <state>33</state>\r
+        </option>\r
+        <option>\r
+          <name>FormatVariant</name>\r
+          <version>8</version>\r
+          <state>2</state>\r
+        </option>\r
+        <option>\r
+          <name>SecondaryOutputFile</name>\r
+          <state>(None for the selected format)</state>\r
+        </option>\r
+        <option>\r
+          <name>XDefines</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>AlwaysOutput</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OverlapWarnings</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>NoGlobalCheck</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>XList</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>SegmentMap</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>ListSymbols</name>\r
+          <state>2</state>\r
+        </option>\r
+        <option>\r
+          <name>PageLengthCheck</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>PageLength</name>\r
+          <state>80</state>\r
+        </option>\r
+        <option>\r
+          <name>XIncludes</name>\r
+          <state>$TOOLKIT_DIR$\LIB\</state>\r
+        </option>\r
+        <option>\r
+          <name>ModuleStatus</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>XclOverride</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>XclFile</name>\r
+          <state>$TOOLKIT_DIR$\CONFIG\lnkCC430F6137.xcl</state>\r
+        </option>\r
+        <option>\r
+          <name>XclFileSlave</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>DoFill</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>FillerByte</name>\r
+          <state>0xFF</state>\r
+        </option>\r
+        <option>\r
+          <name>DoCrc</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CrcSize</name>\r
+          <version>0</version>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CrcAlgo</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CrcPoly</name>\r
+          <state>0x11021</state>\r
+        </option>\r
+        <option>\r
+          <name>CrcCompl</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>RangeCheckAlternatives</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>SuppressAllWarn</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>SuppressDiags</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>TreatAsWarn</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>TreatAsErr</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>ModuleLocalSym</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CrcBitOrder</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>XHardwareMul</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>IncludeSuppressed</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>ModuleSummary</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>XlinkStackSize</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>XlinkCodeModel</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>xcProgramEntryLabel</name>\r
+          <state>__program_start</state>\r
+        </option>\r
+        <option>\r
+          <name>DebugInformation</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>RuntimeControl</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>IoEmulation</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>XcRTLibraryFile</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OXLibIOConfig</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>XLibraryHeap</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>AllowExtraOutput</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>GenerateExtraOutput</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>XExtraOutOverride</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>ExtraOutputFile</name>\r
+          <state>ez430_chronos.a43</state>\r
+        </option>\r
+        <option>\r
+          <name>ExtraOutputFormat</name>\r
+          <version>11</version>\r
+          <state>23</state>\r
+        </option>\r
+        <option>\r
+          <name>ExtraFormatVariant</name>\r
+          <version>8</version>\r
+          <state>2</state>\r
+        </option>\r
+        <option>\r
+          <name>xcOverrideProgramEntryLabel</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>xcProgramEntryLabelSelect</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>ListOutputFormat</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>BufferedTermOutput</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>XExtraOptionsCheck</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>XExtraOptions</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>OverlaySystemMap</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>RawBinaryFile</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>RawBinarySymbol</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>RawBinarySegment</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>RawBinaryAlign</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>XLinkMisraHandler</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CrcAlign</name>\r
+          <state>2</state>\r
+        </option>\r
+        <option>\r
+          <name>CrcInitialValue</name>\r
+          <state>0x0</state>\r
+        </option>\r
+        <option>\r
+          <name>XLibraryHeap20</name>\r
+          <state>1</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>XAR</name>\r
+      <archiveVersion>4</archiveVersion>\r
+      <data>\r
+        <version>0</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>XAROutOverride</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>XARInputs</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>OutputFile</name>\r
+          <state>ez430_chronos.r43</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>BILINK</name>\r
+      <archiveVersion>0</archiveVersion>\r
+      <data/>\r
+    </settings>\r
+  </configuration>\r
+  <configuration>\r
+    <name>433MHz - Unrestricted IAR Workbench (Other regions)</name>\r
+    <toolchain>\r
+      <name>MSP430</name>\r
+    </toolchain>\r
+    <debug>1</debug>\r
+    <settings>\r
+      <name>General</name>\r
+      <archiveVersion>7</archiveVersion>\r
+      <data>\r
+        <version>27</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>ExePath</name>\r
+          <state>433MHz - Unrestricted IAR Workbench (Other regions)\Exe</state>\r
+        </option>\r
+        <option>\r
+          <name>ObjPath</name>\r
+          <state>433MHz - Unrestricted IAR Workbench (Other regions)\Obj</state>\r
+        </option>\r
+        <option>\r
+          <name>ListPath</name>\r
+          <state>433MHz - Unrestricted IAR Workbench (Other regions)\List</state>\r
+        </option>\r
+        <option>\r
+          <name>PosIndCode</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Hardware Multiplier</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>GOutputBinary</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AssemblerOnly</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OGDouble</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>GRuntimeLibSelect</name>\r
+          <version>0</version>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>RTDescription</name>\r
+          <state>Use the normal configuration of the C/EC++ runtime library. No locale interface, C locale, no file descriptor support, no multibytes in printf and scanf, and no hex floats in strtod.</state>\r
+        </option>\r
+        <option>\r
+          <name>RTConfigPath</name>\r
+          <state>$TOOLKIT_DIR$\LIB\DLIB\dl430xsfn.h</state>\r
+        </option>\r
+        <option>\r
+          <name>RTLibraryPath</name>\r
+          <state>$TOOLKIT_DIR$\LIB\DLIB\dl430xsfn.r43</state>\r
+        </option>\r
+        <option>\r
+          <name>Input variant</name>\r
+          <version>0</version>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Input description</name>\r
+          <state>No specifier n, no float or long long.</state>\r
+        </option>\r
+        <option>\r
+          <name>Output variant</name>\r
+          <version>0</version>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Output description</name>\r
+          <state>No specifier a or A.</state>\r
+        </option>\r
+        <option>\r
+          <name>GRuntimeLibSelectSlave</name>\r
+          <version>0</version>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OGCore</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>GeneralEnableMisra</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>GeneralMisraVerbose</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OGChipSelectMenu</name>\r
+          <state>CC430F6137    CC430F6137</state>\r
+        </option>\r
+        <option>\r
+          <name>GStackHeapOverride</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>GStackSize2</name>\r
+          <state>80</state>\r
+        </option>\r
+        <option>\r
+          <name>GHeapSize2</name>\r
+          <state>80</state>\r
+        </option>\r
+        <option>\r
+          <name>RadioDataModelType</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>GHeap20Size</name>\r
+          <state>80</state>\r
+        </option>\r
+        <option>\r
+          <name>GeneralMisraRules98</name>\r
+          <version>0</version>\r
+          <state>1000111110110101101110011100111111101110011011000101110111101101100111111111111100110011111001110111001111111111111111111111111</state>\r
+        </option>\r
+        <option>\r
+          <name>RadioHeapSizeType</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>RadioHardwareMultiplierType</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>GeneralMisraVer</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>GeneralMisraRules04</name>\r
+          <version>0</version>\r
+          <state>111101110010111111111000110111111111111111111111111110010111101111010101111111111111111111111111101111111011111001111011111011111111111111111</state>\r
+        </option>\r
+        <option>\r
+          <name>RadioL092ModelType</name>\r
+          <state>0</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>ICC430</name>\r
+      <archiveVersion>4</archiveVersion>\r
+      <data>\r
+        <version>30</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>CCDefines</name>\r
+          <state>ISM_LF</state>\r
+          <state>MRFI_CC430</state>\r
+          <state>__CC430F6137__</state>\r
+        </option>\r
+        <option>\r
+          <name>CCPreprocFile</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCPreprocComments</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCPreprocLine</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCListCFile</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCListCMnemonics</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCListCMessages</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCListAssFile</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCListAssSource</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCEnableRemarks</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCDiagSuppress</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>CCDiagRemark</name>\r
+          <state>Pa082</state>\r
+        </option>\r
+        <option>\r
+          <name>CCDiagWarning</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>CCDiagError</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>IObjPrefix2</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CCRequirePrototypes</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCAllowList</name>\r
+          <version>1</version>\r
+          <state>11111</state>\r
+        </option>\r
+        <option>\r
+          <name>CCObjUseModuleName</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCObjModuleName</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>CCDebugInfo</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>IProcessor</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCDiagWarnAreErr</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCCharIs</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CCExt</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCMultibyteSupport</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCMigrationPreprocExtentions</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCCompilerRuntimeInfo</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>IDoubleSize</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OutputFile</name>\r
+          <state>$FILE_BNAME$.r43</state>\r
+        </option>\r
+        <option>\r
+          <name>CCLibConfigHeader</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OCCR4Utilize</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OCCR5Utilize</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CPIC</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>IExtraOptionsCheck</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>IExtraOptions</name>\r
+          <state>-f"$PROJ_DIR$\simpliciti\Applications\configuration\End Device\smpl_config.dat"</state>\r
+          <state>-f"$PROJ_DIR$\simpliciti\Applications\configuration\smpl_nwk_config.dat"</state>\r
+        </option>\r
+        <option>\r
+          <name>PreInclude</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>CCOverrideModuleTypeDefault</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCRadioModuleType</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCRadioModuleTypeSlave</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>newCCIncludePaths</name>\r
+          <state>$PROJ_DIR$\</state>\r
+          <state>$PROJ_DIR$\include\</state>\r
+          <state>$PROJ_DIR$\driver\</state>\r
+          <state>$PROJ_DIR$\logic\</state>\r
+          <state>$PROJ_DIR$\bluerobin\</state>\r
+          <state>$PROJ_DIR$\simpliciti\</state>\r
+          <state>$PROJ_DIR$\bluerobin\code</state>\r
+          <state>$PROJ_DIR$\bluerobin\lib</state>\r
+          <state>$PROJ_DIR$\bluerobin\lib\br_rx</state>\r
+          <state>$PROJ_DIR$\simpliciti\Components\bsp</state>\r
+          <state>$PROJ_DIR$\simpliciti\Components\bsp\drivers</state>\r
+          <state>$PROJ_DIR$\simpliciti\Components\bsp\boards\CC430EM</state>\r
+          <state>$PROJ_DIR$\simpliciti\Components\mrfi</state>\r
+          <state>$PROJ_DIR$\simpliciti\Components\nwk</state>\r
+          <state>$PROJ_DIR$\simpliciti\Components\nwk_applications</state>\r
+        </option>\r
+        <option>\r
+          <name>CCStdIncCheck</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CompilerMisraOverride</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OI430X</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>ReduceStack</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Save20bit</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CompilerDataModel</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CCOptLevel</name>\r
+          <state>3</state>\r
+        </option>\r
+        <option>\r
+          <name>CCOptStrategy</name>\r
+          <version>0</version>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CCOptLevelSlave</name>\r
+          <state>3</state>\r
+        </option>\r
+        <option>\r
+          <name>CInput</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CompilerMisraRules98</name>\r
+          <version>0</version>\r
+          <state>1000111110110101101110011100111111101110011011000101110111101101100111111111111100110011111001110111001111111111111111111111111</state>\r
+        </option>\r
+        <option>\r
+          <name>CompilerMisraRules04</name>\r
+          <version>0</version>\r
+          <state>111101110010111111111000110111111111111111111111111110010111101111010101111111111111111111111111101111111011111001111011111011111111111111111</state>\r
+        </option>\r
+        <option>\r
+          <name>IccLang</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>IccCDialect</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>IccAllowVLA</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>IccCppDialect</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>IccRelaxedFpPrecision</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCPUTAG</name>\r
+          <state>1</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>A430</name>\r
+      <archiveVersion>4</archiveVersion>\r
+      <data>\r
+        <version>13</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>AObjPrefix</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>ACaseSensitivity</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>MacroChars</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AWarnEnable</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AWarnWhat</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AWarnOne</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>AWarnRange1</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>AWarnRange2</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>ADefines</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>AList</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AListHeader</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>AListing</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Includes</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>MacDefs</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>MacExps</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>MacExec</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OnlyAssed</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>MultiLine</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>PageLengthCheck</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>PageLength</name>\r
+          <state>80</state>\r
+        </option>\r
+        <option>\r
+          <name>TabSpacing</name>\r
+          <state>8</state>\r
+        </option>\r
+        <option>\r
+          <name>AXRef</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AXRefDefines</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AXRefInternal</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AXRefDual</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>ADebug</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>ADebugType</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>IProcessor</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AMaxErrOn</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AMaxErrNum</name>\r
+          <state>100</state>\r
+        </option>\r
+        <option>\r
+          <name>OutputFile</name>\r
+          <state>$FILE_BNAME$.r43</state>\r
+        </option>\r
+        <option>\r
+          <name>AMultibyteSupport</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AExtraOptionsCheck</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AExtraOptions</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>OA1M</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>AIgnoreStdInclude</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AStdIncludes</name>\r
+          <state>$TOOLKIT_DIR$\INC\</state>\r
+        </option>\r
+        <option>\r
+          <name>AUserIncludes</name>\r
+          <state></state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>CUSTOM</name>\r
+      <archiveVersion>3</archiveVersion>\r
+      <data>\r
+        <extensions></extensions>\r
+        <cmdline></cmdline>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>BICOMP</name>\r
+      <archiveVersion>0</archiveVersion>\r
+      <data/>\r
+    </settings>\r
+    <settings>\r
+      <name>BUILDACTION</name>\r
+      <archiveVersion>1</archiveVersion>\r
+      <data>\r
+        <prebuild></prebuild>\r
+        <postbuild></postbuild>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>XLINK</name>\r
+      <archiveVersion>4</archiveVersion>\r
+      <data>\r
+        <version>22</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>XOutOverride</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OutputFile</name>\r
+          <state>ez430_chronos_433MHz.d43</state>\r
+        </option>\r
+        <option>\r
+          <name>OutputFormat</name>\r
+          <version>11</version>\r
+          <state>33</state>\r
+        </option>\r
+        <option>\r
+          <name>FormatVariant</name>\r
+          <version>8</version>\r
+          <state>2</state>\r
+        </option>\r
+        <option>\r
+          <name>SecondaryOutputFile</name>\r
+          <state>(None for the selected format)</state>\r
+        </option>\r
+        <option>\r
+          <name>XDefines</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>AlwaysOutput</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OverlapWarnings</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>NoGlobalCheck</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>XList</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>SegmentMap</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>ListSymbols</name>\r
+          <state>2</state>\r
+        </option>\r
+        <option>\r
+          <name>PageLengthCheck</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>PageLength</name>\r
+          <state>80</state>\r
+        </option>\r
+        <option>\r
+          <name>XIncludes</name>\r
+          <state>$TOOLKIT_DIR$\LIB\</state>\r
+        </option>\r
+        <option>\r
+          <name>ModuleStatus</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>XclOverride</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>XclFile</name>\r
+          <state>$TOOLKIT_DIR$\CONFIG\lnkCC430F6137.xcl</state>\r
+        </option>\r
+        <option>\r
+          <name>XclFileSlave</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>DoFill</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>FillerByte</name>\r
+          <state>0xFF</state>\r
+        </option>\r
+        <option>\r
+          <name>DoCrc</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CrcSize</name>\r
+          <version>0</version>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CrcAlgo</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CrcPoly</name>\r
+          <state>0x11021</state>\r
+        </option>\r
+        <option>\r
+          <name>CrcCompl</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>RangeCheckAlternatives</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>SuppressAllWarn</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>SuppressDiags</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>TreatAsWarn</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>TreatAsErr</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>ModuleLocalSym</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CrcBitOrder</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>XHardwareMul</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>IncludeSuppressed</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>ModuleSummary</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>XlinkStackSize</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>XlinkCodeModel</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>xcProgramEntryLabel</name>\r
+          <state>__program_start</state>\r
+        </option>\r
+        <option>\r
+          <name>DebugInformation</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>RuntimeControl</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>IoEmulation</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>XcRTLibraryFile</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OXLibIOConfig</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>XLibraryHeap</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>AllowExtraOutput</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>GenerateExtraOutput</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>XExtraOutOverride</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>ExtraOutputFile</name>\r
+          <state>ez430_chronos.a43</state>\r
+        </option>\r
+        <option>\r
+          <name>ExtraOutputFormat</name>\r
+          <version>11</version>\r
+          <state>23</state>\r
+        </option>\r
+        <option>\r
+          <name>ExtraFormatVariant</name>\r
+          <version>8</version>\r
+          <state>2</state>\r
+        </option>\r
+        <option>\r
+          <name>xcOverrideProgramEntryLabel</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>xcProgramEntryLabelSelect</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>ListOutputFormat</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>BufferedTermOutput</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>XExtraOptionsCheck</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>XExtraOptions</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>OverlaySystemMap</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>RawBinaryFile</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>RawBinarySymbol</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>RawBinarySegment</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>RawBinaryAlign</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>XLinkMisraHandler</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CrcAlign</name>\r
+          <state>2</state>\r
+        </option>\r
+        <option>\r
+          <name>CrcInitialValue</name>\r
+          <state>0x0</state>\r
+        </option>\r
+        <option>\r
+          <name>XLibraryHeap20</name>\r
+          <state>1</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>XAR</name>\r
+      <archiveVersion>4</archiveVersion>\r
+      <data>\r
+        <version>0</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>XAROutOverride</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>XARInputs</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>OutputFile</name>\r
+          <state></state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>BILINK</name>\r
+      <archiveVersion>0</archiveVersion>\r
+      <data/>\r
+    </settings>\r
+  </configuration>\r
+  <group>\r
+    <name>bluerobin</name>\r
+    <file>\r
+      <name>$PROJ_DIR$\bluerobin\BlueRobin_RX_433MHz.r43</name>\r
+      <excluded>\r
+        <configuration>915MHz - Limited IAR Kickstart (USA)</configuration>\r
+        <configuration>868MHz - Limited IAR Kickstart (Europe)</configuration>\r
+        <configuration>915MHz - Unrestricted IAR Workbench (USA)</configuration>\r
+        <configuration>868MHz - Unrestricted IAR Workbench (Europe)</configuration>\r
+      </excluded>\r
+    </file>\r
+    <file>\r
+      <name>$PROJ_DIR$\bluerobin\BlueRobin_RX_868MHz.r43</name>\r
+      <excluded>\r
+        <configuration>915MHz - Limited IAR Kickstart (USA)</configuration>\r
+        <configuration>433MHz - Limited IAR Kickstart (Other regions)</configuration>\r
+        <configuration>915MHz - Unrestricted IAR Workbench (USA)</configuration>\r
+        <configuration>433MHz - Unrestricted IAR Workbench (Other regions)</configuration>\r
+      </excluded>\r
+    </file>\r
+    <file>\r
+      <name>$PROJ_DIR$\bluerobin\BlueRobin_RX_915MHz.r43</name>\r
+      <excluded>\r
+        <configuration>868MHz - Limited IAR Kickstart (Europe)</configuration>\r
+        <configuration>433MHz - Limited IAR Kickstart (Other regions)</configuration>\r
+        <configuration>868MHz - Unrestricted IAR Workbench (Europe)</configuration>\r
+        <configuration>433MHz - Unrestricted IAR Workbench (Other regions)</configuration>\r
+      </excluded>\r
+    </file>\r
+    <file>\r
+      <name>$PROJ_DIR$\bluerobin\BlueRobin_RX_API.h</name>\r
+    </file>\r
+    <file>\r
+      <name>$PROJ_DIR$\bluerobin\bm.h</name>\r
+    </file>\r
+  </group>\r
+  <group>\r
+    <name>driver</name>\r
+    <file>\r
+      <name>$PROJ_DIR$\driver\adc12.c</name>\r
+      <excluded>\r
+        <configuration>915MHz - Limited IAR Kickstart (USA)</configuration>\r
+        <configuration>868MHz - Limited IAR Kickstart (Europe)</configuration>\r
+        <configuration>433MHz - Limited IAR Kickstart (Other regions)</configuration>\r
+      </excluded>\r
+    </file>\r
+    <file>\r
+      <name>$PROJ_DIR$\driver\adc12.h</name>\r
+    </file>\r
+    <file>\r
+      <name>$PROJ_DIR$\driver\buzzer.c</name>\r
+      <excluded>\r
+        <configuration>915MHz - Limited IAR Kickstart (USA)</configuration>\r
+        <configuration>868MHz - Limited IAR Kickstart (Europe)</configuration>\r
+        <configuration>433MHz - Limited IAR Kickstart (Other regions)</configuration>\r
+      </excluded>\r
+    </file>\r
+    <file>\r
+      <name>$PROJ_DIR$\driver\buzzer.h</name>\r
+    </file>\r
+    <file>\r
+      <name>$PROJ_DIR$\driver\display.c</name>\r
+      <excluded>\r
+        <configuration>915MHz - Limited IAR Kickstart (USA)</configuration>\r
+        <configuration>868MHz - Limited IAR Kickstart (Europe)</configuration>\r
+        <configuration>433MHz - Limited IAR Kickstart (Other regions)</configuration>\r
+      </excluded>\r
+    </file>\r
+    <file>\r
+      <name>$PROJ_DIR$\driver\display.h</name>\r
+    </file>\r
+    <file>\r
+      <name>$PROJ_DIR$\driver\ez430_chronos_drivers.r43</name>\r
+      <excluded>\r
+        <configuration>915MHz - Unrestricted IAR Workbench (USA)</configuration>\r
+        <configuration>868MHz - Unrestricted IAR Workbench (Europe)</configuration>\r
+        <configuration>433MHz - Unrestricted IAR Workbench (Other regions)</configuration>\r
+      </excluded>\r
+    </file>\r
+    <file>\r
+      <name>$PROJ_DIR$\driver\pmm.c</name>\r
+      <excluded>\r
+        <configuration>915MHz - Limited IAR Kickstart (USA)</configuration>\r
+        <configuration>868MHz - Limited IAR Kickstart (Europe)</configuration>\r
+        <configuration>433MHz - Limited IAR Kickstart (Other regions)</configuration>\r
+      </excluded>\r
+    </file>\r
+    <file>\r
+      <name>$PROJ_DIR$\driver\pmm.h</name>\r
+    </file>\r
+    <file>\r
+      <name>$PROJ_DIR$\driver\ports.c</name>\r
+    </file>\r
+    <file>\r
+      <name>$PROJ_DIR$\driver\ports.h</name>\r
+    </file>\r
+    <file>\r
+      <name>$PROJ_DIR$\driver\radio.c</name>\r
+      <excluded>\r
+        <configuration>915MHz - Limited IAR Kickstart (USA)</configuration>\r
+        <configuration>868MHz - Limited IAR Kickstart (Europe)</configuration>\r
+        <configuration>433MHz - Limited IAR Kickstart (Other regions)</configuration>\r
+      </excluded>\r
+    </file>\r
+    <file>\r
+      <name>$PROJ_DIR$\driver\radio.h</name>\r
+    </file>\r
+    <file>\r
+      <name>$PROJ_DIR$\driver\rf1a.c</name>\r
+      <excluded>\r
+        <configuration>915MHz - Limited IAR Kickstart (USA)</configuration>\r
+        <configuration>868MHz - Limited IAR Kickstart (Europe)</configuration>\r
+        <configuration>433MHz - Limited IAR Kickstart (Other regions)</configuration>\r
+      </excluded>\r
+    </file>\r
+    <file>\r
+      <name>$PROJ_DIR$\driver\rf1a.h</name>\r
+    </file>\r
+    <file>\r
+      <name>$PROJ_DIR$\driver\timer.c</name>\r
+    </file>\r
+    <file>\r
+      <name>$PROJ_DIR$\driver\timer.h</name>\r
+    </file>\r
+    <file>\r
+      <name>$PROJ_DIR$\driver\vti_as.c</name>\r
+      <excluded>\r
+        <configuration>915MHz - Limited IAR Kickstart (USA)</configuration>\r
+        <configuration>868MHz - Limited IAR Kickstart (Europe)</configuration>\r
+        <configuration>433MHz - Limited IAR Kickstart (Other regions)</configuration>\r
+      </excluded>\r
+    </file>\r
+    <file>\r
+      <name>$PROJ_DIR$\driver\vti_as.h</name>\r
+    </file>\r
+    <file>\r
+      <name>$PROJ_DIR$\driver\vti_ps.c</name>\r
+      <excluded>\r
+        <configuration>915MHz - Limited IAR Kickstart (USA)</configuration>\r
+        <configuration>868MHz - Limited IAR Kickstart (Europe)</configuration>\r
+        <configuration>433MHz - Limited IAR Kickstart (Other regions)</configuration>\r
+      </excluded>\r
+    </file>\r
+    <file>\r
+      <name>$PROJ_DIR$\driver\vti_ps.h</name>\r
+    </file>\r
+  </group>\r
+  <group>\r
+    <name>include</name>\r
+    <file>\r
+      <name>$PROJ_DIR$\include\project.h</name>\r
+    </file>\r
+  </group>\r
+  <group>\r
+    <name>logic</name>\r
+    <file>\r
+      <name>$PROJ_DIR$\logic\acceleration.c</name>\r
+    </file>\r
+    <file>\r
+      <name>$PROJ_DIR$\logic\acceleration.h</name>\r
+    </file>\r
+    <file>\r
+      <name>$PROJ_DIR$\logic\alarm.c</name>\r
+    </file>\r
+    <file>\r
+      <name>$PROJ_DIR$\logic\alarm.h</name>\r
+    </file>\r
+    <file>\r
+      <name>$PROJ_DIR$\logic\altitude.c</name>\r
+    </file>\r
+    <file>\r
+      <name>$PROJ_DIR$\logic\altitude.h</name>\r
+    </file>\r
+    <file>\r
+      <name>$PROJ_DIR$\logic\battery.c</name>\r
+    </file>\r
+    <file>\r
+      <name>$PROJ_DIR$\logic\battery.h</name>\r
+    </file>\r
+    <file>\r
+      <name>$PROJ_DIR$\logic\bluerobin.c</name>\r
+    </file>\r
+    <file>\r
+      <name>$PROJ_DIR$\logic\bluerobin.h</name>\r
+    </file>\r
+    <file>\r
+      <name>$PROJ_DIR$\logic\clock.c</name>\r
+    </file>\r
+    <file>\r
+      <name>$PROJ_DIR$\logic\clock.h</name>\r
+    </file>\r
+    <file>\r
+      <name>$PROJ_DIR$\logic\date.c</name>\r
+    </file>\r
+    <file>\r
+      <name>$PROJ_DIR$\logic\date.h</name>\r
+    </file>\r
+    <file>\r
+      <name>$PROJ_DIR$\logic\menu.c</name>\r
+    </file>\r
+    <file>\r
+      <name>$PROJ_DIR$\logic\menu.h</name>\r
+    </file>\r
+    <file>\r
+      <name>$PROJ_DIR$\logic\rfbsl.c</name>\r
+    </file>\r
+    <file>\r
+      <name>$PROJ_DIR$\logic\rfbsl.h</name>\r
+    </file>\r
+    <file>\r
+      <name>$PROJ_DIR$\logic\rfsimpliciti.c</name>\r
+    </file>\r
+    <file>\r
+      <name>$PROJ_DIR$\logic\rfsimpliciti.h</name>\r
+    </file>\r
+    <file>\r
+      <name>$PROJ_DIR$\logic\stopwatch.c</name>\r
+    </file>\r
+    <file>\r
+      <name>$PROJ_DIR$\logic\stopwatch.h</name>\r
+    </file>\r
+    <file>\r
+      <name>$PROJ_DIR$\logic\temperature.c</name>\r
+    </file>\r
+    <file>\r
+      <name>$PROJ_DIR$\logic\temperature.h</name>\r
+    </file>\r
+    <file>\r
+      <name>$PROJ_DIR$\logic\test.c</name>\r
+    </file>\r
+    <file>\r
+      <name>$PROJ_DIR$\logic\test.h</name>\r
+    </file>\r
+    <file>\r
+      <name>$PROJ_DIR$\logic\user.c</name>\r
+    </file>\r
+    <file>\r
+      <name>$PROJ_DIR$\logic\user.h</name>\r
+    </file>\r
+  </group>\r
+  <group>\r
+    <name>simpliciti</name>\r
+    <group>\r
+      <name>Applications</name>\r
+      <group>\r
+        <name>application</name>\r
+        <group>\r
+          <name>End Device</name>\r
+          <file>\r
+            <name>$PROJ_DIR$\simpliciti\Applications\application\End Device\main_ED_BM.c</name>\r
+            <excluded>\r
+              <configuration>915MHz - Limited IAR Kickstart (USA)</configuration>\r
+              <configuration>868MHz - Limited IAR Kickstart (Europe)</configuration>\r
+              <configuration>433MHz - Limited IAR Kickstart (Other regions)</configuration>\r
+            </excluded>\r
+          </file>\r
+        </group>\r
+      </group>\r
+      <group>\r
+        <name>configuration</name>\r
+        <group>\r
+          <name>End Device</name>\r
+          <file>\r
+            <name>$PROJ_DIR$\simpliciti\Applications\configuration\End Device\smpl_config.dat</name>\r
+          </file>\r
+        </group>\r
+        <file>\r
+          <name>$PROJ_DIR$\simpliciti\Applications\configuration\smpl_nwk_config.dat</name>\r
+        </file>\r
+      </group>\r
+    </group>\r
+    <group>\r
+      <name>Components</name>\r
+      <group>\r
+        <name>bsp</name>\r
+        <group>\r
+          <name>boards</name>\r
+          <group>\r
+            <name>CC430EM</name>\r
+            <group>\r
+              <name>bsp_external</name>\r
+              <file>\r
+                <name>$PROJ_DIR$\simpliciti\Components\bsp\boards\CC430EM\bsp_external\mrfi_board_defs.h</name>\r
+              </file>\r
+            </group>\r
+            <file>\r
+              <name>$PROJ_DIR$\simpliciti\Components\bsp\boards\CC430EM\bsp_board.c</name>\r
+              <excluded>\r
+                <configuration>915MHz - Limited IAR Kickstart (USA)</configuration>\r
+                <configuration>868MHz - Limited IAR Kickstart (Europe)</configuration>\r
+                <configuration>433MHz - Limited IAR Kickstart (Other regions)</configuration>\r
+                <configuration>915MHz - Unrestricted IAR Workbench (USA)</configuration>\r
+                <configuration>868MHz - Unrestricted IAR Workbench (Europe)</configuration>\r
+                <configuration>433MHz - Unrestricted IAR Workbench (Other regions)</configuration>\r
+              </excluded>\r
+            </file>\r
+            <file>\r
+              <name>$PROJ_DIR$\simpliciti\Components\bsp\boards\CC430EM\bsp_board_defs.h</name>\r
+            </file>\r
+            <file>\r
+              <name>$PROJ_DIR$\simpliciti\Components\bsp\boards\CC430EM\bsp_button_defs.h</name>\r
+            </file>\r
+            <file>\r
+              <name>$PROJ_DIR$\simpliciti\Components\bsp\boards\CC430EM\bsp_config.h</name>\r
+            </file>\r
+            <file>\r
+              <name>$PROJ_DIR$\simpliciti\Components\bsp\boards\CC430EM\bsp_driver_defs.h</name>\r
+            </file>\r
+            <file>\r
+              <name>$PROJ_DIR$\simpliciti\Components\bsp\boards\CC430EM\bsp_drivers.c</name>\r
+              <excluded>\r
+                <configuration>915MHz - Limited IAR Kickstart (USA)</configuration>\r
+                <configuration>868MHz - Limited IAR Kickstart (Europe)</configuration>\r
+                <configuration>433MHz - Limited IAR Kickstart (Other regions)</configuration>\r
+                <configuration>915MHz - Unrestricted IAR Workbench (USA)</configuration>\r
+                <configuration>868MHz - Unrestricted IAR Workbench (Europe)</configuration>\r
+                <configuration>433MHz - Unrestricted IAR Workbench (Other regions)</configuration>\r
+              </excluded>\r
+            </file>\r
+            <file>\r
+              <name>$PROJ_DIR$\simpliciti\Components\bsp\boards\CC430EM\bsp_led_defs.h</name>\r
+            </file>\r
+          </group>\r
+        </group>\r
+        <group>\r
+          <name>drivers</name>\r
+          <group>\r
+            <name>code</name>\r
+            <file>\r
+              <name>$PROJ_DIR$\simpliciti\Components\bsp\drivers\code\bsp_buttons.c</name>\r
+              <excluded>\r
+                <configuration>915MHz - Limited IAR Kickstart (USA)</configuration>\r
+                <configuration>868MHz - Limited IAR Kickstart (Europe)</configuration>\r
+                <configuration>433MHz - Limited IAR Kickstart (Other regions)</configuration>\r
+                <configuration>915MHz - Unrestricted IAR Workbench (USA)</configuration>\r
+                <configuration>868MHz - Unrestricted IAR Workbench (Europe)</configuration>\r
+                <configuration>433MHz - Unrestricted IAR Workbench (Other regions)</configuration>\r
+              </excluded>\r
+            </file>\r
+            <file>\r
+              <name>$PROJ_DIR$\simpliciti\Components\bsp\drivers\code\bsp_generic_buttons.h</name>\r
+            </file>\r
+            <file>\r
+              <name>$PROJ_DIR$\simpliciti\Components\bsp\drivers\code\bsp_generic_leds.h</name>\r
+            </file>\r
+            <file>\r
+              <name>$PROJ_DIR$\simpliciti\Components\bsp\drivers\code\bsp_leds.c</name>\r
+              <excluded>\r
+                <configuration>915MHz - Limited IAR Kickstart (USA)</configuration>\r
+                <configuration>868MHz - Limited IAR Kickstart (Europe)</configuration>\r
+                <configuration>433MHz - Limited IAR Kickstart (Other regions)</configuration>\r
+                <configuration>915MHz - Unrestricted IAR Workbench (USA)</configuration>\r
+                <configuration>868MHz - Unrestricted IAR Workbench (Europe)</configuration>\r
+                <configuration>433MHz - Unrestricted IAR Workbench (Other regions)</configuration>\r
+              </excluded>\r
+            </file>\r
+          </group>\r
+          <file>\r
+            <name>$PROJ_DIR$\simpliciti\Components\bsp\drivers\bsp_buttons.h</name>\r
+          </file>\r
+          <file>\r
+            <name>$PROJ_DIR$\simpliciti\Components\bsp\drivers\bsp_leds.h</name>\r
+          </file>\r
+        </group>\r
+        <group>\r
+          <name>mcus</name>\r
+          <file>\r
+            <name>$PROJ_DIR$\simpliciti\Components\bsp\mcus\bsp_msp430_defs.h</name>\r
+          </file>\r
+        </group>\r
+        <file>\r
+          <name>$PROJ_DIR$\simpliciti\Components\bsp\bsp.c</name>\r
+          <excluded>\r
+            <configuration>915MHz - Limited IAR Kickstart (USA)</configuration>\r
+            <configuration>868MHz - Limited IAR Kickstart (Europe)</configuration>\r
+            <configuration>433MHz - Limited IAR Kickstart (Other regions)</configuration>\r
+          </excluded>\r
+        </file>\r
+        <file>\r
+          <name>$PROJ_DIR$\simpliciti\Components\bsp\bsp.h</name>\r
+        </file>\r
+        <file>\r
+          <name>$PROJ_DIR$\simpliciti\Components\bsp\bsp_macros.h</name>\r
+        </file>\r
+      </group>\r
+      <group>\r
+        <name>mrfi</name>\r
+        <group>\r
+          <name>radios</name>\r
+          <group>\r
+            <name>family5</name>\r
+            <file>\r
+              <name>$PROJ_DIR$\simpliciti\Components\mrfi\radios\family5\mrfi_radio.c</name>\r
+              <excluded>\r
+                <configuration>915MHz - Limited IAR Kickstart (USA)</configuration>\r
+                <configuration>868MHz - Limited IAR Kickstart (Europe)</configuration>\r
+                <configuration>433MHz - Limited IAR Kickstart (Other regions)</configuration>\r
+                <configuration>915MHz - Unrestricted IAR Workbench (USA)</configuration>\r
+                <configuration>868MHz - Unrestricted IAR Workbench (Europe)</configuration>\r
+                <configuration>433MHz - Unrestricted IAR Workbench (Other regions)</configuration>\r
+              </excluded>\r
+            </file>\r
+            <file>\r
+              <name>$PROJ_DIR$\simpliciti\Components\mrfi\radios\family5\mrfi_radio_interface.c</name>\r
+              <excluded>\r
+                <configuration>915MHz - Limited IAR Kickstart (USA)</configuration>\r
+                <configuration>868MHz - Limited IAR Kickstart (Europe)</configuration>\r
+                <configuration>433MHz - Limited IAR Kickstart (Other regions)</configuration>\r
+                <configuration>915MHz - Unrestricted IAR Workbench (USA)</configuration>\r
+                <configuration>868MHz - Unrestricted IAR Workbench (Europe)</configuration>\r
+                <configuration>433MHz - Unrestricted IAR Workbench (Other regions)</configuration>\r
+              </excluded>\r
+            </file>\r
+            <file>\r
+              <name>$PROJ_DIR$\simpliciti\Components\mrfi\radios\family5\mrfi_radio_interface.h</name>\r
+            </file>\r
+          </group>\r
+        </group>\r
+        <group>\r
+          <name>smartrf</name>\r
+          <group>\r
+            <name>CC1101</name>\r
+            <file>\r
+              <name>$PROJ_DIR$\simpliciti\Components\mrfi\smartrf\CC1101\smartrf_CC1101.h</name>\r
+            </file>\r
+          </group>\r
+        </group>\r
+        <file>\r
+          <name>$PROJ_DIR$\simpliciti\Components\mrfi\mrfi.c</name>\r
+          <excluded>\r
+            <configuration>915MHz - Limited IAR Kickstart (USA)</configuration>\r
+            <configuration>868MHz - Limited IAR Kickstart (Europe)</configuration>\r
+            <configuration>433MHz - Limited IAR Kickstart (Other regions)</configuration>\r
+          </excluded>\r
+        </file>\r
+        <file>\r
+          <name>$PROJ_DIR$\simpliciti\Components\mrfi\mrfi.h</name>\r
+        </file>\r
+        <file>\r
+          <name>$PROJ_DIR$\simpliciti\Components\mrfi\mrfi_defs.h</name>\r
+        </file>\r
+      </group>\r
+      <group>\r
+        <name>nwk</name>\r
+        <file>\r
+          <name>$PROJ_DIR$\simpliciti\Components\nwk\nwk.c</name>\r
+          <excluded>\r
+            <configuration>915MHz - Limited IAR Kickstart (USA)</configuration>\r
+            <configuration>868MHz - Limited IAR Kickstart (Europe)</configuration>\r
+            <configuration>433MHz - Limited IAR Kickstart (Other regions)</configuration>\r
+          </excluded>\r
+        </file>\r
+        <file>\r
+          <name>$PROJ_DIR$\simpliciti\Components\nwk\nwk.h</name>\r
+        </file>\r
+        <file>\r
+          <name>$PROJ_DIR$\simpliciti\Components\nwk\nwk_api.c</name>\r
+          <excluded>\r
+            <configuration>915MHz - Limited IAR Kickstart (USA)</configuration>\r
+            <configuration>868MHz - Limited IAR Kickstart (Europe)</configuration>\r
+            <configuration>433MHz - Limited IAR Kickstart (Other regions)</configuration>\r
+          </excluded>\r
+        </file>\r
+        <file>\r
+          <name>$PROJ_DIR$\simpliciti\Components\nwk\nwk_api.h</name>\r
+        </file>\r
+        <file>\r
+          <name>$PROJ_DIR$\simpliciti\Components\nwk\nwk_app.h</name>\r
+        </file>\r
+        <file>\r
+          <name>$PROJ_DIR$\simpliciti\Components\nwk\nwk_frame.c</name>\r
+          <excluded>\r
+            <configuration>915MHz - Limited IAR Kickstart (USA)</configuration>\r
+            <configuration>868MHz - Limited IAR Kickstart (Europe)</configuration>\r
+            <configuration>433MHz - Limited IAR Kickstart (Other regions)</configuration>\r
+          </excluded>\r
+        </file>\r
+        <file>\r
+          <name>$PROJ_DIR$\simpliciti\Components\nwk\nwk_frame.h</name>\r
+        </file>\r
+        <file>\r
+          <name>$PROJ_DIR$\simpliciti\Components\nwk\nwk_globals.c</name>\r
+          <excluded>\r
+            <configuration>915MHz - Limited IAR Kickstart (USA)</configuration>\r
+            <configuration>868MHz - Limited IAR Kickstart (Europe)</configuration>\r
+            <configuration>433MHz - Limited IAR Kickstart (Other regions)</configuration>\r
+          </excluded>\r
+        </file>\r
+        <file>\r
+          <name>$PROJ_DIR$\simpliciti\Components\nwk\nwk_globals.h</name>\r
+        </file>\r
+        <file>\r
+          <name>$PROJ_DIR$\simpliciti\Components\nwk\nwk_QMgmt.c</name>\r
+          <excluded>\r
+            <configuration>915MHz - Limited IAR Kickstart (USA)</configuration>\r
+            <configuration>868MHz - Limited IAR Kickstart (Europe)</configuration>\r
+            <configuration>433MHz - Limited IAR Kickstart (Other regions)</configuration>\r
+          </excluded>\r
+        </file>\r
+        <file>\r
+          <name>$PROJ_DIR$\simpliciti\Components\nwk\nwk_QMgmt.h</name>\r
+        </file>\r
+        <file>\r
+          <name>$PROJ_DIR$\simpliciti\Components\nwk\nwk_types.h</name>\r
+        </file>\r
+      </group>\r
+      <group>\r
+        <name>nwk_applications</name>\r
+        <file>\r
+          <name>$PROJ_DIR$\simpliciti\Components\nwk_applications\nwk_freq.c</name>\r
+          <excluded>\r
+            <configuration>915MHz - Limited IAR Kickstart (USA)</configuration>\r
+            <configuration>868MHz - Limited IAR Kickstart (Europe)</configuration>\r
+            <configuration>433MHz - Limited IAR Kickstart (Other regions)</configuration>\r
+          </excluded>\r
+        </file>\r
+        <file>\r
+          <name>$PROJ_DIR$\simpliciti\Components\nwk_applications\nwk_freq.h</name>\r
+        </file>\r
+        <file>\r
+          <name>$PROJ_DIR$\simpliciti\Components\nwk_applications\nwk_ioctl.c</name>\r
+          <excluded>\r
+            <configuration>915MHz - Limited IAR Kickstart (USA)</configuration>\r
+            <configuration>868MHz - Limited IAR Kickstart (Europe)</configuration>\r
+            <configuration>433MHz - Limited IAR Kickstart (Other regions)</configuration>\r
+          </excluded>\r
+        </file>\r
+        <file>\r
+          <name>$PROJ_DIR$\simpliciti\Components\nwk_applications\nwk_ioctl.h</name>\r
+        </file>\r
+        <file>\r
+          <name>$PROJ_DIR$\simpliciti\Components\nwk_applications\nwk_join.c</name>\r
+          <excluded>\r
+            <configuration>915MHz - Limited IAR Kickstart (USA)</configuration>\r
+            <configuration>868MHz - Limited IAR Kickstart (Europe)</configuration>\r
+            <configuration>433MHz - Limited IAR Kickstart (Other regions)</configuration>\r
+          </excluded>\r
+        </file>\r
+        <file>\r
+          <name>$PROJ_DIR$\simpliciti\Components\nwk_applications\nwk_join.h</name>\r
+        </file>\r
+        <file>\r
+          <name>$PROJ_DIR$\simpliciti\Components\nwk_applications\nwk_link.c</name>\r
+          <excluded>\r
+            <configuration>915MHz - Limited IAR Kickstart (USA)</configuration>\r
+            <configuration>868MHz - Limited IAR Kickstart (Europe)</configuration>\r
+            <configuration>433MHz - Limited IAR Kickstart (Other regions)</configuration>\r
+          </excluded>\r
+        </file>\r
+        <file>\r
+          <name>$PROJ_DIR$\simpliciti\Components\nwk_applications\nwk_link.h</name>\r
+        </file>\r
+        <file>\r
+          <name>$PROJ_DIR$\simpliciti\Components\nwk_applications\nwk_mgmt.c</name>\r
+          <excluded>\r
+            <configuration>915MHz - Limited IAR Kickstart (USA)</configuration>\r
+            <configuration>868MHz - Limited IAR Kickstart (Europe)</configuration>\r
+            <configuration>433MHz - Limited IAR Kickstart (Other regions)</configuration>\r
+          </excluded>\r
+        </file>\r
+        <file>\r
+          <name>$PROJ_DIR$\simpliciti\Components\nwk_applications\nwk_mgmt.h</name>\r
+        </file>\r
+        <file>\r
+          <name>$PROJ_DIR$\simpliciti\Components\nwk_applications\nwk_ping.c</name>\r
+          <excluded>\r
+            <configuration>915MHz - Limited IAR Kickstart (USA)</configuration>\r
+            <configuration>868MHz - Limited IAR Kickstart (Europe)</configuration>\r
+            <configuration>433MHz - Limited IAR Kickstart (Other regions)</configuration>\r
+          </excluded>\r
+        </file>\r
+        <file>\r
+          <name>$PROJ_DIR$\simpliciti\Components\nwk_applications\nwk_ping.h</name>\r
+        </file>\r
+        <file>\r
+          <name>$PROJ_DIR$\simpliciti\Components\nwk_applications\nwk_security.c</name>\r
+          <excluded>\r
+            <configuration>915MHz - Limited IAR Kickstart (USA)</configuration>\r
+            <configuration>868MHz - Limited IAR Kickstart (Europe)</configuration>\r
+            <configuration>433MHz - Limited IAR Kickstart (Other regions)</configuration>\r
+          </excluded>\r
+        </file>\r
+        <file>\r
+          <name>$PROJ_DIR$\simpliciti\Components\nwk_applications\nwk_security.h</name>\r
+        </file>\r
+      </group>\r
+    </group>\r
+    <file>\r
+      <name>$PROJ_DIR$\simpliciti\CC430_End_Device_433MHz.r43</name>\r
+      <excluded>\r
+        <configuration>915MHz - Limited IAR Kickstart (USA)</configuration>\r
+        <configuration>868MHz - Limited IAR Kickstart (Europe)</configuration>\r
+        <configuration>915MHz - Unrestricted IAR Workbench (USA)</configuration>\r
+        <configuration>868MHz - Unrestricted IAR Workbench (Europe)</configuration>\r
+        <configuration>433MHz - Unrestricted IAR Workbench (Other regions)</configuration>\r
+      </excluded>\r
+    </file>\r
+    <file>\r
+      <name>$PROJ_DIR$\simpliciti\CC430_End_Device_868MHz.r43</name>\r
+      <excluded>\r
+        <configuration>915MHz - Limited IAR Kickstart (USA)</configuration>\r
+        <configuration>433MHz - Limited IAR Kickstart (Other regions)</configuration>\r
+        <configuration>915MHz - Unrestricted IAR Workbench (USA)</configuration>\r
+        <configuration>868MHz - Unrestricted IAR Workbench (Europe)</configuration>\r
+        <configuration>433MHz - Unrestricted IAR Workbench (Other regions)</configuration>\r
+      </excluded>\r
+    </file>\r
+    <file>\r
+      <name>$PROJ_DIR$\simpliciti\CC430_End_Device_915MHz.r43</name>\r
+      <excluded>\r
+        <configuration>868MHz - Limited IAR Kickstart (Europe)</configuration>\r
+        <configuration>433MHz - Limited IAR Kickstart (Other regions)</configuration>\r
+        <configuration>915MHz - Unrestricted IAR Workbench (USA)</configuration>\r
+        <configuration>868MHz - Unrestricted IAR Workbench (Europe)</configuration>\r
+        <configuration>433MHz - Unrestricted IAR Workbench (Other regions)</configuration>\r
+      </excluded>\r
+    </file>\r
+    <file>\r
+      <name>$PROJ_DIR$\simpliciti\simpliciti.h</name>\r
+    </file>\r
+    <file>\r
+      <name>$PROJ_DIR$\simpliciti\simpliciti_readme.txt</name>\r
+    </file>\r
+  </group>\r
+  <file>\r
+    <name>$PROJ_DIR$\change_record.txt</name>\r
+  </file>\r
+  <file>\r
+    <name>$PROJ_DIR$\main.c</name>\r
+  </file>\r
+</project>\r
+\r
+\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/ez430_chronos.eww b/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/ez430_chronos.eww
new file mode 100755 (executable)
index 0000000..307ee06
--- /dev/null
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="iso-8859-1"?>\r
+\r
+<workspace>\r
+  <project>\r
+    <path>$WS_DIR$\ez430_chronos.ewp</path>\r
+  </project>\r
+  <batchBuild/>\r
+</workspace>\r
+\r
+\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/include/project.h b/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/include/project.h
new file mode 100755 (executable)
index 0000000..73eb8a0
--- /dev/null
@@ -0,0 +1,129 @@
+// *************************************************************************************************\r
+//\r
+//      Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/ \r
+//       \r
+//       \r
+//        Redistribution and use in source and binary forms, with or without \r
+//        modification, are permitted provided that the following conditions \r
+//        are met:\r
+//      \r
+//          Redistributions of source code must retain the above copyright \r
+//          notice, this list of conditions and the following disclaimer.\r
+//       \r
+//          Redistributions in binary form must reproduce the above copyright\r
+//          notice, this list of conditions and the following disclaimer in the \r
+//          documentation and/or other materials provided with the   \r
+//          distribution.\r
+//       \r
+//          Neither the name of Texas Instruments Incorporated nor the names of\r
+//          its contributors may be used to endorse or promote products derived\r
+//          from this software without specific prior written permission.\r
+//      \r
+//        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \r
+//        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT \r
+//        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT \r
+//        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, \r
+//        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT \r
+//        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT \r
+//        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE \r
+//        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+\r
+#ifndef PROJECT_H_\r
+#define PROJECT_H_\r
+\r
+// *************************************************************************************************\r
+// Include section\r
+#include <cc430x613x.h>\r
+#include <bm.h>\r
+\r
+// *************************************************************************************************\r
+// Defines section\r
+\r
+// Comment this to not use the LCD charge pump\r
+//#define USE_LCD_CHARGE_PUMP\r
+\r
+// Comment this define to build the application without watchdog support\r
+#define USE_WATCHDOG\r
+\r
+// Use/not use filter when measuring physical values\r
+#define FILTER_OFF                                             (0u)\r
+#define FILTER_ON                                              (1u)\r
+\r
+// *************************************************************************************************\r
+// Macro section\r
+\r
+// Conversion from usec to ACLK timer ticks\r
+#define CONV_US_TO_TICKS(usec)                                 (((usec) * 32768) / 1000000)\r
+\r
+// Conversion from msec to ACLK timer ticks\r
+#define CONV_MS_TO_TICKS(msec)                                 (((msec) * 32768) / 1000)\r
+\r
+// *************************************************************************************************\r
+// Typedef section\r
+\r
+typedef enum\r
+{\r
+   MENU_ITEM_NOT_VISIBLE = 0,   // Menu item is not visible\r
+   MENU_ITEM_VISIBLE            // Menu item is visible\r
+} menu_t;\r
+\r
+// Set of system flags\r
+typedef union\r
+{\r
+   struct\r
+   {\r
+      u16 idle_timeout:1;       // Timeout after inactivity\r
+      u16 idle_timeout_enabled:1;       // When in set mode, timeout after a given period\r
+      u16 lock_buttons:1;       // Lock buttons\r
+      u16 mask_buzzer:1;        // Do not output buzz for next button event\r
+      u16 up_down_repeat_enabled:1;     // While in set_value(), create virtual UP/DOWN button events\r
+      u16 low_battery:1;        // 1 = Battery is low\r
+      u16 use_metric_units:1;   // 1 = Use metric units, 0 = use English units\r
+      u16 delay_over:1;         // 1 = Timer delay over\r
+   } flag;\r
+   u16 all_flags;               // Shortcut to all display flags (for reset)\r
+} s_system_flags;\r
+extern volatile s_system_flags sys;\r
+\r
+// Set of request flags\r
+typedef union\r
+{\r
+   struct\r
+   {\r
+      u16 temperature_measurement:1;    // 1 = Measure temperature\r
+      u16 voltage_measurement:1;        // 1 = Measure voltage\r
+      u16 altitude_measurement:1;       // 1 = Measure air pressure\r
+      u16 acceleration_measurement:1;   // 1 = Measure acceleration\r
+      u16 buzzer:1;             // 1 = Output buzzer\r
+   } flag;\r
+   u16 all_flags;               // Shortcut to all display flags (for reset)\r
+} s_request_flags;\r
+extern volatile s_request_flags request;\r
+\r
+// Set of message flags\r
+typedef union\r
+{\r
+   struct\r
+   {\r
+      u16 prepare:1;            // 1 = Wait for clock tick, then set display.flag.show_message flag\r
+      u16 show:1;               // 1 = Display message now\r
+      u16 erase:1;              // 1 = Erase message\r
+      u16 type_locked:1;        // 1 = Show "buttons are locked" in Line2\r
+      u16 type_unlocked:1;      // 1 = Show "buttons are unlocked" in Line2\r
+      u16 type_lobatt:1;        // 1 = Show "lobatt" text in Line2\r
+      u16 type_alarm_on:1;      // 1 = Show "  on" text in Line1\r
+      u16 type_alarm_off:1;     // 1 = Show " off" text in Line1\r
+   } flag;\r
+   u16 all_flags;               // Shortcut to all message flags (for reset)\r
+} s_message_flags;\r
+extern volatile s_message_flags message;\r
+\r
+// *************************************************************************************************\r
+// Global Variable section\r
+\r
+#endif                          /*PROJECT_H_ */\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/logic/acceleration.c b/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/logic/acceleration.c
new file mode 100755 (executable)
index 0000000..41db976
--- /dev/null
@@ -0,0 +1,270 @@
+// *************************************************************************************************\r
+//\r
+//      Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//        Redistribution and use in source and binary forms, with or without\r
+//        modification, are permitted provided that the following conditions\r
+//        are met:\r
+//\r
+//          Redistributions of source code must retain the above copyright\r
+//          notice, this list of conditions and the following disclaimer.\r
+//\r
+//          Redistributions in binary form must reproduce the above copyright\r
+//          notice, this list of conditions and the following disclaimer in the\r
+//          documentation and/or other materials provided with the\r
+//          distribution.\r
+//\r
+//          Neither the name of Texas Instruments Incorporated nor the names of\r
+//          its contributors may be used to endorse or promote products derived\r
+//          from this software without specific prior written permission.\r
+//\r
+//        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+// Temperature measurement functions.\r
+// *************************************************************************************************\r
+\r
+// *************************************************************************************************\r
+// Include section\r
+\r
+// system\r
+#include "project.h"\r
+\r
+// driver\r
+#include "display.h"\r
+#include "vti_as.h"\r
+\r
+// logic\r
+#include "acceleration.h"\r
+#include "simpliciti.h"\r
+#include "user.h"\r
+\r
+// *************************************************************************************************\r
+// Global Variable section\r
+struct accel sAccel;\r
+\r
+// Conversion values from data to mgrav taken from CMA3000-D0x datasheet (rev 0.4, table 4)\r
+const u16 mgrav_per_bit[7] = { 18, 36, 71, 143, 286, 571, 1142 };\r
+\r
+// *************************************************************************************************\r
+// Extern section\r
+\r
+// Global flag for proper acceleration sensor operation\r
+extern u8 as_ok;\r
+\r
+// *************************************************************************************************\r
+// @fn          reset_acceleration\r
+// @brief       Reset acceleration variables.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void reset_acceleration(void)\r
+{\r
+    // Start with Y-axis display\r
+    sAccel.view_style = DISPLAY_ACCEL_Y;\r
+\r
+    // Clear timeout counter\r
+    sAccel.timeout = 0;\r
+\r
+    // Default mode is off\r
+    sAccel.mode = ACCEL_MODE_OFF;\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          sx_acceleration\r
+// @brief       Acceleration direct function. Button UP switches between X/Y/Z values.\r
+// @param       u8 line         LINE2\r
+// @return      none\r
+// *************************************************************************************************\r
+void sx_acceleration(u8 line)\r
+{\r
+    if (++sAccel.view_style > 2)\r
+        sAccel.view_style = 0;\r
+\r
+    // Reset current acceleration value\r
+    sAccel.data = 0;\r
+\r
+    // Get data from sensor\r
+    as_get_data(sAccel.xyz);\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          acceleration_value_is_positive\r
+// @brief       Returns 1 if 2's complement number is positive\r
+// @param       u8 value        2's complement number\r
+// @return      u8                      1 = number is positive, 0 = number is negavtive\r
+// *************************************************************************************************\r
+u8 acceleration_value_is_positive(u8 value)\r
+{\r
+    return ((value & BIT7) == 0);\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          convert_acceleration_value_to_mgrav\r
+// @brief       Converts measured value to mgrav units\r
+// @param       u8 value        g data from sensor\r
+// @return      u16                     Acceleration (mgrav)\r
+// *************************************************************************************************\r
+u16 convert_acceleration_value_to_mgrav(u8 value)\r
+{\r
+    u16 result;\r
+    u8 i;\r
+\r
+    if (!acceleration_value_is_positive(value))\r
+    {\r
+        // Convert 2's complement negative number to positive number\r
+        value = ~value;\r
+        value += 1;\r
+    }\r
+\r
+    result = 0;\r
+    for (i = 0; i < 7; i++)\r
+    {\r
+        result += ((value & (BIT(i))) >> i) * mgrav_per_bit[i];\r
+    }\r
+\r
+    return (result);\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          is_acceleration_measurement\r
+// @brief       Returns 1 if acceleration is currently measured.\r
+// @param       none\r
+// @return      u8              1 = acceleration measurement ongoing\r
+// *************************************************************************************************\r
+u8 is_acceleration_measurement(void)\r
+{\r
+    return ((sAccel.mode == ACCEL_MODE_ON) && (sAccel.timeout > 0));\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          do_acceleration_measurement\r
+// @brief       Get sensor data and store in sAccel struct\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void do_acceleration_measurement(void)\r
+{\r
+    // Get data from sensor\r
+    as_get_data(sAccel.xyz);\r
+\r
+    // Set display update flag\r
+    display.flag.update_acceleration = 1;\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          display_acceleration\r
+// @brief       Display routine.\r
+// @param       u8 line                 LINE1\r
+//                              u8 update               DISPLAY_LINE_UPDATE_FULL, DISPLAY_LINE_CLEAR\r
+// @return      none\r
+// *************************************************************************************************\r
+void display_acceleration(u8 line, u8 update)\r
+{\r
+    u8 *str;\r
+    u8 raw_data;\r
+    u16 accel_data;\r
+\r
+    // Show warning if acceleration sensor was not initialised properly\r
+    if (!as_ok)\r
+    {\r
+        display_chars(LCD_SEG_L1_2_0, (u8 *) "ERR", SEG_ON);\r
+    }\r
+    else\r
+    {\r
+        // Redraw whole screen\r
+        if (update == DISPLAY_LINE_UPDATE_FULL)\r
+        {\r
+            {\r
+                // Start acceleration sensor\r
+                if (!is_acceleration_measurement())\r
+                {\r
+                    // Clear previous acceleration value\r
+                    sAccel.data = 0;\r
+\r
+                    // Start sensor\r
+                    as_start();\r
+\r
+                    // Set timeout counter\r
+                    sAccel.timeout = ACCEL_MEASUREMENT_TIMEOUT;\r
+\r
+                    // Set mode\r
+                    sAccel.mode = ACCEL_MODE_ON;\r
+\r
+                    // Start with Y-axis values\r
+                    sAccel.view_style = DISPLAY_ACCEL_Y;\r
+                }\r
+\r
+                // Display decimal point\r
+                display_symbol(LCD_SEG_L1_DP1, SEG_ON);\r
+            }\r
+        }\r
+        else if (update == DISPLAY_LINE_UPDATE_PARTIAL)\r
+        {\r
+            // Convert X/Y/Z values to mg\r
+            switch (sAccel.view_style)\r
+            {\r
+                case DISPLAY_ACCEL_X:\r
+                    raw_data = sAccel.xyz[0];\r
+                    display_char(LCD_SEG_L1_3, 'X', SEG_ON);\r
+                    break;\r
+                case DISPLAY_ACCEL_Y:\r
+                    raw_data = sAccel.xyz[1];\r
+                    display_char(LCD_SEG_L1_3, 'Y', SEG_ON);\r
+                    break;\r
+                default:\r
+                    raw_data = sAccel.xyz[2];\r
+                    display_char(LCD_SEG_L1_3, 'Z', SEG_ON);\r
+                    break;\r
+            }\r
+            accel_data = convert_acceleration_value_to_mgrav(raw_data) / 10;\r
+\r
+            // Filter acceleration\r
+            accel_data = (u16) ((accel_data * 0.2) + (sAccel.data * 0.8));\r
+\r
+            // Store average acceleration\r
+            sAccel.data = accel_data;\r
+\r
+            // Display acceleration in x.xx format\r
+            str = int_to_array(accel_data, 3, 0);\r
+            display_chars(LCD_SEG_L1_2_0, str, SEG_ON);\r
+\r
+            // Display sign\r
+            if (acceleration_value_is_positive(raw_data))\r
+            {\r
+                display_symbol(LCD_SYMB_ARROW_UP, SEG_ON);\r
+                display_symbol(LCD_SYMB_ARROW_DOWN, SEG_OFF);\r
+            }\r
+            else\r
+            {\r
+                display_symbol(LCD_SYMB_ARROW_UP, SEG_OFF);\r
+                display_symbol(LCD_SYMB_ARROW_DOWN, SEG_ON);\r
+            }\r
+        }\r
+        else if (update == DISPLAY_LINE_CLEAR)\r
+        {\r
+            // Stop acceleration sensor\r
+            as_stop();\r
+\r
+            // Clear mode\r
+            sAccel.mode = ACCEL_MODE_OFF;\r
+\r
+            // Clean up display\r
+            display_symbol(LCD_SEG_L1_DP1, SEG_OFF);\r
+            display_symbol(LCD_SYMB_ARROW_UP, SEG_OFF);\r
+            display_symbol(LCD_SYMB_ARROW_DOWN, SEG_OFF);\r
+        }\r
+    }\r
+}\r
+\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/logic/acceleration.h b/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/logic/acceleration.h
new file mode 100755 (executable)
index 0000000..14f3d43
--- /dev/null
@@ -0,0 +1,77 @@
+// *************************************************************************************************\r
+//\r
+//      Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//        Redistribution and use in source and binary forms, with or without\r
+//        modification, are permitted provided that the following conditions\r
+//        are met:\r
+//\r
+//          Redistributions of source code must retain the above copyright\r
+//          notice, this list of conditions and the following disclaimer.\r
+//\r
+//          Redistributions in binary form must reproduce the above copyright\r
+//          notice, this list of conditions and the following disclaimer in the\r
+//          documentation and/or other materials provided with the\r
+//          distribution.\r
+//\r
+//          Neither the name of Texas Instruments Incorporated nor the names of\r
+//          its contributors may be used to endorse or promote products derived\r
+//          from this software without specific prior written permission.\r
+//\r
+//        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+\r
+#ifndef ACCELERATION_H_\r
+#define ACCELERATION_H_\r
+\r
+// *************************************************************************************************\r
+// Include section\r
+\r
+// *************************************************************************************************\r
+// Prototypes section\r
+\r
+// *************************************************************************************************\r
+// Defines section\r
+#define DISPLAY_ACCEL_X         (0u)\r
+#define DISPLAY_ACCEL_Y         (1u)\r
+#define DISPLAY_ACCEL_Z         (2u)\r
+\r
+#define ACCEL_MODE_OFF          (0u)\r
+#define ACCEL_MODE_ON           (1u)\r
+\r
+// Stop acceleration measurement after 60 minutes to save battery\r
+#define ACCEL_MEASUREMENT_TIMEOUT               (60 * 60u)\r
+\r
+// *************************************************************************************************\r
+// Global Variable section\r
+struct accel\r
+{\r
+    u8 mode;                    // ACC_MODE_OFF, ACC_MODE_ON\r
+    u8 xyz[3];                  // Sensor raw data\r
+    u16 data;                   // Acceleration data in 10 * mgrav\r
+    u8 view_style;              // Display X/Y/Z values\r
+    u16 timeout;                // Timeout\r
+};\r
+extern struct accel sAccel;\r
+\r
+// *************************************************************************************************\r
+// Extern section\r
+extern void reset_acceleration(void);\r
+extern void sx_acceleration(u8 line);\r
+extern void display_acceleration(u8 line, u8 update);\r
+extern u8 is_acceleration_measurement(void);\r
+extern void do_acceleration_measurement(void);\r
+\r
+#endif                          /*ACCELERATION_H_ */\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/logic/alarm.c b/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/logic/alarm.c
new file mode 100755 (executable)
index 0000000..0bfdc94
--- /dev/null
@@ -0,0 +1,280 @@
+// *************************************************************************************************\r
+//\r
+//      Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//        Redistribution and use in source and binary forms, with or without\r
+//        modification, are permitted provided that the following conditions\r
+//        are met:\r
+//\r
+//          Redistributions of source code must retain the above copyright\r
+//          notice, this list of conditions and the following disclaimer.\r
+//\r
+//          Redistributions in binary form must reproduce the above copyright\r
+//          notice, this list of conditions and the following disclaimer in the\r
+//          documentation and/or other materials provided with the\r
+//          distribution.\r
+//\r
+//          Neither the name of Texas Instruments Incorporated nor the names of\r
+//          its contributors may be used to endorse or promote products derived\r
+//          from this software without specific prior written permission.\r
+//\r
+//        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+// Alarm routines.\r
+// *************************************************************************************************\r
+\r
+// *************************************************************************************************\r
+// Include section\r
+\r
+// system\r
+#include "project.h"\r
+\r
+// driver\r
+#include "display.h"\r
+#include "buzzer.h"\r
+#include "ports.h"\r
+\r
+// logic\r
+#include "alarm.h"\r
+#include "clock.h"\r
+#include "user.h"\r
+\r
+// *************************************************************************************************\r
+// Prototypes section\r
+\r
+// *************************************************************************************************\r
+// Defines section\r
+\r
+// *************************************************************************************************\r
+// Global Variable section\r
+struct alarm sAlarm;\r
+\r
+// *************************************************************************************************\r
+// Extern section\r
+\r
+// *************************************************************************************************\r
+// @fn          reset_alarm\r
+// @brief       Resets alarmData to 06:30\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void reset_alarm(void)\r
+{\r
+    // Default alarm time 06:30\r
+    sAlarm.hour = 06;\r
+    sAlarm.minute = 30;\r
+\r
+    // Alarm is initially off\r
+    sAlarm.duration = ALARM_ON_DURATION;\r
+    sAlarm.state = ALARM_DISABLED;\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          check_alarm\r
+// @brief       Check if current time matches alarm time\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void check_alarm(void)\r
+{\r
+    // Return if alarm is not enabled\r
+    if (sAlarm.state != ALARM_ENABLED)\r
+        return;\r
+\r
+    // Compare current time and alarm time\r
+    // Start with minutes - only 1/60 probability to match\r
+    if (sTime.minute == sAlarm.minute)\r
+    {\r
+        if (sTime.hour == sAlarm.hour)\r
+        {\r
+            // Indicate that alarm is on\r
+            sAlarm.state = ALARM_ON;\r
+        }\r
+    }\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          stop_alarm\r
+// @brief       Stop active alarm\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void stop_alarm(void)\r
+{\r
+    // Indicate that alarm is enabled, but not active\r
+    sAlarm.state = ALARM_ENABLED;\r
+\r
+    // Stop buzzer\r
+    stop_buzzer();\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          sx_alarm\r
+// @brief       Sx button turns alarm on/off.\r
+// @param       u8 line         LINE1\r
+// @return      none\r
+// *************************************************************************************************\r
+void sx_alarm(u8 line)\r
+{\r
+    // UP: Alarm on, off\r
+    if (button.flag.up)\r
+    {\r
+        // Toggle alarm state\r
+        if (sAlarm.state == ALARM_DISABLED)\r
+        {\r
+            sAlarm.state = ALARM_ENABLED;\r
+\r
+            // Show "  on" message\r
+            message.flag.prepare = 1;\r
+            message.flag.type_alarm_on = 1;\r
+        }\r
+        else if (sAlarm.state == ALARM_ENABLED)\r
+        {\r
+            sAlarm.state = ALARM_DISABLED;\r
+\r
+            // Show "  off" message\r
+            message.flag.prepare = 1;\r
+            message.flag.type_alarm_off = 1;\r
+        }\r
+    }\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          mx_alarm\r
+// @brief       Set alarm time.\r
+// @param       u8 line LINE1\r
+// @return      none\r
+// *************************************************************************************************\r
+void mx_alarm(u8 line)\r
+{\r
+    u8 select;\r
+    s32 hours;\r
+    s32 minutes;\r
+    u8 *str;\r
+\r
+    // Clear display\r
+    clear_display_all();\r
+\r
+    // Keep global values in case new values are discarded\r
+    hours = sAlarm.hour;\r
+    minutes = sAlarm.minute;\r
+\r
+    // Display HH:MM (LINE1)\r
+    str = int_to_array(hours, 2, 0);\r
+    display_chars(LCD_SEG_L1_3_2, str, SEG_ON);\r
+    display_symbol(LCD_SEG_L1_COL, SEG_ON);\r
+\r
+    str = int_to_array(minutes, 2, 0);\r
+    display_chars(LCD_SEG_L1_1_0, str, SEG_ON);\r
+\r
+    // Init value index\r
+    select = 0;\r
+\r
+    // Loop values until all are set or user breaks set\r
+    while (1)\r
+    {\r
+        // Idle timeout: exit without saving\r
+        if (sys.flag.idle_timeout)\r
+            break;\r
+\r
+        // STAR (short): save, then exit\r
+        if (button.flag.star)\r
+        {\r
+            // Store local variables in global alarm time\r
+            sAlarm.hour = hours;\r
+            sAlarm.minute = minutes;\r
+            // Set display update flag\r
+            display.flag.line1_full_update = 1;\r
+            break;\r
+        }\r
+\r
+        switch (select)\r
+        {\r
+            case 0:            // Set hour\r
+                set_value(&hours, 2, 0, 0, 23, SETVALUE_ROLLOVER_VALUE + SETVALUE_DISPLAY_VALUE +\r
+                          SETVALUE_NEXT_VALUE, LCD_SEG_L1_3_2,\r
+                          display_hours);\r
+                select = 1;\r
+                break;\r
+\r
+            case 1:            // Set minutes\r
+                set_value(&minutes, 2, 0, 0, 59, SETVALUE_ROLLOVER_VALUE + SETVALUE_DISPLAY_VALUE +\r
+                          SETVALUE_NEXT_VALUE, LCD_SEG_L1_1_0,\r
+                          display_value);\r
+                select = 0;\r
+                break;\r
+        }\r
+    }\r
+\r
+    // Clear button flag\r
+    button.all_flags = 0;\r
+\r
+    // Indicate to display function that new value is available\r
+    display.flag.update_alarm = 1;\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          display_alarm\r
+// @brief       Display alarm time. 24H / 12H time format.\r
+// @param       u8 line         LINE1, LINE2\r
+//                              u8 update       DISPLAY_LINE_UPDATE_FULL, DISPLAY_LINE_CLEAR\r
+// @return      none\r
+// *************************************************************************************************\r
+void display_alarm(u8 line, u8 update)\r
+{\r
+    u8 hour12;\r
+\r
+    if (update == DISPLAY_LINE_UPDATE_FULL)\r
+    {\r
+        if (sys.flag.use_metric_units)\r
+        {\r
+            // Display 24H alarm time "HH:MM"\r
+            display_chars(switch_seg(line, LCD_SEG_L1_3_2,\r
+                                     LCD_SEG_L2_3_2), int_to_array(sAlarm.hour, 2, 0), SEG_ON);\r
+        }\r
+        else\r
+        {\r
+            // Display 12H alarm time "HH:MM" + AM/PM\r
+            hour12 = convert_hour_to_12H_format(sAlarm.hour);\r
+            display_chars(switch_seg(line, LCD_SEG_L1_3_2,\r
+                                     LCD_SEG_L2_3_2), int_to_array(hour12, 2, 0), SEG_ON);\r
+\r
+            // Display AM/PM symbol\r
+            display_am_pm_symbol(sAlarm.hour);\r
+        }\r
+        display_chars(switch_seg(line, LCD_SEG_L1_1_0,\r
+                                 LCD_SEG_L2_1_0), int_to_array(sAlarm.minute, 2, 0), SEG_ON);\r
+        display_symbol(switch_seg(line, LCD_SEG_L1_COL, LCD_SEG_L2_COL0), SEG_ON);\r
+\r
+        // Show blinking alarm icon\r
+        display_symbol(LCD_ICON_ALARM, SEG_ON_BLINK_ON);\r
+    }\r
+    else if (update == DISPLAY_LINE_CLEAR)\r
+    {\r
+        // Clean up function-specific segments before leaving function\r
+        display_symbol(LCD_SYMB_AM, SEG_OFF);\r
+\r
+        // Clear / set alarm icon\r
+        if (sAlarm.state == ALARM_DISABLED)\r
+        {\r
+            display_symbol(LCD_ICON_ALARM, SEG_OFF_BLINK_OFF);\r
+        }\r
+        else\r
+        {\r
+            display_symbol(LCD_ICON_ALARM, SEG_ON_BLINK_OFF);\r
+        }\r
+    }\r
+}\r
+\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/logic/alarm.h b/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/logic/alarm.h
new file mode 100755 (executable)
index 0000000..87b036b
--- /dev/null
@@ -0,0 +1,75 @@
+// *************************************************************************************************\r
+//\r
+//      Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//        Redistribution and use in source and binary forms, with or without\r
+//        modification, are permitted provided that the following conditions\r
+//        are met:\r
+//\r
+//          Redistributions of source code must retain the above copyright\r
+//          notice, this list of conditions and the following disclaimer.\r
+//\r
+//          Redistributions in binary form must reproduce the above copyright\r
+//          notice, this list of conditions and the following disclaimer in the\r
+//          documentation and/or other materials provided with the\r
+//          distribution.\r
+//\r
+//          Neither the name of Texas Instruments Incorporated nor the names of\r
+//          its contributors may be used to endorse or promote products derived\r
+//          from this software without specific prior written permission.\r
+//\r
+//        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+\r
+// *************************************************************************************************\r
+// Include section\r
+\r
+// *************************************************************************************************\r
+// Prototypes section\r
+\r
+// internal functions\r
+extern void reset_alarm(void);\r
+extern void check_alarm(void);\r
+extern void stop_alarm(void);\r
+\r
+// menu functions\r
+extern void sx_alarm(u8 line);\r
+extern void mx_alarm(u8 line);\r
+extern void display_alarm(u8 line, u8 update);\r
+\r
+// *************************************************************************************************\r
+// Defines section\r
+\r
+// Alarm states\r
+#define ALARM_DISABLED          (0u)\r
+#define ALARM_ENABLED           (1u)\r
+#define ALARM_ON                        (2u)\r
+\r
+// Keep alarm for 10 on-off cycles\r
+#define ALARM_ON_DURATION       (10u)\r
+\r
+// *************************************************************************************************\r
+// Global Variable section\r
+struct alarm\r
+{\r
+    u8 state;                   // ALARM_DISABLED, ALARM_ENABLED, ALARM_ON\r
+    u8 duration;                // Alarm duration\r
+    u8 hour;                    // Alarm hour\r
+    u8 minute;                  // Alarm minute\r
+};\r
+extern struct alarm sAlarm;\r
+\r
+// *************************************************************************************************\r
+// Extern section\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/logic/altitude.c b/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/logic/altitude.c
new file mode 100755 (executable)
index 0000000..8837ea5
--- /dev/null
@@ -0,0 +1,420 @@
+// *************************************************************************************************\r
+//\r
+//      Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//        Redistribution and use in source and binary forms, with or without\r
+//        modification, are permitted provided that the following conditions\r
+//        are met:\r
+//\r
+//          Redistributions of source code must retain the above copyright\r
+//          notice, this list of conditions and the following disclaimer.\r
+//\r
+//          Redistributions in binary form must reproduce the above copyright\r
+//          notice, this list of conditions and the following disclaimer in the\r
+//          documentation and/or other materials provided with the\r
+//          distribution.\r
+//\r
+//          Neither the name of Texas Instruments Incorporated nor the names of\r
+//          its contributors may be used to endorse or promote products derived\r
+//          from this software without specific prior written permission.\r
+//\r
+//        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+// Altitude measurement functions.\r
+// *************************************************************************************************\r
+\r
+// *************************************************************************************************\r
+// Include section\r
+\r
+// system\r
+#include "project.h"\r
+\r
+// driver\r
+#include "altitude.h"\r
+#include "display.h"\r
+#include "vti_ps.h"\r
+#include "ports.h"\r
+#include "timer.h"\r
+\r
+// logic\r
+#include "user.h"\r
+\r
+// *************************************************************************************************\r
+// Prototypes section\r
+\r
+// *************************************************************************************************\r
+// Defines section\r
+\r
+// *************************************************************************************************\r
+// Global Variable section\r
+struct alt sAlt;\r
+\r
+// *************************************************************************************************\r
+// Extern section\r
+\r
+// Global flag for pressure sensor initialisation status\r
+extern u8 ps_ok;\r
+\r
+// *************************************************************************************************\r
+// @fn          reset_altitude_measurement\r
+// @brief       Reset altitude measurement.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void reset_altitude_measurement(void)\r
+{\r
+    // Menu item is not visible\r
+    sAlt.state = MENU_ITEM_NOT_VISIBLE;\r
+\r
+    // Clear timeout counter\r
+    sAlt.timeout = 0;\r
+\r
+    // Set default altitude value\r
+    sAlt.altitude = 0;\r
+\r
+    // Pressure sensor ok?\r
+    if (ps_ok)\r
+    {\r
+        // Initialise pressure table\r
+        init_pressure_table();\r
+\r
+        // Do single conversion\r
+        start_altitude_measurement();\r
+        stop_altitude_measurement();\r
+\r
+        // Apply calibration offset and recalculate pressure table\r
+        if (sAlt.altitude_offset != 0)\r
+        {\r
+            sAlt.altitude += sAlt.altitude_offset;\r
+            update_pressure_table(sAlt.altitude, sAlt.pressure, sAlt.temperature);\r
+        }\r
+    }\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          conv_m_to_ft\r
+// @brief       Convert meters to feet\r
+// @param       u16 m           Meters\r
+// @return      u16                     Feet\r
+// *************************************************************************************************\r
+s16 convert_m_to_ft(s16 m)\r
+{\r
+    return (((s32) 328 * m) / 100);\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          conv_ft_to_m\r
+// @brief       Convert feet to meters\r
+// @param       u16 ft          Feet\r
+// @return      u16                     Meters\r
+// *************************************************************************************************\r
+s16 convert_ft_to_m(s16 ft)\r
+{\r
+    return (((s32) ft * 61) / 200);\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          is_altitude_measurement\r
+// @brief       Altitude measurement check\r
+// @param       none\r
+// @return      u8              1=Measurement ongoing, 0=measurement off\r
+// *************************************************************************************************\r
+u8 is_altitude_measurement(void)\r
+{\r
+    return ((sAlt.state == MENU_ITEM_VISIBLE) && (sAlt.timeout > 0));\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          start_altitude_measurement\r
+// @brief       Start altitude measurement\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void start_altitude_measurement(void)\r
+{\r
+    // Show warning if pressure sensor was not initialised properly\r
+    if (!ps_ok)\r
+    {\r
+        display_chars(LCD_SEG_L1_2_0, (u8 *) "ERR", SEG_ON);\r
+        return;\r
+    }\r
+\r
+    // Start altitude measurement if timeout has elapsed\r
+    if (sAlt.timeout == 0)\r
+    {\r
+        // Enable DRDY IRQ on rising edge\r
+        PS_INT_IFG &= ~PS_INT_PIN;\r
+        PS_INT_IE |= PS_INT_PIN;\r
+\r
+        // Start pressure sensor\r
+        ps_start();\r
+\r
+        // Set timeout counter only if sensor status was OK\r
+        sAlt.timeout = ALTITUDE_MEASUREMENT_TIMEOUT;\r
+\r
+        // Get updated altitude\r
+        while ((PS_INT_IN & PS_INT_PIN) == 0) ;\r
+        do_altitude_measurement(FILTER_OFF);\r
+    }\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          stop_altitude_measurement\r
+// @brief       Stop altitude measurement\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void stop_altitude_measurement(void)\r
+{\r
+    // Return if pressure sensor was not initialised properly\r
+    if (!ps_ok)\r
+        return;\r
+\r
+    // Stop pressure sensor\r
+    ps_stop();\r
+\r
+    // Disable DRDY IRQ\r
+    PS_INT_IE &= ~PS_INT_PIN;\r
+    PS_INT_IFG &= ~PS_INT_PIN;\r
+\r
+    // Clear timeout counter\r
+    sAlt.timeout = 0;\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          do_altitude_measurement\r
+// @brief       Perform single altitude measurement\r
+// @param       u8 filter       Filter option\r
+// @return      none\r
+// *************************************************************************************************\r
+void do_altitude_measurement(u8 filter)\r
+{\r
+    volatile u32 pressure;\r
+\r
+    // If sensor is not ready, skip data read\r
+    if ((PS_INT_IN & PS_INT_PIN) == 0)\r
+        return;\r
+\r
+    // Get temperature (format is *10 K) from sensor\r
+    sAlt.temperature = ps_get_temp();\r
+\r
+    // Get pressure (format is 1Pa) from sensor\r
+    pressure = ps_get_pa();\r
+\r
+    // Store measured pressure value\r
+    if (filter == FILTER_OFF)   //sAlt.pressure == 0)\r
+    {\r
+        sAlt.pressure = pressure;\r
+    }\r
+    else\r
+    {\r
+        // Filter current pressure\r
+        pressure = (u32) ((pressure * 0.2) + (sAlt.pressure * 0.8));\r
+\r
+        // Store average pressure\r
+        sAlt.pressure = pressure;\r
+    }\r
+\r
+    // Convert pressure (Pa) and temperature (K) to altitude (m)\r
+    sAlt.altitude = conv_pa_to_meter(sAlt.pressure, sAlt.temperature);\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          sx_altitude\r
+// @brief       Altitude direct function.\r
+// @param       u8 line LINE1, LINE2\r
+// @return      none\r
+// *************************************************************************************************\r
+void sx_altitude(u8 line)\r
+{\r
+    // Function can be empty\r
+    // Restarting of altitude measurement will be done by subsequent full display update\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          mx_altitude\r
+// @brief       Mx button handler to set the altitude offset.\r
+// @param       u8 line         LINE1\r
+// @return      none\r
+// *************************************************************************************************\r
+void mx_altitude(u8 line)\r
+{\r
+    s32 altitude;\r
+    s32 limit_high, limit_low;\r
+\r
+    // Clear display\r
+    clear_display_all();\r
+\r
+    // Set lower and upper limits for offset correction\r
+    if (sys.flag.use_metric_units)\r
+    {\r
+        // Display "m" symbol\r
+        display_symbol(LCD_UNIT_L1_M, SEG_ON);\r
+\r
+        // Convert global variable to local variable\r
+        altitude = sAlt.altitude;\r
+\r
+        // Limits for set_value function\r
+        limit_low = -100;\r
+        limit_high = 4000;\r
+    }\r
+    else                        // English units\r
+    {\r
+        // Display "ft" symbol\r
+        display_symbol(LCD_UNIT_L1_FT, SEG_ON);\r
+\r
+        // Convert altitude in meters to feet\r
+        altitude = sAlt.altitude;\r
+\r
+        // Convert from meters to feet\r
+        altitude = convert_m_to_ft(altitude);\r
+\r
+        // Limits for set_value function\r
+        limit_low = -500;\r
+        limit_high = 9999;\r
+    }\r
+\r
+    // Loop values until all are set or user breaks set\r
+    while (1)\r
+    {\r
+        // Idle timeout: exit without saving\r
+        if (sys.flag.idle_timeout)\r
+            break;\r
+\r
+        // Button STAR (short): save, then exit\r
+        if (button.flag.star)\r
+        {\r
+            // When using English units, convert ft back to m before updating pressure table\r
+            if (!sys.flag.use_metric_units)\r
+                altitude = convert_ft_to_m((s16) altitude);\r
+\r
+            // Update pressure table\r
+            update_pressure_table((s16) altitude, sAlt.pressure, sAlt.temperature);\r
+\r
+            // Set display update flag\r
+            display.flag.line1_full_update = 1;\r
+\r
+            break;\r
+        }\r
+\r
+        // Set current altitude - offset is set when leaving function\r
+        set_value(&altitude, 4, 3, limit_low, limit_high, SETVALUE_DISPLAY_VALUE +\r
+                  SETVALUE_FAST_MODE + SETVALUE_DISPLAY_ARROWS, LCD_SEG_L1_3_0,\r
+                  display_value);\r
+    }\r
+\r
+    // Clear button flags\r
+    button.all_flags = 0;\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          display_altitude\r
+// @brief       Display routine. Supports display in meters and feet.\r
+// @param       u8 line                 LINE1\r
+//                              u8 update               DISPLAY_LINE_UPDATE_FULL,\r
+// DISPLAY_LINE_UPDATE_PARTIAL, DISPLAY_LINE_CLEAR\r
+// @return      none\r
+// *************************************************************************************************\r
+void display_altitude(u8 line, u8 update)\r
+{\r
+    u8 *str;\r
+    s16 ft;\r
+\r
+    // redraw whole screen\r
+    if (update == DISPLAY_LINE_UPDATE_FULL)\r
+    {\r
+        // Enable pressure measurement\r
+        sAlt.state = MENU_ITEM_VISIBLE;\r
+\r
+        // Start measurement\r
+        start_altitude_measurement();\r
+\r
+        if (sys.flag.use_metric_units)\r
+        {\r
+            // Display "m" symbol\r
+            display_symbol(LCD_UNIT_L1_M, SEG_ON);\r
+        }\r
+        else\r
+        {\r
+            // Display "ft" symbol\r
+            display_symbol(LCD_UNIT_L1_FT, SEG_ON);\r
+        }\r
+\r
+        // Display altitude\r
+        display_altitude(LINE1, DISPLAY_LINE_UPDATE_PARTIAL);\r
+    }\r
+    else if (update == DISPLAY_LINE_UPDATE_PARTIAL)\r
+    {\r
+        // Update display only while measurement is active\r
+        if (sAlt.timeout > 0)\r
+        {\r
+            if (sys.flag.use_metric_units)\r
+            {\r
+                // Display altitude in xxxx m format, allow 3 leading blank digits\r
+                if (sAlt.altitude >= 0)\r
+                {\r
+                    str = int_to_array(sAlt.altitude, 4, 3);\r
+                    display_symbol(LCD_SYMB_ARROW_UP, SEG_ON);\r
+                    display_symbol(LCD_SYMB_ARROW_DOWN, SEG_OFF);\r
+                }\r
+                else\r
+                {\r
+                    str = int_to_array(sAlt.altitude * (-1), 4, 3);\r
+                    display_symbol(LCD_SYMB_ARROW_UP, SEG_OFF);\r
+                    display_symbol(LCD_SYMB_ARROW_DOWN, SEG_ON);\r
+                }\r
+            }\r
+            else\r
+            {\r
+                // Convert from meters to feet\r
+                ft = convert_m_to_ft(sAlt.altitude);\r
+\r
+                // Limit to 9999ft (3047m)\r
+                if (ft > 9999)\r
+                    ft = 9999;\r
+\r
+                // Display altitude in xxxx ft format, allow 3 leading blank digits\r
+                if (ft >= 0)\r
+                {\r
+                    str = int_to_array(ft, 4, 3);\r
+                    display_symbol(LCD_SYMB_ARROW_UP, SEG_ON);\r
+                    display_symbol(LCD_SYMB_ARROW_DOWN, SEG_OFF);\r
+                }\r
+                else\r
+                {\r
+                    str = int_to_array(ft * (-1), 4, 3);\r
+                    display_symbol(LCD_SYMB_ARROW_UP, SEG_OFF);\r
+                    display_symbol(LCD_SYMB_ARROW_DOWN, SEG_ON);\r
+                }\r
+            }\r
+            display_chars(LCD_SEG_L1_3_0, str, SEG_ON);\r
+        }\r
+    }\r
+    else if (update == DISPLAY_LINE_CLEAR)\r
+    {\r
+        // Disable pressure measurement\r
+        sAlt.state = MENU_ITEM_NOT_VISIBLE;\r
+\r
+        // Stop measurement\r
+        stop_altitude_measurement();\r
+\r
+        // Clean up function-specific segments before leaving function\r
+        display_symbol(LCD_UNIT_L1_M, SEG_OFF);\r
+        display_symbol(LCD_UNIT_L1_FT, SEG_OFF);\r
+        display_symbol(LCD_SYMB_ARROW_UP, SEG_OFF);\r
+        display_symbol(LCD_SYMB_ARROW_DOWN, SEG_OFF);\r
+    }\r
+}\r
+\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/logic/altitude.h b/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/logic/altitude.h
new file mode 100755 (executable)
index 0000000..5778d44
--- /dev/null
@@ -0,0 +1,76 @@
+// *************************************************************************************************\r
+//\r
+//      Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//        Redistribution and use in source and binary forms, with or without\r
+//        modification, are permitted provided that the following conditions\r
+//        are met:\r
+//\r
+//          Redistributions of source code must retain the above copyright\r
+//          notice, this list of conditions and the following disclaimer.\r
+//\r
+//          Redistributions in binary form must reproduce the above copyright\r
+//          notice, this list of conditions and the following disclaimer in the\r
+//          documentation and/or other materials provided with the\r
+//          distribution.\r
+//\r
+//          Neither the name of Texas Instruments Incorporated nor the names of\r
+//          its contributors may be used to endorse or promote products derived\r
+//          from this software without specific prior written permission.\r
+//\r
+//        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+\r
+#ifndef ALTITUDE_H_\r
+#define ALTITUDE_H_\r
+\r
+// *************************************************************************************************\r
+// Include section\r
+\r
+// *************************************************************************************************\r
+// Prototypes section\r
+extern void reset_altitude_measurement(void);\r
+extern u8 is_altitude_measurement(void);\r
+extern void start_altitude_measurement(void);\r
+extern void stop_altitude_measurement(void);\r
+extern void do_altitude_measurement(u8 filter);\r
+\r
+// menu functions\r
+extern void sx_altitude(u8 line);\r
+extern void mx_altitude(u8 line);\r
+extern void display_altitude(u8 line, u8 update);\r
+\r
+// *************************************************************************************************\r
+// Defines section\r
+#define ALTITUDE_MEASUREMENT_TIMEOUT    (60 * 60u) // Stop altitude measurement after 60 minutes to\r
+                                                   // save battery\r
+\r
+// *************************************************************************************************\r
+// Global Variable section\r
+struct alt\r
+{\r
+    menu_t state;                                  // MENU_ITEM_NOT_VISIBLE, MENU_ITEM_VISIBLE\r
+    u32 pressure;                                  // Pressure (Pa)\r
+    u16 temperature;                               // Temperature (K)\r
+    s16 altitude;                                  // Altitude (m)\r
+    s16 altitude_offset;                           // Altitude offset stored during calibration\r
+    u16 timeout;                                   // Timeout\r
+};\r
+extern struct alt sAlt;\r
+\r
+// *************************************************************************************************\r
+// Extern section\r
+\r
+#endif                                             /*ALTITUDE_H_ */\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/logic/battery.c b/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/logic/battery.c
new file mode 100755 (executable)
index 0000000..78e0dcd
--- /dev/null
@@ -0,0 +1,184 @@
+// *************************************************************************************************\r
+//\r
+//      Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//        Redistribution and use in source and binary forms, with or without\r
+//        modification, are permitted provided that the following conditions\r
+//        are met:\r
+//\r
+//          Redistributions of source code must retain the above copyright\r
+//          notice, this list of conditions and the following disclaimer.\r
+//\r
+//          Redistributions in binary form must reproduce the above copyright\r
+//          notice, this list of conditions and the following disclaimer in the\r
+//          documentation and/or other materials provided with the\r
+//          distribution.\r
+//\r
+//          Neither the name of Texas Instruments Incorporated nor the names of\r
+//          its contributors may be used to endorse or promote products derived\r
+//          from this software without specific prior written permission.\r
+//\r
+//        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+// Battery voltage measurement functions.\r
+// *************************************************************************************************\r
+\r
+// *************************************************************************************************\r
+// Include section\r
+\r
+// system\r
+#include "project.h"\r
+\r
+// driver\r
+#include "display.h"\r
+#include "ports.h"\r
+#include "adc12.h"\r
+\r
+// logic\r
+#include "menu.h"\r
+#include "battery.h"\r
+\r
+// *************************************************************************************************\r
+// Prototypes section\r
+void reset_batt_measurement(void);\r
+void battery_measurement(void);\r
+\r
+// *************************************************************************************************\r
+// Defines section\r
+\r
+// *************************************************************************************************\r
+// Global Variable section\r
+struct batt sBatt;\r
+\r
+// *************************************************************************************************\r
+// Extern section\r
+extern void (*fptr_lcd_function_line2)(u8 line, u8 update);\r
+\r
+// *************************************************************************************************\r
+// @fn          reset_temp_measurement\r
+// @brief       Reset temperature measurement module.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void reset_batt_measurement(void)\r
+{\r
+    // Set flag to off\r
+    sBatt.state = MENU_ITEM_NOT_VISIBLE;\r
+\r
+    // Reset lobatt display counter\r
+    sBatt.lobatt_display = BATTERY_LOW_MESSAGE_CYCLE;\r
+\r
+    // Start with battery voltage of 3.00V\r
+    sBatt.voltage = 300;\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          battery_measurement\r
+// @brief       Init ADC12. Do single conversion of AVCC voltage. Turn off ADC12.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void battery_measurement(void)\r
+{\r
+    u16 voltage;\r
+\r
+    // Convert external battery voltage (ADC12INCH_11=AVCC-AVSS/2)\r
+    voltage = adc12_single_conversion(REFVSEL_1, ADC12SHT0_10, ADC12INCH_11);\r
+\r
+    // Convert ADC value to "x.xx V"\r
+    // Ideally we have A11=0->AVCC=0V ... A11=4095(2^12-1)->AVCC=4V\r
+    // --> (A11/4095)*4V=AVCC --> AVCC=(A11*4)/4095\r
+    voltage = (voltage * 2 * 2) / 41;\r
+\r
+    // Correct measured voltage with calibration value\r
+    voltage += sBatt.offset;\r
+\r
+    // Discard values that are clearly outside the measurement range\r
+    if (voltage > BATTERY_HIGH_THRESHOLD)\r
+    {\r
+        voltage = sBatt.voltage;\r
+    }\r
+\r
+    // Filter battery voltage\r
+    sBatt.voltage = ((voltage * 2) + (sBatt.voltage * 8)) / 10;\r
+\r
+    // If battery voltage falls below low battery threshold, set system flag and modify LINE2\r
+    // display function pointer\r
+    if (sBatt.voltage < BATTERY_LOW_THRESHOLD)\r
+    {\r
+        sys.flag.low_battery = 1;\r
+\r
+        // Set sticky battery icon\r
+        display_symbol(LCD_SYMB_BATTERY, SEG_ON);\r
+    }\r
+    else\r
+    {\r
+        sys.flag.low_battery = 0;\r
+\r
+        // Clear sticky battery icon\r
+        display_symbol(LCD_SYMB_BATTERY, SEG_OFF);\r
+    }\r
+    // Update LINE2\r
+    display.flag.line2_full_update = 1;\r
+\r
+    // Indicate to display function that new value is available\r
+    display.flag.update_battery_voltage = 1;\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          display_battery_V\r
+// @brief       Display routine for battery voltage.\r
+// @param       u8 line                 LINE2\r
+//                              u8 update               DISPLAY_LINE_UPDATE_FULL, DISPLAY_LINE_CLEAR\r
+// @return      none\r
+// *************************************************************************************************\r
+void display_battery_V(u8 line, u8 update)\r
+{\r
+    u8 *str;\r
+\r
+    // Redraw line\r
+    if (update == DISPLAY_LINE_UPDATE_FULL)\r
+    {\r
+        // Set battery and V icon\r
+        display_symbol(LCD_SYMB_BATTERY, SEG_ON);\r
+\r
+        // Menu item is visible\r
+        sBatt.state = MENU_ITEM_VISIBLE;\r
+\r
+        // Display result in xx.x format\r
+        str = int_to_array(sBatt.voltage, 3, 0);\r
+\r
+        display_chars(LCD_SEG_L2_2_0, str, SEG_ON);\r
+        display_symbol(LCD_SEG_L2_DP, SEG_ON);\r
+    }\r
+    else if (update == DISPLAY_LINE_UPDATE_PARTIAL)\r
+    {\r
+        // Display result in xx.x format\r
+        str = int_to_array(sBatt.voltage, 3, 0);\r
+\r
+        display_chars(LCD_SEG_L2_2_0, str, SEG_ON);\r
+\r
+        display.flag.update_battery_voltage = 0;\r
+    }\r
+    else if (update == DISPLAY_LINE_CLEAR)\r
+    {\r
+        // Menu item is not visible\r
+        sBatt.state = MENU_ITEM_NOT_VISIBLE;\r
+\r
+        // Clear function-specific symbols\r
+        display_symbol(LCD_SYMB_BATTERY, SEG_OFF);\r
+    }\r
+}\r
+\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/logic/battery.h b/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/logic/battery.h
new file mode 100755 (executable)
index 0000000..baf7608
--- /dev/null
@@ -0,0 +1,78 @@
+// *************************************************************************************************\r
+//\r
+//      Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//        Redistribution and use in source and binary forms, with or without\r
+//        modification, are permitted provided that the following conditions\r
+//        are met:\r
+//\r
+//          Redistributions of source code must retain the above copyright\r
+//          notice, this list of conditions and the following disclaimer.\r
+//\r
+//          Redistributions in binary form must reproduce the above copyright\r
+//          notice, this list of conditions and the following disclaimer in the\r
+//          documentation and/or other materials provided with the\r
+//          distribution.\r
+//\r
+//          Neither the name of Texas Instruments Incorporated nor the names of\r
+//          its contributors may be used to endorse or promote products derived\r
+//          from this software without specific prior written permission.\r
+//\r
+//        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+\r
+#ifndef BATTERY_H_\r
+#define BATTERY_H_\r
+\r
+// *************************************************************************************************\r
+// Include section\r
+\r
+// *************************************************************************************************\r
+// Prototypes section\r
+\r
+// Internal functions\r
+extern void reset_batt_measurement(void);\r
+extern void battery_measurement(void);\r
+\r
+// Menu functions\r
+extern void display_battery_V(u8 line, u8 update);\r
+\r
+// *************************************************************************************************\r
+// Defines section\r
+\r
+// Battery high voltage threshold\r
+#define BATTERY_HIGH_THRESHOLD                  (360u)\r
+\r
+// Battery end of life voltage threshold -> disable radio, show "lobatt" message\r
+#define BATTERY_LOW_THRESHOLD                   (240u)\r
+\r
+// Show "lobatt" message every n seconds\r
+#define BATTERY_LOW_MESSAGE_CYCLE               (15u)\r
+\r
+// *************************************************************************************************\r
+// Global Variable section\r
+struct batt\r
+{\r
+    menu_t state;               // MENU_ITEM_NOT_VISIBLE, MENU_ITEM_VISIBLE\r
+    u8 lobatt_display;          // Counter for alternating "lobatt" display\r
+    u16 voltage;                // Battery voltage\r
+    s16 offset;                 // Battery voltage offset\r
+};\r
+extern struct batt sBatt;\r
+\r
+// *************************************************************************************************\r
+// Extern section\r
+\r
+#endif                          /*BATTERY_H_ */\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/logic/bluerobin.c b/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/logic/bluerobin.c
new file mode 100755 (executable)
index 0000000..38273f2
--- /dev/null
@@ -0,0 +1,705 @@
+// *************************************************************************************************\r
+//\r
+//      Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//        Redistribution and use in source and binary forms, with or without\r
+//        modification, are permitted provided that the following conditions\r
+//        are met:\r
+//\r
+//          Redistributions of source code must retain the above copyright\r
+//          notice, this list of conditions and the following disclaimer.\r
+//\r
+//          Redistributions in binary form must reproduce the above copyright\r
+//          notice, this list of conditions and the following disclaimer in the\r
+//          documentation and/or other materials provided with the\r
+//          distribution.\r
+//\r
+//          Neither the name of Texas Instruments Incorporated nor the names of\r
+//          its contributors may be used to endorse or promote products derived\r
+//          from this software without specific prior written permission.\r
+//\r
+//        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+// BlueRobin functions.\r
+// *************************************************************************************************\r
+\r
+// *************************************************************************************************\r
+// Include section\r
+\r
+// system\r
+#include "project.h"\r
+\r
+// driver\r
+#include "display.h"\r
+#include "radio.h"\r
+#include "ports.h"\r
+#include "timer.h"\r
+#include "rf1a.h"\r
+\r
+// logic\r
+#include "BlueRobin_RX_API.h"\r
+#include "bluerobin.h"\r
+#include "rfsimpliciti.h"\r
+#include "user.h"\r
+\r
+// *************************************************************************************************\r
+// Prototypes section\r
+void display_calories(u8 line, u8 update);\r
+void display_distance(u8 line, u8 update);\r
+\r
+// *************************************************************************************************\r
+// Defines section\r
+\r
+// Set to TRUE if transmitter ID should be remembered when reconnecting\r
+// Transmitter ID can be cleared by pressing button STAR for more than 3 seconds\r
+#define REMEMBER_TX_ID                  (FALSE)\r
+\r
+// *************************************************************************************************\r
+// Global Variable section\r
+struct bluerobin sBlueRobin;\r
+\r
+// Display values for user gender selection\r
+const u8 selection_User_Gender[][4] = { "MALE", "FEMA" };\r
+\r
+// *************************************************************************************************\r
+// Extern section\r
+\r
+// Stop BlueRobin timer\r
+extern void BRRX__StopTimer_v(void);\r
+\r
+// Calibration value for FSCTRL0 register (corrects deviation of 26MHz crystal)\r
+extern u8 rf_frequoffset;\r
+\r
+// *************************************************************************************************\r
+// @fn          reset_bluerobin\r
+// @brief       Reset BlueRobin data.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void reset_bluerobin(void)\r
+{\r
+    // Reset state is no connection\r
+    sBlueRobin.state = BLUEROBIN_OFF;\r
+\r
+    // Reset value of chest strap ID is 0 --> connect to next best chest strap\r
+    sBlueRobin.cs_id = 0;\r
+\r
+    // No new data available\r
+    sBlueRobin.update = BLUEROBIN_NO_UPDATE;\r
+    sBlueRobin.heartrate = 0;\r
+    sBlueRobin.speed = 0;\r
+    sBlueRobin.distance = 0;\r
+    sBlueRobin.calories = 0;\r
+\r
+    // Set user data to default\r
+    sBlueRobin.user_sex = USER_SEX_MALE;\r
+    sBlueRobin.user_weight = 75;\r
+\r
+    // Display calories as default\r
+    sBlueRobin.caldist_view = 0;\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          mx_rfblue\r
+// @brief       BlueRobin sub menu.\r
+//                              Button STAR resets chest strap ID to 0 and searches for next chest\r
+// strap in range.\r
+// @param       u8 line LINE2\r
+// @return      none\r
+// *************************************************************************************************\r
+void mx_bluerobin(u8 line)\r
+{\r
+#if REMEMBER_TX_ID == TRUE\r
+    u8 i;\r
+\r
+    // Reset chest strap ID\r
+    sBlueRobin.cs_id = 0;\r
+\r
+    display_chars(LCD_SEG_L1_2_0, (u8 *) "CLR", SEG_ON);\r
+    for (i = 0; i < 4; i++)\r
+        Timer0_A4_Delay(CONV_MS_TO_TICKS(500));\r
+#endif\r
+\r
+    // Clear simulated button event\r
+    button.all_flags = 0;\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          sx_bluerobin\r
+// @brief       BlueRobin direct function. Button UP connects/disconnects with sender unit.\r
+// @param       u8 line         LINE1\r
+// @return      none\r
+// *************************************************************************************************\r
+void sx_bluerobin(u8 line)\r
+{\r
+    u8 stop = 0;\r
+\r
+    // Exit if battery voltage is too low for radio operation\r
+    if (sys.flag.low_battery)\r
+        return;\r
+\r
+    // Exit if SimpliciTI stack is active\r
+    if (is_rf())\r
+        return;\r
+\r
+    // UP: connect / disconnect transmitter\r
+    if (button.flag.up)\r
+    {\r
+        if (sBlueRobin.state == BLUEROBIN_OFF)\r
+        {\r
+            // Init BlueRobin timer and radio\r
+            open_radio();\r
+\r
+            // Initialize BR library\r
+            BRRX_Init_v();\r
+\r
+            // Set BR data transmission properties\r
+            BRRX_SetPowerdownDelay_v(10); // Power down channel after 10 consecutive lost data\r
+                                          // packets (~9 seconds)\r
+            BRRX_SetSearchTimeout_v(8);   // Stop searching after 8 seconds\r
+\r
+            // Sensitivity in learn mode reduced --> connect only to close transmitters\r
+            // Skip this part if chest strap id was set in a previous learn mode run\r
+#if REMEMBER_TX_ID == TRUE\r
+            if (sBlueRobin.cs_id == 0)\r
+                BRRX_SetSignalLevelReduction_v(5);\r
+\r
+#else\r
+            // Forget previously learned transmitter ID and connect to next close transmitter\r
+            sBlueRobin.cs_id = 0;\r
+            BRRX_SetSignalLevelReduction_v(5);\r
+#endif\r
+\r
+            // Apply frequency offset compensation to radio register FSCTRL0\r
+            // If calibration memory was erased, rf_frequoffset defaults to 0x00 and has no effect\r
+            WriteSingleReg(FSCTRL0, rf_frequoffset);\r
+\r
+            // New state is SEARCH\r
+            sBlueRobin.state = BLUEROBIN_SEARCHING;\r
+\r
+            // Blink RF icon to show searching\r
+            display_symbol(LCD_ICON_BEEPER1, SEG_ON_BLINK_ON);\r
+            display_symbol(LCD_ICON_BEEPER2, SEG_ON_BLINK_ON);\r
+            display_symbol(LCD_ICON_BEEPER3, SEG_ON_BLINK_ON);\r
+\r
+            // Turn on radio and establish connection if channel not already started\r
+            if (BRRX_GetState_t(HR_CHANNEL) == TX_OFF)\r
+            {\r
+                // Start in learn mode (connect to closest heart rate transmitter)\r
+                BRRX_SetID_v(HR_CHANNEL, sBlueRobin.cs_id);\r
+                BRRX_Start_v(HR_CHANNEL);\r
+\r
+                // Wait until learning phase is over\r
+                while (BRRX_GetState_t(HR_CHANNEL) == TX_SEARCH)\r
+                {\r
+                    Timer0_A4_Delay(CONV_MS_TO_TICKS(200));\r
+                }\r
+            }\r
+\r
+            // Check if connection attempt was successful\r
+            if (BRRX_GetState_t(HR_CHANNEL) == TX_ACTIVE)\r
+            {\r
+                // Successfully connected to transmitter\r
+                sBlueRobin.state = BLUEROBIN_CONNECTED;\r
+\r
+                // When in learn mode, copy chest strap ID\r
+                if (sBlueRobin.cs_id == 0)\r
+                {\r
+                    sBlueRobin.cs_id = BRRX_GetID_u32(HR_CHANNEL);\r
+                }\r
+\r
+                // Show steady RF icon to indicate established connection\r
+                display_symbol(LCD_ICON_BEEPER1, SEG_ON_BLINK_OFF);\r
+                display_symbol(LCD_ICON_BEEPER2, SEG_ON_BLINK_OFF);\r
+                display_symbol(LCD_ICON_BEEPER3, SEG_ON_BLINK_OFF);\r
+\r
+                // Show blinking icon\r
+                display_symbol(LCD_ICON_HEART, SEG_ON_BLINK_ON);\r
+            }\r
+            else                // Error -> Shutdown connection\r
+            {\r
+                stop = 1;\r
+            }\r
+        }\r
+        else if (sBlueRobin.state == BLUEROBIN_CONNECTED)\r
+        {\r
+            // Shutdown connection\r
+            stop = 1;\r
+        }\r
+    }\r
+\r
+    // Shutdown connection\r
+    if (stop)\r
+    {\r
+        stop_bluerobin();\r
+    }\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          display_selection_User_Gender\r
+// @brief       Display the configuration for gender in watch\r
+// @param       u8 segments                     LCD segments where value is displayed\r
+//                              u32 value                       Integer value to be displayed\r
+//                              u8 digits                       Number of digits to convert\r
+//                              u8 blanks                       Number of leadings blanks in\r
+// int_to_array result string\r
+// @return      none\r
+// *************************************************************************************************\r
+void display_selection_User_Gender(u8 segments, u32 index, u8 digits, u8 blanks)\r
+{\r
+    if (index < 2)\r
+        display_chars(segments, (u8 *) selection_User_Gender[index], SEG_ON_BLINK_ON);\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          mx_caldist\r
+// @brief       Calories/Distance sub menu. Mx enables setting of total calories, user sex and\r
+// weight.\r
+// @param       u8 line         LINE2\r
+// @return      none\r
+// *************************************************************************************************\r
+void mx_caldist(u8 line)\r
+{\r
+    u8 select;\r
+    s32 kcalories;\r
+    s32 weight;\r
+    s32 sex;\r
+\r
+    // Clear display\r
+    clear_display_all();\r
+\r
+    // Convert global variables to local variables\r
+    sex = sBlueRobin.user_sex;\r
+    kcalories = sBlueRobin.calories / 1000;\r
+    if (sys.flag.use_metric_units)\r
+        weight = sBlueRobin.user_weight;\r
+    else\r
+        weight = ((s32) sBlueRobin.user_weight * 2205) / 1000;  // Convert kg to lb\r
+\r
+    // Init value index\r
+    select = 0;\r
+\r
+    // Loop values until all are set or user breaks set\r
+    while (1)\r
+    {\r
+        // Idle timeout : exit without saving\r
+        if (sys.flag.idle_timeout)\r
+            break;\r
+\r
+        // Button STAR (short): save, then exit\r
+        if (button.flag.star)\r
+        {\r
+            // Store local variables in global structure\r
+            sBlueRobin.calories = kcalories * 1000;\r
+            sBlueRobin.user_sex = sex;\r
+            if (sys.flag.use_metric_units)\r
+                sBlueRobin.user_weight = weight;\r
+            else\r
+                sBlueRobin.user_weight = (weight * 1000) / 2205;\r
+\r
+            // Set display update flag\r
+            display.flag.line1_full_update = 1;\r
+\r
+            break;\r
+        }\r
+\r
+        switch (select)\r
+        {\r
+            case 0:            // Set calories\r
+                display_symbol(LCD_UNIT_L2_KCAL, SEG_ON);\r
+                set_value(&kcalories, 6, 5, 0, 199999, SETVALUE_DISPLAY_VALUE +\r
+                          SETVALUE_FAST_MODE + SETVALUE_NEXT_VALUE, LCD_SEG_L2_5_0,\r
+                          display_value);\r
+                display_symbol(LCD_UNIT_L2_KCAL, SEG_OFF);\r
+                clear_line(LINE2);\r
+                select = 1;\r
+                break;\r
+            case 1:            // Set user sex\r
+                set_value(\r
+                    &sex, 1, 0, 0, 1, SETVALUE_ROLLOVER_VALUE + SETVALUE_DISPLAY_SELECTION +\r
+                    SETVALUE_NEXT_VALUE, LCD_SEG_L2_3_0, display_selection_User_Gender);\r
+                select = 2;\r
+                break;\r
+            case 2:            // Set user weight\r
+                if (sys.flag.use_metric_units)\r
+                {\r
+                    display_chars(LCD_SEG_L2_1_0, (u8 *) "KG", SEG_ON);\r
+                    set_value(&weight, 3, 2, USER_WEIGHT_MIN_KG, USER_WEIGHT_MAX_KG,\r
+                              SETVALUE_DISPLAY_VALUE + SETVALUE_NEXT_VALUE, LCD_SEG_L2_4_2,\r
+                              display_value);\r
+                }\r
+                else\r
+                {\r
+                    display_chars(LCD_SEG_L2_1_0, (u8 *) "LB", SEG_ON);\r
+                    set_value(&weight, 3, 2, USER_WEIGHT_MIN_LB, USER_WEIGHT_MAX_LB,\r
+                              SETVALUE_DISPLAY_VALUE + SETVALUE_NEXT_VALUE, LCD_SEG_L2_4_2,\r
+                              display_value);\r
+                }\r
+                select = 0;\r
+                break;\r
+        }\r
+    }\r
+\r
+    // Clear button flags\r
+    button.all_flags = 0;\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          sx_caldist\r
+// @brief       Button DOWN toggles between calories and distance display.\r
+// @param       u8 line         LINE2\r
+// @return      none\r
+// *************************************************************************************************\r
+void sx_caldist(u8 line)\r
+{\r
+    // Clean up line\r
+    display_caldist(line, DISPLAY_LINE_CLEAR);\r
+\r
+    // Toggle display\r
+    if (sBlueRobin.caldist_view == 0)\r
+        sBlueRobin.caldist_view = 1;\r
+    else\r
+        sBlueRobin.caldist_view = 0;\r
+\r
+    // Draw line\r
+    display_caldist(line, DISPLAY_LINE_UPDATE_FULL);\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          display_heartrate\r
+// @brief       Heart rate display routine.\r
+// @param       u8 line LINE1\r
+//                              u8 update       DISPLAY_LINE_UPDATE_FULL,\r
+// DISPLAY_LINE_UPDATE_PARTIAL, DISPLAY_LINE_CLEAR\r
+// @return      none\r
+// *************************************************************************************************\r
+void display_heartrate(u8 line, u8 update)\r
+{\r
+    u8 *str;\r
+\r
+    if (update != DISPLAY_LINE_CLEAR)\r
+    {\r
+        if (is_bluerobin())\r
+        {\r
+            str = int_to_array(sBlueRobin.heartrate, 3, 2);\r
+            display_chars(LCD_SEG_L1_2_0, str, SEG_ON);\r
+        }\r
+        else\r
+        {\r
+            display_chars(LCD_SEG_L1_2_0, (u8 *) "---", SEG_ON);\r
+        }\r
+    }\r
+\r
+    // Redraw whole screen\r
+    if (!is_bluerobin())\r
+    {\r
+        if (update == DISPLAY_LINE_UPDATE_FULL)\r
+        {\r
+            display_symbol(LCD_ICON_HEART, SEG_ON);\r
+        }\r
+        else if (update == DISPLAY_LINE_CLEAR)\r
+        {\r
+            // Clear heart when not connected\r
+            display_symbol(LCD_ICON_HEART, SEG_OFF);\r
+        }\r
+    }\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          display_speed_kmh\r
+// @brief       Speed display routine. Supports kmh and mph.\r
+// @param       u8 line LINE1\r
+//                              u8 update       DISPLAY_LINE_UPDATE_PARTIAL,\r
+// DISPLAY_LINE_UPDATE_FULL, DISPLAY_LINE_CLEAR\r
+// @return      none\r
+// *************************************************************************************************\r
+void display_speed(u8 line, u8 update)\r
+{\r
+    u8 milesPerHour;\r
+    u8 *str;\r
+\r
+    // Speed resolution is 0.1 km/h\r
+    // Valid range is 0.0 .. 25.0 km/h\r
+\r
+    // Display resolution is 0.1km/h\r
+    // For speed less than 1 km/h, force "0.x" display\r
+    if (update != DISPLAY_LINE_CLEAR)\r
+    {\r
+        if (sys.flag.use_metric_units)\r
+        {\r
+            str = int_to_array(sBlueRobin.speed, 3, 1);\r
+        }\r
+        else\r
+        {\r
+            milesPerHour = (u16) (sBlueRobin.speed * 0.6214);\r
+            str = int_to_array(milesPerHour, 3, 1);\r
+        }\r
+        display_chars(LCD_SEG_L1_2_0, str, SEG_ON);\r
+    }\r
+\r
+    // Redraw whole screen\r
+    if (update == DISPLAY_LINE_UPDATE_FULL)\r
+    {\r
+        display_symbol(LCD_SEG_L1_DP0, SEG_ON);\r
+        if (sys.flag.use_metric_units)\r
+        {\r
+            display_symbol(LCD_UNIT_L1_K, SEG_ON);\r
+            display_symbol(LCD_UNIT_L1_M, SEG_ON);\r
+        }\r
+        else\r
+        {\r
+            display_symbol(LCD_UNIT_L1_M, SEG_ON);\r
+            display_symbol(LCD_UNIT_L1_I, SEG_ON);\r
+        }\r
+        display_symbol(LCD_UNIT_L1_PER_H, SEG_ON);\r
+    }\r
+    else if (update == DISPLAY_LINE_CLEAR)\r
+    {\r
+        display_symbol(LCD_SEG_L1_DP0, SEG_OFF);\r
+        display_symbol(LCD_UNIT_L1_K, SEG_OFF);\r
+        display_symbol(LCD_UNIT_L1_M, SEG_OFF);\r
+        display_symbol(LCD_UNIT_L1_M, SEG_OFF);\r
+        display_symbol(LCD_UNIT_L1_I, SEG_OFF);\r
+        display_symbol(LCD_UNIT_L1_PER_H, SEG_OFF);\r
+    }\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          display_distance\r
+// @brief       Distance display routine. Supports km and mi.\r
+// @param       u8 line         LINE2\r
+//                              u8 update       DISPLAY_LINE_UPDATE_PARTIAL,\r
+// DISPLAY_LINE_UPDATE_FULL, DISPLAY_LINE_CLEAR\r
+// @return      none\r
+// *************************************************************************************************\r
+void display_distance(u8 line, u8 update)\r
+{\r
+    u8 *str;\r
+    u32 miles;\r
+\r
+    if (update != DISPLAY_LINE_CLEAR)\r
+    {\r
+        if (sys.flag.use_metric_units)\r
+        {\r
+            // Display distance in x.xx km format (resolution is 10m) up to 2000.00 km\r
+            if (sBlueRobin.distance < 2000000)\r
+            {\r
+                // Convert decimal distance in meters to format "xxxx.xx" km\r
+                // If distance is less than 1000m, force display to "   0.xx"\r
+                // If distance is less than 100m, force display to "   0.0x"\r
+                str = int_to_array(sBlueRobin.distance / 10, 6, 3);\r
+            }\r
+            else\r
+            {\r
+                str = int_to_array(199999, 6, 3);\r
+            }\r
+        }\r
+        else\r
+        {\r
+            // Convert km to miles, take care for "0.xx mi" display\r
+            miles = (u32) (sBlueRobin.distance * 0.06214);\r
+\r
+            // Display distance in x.xx mi format (resolution is 1/100mi) up to 2000.00 mi\r
+            if (miles < 2000000)\r
+            {\r
+                // If distance is less than 1 mile, force display to "   0.xx"\r
+                // If distance is less than 1/10 mile, force display to "   0.0x"\r
+                str = int_to_array(miles, 6, 3);\r
+            }\r
+            else\r
+            {\r
+                // Display maximum value (1999.99 mi)\r
+                str = int_to_array(199999, 6, 3);\r
+            }\r
+        }\r
+        display_chars(LCD_SEG_L2_5_0, str, SEG_ON);\r
+    }\r
+\r
+    // Redraw whole screen\r
+    if (update == DISPLAY_LINE_UPDATE_FULL)\r
+    {\r
+        if (sys.flag.use_metric_units)\r
+        {\r
+            display_symbol(LCD_UNIT_L2_KM, SEG_ON);\r
+        }\r
+        else\r
+        {\r
+            display_symbol(LCD_UNIT_L2_MI, SEG_ON);\r
+        }\r
+        display_symbol(LCD_SEG_L2_DP, SEG_ON);\r
+    }\r
+    else if (update == DISPLAY_LINE_CLEAR)\r
+    {\r
+        display_symbol(LCD_UNIT_L2_KM, SEG_OFF);\r
+        display_symbol(LCD_UNIT_L2_MI, SEG_OFF);\r
+        display_symbol(LCD_SEG_L2_DP, SEG_OFF);\r
+    }\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          display_caldist\r
+// @brief       Shared calories/distance display routine.\r
+// @param       u8 line LINE2\r
+//                              u8 update       DISPLAY_LINE_UPDATE_PARTIAL,\r
+// DISPLAY_LINE_UPDATE_FULL, DISPLAY_LINE_CLEAR\r
+// @return      none\r
+// *************************************************************************************************\r
+void display_caldist(u8 line, u8 update)\r
+{\r
+    if (sBlueRobin.caldist_view == 0)\r
+        display_calories(line, update);\r
+    else\r
+        display_distance(line, update);\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          display_calories\r
+// @brief       Calories display routine.\r
+// @param       u8 line LINE2\r
+//                              u8 update       DISPLAY_LINE_UPDATE_PARTIAL,\r
+// DISPLAY_LINE_UPDATE_FULL, DISPLAY_LINE_CLEAR\r
+// @return      none\r
+// *************************************************************************************************\r
+void display_calories(u8 line, u8 update)\r
+{\r
+    u8 *str;\r
+\r
+    if (update != DISPLAY_LINE_CLEAR)\r
+    {\r
+        // Convert decimal calories to string\r
+        str = int_to_array(sBlueRobin.calories / 1000, 6, 5);\r
+        display_chars(LCD_SEG_L2_5_0, str, SEG_ON);\r
+    }\r
+\r
+    // Redraw whole screen\r
+    if (update == DISPLAY_LINE_UPDATE_FULL)\r
+    {\r
+        display_symbol(LCD_UNIT_L2_KCAL, SEG_ON);\r
+    }\r
+    else if (update == DISPLAY_LINE_CLEAR)\r
+    {\r
+        // Clean up symbols when leaving function\r
+        display_symbol(LCD_UNIT_L2_KCAL, SEG_OFF);\r
+    }\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          is_bluerobin\r
+// @brief       Returns TRUE if BlueRobin transmitter is connected.\r
+// @param       none\r
+// @return      u8\r
+// *************************************************************************************************\r
+u8 is_bluerobin(void)\r
+{\r
+    return (sBlueRobin.state == BLUEROBIN_CONNECTED);\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          is_bluerobin_searching\r
+// @brief       Returns TRUE if BlueRobin is searching for a transmitter.\r
+// @param       none\r
+// @return      u8\r
+// *************************************************************************************************\r
+u8 is_bluerobin_searching(void)\r
+{\r
+    return (sBlueRobin.state == BLUEROBIN_SEARCHING);\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          get_bluerobin_data\r
+// @brief       Read BlueRobin packet data from API.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void get_bluerobin_data(void)\r
+{\r
+    u16 calories;\r
+    brtx_state_t bChannelState;\r
+\r
+    // Check connection status\r
+    bChannelState = BRRX_GetState_t(HR_CHANNEL);\r
+\r
+    switch (bChannelState)\r
+    {\r
+        case TX_ACTIVE:        // Read heart rate data from BlueRobin API\r
+            sBlueRobin.heartrate = BRRX_GetHeartRate_u8();\r
+\r
+            // Read speed from BlueRobin API (only valid if sender is USB dongle)\r
+            sBlueRobin.speed = BRRX_GetSpeed_u8();\r
+\r
+            // Read distance from BlueRobin API (only valid if sender is USB dongle)\r
+            sBlueRobin.distance = BRRX_GetDistance_u16();\r
+            if (sBlueRobin.distance > 2000000)\r
+                sBlueRobin.distance = 0;\r
+\r
+            // Heart rate high enough for calorie measurement?\r
+            if (sBlueRobin.heartrate >= 65 && sBlueRobin.user_weight != 0)\r
+            {\r
+                calories = ((sBlueRobin.heartrate - 60) * sBlueRobin.user_weight) / 32;\r
+\r
+                // Calorie reduction for female user required?\r
+                if (sBlueRobin.user_sex == USER_SEX_FEMALE)\r
+                {\r
+                    calories -= calories / 4;\r
+                }\r
+\r
+                // Restart from 0 when reaching 199999 kcal\r
+                sBlueRobin.calories += calories;\r
+                if (sBlueRobin.calories > 200000000)\r
+                    sBlueRobin.calories = 0;\r
+            }\r
+            sBlueRobin.update = BLUEROBIN_NEW_DATA;\r
+            break;\r
+\r
+        case TX_OFF:           // Shutdown connection\r
+            stop_bluerobin();\r
+            break;\r
+\r
+        // BR_SEARCH, BR_LEARN, BR_PAUSE: Keep old values until we receive new data\r
+        default:\r
+            break;\r
+    }\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          stop_bluerobin\r
+// @brief       Stop communication and put peripherals in power-down mode.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void stop_bluerobin(void)\r
+{\r
+    // Reset connection status byte\r
+    sBlueRobin.state = BLUEROBIN_OFF;\r
+\r
+    // Stop channel\r
+    BRRX_Stop_v(HR_CHANNEL);\r
+\r
+    // Powerdown radio\r
+    close_radio();\r
+\r
+    // Force full display update to clear heart rate and speed data\r
+    sBlueRobin.heartrate = 0;\r
+    sBlueRobin.speed = 0;\r
+    sBlueRobin.distance = 0;\r
+    display.flag.full_update = 1;\r
+\r
+    // Clear heart and RF symbol\r
+    display_symbol(LCD_ICON_HEART, SEG_OFF_BLINK_OFF);\r
+    display_symbol(LCD_ICON_BEEPER1, SEG_OFF_BLINK_OFF);\r
+    display_symbol(LCD_ICON_BEEPER2, SEG_OFF_BLINK_OFF);\r
+    display_symbol(LCD_ICON_BEEPER3, SEG_OFF_BLINK_OFF);\r
+}\r
+\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/logic/bluerobin.h b/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/logic/bluerobin.h
new file mode 100755 (executable)
index 0000000..b545d11
--- /dev/null
@@ -0,0 +1,107 @@
+// *************************************************************************************************\r
+//\r
+//      Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//        Redistribution and use in source and binary forms, with or without\r
+//        modification, are permitted provided that the following conditions\r
+//        are met:\r
+//\r
+//          Redistributions of source code must retain the above copyright\r
+//          notice, this list of conditions and the following disclaimer.\r
+//\r
+//          Redistributions in binary form must reproduce the above copyright\r
+//          notice, this list of conditions and the following disclaimer in the\r
+//          documentation and/or other materials provided with the\r
+//          distribution.\r
+//\r
+//          Neither the name of Texas Instruments Incorporated nor the names of\r
+//          its contributors may be used to endorse or promote products derived\r
+//          from this software without specific prior written permission.\r
+//\r
+//        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+\r
+#ifndef BLUEROBIN_H_\r
+#define BLUEROBIN_H_\r
+\r
+// *************************************************************************************************\r
+// Include section\r
+#include <project.h>\r
+\r
+// *************************************************************************************************\r
+// Prototypes section\r
+extern void reset_bluerobin(void);\r
+extern void mx_bluerobin(u8 line);\r
+extern void sx_bluerobin(u8 line);\r
+extern void mx_caldist(u8 line);\r
+extern void display_heartrate(u8 line, u8 update);\r
+extern void display_speed(u8 line, u8 update);\r
+extern void sx_caldist(u8 line);\r
+extern void mx_caldist(u8 line);\r
+extern void display_caldist(u8 line, u8 update);\r
+extern u8 is_bluerobin(void);\r
+extern u8 is_bluerobin_searching(void);\r
+extern void get_bluerobin_data(void);\r
+extern void stop_bluerobin(void);\r
+\r
+// *************************************************************************************************\r
+// Defines section\r
+\r
+// BlueRobin connection states\r
+typedef enum\r
+{\r
+    BLUEROBIN_OFF = 0,          // Not connected\r
+    BLUEROBIN_SEARCHING,        // Searching for transmitter\r
+    BLUEROBIN_CONNECTED,        // Connected\r
+    BLUEROBIN_ERROR             // Error occurred while trying to connect or while connected\r
+} BlueRobin_state_t;\r
+\r
+// BlueRobin data update states\r
+typedef enum\r
+{\r
+    BLUEROBIN_NO_UPDATE = 0,    // No new data available\r
+    BLUEROBIN_NEW_DATA          // New data arrived\r
+} BlueRobin_update_t;\r
+\r
+#define USER_SEX_MALE                           0\r
+#define USER_SEX_FEMALE                         1\r
+#define USER_WEIGHT_MIN_KG                      30\r
+#define USER_WEIGHT_MAX_KG                      150\r
+#define USER_WEIGHT_MIN_LB                      70\r
+#define USER_WEIGHT_MAX_LB                      400\r
+\r
+// *************************************************************************************************\r
+// Global Variable section\r
+struct bluerobin\r
+{\r
+    BlueRobin_state_t state;    // BLUEROBIN_OFF, BLUEROBIN_SEARCHING, BLUEROBIN_CONNECTED,\r
+                                // BLUEROBIN_ERROR\r
+    BlueRobin_update_t update;  // BLUEROBIN_NO_UPDATE, BLUEROBIN_NEW_DATA\r
+    u32 cs_id;                  // Chest strap ID\r
+    u8 user_sex;                // User settings\r
+    u16 user_weight;\r
+    u8 heartrate;               // Heart rate (1 bpm)\r
+    u32 calories;               // Calories (1 kCal) - calculated from heart rate, user weight and\r
+                                // user sex\r
+    u8 speed;                   // Speed (0.1 km/h) - demo version range is 0.0 to 25.5km/h\r
+    u32 distance;               // Distance (1 m)\r
+    u8 caldist_view;            // 0=display calories, 1=display distance\r
+};\r
+extern struct bluerobin sBlueRobin;\r
+\r
+// *************************************************************************************************\r
+// Extern section\r
+\r
+#endif                          /*BLUEROBIN_H_ */\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/logic/clock.c b/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/logic/clock.c
new file mode 100755 (executable)
index 0000000..2eef524
--- /dev/null
@@ -0,0 +1,444 @@
+// *************************************************************************************************\r
+//\r
+//      Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//        Redistribution and use in source and binary forms, with or without\r
+//        modification, are permitted provided that the following conditions\r
+//        are met:\r
+//\r
+//          Redistributions of source code must retain the above copyright\r
+//          notice, this list of conditions and the following disclaimer.\r
+//\r
+//          Redistributions in binary form must reproduce the above copyright\r
+//          notice, this list of conditions and the following disclaimer in the\r
+//          documentation and/or other materials provided with the\r
+//          distribution.\r
+//\r
+//          Neither the name of Texas Instruments Incorporated nor the names of\r
+//          its contributors may be used to endorse or promote products derived\r
+//          from this software without specific prior written permission.\r
+//\r
+//        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+// Time functions.\r
+// *************************************************************************************************\r
+\r
+// *************************************************************************************************\r
+// Include section\r
+\r
+// system\r
+#include "project.h"\r
+\r
+// driver\r
+#include "ports.h"\r
+#include "display.h"\r
+#include "timer.h"\r
+\r
+// logic\r
+#include "menu.h"\r
+#include "clock.h"\r
+#include "user.h"\r
+#include "bluerobin.h"\r
+#include "date.h"\r
+\r
+// *************************************************************************************************\r
+// Prototypes section\r
+void reset_clock(void);\r
+void clock_tick(void);\r
+void mx_time(u8 line);\r
+void sx_time(u8 line);\r
+\r
+void calc_24H_to_12H(u8 * hours, u8 * timeAM);\r
+void conv_24H_to_12H(u8 * hours24, u8 * hours12, u8 * timeAMorPM);\r
+\r
+// *************************************************************************************************\r
+// Defines section\r
+\r
+// *************************************************************************************************\r
+// Global Variable section\r
+struct time sTime;\r
+\r
+// Display values for time format selection\r
+const u8 selection_Timeformat[][4] = {\r
+    "24H", "12H"\r
+};\r
+\r
+// *************************************************************************************************\r
+// Extern section\r
+extern void (*fptr_lcd_function_line1)(u8 line, u8 update);\r
+extern void (*fptr_lcd_function_line2)(u8 line, u8 update);\r
+\r
+// *************************************************************************************************\r
+// @fn          reset_clock\r
+// @brief       Resets clock time to 00:00:00, 24H time format.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void reset_clock(void)\r
+{\r
+    // Set global system time to 0\r
+    sTime.system_time = 0;\r
+\r
+    // Set main 24H time to start value\r
+    sTime.hour = 4;\r
+    sTime.minute = 30;\r
+    sTime.second = 0;\r
+\r
+    // Display style of both lines is default (HH:MM)\r
+    sTime.line1ViewStyle = DISPLAY_DEFAULT_VIEW;\r
+\r
+    // Reset timeout detection\r
+    sTime.last_activity = 0;\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          clock_tick\r
+// @brief       Add 1 second to system time and to display time\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void clock_tick(void)\r
+{\r
+    // Use sTime.drawFlag to minimize display updates\r
+    // sTime.drawFlag = 1: second\r
+    // sTime.drawFlag = 2: minute, second\r
+    // sTime.drawFlag = 3: hour, minute\r
+    sTime.drawFlag = 1;\r
+\r
+    // Increase global system time\r
+    sTime.system_time++;\r
+\r
+    // Add 1 second\r
+    sTime.second++;\r
+\r
+    // Add 1 minute\r
+    if (sTime.second == 60)\r
+    {\r
+        sTime.second = 0;\r
+        sTime.minute++;\r
+        sTime.drawFlag++;\r
+\r
+        // Add 1 hour\r
+        if (sTime.minute == 60)\r
+        {\r
+            sTime.minute = 0;\r
+            sTime.hour++;\r
+            sTime.drawFlag++;\r
+\r
+            // Add 1 day\r
+            if (sTime.hour == 24)\r
+            {\r
+                sTime.hour = 0;\r
+                add_day();\r
+            }\r
+        }\r
+    }\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          convert_hour_to_12H_format\r
+// @brief       Convert internal 24H time to 12H time.\r
+// @param       u8 hour         Hour in 24H format\r
+// @return      u8                      Hour in 12H format\r
+// *************************************************************************************************\r
+u8 convert_hour_to_12H_format(u8 hour)\r
+{\r
+    // 00:00 .. 11:59 --> AM 12:00 .. 11:59\r
+    if (hour == 0)\r
+        return (hour + 12);\r
+    else if (hour <= 12)\r
+        return (hour);\r
+    // 13:00 .. 23:59 --> PM 01:00 .. 11:59\r
+    else\r
+        return (hour - 12);\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          is_hour_am\r
+// @brief       Checks if internal 24H time is AM or PM\r
+// @param       u8 hour         Hour in 24H format\r
+// @return      u8                      1 = AM, 0 = PM\r
+// *************************************************************************************************\r
+u8 is_hour_am(u8 hour)\r
+{\r
+    // 00:00 .. 11:59 --> AM 12:00 .. 11:59\r
+    if (hour < 12)\r
+        return (1);\r
+    // 12:00 .. 23:59 --> PM 12:00 .. 11:59\r
+    else\r
+        return (0);\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          display_selection_Timeformat\r
+// @brief       Display time format 12H / 24H.\r
+// @param       u8 segments                     Target segments where to display information\r
+//                              u32 index                       0 or 1, index for value string\r
+//                              u8 digits                       Not used\r
+//                              u8 blanks                       Not used\r
+// @return      none\r
+// *************************************************************************************************\r
+void display_selection_Timeformat1(u8 segments, u32 index, u8 digits, u8 blanks)\r
+{\r
+    if (index < 2)\r
+        display_chars(segments, (u8 *) selection_Timeformat[index], SEG_ON_BLINK_ON);\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          mx_time\r
+// @brief       Clock set routine.\r
+// @param       u8 line         LINE1, LINE2\r
+// @return      none\r
+// *************************************************************************************************\r
+void mx_time(u8 line)\r
+{\r
+    u8 select;\r
+    s32 timeformat;\r
+    s16 timeformat1;\r
+    s32 hours;\r
+    s32 minutes;\r
+    s32 seconds;\r
+    u8 *str;\r
+\r
+    // Clear display\r
+    clear_display_all();\r
+\r
+    // Convert global time to local variables\r
+    // Global time keeps on ticking in background until it is overwritten\r
+    if (sys.flag.use_metric_units)\r
+    {\r
+        timeformat = TIMEFORMAT_24H;\r
+    }\r
+    else\r
+    {\r
+        timeformat = TIMEFORMAT_12H;\r
+    }\r
+    timeformat1 = timeformat;\r
+    hours = sTime.hour;\r
+    minutes = sTime.minute;\r
+    seconds = sTime.second;\r
+\r
+    // Init value index\r
+    select = 0;\r
+\r
+    // Loop values until all are set or user breaks set\r
+    while (1)\r
+    {\r
+        // Idle timeout: exit without saving\r
+        if (sys.flag.idle_timeout)\r
+        {\r
+            // Roll back time format\r
+            if (timeformat1 == TIMEFORMAT_24H)\r
+                sys.flag.use_metric_units = 1;\r
+            else\r
+                sys.flag.use_metric_units = 0;\r
+            display_symbol(LCD_SYMB_AM, SEG_OFF);\r
+            break;\r
+        }\r
+\r
+        // Button STAR (short): save, then exit\r
+        if (button.flag.star)\r
+        {\r
+            // Stop clock timer\r
+            Timer0_Stop();\r
+\r
+            // Store local variables in global clock time\r
+            sTime.hour = hours;\r
+            sTime.minute = minutes;\r
+            sTime.second = seconds;\r
+\r
+            // Start clock timer\r
+            Timer0_Start();\r
+\r
+            // Full display update is done when returning from function\r
+            display_symbol(LCD_SYMB_AM, SEG_OFF);\r
+            break;\r
+        }\r
+\r
+        switch (select)\r
+        {\r
+            case 0:            // Clear LINE1 and LINE2 and AM icon - required when coming back from\r
+                               // set_value(seconds)\r
+                clear_display();\r
+                display_symbol(LCD_SYMB_AM, SEG_OFF);\r
+\r
+                // Set 24H / 12H time format\r
+                set_value(\r
+                    &timeformat, 1, 0, 0, 1, SETVALUE_ROLLOVER_VALUE + SETVALUE_DISPLAY_SELECTION +\r
+                    SETVALUE_NEXT_VALUE, LCD_SEG_L1_3_1, display_selection_Timeformat1);\r
+\r
+                // Modify global time format variable immediately to update AM/PM icon correctly\r
+                if (timeformat == TIMEFORMAT_24H)\r
+                    sys.flag.use_metric_units = 1;\r
+                else\r
+                    sys.flag.use_metric_units = 0;\r
+                select = 1;\r
+                break;\r
+\r
+            case 1:            // Display HH:MM (LINE1) and .SS (LINE2)\r
+                str = int_to_array(hours, 2, 0);\r
+                display_chars(LCD_SEG_L1_3_2, str, SEG_ON);\r
+                display_symbol(LCD_SEG_L1_COL, SEG_ON);\r
+\r
+                str = int_to_array(minutes, 2, 0);\r
+                display_chars(LCD_SEG_L1_1_0, str, SEG_ON);\r
+\r
+                str = int_to_array(seconds, 2, 0);\r
+                display_chars(LCD_SEG_L2_1_0, str, SEG_ON);\r
+                display_symbol(LCD_SEG_L2_DP, SEG_ON);\r
+\r
+                // Set hours\r
+                set_value(&hours, 2, 0, 0, 23, SETVALUE_ROLLOVER_VALUE + SETVALUE_DISPLAY_VALUE +\r
+                          SETVALUE_NEXT_VALUE, LCD_SEG_L1_3_2,\r
+                          display_hours);\r
+                select = 2;\r
+                break;\r
+\r
+            case 2:            // Set minutes\r
+                set_value(&minutes, 2, 0, 0, 59, SETVALUE_ROLLOVER_VALUE + SETVALUE_DISPLAY_VALUE +\r
+                          SETVALUE_NEXT_VALUE, LCD_SEG_L1_1_0,\r
+                          display_value);\r
+                select = 3;\r
+                break;\r
+\r
+            case 3:            // Set seconds\r
+                set_value(&seconds, 2, 0, 0, 59, SETVALUE_ROLLOVER_VALUE + SETVALUE_DISPLAY_VALUE +\r
+                          SETVALUE_NEXT_VALUE, LCD_SEG_L2_1_0,\r
+                          display_value);\r
+                select = 0;\r
+                break;\r
+        }\r
+    }\r
+\r
+    // Clear button flags\r
+    button.all_flags = 0;\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          sx_time\r
+// @brief       Time user routine. Toggles view style between HH:MM and SS.\r
+// @param       line            LINE1\r
+// @return      none\r
+// *************************************************************************************************\r
+void sx_time(u8 line)\r
+{\r
+    // Toggle display view style\r
+    if (sTime.line1ViewStyle == DISPLAY_DEFAULT_VIEW)\r
+        sTime.line1ViewStyle = DISPLAY_ALTERNATIVE_VIEW;\r
+    else\r
+        sTime.line1ViewStyle = DISPLAY_DEFAULT_VIEW;\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          display_time\r
+// @brief       Clock display routine. Supports 24H and 12H time format.\r
+// @param       u8 line                 LINE1\r
+//                              u8 update               DISPLAY_LINE_UPDATE_FULL,\r
+// DISPLAY_LINE_UPDATE_PARTIAL\r
+// @return      none\r
+// *************************************************************************************************\r
+void display_time(u8 line, u8 update)\r
+{\r
+    u8 hour12;\r
+\r
+    // Partial update\r
+    if (update == DISPLAY_LINE_UPDATE_PARTIAL)\r
+    {\r
+        if (sTime.drawFlag != 0)\r
+        {\r
+            if (sTime.line1ViewStyle == DISPLAY_DEFAULT_VIEW)\r
+            {\r
+                switch (sTime.drawFlag)\r
+                {\r
+                    case 3:\r
+                        if (sys.flag.use_metric_units)\r
+                        {\r
+                            // Display 24H time "HH"\r
+                            display_chars(switch_seg(line, LCD_SEG_L1_3_2,\r
+                                                     LCD_SEG_L2_3_2), int_to_array(sTime.hour, 2,\r
+                                                                                   0), SEG_ON);\r
+                        }\r
+                        else\r
+                        {\r
+                            // Display 12H time "HH" + AM/PM\r
+                            hour12 = convert_hour_to_12H_format(sTime.hour);\r
+                            display_chars(switch_seg(line, LCD_SEG_L1_3_2,\r
+                                                     LCD_SEG_L2_3_2), int_to_array(hour12, 2,\r
+                                                                                   0), SEG_ON);\r
+                            display_am_pm_symbol(sTime.hour);\r
+                        }\r
+\r
+                    case 2:\r
+                        display_chars(switch_seg(line, LCD_SEG_L1_1_0,\r
+                                                 LCD_SEG_L2_1_0), int_to_array(sTime.minute, 2,\r
+                                                                               0), SEG_ON);\r
+                }\r
+            }\r
+            else\r
+            {\r
+                // Seconds are always updated\r
+                display_chars(switch_seg(line, LCD_SEG_L1_1_0,\r
+                                         LCD_SEG_L2_1_0), int_to_array(sTime.second, 2, 0), SEG_ON);\r
+            }\r
+        }\r
+    }\r
+    else if (update == DISPLAY_LINE_UPDATE_FULL)\r
+    {\r
+        // Full update\r
+        if (sTime.line1ViewStyle == DISPLAY_DEFAULT_VIEW)\r
+        {\r
+            // Display 24H/12H time\r
+            if (sys.flag.use_metric_units)\r
+            {\r
+                // Display 24H time "HH"\r
+                display_chars(switch_seg(line, LCD_SEG_L1_3_2,\r
+                                         LCD_SEG_L2_3_2), int_to_array(sTime.hour, 2, 0), SEG_ON);\r
+            }\r
+            else\r
+            {\r
+                // Display 12H time "HH" + AM/PM information\r
+                hour12 = convert_hour_to_12H_format(sTime.hour);\r
+                display_chars(switch_seg(line, LCD_SEG_L1_3_2,\r
+                                         LCD_SEG_L2_3_2), int_to_array(hour12, 2, 0), SEG_ON);\r
+                // Display AM/PM information\r
+                if (line == LINE1)\r
+                {\r
+                    display_am_pm_symbol(sTime.hour);\r
+                }\r
+            }\r
+\r
+            // Display minute\r
+            display_chars(switch_seg(line, LCD_SEG_L1_1_0,\r
+                                     LCD_SEG_L2_1_0), int_to_array(sTime.minute, 2, 0), SEG_ON);\r
+            display_symbol(switch_seg(line, LCD_SEG_L1_COL, LCD_SEG_L2_COL0), SEG_ON_BLINK_ON);\r
+        }\r
+        else\r
+        {\r
+            // Display seconds\r
+            display_chars(switch_seg(line, LCD_SEG_L1_1_0,\r
+                                     LCD_SEG_L2_1_0), int_to_array(sTime.second, 2, 0), SEG_ON);\r
+            display_symbol(switch_seg(line, LCD_SEG_L1_DP1, LCD_SEG_L2_DP), SEG_ON);\r
+        }\r
+    }\r
+    else if (update == DISPLAY_LINE_CLEAR)\r
+    {\r
+        display_symbol(switch_seg(line, LCD_SEG_L1_COL, LCD_SEG_L2_COL0), SEG_OFF_BLINK_OFF);\r
+        // Change display style to default (HH:MM)\r
+        sTime.line1ViewStyle = DISPLAY_DEFAULT_VIEW;\r
+        // Clean up AM/PM icon\r
+        display_symbol(LCD_SYMB_AM, SEG_OFF);\r
+    }\r
+}\r
+\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/logic/clock.h b/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/logic/clock.h
new file mode 100755 (executable)
index 0000000..9084b1b
--- /dev/null
@@ -0,0 +1,74 @@
+// *************************************************************************************************\r
+//\r
+//      Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//        Redistribution and use in source and binary forms, with or without\r
+//        modification, are permitted provided that the following conditions\r
+//        are met:\r
+//\r
+//          Redistributions of source code must retain the above copyright\r
+//          notice, this list of conditions and the following disclaimer.\r
+//\r
+//          Redistributions in binary form must reproduce the above copyright\r
+//          notice, this list of conditions and the following disclaimer in the\r
+//          documentation and/or other materials provided with the\r
+//          distribution.\r
+//\r
+//          Neither the name of Texas Instruments Incorporated nor the names of\r
+//          its contributors may be used to endorse or promote products derived\r
+//          from this software without specific prior written permission.\r
+//\r
+//        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+\r
+#ifndef CLOCK_H_\r
+#define CLOCK_H_\r
+\r
+// *************************************************************************************************\r
+// Defines section\r
+\r
+// Definitions for time format\r
+#define TIMEFORMAT_24H          (0u)\r
+#define TIMEFORMAT_12H          (1u)\r
+\r
+// *************************************************************************************************\r
+// Prototypes section\r
+extern void reset_clock(void);\r
+extern void sx_time(u8 line);\r
+extern void mx_time(u8 line);\r
+extern void clock_tick(void);\r
+extern void display_selection_Timeformat1(u8 segments, u32 index, u8 digits, u8 blanks);\r
+extern void display_time(u8 line, u8 update);\r
+\r
+// English units support\r
+extern void calc_24H_to_12H(u8 * hours, u8 * timeAM);\r
+extern u8 convert_hour_to_12H_format(u8 hour);\r
+extern u8 is_hour_am(u8 hour);\r
+\r
+// *************************************************************************************************\r
+// Global Variable section\r
+struct time\r
+{\r
+    u32 system_time;            // Global system time. Used to calculate last activity\r
+    u32 last_activity;          // Inactivity detection (exits set_value() function)\r
+    u8 drawFlag;                // Flag to minimize display updates\r
+    u8 line1ViewStyle;          // Viewing style\r
+    u8 hour;                    // Time data\r
+    u8 minute;                  // Time data\r
+    u8 second;                  // Time data\r
+};\r
+extern struct time sTime;\r
+\r
+#endif                          /*CLOCK_H_ */\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/logic/date.c b/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/logic/date.c
new file mode 100755 (executable)
index 0000000..e72ef3d
--- /dev/null
@@ -0,0 +1,354 @@
+// *************************************************************************************************\r
+//\r
+//      Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//        Redistribution and use in source and binary forms, with or without\r
+//        modification, are permitted provided that the following conditions\r
+//        are met:\r
+//\r
+//          Redistributions of source code must retain the above copyright\r
+//          notice, this list of conditions and the following disclaimer.\r
+//\r
+//          Redistributions in binary form must reproduce the above copyright\r
+//          notice, this list of conditions and the following disclaimer in the\r
+//          documentation and/or other materials provided with the\r
+//          distribution.\r
+//\r
+//          Neither the name of Texas Instruments Incorporated nor the names of\r
+//          its contributors may be used to endorse or promote products derived\r
+//          from this software without specific prior written permission.\r
+//\r
+//        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+// Date functions.\r
+// *************************************************************************************************\r
+\r
+// *************************************************************************************************\r
+// Include section\r
+\r
+// system\r
+#include "project.h"\r
+\r
+// driver\r
+#include "display.h"\r
+#include "ports.h"\r
+\r
+// logic\r
+#include "date.h"\r
+#include "user.h"\r
+\r
+// *************************************************************************************************\r
+// Prototypes section\r
+void reset_date(void);\r
+u8 get_numberOfDays(u8 month, u16 year);\r
+void add_day(void);\r
+void mx_date(u8 line);\r
+void sx_date(u8 line);\r
+void display_date(u8 line, u8 update);\r
+\r
+// *************************************************************************************************\r
+// Defines section\r
+\r
+// *************************************************************************************************\r
+// Global Variable section\r
+struct date sDate;\r
+\r
+// *************************************************************************************************\r
+// Extern section\r
+extern void (*fptr_lcd_function_line1)(u8 line, u8 update);\r
+extern void (*fptr_lcd_function_line2)(u8 line, u8 update);\r
+\r
+// *************************************************************************************************\r
+// @fn          reset_date\r
+// @brief       Reset date to start value.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void reset_date(void)\r
+{\r
+    // Set date\r
+    sDate.year = 2009;\r
+    sDate.month = 8;\r
+    sDate.day = 1;\r
+\r
+    // Show day and month on display\r
+    sDate.display = DISPLAY_DEFAULT_VIEW;\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          get_NumberOfDays\r
+// @brief       Return number of days for a given month\r
+// @param       month           month as char\r
+//                              year            year as int\r
+// @return                              day count for given month\r
+// *************************************************************************************************\r
+u8 get_numberOfDays(u8 month, u16 year)\r
+{\r
+    switch (month)\r
+    {\r
+        case 1:\r
+        case 3:\r
+        case 5:\r
+        case 7:\r
+        case 8:\r
+        case 10:\r
+        case 12:\r
+            return (31);\r
+\r
+        case 4:\r
+        case 6:\r
+        case 9:\r
+        case 11:\r
+            return (30);\r
+\r
+        // 1. A year that is divisible by 4 is a leap year. (Y % 4) == 0\r
+        // 2. Exception to rule 1: a year that is divisible by 100 is not a leap year. (Y % 100) !=\r
+        // 0\r
+        // 3. Exception to rule 2: a year that is divisible by 400 is a leap year. (Y % 400) == 0\r
+\r
+        case 2:\r
+            if ((year % 4 == 0) && ((year % 100 != 0) || (year % 400 == 0)))\r
+                return (29);\r
+            else\r
+                return (28);\r
+\r
+        default:\r
+            return (0);\r
+    }\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          add_day\r
+// @brief       Add one day to current date. Called when clock changes from 23:59 to 00:00\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void add_day(void)\r
+{\r
+    // Add 1 day\r
+    sDate.day++;\r
+\r
+    // Check if day overflows into next month\r
+    if (sDate.day > get_numberOfDays(sDate.month, sDate.year))\r
+    {\r
+        // Add 1 month and reset to day to 1\r
+        sDate.day = 1;\r
+        sDate.month++;\r
+\r
+        // Check if month overflows into next year\r
+        if (sDate.month > 12)\r
+        {\r
+            // Add 1 year and reset month and day to 1\r
+            sDate.day = 1;\r
+            sDate.month = 1;\r
+            sDate.year++;\r
+        }\r
+    }\r
+\r
+    // Indicate to display function that new value is available\r
+    display.flag.full_update = 1;\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          mx_date\r
+// @brief       Date set routine.\r
+// @param       line            LINE1, LINE2\r
+// @return      none\r
+// *************************************************************************************************\r
+void mx_date(u8 line)\r
+{\r
+    u8 select;\r
+    s32 day;\r
+    s32 month;\r
+    s32 year;\r
+    s16 max_days;\r
+    u8 *str;\r
+    u8 *str1;\r
+\r
+    // Clear display\r
+    clear_display_all();\r
+\r
+    // Convert global to local variables\r
+    day = sDate.day;\r
+    month = sDate.month;\r
+    year = sDate.year;\r
+\r
+    // Init value index\r
+    select = 0;\r
+\r
+    // Init display\r
+    // LINE1: DD.MM (metric units) or MM.DD (English units)\r
+    // LINE2: YYYY (will be drawn by set_value)\r
+\r
+    if (sys.flag.use_metric_units)\r
+    {\r
+        str = int_to_array(day, 2, 0);\r
+        display_chars(LCD_SEG_L1_3_2, str, SEG_ON);\r
+\r
+        str1 = int_to_array(month, 2, 0);\r
+        display_chars(LCD_SEG_L1_1_0, str1, SEG_ON);\r
+    }\r
+    else                        // English units\r
+    {\r
+        str = int_to_array(day, 2, 0);\r
+        display_chars(LCD_SEG_L1_1_0, str, SEG_ON);\r
+\r
+        str1 = int_to_array(month, 2, 0);\r
+        display_chars(LCD_SEG_L1_3_2, str1, SEG_ON);\r
+    }\r
+    display_symbol(LCD_SEG_L1_DP1, SEG_ON);\r
+\r
+    // Loop values until all are set or user breaks set\r
+    while (1)\r
+    {\r
+        // Idle timeout: exit without saving\r
+        if (sys.flag.idle_timeout)\r
+            break;\r
+\r
+        // Button STAR (short): save, then exit\r
+        if (button.flag.star)\r
+        {\r
+            // Copy local variables to global variables\r
+            sDate.day = day;\r
+            sDate.month = month;\r
+            sDate.year = year;\r
+\r
+            // Full display update is done when returning from function\r
+            break;\r
+        }\r
+\r
+        switch (select)\r
+        {\r
+            case 0:            // Set year\r
+                set_value(&year, 4, 0, 2008, 2100, SETVALUE_DISPLAY_VALUE + SETVALUE_NEXT_VALUE,\r
+                          LCD_SEG_L2_3_0,\r
+                          display_value);\r
+                select = 1;\r
+                break;\r
+            case 1:            // Set month\r
+                if (sys.flag.use_metric_units)\r
+                {\r
+                    set_value(\r
+                        &month, 2, 0, 1, 12, SETVALUE_ROLLOVER_VALUE + SETVALUE_DISPLAY_VALUE +\r
+                        SETVALUE_NEXT_VALUE, LCD_SEG_L1_1_0, display_value);\r
+                }\r
+                else           // English units\r
+                {\r
+                    set_value(\r
+                        &month, 2, 0, 1, 12, SETVALUE_ROLLOVER_VALUE + SETVALUE_DISPLAY_VALUE +\r
+                        SETVALUE_NEXT_VALUE, LCD_SEG_L1_3_2, display_value);\r
+                }\r
+                select = 2;\r
+                break;\r
+            case 2:            // Set day\r
+                if (sys.flag.use_metric_units)\r
+                {\r
+                    set_value(\r
+                        &day, 2, 0, 1, max_days, SETVALUE_ROLLOVER_VALUE + SETVALUE_DISPLAY_VALUE +\r
+                        SETVALUE_NEXT_VALUE, LCD_SEG_L1_3_2, display_value);\r
+                }\r
+                else           // English units\r
+                {\r
+                    set_value(\r
+                        &day, 2, 0, 1, max_days, SETVALUE_ROLLOVER_VALUE + SETVALUE_DISPLAY_VALUE +\r
+                        SETVALUE_NEXT_VALUE, LCD_SEG_L1_1_0, display_value);\r
+                }\r
+                select = 0;\r
+                break;\r
+        }\r
+\r
+        // Check if day is still valid, if not clamp to last day of current month\r
+        max_days = get_numberOfDays(month, year);\r
+        if (day > max_days)\r
+            day = max_days;\r
+    }\r
+\r
+    // Clear button flag\r
+    button.all_flags = 0;\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          sx_date\r
+// @brief       Date user routine. Toggles view between DD.MM and YYYY.\r
+// @param       line            LINE1, LINE2\r
+// @return      none\r
+// *************************************************************************************************\r
+void sx_date(u8 line)\r
+{\r
+    // Toggle display items\r
+    if (sDate.display == DISPLAY_DEFAULT_VIEW)\r
+        sDate.display = DISPLAY_ALTERNATIVE_VIEW;\r
+    else\r
+        sDate.display = DISPLAY_DEFAULT_VIEW;\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          display_date\r
+// @brief       Display date in DD.MM format (metric units) or MM.DD (English units).\r
+// @param       u8 line                 LINE1, LINE2\r
+//                              u8 update               DISPLAY_LINE_UPDATE_FULL,\r
+// DISPLAY_LINE_UPDATE_PARTIAL\r
+// @return      none\r
+// *************************************************************************************************\r
+void display_date(u8 line, u8 update)\r
+{\r
+    u8 *str;\r
+\r
+    if (update == DISPLAY_LINE_UPDATE_FULL)\r
+    {\r
+        if (sDate.display == DISPLAY_DEFAULT_VIEW)\r
+        {\r
+            // Convert day to string\r
+            str = int_to_array(sDate.day, 2, 0);\r
+            if (sys.flag.use_metric_units)\r
+            {\r
+                display_chars(switch_seg(line, LCD_SEG_L1_3_2, LCD_SEG_L2_3_2), str, SEG_ON);\r
+            }\r
+            else\r
+            {\r
+                display_chars(switch_seg(line, LCD_SEG_L1_1_0, LCD_SEG_L2_1_0), str, SEG_ON);\r
+            }\r
+\r
+            // Convert month to string\r
+            str = int_to_array(sDate.month, 2, 0);\r
+            if (sys.flag.use_metric_units)\r
+            {\r
+                display_chars(switch_seg(line, LCD_SEG_L1_1_0, LCD_SEG_L2_1_0), str, SEG_ON);\r
+            }\r
+            else\r
+            {\r
+                display_chars(switch_seg(line, LCD_SEG_L1_3_2, LCD_SEG_L2_3_2), str, SEG_ON);\r
+            }\r
+\r
+            // Display "." to separate day and month\r
+            display_symbol(switch_seg(line, LCD_SEG_L1_DP1, LCD_SEG_L2_DP), SEG_ON);\r
+        }\r
+        else\r
+        {\r
+            // Convert year to string\r
+            str = int_to_array(sDate.year, 4, 0);\r
+            display_chars(switch_seg(line, LCD_SEG_L1_3_0, LCD_SEG_L2_3_0), str, SEG_ON);\r
+\r
+            // Clear "."\r
+            display_symbol(switch_seg(line, LCD_SEG_L1_DP1, LCD_SEG_L2_DP), SEG_OFF);\r
+        }\r
+    }\r
+    else if (update == DISPLAY_LINE_CLEAR)\r
+    {\r
+        // Show day and month on display when coming around next time\r
+        sDate.display = DISPLAY_DEFAULT_VIEW;\r
+    }\r
+}\r
+\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/logic/date.h b/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/logic/date.h
new file mode 100755 (executable)
index 0000000..f3a65b8
--- /dev/null
@@ -0,0 +1,68 @@
+// *************************************************************************************************\r
+//\r
+//      Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//        Redistribution and use in source and binary forms, with or without\r
+//        modification, are permitted provided that the following conditions\r
+//        are met:\r
+//\r
+//          Redistributions of source code must retain the above copyright\r
+//          notice, this list of conditions and the following disclaimer.\r
+//\r
+//          Redistributions in binary form must reproduce the above copyright\r
+//          notice, this list of conditions and the following disclaimer in the\r
+//          documentation and/or other materials provided with the\r
+//          distribution.\r
+//\r
+//          Neither the name of Texas Instruments Incorporated nor the names of\r
+//          its contributors may be used to endorse or promote products derived\r
+//          from this software without specific prior written permission.\r
+//\r
+//        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+\r
+#ifndef DATE_H_\r
+#define DATE_H_\r
+\r
+// *************************************************************************************************\r
+// Include section\r
+\r
+// *************************************************************************************************\r
+// Prototypes section\r
+extern void reset_date(void);\r
+extern void add_day(void);\r
+extern void mx_date(u8 line);\r
+extern void sx_date(u8 line);\r
+extern void display_date(u8 line, u8 update);\r
+\r
+// *************************************************************************************************\r
+// Defines section\r
+\r
+// *************************************************************************************************\r
+// Global Variable section\r
+struct date\r
+{\r
+    u8 display;                 // Toggles view between DISPLAY_DEFAULT_VIEW = DD.MM and\r
+                                // DISPLAY_ALTERNATIVE_VIEW = YYYY\r
+    u8 day;\r
+    u8 month;\r
+    u16 year;\r
+};\r
+extern struct date sDate;\r
+\r
+// *************************************************************************************************\r
+// Extern section\r
+\r
+#endif                          /*DATE_H_ */\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/logic/menu.c b/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/logic/menu.c
new file mode 100755 (executable)
index 0000000..05a826a
--- /dev/null
@@ -0,0 +1,254 @@
+// *************************************************************************************************\r
+//\r
+//      Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//        Redistribution and use in source and binary forms, with or without\r
+//        modification, are permitted provided that the following conditions\r
+//        are met:\r
+//\r
+//          Redistributions of source code must retain the above copyright\r
+//          notice, this list of conditions and the following disclaimer.\r
+//\r
+//          Redistributions in binary form must reproduce the above copyright\r
+//          notice, this list of conditions and the following disclaimer in the\r
+//          documentation and/or other materials provided with the\r
+//          distribution.\r
+//\r
+//          Neither the name of Texas Instruments Incorporated nor the names of\r
+//          its contributors may be used to endorse or promote products derived\r
+//          from this software without specific prior written permission.\r
+//\r
+//        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+// Menu management functions.\r
+// *************************************************************************************************\r
+\r
+// *************************************************************************************************\r
+// Include section\r
+\r
+// system\r
+#include "project.h"\r
+\r
+// driver\r
+#include "display.h"\r
+\r
+// logic\r
+#include "menu.h"\r
+#include "user.h"\r
+#include "clock.h"\r
+#include "date.h"\r
+#include "alarm.h"\r
+#include "stopwatch.h"\r
+#include "temperature.h"\r
+#include "altitude.h"\r
+#include "battery.h"\r
+#include "bluerobin.h"\r
+#include "rfsimpliciti.h"\r
+#include "acceleration.h"\r
+#include "rfbsl.h"\r
+\r
+// *************************************************************************************************\r
+// Defines section\r
+#define FUNCTION(function)  function\r
+\r
+// *************************************************************************************************\r
+// Global Variable section\r
+const struct menu *ptrMenu_L1 = NULL;\r
+const struct menu *ptrMenu_L2 = NULL;\r
+\r
+// *************************************************************************************************\r
+// Global Variable section\r
+\r
+void display_nothing(u8 line, u8 update)\r
+{\r
+}\r
+\r
+u8 update_time(void)\r
+{\r
+    return (display.flag.update_time);\r
+}\r
+\r
+u8 update_stopwatch(void)\r
+{\r
+    return (display.flag.update_stopwatch);\r
+}\r
+\r
+u8 update_date(void)\r
+{\r
+    return (display.flag.update_date);\r
+}\r
+\r
+u8 update_alarm(void)\r
+{\r
+    return (display.flag.update_alarm);\r
+}\r
+\r
+u8 update_temperature(void)\r
+{\r
+    return (display.flag.update_temperature);\r
+}\r
+\r
+u8 update_battery_voltage(void)\r
+{\r
+    return (display.flag.update_battery_voltage);\r
+}\r
+\r
+u8 update_acceleration(void)\r
+{\r
+    return (display.flag.update_acceleration);\r
+}\r
+\r
+// *************************************************************************************************\r
+// User navigation ( [____] = default menu item after reset )\r
+//\r
+//      LINE1:  [Time] -> Alarm -> Temperature -> Altitude -> Heart rate -> Speed -> Acceleration\r
+//\r
+//      LINE2:  [Date] -> Stopwatch -> Battery  -> ACC -> PPT -> SYNC -> Calories/Distance --> RFBSL\r
+// *************************************************************************************************\r
+\r
+// Line1 - Time\r
+const struct menu menu_L1_Time = {\r
+    FUNCTION(sx_time),                // direct function\r
+    FUNCTION(mx_time),                // sub menu function\r
+    FUNCTION(display_time),           // display function\r
+    FUNCTION(update_time),            // new display data\r
+    &menu_L1_Alarm,\r
+};\r
+\r
+// Line1 - Alarm\r
+const struct menu menu_L1_Alarm = {\r
+    FUNCTION(sx_alarm),               // direct function\r
+    FUNCTION(mx_alarm),               // sub menu function\r
+    FUNCTION(display_alarm),          // display function\r
+    FUNCTION(update_alarm),           // new display data\r
+    &menu_L1_Temperature,\r
+};\r
+\r
+// Line1 - Temperature\r
+const struct menu menu_L1_Temperature = {\r
+    FUNCTION(dummy),                  // direct function\r
+    FUNCTION(mx_temperature),         // sub menu function\r
+    FUNCTION(display_temperature),    // display function\r
+    FUNCTION(update_temperature),     // new display data\r
+    &menu_L1_Altitude,\r
+};\r
+\r
+// Line1 - Altitude\r
+const struct menu menu_L1_Altitude = {\r
+    FUNCTION(sx_altitude),            // direct function\r
+    FUNCTION(mx_altitude),            // sub menu function\r
+    FUNCTION(display_altitude),       // display function\r
+    FUNCTION(update_time),            // new display data\r
+    &menu_L1_Heartrate,\r
+};\r
+\r
+// Line1 - Heart Rate\r
+const struct menu menu_L1_Heartrate = {\r
+    FUNCTION(sx_bluerobin),           // direct function\r
+    FUNCTION(mx_bluerobin),           // sub menu function\r
+    FUNCTION(display_heartrate),      // display function\r
+    FUNCTION(update_time),            // new display data\r
+    &menu_L1_Speed,\r
+};\r
+\r
+// Line1 - Speed\r
+const struct menu menu_L1_Speed = {\r
+    FUNCTION(dummy),                  // direct function\r
+    FUNCTION(dummy),                  // sub menu function\r
+    FUNCTION(display_speed),          // display function\r
+    FUNCTION(update_time),            // new display data\r
+    &menu_L1_Acceleration,\r
+};\r
+\r
+// Line1 - Acceleration\r
+const struct menu menu_L1_Acceleration = {\r
+    FUNCTION(sx_acceleration),        // direct function\r
+    FUNCTION(dummy),                  // sub menu function\r
+    FUNCTION(display_acceleration),   // display function\r
+    FUNCTION(update_acceleration),    // new display data\r
+    &menu_L1_Time,\r
+};\r
+\r
+// Line2 - Date\r
+const struct menu menu_L2_Date = {\r
+    FUNCTION(sx_date),                // direct function\r
+    FUNCTION(mx_date),                // sub menu function\r
+    FUNCTION(display_date),           // display function\r
+    FUNCTION(update_date),            // new display data\r
+    &menu_L2_Stopwatch,\r
+};\r
+\r
+// Line2 - Stopwatch\r
+const struct menu menu_L2_Stopwatch = {\r
+    FUNCTION(sx_stopwatch),           // direct function\r
+    FUNCTION(mx_stopwatch),           // sub menu function\r
+    FUNCTION(display_stopwatch),      // display function\r
+    FUNCTION(update_stopwatch),       // new display data\r
+    &menu_L2_Battery,\r
+};\r
+\r
+// Line2 - Battery\r
+const struct menu menu_L2_Battery = {\r
+    FUNCTION(dummy),                  // direct function\r
+    FUNCTION(dummy),                  // sub menu function\r
+    FUNCTION(display_battery_V),      // display function\r
+    FUNCTION(update_battery_voltage), // new display data\r
+    &menu_L2_Rf,\r
+};\r
+\r
+// Line2 - ACC (acceleration data + button events via SimpliciTI)\r
+const struct menu menu_L2_Rf = {\r
+    FUNCTION(sx_rf),                  // direct function\r
+    FUNCTION(dummy),                  // sub menu function\r
+    FUNCTION(display_rf),             // display function\r
+    FUNCTION(update_time),            // new display data\r
+    &menu_L2_Ppt,\r
+};\r
+\r
+// Line2 - PPT (button events via SimpliciTI)\r
+const struct menu menu_L2_Ppt = {\r
+    FUNCTION(sx_ppt),                 // direct function\r
+    FUNCTION(dummy),                  // sub menu function\r
+    FUNCTION(display_ppt),            // display function\r
+    FUNCTION(update_time),            // new display data\r
+    &menu_L2_Sync,\r
+};\r
+\r
+// Line2 - SXNC (synchronization/data download via SimpliciTI)\r
+const struct menu menu_L2_Sync = {\r
+    FUNCTION(sx_sync),                // direct function\r
+    FUNCTION(dummy),                  // sub menu function\r
+    FUNCTION(display_sync),           // display function\r
+    FUNCTION(update_time),            // new display data\r
+    &menu_L2_CalDist,\r
+};\r
+\r
+// Line2 - Calories/Distance\r
+const struct menu menu_L2_CalDist = {\r
+    FUNCTION(sx_caldist),             // direct function\r
+    FUNCTION(mx_caldist),             // sub menu function\r
+    FUNCTION(display_caldist),        // display function\r
+    FUNCTION(update_time),            // new display data\r
+    &menu_L2_RFBSL,\r
+};\r
+\r
+// Line2 - RFBSL\r
+const struct menu menu_L2_RFBSL = {\r
+    FUNCTION(sx_rfbsl),               // direct function\r
+    FUNCTION(dummy),                  // sub menu function\r
+    FUNCTION(display_rfbsl),          // display function\r
+    FUNCTION(update_time),            // new display data\r
+    &menu_L2_Date,\r
+};\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/logic/menu.h b/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/logic/menu.h
new file mode 100755 (executable)
index 0000000..befb3f6
--- /dev/null
@@ -0,0 +1,92 @@
+// *************************************************************************************************\r
+//\r
+//      Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//        Redistribution and use in source and binary forms, with or without\r
+//        modification, are permitted provided that the following conditions\r
+//        are met:\r
+//\r
+//          Redistributions of source code must retain the above copyright\r
+//          notice, this list of conditions and the following disclaimer.\r
+//\r
+//          Redistributions in binary form must reproduce the above copyright\r
+//          notice, this list of conditions and the following disclaimer in the\r
+//          documentation and/or other materials provided with the\r
+//          distribution.\r
+//\r
+//          Neither the name of Texas Instruments Incorporated nor the names of\r
+//          its contributors may be used to endorse or promote products derived\r
+//          from this software without specific prior written permission.\r
+//\r
+//        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+\r
+#ifndef MENU_H_\r
+#define MENU_H_\r
+\r
+// *************************************************************************************************\r
+// Include section\r
+\r
+// *************************************************************************************************\r
+// Prototypes section\r
+\r
+// *************************************************************************************************\r
+// Defines section\r
+\r
+struct menu\r
+{\r
+    // Pointer to direct function (start, stop etc)\r
+    void (*sx_function)(u8 line);\r
+    // Pointer to sub menu function (change settings, reset counter etc)\r
+    void (*mx_function)(u8 line);\r
+    // Pointer to display function\r
+    void (*display_function)(u8 line, u8 mode);\r
+    // Display update trigger\r
+    u8 (*display_update)(void);\r
+    // Pointer to next menu item\r
+    const struct menu *next;\r
+};\r
+\r
+// *************************************************************************************************\r
+// Global Variable section\r
+\r
+// *************************************************************************************************\r
+// Extern section\r
+\r
+// Line1 navigation\r
+extern const struct menu menu_L1_Time;\r
+extern const struct menu menu_L1_Alarm;\r
+extern const struct menu menu_L1_Altitude;\r
+extern const struct menu menu_L1_Temperature;\r
+extern const struct menu menu_L1_Altitude;\r
+extern const struct menu menu_L1_Heartrate;\r
+extern const struct menu menu_L1_Speed;\r
+extern const struct menu menu_L1_Acceleration;\r
+\r
+// Line2 navigation\r
+extern const struct menu menu_L2_Date;\r
+extern const struct menu menu_L2_Stopwatch;\r
+extern const struct menu menu_L2_Battery;\r
+extern const struct menu menu_L2_Rf;\r
+extern const struct menu menu_L2_Ppt;\r
+extern const struct menu menu_L2_Sync;\r
+extern const struct menu menu_L2_CalDist;\r
+extern const struct menu menu_L2_RFBSL;\r
+\r
+// Pointers to current menu item\r
+extern const struct menu *ptrMenu_L1;\r
+extern const struct menu *ptrMenu_L2;\r
+\r
+#endif                          /*MENU_H_ */\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/logic/rfbsl.c b/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/logic/rfbsl.c
new file mode 100755 (executable)
index 0000000..c32c980
--- /dev/null
@@ -0,0 +1,118 @@
+// *************************************************************************************************\r
+//\r
+//      Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//        Redistribution and use in source and binary forms, with or without\r
+//        modification, are permitted provided that the following conditions\r
+//        are met:\r
+//\r
+//          Redistributions of source code must retain the above copyright\r
+//          notice, this list of conditions and the following disclaimer.\r
+//\r
+//          Redistributions in binary form must reproduce the above copyright\r
+//          notice, this list of conditions and the following disclaimer in the\r
+//          documentation and/or other materials provided with the\r
+//          distribution.\r
+//\r
+//          Neither the name of Texas Instruments Incorporated nor the names of\r
+//          its contributors may be used to endorse or promote products derived\r
+//          from this software without specific prior written permission.\r
+//\r
+//        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+// Wireless Update functions.\r
+// *************************************************************************************************\r
+\r
+\r
+// *************************************************************************************************\r
+// Include section\r
+\r
+// system\r
+#include "project.h"\r
+\r
+// driver\r
+#include "display.h"\r
+#include "ports.h"\r
+\r
+// logic\r
+#include "rfbsl.h"\r
+#include "bluerobin.h"\r
+#include "rfsimpliciti.h"\r
+\r
+// *************************************************************************************************\r
+// Global Variable section\r
+u8 rfBSL_button_confirmation;\r
+\r
+// *************************************************************************************************\r
+// @fn          sx_rfbsl\r
+// @brief       This functions starts the RFBSL\r
+// @param       line            LINE1, LINE2\r
+// @return      none\r
+// *************************************************************************************************\r
+void sx_rfbsl(u8 line)\r
+{\r
+    // Exit if battery voltage is too low for radio operation\r
+    if (sys.flag.low_battery)\r
+        return;\r
+\r
+    // Exit if BlueRobin stack is active\r
+    if (is_bluerobin())\r
+        return;\r
+\r
+    // Exit if SimpliciTI stack is active\r
+    if (is_rf())\r
+        return;\r
+\r
+    rfBSL_button_confirmation++;\r
+\r
+    if (rfBSL_button_confirmation == 2)\r
+    {\r
+        // Before entering RFBSL clear the LINE1 Symbols\r
+        display_symbol(LCD_SYMB_AM, SEG_OFF);\r
+\r
+        clear_line(LINE1);\r
+\r
+        // Write RAM to indicate we will be downloading the RAM Updater first\r
+        display_chars(LCD_SEG_L2_5_0, (u8 *) " RFBSL", SEG_ON);\r
+        display_chars(LCD_SEG_L1_3_0, (u8 *) " RAM", SEG_ON);\r
+\r
+        // Call RFBSL\r
+        CALL_RFSBL();\r
+    }\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          display_rfbsl\r
+// @brief       RFBSL display routine.\r
+// @param       u8 line                 LINE2\r
+//                              u8 update               DISPLAY_LINE_UPDATE_FULL\r
+// @return      none\r
+// *************************************************************************************************\r
+void display_rfbsl(u8 line, u8 update)\r
+{\r
+    if (update == DISPLAY_LINE_UPDATE_FULL)\r
+    {\r
+        if (rfBSL_button_confirmation == 0)\r
+        {\r
+            display_chars(LCD_SEG_L2_5_0, (u8 *) " RFBSL", SEG_ON);\r
+        }\r
+        else if (rfBSL_button_confirmation < 2)\r
+        {\r
+            // Request one more button press to confirm rfBSL call\r
+            display_chars(LCD_SEG_L2_5_0, (u8 *) " CONF", SEG_ON);\r
+        }\r
+    }\r
+}\r
+\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/logic/rfbsl.h b/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/logic/rfbsl.h
new file mode 100755 (executable)
index 0000000..364749f
--- /dev/null
@@ -0,0 +1,55 @@
+// *************************************************************************************************\r
+//\r
+//      Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//        Redistribution and use in source and binary forms, with or without\r
+//        modification, are permitted provided that the following conditions\r
+//        are met:\r
+//\r
+//          Redistributions of source code must retain the above copyright\r
+//          notice, this list of conditions and the following disclaimer.\r
+//\r
+//          Redistributions in binary form must reproduce the above copyright\r
+//          notice, this list of conditions and the following disclaimer in the\r
+//          documentation and/or other materials provided with the\r
+//          distribution.\r
+//\r
+//          Neither the name of Texas Instruments Incorporated nor the names of\r
+//          its contributors may be used to endorse or promote products derived\r
+//          from this software without specific prior written permission.\r
+//\r
+//        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+\r
+#ifndef RFBSL_H_\r
+#define RFBSL_H_\r
+\r
+// *************************************************************************************************\r
+// Prototypes section\r
+extern void sx_rfbsl(u8 line);\r
+extern void display_rfbsl(u8 line, u8 update);\r
+\r
+// *************************************************************************************************\r
+// Defines section\r
+\r
+// Entry point of of the Flash Updater in BSL memory\r
+#define CALL_RFSBL()   ((void (*)()) 0x1000)()\r
+\r
+\r
+// *************************************************************************************************\r
+// Global Variable section\r
+extern u8 rfBSL_button_confirmation;\r
+\r
+#endif                          /*RFBSL_H_ */\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/logic/rfsimpliciti.c b/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/logic/rfsimpliciti.c
new file mode 100755 (executable)
index 0000000..d6ba6a3
--- /dev/null
@@ -0,0 +1,642 @@
+// *************************************************************************************************\r
+//\r
+//      Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//        Redistribution and use in source and binary forms, with or without\r
+//        modification, are permitted provided that the following conditions\r
+//        are met:\r
+//\r
+//          Redistributions of source code must retain the above copyright\r
+//          notice, this list of conditions and the following disclaimer.\r
+//\r
+//          Redistributions in binary form must reproduce the above copyright\r
+//          notice, this list of conditions and the following disclaimer in the\r
+//          documentation and/or other materials provided with the\r
+//          distribution.\r
+//\r
+//          Neither the name of Texas Instruments Incorporated nor the names of\r
+//          its contributors may be used to endorse or promote products derived\r
+//          from this software without specific prior written permission.\r
+//\r
+//        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+// SimpliciTI functions.\r
+// *************************************************************************************************\r
+\r
+// *************************************************************************************************\r
+// Include section\r
+\r
+// system\r
+#include "project.h"\r
+\r
+// driver\r
+#include "display.h"\r
+#include "vti_as.h"\r
+#include "ports.h"\r
+#include "timer.h"\r
+#include "radio.h"\r
+\r
+// logic\r
+#include "acceleration.h"\r
+#include "rfsimpliciti.h"\r
+#include "bluerobin.h"\r
+#include "simpliciti.h"\r
+#include "clock.h"\r
+#include "date.h"\r
+#include "alarm.h"\r
+#include "temperature.h"\r
+#include "vti_ps.h"\r
+#include "altitude.h"\r
+\r
+// *************************************************************************************************\r
+// Prototypes section\r
+void simpliciti_get_data_callback(void);\r
+void start_simpliciti_tx_only(simpliciti_mode_t mode);\r
+void start_simpliciti_sync(void);\r
+\r
+// *************************************************************************************************\r
+// Defines section\r
+\r
+// Each packet index requires 2 bytes, so we can have 9 packet indizes in 18 bytes usable payload\r
+#define BM_SYNC_BURST_PACKETS_IN_DATA           (9u)\r
+\r
+// *************************************************************************************************\r
+// Global Variable section\r
+struct RFsmpl sRFsmpl;\r
+\r
+// flag contains status information, trigger to send data and trigger to exit SimpliciTI\r
+unsigned char simpliciti_flag;\r
+\r
+// 4 data bytes to send\r
+unsigned char simpliciti_data[SIMPLICITI_MAX_PAYLOAD_LENGTH];\r
+\r
+// 4 byte device address overrides SimpliciTI end device address set in "smpl_config.dat"\r
+unsigned char simpliciti_ed_address[4];\r
+\r
+// Length of data\r
+unsigned char simpliciti_payload_length;\r
+\r
+// 1 = send one or more reply packets, 0 = no need to reply\r
+//unsigned char simpliciti_reply;\r
+unsigned char simpliciti_reply_count;\r
+\r
+// 1 = send packets sequentially from burst_start to burst_end, 2 = send packets addressed by their\r
+// index\r
+u8 burst_mode;\r
+\r
+// Start and end index of packets to send out\r
+u16 burst_start, burst_end;\r
+\r
+// Array containing requested packets\r
+u16 burst_packet[BM_SYNC_BURST_PACKETS_IN_DATA];\r
+\r
+// Current packet index\r
+u8 burst_packet_index;\r
+\r
+// *************************************************************************************************\r
+// Extern section\r
+extern void (*fptr_lcd_function_line1)(u8 line, u8 update);\r
+\r
+// *************************************************************************************************\r
+// @fn          reset_rf\r
+// @brief       Reset SimpliciTI data.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void reset_rf(void)\r
+{\r
+    // No connection\r
+    sRFsmpl.mode = SIMPLICITI_OFF;\r
+\r
+    // Standard packets are 4 bytes long\r
+    simpliciti_payload_length = 4;\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          sx_rf\r
+// @brief       Start SimpliciTI. Button DOWN connects/disconnects to access point.\r
+// @param       u8 line         LINE2\r
+// @return      none\r
+// *************************************************************************************************\r
+void sx_rf(u8 line)\r
+{\r
+    // Exit if battery voltage is too low for radio operation\r
+    if (sys.flag.low_battery)\r
+        return;\r
+\r
+    // Exit if BlueRobin stack is active\r
+    if (is_bluerobin())\r
+        return;\r
+\r
+    // Turn off the backlight\r
+    P2OUT &= ~BUTTON_BACKLIGHT_PIN;\r
+    P2DIR &= ~BUTTON_BACKLIGHT_PIN;\r
+\r
+    BUTTONS_IE &= ~BUTTON_BACKLIGHT_PIN;\r
+\r
+    // Start SimpliciTI in tx only mode\r
+    start_simpliciti_tx_only(SIMPLICITI_ACCELERATION);\r
+\r
+    BUTTONS_IE |= BUTTON_BACKLIGHT_PIN;\r
+\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          sx_ppt\r
+// @brief       Start SimpliciTI. Button DOWN connects/disconnects to access point.\r
+// @param       u8 line         LINE2\r
+// @return      none\r
+// *************************************************************************************************\r
+void sx_ppt(u8 line)\r
+{\r
+    // Exit if battery voltage is too low for radio operation\r
+    if (sys.flag.low_battery)\r
+        return;\r
+\r
+    // Exit if BlueRobin stack is active\r
+    if (is_bluerobin())\r
+        return;\r
+\r
+    // Turn off the backlight\r
+    P2OUT &= ~BUTTON_BACKLIGHT_PIN;\r
+    P2DIR &= ~BUTTON_BACKLIGHT_PIN;\r
+\r
+    BUTTONS_IE &= ~BUTTON_BACKLIGHT_PIN;\r
+\r
+    // Start SimpliciTI in tx only mode\r
+    start_simpliciti_tx_only(SIMPLICITI_BUTTONS);\r
+\r
+    BUTTONS_IE |= BUTTON_BACKLIGHT_PIN;\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          sx_sync\r
+// @brief       Start SimpliciTI. Button DOWN connects/disconnects to access point.\r
+// @param       u8 line         LINE2\r
+// @return      none\r
+// *************************************************************************************************\r
+void sx_sync(u8 line)\r
+{\r
+    // Exit if battery voltage is too low for radio operation\r
+    if (sys.flag.low_battery)\r
+        return;\r
+\r
+    // Exit if BlueRobin stack is active\r
+    if (is_bluerobin())\r
+        return;\r
+\r
+    // Turn off the backlight\r
+    P2OUT &= ~BUTTON_BACKLIGHT_PIN;\r
+    P2DIR &= ~BUTTON_BACKLIGHT_PIN;\r
+\r
+    BUTTONS_IE &= ~BUTTON_BACKLIGHT_PIN;\r
+\r
+    // Start SimpliciTI in sync mode\r
+    start_simpliciti_sync();\r
+\r
+    BUTTONS_IE |= BUTTON_BACKLIGHT_PIN;\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          start_simpliciti_tx_only\r
+// @brief       Start SimpliciTI (tx only).\r
+// @param       simpliciti_state_t              SIMPLICITI_ACCELERATION, SIMPLICITI_BUTTONS\r
+// @return      none\r
+// *************************************************************************************************\r
+void start_simpliciti_tx_only(simpliciti_mode_t mode)\r
+{\r
+    // Display time in line 1\r
+    clear_line(LINE1);\r
+    fptr_lcd_function_line1(LINE1, DISPLAY_LINE_CLEAR);\r
+    display_time(LINE1, DISPLAY_LINE_UPDATE_FULL);\r
+\r
+    // Preset simpliciti_data with mode (key or mouse click) and clear other data bytes\r
+    if (mode == SIMPLICITI_ACCELERATION)\r
+    {\r
+        simpliciti_data[0] = SIMPLICITI_MOUSE_EVENTS;\r
+    }\r
+    else\r
+    {\r
+        simpliciti_data[0] = SIMPLICITI_KEY_EVENTS;\r
+    }\r
+    simpliciti_data[1] = 0;\r
+    simpliciti_data[2] = 0;\r
+    simpliciti_data[3] = 0;\r
+\r
+    // Turn on beeper icon to show activity\r
+    display_symbol(LCD_ICON_BEEPER1, SEG_ON_BLINK_ON);\r
+    display_symbol(LCD_ICON_BEEPER2, SEG_ON_BLINK_ON);\r
+    display_symbol(LCD_ICON_BEEPER3, SEG_ON_BLINK_ON);\r
+\r
+    // Debounce button event\r
+    Timer0_A4_Delay(CONV_MS_TO_TICKS(BUTTONS_DEBOUNCE_TIME_OUT));\r
+\r
+    // Prepare radio for RF communication\r
+    open_radio();\r
+\r
+    // Set SimpliciTI mode\r
+    sRFsmpl.mode = mode;\r
+\r
+    // Set SimpliciTI timeout to save battery power\r
+    sRFsmpl.timeout = SIMPLICITI_TIMEOUT;\r
+\r
+    // Start SimpliciTI stack. Try to link to access point.\r
+    // Exit with timeout or by a button DOWN press.\r
+    if (simpliciti_link())\r
+    {\r
+        if (mode == SIMPLICITI_ACCELERATION)\r
+        {\r
+            // Start acceleration sensor\r
+            as_start();\r
+        }\r
+\r
+        // Enter TX only routine. This will transfer button events and/or acceleration data to\r
+        // access point.\r
+        simpliciti_main_tx_only();\r
+    }\r
+\r
+    // Set SimpliciTI state to OFF\r
+    sRFsmpl.mode = SIMPLICITI_OFF;\r
+\r
+    // Stop acceleration sensor\r
+    as_stop();\r
+\r
+    // Powerdown radio\r
+    close_radio();\r
+\r
+    // Clear last button events\r
+    Timer0_A4_Delay(CONV_MS_TO_TICKS(BUTTONS_DEBOUNCE_TIME_OUT));\r
+    BUTTONS_IFG = 0x00;\r
+    button.all_flags = 0;\r
+\r
+    // Clear icons\r
+    display_symbol(LCD_ICON_BEEPER1, SEG_OFF_BLINK_OFF);\r
+    display_symbol(LCD_ICON_BEEPER2, SEG_OFF_BLINK_OFF);\r
+    display_symbol(LCD_ICON_BEEPER3, SEG_OFF_BLINK_OFF);\r
+\r
+    // Clean up line 1\r
+    clear_line(LINE1);\r
+    display_time(LINE1, DISPLAY_LINE_CLEAR);\r
+\r
+    // Force full display update\r
+    display.flag.full_update = 1;\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          display_rf\r
+// @brief       SimpliciTI display routine.\r
+// @param       u8 line                 LINE2\r
+//                              u8 update               DISPLAY_LINE_UPDATE_FULL\r
+// @return      none\r
+// *************************************************************************************************\r
+void display_rf(u8 line, u8 update)\r
+{\r
+    if (update == DISPLAY_LINE_UPDATE_FULL)\r
+    {\r
+        display_chars(LCD_SEG_L2_5_0, (u8 *) "   ACC", SEG_ON);\r
+    }\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          display_ppt\r
+// @brief       SimpliciTI display routine.\r
+// @param       u8 line                 LINE2\r
+//                              u8 update               DISPLAY_LINE_UPDATE_FULL\r
+// @return      none\r
+// *************************************************************************************************\r
+void display_ppt(u8 line, u8 update)\r
+{\r
+    if (update == DISPLAY_LINE_UPDATE_FULL)\r
+    {\r
+        display_chars(LCD_SEG_L2_5_0, (u8 *) "   PPT", SEG_ON);\r
+    }\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          display_sync\r
+// @brief       SimpliciTI display routine.\r
+// @param       u8 line                 LINE2\r
+//                              u8 update               DISPLAY_LINE_UPDATE_FULL\r
+// @return      none\r
+// *************************************************************************************************\r
+void display_sync(u8 line, u8 update)\r
+{\r
+    if (update == DISPLAY_LINE_UPDATE_FULL)\r
+    {\r
+        display_chars(LCD_SEG_L2_5_0, (u8 *) "  SYNC", SEG_ON);\r
+    }\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          is_rf\r
+// @brief       Returns TRUE if SimpliciTI receiver is connected.\r
+// @param       none\r
+// @return      u8\r
+// *************************************************************************************************\r
+u8 is_rf(void)\r
+{\r
+    return (sRFsmpl.mode != SIMPLICITI_OFF);\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          simpliciti_get_ed_data_callback\r
+// @brief       Callback function to read end device data from acceleration sensor (if available)\r
+//                              and trigger sending. Can be also be used to transmit other data at\r
+// different packet rates.\r
+//                              Please observe the applicable duty limit in the chosen ISM band.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void simpliciti_get_ed_data_callback(void)\r
+{\r
+    static u8 packet_counter = 0;\r
+\r
+    if (sRFsmpl.mode == SIMPLICITI_ACCELERATION)\r
+    {\r
+        // Wait for next sample\r
+        Timer0_A4_Delay(CONV_MS_TO_TICKS(5));\r
+\r
+        // Read from sensor if DRDY pin indicates new data (set in PORT2 ISR)\r
+        if (request.flag.acceleration_measurement && ((AS_INT_IN & AS_INT_PIN) == AS_INT_PIN))\r
+        {\r
+            // Clear flag\r
+            request.flag.acceleration_measurement = 0;\r
+\r
+            // Get data from sensor\r
+            as_get_data(sAccel.xyz);\r
+\r
+            // Transmit only every 3rd data set (= 33 packets / second)\r
+            if (packet_counter++ > 1)\r
+            {\r
+                // Reset counter\r
+                packet_counter = 0;\r
+\r
+                // Store XYZ data in SimpliciTI variable\r
+                simpliciti_data[1] = sAccel.xyz[0];\r
+                simpliciti_data[2] = sAccel.xyz[1];\r
+                simpliciti_data[3] = sAccel.xyz[2];\r
+\r
+                // Trigger packet sending\r
+                simpliciti_flag |= SIMPLICITI_TRIGGER_SEND_DATA;\r
+            }\r
+        }\r
+    }\r
+    else                        // transmit only button events\r
+    {\r
+        // New button event is stored in data\r
+        if ((packet_counter == 0) && (simpliciti_data[0] & 0xF0) != 0)\r
+        {\r
+            packet_counter = 5;\r
+        }\r
+\r
+        // Send packet several times\r
+        if (packet_counter > 0)\r
+        {\r
+            // Clear button event when sending last packet\r
+            if (--packet_counter == 0)\r
+            {\r
+                simpliciti_data[0] &= ~0xF0;\r
+            }\r
+            else\r
+            {\r
+                // Trigger packet sending in regular intervals\r
+                Timer0_A4_Delay(CONV_MS_TO_TICKS(30));\r
+                simpliciti_flag |= SIMPLICITI_TRIGGER_SEND_DATA;\r
+            }\r
+        }\r
+        else\r
+        {\r
+            // Wait in LPM3 for next button press\r
+            _BIS_SR(LPM3_bits + GIE);\r
+            __no_operation();\r
+        }\r
+    }\r
+\r
+    // Update clock every 1/1 second\r
+    if (display.flag.update_time)\r
+    {\r
+        display_time(LINE1, DISPLAY_LINE_UPDATE_PARTIAL);\r
+        display.flag.update_time = 0;\r
+\r
+        // Service watchdog\r
+        WDTCTL = WDTPW + WDTIS__512K + WDTSSEL__ACLK + WDTCNTCL;\r
+    }\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          start_simpliciti_sync\r
+// @brief       Start SimpliciTI (sync mode).\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void start_simpliciti_sync(void)\r
+{\r
+    // Clear LINE1\r
+    clear_line(LINE1);\r
+    fptr_lcd_function_line1(LINE1, DISPLAY_LINE_CLEAR);\r
+\r
+    // Stop acceleration sensor\r
+    as_stop();\r
+\r
+    // Get updated altitude\r
+    start_altitude_measurement();\r
+    stop_altitude_measurement();\r
+\r
+    // Get updated temperature\r
+    temperature_measurement(FILTER_OFF);\r
+\r
+    // Turn on beeper icon to show activity\r
+    display_symbol(LCD_ICON_BEEPER1, SEG_ON_BLINK_ON);\r
+    display_symbol(LCD_ICON_BEEPER2, SEG_ON_BLINK_ON);\r
+    display_symbol(LCD_ICON_BEEPER3, SEG_ON_BLINK_ON);\r
+\r
+    // Debounce button event\r
+    Timer0_A4_Delay(CONV_MS_TO_TICKS(BUTTONS_DEBOUNCE_TIME_OUT));\r
+\r
+    // Prepare radio for RF communication\r
+    open_radio();\r
+\r
+    // Set SimpliciTI mode\r
+    sRFsmpl.mode = SIMPLICITI_SYNC;\r
+\r
+    // Set SimpliciTI timeout to save battery power\r
+    sRFsmpl.timeout = SIMPLICITI_TIMEOUT;\r
+\r
+    // Start SimpliciTI stack. Try to link to access point.\r
+    // Exit with timeout or by a button DOWN press.\r
+    if (simpliciti_link())\r
+    {\r
+        // Enter sync routine. This will send ready-to-receive packets at regular intervals to the\r
+        // access point.\r
+        // The access point replies with a command (NOP if no other command is set)\r
+        simpliciti_main_sync();\r
+    }\r
+\r
+    // Set SimpliciTI state to OFF\r
+    sRFsmpl.mode = SIMPLICITI_OFF;\r
+\r
+    // Powerdown radio\r
+    close_radio();\r
+\r
+    // Clear last button events\r
+    Timer0_A4_Delay(CONV_MS_TO_TICKS(BUTTONS_DEBOUNCE_TIME_OUT));\r
+    BUTTONS_IFG = 0x00;\r
+    button.all_flags = 0;\r
+\r
+    // Clear icons\r
+    display_symbol(LCD_ICON_BEEPER1, SEG_OFF_BLINK_OFF);\r
+    display_symbol(LCD_ICON_BEEPER2, SEG_OFF_BLINK_OFF);\r
+    display_symbol(LCD_ICON_BEEPER3, SEG_OFF_BLINK_OFF);\r
+\r
+    // Force full display update\r
+    display.flag.full_update = 1;\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          simpliciti_sync_decode_ap_cmd_callback\r
+// @brief       For SYNC mode only: Decode command from access point and trigger actions.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void simpliciti_sync_decode_ap_cmd_callback(void)\r
+{\r
+    u8 i;\r
+    s16 t1, offset;\r
+\r
+    // Default behaviour is to send no reply packets\r
+    simpliciti_reply_count = 0;\r
+\r
+    switch (simpliciti_data[0])\r
+    {\r
+        case SYNC_AP_CMD_NOP:\r
+            break;\r
+\r
+        case SYNC_AP_CMD_GET_STATUS: // Send watch parameters\r
+            simpliciti_data[0] = SYNC_ED_TYPE_STATUS;\r
+            // Send single reply packet\r
+            simpliciti_reply_count = 1;\r
+            break;\r
+\r
+        case SYNC_AP_CMD_SET_WATCH:  // Set watch parameters\r
+            sys.flag.use_metric_units = (simpliciti_data[1] >> 7) & 0x01;\r
+            sTime.hour = simpliciti_data[1] & 0x7F;\r
+            sTime.minute = simpliciti_data[2];\r
+            sTime.second = simpliciti_data[3];\r
+            sDate.year = (simpliciti_data[4] << 8) + simpliciti_data[5];\r
+            sDate.month = simpliciti_data[6];\r
+            sDate.day = simpliciti_data[7];\r
+            sAlarm.hour = simpliciti_data[8];\r
+            sAlarm.minute = simpliciti_data[9];\r
+            // Set temperature and temperature offset\r
+            t1 = (s16) ((simpliciti_data[10] << 8) + simpliciti_data[11]);\r
+            offset = t1 - (sTemp.degrees - sTemp.offset);\r
+            sTemp.offset = offset;\r
+            sTemp.degrees = t1;\r
+            // Set altitude\r
+            sAlt.altitude = (s16) ((simpliciti_data[12] << 8) + simpliciti_data[13]);\r
+            update_pressure_table(sAlt.altitude, sAlt.pressure, sAlt.temperature);\r
+\r
+            display_chars(LCD_SEG_L2_5_0, (u8 *) "  DONE", SEG_ON);\r
+            sRFsmpl.display_sync_done = 1;\r
+            break;\r
+\r
+        case SYNC_AP_CMD_GET_MEMORY_BLOCKS_MODE_1:\r
+            // Send sequential packets out in a burst\r
+            simpliciti_data[0] = SYNC_ED_TYPE_MEMORY;\r
+            // Get burst start and end packet\r
+            burst_start = (simpliciti_data[1] << 8) + simpliciti_data[2];\r
+            burst_end = (simpliciti_data[3] << 8) + simpliciti_data[4];\r
+            // Set burst mode\r
+            burst_mode = 1;\r
+            // Number of packets to send\r
+            simpliciti_reply_count = burst_end - burst_start;\r
+            break;\r
+\r
+        case SYNC_AP_CMD_GET_MEMORY_BLOCKS_MODE_2:\r
+            // Send specified packets out in a burst\r
+            simpliciti_data[0] = SYNC_ED_TYPE_MEMORY;\r
+            // Store the requested packets\r
+            for (i = 0; i < BM_SYNC_BURST_PACKETS_IN_DATA; i++)\r
+            {\r
+                burst_packet[i] = (simpliciti_data[i * 2 + 1] << 8) + simpliciti_data[i * 2 + 2];\r
+            }\r
+            // Set burst mode\r
+            burst_mode = 2;\r
+            // Number of packets to send\r
+            simpliciti_reply_count = BM_SYNC_BURST_PACKETS_IN_DATA;\r
+            break;\r
+\r
+        case SYNC_AP_CMD_ERASE_MEMORY: // Erase data logger memory\r
+            break;\r
+\r
+        case SYNC_AP_CMD_EXIT:         // Exit sync mode\r
+            simpliciti_flag |= SIMPLICITI_TRIGGER_STOP;\r
+            break;\r
+    }\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          simpliciti_sync_get_data_callback\r
+// @brief       For SYNC mode only: Access point has requested data. Copy this data into the TX\r
+// buffer now.\r
+// @param       u16 index               Index used for memory requests\r
+// @return      none\r
+// *************************************************************************************************\r
+void simpliciti_sync_get_data_callback(unsigned int index)\r
+{\r
+    u8 i;\r
+\r
+    // simpliciti_data[0] contains data type and needs to be returned to AP\r
+    switch (simpliciti_data[0])\r
+    {\r
+        case SYNC_ED_TYPE_STATUS: // Assemble status packet\r
+            simpliciti_data[1] = (sys.flag.use_metric_units << 7) | (sTime.hour & 0x7F);\r
+            simpliciti_data[2] = sTime.minute;\r
+            simpliciti_data[3] = sTime.second;\r
+            simpliciti_data[4] = sDate.year >> 8;\r
+            simpliciti_data[5] = sDate.year & 0xFF;\r
+            simpliciti_data[6] = sDate.month;\r
+            simpliciti_data[7] = sDate.day;\r
+            simpliciti_data[8] = sAlarm.hour;\r
+            simpliciti_data[9] = sAlarm.minute;\r
+            simpliciti_data[10] = sTemp.degrees >> 8;\r
+            simpliciti_data[11] = sTemp.degrees & 0xFF;\r
+            simpliciti_data[12] = sAlt.altitude >> 8;\r
+            simpliciti_data[13] = sAlt.altitude & 0xFF;\r
+            break;\r
+\r
+        case SYNC_ED_TYPE_MEMORY:\r
+            if (burst_mode == 1)\r
+            {\r
+                // Set burst packet address\r
+                simpliciti_data[1] = ((burst_start + index) >> 8) & 0xFF;\r
+                simpliciti_data[2] = (burst_start + index) & 0xFF;\r
+                // Assemble payload\r
+                for (i = 3; i < BM_SYNC_DATA_LENGTH; i++)\r
+                    simpliciti_data[i] = index;\r
+            }\r
+            else if (burst_mode == 2)\r
+            {\r
+                // Set burst packet address\r
+                simpliciti_data[1] = (burst_packet[index] >> 8) & 0xFF;\r
+                simpliciti_data[2] = burst_packet[index] & 0xFF;\r
+                // Assemble payload\r
+                for (i = 3; i < BM_SYNC_DATA_LENGTH; i++)\r
+                    simpliciti_data[i] = index;\r
+            }\r
+            break;\r
+    }\r
+}\r
+\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/logic/rfsimpliciti.h b/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/logic/rfsimpliciti.h
new file mode 100755 (executable)
index 0000000..cd02f41
--- /dev/null
@@ -0,0 +1,98 @@
+// *************************************************************************************************\r
+//\r
+//      Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//        Redistribution and use in source and binary forms, with or without\r
+//        modification, are permitted provided that the following conditions\r
+//        are met:\r
+//\r
+//          Redistributions of source code must retain the above copyright\r
+//          notice, this list of conditions and the following disclaimer.\r
+//\r
+//          Redistributions in binary form must reproduce the above copyright\r
+//          notice, this list of conditions and the following disclaimer in the\r
+//          documentation and/or other materials provided with the\r
+//          distribution.\r
+//\r
+//          Neither the name of Texas Instruments Incorporated nor the names of\r
+//          its contributors may be used to endorse or promote products derived\r
+//          from this software without specific prior written permission.\r
+//\r
+//        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+\r
+#ifndef RFSIMPLICITI_H_\r
+#define RFSIMPLICITI_H_\r
+\r
+// *************************************************************************************************\r
+// Include section\r
+\r
+// *************************************************************************************************\r
+// Prototypes section\r
+extern void reset_rf(void);\r
+extern void sx_rf(u8 line);\r
+extern void sx_ppt(u8 line);\r
+extern void sx_sync(u8 line);\r
+extern void display_rf(u8 line, u8 update);\r
+extern void display_ppt(u8 line, u8 update);\r
+extern void display_sync(u8 line, u8 update);\r
+extern void send_smpl_data(u16 data);\r
+extern u8 is_rf(void);\r
+\r
+// *************************************************************************************************\r
+// Defines section\r
+\r
+// SimpliciTI connection states\r
+typedef enum\r
+{\r
+    SIMPLICITI_OFF = 0,         // Not connected\r
+    SIMPLICITI_ACCELERATION,    // Transmitting acceleration data and button events\r
+    SIMPLICITI_BUTTONS,         // Transmitting button events\r
+    SIMPLICITI_SYNC             // Syncing\r
+} simpliciti_mode_t;\r
+\r
+// Stop SimpliciTI transmission after 60 minutes to save power\r
+#define SIMPLICITI_TIMEOUT                          (60 * 60u)\r
+\r
+// Button flags for SimpliciTI data\r
+#define SIMPLICITI_BUTTON_STAR                  (0x10)\r
+#define SIMPLICITI_BUTTON_NUM                   (0x20)\r
+#define SIMPLICITI_BUTTON_UP                    (0x30)\r
+\r
+// SimpliciTI mode flag\r
+#define SIMPLICITI_MOUSE_EVENTS                 (0x01)\r
+#define SIMPLICITI_KEY_EVENTS                   (0x02)\r
+\r
+// *************************************************************************************************\r
+// Global Variable section\r
+struct RFsmpl\r
+{\r
+    // SIMPLICITI_OFF, SIMPLICITI_ACCELERATION, SIMPLICITI_BUTTONS\r
+    simpliciti_mode_t mode;\r
+\r
+    // Timeout until SimpliciTI transmission is automatically stopped\r
+    u16 timeout;\r
+\r
+    // Variable to display\r
+    u8 display_sync_done;\r
+};\r
+extern struct RFsmpl sRFsmpl;\r
+\r
+extern unsigned char simpliciti_flag;\r
+\r
+// *************************************************************************************************\r
+// Extern section\r
+\r
+#endif                          /*RFSIMPLICITI_H_ */\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/logic/stopwatch.c b/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/logic/stopwatch.c
new file mode 100755 (executable)
index 0000000..18d112b
--- /dev/null
@@ -0,0 +1,444 @@
+// *************************************************************************************************\r
+//\r
+//      Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//        Redistribution and use in source and binary forms, with or without\r
+//        modification, are permitted provided that the following conditions\r
+//        are met:\r
+//\r
+//          Redistributions of source code must retain the above copyright\r
+//          notice, this list of conditions and the following disclaimer.\r
+//\r
+//          Redistributions in binary form must reproduce the above copyright\r
+//          notice, this list of conditions and the following disclaimer in the\r
+//          documentation and/or other materials provided with the\r
+//          distribution.\r
+//\r
+//          Neither the name of Texas Instruments Incorporated nor the names of\r
+//          its contributors may be used to endorse or promote products derived\r
+//          from this software without specific prior written permission.\r
+//\r
+//        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+// Stopwatch functions.\r
+// *************************************************************************************************\r
+\r
+// *************************************************************************************************\r
+// Include section\r
+\r
+// system\r
+#include "project.h"\r
+#include <string.h>\r
+\r
+// driver\r
+#include "stopwatch.h"\r
+#include "ports.h"\r
+#include "display.h"\r
+#include "timer.h"\r
+\r
+// logic\r
+#include "menu.h"\r
+\r
+// *************************************************************************************************\r
+// Prototypes section\r
+void start_stopwatch(void);\r
+void stop_stopwatch(void);\r
+void reset_stopwatch(void);\r
+void stopwatch_tick(void);\r
+void update_stopwatch_timer(void);\r
+void mx_stopwatch(u8 line);\r
+void sx_stopwatch(u8 line);\r
+void display_stopwatch(u8 line, u8 update);\r
+\r
+// *************************************************************************************************\r
+// Defines section\r
+\r
+// *************************************************************************************************\r
+// Global Variable section\r
+struct stopwatch sStopwatch;\r
+\r
+// *************************************************************************************************\r
+// Extern section\r
+\r
+// *************************************************************************************************\r
+// @fn          update_stopwatch_timer\r
+// @brief       Set new compare time for next 1/1Hz or 1/100Hz interrupt. Takes care for exact 1\r
+// second timing.\r
+// @param       ticks (1 tick = 1/32768 sec)\r
+// @return      none\r
+// *************************************************************************************************\r
+void update_stopwatch_timer(void)\r
+{\r
+    u16 value;\r
+\r
+    // Load CCR register with next capture time\r
+    if (sStopwatch.viewStyle == DISPLAY_DEFAULT_VIEW)\r
+    {\r
+        // Timer interrupts occur every 32768/100 = 328 ACLK\r
+        // --> stopwatch runs too slow (1 sec nominal != 100 interupts * 328 ACLK = 32800 ACLK =\r
+        // 1.00098 sec)\r
+        // --> ideally correct timer value every 10 ticks by (32768 - 32800)/10 = 3.2\r
+        // --> correct timer value every 10Hz by 3,\r
+        // --> correct timer value every 1Hz correct by 5\r
+        value = TA0CCR2 + STOPWATCH_100HZ_TICK;\r
+\r
+        if (sStopwatch.swtIs1Hz)\r
+        {\r
+            value -= 5;\r
+            sStopwatch.swtIs1Hz = 0;\r
+            sStopwatch.swtIs10Hz = 0;\r
+        }\r
+        else if (sStopwatch.swtIs10Hz)\r
+        {\r
+            value -= 3;\r
+            sStopwatch.swtIs10Hz = 0;\r
+        }\r
+    }\r
+    else                        // Alternative view\r
+    {\r
+        // Timer interrupts occur every 32768/1 = 32768 ACLK\r
+        value = TA0CCR2;\r
+        value +=  STOPWATCH_1HZ_TICK;\r
+    }\r
+\r
+    // Update CCR\r
+    TA0CCR2 = value;\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          stopwatch_tick\r
+// @brief       Called by 1/100Hz interrupt handler.\r
+//                              Increases stopwatch counter and triggers display update.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void stopwatch_tick(void)\r
+{\r
+    static u8 delay = 0;\r
+\r
+    // Default view (< 20 minutes): display and count MM:SS:hh\r
+    if (sStopwatch.viewStyle == DISPLAY_DEFAULT_VIEW)\r
+    {\r
+        // Add 1/100 sec\r
+        sStopwatch.time[7]++;\r
+\r
+        // Draw flag minimizes display update activity\r
+        //\r
+        // swt.drawFlag = 1: second L\r
+        // swt.drawFlag = 2: second H/L\r
+        // swt.drawFlag = 3: minutes L, second H/L\r
+        // swt.drawFlag = 4: minutes H/L, second H/L\r
+        // swt.drawFlag = 5: hours L, minutes H/L, second H/L\r
+        // swt.drawFlag = 6: hours H/L, minutes H/L, second H/L\r
+        // swt.drawFlag = 7: 1/10 sec, 1/100 sec\r
+        // swt.drawFlag = 8: 1/100 sec (every 17/100 sec to reduce display draw activity)\r
+        if (delay++ > 17)\r
+        {\r
+            sStopwatch.drawFlag = 8;\r
+            delay = 0;\r
+        }\r
+\r
+        // Add 1/10 sec\r
+        if (sStopwatch.time[7] == 0x3A)\r
+        {\r
+            sStopwatch.time[7] = '0';\r
+            sStopwatch.time[6]++;\r
+\r
+            // 1/10Hz trigger\r
+            sStopwatch.swtIs10Hz = 1;\r
+\r
+            // Update draw flag\r
+            sStopwatch.drawFlag = 7;\r
+        }\r
+    }\r
+    else                        // Alternative view (20 minutes .. 20 hours): display and count\r
+                                // HH:MM:SS\r
+    {\r
+        // Just add 1 second\r
+        sStopwatch.time[6] = 0x3A;\r
+    }\r
+\r
+    // Second overflow?\r
+    if (sStopwatch.time[6] == 0x3A)\r
+    {\r
+        // Reset draw flag\r
+        sStopwatch.drawFlag = 1;\r
+\r
+        // 1Hz trigger\r
+        sStopwatch.swtIs1Hz = 1;\r
+\r
+        // Add data\r
+        sStopwatch.time[6] = '0';\r
+        sStopwatch.time[5]++;                      // second  L (0 - 9)\r
+        if (sStopwatch.time[5] == 0x3A)\r
+        {\r
+            sStopwatch.drawFlag++;                 // 2\r
+            sStopwatch.time[5] = '0';\r
+            sStopwatch.time[4]++;                  // second  H (0 - 5)\r
+            if (sStopwatch.time[4] == '6')\r
+            {\r
+                sStopwatch.drawFlag++;             // 3\r
+                sStopwatch.time[4] = '0';\r
+                sStopwatch.time[3]++;              // minutes L (0 - 9)\r
+                if (sStopwatch.time[3] == 0x3A)\r
+                {\r
+                    sStopwatch.drawFlag++;         // 4\r
+                    sStopwatch.time[3] = '0';\r
+                    sStopwatch.time[2]++;          // minutes H (0 - 5)\r
+                    if (sStopwatch.time[2] == '2')\r
+                    {\r
+                        // SWT display changes from MM:SS:hh to HH:MM:SS when reaching 20 minutes\r
+                        sStopwatch.viewStyle = DISPLAY_ALTERNATIVE_VIEW;\r
+                        display_stopwatch(LINE2, DISPLAY_LINE_UPDATE_FULL);\r
+\r
+                    }\r
+                    else if (sStopwatch.time[2] == '6')\r
+                    {\r
+                        sStopwatch.drawFlag++;     // 5\r
+                        sStopwatch.time[2] = '0';\r
+                        sStopwatch.time[1]++;      // hours L (0-9)\r
+\r
+                        if (sStopwatch.time[1] == 0x3A)\r
+                        {\r
+                            sStopwatch.drawFlag++; // 6\r
+                            sStopwatch.time[1] = '0';\r
+                            sStopwatch.time[0]++;  // hours H (0-1)\r
+\r
+                            if (sStopwatch.time[0] == '2')\r
+                            {\r
+                                // When reaching 20 hours, start over\r
+                                reset_stopwatch();\r
+                                sStopwatch.state = STOPWATCH_RUN;\r
+                                display_stopwatch(LINE2, DISPLAY_LINE_UPDATE_FULL);\r
+                            }\r
+                        }\r
+                    }\r
+                }\r
+            }\r
+        }\r
+    }\r
+\r
+    // Always set display update flag\r
+    display.flag.update_stopwatch = 1;\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          reset_stopwatch\r
+// @brief       Clears stopwatch counter and sets stopwatch state to off.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void reset_stopwatch(void)\r
+{\r
+    // Clear counter\r
+    memcpy(sStopwatch.time, "00000000", sizeof(sStopwatch.time));\r
+\r
+    // Clear trigger\r
+    sStopwatch.swtIs10Hz = 0;   // 1/10Hz trigger\r
+    sStopwatch.swtIs1Hz = 0;    // 1Hz trigger\r
+\r
+    // Init stopwatch state 'Off'\r
+    sStopwatch.state = STOPWATCH_STOP;\r
+\r
+    // Default display style is MM:SS:HH\r
+    sStopwatch.viewStyle = DISPLAY_DEFAULT_VIEW;\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          is_stopwatch\r
+// @brief       Is stopwatch operating and visible?\r
+// @param       none\r
+// @return      1=STOPWATCH_RUN, 0=other states\r
+// *************************************************************************************************\r
+u8 is_stopwatch(void)\r
+{\r
+    return ((sStopwatch.state == STOPWATCH_RUN) && (ptrMenu_L2 == &menu_L2_Stopwatch));\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          start_stopwatch\r
+// @brief       Starts stopwatch timer interrupt and sets stopwatch state to on.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void start_stopwatch(void)\r
+{\r
+    // Set stopwatch run flag\r
+    sStopwatch.state = STOPWATCH_RUN;\r
+\r
+    // Init CCR register with current time\r
+    TA0CCR2 = TA0R;\r
+\r
+    // Load CCR register with next capture time\r
+    update_stopwatch_timer();\r
+\r
+    // Reset IRQ flag\r
+    TA0CCTL2 &= ~CCIFG;\r
+\r
+    // Enable timer interrupt\r
+    TA0CCTL2 |= CCIE;\r
+\r
+    // Set stopwatch icon\r
+    display_symbol(LCD_ICON_STOPWATCH, SEG_ON);\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          stop_stopwatch\r
+// @brief       Stops stopwatch timer interrupt and sets stopwatch state to off.\r
+//                              Does not reset stopwatch count.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void stop_stopwatch(void)\r
+{\r
+    // Clear timer interrupt enable\r
+    TA0CCTL2 &= ~CCIE;\r
+\r
+    // Clear stopwatch run flag\r
+    sStopwatch.state = STOPWATCH_STOP;\r
+\r
+    // Clear stopwatch icon\r
+    display_symbol(LCD_ICON_STOPWATCH, SEG_OFF);\r
+\r
+    // Call draw routine immediately\r
+    display_stopwatch(LINE2, DISPLAY_LINE_UPDATE_FULL);\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          mx_stopwatch\r
+// @brief       Stopwatch set routine. Mx stops stopwatch and resets count.\r
+// @param       u8 line LINE2\r
+// @return      none\r
+// *************************************************************************************************\r
+void mx_stopwatch(u8 line)\r
+{\r
+    // Stop stopwatch\r
+    stop_stopwatch();\r
+\r
+    // Reset stopwatch count\r
+    reset_stopwatch();\r
+\r
+    // Display "00:00:00"\r
+    display_stopwatch(line, DISPLAY_LINE_UPDATE_FULL);\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          sx_stopwatch\r
+// @brief       Stopwatch direct function. Button DOWN starts/stops stopwatch, but does not reset\r
+// count.\r
+// @param       u8 line LINE2\r
+// @return      none\r
+// *************************************************************************************************\r
+void sx_stopwatch(u8 line)\r
+{\r
+    // DOWN: RUN, STOP\r
+    if (button.flag.down)\r
+    {\r
+        if (sStopwatch.state == STOPWATCH_STOP)\r
+        {\r
+            // (Re)start stopwatch\r
+            start_stopwatch();\r
+        }\r
+        else\r
+        {\r
+            // Stop stopwatch\r
+            stop_stopwatch();\r
+        }\r
+\r
+    }\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          display_stopwatch\r
+// @brief       Stopwatch user routine. Sx starts/stops stopwatch, but does not reset count.\r
+// @param       u8 line LINE2\r
+//                              u8 update       DISPLAY_LINE_UPDATE_PARTIAL,\r
+// DISPLAY_LINE_UPDATE_FULL\r
+// @return      none\r
+// *************************************************************************************************\r
+void display_stopwatch(u8 line, u8 update)\r
+{\r
+    // Partial line update only\r
+    if (update == DISPLAY_LINE_UPDATE_PARTIAL)\r
+    {\r
+        if (display.flag.update_stopwatch)\r
+        {\r
+            if (sStopwatch.viewStyle == DISPLAY_DEFAULT_VIEW)\r
+            {\r
+                // Display MM:SS:hh\r
+\r
+                // Check draw flag to minimize workload\r
+                if (sStopwatch.drawFlag != 0)\r
+                {\r
+                    switch (sStopwatch.drawFlag)\r
+                    {\r
+                        case 4:\r
+                            display_char(LCD_SEG_L2_5, sStopwatch.time[2], SEG_ON);\r
+                        case 3:\r
+                            display_char(LCD_SEG_L2_4, sStopwatch.time[3], SEG_ON);\r
+                        case 2:\r
+                            display_char(LCD_SEG_L2_3, sStopwatch.time[4], SEG_ON);\r
+                        case 1:\r
+                            display_char(LCD_SEG_L2_2, sStopwatch.time[5], SEG_ON);\r
+                        case 7:\r
+                            display_char(LCD_SEG_L2_1, sStopwatch.time[6], SEG_ON);\r
+                        case 8:\r
+                            display_char(LCD_SEG_L2_0, sStopwatch.time[7], SEG_ON);\r
+                    }\r
+                }\r
+            }\r
+            else                // DISPLAY_ALTERNATIVE_VIEW\r
+            {\r
+                // Display HH:MM:SS\r
+                switch (sStopwatch.drawFlag)\r
+                {\r
+                    case 6:\r
+                        display_char(LCD_SEG_L2_5, sStopwatch.time[0], SEG_ON);\r
+                    case 5:\r
+                        display_char(LCD_SEG_L2_4, sStopwatch.time[1], SEG_ON);\r
+                    case 4:\r
+                        display_char(LCD_SEG_L2_3, sStopwatch.time[2], SEG_ON);\r
+                    case 3:\r
+                        display_char(LCD_SEG_L2_2, sStopwatch.time[3], SEG_ON);\r
+                    case 2:\r
+                        display_char(LCD_SEG_L2_1, sStopwatch.time[4], SEG_ON);\r
+                    case 1:\r
+                        display_char(LCD_SEG_L2_0, sStopwatch.time[5], SEG_ON);\r
+                }\r
+            }\r
+        }\r
+    }\r
+    // Redraw whole line\r
+    else if (update == DISPLAY_LINE_UPDATE_FULL)\r
+    {\r
+        if (sStopwatch.viewStyle == DISPLAY_DEFAULT_VIEW)\r
+        {\r
+            // Display MM:SS:hh\r
+            display_chars(LCD_SEG_L2_5_0, sStopwatch.time + 2, SEG_ON);\r
+        }\r
+        else                    // DISPLAY_ALTERNATIVE_VIEW\r
+        {\r
+            // Display HH:MM:SS\r
+            display_chars(LCD_SEG_L2_5_0, sStopwatch.time, SEG_ON);\r
+        }\r
+        display_symbol(LCD_SEG_L2_COL1, SEG_ON);\r
+        display_symbol(LCD_SEG_L2_COL0, SEG_ON);\r
+    }\r
+    else if (update == DISPLAY_LINE_CLEAR)\r
+    {\r
+        // Clean up symbols when leaving function\r
+    }\r
+}\r
+\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/logic/stopwatch.h b/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/logic/stopwatch.h
new file mode 100755 (executable)
index 0000000..3676491
--- /dev/null
@@ -0,0 +1,89 @@
+// *************************************************************************************************\r
+//\r
+//      Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//        Redistribution and use in source and binary forms, with or without\r
+//        modification, are permitted provided that the following conditions\r
+//        are met:\r
+//\r
+//          Redistributions of source code must retain the above copyright\r
+//          notice, this list of conditions and the following disclaimer.\r
+//\r
+//          Redistributions in binary form must reproduce the above copyright\r
+//          notice, this list of conditions and the following disclaimer in the\r
+//          documentation and/or other materials provided with the\r
+//          distribution.\r
+//\r
+//          Neither the name of Texas Instruments Incorporated nor the names of\r
+//          its contributors may be used to endorse or promote products derived\r
+//          from this software without specific prior written permission.\r
+//\r
+//        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+\r
+#ifndef STOPWATCH_H_\r
+#define STOPWATCH_H_\r
+\r
+// *************************************************************************************************\r
+// Include section\r
+#include <project.h>\r
+\r
+// *************************************************************************************************\r
+// Prototypes section\r
+extern void start_stopwatch(void);\r
+extern void stop_stopwatch(void);\r
+extern void reset_stopwatch(void);\r
+extern u8 is_stopwatch(void);\r
+extern void stopwatch_tick(void);\r
+extern void update_stopwatch_timer(void);\r
+extern void mx_stopwatch(u8 line);\r
+extern void sx_stopwatch(u8 line);\r
+extern void display_stopwatch(u8 line, u8 update);\r
+\r
+// *************************************************************************************************\r
+// Defines section\r
+#define STOPWATCH_1HZ_TICK                      (32768 / 1)\r
+#define STOPWATCH_100HZ_TICK            (32768 / 100)\r
+#define STOPWATCH_STOP                          (0u)\r
+#define STOPWATCH_RUN                           (1u)\r
+#define STOPWATCH_HIDE                          (2u)\r
+\r
+// *************************************************************************************************\r
+// Global Variable section\r
+struct stopwatch\r
+{\r
+    u8 state;\r
+    u8 drawFlag;\r
+    u8 swtIs1Hz;\r
+    u8 swtIs10Hz;\r
+\r
+    u8 time[8];                 // time[0]      hour H\r
+    // time[1]      hour L\r
+    // time[2]      minute H\r
+    // time[3]      minute L\r
+    // time[4]      second H\r
+    // time[5]      second L\r
+    // time[6]      1/10 sec\r
+    // time[7]      1/100 sec\r
+\r
+    // Display style\r
+    u8 viewStyle;\r
+};\r
+extern struct stopwatch sStopwatch;\r
+\r
+// *************************************************************************************************\r
+// Extern section\r
+\r
+#endif                          /*STOPWATCH_H_ */\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/logic/temperature.c b/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/logic/temperature.c
new file mode 100755 (executable)
index 0000000..8da9472
--- /dev/null
@@ -0,0 +1,332 @@
+// *************************************************************************************************\r
+//\r
+//      Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//        Redistribution and use in source and binary forms, with or without\r
+//        modification, are permitted provided that the following conditions\r
+//        are met:\r
+//\r
+//          Redistributions of source code must retain the above copyright\r
+//          notice, this list of conditions and the following disclaimer.\r
+//\r
+//          Redistributions in binary form must reproduce the above copyright\r
+//          notice, this list of conditions and the following disclaimer in the\r
+//          documentation and/or other materials provided with the\r
+//          distribution.\r
+//\r
+//          Neither the name of Texas Instruments Incorporated nor the names of\r
+//          its contributors may be used to endorse or promote products derived\r
+//          from this software without specific prior written permission.\r
+//\r
+//        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+// Temperature measurement functions.\r
+// *************************************************************************************************\r
+\r
+// *************************************************************************************************\r
+// Include section\r
+\r
+// system\r
+#include "project.h"\r
+\r
+// driver\r
+#include "temperature.h"\r
+#include "ports.h"\r
+#include "display.h"\r
+#include "adc12.h"\r
+#include "timer.h"\r
+\r
+// logic\r
+#include "user.h"\r
+\r
+// *************************************************************************************************\r
+// Prototypes section\r
+u8 is_temp_measurement(void);\r
+s16 convert_C_to_F(s16 value);\r
+s16 convert_F_to_C(s16 value);\r
+\r
+// *************************************************************************************************\r
+// Defines section\r
+\r
+// *************************************************************************************************\r
+// Global Variable section\r
+struct temp sTemp;\r
+\r
+// *************************************************************************************************\r
+// Extern section\r
+\r
+// *************************************************************************************************\r
+// @fn          reset_temp_measurement\r
+// @brief       Reset temperature measurement module.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void reset_temp_measurement(void)\r
+{\r
+    // Set flag to off\r
+    sTemp.state = MENU_ITEM_NOT_VISIBLE;\r
+\r
+    // Perform one temperature measurements with disabled filter\r
+    temperature_measurement(FILTER_OFF);\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          temperature_measurement\r
+// @brief       Init ADC12. Do single conversion of temperature sensor voltage. Turn off ADC12.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void temperature_measurement(u8 filter)\r
+{\r
+    u16 adc_result;\r
+    volatile s32 temperature;\r
+\r
+    // Convert internal temperature diode voltage\r
+    adc_result = adc12_single_conversion(REFVSEL_0, ADC12SHT0_8, ADC12INCH_10);\r
+\r
+    // Convert ADC value to "xx.x °C"\r
+    // Temperature in Celsius\r
+    // ((A10/4096*1500mV) - 680mV)*(1/2.25mV) = (A10/4096*667) - 302\r
+    // = (A10 - 1855) * (667 / 4096)\r
+    temperature = (((s32) ((s32) adc_result - 1855)) * 667 * 10) / 4096;\r
+\r
+    // Add temperature offset\r
+    temperature += sTemp.offset;\r
+\r
+    // Store measured temperature\r
+    if (filter == FILTER_ON)\r
+    {\r
+        // Change temperature in 0.1° steps towards measured value\r
+        if (temperature > sTemp.degrees)\r
+            sTemp.degrees += 1;\r
+        else if (temperature < sTemp.degrees)\r
+            sTemp.degrees -= 1;\r
+    }\r
+    else\r
+    {\r
+        // Override filter\r
+        sTemp.degrees = (s16) temperature;\r
+    }\r
+\r
+    // New data is available --> do display update\r
+    display.flag.update_temperature = 1;\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          convert_C_to_F\r
+// @brief       Convert °C to °F\r
+// @param       s16 value               Temperature in °C\r
+// @return      s16                     Temperature in °F\r
+// *************************************************************************************************\r
+s16 convert_C_to_F(s16 value)\r
+{\r
+    s16 DegF;\r
+\r
+    // Celsius in Fahrenheit = (( TCelsius × 9 ) / 5 ) + 32\r
+    DegF = ((value * 9 * 10) / 5 / 10) + 32 * 10;\r
+\r
+    return (DegF);\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          convert_F_to_C\r
+// @brief       Convert °F to °C\r
+// @param       s16 value               Temperature in 2.1 °F\r
+// @return      s16                     Temperature in 2.1 °C\r
+// *************************************************************************************************\r
+s16 convert_F_to_C(s16 value)\r
+{\r
+    s16 DegC;\r
+\r
+    // TCelsius =( TFahrenheit - 32 ) × 5 / 9\r
+    DegC = (((value - 320) * 5)) / 9;\r
+\r
+    return (DegC);\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          is_temp_measurement\r
+// @brief       Returns TRUE if temperature measurement is enabled.\r
+// @param       none\r
+// @return      u8\r
+// *************************************************************************************************\r
+u8 is_temp_measurement(void)\r
+{\r
+    return (sTemp.state == MENU_ITEM_VISIBLE);\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          mx_temperature\r
+// @brief       Mx button handler to set the temperature offset.\r
+// @param       u8 line         LINE1\r
+// @return      none\r
+// *************************************************************************************************\r
+void mx_temperature(u8 line)\r
+{\r
+    s32 temperature;\r
+    s16 temperature0;\r
+    volatile s16 temperature1;\r
+    volatile s16 offset;\r
+\r
+    // Clear display\r
+    clear_display_all();\r
+\r
+    // When using English units, convert internal °C to °F before handing over value to set_value\r
+    // function\r
+    if (!sys.flag.use_metric_units)\r
+    {\r
+        // Convert global variable to local variable\r
+        temperature = convert_C_to_F(sTemp.degrees);\r
+        temperature0 = sTemp.degrees;\r
+    }\r
+    else\r
+    {\r
+        // Convert global variable to local variable\r
+        temperature = sTemp.degrees;\r
+        temperature0 = temperature;\r
+    }\r
+\r
+    // Loop values until all are set or user breaks set\r
+    while (1)\r
+    {\r
+        // Idle timeout: exit without saving\r
+        if (sys.flag.idle_timeout)\r
+            break;\r
+\r
+        // Button STAR (short): save, then exit\r
+        if (button.flag.star)\r
+        {\r
+            // For English units, convert set °F to °C\r
+            if (!sys.flag.use_metric_units)\r
+            {\r
+                temperature1 = convert_F_to_C(temperature);\r
+            }\r
+            else\r
+            {\r
+                temperature1 = temperature;\r
+            }\r
+\r
+            // New offset is difference between old and new value\r
+            offset = temperature1 - temperature0;\r
+            sTemp.offset += offset;\r
+\r
+            // Force filter to new value\r
+            sTemp.degrees = temperature1;\r
+\r
+            // Set display update flag\r
+            display.flag.line1_full_update = 1;\r
+\r
+            break;\r
+        }\r
+\r
+        // Display °C or °F depending on unit system\r
+        if (sys.flag.use_metric_units)\r
+            display_char(LCD_SEG_L1_0, 'C', SEG_ON);\r
+        else\r
+            display_char(LCD_SEG_L1_0, 'F', SEG_ON);\r
+        display_symbol(LCD_SEG_L1_DP1, SEG_ON);\r
+        display_symbol(LCD_UNIT_L1_DEGREE, SEG_ON);\r
+\r
+        // Set current temperature - offset is set when leaving function\r
+        set_value(&temperature, 3, 1, -999, 999, SETVALUE_DISPLAY_VALUE + SETVALUE_DISPLAY_ARROWS,\r
+                  LCD_SEG_L1_3_1,\r
+                  display_value);\r
+    }\r
+\r
+    // Clear button flags\r
+    button.all_flags = 0;\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          display_temperature\r
+// @brief       Common display routine for metric and English units.\r
+// @param       u8 line                 LINE1\r
+//                              u8 update               DISPLAY_LINE_UPDATE_FULL, DISPLAY_LINE_CLEAR\r
+// @return      none\r
+// *************************************************************************************************\r
+void display_temperature(u8 line, u8 update)\r
+{\r
+    u8 *str;\r
+    s16 temperature;\r
+\r
+    // Redraw whole screen\r
+    if (update == DISPLAY_LINE_UPDATE_FULL)\r
+    {\r
+        // Menu item is visible\r
+        sTemp.state = MENU_ITEM_VISIBLE;\r
+\r
+        // Display °C / °F\r
+        display_symbol(LCD_SEG_L1_DP1, SEG_ON);\r
+        display_symbol(LCD_UNIT_L1_DEGREE, SEG_ON);\r
+        if (sys.flag.use_metric_units)\r
+            display_char(LCD_SEG_L1_0, 'C', SEG_ON);\r
+        else\r
+            display_char(LCD_SEG_L1_0, 'F', SEG_ON);\r
+\r
+        // Perform one temperature measurement with disabled filter\r
+        temperature_measurement(FILTER_OFF);\r
+\r
+        // Display temperature\r
+        display_temperature(LINE1, DISPLAY_LINE_UPDATE_PARTIAL);\r
+    }\r
+    else if (update == DISPLAY_LINE_UPDATE_PARTIAL)\r
+    {\r
+        // When using English units, convert °C to °F (temp*1.8+32)\r
+        if (!sys.flag.use_metric_units)\r
+        {\r
+            temperature = convert_C_to_F(sTemp.degrees);\r
+        }\r
+        else\r
+        {\r
+            temperature = sTemp.degrees;\r
+        }\r
+\r
+        // Indicate temperature sign through arrow up/down icon\r
+        if (temperature < 0)\r
+        {\r
+            // Convert negative to positive number\r
+            temperature = ~temperature;\r
+            temperature += 1;\r
+\r
+            display_symbol(LCD_SYMB_ARROW_UP, SEG_OFF);\r
+            display_symbol(LCD_SYMB_ARROW_DOWN, SEG_ON);\r
+        }\r
+        else                    // Temperature is >= 0\r
+        {\r
+            display_symbol(LCD_SYMB_ARROW_UP, SEG_ON);\r
+            display_symbol(LCD_SYMB_ARROW_DOWN, SEG_OFF);\r
+        }\r
+\r
+        // Limit min/max temperature to +/- 99.9 °C / °F\r
+        if (temperature > 999)\r
+            temperature = 999;\r
+\r
+        // Display result in xx.x format\r
+        str = int_to_array(temperature, 3, 1);\r
+        display_chars(LCD_SEG_L1_3_1, str, SEG_ON);\r
+    }\r
+    else if (update == DISPLAY_LINE_CLEAR)\r
+    {\r
+        // Menu item is not visible\r
+        sTemp.state = MENU_ITEM_NOT_VISIBLE;\r
+\r
+        // Clean up function-specific segments before leaving function\r
+        display_symbol(LCD_SYMB_ARROW_UP, SEG_OFF);\r
+        display_symbol(LCD_SYMB_ARROW_DOWN, SEG_OFF);\r
+        display_symbol(LCD_UNIT_L1_DEGREE, SEG_OFF);\r
+        display_symbol(LCD_SEG_L1_DP1, SEG_OFF);\r
+    }\r
+}\r
+\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/logic/temperature.h b/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/logic/temperature.h
new file mode 100755 (executable)
index 0000000..68a2138
--- /dev/null
@@ -0,0 +1,70 @@
+// *************************************************************************************************\r
+//\r
+//      Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//        Redistribution and use in source and binary forms, with or without\r
+//        modification, are permitted provided that the following conditions\r
+//        are met:\r
+//\r
+//          Redistributions of source code must retain the above copyright\r
+//          notice, this list of conditions and the following disclaimer.\r
+//\r
+//          Redistributions in binary form must reproduce the above copyright\r
+//          notice, this list of conditions and the following disclaimer in the\r
+//          documentation and/or other materials provided with the\r
+//          distribution.\r
+//\r
+//          Neither the name of Texas Instruments Incorporated nor the names of\r
+//          its contributors may be used to endorse or promote products derived\r
+//          from this software without specific prior written permission.\r
+//\r
+//        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+\r
+#ifndef TEMPERATURE_H_\r
+#define TEMPERATURE_H_\r
+\r
+// *************************************************************************************************\r
+// Include section\r
+\r
+// *************************************************************************************************\r
+// Prototypes section\r
+\r
+// internal functions\r
+extern void reset_temp_measurement(void);\r
+extern u8 is_temp_measurement(void);\r
+extern void temperature_measurement(u8 filter);\r
+\r
+// menu functions\r
+extern void mx_temperature(u8 line);\r
+extern void display_temperature(u8 line, u8 update);\r
+\r
+// *************************************************************************************************\r
+// Defines section\r
+\r
+// *************************************************************************************************\r
+// Global Variable section\r
+struct temp\r
+{\r
+    menu_t state;               // MENU_ITEM_NOT_VISIBLE, MENU_ITEM_VISIBLE\r
+    s16 degrees;                // Temperature (°C) in 2.1 format\r
+    s16 offset;                 // User set calibration value (°C) in 2.1 format\r
+};\r
+extern struct temp sTemp;\r
+\r
+// *************************************************************************************************\r
+// Extern section\r
+\r
+#endif                          /*TEMPERATURE_H_ */\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/logic/test.c b/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/logic/test.c
new file mode 100755 (executable)
index 0000000..3ef6dcd
--- /dev/null
@@ -0,0 +1,296 @@
+// *************************************************************************************************\r
+//\r
+//      Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//        Redistribution and use in source and binary forms, with or without\r
+//        modification, are permitted provided that the following conditions\r
+//        are met:\r
+//\r
+//          Redistributions of source code must retain the above copyright\r
+//          notice, this list of conditions and the following disclaimer.\r
+//\r
+//          Redistributions in binary form must reproduce the above copyright\r
+//          notice, this list of conditions and the following disclaimer in the\r
+//          documentation and/or other materials provided with the\r
+//          distribution.\r
+//\r
+//          Neither the name of Texas Instruments Incorporated nor the names of\r
+//          its contributors may be used to endorse or promote products derived\r
+//          from this software without specific prior written permission.\r
+//\r
+//        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+// Test functions.\r
+// *************************************************************************************************\r
+\r
+// *************************************************************************************************\r
+// Include section\r
+\r
+// system\r
+#include "project.h"\r
+\r
+// driver\r
+#include "display.h"\r
+#include "vti_as.h"\r
+#include "vti_ps.h"\r
+#include "ports.h"\r
+#include "timer.h"\r
+\r
+// logic\r
+#include "acceleration.h"\r
+#include "altitude.h"\r
+#include "temperature.h"\r
+#include "bluerobin.h"\r
+#include "test.h"\r
+\r
+// *************************************************************************************************\r
+// Global Variable section\r
+\r
+// *************************************************************************************************\r
+// Prototype section\r
+\r
+// *************************************************************************************************\r
+// @fn          test_mode\r
+// @brief       Manual test mode. Activated by holding buttons STAR and UP simultaneously.\r
+//                              Cancelled by any other button press.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void test_mode(void)\r
+{\r
+    u8 test_step, start_next_test;\r
+    u8 *str;\r
+    u8 i;\r
+\r
+    // Disable timer - no need for a clock tick\r
+    Timer0_Stop();\r
+\r
+    // Disable LCD charge pump while in standby mode\r
+    // This reduces current consumption by ca. 5µA to ca. 10µA\r
+    LCDBVCTL = 0;\r
+\r
+    // Show welcome screen\r
+    display_chars(LCD_SEG_L1_3_0, (u8 *) "0430", SEG_ON);\r
+    display_chars(LCD_SEG_L2_4_0, (u8 *) "CC430", SEG_ON);\r
+    display_symbol(LCD_SEG_L1_COL, SEG_ON);\r
+    display_symbol(LCD_ICON_HEART, SEG_ON);\r
+    display_symbol(LCD_ICON_STOPWATCH, SEG_ON);\r
+    display_symbol(LCD_ICON_RECORD, SEG_ON);\r
+    display_symbol(LCD_ICON_ALARM, SEG_ON);\r
+    display_symbol(LCD_ICON_BEEPER1, SEG_ON);\r
+    display_symbol(LCD_ICON_BEEPER2, SEG_ON);\r
+    display_symbol(LCD_ICON_BEEPER3, SEG_ON);\r
+    display_symbol(LCD_SYMB_ARROW_UP, SEG_ON);\r
+    display_symbol(LCD_SYMB_ARROW_DOWN, SEG_ON);\r
+    display_symbol(LCD_SYMB_AM, SEG_ON);\r
+\r
+    // Hold watchdog\r
+    WDTCTL = WDTPW + WDTHOLD;\r
+\r
+    // Wait for button press\r
+    _BIS_SR(LPM3_bits + GIE);\r
+    __no_operation();\r
+\r
+    // Clear display\r
+    display_all_off();\r
+\r
+#ifdef USE_LCD_CHARGE_PUMP\r
+    // Charge pump voltage generated internally, internal bias (V2-V4) generation\r
+    // This ensures that the contrast and LCD control is constant for the whole battery lifetime\r
+    LCDBVCTL = LCDCPEN | VLCD_2_72;\r
+#endif\r
+\r
+    // Renenable timer\r
+    Timer0_Start();\r
+\r
+    // Debounce button press\r
+    Timer0_A4_Delay(CONV_MS_TO_TICKS(100));\r
+\r
+    while (1)\r
+    {\r
+        // Check button event\r
+        if (BUTTON_STAR_IS_PRESSED && BUTTON_UP_IS_PRESSED)\r
+        {\r
+            // Start with test #0\r
+            test_step = 0;\r
+            start_next_test = 1;\r
+            while (1)\r
+            {\r
+                if (start_next_test)\r
+                {\r
+                    // Clean up previous test display\r
+                    display_all_off();\r
+\r
+                    start_next_test = 0;\r
+\r
+                    switch (test_step)\r
+                    {\r
+                        case 0: // All LCD segments on\r
+                            display_all_on();\r
+                            // Wait until buttons are off\r
+                            while (BUTTON_STAR_IS_PRESSED && BUTTON_UP_IS_PRESSED) ;\r
+                            break;\r
+                        case 1: // Altitude measurement\r
+                            display_altitude(LINE1, DISPLAY_LINE_UPDATE_FULL);\r
+                            for (i = 0; i < 2; i++)\r
+                            {\r
+                                while ((PS_INT_IN & PS_INT_PIN) == 0) ;\r
+                                do_altitude_measurement(FILTER_OFF);\r
+                                display_altitude(LINE1, DISPLAY_LINE_UPDATE_PARTIAL);\r
+                            }\r
+                            stop_altitude_measurement();\r
+                            break;\r
+                        case 2: // Temperature measurement\r
+                            display_temperature(LINE1, DISPLAY_LINE_UPDATE_FULL);\r
+                            for (i = 0; i < 4; i++)\r
+                            {\r
+                                Timer0_A4_Delay(CONV_MS_TO_TICKS(250));\r
+                                temperature_measurement(FILTER_OFF);\r
+                                display_temperature(LINE1, DISPLAY_LINE_UPDATE_PARTIAL);\r
+                            }\r
+                            break;\r
+                        case 3: // Acceleration measurement\r
+                            as_start();\r
+                            for (i = 0; i < 4; i++)\r
+                            {\r
+                                Timer0_A4_Delay(CONV_MS_TO_TICKS(250));\r
+                                as_get_data(sAccel.xyz);\r
+                                str = int_to_array(sAccel.xyz[0], 3, 0);\r
+                                display_chars(LCD_SEG_L1_2_0, str, SEG_ON);\r
+                                str = int_to_array(sAccel.xyz[2], 3, 0);\r
+                                display_chars(LCD_SEG_L2_2_0, str, SEG_ON);\r
+                            }\r
+                            as_stop();\r
+                            break;\r
+                        case 4: // BlueRobin test\r
+                            button.flag.up = 1;\r
+                            sx_bluerobin(LINE1);\r
+                            Timer0_A4_Delay(CONV_MS_TO_TICKS(100));\r
+                            get_bluerobin_data();\r
+                            display_heartrate(LINE1, DISPLAY_LINE_UPDATE_FULL);\r
+                            stop_bluerobin();\r
+                            break;\r
+                    }\r
+\r
+                    // Debounce button\r
+                    Timer0_A4_Delay(CONV_MS_TO_TICKS(200));\r
+                }\r
+\r
+                // Check button event\r
+                if (BUTTON_STAR_IS_PRESSED)\r
+                {\r
+                    test_step = 1;\r
+                    start_next_test = 1;\r
+                }\r
+                else if (BUTTON_NUM_IS_PRESSED)\r
+                {\r
+                    test_step = 2;\r
+                    start_next_test = 1;\r
+                }\r
+                else if (BUTTON_UP_IS_PRESSED)\r
+                {\r
+                    test_step = 3;\r
+                    start_next_test = 1;\r
+                }\r
+                else if (BUTTON_DOWN_IS_PRESSED)\r
+                {\r
+                    test_step = 4;\r
+                    start_next_test = 1;\r
+                }\r
+                else if (BUTTON_BACKLIGHT_IS_PRESSED)\r
+                {\r
+                    // Wait until button has been released (avoid restart)\r
+                    while (BUTTON_BACKLIGHT_IS_PRESSED) ;\r
+\r
+                    // Disable LCD and LCD charge pump\r
+                    LCDBCTL0 &= ~BIT0;\r
+                    LCDBVCTL = 0;\r
+\r
+                    // Debounce button press\r
+                    Timer0_A4_Delay(CONV_MS_TO_TICKS(500));\r
+\r
+                    // Disable timer - no need for a clock tick\r
+                    Timer0_Stop();\r
+\r
+                    // Hold watchdog\r
+                    WDTCTL = WDTPW + WDTHOLD;\r
+\r
+                    // Sleep until button is pressed (ca. 4µA current consumption)\r
+                    _BIS_SR(LPM4_bits + GIE);\r
+                    __no_operation();\r
+\r
+                    // Force watchdog reset for a clean restart\r
+                    WDTCTL = 1;\r
+                }\r
+\r
+#ifdef USE_WATCHDOG\r
+                // Service watchdog\r
+                WDTCTL = WDTPW + WDTIS__512K + WDTSSEL__ACLK + WDTCNTCL;\r
+#endif\r
+                // To LPM3\r
+                _BIS_SR(LPM3_bits + GIE);\r
+                __no_operation();\r
+            }\r
+        }\r
+        else\r
+        {\r
+            // Debounce button\r
+            Timer0_A4_Delay(CONV_MS_TO_TICKS(100));\r
+            button.all_flags = 0;\r
+\r
+            // Turn off backlight\r
+            P2OUT &= ~BUTTON_BACKLIGHT_PIN;\r
+            P2DIR &= ~BUTTON_BACKLIGHT_PIN;\r
+            break;\r
+        }\r
+    }\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          display_all_on\r
+// @brief       Turns on all LCD segments\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void display_all_on(void)\r
+{\r
+    u8 *lcdptr = (u8 *) 0x0A20;\r
+    u8 i;\r
+\r
+    for (i = 1; i <= 12; i++)\r
+    {\r
+        *lcdptr = 0xFF;\r
+        lcdptr++;\r
+    }\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          display_all_off\r
+// @brief       Turns off all LCD segments\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void display_all_off(void)\r
+{\r
+    u8 *lcdptr = (u8 *) 0x0A20;\r
+    u8 i;\r
+\r
+    for (i = 1; i <= 12; i++)\r
+    {\r
+        *lcdptr = 0x00;\r
+        lcdptr++;\r
+    }\r
+}\r
+\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/logic/test.h b/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/logic/test.h
new file mode 100755 (executable)
index 0000000..469426e
--- /dev/null
@@ -0,0 +1,47 @@
+// *************************************************************************************************\r
+//\r
+//      Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//        Redistribution and use in source and binary forms, with or without\r
+//        modification, are permitted provided that the following conditions\r
+//        are met:\r
+//\r
+//          Redistributions of source code must retain the above copyright\r
+//          notice, this list of conditions and the following disclaimer.\r
+//\r
+//          Redistributions in binary form must reproduce the above copyright\r
+//          notice, this list of conditions and the following disclaimer in the\r
+//          documentation and/or other materials provided with the\r
+//          distribution.\r
+//\r
+//          Neither the name of Texas Instruments Incorporated nor the names of\r
+//          its contributors may be used to endorse or promote products derived\r
+//          from this software without specific prior written permission.\r
+//\r
+//        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+// Test functions.\r
+// *************************************************************************************************\r
+\r
+#ifndef TEST_H_\r
+#define TEST_H_\r
+\r
+// *************************************************************************************************\r
+// Extern section\r
+extern void test_mode(void);\r
+extern void display_all_on(void);\r
+extern void display_all_off(void);\r
+\r
+#endif                          /*TEST_H_ */\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/logic/user.c b/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/logic/user.c
new file mode 100755 (executable)
index 0000000..3207cbf
--- /dev/null
@@ -0,0 +1,291 @@
+// *************************************************************************************************\r
+//\r
+//      Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//        Redistribution and use in source and binary forms, with or without\r
+//        modification, are permitted provided that the following conditions\r
+//        are met:\r
+//\r
+//          Redistributions of source code must retain the above copyright\r
+//          notice, this list of conditions and the following disclaimer.\r
+//\r
+//          Redistributions in binary form must reproduce the above copyright\r
+//          notice, this list of conditions and the following disclaimer in the\r
+//          documentation and/or other materials provided with the\r
+//          distribution.\r
+//\r
+//          Neither the name of Texas Instruments Incorporated nor the names of\r
+//          its contributors may be used to endorse or promote products derived\r
+//          from this software without specific prior written permission.\r
+//\r
+//        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+// Several user functions.\r
+// *************************************************************************************************\r
+\r
+// *************************************************************************************************\r
+// Include section\r
+\r
+// system\r
+#include "project.h"\r
+\r
+// driver\r
+#include "display.h"\r
+#include "buzzer.h"\r
+#include "ports.h"\r
+\r
+// logic\r
+#include "menu.h"\r
+#include "date.h"\r
+#include "clock.h"\r
+#include "user.h"\r
+#include "stopwatch.h"\r
+\r
+// *************************************************************************************************\r
+// Prototypes section\r
+\r
+// *************************************************************************************************\r
+// Defines section\r
+\r
+// *************************************************************************************************\r
+// Global Variable section\r
+\r
+// *************************************************************************************************\r
+// Extern section\r
+extern void idle_loop(void);\r
+\r
+// *************************************************************************************************\r
+// @fn          dummy\r
+// @brief       Dummy direct function.\r
+// @param       u8 line LINE1, LINE2\r
+// @return      none\r
+// *************************************************************************************************\r
+void dummy(u8 line)\r
+{\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          set_value\r
+// @brief       Generic value setting routine\r
+// @param       s32 * value                                                     Pointer to value to\r
+// set\r
+//                              u8digits\r
+//                                                        Number of digits\r
+//                              u8 blanks\r
+//                                                       Number of whitespaces before first valid\r
+// digit\r
+//                              s32 limitLow                                            Lower limit\r
+// of value\r
+//                              s32 limitHigh                                           Upper limit\r
+// of value\r
+//                              u16 mode\r
+//                              u8 segments\r
+//                                                     Segments where value should be drawn\r
+//                              fptr_setValue_display_function1         Value-specific display\r
+// routine\r
+// @return      none\r
+// *************************************************************************************************\r
+void set_value(s32 * value, u8 digits, u8 blanks, s32 limitLow, s32 limitHigh, u16 mode,\r
+               u8 segments,\r
+               void (*fptr_setValue_display_function1)(u8 segments, u32 value, u8 digits,\r
+                                                       u8 blanks))\r
+{\r
+    u8 update;\r
+    s16 stepValue = 1;\r
+    u8 doRound = 0;\r
+    u8 stopwatch_state;\r
+    u32 val;\r
+\r
+    // Clear button flags\r
+    button.all_flags = 0;\r
+\r
+    // Clear blink memory\r
+    clear_blink_mem();\r
+\r
+    // For safety only - buzzer on/off and button_repeat share same IRQ\r
+    stop_buzzer();\r
+\r
+    // Disable stopwatch display update while function is active\r
+    stopwatch_state = sStopwatch.state;\r
+    sStopwatch.state = STOPWATCH_HIDE;\r
+\r
+    // Init step size and repeat counter\r
+    sButton.repeats = 0;\r
+\r
+    // Initial display update\r
+    update = 1;\r
+\r
+    // Turn on 200ms button repeat function\r
+    button_repeat_on(200);\r
+\r
+    // Start blinking with with 2Hz\r
+    set_blink_rate(BIT6 + BIT5);\r
+\r
+    // Value set loop\r
+    while (1)\r
+    {\r
+        // Idle timeout: exit function\r
+        if (sys.flag.idle_timeout)\r
+            break;\r
+\r
+        // Button STAR (short) button: exit function\r
+        if (button.flag.star)\r
+            break;\r
+\r
+        // NUM button: exit function and goto to next value (if available)\r
+        if (button.flag.num)\r
+        {\r
+            if ((mode & SETVALUE_NEXT_VALUE) == SETVALUE_NEXT_VALUE)\r
+                break;\r
+        }\r
+\r
+        // UP button: increase value\r
+        if (button.flag.up)\r
+        {\r
+            // Increase value\r
+            *value = *value + stepValue;\r
+\r
+            // Check value limits\r
+            if (*value > limitHigh)\r
+            {\r
+                // Check if value can roll over, else stick to limit\r
+                if ((mode & SETVALUE_ROLLOVER_VALUE) == SETVALUE_ROLLOVER_VALUE)\r
+                    *value = limitLow;\r
+                else\r
+                    *value = limitHigh;\r
+\r
+                // Reset step size to default\r
+                stepValue = 1;\r
+            }\r
+\r
+            // Trigger display update\r
+            update = 1;\r
+\r
+            // Clear button flag\r
+            button.flag.up = 0;\r
+        }\r
+\r
+        // DOWN button: decrease value\r
+        if (button.flag.down)\r
+        {\r
+            // Decrease value\r
+            *value = *value - stepValue;\r
+\r
+            // Check value limits\r
+            if (*value < limitLow)\r
+            {\r
+                // Check if value can roll over, else stick to limit\r
+                if ((mode & SETVALUE_ROLLOVER_VALUE) == SETVALUE_ROLLOVER_VALUE)\r
+                    *value = limitHigh;\r
+                else\r
+                    *value = limitLow;\r
+\r
+                // Reset step size to default\r
+                stepValue = 1;\r
+            }\r
+\r
+            // Trigger display update\r
+            update = 1;\r
+\r
+            // Clear button flag\r
+            button.flag.down = 0;\r
+        }\r
+\r
+        // When fast mode is enabled, increase step size if Sx button is continuously\r
+        if ((mode & SETVALUE_FAST_MODE) == SETVALUE_FAST_MODE)\r
+        {\r
+            switch (sButton.repeats)\r
+            {\r
+                case 0:\r
+                    stepValue = 1;\r
+                    doRound = 0;\r
+                    break;\r
+                case 10:\r
+                case -10:\r
+                    stepValue = 10;\r
+                    doRound = 1;\r
+                    break;\r
+                case 20:\r
+                case -20:\r
+                    stepValue = 100;\r
+                    doRound = 1;\r
+                    break;\r
+                case 30:\r
+                case -30:\r
+                    stepValue = 1000;\r
+                    doRound = 1;\r
+                    break;\r
+            }\r
+\r
+            // Round value to avoid odd numbers on display\r
+            if (stepValue != 1 && doRound == 1)\r
+            {\r
+                *value -= *value % stepValue;\r
+                doRound = 0;\r
+            }\r
+        }\r
+\r
+        // Update display when there is new data\r
+        if (update)\r
+        {\r
+            // Display up or down arrow according to sign of value\r
+            if ((mode & SETVALUE_DISPLAY_ARROWS) == SETVALUE_DISPLAY_ARROWS)\r
+            {\r
+                if (*value >= 0)\r
+                {\r
+                    display_symbol(LCD_SYMB_ARROW_UP, SEG_ON);\r
+                    display_symbol(LCD_SYMB_ARROW_DOWN, SEG_OFF);\r
+                    val = *value;\r
+                }\r
+                else\r
+                {\r
+                    display_symbol(LCD_SYMB_ARROW_UP, SEG_OFF);\r
+                    display_symbol(LCD_SYMB_ARROW_DOWN, SEG_ON);\r
+                    val = *value * (-1);\r
+                }\r
+            }\r
+            else\r
+            {\r
+                val = *value;\r
+            }\r
+\r
+            // Display function can either display value directly, modify value before displaying\r
+            // or display a string referenced by the value\r
+            fptr_setValue_display_function1(segments, val, digits, blanks);\r
+\r
+            // Clear update flag\r
+            update = 0;\r
+        }\r
+\r
+        // Call idle loop to serve background tasks\r
+        idle_loop();\r
+\r
+    }\r
+\r
+    // Clear up and down arrows\r
+    display_symbol(LCD_SYMB_ARROW_UP, SEG_OFF);\r
+    display_symbol(LCD_SYMB_ARROW_DOWN, SEG_OFF);\r
+\r
+    // Set blinking rate to 1Hz and stop\r
+    set_blink_rate(BIT7 + BIT6 + BIT5);\r
+    clear_blink_mem();\r
+\r
+    // Turn off button repeat function\r
+    button_repeat_off();\r
+\r
+    // Enable stopwatch display updates again\r
+    sStopwatch.state = stopwatch_state;\r
+}\r
+\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/logic/user.h b/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/logic/user.h
new file mode 100755 (executable)
index 0000000..f48cea4
--- /dev/null
@@ -0,0 +1,59 @@
+// *************************************************************************************************\r
+//\r
+//      Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//        Redistribution and use in source and binary forms, with or without\r
+//        modification, are permitted provided that the following conditions\r
+//        are met:\r
+//\r
+//          Redistributions of source code must retain the above copyright\r
+//          notice, this list of conditions and the following disclaimer.\r
+//\r
+//          Redistributions in binary form must reproduce the above copyright\r
+//          notice, this list of conditions and the following disclaimer in the\r
+//          documentation and/or other materials provided with the\r
+//          distribution.\r
+//\r
+//          Neither the name of Texas Instruments Incorporated nor the names of\r
+//          its contributors may be used to endorse or promote products derived\r
+//          from this software without specific prior written permission.\r
+//\r
+//        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+\r
+#ifndef USER_H_\r
+#define USER_H_\r
+\r
+// *************************************************************************************************\r
+// Defines section\r
+#define SETVALUE_ROLLOVER_VALUE                         BIT0\r
+#define SETVALUE_DISPLAY_VALUE                          BIT1\r
+#define SETVALUE_DISPLAY_ARROWS                         BIT2\r
+#define SETVALUE_DISPLAY_SELECTION                      BIT3\r
+#define SETVALUE_FAST_MODE                                      BIT4\r
+#define SETVALUE_NEXT_VALUE                                     BIT5\r
+\r
+// *************************************************************************************************\r
+// Prototypes section\r
+extern u8 *select_view_style(u8 line, u8 * view1, u8 * view2);\r
+\r
+extern void (*fptr_setValue_display_function1)(u8 segments, u32 value, u8 digits, u8 blanks);\r
+extern void set_value(s32 * value, u8 digits, u8 blanks, s32 limitLow, s32 limitHigh, u16 mode,\r
+                      u8 segments,\r
+                      void (*fptr_setValue_display_function1)(u8 segments, u32 value, u8 digits,\r
+                                                              u8 blanks));\r
+extern void dummy(u8 line);\r
+\r
+#endif                          /*USER_H_ */\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/main.c b/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/main.c
new file mode 100755 (executable)
index 0000000..cc1d207
--- /dev/null
@@ -0,0 +1,743 @@
+// *************************************************************************************************\r
+//\r
+//      Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//        Redistribution and use in source and binary forms, with or without\r
+//        modification, are permitted provided that the following conditions\r
+//        are met:\r
+//\r
+//          Redistributions of source code must retain the above copyright\r
+//          notice, this list of conditions and the following disclaimer.\r
+//\r
+//          Redistributions in binary form must reproduce the above copyright\r
+//          notice, this list of conditions and the following disclaimer in the\r
+//          documentation and/or other materials provided with the\r
+//          distribution.\r
+//\r
+//          Neither the name of Texas Instruments Incorporated nor the names of\r
+//          its contributors may be used to endorse or promote products derived\r
+//          from this software without specific prior written permission.\r
+//\r
+//        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//        "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//        LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//        A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//        OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//        LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//        DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//        THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//        (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//        OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+//******************************************************************************\r
+//   eZ430-Chronos\r
+//\r
+//   Description: This is the standard software for the eZ430-Chronos\r
+//\r
+//   P.Francisco\r
+//   Version    1.6\r
+//   Texas Instruments, Inc\r
+//   January 2011\r
+//   Known working builds:\r
+//     IAR Embedded Workbench (Version: 5.20.2)\r
+//     Code Composer Studio (Version  4.2.0.10012)\r
+//******************************************************************************\r
+//Change Log (More detailed information can be found in change_record.txt):\r
+//******************************************************************************\r
+//Version:  1.6\r
+//Comments: Several bugs were fixed.\r
+//          LCD shows "done" after successfully received data\r
+//          rfBSL requires two button presses in order to update watch\r
+//          New method detects a long button press\r
+//          Removed file display1.c. The content is now in display.c\r
+//          Backlight of Chronos stays on for 3 sec after backlight button was pushed.\r
+//          After timeout the accelerometer menu shows "----"\r
+//\r
+//Version:  1.5\r
+//Comments: Changed XT1 drive level to highest\r
+//          Modified key lock procedure.\r
+//          Negative °C are now converted correctly to Kelvin\r
+//          Enabled fast mode when changing altitude offset\r
+//          Disabled stopwatch stop when watch buttons are locked\r
+//          Added SimpliciTI sources to project. Upgraded to Version 1.1.1.\r
+//          Changed button names from M1/M2/S1/S2/BL to STAR/NUM/UP/DOWN/BACKLIGHT\r
+//\r
+//Version:  1.4\r
+//Comments: Initial Release Version\r
+//**********************************************************************************\r
+\r
+// *************************************************************************************************\r
+// Initialization and control of application.\r
+// *************************************************************************************************\r
+\r
+// *************************************************************************************************\r
+// Include section\r
+\r
+// system\r
+#include "project.h"\r
+#include <string.h>\r
+\r
+// driver\r
+#include "clock.h"\r
+#include "display.h"\r
+#include "vti_as.h"\r
+#include "vti_ps.h"\r
+#include "radio.h"\r
+#include "buzzer.h"\r
+#include "ports.h"\r
+#include "timer.h"\r
+#include "pmm.h"\r
+#include "rf1a.h"\r
+\r
+// logic\r
+#include "menu.h"\r
+#include "date.h"\r
+#include "alarm.h"\r
+#include "stopwatch.h"\r
+#include "battery.h"\r
+#include "temperature.h"\r
+#include "altitude.h"\r
+#include "battery.h"\r
+#include "acceleration.h"\r
+#include "bluerobin.h"\r
+#include "rfsimpliciti.h"\r
+#include "simpliciti.h"\r
+#include "rfbsl.h"\r
+#include "test.h"\r
+\r
+// *************************************************************************************************\r
+// Prototypes section\r
+void init_application(void);\r
+void init_global_variables(void);\r
+void wakeup_event(void);\r
+void process_requests(void);\r
+void display_update(void);\r
+void idle_loop(void);\r
+void configure_ports(void);\r
+void read_calibration_values(void);\r
+\r
+// *************************************************************************************************\r
+// Defines section\r
+\r
+// Number of calibration data bytes in INFOA memory\r
+#define CALIBRATION_DATA_LENGTH         (13u)\r
+\r
+// *************************************************************************************************\r
+// Global Variable section\r
+\r
+// Variable holding system internal flags\r
+volatile s_system_flags sys;\r
+\r
+// Variable holding flags set by logic modules\r
+volatile s_request_flags request;\r
+\r
+// Variable holding message flags\r
+volatile s_message_flags message;\r
+\r
+// Global radio frequency offset taken from calibration memory\r
+// Compensates crystal deviation from 26MHz nominal value\r
+u8 rf_frequoffset;\r
+\r
+// Function pointers for LINE1 and LINE2 display function\r
+void (*fptr_lcd_function_line1)(u8 line, u8 update);\r
+void (*fptr_lcd_function_line2)(u8 line, u8 update);\r
+\r
+// *************************************************************************************************\r
+// Extern section\r
+\r
+extern void start_simpliciti_sync(void);\r
+\r
+extern u16 ps_read_register(u8 address, u8 mode);\r
+extern u8 ps_write_register(u8 address, u8 data);\r
+\r
+// *************************************************************************************************\r
+// @fn          main\r
+// @brief       Main routine\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+int main(void)\r
+{\r
+    // Init MCU\r
+    init_application();\r
+\r
+    // Assign initial value to global variables\r
+    init_global_variables();\r
+\r
+    // Branch to welcome screen\r
+    test_mode();\r
+\r
+    // Main control loop: wait in low power mode until some event needs to be processed\r
+    while (1)\r
+    {\r
+        // When idle go to LPM3\r
+        idle_loop();\r
+\r
+        // Process wake-up events\r
+        if (button.all_flags || sys.all_flags)\r
+            wakeup_event();\r
+\r
+        // Process actions requested by logic modules\r
+        if (request.all_flags)\r
+            process_requests();\r
+\r
+        // Before going to LPM3, update display\r
+        if (display.all_flags)\r
+            display_update();\r
+    }\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          init_application\r
+// @brief       Initialize the microcontroller.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void init_application(void)\r
+{\r
+    volatile unsigned char *ptr;\r
+\r
+    // ---------------------------------------------------------------------\r
+    // Enable watchdog\r
+\r
+    // Watchdog triggers after 16 seconds when not cleared\r
+#ifdef USE_WATCHDOG\r
+    WDTCTL = WDTPW + WDTIS__512K + WDTSSEL__ACLK;\r
+#else\r
+    WDTCTL = WDTPW + WDTHOLD;\r
+#endif\r
+\r
+    // ---------------------------------------------------------------------\r
+    // Configure PMM\r
+    SetVCore(3);\r
+\r
+    // Set global high power request enable\r
+    PMMCTL0_H = 0xA5;\r
+    PMMCTL0_L |= PMMHPMRE;\r
+    PMMCTL0_H = 0x00;\r
+\r
+    // ---------------------------------------------------------------------\r
+    // Enable 32kHz ACLK\r
+    P5SEL |= 0x03;              // Select XIN, XOUT on P5.0 and P5.1\r
+    UCSCTL6 &= ~XT1OFF;         // XT1 On, Highest drive strength\r
+    UCSCTL6 |= XCAP_3;          // Internal load cap\r
+\r
+    UCSCTL3 = SELA__XT1CLK;     // Select XT1 as FLL reference\r
+    UCSCTL4 = SELA__XT1CLK | SELS__DCOCLKDIV | SELM__DCOCLKDIV;\r
+\r
+    // ---------------------------------------------------------------------\r
+    // Configure CPU clock for 12MHz\r
+    _BIS_SR(SCG0);              // Disable the FLL control loop\r
+    UCSCTL0 = 0x0000;           // Set lowest possible DCOx, MODx\r
+    UCSCTL1 = DCORSEL_5;        // Select suitable range\r
+    UCSCTL2 = FLLD_1 + 0x16E;   // Set DCO Multiplier\r
+    _BIC_SR(SCG0);              // Enable the FLL control loop\r
+\r
+    // Worst-case settling time for the DCO when the DCO range bits have been\r
+    // changed is n x 32 x 32 x f_MCLK / f_FLL_reference. See UCS chapter in 5xx\r
+    // UG for optimization.\r
+    // 32 x 32 x 12 MHz / 32,768 Hz = 375000 = MCLK cycles for DCO to settle\r
+    __delay_cycles(375000);\r
+\r
+    // Loop until XT1 & DCO stabilizes, use do-while to insure that\r
+    // body is executed at least once\r
+    do\r
+    {\r
+        UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG + XT1HFOFFG + DCOFFG);\r
+        SFRIFG1 &= ~OFIFG;      // Clear fault flags\r
+    }\r
+    while ((SFRIFG1 & OFIFG));\r
+\r
+    // ---------------------------------------------------------------------\r
+    // Configure port mapping\r
+\r
+    // Disable all interrupts\r
+    __disable_interrupt();\r
+    // Get write-access to port mapping registers:\r
+    PMAPPWD = 0x02D52;\r
+    // Allow reconfiguration during runtime:\r
+    PMAPCTL = PMAPRECFG;\r
+\r
+    // P2.7 = TA0CCR1A or TA1CCR0A output (buzzer output)\r
+    ptr = &P2MAP0;\r
+    *(ptr + 7) = PM_TA1CCR0A;\r
+    P2OUT &= ~BIT7;\r
+    P2DIR |= BIT7;\r
+\r
+    // P1.5 = SPI MISO input\r
+    ptr = &P1MAP0;\r
+    *(ptr + 5) = PM_UCA0SOMI;\r
+    // P1.6 = SPI MOSI output\r
+    *(ptr + 6) = PM_UCA0SIMO;\r
+    // P1.7 = SPI CLK output\r
+    *(ptr + 7) = PM_UCA0CLK;\r
+\r
+    // Disable write-access to port mapping registers:\r
+    PMAPPWD = 0;\r
+    // Re-enable all interrupts\r
+    __enable_interrupt();\r
+\r
+    // ---------------------------------------------------------------------\r
+    // Configure ports\r
+\r
+    // ---------------------------------------------------------------------\r
+    // Reset radio core\r
+    radio_reset();\r
+    radio_powerdown();\r
+\r
+    // ---------------------------------------------------------------------\r
+    // Init acceleration sensor\r
+    as_init();\r
+\r
+    // ---------------------------------------------------------------------\r
+    // Init LCD\r
+    lcd_init();\r
+\r
+    // ---------------------------------------------------------------------\r
+    // Init buttons\r
+    init_buttons();\r
+\r
+    // ---------------------------------------------------------------------\r
+    // Configure Timer0 for use by the clock and delay functions\r
+    Timer0_Init();\r
+\r
+    // ---------------------------------------------------------------------\r
+    // Init pressure sensor\r
+    ps_init();\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          init_global_variables\r
+// @brief       Initialize global variables.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void init_global_variables(void)\r
+{\r
+    // --------------------------------------------\r
+    // Apply default settings\r
+\r
+    // set menu pointers to default menu items\r
+    ptrMenu_L1 = &menu_L1_Time;\r
+    //      ptrMenu_L1 = &menu_L1_Alarm;\r
+    //      ptrMenu_L1 = &menu_L1_Heartrate;\r
+    //      ptrMenu_L1 = &menu_L1_Speed;\r
+    //      ptrMenu_L1 = &menu_L1_Temperature;\r
+    //      ptrMenu_L1 = &menu_L1_Altitude;\r
+    //      ptrMenu_L1 = &menu_L1_Acceleration;\r
+    ptrMenu_L2 = &menu_L2_Date;\r
+    //      ptrMenu_L2 = &menu_L2_Stopwatch;\r
+    //      ptrMenu_L2 = &menu_L2_Rf;\r
+    //      ptrMenu_L2 = &menu_L2_Ppt;\r
+    //      ptrMenu_L2 = &menu_L2_Sync;\r
+    //      ptrMenu_L2 = &menu_L2_Distance;\r
+    //      ptrMenu_L2 = &menu_L2_Calories;\r
+    //      ptrMenu_L2 = &menu_L2_Battery;\r
+    //      ptrMenu_L2 = &menu_L2_RFBSL;\r
+\r
+    // Assign LINE1 and LINE2 display functions\r
+    fptr_lcd_function_line1 = ptrMenu_L1->display_function;\r
+    fptr_lcd_function_line2 = ptrMenu_L2->display_function;\r
+\r
+    // Init system flags\r
+    button.all_flags = 0;\r
+    sys.all_flags = 0;\r
+    request.all_flags = 0;\r
+    display.all_flags = 0;\r
+    message.all_flags = 0;\r
+\r
+    // Force full display update when starting up\r
+    display.flag.full_update = 1;\r
+\r
+#ifndef ISM_US\r
+    // Use metric units when displaying values\r
+    sys.flag.use_metric_units = 1;\r
+#endif\r
+\r
+    // Read calibration values from info memory\r
+    read_calibration_values();\r
+\r
+    // Set system time to default value\r
+    reset_clock();\r
+\r
+    // Set date to default value\r
+    reset_date();\r
+\r
+    // Set alarm time to default value\r
+    reset_alarm();\r
+\r
+    // Set buzzer to default value\r
+    reset_buzzer();\r
+\r
+    // Reset stopwatch\r
+    reset_stopwatch();\r
+\r
+    // Reset altitude measurement\r
+    reset_altitude_measurement();\r
+\r
+    // Reset acceleration measurement\r
+    reset_acceleration();\r
+\r
+    // Reset BlueRobin stack\r
+    reset_bluerobin();\r
+\r
+    // Reset SimpliciTI stack\r
+    reset_rf();\r
+\r
+    // Reset temperature measurement\r
+    reset_temp_measurement();\r
+\r
+    // Reset battery measurement\r
+    reset_batt_measurement();\r
+    battery_measurement();\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          wakeup_event\r
+// @brief       Process external / internal wakeup events.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void wakeup_event(void)\r
+{\r
+    // Enable idle timeout\r
+    sys.flag.idle_timeout_enabled = 1;\r
+\r
+    // If buttons are locked, only display "buttons are locked" message\r
+    if (button.all_flags && sys.flag.lock_buttons)\r
+    {\r
+        // Show "buttons are locked" message synchronously with next second tick\r
+        if (!(BUTTON_NUM_IS_PRESSED && BUTTON_DOWN_IS_PRESSED))\r
+        {\r
+            message.flag.prepare = 1;\r
+            message.flag.type_locked = 1;\r
+        }\r
+        // Clear buttons\r
+        button.all_flags = 0;\r
+    }\r
+    // Process long button press event (while button is held)\r
+    else if (button.flag.star_long)\r
+    {\r
+        // Clear button event\r
+        button.flag.star_long = 0;\r
+\r
+        // Call sub menu function\r
+        ptrMenu_L1->mx_function(LINE1);\r
+\r
+        // Set display update flag\r
+        display.flag.full_update = 1;\r
+    }\r
+    else if (button.flag.num_long)\r
+    {\r
+        // Clear button event\r
+        button.flag.num_long = 0;\r
+\r
+        // Call sub menu function\r
+        ptrMenu_L2->mx_function(LINE2);\r
+\r
+        // Set display update flag\r
+        display.flag.full_update = 1;\r
+    }\r
+    // Process single button press event (after button was released)\r
+    else if (button.all_flags)\r
+    {\r
+        // M1 button event ---------------------------------------------------------------------\r
+        // (Short) Advance to next menu item\r
+        if (button.flag.star)\r
+        {\r
+            // Clean up display before activating next menu item\r
+            fptr_lcd_function_line1(LINE1, DISPLAY_LINE_CLEAR);\r
+\r
+            // Go to next menu entry\r
+            ptrMenu_L1 = ptrMenu_L1->next;\r
+\r
+            // Assign new display function\r
+            fptr_lcd_function_line1 = ptrMenu_L1->display_function;\r
+\r
+            // Set Line1 display update flag\r
+            display.flag.line1_full_update = 1;\r
+\r
+            // Clear button flag\r
+            button.flag.star = 0;\r
+        }\r
+        // NUM button event ---------------------------------------------------------------------\r
+        // (Short) Advance to next menu item\r
+        else if (button.flag.num)\r
+        {\r
+            // Clear rfBSL confirmation flag\r
+            rfBSL_button_confirmation = 0;\r
+\r
+            // Clean up display before activating next menu item\r
+            fptr_lcd_function_line2(LINE2, DISPLAY_LINE_CLEAR);\r
+\r
+            // Go to next menu entry\r
+            ptrMenu_L2 = ptrMenu_L2->next;\r
+\r
+            // Assign new display function\r
+            fptr_lcd_function_line2 = ptrMenu_L2->display_function;\r
+\r
+            // Set Line2 display update flag\r
+            display.flag.line2_full_update = 1;\r
+\r
+            // Clear button flag\r
+            button.flag.num = 0;\r
+        }\r
+        // UP button event ---------------------------------------------------------------------\r
+        // Activate user function for Line1 menu item\r
+        else if (button.flag.up)\r
+        {\r
+            // Call direct function\r
+            ptrMenu_L1->sx_function(LINE1);\r
+\r
+            // Set Line1 display update flag\r
+            display.flag.line1_full_update = 1;\r
+\r
+            // Clear button flag\r
+            button.flag.up = 0;\r
+        }\r
+        // DOWN button event ---------------------------------------------------------------------\r
+        // Activate user function for Line2 menu item\r
+        else if (button.flag.down)\r
+        {\r
+            if (ptrMenu_L2 == &menu_L2_RFBSL)\r
+            {\r
+\r
+            }\r
+\r
+            // Call direct function\r
+            ptrMenu_L2->sx_function(LINE2);\r
+\r
+            // Set Line1 display update flag\r
+            display.flag.line2_full_update = 1;\r
+\r
+            // Clear button flag\r
+            button.flag.down = 0;\r
+        }\r
+    }\r
+    // Process internal events\r
+    if (sys.all_flags)\r
+    {\r
+        // Idle timeout ---------------------------------------------------------------------\r
+        if (sys.flag.idle_timeout)\r
+        {\r
+            // Clear timeout flag\r
+            sys.flag.idle_timeout = 0;\r
+\r
+            // Clear display\r
+            clear_display();\r
+\r
+            // Set display update flags\r
+            display.flag.full_update = 1;\r
+        }\r
+    }\r
+    // Disable idle timeout\r
+    sys.flag.idle_timeout_enabled = 0;\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          process_requests\r
+// @brief       Process requested actions outside ISR context.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void process_requests(void)\r
+{\r
+    // Do temperature measurement\r
+    if (request.flag.temperature_measurement)\r
+        temperature_measurement(FILTER_ON);\r
+\r
+    // Do pressure measurement\r
+    if (request.flag.altitude_measurement)\r
+        do_altitude_measurement(FILTER_ON);\r
+\r
+    // Do acceleration measurement\r
+    if (request.flag.acceleration_measurement)\r
+        do_acceleration_measurement();\r
+\r
+    // Do voltage measurement\r
+    if (request.flag.voltage_measurement)\r
+        battery_measurement();\r
+\r
+    // Generate alarm (two signals every second)\r
+    if (request.flag.buzzer)\r
+        start_buzzer(2, BUZZER_ON_TICKS, BUZZER_OFF_TICKS);\r
+\r
+    // Reset request flag\r
+    request.all_flags = 0;\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          display_update\r
+// @brief       Process display flags and call LCD update routines.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void display_update(void)\r
+{\r
+    u8 line;\r
+    u8 string[8];\r
+\r
+    // ---------------------------------------------------------------------\r
+    // Call Line1 display function\r
+    if (display.flag.full_update || display.flag.line1_full_update)\r
+    {\r
+        clear_line(LINE1);\r
+        fptr_lcd_function_line1(LINE1, DISPLAY_LINE_UPDATE_FULL);\r
+    } else if (ptrMenu_L1->display_update())\r
+    {\r
+        // Update line1 only when new data is available\r
+        fptr_lcd_function_line1(LINE1, DISPLAY_LINE_UPDATE_PARTIAL);\r
+    }\r
+\r
+    // ---------------------------------------------------------------------\r
+    // If message text should be displayed on Line2, skip normal update\r
+    if (message.flag.show)\r
+    {\r
+        line = LINE2;\r
+\r
+        // Select message to display\r
+        if (message.flag.type_locked)\r
+            memcpy(string, "  LO?T", 6);\r
+        else if (message.flag.type_unlocked)\r
+            memcpy(string, "  OPEN", 6);\r
+        else if (message.flag.type_lobatt)\r
+            memcpy(string, "LOBATT", 6);\r
+        else if (message.flag.type_alarm_on)\r
+        {\r
+            memcpy(string, "  ON", 4);\r
+            line = LINE1;\r
+        } else if (message.flag.type_alarm_off)\r
+        {\r
+            memcpy(string, " OFF", 4);\r
+            line = LINE1;\r
+        }\r
+        // Clear previous content\r
+        clear_line(line);\r
+        fptr_lcd_function_line2(line, DISPLAY_LINE_CLEAR);\r
+\r
+        if (line == LINE2)\r
+            display_chars(LCD_SEG_L2_5_0, string, SEG_ON);\r
+        else\r
+            display_chars(LCD_SEG_L1_3_0, string, SEG_ON);\r
+\r
+        // Next second tick erases message and repaints original screen content\r
+        message.all_flags = 0;\r
+        message.flag.erase = 1;\r
+    }\r
+    // ---------------------------------------------------------------------\r
+    // Call Line2 display function\r
+    else if (display.flag.full_update || display.flag.line2_full_update)\r
+    {\r
+        clear_line(LINE2);\r
+        fptr_lcd_function_line2(LINE2, DISPLAY_LINE_UPDATE_FULL);\r
+    } else if (ptrMenu_L2->display_update() && !message.all_flags)\r
+    {\r
+        // Update line2 only when new data is available\r
+        fptr_lcd_function_line2(LINE2, DISPLAY_LINE_UPDATE_PARTIAL);\r
+    }\r
+    // ---------------------------------------------------------------------\r
+    // Restore blinking icons (blinking memory is cleared when calling set_value)\r
+    if (display.flag.full_update)\r
+    {\r
+        if (is_bluerobin() == BLUEROBIN_CONNECTED)\r
+        {\r
+            // Turn on beeper icon to show activity\r
+            display_symbol(LCD_ICON_BEEPER1, SEG_ON_BLINK_OFF);\r
+            display_symbol(LCD_ICON_BEEPER2, SEG_ON_BLINK_OFF);\r
+            display_symbol(LCD_ICON_BEEPER3, SEG_ON_BLINK_OFF);\r
+        }\r
+    }\r
+    // Clear display flag\r
+    display.all_flags = 0;\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          to_lpm\r
+// @brief       Go to LPM0/3.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void to_lpm(void)\r
+{\r
+    // Go to LPM3\r
+    _BIS_SR(LPM3_bits + GIE);\r
+    __no_operation();\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          idle_loop\r
+// @brief       Go to LPM. Service watchdog timer when waking up.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void idle_loop(void)\r
+{\r
+    // To low power mode\r
+    to_lpm();\r
+\r
+#ifdef USE_WATCHDOG\r
+    // Service watchdog\r
+    WDTCTL = WDTPW + WDTIS__512K + WDTSSEL__ACLK + WDTCNTCL;\r
+#endif\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          read_calibration_values\r
+// @brief       Read calibration values for temperature measurement, voltage measurement\r
+//                              and radio from INFO memory.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void read_calibration_values(void)\r
+{\r
+    u8 cal_data[CALIBRATION_DATA_LENGTH]; // Temporary storage for constants\r
+    u8 i;\r
+    u8 *flash_mem;                        // Memory pointer\r
+\r
+    // Read calibration data from Info D memory\r
+    flash_mem = (u8 *) 0x1800;\r
+    for (i = 0; i < CALIBRATION_DATA_LENGTH; i++)\r
+    {\r
+        cal_data[i] = *flash_mem++;\r
+    }\r
+\r
+    if (cal_data[0] == 0xFF)\r
+    {\r
+        // If no values are available (i.e. INFO D memory has been erased by user), assign\r
+        // experimentally derived values\r
+        rf_frequoffset = 4;\r
+        sTemp.offset = -250;\r
+        sBatt.offset = -10;\r
+        simpliciti_ed_address[0] = 0x79;\r
+        simpliciti_ed_address[1] = 0x56;\r
+        simpliciti_ed_address[2] = 0x34;\r
+        simpliciti_ed_address[3] = 0x12;\r
+        sAlt.altitude_offset = 0;\r
+    } else\r
+    {\r
+        // Assign calibration data to global variables\r
+        rf_frequoffset = cal_data[1];\r
+        // Range check for calibrated FREQEST value (-20 .. + 20 is ok, else use default value)\r
+        if ((rf_frequoffset > 20) && (rf_frequoffset < (256 - 20)))\r
+        {\r
+            rf_frequoffset = 0;\r
+        }\r
+        sTemp.offset = (s16) ((cal_data[2] << 8) + cal_data[3]);\r
+        sBatt.offset = (s16) ((cal_data[4] << 8) + cal_data[5]);\r
+        simpliciti_ed_address[0] = cal_data[6];\r
+        simpliciti_ed_address[1] = cal_data[7];\r
+        simpliciti_ed_address[2] = cal_data[8];\r
+        simpliciti_ed_address[3] = cal_data[9];\r
+        // S/W version byte set during calibration?\r
+        if (cal_data[12] != 0xFF)\r
+        {\r
+            sAlt.altitude_offset = (s16) ((cal_data[10] << 8) + cal_data[11]);\r
+        } else\r
+        {\r
+            sAlt.altitude_offset = 0;\r
+        }\r
+    }\r
+}\r
+\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/settings/ez430_chronos.cspy.bat b/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/settings/ez430_chronos.cspy.bat
new file mode 100755 (executable)
index 0000000..668d3c5
--- /dev/null
@@ -0,0 +1,15 @@
+@REM This batch file has been generated by the IAR Embedded Workbench\r
+@REM C-SPY Debugger, as an aid to preparing a command line for running\r
+@REM the cspybat command line utility using the appropriate settings.\r
+@REM\r
+@REM You can launch cspybat by typing the name of this batch file followed\r
+@REM by the name of the debug file (usually an ELF/DWARF or UBROF file).\r
+@REM Note that this file is generated every time a new debug session\r
+@REM is initialized, so you may want to move or rename the file before\r
+@REM making changes.\r
+@REM \r
+\r
+\r
+"C:\Program Files\IAR Systems\Embedded Workbench 6.0\common\bin\cspybat" "C:\Program Files\IAR Systems\Embedded Workbench 6.0\430\bin\430proc.dll" "C:\Program Files\IAR Systems\Embedded Workbench 6.0\430\bin\430fet.dll"  %1 --plugin "C:\Program Files\IAR Systems\Embedded Workbench 6.0\430\bin\430bat.dll" --backend -B "-p" "C:\Program Files\IAR Systems\Embedded Workbench 6.0\430\config\CC430F6137.ddf" "--core=430Xv2" "--data_model=small" "--iv_base" "0xFF80" "--no_wrap_around" "-d" "fet" "--erase_main_and_info" "--derivative" "CC430F6137" "--protocol" "automatic" "--eem" "EMEX_SMALL_5XX" "--port" "Automatic" "--connection" "ti_usb" "--settlingtime=0" "--msp430_dll" "msp430.dll" "--vccDefault" "3.3" \r
+\r
+\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/settings/ez430_chronos.dbgdt b/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/settings/ez430_chronos.dbgdt
new file mode 100755 (executable)
index 0000000..796ccb4
--- /dev/null
@@ -0,0 +1,89 @@
+<?xml version="1.0" encoding="iso-8859-1"?>\r
+\r
+<Project>\r
+  <Desktop>\r
+    <Static>\r
+      <Debug-Log>\r
+        \r
+        \r
+      <ColumnWidth0>20</ColumnWidth0><ColumnWidth1>894</ColumnWidth1></Debug-Log>\r
+      <Build>\r
+        \r
+        \r
+        \r
+        \r
+      <ColumnWidth0>20</ColumnWidth0><ColumnWidth1>670</ColumnWidth1><ColumnWidth2>178</ColumnWidth2><ColumnWidth3>44</ColumnWidth3></Build>\r
+      <Workspace>\r
+        <ColumnWidths>\r
+          \r
+          \r
+          \r
+          \r
+        <Column0>177</Column0><Column1>27</Column1><Column2>27</Column2><Column3>27</Column3></ColumnWidths>\r
+      </Workspace>\r
+      <Disassembly>\r
+        \r
+        \r
+        \r
+      <MixedMode>1</MixedMode><CodeCovShow>1</CodeCovShow><InstrProfShow>1</InstrProfShow></Disassembly>\r
+    </Static>\r
+    <Windows>\r
+      \r
+      \r
+      \r
+    <Wnd3>\r
+        <Tabs>\r
+          <Tab>\r
+            <Identity>TabID-6682-31467</Identity>\r
+            <TabName>Debug Log</TabName>\r
+            <Factory>Debug-Log</Factory>\r
+            <Session/>\r
+          </Tab>\r
+          <Tab>\r
+            <Identity>TabID-16908-31480</Identity>\r
+            <TabName>Build</TabName>\r
+            <Factory>Build</Factory>\r
+            <Session/>\r
+          </Tab>\r
+        </Tabs>\r
+        \r
+      <SelectedTab>0</SelectedTab></Wnd3><Wnd4>\r
+        <Tabs>\r
+          <Tab>\r
+            <Identity>TabID-17431-31470</Identity>\r
+            <TabName>Workspace</TabName>\r
+            <Factory>Workspace</Factory>\r
+            <Session>\r
+              \r
+            <NodeDict><ExpandedNode>ez430_chronos</ExpandedNode><ExpandedNode>ez430_chronos/driver</ExpandedNode></NodeDict></Session>\r
+          </Tab>\r
+        </Tabs>\r
+        \r
+      <SelectedTab>0</SelectedTab></Wnd4><Wnd5>\r
+        <Tabs>\r
+          <Tab>\r
+            <Identity>TabID-28179-31473</Identity>\r
+            <TabName>Disassembly</TabName>\r
+            <Factory>Disassembly</Factory>\r
+            <Session/>\r
+          </Tab>\r
+        </Tabs>\r
+        \r
+      <SelectedTab>0</SelectedTab></Wnd5></Windows>\r
+    <Editor>\r
+      \r
+      \r
+      \r
+      \r
+    <Pane><Tab><Factory>TextEditor</Factory><Filename>$WS_DIR$\main.c</Filename><XPos>0</XPos><YPos>147</YPos><SelStart>6219</SelStart><SelEnd>6219</SelEnd></Tab><ActiveTab>0</ActiveTab></Pane><ActivePane>0</ActivePane><Sizes><Pane><X>1000000</X><Y>1000000</Y></Pane></Sizes><SplitMode>1</SplitMode></Editor>\r
+    <Positions>\r
+      \r
+      \r
+      \r
+      \r
+      \r
+    <Top><Row0><Sizes><Toolbar-012aa660><key>iaridepm.enu1</key></Toolbar-012aa660></Sizes></Row0><Row1><Sizes><Toolbar-0f579fb0><key>debuggergui.enu1</key></Toolbar-0f579fb0></Sizes></Row1><Row2><Sizes><Toolbar-0f57b7e0><key>430fet1</key></Toolbar-0f57b7e0></Sizes></Row2></Top><Left><Row0><Sizes><Wnd4><Rect><Top>-2</Top><Left>-2</Left><Bottom>585</Bottom><Right>267</Right><x>-2</x><y>-2</y><xscreen>269</xscreen><yscreen>283</yscreen><sizeHorzCX>210156</sizeHorzCX><sizeHorzCY>295407</sizeHorzCY><sizeVertCX>210156</sizeVertCX><sizeVertCY>612735</sizeVertCY></Rect></Wnd4></Sizes></Row0></Left><Right><Row0><Sizes><Wnd5><Rect><Top>-2</Top><Left>-2</Left><Bottom>585</Bottom><Right>267</Right><x>-2</x><y>-2</y><xscreen>269</xscreen><yscreen>283</yscreen><sizeHorzCX>210156</sizeHorzCX><sizeHorzCY>295407</sizeHorzCY><sizeVertCX>210156</sizeVertCX><sizeVertCY>612735</sizeVertCY></Rect></Wnd5></Sizes></Row0></Right><Bottom><Row0><Sizes><Wnd3><Rect><Top>-2</Top><Left>-2</Left><Bottom>281</Bottom><Right>1282</Right><x>-2</x><y>-2</y><xscreen>1284</xscreen><yscreen>283</yscreen><sizeHorzCX>1003125</sizeHorzCX><sizeHorzCY>295407</sizeHorzCY><sizeVertCX>210156</sizeVertCX><sizeVertCY>295407</sizeVertCY></Rect></Wnd3></Sizes></Row0></Bottom><Float><Sizes/></Float></Positions>\r
+  </Desktop>\r
+</Project>\r
+\r
+\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/settings/ez430_chronos.dni b/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/settings/ez430_chronos.dni
new file mode 100755 (executable)
index 0000000..c72a32b
--- /dev/null
@@ -0,0 +1,89 @@
+[State Storage]\r
+Control Register=0\r
+[Sequencer]\r
+Control Register=0\r
+NextState0=0\r
+NextState1=0\r
+[Action Register]\r
+Break=1\r
+State Storage=0\r
+[DebugChecksum]\r
+Checksum=562905950\r
+[DisAssemblyWindow]\r
+NumStates=_ 1\r
+State 1=_ 1\r
+[InstructionProfiling]\r
+Enabled=_ 0\r
+[CodeCoverage]\r
+Enabled=_ 0\r
+[StackPlugin]\r
+Enabled=1\r
+OverflowWarningsEnabled=1\r
+WarningThreshold=90\r
+SpWarningsEnabled=1\r
+WarnHow=0\r
+UseTrigger=1\r
+TriggerName=main\r
+LimitSize=0\r
+ByteLimit=50\r
+[InterruptLog]\r
+LogEnabled=0\r
+SumEnabled=0\r
+GraphEnabled=0\r
+ShowTimeLog=1\r
+ShowTimeSum=1\r
+SumSortOrder=0\r
+[Interrupts]\r
+Enabled=1\r
+[MemoryMap]\r
+Enabled=0\r
+Base=0\r
+UseAuto=0\r
+TypeViolation=1\r
+UnspecRange=1\r
+ActionState=1\r
+[TraceHelper]\r
+Enabled=0\r
+ShowSource=1\r
+[Log file]\r
+LoggingEnabled=_ 0\r
+LogFile=_ ""\r
+Category=_ 0\r
+[TermIOLog]\r
+LoggingEnabled=_ 0\r
+LogFile=_ ""\r
+[CallStackLog]\r
+Enabled=0\r
+[DriverProfiling]\r
+Enabled=0\r
+Mode=1075610178\r
+Graph=0\r
+Symbiont=0\r
+[Breakpoints]\r
+Bp0=_ "STD_CODE" "{$PROJ_DIR$\driver\timer.c}.412.5@1" 0 0 0 0 "" 0 ""\r
+Count=1\r
+[FET]\r
+Clock mode=14\r
+Extended Clock mode=-1\r
+Secure Password=\r
+Extended Clock Control Enable=1\r
+Advanced Extended Clock Control=0\r
+Emulation mode=0\r
+Free running=0\r
+Shutting Down=3\r
+[Memory Dump]\r
+Start address=\r
+Lenghth=\r
+Address info=0\r
+Format=0\r
+Dump registers=0\r
+PC=0\r
+SP=0\r
+SR=0\r
+all registers=0\r
+File name=\r
+[Aliases]\r
+A0=_ "C:\Documents and Settings\x0144126.ENT\My Documents\Tasks\New Release\new chronos release 23-11\windows\Software Projects\Chronos Watch\IAR\Sports Watch\driver\adc12.c" ""\r
+A1=_ "C:\Documents and Settings\x0144126.ENT\My Documents\Tasks\New Release\new chronos release 23-11\windows\Software Projects\Chronos Watch\IAR\Sports Watch\driver\ports.c" ""\r
+Count=2\r
+SuppressDialog=0\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/settings/ez430_chronos.wsdt b/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/settings/ez430_chronos.wsdt
new file mode 100755 (executable)
index 0000000..4868da4
--- /dev/null
@@ -0,0 +1,66 @@
+<?xml version="1.0" encoding="iso-8859-1"?>\r
+\r
+<Workspace>\r
+  <ConfigDictionary>\r
+    \r
+  <CurrentConfigs><Project>ez430_chronos/433MHz - Unrestricted IAR Workbench (Other regions)</Project></CurrentConfigs></ConfigDictionary>\r
+  <Desktop>\r
+    <Static>\r
+      <Workspace>\r
+        <ColumnWidths>\r
+          \r
+          \r
+          \r
+          \r
+        <Column0>287</Column0><Column1>1</Column1><Column2>27</Column2><Column3>0</Column3></ColumnWidths>\r
+      </Workspace>\r
+      <Build>\r
+        \r
+        \r
+        \r
+        \r
+      <ColumnWidth0>20</ColumnWidth0><ColumnWidth1>916</ColumnWidth1><ColumnWidth2>244</ColumnWidth2><ColumnWidth3>61</ColumnWidth3></Build>\r
+    <Find-in-Files><ColumnWidth0>466</ColumnWidth0><ColumnWidth1>0</ColumnWidth1><ColumnWidth2>1303</ColumnWidth2></Find-in-Files><TerminalIO/><Debug-Log><ColumnWidth0>20</ColumnWidth0><ColumnWidth1>1222</ColumnWidth1></Debug-Log></Static>\r
+    <Windows>\r
+      \r
+      \r
+    <Wnd0>\r
+        <Tabs>\r
+          <Tab>\r
+            <Identity>TabID-31076-2853</Identity>\r
+            <TabName>Workspace</TabName>\r
+            <Factory>Workspace</Factory>\r
+            <Session>\r
+              \r
+            <NodeDict><ExpandedNode>ez430_chronos</ExpandedNode></NodeDict></Session>\r
+          </Tab>\r
+        </Tabs>\r
+        \r
+      <SelectedTab>0</SelectedTab></Wnd0><Wnd1>\r
+        <Tabs>\r
+          <Tab>\r
+            <Identity>TabID-19282-2870</Identity>\r
+            <TabName>Build</TabName>\r
+            <Factory>Build</Factory>\r
+            <Session/>\r
+          </Tab>\r
+        <Tab><Identity>TabID-12108-28463</Identity><TabName>Find in Files</TabName><Factory>Find-in-Files</Factory><Session/></Tab></Tabs>\r
+        \r
+      <SelectedTab>0</SelectedTab></Wnd1></Windows>\r
+    <Editor>\r
+      \r
+      \r
+      \r
+      \r
+    <Pane><Tab><Factory>TextEditor</Factory><Filename>$WS_DIR$\main.c</Filename><XPos>0</XPos><YPos>0</YPos><SelStart>188</SelStart><SelEnd>188</SelEnd></Tab><ActiveTab>0</ActiveTab></Pane><ActivePane>0</ActivePane><Sizes><Pane><X>1000000</X><Y>1000000</Y></Pane></Sizes><SplitMode>1</SplitMode></Editor>\r
+    <Positions>\r
+      \r
+      \r
+      \r
+      \r
+      \r
+    <Top><Row0><Sizes><Toolbar-012aaf10><key>iaridepm.enu1</key></Toolbar-012aaf10></Sizes></Row0></Top><Left><Row0><Sizes><Wnd0><Rect><Top>-2</Top><Left>-2</Left><Bottom>716</Bottom><Right>335</Right><x>-2</x><y>-2</y><xscreen>200</xscreen><yscreen>200</yscreen><sizeHorzCX>156250</sizeHorzCX><sizeHorzCY>208768</sizeHorzCY><sizeVertCX>263281</sizeVertCX><sizeVertCY>749478</sizeVertCY></Rect></Wnd0></Sizes></Row0></Left><Right><Row0><Sizes/></Row0></Right><Bottom><Row0><Sizes><Wnd1><Rect><Top>-2</Top><Left>-2</Left><Bottom>198</Bottom><Right>1282</Right><x>-2</x><y>-2</y><xscreen>1284</xscreen><yscreen>200</yscreen><sizeHorzCX>1003125</sizeHorzCX><sizeHorzCY>208768</sizeHorzCY><sizeVertCX>156250</sizeVertCX><sizeVertCY>208768</sizeVertCY></Rect></Wnd1></Sizes></Row0></Bottom><Float><Sizes/></Float></Positions>\r
+  </Desktop>\r
+</Workspace>\r
+\r
+\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/Applications/application/End Device/main_ED_BM.c b/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/Applications/application/End Device/main_ED_BM.c
new file mode 100755 (executable)
index 0000000..af83d41
--- /dev/null
@@ -0,0 +1,264 @@
+/**********************************************************************************************\r
+  Copyright 2007-2009 Texas Instruments Incorporated. All rights reserved.\r
+\r
+  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+  the terms of a software license agreement between the user who downloaded the software,\r
+  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+  License. The License limits your use, and you acknowledge, that the Software may not be\r
+  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+  perform, display or sell this Software and/or its documentation for any purpose.\r
+\r
+  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+\r
+  Should you have any questions regarding your right to use this Software,\r
+  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+// *************************************************************************************************\r
+// Include section\r
+#include "bsp.h"\r
+#include "mrfi.h"\r
+#include "nwk_types.h"\r
+#include "nwk_api.h"\r
+#include "bsp_leds.h"\r
+#include "bsp_buttons.h"\r
+#include "simpliciti.h"\r
+\r
+\r
+// *************************************************************************************************\r
+// Defines section\r
+#define TIMEOUT                                        (10u)\r
+\r
+// Conversion from msec to ACLK timer ticks\r
+#define CONV_MS_TO_TICKS(msec)                                 (((msec) * 32768) / 1000) \r
+\r
+// U16\r
+typedef unsigned short u16;\r
+\r
+// *************************************************************************************************\r
+// Prototypes section\r
+\r
+\r
+// *************************************************************************************************\r
+// Extern section\r
+extern uint8_t sInit_done;\r
+\r
+// SimpliciTI has no low power delay function, so we have to use ours\r
+extern void Timer0_A4_Delay(u16 ticks);\r
+\r
+\r
+// *************************************************************************************************\r
+// Global Variable section\r
+static linkID_t sLinkID1;\r
+\r
+\r
+\r
+// *************************************************************************************************\r
+// @fn          simpliciti_link\r
+// @brief       Init hardware and try to link to access point.\r
+// @param       none\r
+// @return      unsigned char          0 = Could not link, timeout or external cancel.\r
+//                                                                     1 = Linked successful.\r
+// *************************************************************************************************\r
+unsigned char simpliciti_link(void)\r
+{\r
+  uint8_t timeout;\r
+  addr_t lAddr;\r
+  uint8_t i;\r
+  uint8_t pwr;\r
+  \r
+  // Configure timer\r
+  BSP_InitBoard();\r
+  \r
+  // Change network address to value set in calling function\r
+  for (i=0; i<NET_ADDR_SIZE; i++)\r
+  {\r
+    lAddr.addr[i] = simpliciti_ed_address[i];\r
+  }\r
+  SMPL_Ioctl(IOCTL_OBJ_ADDR, IOCTL_ACT_SET, &lAddr);\r
+  \r
+  // Set flag  \r
+  simpliciti_flag = SIMPLICITI_STATUS_LINKING; \r
+       \r
+  /* Keep trying to join (a side effect of successful initialization) until\r
+   * successful. Toggle LEDS to indicate that joining has not occurred.\r
+   */\r
+  timeout = 0;\r
+  while (SMPL_SUCCESS != SMPL_Init(0))\r
+  {\r
+    NWK_DELAY(1000);\r
+\r
+    // Service watchdog\r
+       WDTCTL = WDTPW + WDTIS__512K + WDTSSEL__ACLK + WDTCNTCL;\r
+    \r
+    // Stop connecting after defined numbers of seconds (15)\r
+    if (timeout++ > TIMEOUT) \r
+    {\r
+               // Clean up SimpliciTI stack to enable restarting\r
+               sInit_done = 0;\r
+           simpliciti_flag = SIMPLICITI_STATUS_ERROR;\r
+               return (0);\r
+    }\r
+    \r
+    // Break when flag bit SIMPLICITI_TRIGGER_STOP is set\r
+    if (getFlag(simpliciti_flag, SIMPLICITI_TRIGGER_STOP)) \r
+    {\r
+               // Clean up SimpliciTI stack to enable restarting\r
+       sInit_done = 0;\r
+       return (0);\r
+       }\r
+  }\r
+  \r
+  // Set output power to +3.3dmB\r
+  pwr = IOCTL_LEVEL_2;\r
+  SMPL_Ioctl(IOCTL_OBJ_RADIO, IOCTL_ACT_RADIO_SETPWR, &pwr);\r
+\r
+  /* Unconditional link to AP which is listening due to successful join. */\r
+  timeout = 0;\r
+  while (SMPL_SUCCESS != SMPL_Link(&sLinkID1))\r
+  {\r
+    NWK_DELAY(1000);\r
+    \r
+    // Service watchdog\r
+       WDTCTL = WDTPW + WDTIS__512K + WDTSSEL__ACLK + WDTCNTCL;\r
+\r
+    // Stop linking after timeout\r
+    if (timeout++ > TIMEOUT) \r
+    {\r
+               // Clean up SimpliciTI stack to enable restarting\r
+               sInit_done = 0;\r
+           simpliciti_flag = SIMPLICITI_STATUS_ERROR;\r
+               return (0);\r
+    }\r
+    \r
+    // Exit when flag bit SIMPLICITI_TRIGGER_STOP is set\r
+    if (getFlag(simpliciti_flag, SIMPLICITI_TRIGGER_STOP)) \r
+    {\r
+       // Clean up SimpliciTI stack to enable restarting\r
+       sInit_done = 0;\r
+       return (0); \r
+       }\r
+  }\r
+  simpliciti_flag = SIMPLICITI_STATUS_LINKED;\r
+  \r
+  return (1);\r
+}\r
+\r
+\r
+\r
+// *************************************************************************************************\r
+// @fn          simpliciti_main_tx_only\r
+// @brief       Get data through callback. Transfer data when external trigger is set.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void simpliciti_main_tx_only(void)\r
+{\r
+  while(1)\r
+  {\r
+    // Get end device data from callback function \r
+    simpliciti_get_ed_data_callback();\r
+    \r
+    // Send data when flag bit SIMPLICITI_TRIGGER_SEND_DATA is set\r
+    if (getFlag(simpliciti_flag, SIMPLICITI_TRIGGER_SEND_DATA)) \r
+    {\r
+      // Get radio ready. Wakes up in IDLE state.\r
+      SMPL_Ioctl( IOCTL_OBJ_RADIO, IOCTL_ACT_RADIO_AWAKE, 0);\r
+      \r
+      // Acceleration / button events packets are 4 bytes long\r
+      SMPL_SendOpt(sLinkID1, simpliciti_data, 4, SMPL_TXOPTION_NONE);\r
+      \r
+      // Put radio back to SLEEP state\r
+      SMPL_Ioctl( IOCTL_OBJ_RADIO, IOCTL_ACT_RADIO_SLEEP, 0);\r
+      \r
+      clearFlag(simpliciti_flag, SIMPLICITI_TRIGGER_SEND_DATA);\r
+    }\r
+    \r
+    // Exit when flag bit SIMPLICITI_TRIGGER_STOP is set\r
+    if (getFlag(simpliciti_flag, SIMPLICITI_TRIGGER_STOP)) \r
+    {\r
+       // Clean up SimpliciTI stack to enable restarting\r
+       sInit_done = 0;\r
+           break;\r
+       }\r
+  }\r
+}\r
+\r
+\r
+\r
+// *************************************************************************************************\r
+// @fn          simpliciti_main_sync\r
+// @brief       Send ready-to-receive packets in regular intervals. Listen shortly for host reply.\r
+//                             Decode received host command and trigger action. \r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void simpliciti_main_sync(void)\r
+{\r
+       uint8_t len, i;\r
+       uint8_t ed_data[2];\r
+       \r
+       while(1)\r
+       {\r
+               // Sleep 0.5sec between ready-to-receive packets\r
+               // SimpliciTI has no low power delay function, so we have to use ours\r
+               Timer0_A4_Delay(CONV_MS_TO_TICKS(500));\r
+               \r
+               // Get radio ready. Radio wakes up in IDLE state.\r
+       SMPL_Ioctl( IOCTL_OBJ_RADIO, IOCTL_ACT_RADIO_AWAKE, 0);\r
+               \r
+               // Send 2 byte long ready-to-receive packet to stimulate host reply\r
+               ed_data[0] = SYNC_ED_TYPE_R2R;\r
+               ed_data[1] = 0xCB;\r
+               SMPL_SendOpt(sLinkID1, ed_data, 2, SMPL_TXOPTION_NONE);\r
+               \r
+               // Wait shortly for host reply\r
+               SMPL_Ioctl( IOCTL_OBJ_RADIO, IOCTL_ACT_RADIO_RXON, 0);\r
+               NWK_DELAY(10);\r
+       \r
+               // Check if a command packet was received\r
+               while (SMPL_Receive(sLinkID1, simpliciti_data, &len) == SMPL_SUCCESS)\r
+               {\r
+                       // Decode received data\r
+                       if (len > 0)\r
+                       {\r
+                               // Use callback function in application to decode data and react\r
+                               simpliciti_sync_decode_ap_cmd_callback();\r
+                               \r
+                               // Get reply data and send out reply packet burst (19 bytes each)\r
+                               for (i=0; i<simpliciti_reply_count; i++)\r
+                               {\r
+                                       NWK_DELAY(10);\r
+                                       simpliciti_sync_get_data_callback(i);\r
+                                       SMPL_SendOpt(sLinkID1, simpliciti_data, BM_SYNC_DATA_LENGTH, SMPL_TXOPTION_NONE);\r
+                               }\r
+                       }\r
+               }\r
+\r
+               // Put radio back to sleep              \r
+               SMPL_Ioctl( IOCTL_OBJ_RADIO, IOCTL_ACT_RADIO_SLEEP, 0);\r
+               \r
+               // Service watchdog\r
+               WDTCTL = WDTPW + WDTIS__512K + WDTSSEL__ACLK + WDTCNTCL;\r
+               \r
+               // Exit when flag bit SIMPLICITI_TRIGGER_STOP is set\r
+               if (getFlag(simpliciti_flag, SIMPLICITI_TRIGGER_STOP)) \r
+               {\r
+                       // Clean up SimpliciTI stack to enable restarting\r
+                       sInit_done = 0;\r
+                       break;\r
+               }\r
+       }\r
+}\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/Applications/configuration/End Device/smpl_config.dat b/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/Applications/configuration/End Device/smpl_config.dat
new file mode 100755 (executable)
index 0000000..ca3bfb4
--- /dev/null
@@ -0,0 +1,81 @@
+/**************************************************************************************************\r
+  Filename:       smpl_config.dat\r
+  Revised:        $Date: 2008-10-02 15:57:27 -0700 (Thu, 02 Oct 2008) $\r
+  Revision:       $Revision: 18187 $\r
+  Author:         $Author: lfriedman $\r
+\r
+  Description:    This file supports the SimpliciTI Customer Configuration for End Devices.\r
+\r
+  Copyright 2004-2007 Texas Instruments Incorporated. All rights reserved.\r
+\r
+  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+  the terms of a software license agreement between the user who downloaded the software,\r
+  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+  License. The License limits your use, and you acknowledge, that the Software may not be\r
+  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+  perform, display or sell this Software and/or its documentation for any purpose.\r
+\r
+  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+\r
+  Should you have any questions regarding your right to use this Software,\r
+  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+\r
+/* Number of connections supported. each connection supports bi-directional\r
+ * communication.  Access Points and Range Extenders can set this to 0 if they\r
+ * do not host End Device objects\r
+ */\r
+/*-DNUM_CONNECTIONS=2*/\r
+/* [BM] Only allow 1 connection to RF access point */\r
+-DNUM_CONNECTIONS=1\r
+\r
+/*  ***  Size of low level queues for sent and received frames. Affects RAM usage  ***  */\r
+\r
+/* AP needs larger input frame queue if it is supporting store-and-forward\r
+ * clients because the forwarded messages are held here. Two is probably enough\r
+ * for an End Device\r
+ */\r
+-DSIZE_INFRAME_Q=2\r
+\r
+/* The output frame queue can be small since Tx is done synchronously. Actually\r
+ * 1 is probably enough. If an Access Point device is also hosting an End Device \r
+ * that sends to a sleeping peer the output queue should be larger -- the waiting \r
+ * frames in this case are held here. In that case the output frame queue should \r
+ * be bigger. \r
+ */\r
+-DSIZE_OUTFRAME_Q=2\r
+\r
+/* This device's address. The first byte is used as a filter on the CC1100/CC2500\r
+ * radios so THE FIRST BYTE MUST NOT BE either 0x00 or 0xFF. Also, for these radios\r
+ * on End Devices the first byte should be the least significant byte so the filtering\r
+ * is maximally effective. Otherwise the frame has to be processed by the MCU before it\r
+ * is recognized as not intended for the device. APs and REs run in promiscuous mode so\r
+ * the filtering is not done. This macro intializes a static const array of unsigned\r
+ * characters of length NET_ADDR_SIZE (found in nwk_types.h). the quotes (") are\r
+ * necessary below unless the spaces are removed.\r
+ */\r
+-DTHIS_DEVICE_ADDRESS="{0x79, 0x56, 0x34, 0x12}"\r
+\r
+/* device type */\r
+-DEND_DEVICE\r
+\r
+/* For polling End Devices we need to specify that they do so. Uncomment the \r
+ * macro definition below if this is a polling device. This field is used \r
+ * by the Access Point to know whether to reserve store-and-forward support \r
+ * for the polling End Device during the Join exchange.\r
+ */\r
+/* -DRX_POLLS */\r
+\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/Applications/configuration/smpl_nwk_config.dat b/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/Applications/configuration/smpl_nwk_config.dat
new file mode 100755 (executable)
index 0000000..48119de
--- /dev/null
@@ -0,0 +1,80 @@
+/**************************************************************************************************\r
+  Filename:       smpl_nwk_config.dat\r
+  Revised:        $Date: 2009-02-07 14:21:07 -0700 (Sat, 07 Feb 2009) $\r
+  Revision:       $Revision: 19010 $\r
+  Author:         $Author: lfriedman $\r
+\r
+  Description:    This file supports the SimpliciTI Customer Configuration for overall network.\r
+\r
+  Copyright 2007-2009 Texas Instruments Incorporated. All rights reserved.\r
+\r
+  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+  the terms of a software license agreement between the user who downloaded the software,\r
+  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+  License. The License limits your use, and you acknowledge, that the Software may not be\r
+  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+  perform, display or sell this Software and/or its documentation for any purpose.\r
+\r
+  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+\r
+  Should you have any questions regarding your right to use this Software,\r
+  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+\r
+/* max hop count */\r
+-DMAX_HOPS=3\r
+\r
+/* max hops away from and AP. Keeps hop count and therefore replay\r
+ * storms down for sending to and from polling End Devices. Also used\r
+ * when joining since the EDs can't be more than 1 hop away.\r
+ */\r
+-DMAX_HOPS_FROM_AP=1\r
+\r
+/* Maximum size of Network application payload. Do not change unless\r
+ * protocol changes are reflected in different maximum network\r
+ * application payload size.\r
+ */\r
+-DMAX_NWK_PAYLOAD=9\r
+\r
+/* Maximum size of application payload */\r
+/*-DMAX_APP_PAYLOAD=10*/\r
+/* [BM] Need to increase max payload for sync application */\r
+-DMAX_APP_PAYLOAD=19\r
+\r
+/* default Link token */\r
+-DDEFAULT_LINK_TOKEN=0x01020304\r
+\r
+/* default Join token */\r
+-DDEFAULT_JOIN_TOKEN=0x05060708\r
+\r
+/* define Frequency Agility as active for this build */\r
+/* [BM] No need for frequency hopping */\r
+/*-DFREQUENCY_AGILITY*/\r
+\r
+/* Remove 'x' corruption to enable application autoacknowledge support. Requires extended API as well */\r
+-DAPP_AUTO_ACK\r
+\r
+/* Remove 'x' corruption to enable Extended API */\r
+-DEXTENDED_API\r
+\r
+/* Remove 'x' corruption to enable security. */\r
+-DxSMPL_SECURE\r
+\r
+/* Remove 'x' corruption to enable NV object support. */\r
+-DxNVOBJECT_SUPPORT\r
+\r
+/* Remove 'x' corruption to enable software timer. */\r
+-DSW_TIMER\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/CC430_End_Device_433MHz.r43 b/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/CC430_End_Device_433MHz.r43
new file mode 100755 (executable)
index 0000000..02df10a
Binary files /dev/null and b/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/CC430_End_Device_433MHz.r43 differ
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/CC430_End_Device_868MHz.r43 b/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/CC430_End_Device_868MHz.r43
new file mode 100755 (executable)
index 0000000..a5bfe63
Binary files /dev/null and b/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/CC430_End_Device_868MHz.r43 differ
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/CC430_End_Device_915MHz.r43 b/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/CC430_End_Device_915MHz.r43
new file mode 100755 (executable)
index 0000000..15d69bb
Binary files /dev/null and b/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/CC430_End_Device_915MHz.r43 differ
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/Components/bsp/boards/CC430EM/bsp_board.c b/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/Components/bsp/boards/CC430EM/bsp_board.c
new file mode 100755 (executable)
index 0000000..42be76e
--- /dev/null
@@ -0,0 +1,289 @@
+/**************************************************************************************************\r
+  Filename:       bsp_board.c\r
+  Revised:        $Date: 2009-10-11 16:48:20 -0700 (Sun, 11 Oct 2009) $\r
+  Revision:       $Revision: 20896 $\r
+\r
+  Copyright 2008-2009 Texas Instruments Incorporated.  All rights reserved.\r
+\r
+  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+  the terms of a software license agreement between the user who downloaded the software,\r
+  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+  License. The License limits your use, and you acknowledge, that the Software may not be\r
+  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+  perform, display or sell this Software and/or its documentation for any purpose.\r
+\r
+  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+\r
+  Should you have any questions regarding your right to use this Software,\r
+  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+/* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+ *   BSP (Board Support Package)\r
+ *   Target : Texas Instruments CC430EM\r
+ *   Top-level board code file.\r
+ * =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+ */\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                            Includes\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#include "bsp.h"\r
+#include "bsp_config.h"\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                            Prototypes\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+static void SetVCore(uint8_t level);\r
+static void SetVCoreUp(uint8_t level);\r
+static void SetVCoreDown(uint8_t level);\r
+static void Bsp_SetVCore(void);\r
+static void Bsp_SetClocks(void);\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                            Defines\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#define BSP_TIMER_CLK_MHZ   12       /* 12 MHz MCLKC and SMCLK */\r
+#define BSP_DELAY_MAX_USEC  (0xFFFF/BSP_TIMER_CLK_MHZ)\r
+\r
+/**************************************************************************************************\r
+ * @fn          SetVCore\r
+ *\r
+ * @brief       SetVCore level is called from the user API. Change level by one step only.\r
+ *\r
+ * @param       level - VcCore level\r
+ *\r
+ * @return      none\r
+ **************************************************************************************************\r
+ */\r
+static void SetVCore (uint8_t level)\r
+{\r
+  uint8_t actLevel;\r
+  do {\r
+    actLevel = PMMCTL0_L & PMMCOREV_3;\r
+    if (actLevel < level)\r
+      SetVCoreUp(++actLevel);               /* Set VCore (step by step) */\r
+    if (actLevel > level)\r
+      SetVCoreDown(--actLevel);             /* Set VCore (step by step) */\r
+  }while (actLevel != level);\r
+}\r
+\r
+/**************************************************************************************************\r
+ * @fn          SetVCoreUp\r
+ *\r
+ * @brief       Set VCore up. Change level by one step only.\r
+ *\r
+ * @param       level - VcCore level\r
+ *\r
+ * @return      none\r
+ *************************************************************************************************\r
+ */\r
+static void SetVCoreUp (uint8_t level)\r
+{\r
+  PMMCTL0_H = 0xA5;                          /* Open PMM module registers for write access */\r
+\r
+  SVSMHCTL = SVSHE + SVSHRVL0 * level + SVMHE + SVSMHRRL0 * level; /* Set SVS/M high side to new level */\r
+\r
+  SVSMLCTL = SVSLE + SVMLE + SVSMLRRL0 * level; /* Set SVM new Level */\r
+  while ((PMMIFG & SVSMLDLYIFG) == 0);       /* Wait till SVM is settled (Delay) */\r
+  PMMCTL0_L = PMMCOREV0 * level;             /* Set VCore to x */\r
+  PMMIFG &= ~(SVMLVLRIFG + SVMLIFG);         /* Clear already set flags */\r
+  if ((PMMIFG & SVMLIFG))\r
+    while ((PMMIFG & SVMLVLRIFG) == 0);      /* Wait till level is reached */\r
+\r
+  SVSMLCTL = SVSLE + SVSLRVL0 * level + SVMLE + SVSMLRRL0 * level;  /* Set SVS/M Low side to new level */\r
+  PMMCTL0_H = 0x00;                          /* Lock PMM module registers for write access */\r
+}\r
+\r
+/**************************************************************************************************\r
+ * @fn          SetVCoreDown\r
+ *\r
+ * @brief       Set VCore down\r
+ *\r
+ * @param       level - VcCore level\r
+ *\r
+ * @return      none\r
+ **************************************************************************************************\r
+ */\r
+static void SetVCoreDown (uint8_t level)\r
+{\r
+  PMMCTL0_H = 0xA5;                         /* Open PMM module registers for write access */\r
+  SVSMLCTL = SVSLE + SVSLRVL0 * level + SVMLE + SVSMLRRL0 * level; /* Set SVS/M Low side to new level */\r
+  while ((PMMIFG & SVSMLDLYIFG) == 0);      /* Wait till SVM is settled (Delay) */\r
+  PMMCTL0_L = (level * PMMCOREV0);          /* Set VCore to 1.85 V for Max Speed. */\r
+  PMMCTL0_H = 0x00;                         /* Lock PMM module registers for write access */\r
+}\r
+\r
+/**************************************************************************************************\r
+ * @fn          Bsp_SetVCore\r
+ *\r
+ * @brief       Setup the core voltage.\r
+ *\r
+ * @param       none\r
+ *\r
+ * @return      none\r
+ **************************************************************************************************\r
+ */\r
+static void Bsp_SetVCore(void)\r
+{\r
+  SetVCore(3);\r
+}\r
+\r
+/**************************************************************************************************\r
+ * @fn          Bsp_SetClocks\r
+ *\r
+ * @brief       Set up system clocks.\r
+ *\r
+ * @param       none\r
+ *\r
+ * @return      none\r
+ **************************************************************************************************\r
+ */\r
+static void Bsp_SetClocks(void)\r
+{\r
+  /* Configure CPU clock for 12MHz */\r
+\r
+  /* If clock settings are changed, remember to update BSP_TIMER_CLK_MHZ.\r
+   * Otherwise, all timer settings would be incorrect.\r
+   */\r
+  UCSCTL3 |= SELREF_2;                      /* Set DCO FLL reference = REFO */\r
+  UCSCTL4 |= SELA_2;                        /* Set ACLK = REFO */\r
+\r
+  __bis_SR_register(SCG0);                  /* Disable the FLL control loop */\r
+  UCSCTL0 = 0x0000;                         /* Set lowest possible DCOx, MODx */\r
+  UCSCTL1 = DCORSEL_5;                      /* Select DCO range 24MHz operation */\r
+  UCSCTL2 = FLLD_1 + 374;                   /* Set DCO Multiplier for 12MHz */\r
+                                            /* (N + 1) * FLLRef = Fdco */\r
+                                            /* (374 + 1) * 32768 = 12MHz */\r
+                                            /* Set FLL Div = fDCOCLK/2 */\r
+  __bic_SR_register(SCG0);                  /* Enable the FLL control loop */\r
+\r
+  /* Worst-case settling time for the DCO when the DCO range bits have been\r
+   * changed is n x 32 x 32 x f_MCLK / f_FLL_reference.\r
+   * 32 x 32 x 12 MHz / 32,768 Hz = 375000 = MCLK cycles for DCO to settle\r
+   */\r
+  __delay_cycles(375000);\r
+       \r
+  /* Loop until XT1,XT2 & DCO fault flag is cleared */\r
+  do\r
+  {\r
+    UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG + DCOFFG);\r
+                                            /* Clear XT2,XT1,DCO fault flags */\r
+    SFRIFG1 &= ~OFIFG;                      /* Clear fault flags */\r
+  }while (SFRIFG1&OFIFG);                   /* Test oscillator fault flag */\r
+\r
+  /* Select REFO as ACLK source and DCOCLK as MCLK and SMCLK source */\r
+  UCSCTL4 = SELA__REFOCLK | SELS__DCOCLKDIV | SELM__DCOCLKDIV;\r
+}\r
+\r
+/**************************************************************************************************\r
+ * @fn          BSP_EARLY_INIT\r
+ *\r
+ * @brief       This function is called by start-up code before doing the normal initialization\r
+ *              of data segments. If the return value is zero, initialization is not performed.\r
+ *              The global macro label "BSP_EARLY_INIT" gets #defined in the bsp_msp430_defs.h\r
+ *              file, according to the specific compiler environment (CCE or IAR). In the CCE\r
+ *              environment this macro invokes "_system_pre_init()" and in the IAR environment\r
+ *              this macro invokes "__low_level_init()".\r
+ *\r
+ * @param       None\r
+ *\r
+ * @return      0 - don't intialize data segments / 1 - do initialization\r
+ *************************************************************************************************\r
+ */\r
+BSP_EARLY_INIT(void)\r
+{\r
+  /* Disable watchdog timer */\r
+  WDTCTL = WDTPW | WDTHOLD;\r
+\r
+  /* Setup Vcore */\r
+  Bsp_SetVCore();\r
+\r
+  /* Configure System clocks */\r
+  Bsp_SetClocks();\r
+\r
+  /* Return 1 - run seg_init */\r
+  return (1);\r
+}\r
+\r
+/**************************************************************************************************\r
+ * @fn          BSP_InitBoard\r
+ *\r
+ * @brief       Initialize the board.\r
+ *\r
+ * @param       none\r
+ *\r
+ * @return      none\r
+ **************************************************************************************************\r
+ */\r
+void BSP_InitBoard(void)\r
+{\r
+  /* Configure TimerA for use by the delay function */\r
+\r
+  /* Reset the timer */\r
+  //TA0CTL |= TACLR; /* Set the TACLR  */\r
+\r
+  /* Clear all settings */\r
+  //TA0CTL = 0x0;\r
+\r
+  /* Select the clk source to be - SMCLK (Sub-Main CLK)*/\r
+  //TA0CTL |= TASSEL_2;\r
+  \r
+  // [BM] We need to use TA1 for delay function, because TA0 is already occupied\r
+  TA1CTL |= TACLR; /* Set the TACLR  */\r
+  TA1CTL = 0x0;\r
+  TA1CTL |= TASSEL_2;\r
+}\r
+\r
+/**************************************************************************************************\r
+ * @fn          BSP_Delay\r
+ *\r
+ * @brief       Delay for the requested amount of time.\r
+ *\r
+ * @param       # of microseconds to delay.\r
+ *\r
+ * @return      none\r
+ **************************************************************************************************\r
+ */\r
+void BSP_Delay(uint16_t usec)\r
+{\r
+  BSP_ASSERT(usec < BSP_DELAY_MAX_USEC);\r
+\r
+  //TA0R = 0; /* initial count  */\r
+  //TA0CCR0 = BSP_TIMER_CLK_MHZ*usec; /* compare count. (delay in ticks) */\r
+\r
+  /* Start the timer in UP mode */\r
+  //TA0CTL |= MC_1;\r
+\r
+  /* Loop till compare interrupt flag is set */\r
+  //while(!(TA0CCTL0 & CCIFG));\r
+\r
+  /* Stop the timer */\r
+  //TA0CTL &= ~(MC_1);\r
+\r
+  /* Clear the interrupt flag */\r
+   //TA0CCTL0 &= ~CCIFG;\r
+   \r
+  // [BM] We need to use TA1 for delay function, because TA0 is already occupied\r
+  TA1R = 0; \r
+  TA1CCR0 = BSP_TIMER_CLK_MHZ*usec; \r
+  TA1CTL |= MC_1;\r
+  while(!(TA1CCTL0 & CCIFG));\r
+  TA1CTL &= ~(MC_1);\r
+  TA1CCTL0 &= ~CCIFG;  \r
+}\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/Components/bsp/boards/CC430EM/bsp_board_defs.h b/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/Components/bsp/boards/CC430EM/bsp_board_defs.h
new file mode 100755 (executable)
index 0000000..f3e01ad
--- /dev/null
@@ -0,0 +1,83 @@
+/**************************************************************************************************\r
+  Revised:        $Date: 2007-07-06 11:19:00 -0700 (Fri, 06 Jul 2007) $\r
+  Revision:       $Revision: 13579 $\r
+\r
+  Copyright 2007 Texas Instruments Incorporated.  All rights reserved.\r
+\r
+  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+  the terms of a software license agreement between the user who downloaded the software,\r
+  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+  License. The License limits your use, and you acknowledge, that the Software may not be\r
+  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+  perform, display or sell this Software and/or its documentation for any purpose.\r
+\r
+  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+\r
+  Should you have any questions regarding your right to use this Software,\r
+  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+/* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+ *   BSP (Board Support Package)\r
+ *   Target : Texas Instruments CC430EM\r
+ *   Board definition file.\r
+ * =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+ */\r
+\r
+#ifndef BSP_BOARD_DEFS_H\r
+#define BSP_BOARD_DEFS_H\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                     Board Unique Define\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#define BSP_BOARD_CC430EM\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                           Mcu\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#include "mcus/bsp_msp430_defs.h"\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                          Clock\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#include "bsp_config.h"\r
+#define __bsp_CLOCK_MHZ__         BSP_CONFIG_CLOCK_MHZ\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                     Board Initialization\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#define BSP_BOARD_C               "bsp_board.c"\r
+#define BSP_INIT_BOARD()          BSP_InitBoard()\r
+#define BSP_DELAY_USECS(x)        BSP_Delay(x)\r
+\r
+void BSP_InitBoard(void);\r
+void BSP_Delay(uint16_t usec);\r
+\r
+/* ************************************************************************************************\r
+ *                                   Compile Time Integrity Checks\r
+ * ************************************************************************************************\r
+ */\r
+\r
+/**************************************************************************************************\r
+ */\r
+#endif\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/Components/bsp/boards/CC430EM/bsp_button_defs.h b/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/Components/bsp/boards/CC430EM/bsp_button_defs.h
new file mode 100755 (executable)
index 0000000..453863c
--- /dev/null
@@ -0,0 +1,91 @@
+/**************************************************************************************************\r
+  Revised:        $Date: 2007-07-06 11:19:00 -0700 (Fri, 06 Jul 2007) $\r
+  Revision:       $Revision: 13579 $\r
+\r
+  Copyright 2007 Texas Instruments Incorporated.  All rights reserved.\r
+\r
+  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+  the terms of a software license agreement between the user who downloaded the software,\r
+  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+  License. The License limits your use, and you acknowledge, that the Software may not be\r
+  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+  perform, display or sell this Software and/or its documentation for any purpose.\r
+\r
+  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+\r
+  Should you have any questions regarding your right to use this Software,\r
+  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+/* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+ *   BSP (Board Support Package)\r
+ *   Target : Texas Instruments CC430EM\r
+ *   Button definition file.\r
+ * =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+ */\r
+\r
+#ifndef BSP_BUTTON_DEFS_H\r
+#define BSP_BUTTON_DEFS_H\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                           Includes\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#include "bsp_board_defs.h"\r
+#include "bsp_macros.h"\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                      Button Configuration\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#define __bsp_NUM_BUTTONS__                   1\r
+#define __bsp_BUTTON_DEBOUNCE_WAIT__(expr)    st( int i; for(i=0; i<500; i++) { if (!(expr)) i = 0; } )\r
+\r
+\r
+/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+ *                 BUTTON #1\r
+ * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+ *   Schematic   :  S2\r
+ *   Description :  Push Button\r
+ *   Polarity    :  Active Low\r
+ *   GPIO        :  P1.7\r
+ * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+ */\r
+#define __bsp_BUTTON1_BIT__             7\r
+#define __bsp_BUTTON1_PORT__            P1IN\r
+#define __bsp_BUTTON1_IS_ACTIVE_LOW__   1\r
+\r
+\r
+/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+ *          Extended Configuration\r
+ * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+ */\r
+/* Enable the internal PullUp for button #1. */\r
+#define __bsp_BUTTON_EXTENDED_CONFIG__() st( P1OUT |= BV(__bsp_BUTTON1_BIT__); /* PullUp */ \\r
+                                             P1REN |= BV(__bsp_BUTTON1_BIT__);)/* Enable PullUp */\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                Include Generic Button Macros\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#include "code/bsp_generic_buttons.h"\r
+\r
+\r
+/**************************************************************************************************\r
+ */\r
+#endif\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/Components/bsp/boards/CC430EM/bsp_config.h b/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/Components/bsp/boards/CC430EM/bsp_config.h
new file mode 100755 (executable)
index 0000000..a4550e2
--- /dev/null
@@ -0,0 +1,47 @@
+/**************************************************************************************************\r
+  Revised:        $Date: 2007-07-06 11:19:00 -0700 (Fri, 06 Jul 2007) $\r
+  Revision:       $Revision: 13579 $\r
+\r
+  Copyright 2007 Texas Instruments Incorporated.  All rights reserved.\r
+\r
+  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+  the terms of a software license agreement between the user who downloaded the software,\r
+  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+  License. The License limits your use, and you acknowledge, that the Software may not be\r
+  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+  perform, display or sell this Software and/or its documentation for any purpose.\r
+\r
+  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+\r
+  Should you have any questions regarding your right to use this Software,\r
+  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+/* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+ *   BSP (Board Support Package)\r
+ *   Target : Texas Instruments CC430EM\r
+ *   Board configuration file.\r
+ * =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+ */\r
+\r
+#ifndef BSP_CONFIG_H\r
+#define BSP_CONFIG_H\r
+\r
+\r
+/* Nothing needed for this platform. */\r
+\r
+/**************************************************************************************************\r
+ */\r
+#endif\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/Components/bsp/boards/CC430EM/bsp_driver_defs.h b/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/Components/bsp/boards/CC430EM/bsp_driver_defs.h
new file mode 100755 (executable)
index 0000000..b3f7066
--- /dev/null
@@ -0,0 +1,54 @@
+/**************************************************************************************************\r
+  Revised:        $Date: 2007-07-06 11:19:00 -0700 (Fri, 06 Jul 2007) $\r
+  Revision:       $Revision: 13579 $\r
+\r
+  Copyright 2007 Texas Instruments Incorporated.  All rights reserved.\r
+\r
+  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+  the terms of a software license agreement between the user who downloaded the software,\r
+  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+  License. The License limits your use, and you acknowledge, that the Software may not be\r
+  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+  perform, display or sell this Software and/or its documentation for any purpose.\r
+\r
+  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+\r
+  Should you have any questions regarding your right to use this Software,\r
+  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+/* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+ *   BSP (Board Support Package)\r
+ *   Target : Texas Instruments CC430EM\r
+ *   Driver definition file.\r
+ * =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+ */\r
+\r
+#ifndef BSP_DRIVER_DEFS_H\r
+#define BSP_DRIVER_DEFS_H\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                     Driver Initialization\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#define BSP_DRIVERS_C               "bsp_drivers.c"\r
+#define BSP_INIT_DRIVERS()          BSP_InitDrivers()\r
+void BSP_InitDrivers(void);\r
+\r
+\r
+/**************************************************************************************************\r
+ */\r
+#endif\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/Components/bsp/boards/CC430EM/bsp_drivers.c b/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/Components/bsp/boards/CC430EM/bsp_drivers.c
new file mode 100755 (executable)
index 0000000..563f59c
--- /dev/null
@@ -0,0 +1,88 @@
+/**************************************************************************************************\r
+  Revised:        $Date: 2007-07-06 11:19:00 -0700 (Fri, 06 Jul 2007) $\r
+  Revision:       $Revision: 13579 $\r
+\r
+  Copyright 2007 Texas Instruments Incorporated.  All rights reserved.\r
+\r
+  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+  the terms of a software license agreement between the user who downloaded the software,\r
+  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+  License. The License limits your use, and you acknowledge, that the Software may not be\r
+  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+  perform, display or sell this Software and/or its documentation for any purpose.\r
+\r
+  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+\r
+  Should you have any questions regarding your right to use this Software,\r
+  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+/* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+ *   BSP (Board Support Package)\r
+ *   Target : Texas Instruments CC430EM\r
+ *   Top-level driver file.\r
+ * =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+ */\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                            Includes\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#include "bsp_driver_defs.h"\r
+#include "bsp_leds.h"\r
+#include "bsp_buttons.h"\r
+#include "bsp_config.h"\r
+\r
+\r
+/**************************************************************************************************\r
+ * @fn          BSP_InitDrivers\r
+ *\r
+ * @brief       Initialize all enabled BSP drivers.\r
+ *\r
+ * @param       none\r
+ *\r
+ * @return      none\r
+ **************************************************************************************************\r
+ */\r
+void BSP_InitDrivers(void)\r
+{\r
+#if (!defined BSP_NO_LEDS)\r
+  BSP_InitLeds();\r
+#endif\r
+\r
+#if (!defined BSP_NO_BUTTONS)\r
+  BSP_InitButtons();\r
+#endif\r
+}\r
+\r
+\r
+/* ================================================================================================\r
+ *                                        C Code Includes\r
+ * ================================================================================================\r
+ */\r
+#ifndef BSP_NO_LEDS\r
+#include "drivers/code/bsp_leds.c"\r
+#endif\r
+\r
+#ifndef BSP_NO_BUTTONS\r
+#include "drivers/code/bsp_buttons.c"\r
+#endif\r
+\r
+\r
+/**************************************************************************************************\r
+*/\r
+\r
+\r
+\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/Components/bsp/boards/CC430EM/bsp_external/mrfi_board_defs.h b/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/Components/bsp/boards/CC430EM/bsp_external/mrfi_board_defs.h
new file mode 100755 (executable)
index 0000000..38840c0
--- /dev/null
@@ -0,0 +1,81 @@
+/**************************************************************************************************\r
+  Revised:        $Date: 2007-07-06 11:19:00 -0700 (Fri, 06 Jul 2007) $\r
+  Revision:       $Revision: 13579 $\r
+\r
+  Copyright 2007 Texas Instruments Incorporated.  All rights reserved.\r
+\r
+  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+  the terms of a software license agreement between the user who downloaded the software,\r
+  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+  License. The License limits your use, and you acknowledge, that the Software may not be\r
+  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+  perform, display or sell this Software and/or its documentation for any purpose.\r
+\r
+  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+\r
+  Should you have any questions regarding your right to use this Software,\r
+  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+/* ~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=\r
+ *   MRFI (Minimal RF Interface)\r
+ *   Board definition file.\r
+ *   Target : Texas Instruments CC430EM\r
+ *   Radios : CC430\r
+ * ~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=\r
+ */\r
+\r
+#ifndef MRFI_BOARD_DEFS_H\r
+#define MRFI_BOARD_DEFS_H\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                           Includes\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#include "bsp.h"\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                           Defines\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                        Radio Selection\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#if (!defined MRFI_CC430)\r
+  #error "ERROR: A compatible radio must be specified for the CC430EM board."\r
+#endif\r
+\r
+\r
+/* Radio Interface critical section macros */\r
+typedef bspIState_t mrfiRIFIState_t;\r
+#define MRFI_RIF_ENTER_CRITICAL_SECTION(x)    BSP_ENTER_CRITICAL_SECTION(x)\r
+#define MRFI_RIF_EXIT_CRITICAL_SECTION(x)     BSP_EXIT_CRITICAL_SECTION(x)\r
+\r
+\r
+/**************************************************************************************************\r
+ *                                  Compile Time Integrity Checks\r
+ **************************************************************************************************\r
+ */\r
+#ifndef BSP_BOARD_CC430EM\r
+#error "ERROR: Mismatch between specified board and MRFI configuration."\r
+#endif\r
+\r
+\r
+/**************************************************************************************************\r
+ */\r
+#endif\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/Components/bsp/boards/CC430EM/bsp_led_defs.h b/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/Components/bsp/boards/CC430EM/bsp_led_defs.h
new file mode 100755 (executable)
index 0000000..5cd33b6
--- /dev/null
@@ -0,0 +1,97 @@
+/**************************************************************************************************\r
+  Revised:        $Date: 2007-07-06 11:19:00 -0700 (Fri, 06 Jul 2007) $\r
+  Revision:       $Revision: 13579 $\r
+\r
+  Copyright 2007 Texas Instruments Incorporated.  All rights reserved.\r
+\r
+  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+  the terms of a software license agreement between the user who downloaded the software,\r
+  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+  License. The License limits your use, and you acknowledge, that the Software may not be\r
+  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+  perform, display or sell this Software and/or its documentation for any purpose.\r
+\r
+  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+\r
+  Should you have any questions regarding your right to use this Software,\r
+  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+/* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+ *   BSP (Board Support Package)\r
+ *   Target : Texas Instruments CC430EM\r
+ *   LED definition file.\r
+ * =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+ */\r
+\r
+#ifndef BSP_LED_DEFS_H\r
+#define BSP_LED_DEFS_H\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                           Includes\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#include "bsp_board_defs.h"\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                      Configuration\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#define __bsp_NUM_LEDS__               2\r
+#define __bsp_LED_BLINK_LOOP_COUNT__   0x34000\r
+\r
+\r
+/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+ *                 LED #1\r
+ * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+ *   Schematic :  LED1\r
+ *   Color     :  Green\r
+ *   Polarity  :  Active High\r
+ *   GPIO      :  P1.0\r
+ * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+ */\r
+#define __bsp_LED1_BIT__            0\r
+#define __bsp_LED1_PORT__           P1OUT\r
+#define __bsp_LED1_DDR__            P1DIR\r
+#define __bsp_LED1_IS_ACTIVE_LOW__  0\r
+\r
+\r
+/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+ *                 LED #2\r
+ * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+ *   Schematic :  LED2\r
+ *   Color     :  Green\r
+ *   Polarity  :  Active High\r
+ *   GPIO      :  P3.6\r
+ * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+ */\r
+#define __bsp_LED2_BIT__            6\r
+#define __bsp_LED2_PORT__           P3OUT\r
+#define __bsp_LED2_DDR__            P3DIR\r
+#define __bsp_LED2_IS_ACTIVE_LOW__  0\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                 Include Generic LED Macros\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#include "code/bsp_generic_leds.h"\r
+\r
+\r
+/**************************************************************************************************\r
+ */\r
+#endif\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/Components/bsp/bsp.c b/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/Components/bsp/bsp.c
new file mode 100755 (executable)
index 0000000..cee0b33
--- /dev/null
@@ -0,0 +1,101 @@
+/**************************************************************************************************\r
+  Revised:        $Date: 2007-07-06 11:19:00 -0700 (Fri, 06 Jul 2007) $\r
+  Revision:       $Revision: 13579 $\r
+\r
+  Copyright 2007 Texas Instruments Incorporated.  All rights reserved.\r
+\r
+  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+  the terms of a software license agreement between the user who downloaded the software,\r
+  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+  License. The License limits your use, and you acknowledge, that the Software may not be\r
+  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+  perform, display or sell this Software and/or its documentation for any purpose.\r
+\r
+  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+\r
+  Should you have any questions regarding your right to use this Software,\r
+  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+/* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+ *   BSP (Board Support Package)\r
+ *   Top-level BSP code file.\r
+ * =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+ */\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                            Includes\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#include "bsp.h"\r
+#include "bsp_driver_defs.h"\r
+\r
+\r
+/**************************************************************************************************\r
+ * @fn          BSP_Init\r
+ *\r
+ * @brief       Initialize the board and drivers.\r
+ *\r
+ * @param       none\r
+ *\r
+ * @return      none\r
+ **************************************************************************************************\r
+ */\r
+void BSP_Init(void)\r
+{\r
+  BSP_INIT_BOARD();\r
+  BSP_INIT_DRIVERS();\r
+\r
+  /*-------------------------------------------------------------\r
+   *  Run time integrity checks.  Perform only if asserts\r
+   *  are enabled.\r
+   */\r
+#ifdef BSP_ASSERTS_ARE_ON\r
+  /* verify endianess is correctly specified */\r
+  {\r
+    uint16_t test = 0x00AA; /* first storage byte of 'test' is non-zero for little endian */\r
+    BSP_ASSERT(!(*((uint8_t *)&test)) == !BSP_LITTLE_ENDIAN); /* endianess mismatch */\r
+  }\r
+#endif\r
+}\r
+\r
+\r
+/* ================================================================================================\r
+ *                                        C Code Includes\r
+ * ================================================================================================\r
+ */\r
+#ifdef BSP_BOARD_C\r
+#include BSP_BOARD_C\r
+#endif\r
+\r
+#ifdef BSP_DRIVERS_C\r
+#include BSP_DRIVERS_C\r
+#endif\r
+\r
+\r
+/* ************************************************************************************************\r
+ *                                   Compile Time Integrity Checks\r
+ * ************************************************************************************************\r
+ */\r
+BSP_STATIC_ASSERT( sizeof(  uint8_t ) == 1 );\r
+BSP_STATIC_ASSERT( sizeof(   int8_t ) == 1 );\r
+BSP_STATIC_ASSERT( sizeof( uint16_t ) == 2 );\r
+BSP_STATIC_ASSERT( sizeof(  int16_t ) == 2 );\r
+BSP_STATIC_ASSERT( sizeof( uint32_t ) == 4 );\r
+BSP_STATIC_ASSERT( sizeof(  int32_t ) == 4 );\r
+\r
+\r
+/**************************************************************************************************\r
+ */\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/Components/bsp/bsp.h b/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/Components/bsp/bsp.h
new file mode 100755 (executable)
index 0000000..8cff5a0
--- /dev/null
@@ -0,0 +1,183 @@
+/**************************************************************************************************\r
+  Revised:        $Date: 2007-07-06 11:19:00 -0700 (Fri, 06 Jul 2007) $\r
+  Revision:       $Revision: 13579 $\r
+\r
+  Copyright 2007 Texas Instruments Incorporated.  All rights reserved.\r
+\r
+  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+  the terms of a software license agreement between the user who downloaded the software,\r
+  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+  License. The License limits your use, and you acknowledge, that the Software may not be\r
+  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+  perform, display or sell this Software and/or its documentation for any purpose.\r
+\r
+  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+\r
+  Should you have any questions regarding your right to use this Software,\r
+  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+/* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+ *   BSP (Board Support Package)\r
+ *   Include file for core BSP services.\r
+ * =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+ */\r
+\r
+#ifndef BSP_H\r
+#define BSP_H\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                           Includes\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#include "bsp_board_defs.h"\r
+#include "bsp_macros.h"\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                          BSP Defines\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#define BSP\r
+#define BSP_VER       100  /* BSP version 1.00a */\r
+#define BSP_SUBVER    a\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                            Clock\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#define BSP_CLOCK_MHZ   __bsp_CLOCK_MHZ__\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                            Memory\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#ifndef __bsp_LITTLE_ENDIAN__\r
+#error ERROR: Endianess not defined\r
+#endif\r
+\r
+#define BSP_LITTLE_ENDIAN   __bsp_LITTLE_ENDIAN__\r
+\r
+#define CODE    __bsp_CODE_MEMSPACE__\r
+#define XDATA   __bsp_XDATA_MEMSPACE__\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                            Interrupts\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#define BSP_ISR_FUNCTION(func,vect)     __bsp_ISR_FUNCTION__(func,vect)\r
+\r
+#define BSP_ENABLE_INTERRUPTS()         __bsp_ENABLE_INTERRUPTS__()\r
+#define BSP_DISABLE_INTERRUPTS()        __bsp_DISABLE_INTERRUPTS__()\r
+#define BSP_INTERRUPTS_ARE_ENABLED()    __bsp_INTERRUPTS_ARE_ENABLED__()\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                         Critical Sections\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+typedef __bsp_ISTATE_T__  bspIState_t;\r
+\r
+#define BSP_ENTER_CRITICAL_SECTION(x)   st( x = __bsp_GET_ISTATE__(); __bsp_DISABLE_INTERRUPTS__(); )\r
+#define BSP_EXIT_CRITICAL_SECTION(x)    __bsp_RESTORE_ISTATE__(x)\r
+#define BSP_CRITICAL_STATEMENT(x)       st( bspIState_t s;                    \\r
+                                            BSP_ENTER_CRITICAL_SECTION(s);    \\r
+                                            x;                                \\r
+                                            BSP_EXIT_CRITICAL_SECTION(s); )\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                           Asserts\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+\r
+/*\r
+ *  BSP_ASSERT( expression ) - The given expression must evaluate as "true" or else the assert\r
+ *  handler is called.  From here, the call stack feature of the debugger can pinpoint where\r
+ * the problem occurred.\r
+ *\r
+ *  BSP_FORCE_ASSERT() - If asserts are in use, immediately calls the assert handler.\r
+ *\r
+ *  BSP_ASSERTS_ARE_ON - can use #ifdef to see if asserts are enabled\r
+ *\r
+ *  Asserts can be disabled for optimum performance and minimum code size (ideal for\r
+ *  finalized, debugged production code).\r
+ */\r
+\r
+#if (!defined BSP_NO_DEBUG)\r
+#ifndef BSP_ASSERT_HANDLER\r
+#define BSP_ASSERT_HANDLER()      st( __bsp_DISABLE_INTERRUPTS__();  while(1); )\r
+#endif\r
+#define BSP_ASSERT(expr)          st( if (!(expr)) BSP_ASSERT_HANDLER(); )\r
+#define BSP_FORCE_ASSERT()        BSP_ASSERT_HANDLER()\r
+#define BSP_ASSERTS_ARE_ON\r
+#else\r
+#define BSP_ASSERT(expr)          /* empty */\r
+#define BSP_FORCE_ASSERT()        /* empty */\r
+#endif\r
+\r
+/* static assert */\r
+#define BSP_STATIC_ASSERT(expr)   void bspDummyPrototype( char dummy[1/((expr)!=0)] )\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                           Prototypes\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+void BSP_Init(void);\r
+/**************************************************************************************************\r
+ */\r
+\r
+/****************************************************************************************\r
+ *                                 BEGIN ENDIAN SUPPORT\r
+ *\r
+ * Security encrypt/decrypt operates on unsigned long quantities. These must match on\r
+ * source and destination platforms. These macros enforce the standard conversions.\r
+ * Currently all platforms (CC2520/CC2x30 and MSP430) are little endian.\r
+ *\r
+ *******************   Network order for encryption is LITTLE ENDIAN   ******************\r
+ *\r
+ ****************************************************************************************/\r
+\r
+#if (BSP_LITTLE_ENDIAN != 0)\r
+#define   ntohs(x)    (x)\r
+#define   htons(x)    (x)\r
+\r
+#define   ntohl(x)    (x)\r
+#define   htonl(x)    (x)\r
+\r
+#else\r
+\r
+#define   ntohs(x)    (((x>>8) & 0xFF) | ((x & 0xFF)<<8))\r
+#define   htons(x)    (((x>>8) & 0xFF) | ((x & 0xFF)<<8))\r
+\r
+#define   ntohl(x)    ( ((x>>24) & 0xFF) | ((x>>8) & 0xFF00) | \\r
+                        ((x & 0xFF00)<<8) | ((x & 0xFF)<<24)   \\r
+                      )\r
+#define   htonl(x)    ( ((x>>24) & 0xFF) | ((x>>8) & 0xFF00) | \\r
+                        ((x & 0xFF00)<<8) | ((x & 0xFF)<<24)   \\r
+                      )\r
+\r
+#endif  /* (BSP_LITTLE_ENDIAN != 0) */\r
+\r
+/***************************************************************************************\r
+ *                                 END ENDIAN SUPPORT\r
+ ***************************************************************************************/\r
+\r
+\r
+\r
+#endif\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/Components/bsp/bsp_macros.h b/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/Components/bsp/bsp_macros.h
new file mode 100755 (executable)
index 0000000..ee99a19
--- /dev/null
@@ -0,0 +1,79 @@
+/**************************************************************************************************\r
+  Revised:        $Date: 2007-07-06 11:19:00 -0700 (Fri, 06 Jul 2007) $\r
+  Revision:       $Revision: 13579 $\r
+\r
+  Copyright 2007 Texas Instruments Incorporated.  All rights reserved.\r
+\r
+  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+  the terms of a software license agreement between the user who downloaded the software,\r
+  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+  License. The License limits your use, and you acknowledge, that the Software may not be\r
+  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+  perform, display or sell this Software and/or its documentation for any purpose.\r
+\r
+  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+\r
+  Should you have any questions regarding your right to use this Software,\r
+  contact Texas Instruments Incorporated at www.TI.com. \r
+**************************************************************************************************/\r
+\r
+/* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+ *   BSP (Board Support Package)\r
+ *   Include file for BSP utility macros.\r
+ * =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+ */\r
+\r
+#ifndef BSP_MACROS_H\r
+#define BSP_MACROS_H\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                          Macros\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+/* bit value */\r
+#ifndef BV\r
+#define BV(n)      (1 << (n))\r
+#endif\r
+\r
+/*\r
+ *  This macro is for use by other macros to form a fully valid C statement.\r
+ *  Without this, the if/else conditionals could show unexpected behavior.\r
+ *\r
+ *  For example, use...\r
+ *    #define SET_REGS()  st( ioreg1 = 0; ioreg2 = 0; )\r
+ *  instead of ...\r
+ *    #define SET_REGS()  { ioreg1 = 0; ioreg2 = 0; }\r
+ *  or\r
+ *    #define  SET_REGS()    ioreg1 = 0; ioreg2 = 0;\r
+ *  The last macro would not behave as expected in the if/else construct.\r
+ *  The second to last macro will cause a compiler error in certain uses\r
+ *  of if/else construct\r
+ *\r
+ *  It is not necessary, or recommended, to use this macro where there is\r
+ *  already a valid C statement.  For example, the following is redundant...\r
+ *    #define CALL_FUNC()   st(  func();  )\r
+ *  This should simply be...\r
+ *    #define CALL_FUNC()   func()\r
+ *\r
+ * (The while condition below evaluates false without generating a\r
+ *  constant-controlling-loop type of warning on most compilers.)\r
+ */\r
+#define st(x)      do { x } while (__LINE__ == -1)\r
+\r
+\r
+/**************************************************************************************************\r
+ */\r
+#endif\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/Components/bsp/drivers/bsp_buttons.h b/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/Components/bsp/drivers/bsp_buttons.h
new file mode 100755 (executable)
index 0000000..b73d615
--- /dev/null
@@ -0,0 +1,90 @@
+/**************************************************************************************************\r
+  Revised:        $Date: 2007-07-06 11:19:00 -0700 (Fri, 06 Jul 2007) $\r
+  Revision:       $Revision: 13579 $\r
+\r
+  Copyright 2007 Texas Instruments Incorporated. All rights reserved.\r
+\r
+  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+  the terms of a software license agreement between the user who downloaded the software,\r
+  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+  License. The License limits your use, and you acknowledge, that the Software may not be\r
+  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+  perform, display or sell this Software and/or its documentation for any purpose.\r
+\r
+  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+\r
+  Should you have any questions regarding your right to use this Software,\r
+  contact Texas Instruments Incorporated at www.TI.com. \r
+**************************************************************************************************/\r
+\r
+/* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+ *   BSP (Board Support Package)\r
+ *   Button driver include file.\r
+ * =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+ */\r
+\r
+#ifndef BSP_BUTTONS_H\r
+#define BSP_BUTTONS_H\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                           Includes\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#include "bsp_button_defs.h"\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                           Defines\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#define BSP_NUM_BUTTONS                   __bsp_NUM_BUTTONS__\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                            Macros\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#define BSP_BUTTON_DEBOUNCE_WAIT(expr)    __bsp_BUTTON_DEBOUNCE_WAIT__(expr)    \r
+\r
+#define BSP_BUTTON1()   __bsp_BUTTON1__()\r
+#define BSP_BUTTON2()   __bsp_BUTTON2__()\r
+#define BSP_BUTTON3()   __bsp_BUTTON3__()\r
+#define BSP_BUTTON4()   __bsp_BUTTON4__()\r
+#define BSP_BUTTON5()   __bsp_BUTTON5__()\r
+#define BSP_BUTTON6()   __bsp_BUTTON6__()\r
+#define BSP_BUTTON7()   __bsp_BUTTON7__()\r
+#define BSP_BUTTON8()   __bsp_BUTTON8__()\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                        Prototypes\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+void BSP_InitButtons(void);\r
+\r
+\r
+/* ************************************************************************************************\r
+ *                                   Compile Time Integrity Checks\r
+ * ************************************************************************************************\r
+ */\r
+#ifdef BSP_NO_BUTTONS\r
+#error "ERROR: The button driver is disabled.  This file should not be included."\r
+#endif\r
+\r
+\r
+/**************************************************************************************************\r
+ */\r
+#endif\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/Components/bsp/drivers/bsp_leds.h b/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/Components/bsp/drivers/bsp_leds.h
new file mode 100755 (executable)
index 0000000..b01338b
--- /dev/null
@@ -0,0 +1,133 @@
+/**************************************************************************************************\r
+  Revised:        $Date: 2007-07-06 11:19:00 -0700 (Fri, 06 Jul 2007) $\r
+  Revision:       $Revision: 13579 $\r
+\r
+  Copyright 2007 Texas Instruments Incorporated.  All rights reserved.\r
+\r
+  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+  the terms of a software license agreement between the user who downloaded the software,\r
+  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+  License. The License limits your use, and you acknowledge, that the Software may not be\r
+  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+  perform, display or sell this Software and/or its documentation for any purpose.\r
+\r
+  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+\r
+  Should you have any questions regarding your right to use this Software,\r
+  contact Texas Instruments Incorporated at www.TI.com. \r
+**************************************************************************************************/\r
+\r
+/* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+ *   BSP (Board Support Package)\r
+ *   LED driver include file.\r
+ * =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+ */\r
+\r
+#ifndef BSP_LEDS_H\r
+#define BSP_LEDS_H\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                           Includes\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#include "bsp_led_defs.h"\r
+#include "bsp_macros.h"\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                             Defines\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#define BSP_NUM_LEDS            __bsp_NUM_LEDS__\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                              Macros\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+\r
+/* blink delay loop */\r
+#define BSP_LED_BLINK_DELAY()   st( { volatile uint32_t i; \\r
+                                      for (i=0; i<__bsp_LED_BLINK_LOOP_COUNT__; i++) { }; } )\r
+\r
+/* LED1 */\r
+#define BSP_TURN_ON_LED1()      __bsp_LED1_TURN_ON__()\r
+#define BSP_TURN_OFF_LED1()     __bsp_LED1_TURN_OFF__()\r
+#define BSP_TOGGLE_LED1()       __bsp_LED1_TOGGLE__()\r
+#define BSP_LED1_IS_ON()        __bsp_LED1_IS_ON__()\r
+\r
+/* LED2 */\r
+#define BSP_TURN_ON_LED2()      __bsp_LED2_TURN_ON__()\r
+#define BSP_TURN_OFF_LED2()     __bsp_LED2_TURN_OFF__()\r
+#define BSP_TOGGLE_LED2()       __bsp_LED2_TOGGLE__()\r
+#define BSP_LED2_IS_ON()        __bsp_LED2_IS_ON__()\r
+\r
+/* LED3 */\r
+#define BSP_TURN_ON_LED3()      __bsp_LED3_TURN_ON__()\r
+#define BSP_TURN_OFF_LED3()     __bsp_LED3_TURN_OFF__()\r
+#define BSP_TOGGLE_LED3()       __bsp_LED3_TOGGLE__()\r
+#define BSP_LED3_IS_ON()        __bsp_LED3_IS_ON__()\r
+\r
+/* LED4 */\r
+#define BSP_TURN_ON_LED4()      __bsp_LED4_TURN_ON__()\r
+#define BSP_TURN_OFF_LED4()     __bsp_LED4_TURN_OFF__()\r
+#define BSP_TOGGLE_LED4()       __bsp_LED4_TOGGLE__()\r
+#define BSP_LED4_IS_ON()        __bsp_LED4_IS_ON__()\r
+\r
+/* LED5 */\r
+#define BSP_TURN_ON_LED5()      __bsp_LED5_TURN_ON__()\r
+#define BSP_TURN_OFF_LED5()     __bsp_LED5_TURN_OFF__()\r
+#define BSP_TOGGLE_LED5()       __bsp_LED5_TOGGLE__()\r
+#define BSP_LED5_IS_ON()        __bsp_LED5_IS_ON__()\r
+\r
+/* LED6 */\r
+#define BSP_TURN_ON_LED6()      __bsp_LED6_TURN_ON__()\r
+#define BSP_TURN_OFF_LED6()     __bsp_LED6_TURN_OFF__()\r
+#define BSP_TOGGLE_LED6()       __bsp_LED6_TOGGLE__()\r
+#define BSP_LED6_IS_ON()        __bsp_LED6_IS_ON__()\r
+\r
+/* LED7 */\r
+#define BSP_TURN_ON_LED7()      __bsp_LED7_TURN_ON__()\r
+#define BSP_TURN_OFF_LED7()     __bsp_LED7_TURN_OFF__()\r
+#define BSP_TOGGLE_LED7()       __bsp_LED7_TOGGLE__()\r
+#define BSP_LED7_IS_ON()        __bsp_LED7_IS_ON__()\r
+\r
+/* LED8 */\r
+#define BSP_TURN_ON_LED8()      __bsp_LED8_TURN_ON__()\r
+#define BSP_TURN_OFF_LED8()     __bsp_LED8_TURN_OFF__()\r
+#define BSP_TOGGLE_LED8()       __bsp_LED8_TOGGLE__()\r
+#define BSP_LED8_IS_ON()        __bsp_LED8_IS_ON__()\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                        Prototypes\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+void BSP_InitLeds(void);\r
+\r
+\r
+\r
+/* ************************************************************************************************\r
+ *                                   Compile Time Integrity Checks\r
+ * ************************************************************************************************\r
+ */\r
+#ifdef BSP_NO_LEDS\r
+#error "ERROR: The LED driver is disabled.  This file should not be included."\r
+#endif\r
+\r
+/**************************************************************************************************\r
+ */\r
+#endif\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/Components/bsp/drivers/code/bsp_buttons.c b/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/Components/bsp/drivers/code/bsp_buttons.c
new file mode 100755 (executable)
index 0000000..b8f2018
--- /dev/null
@@ -0,0 +1,97 @@
+/**************************************************************************************************\r
+  Revised:        $Date: 2007-07-06 11:19:00 -0700 (Fri, 06 Jul 2007) $\r
+  Revision:       $Revision: 13579 $\r
+\r
+  Copyright 2007 Texas Instruments Incorporated.  All rights reserved.\r
+\r
+  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+  the terms of a software license agreement between the user who downloaded the software,\r
+  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+  License. The License limits your use, and you acknowledge, that the Software may not be\r
+  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+  perform, display or sell this Software and/or its documentation for any purpose.\r
+\r
+  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+\r
+  Should you have any questions regarding your right to use this Software,\r
+  contact Texas Instruments Incorporated at www.TI.com. \r
+**************************************************************************************************/\r
+\r
+/* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+ *   BSP (Board Support Package)\r
+ *   Generic button driver code file.\r
+ * =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+ */\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                            Includes\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#include "bsp_buttons.h"\r
+#include "bsp_button_defs.h"\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                             Macros\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#define BSP_CONFIG_BUTTON1()    __bsp_BUTTON1_CONFIG__()\r
+#define BSP_CONFIG_BUTTON2()    __bsp_BUTTON2_CONFIG__()\r
+#define BSP_CONFIG_BUTTON3()    __bsp_BUTTON3_CONFIG__()\r
+#define BSP_CONFIG_BUTTON4()    __bsp_BUTTON4_CONFIG__()\r
+#define BSP_CONFIG_BUTTON5()    __bsp_BUTTON5_CONFIG__()\r
+#define BSP_CONFIG_BUTTON6()    __bsp_BUTTON6_CONFIG__()\r
+#define BSP_CONFIG_BUTTON7()    __bsp_BUTTON7_CONFIG__()\r
+#define BSP_CONFIG_BUTTON8()    __bsp_BUTTON8_CONFIG__()\r
+\r
+#ifdef __bsp_BUTTON_EXTENDED_CONFIG__\r
+#define BSP_BUTTON_EXTENDED_CONFIG()  __bsp_BUTTON_EXTENDED_CONFIG__()\r
+#else\r
+#define BSP_BUTTON_EXTENDED_CONFIG()\r
+#endif\r
+\r
+\r
+/**************************************************************************************************\r
+ * @fn          BSP_InitButtons\r
+ *\r
+ * @brief       Initialize button hardware and driver code.\r
+ *\r
+ * @param       none\r
+ *\r
+ * @return      none\r
+ **************************************************************************************************\r
+ */\r
+void BSP_InitButtons(void)\r
+{\r
+  /* configure LEDs */\r
+  BSP_CONFIG_BUTTON1();\r
+  BSP_CONFIG_BUTTON2();\r
+  BSP_CONFIG_BUTTON3();\r
+  BSP_CONFIG_BUTTON4();\r
+  BSP_CONFIG_BUTTON5();\r
+  BSP_CONFIG_BUTTON6();\r
+  BSP_CONFIG_BUTTON7();\r
+  BSP_CONFIG_BUTTON8();\r
+\r
+  /* peform extended configuration if needed */\r
+  BSP_BUTTON_EXTENDED_CONFIG();\r
+}\r
+\r
+\r
+/**************************************************************************************************\r
+*/\r
+\r
+   \r
+   \r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/Components/bsp/drivers/code/bsp_generic_buttons.h b/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/Components/bsp/drivers/code/bsp_generic_buttons.h
new file mode 100755 (executable)
index 0000000..e9ae165
--- /dev/null
@@ -0,0 +1,203 @@
+/**************************************************************************************************\r
+  Revised:        $Date: 2007-07-06 11:19:00 -0700 (Fri, 06 Jul 2007) $\r
+  Revision:       $Revision: 13579 $\r
+\r
+  Copyright 2007 Texas Instruments Incorporated.  All rights reserved.\r
+\r
+  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+  the terms of a software license agreement between the user who downloaded the software,\r
+  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+  License. The License limits your use, and you acknowledge, that the Software may not be\r
+  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+  perform, display or sell this Software and/or its documentation for any purpose.\r
+\r
+  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+\r
+  Should you have any questions regarding your right to use this Software,\r
+  contact Texas Instruments Incorporated at www.TI.com. \r
+**************************************************************************************************/\r
+\r
+/* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+ *   BSP (Board Support Package)\r
+ *   Generic button macro include file.\r
+ * =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+ */\r
+\r
+#ifndef BSP_GENERIC_BUTTONS_H\r
+#define BSP_GENERIC_BUTTONS_H\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                           Includes\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#include "bsp_board_defs.h"\r
+#include "bsp_macros.h"\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                            Macros\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#define __bsp_BUTTON__(port,bit,low)    ((low) ? (!((port) & BV(bit))) : ((port) & BV(bit)) )\r
+\r
+\r
+/* ------------------------- populate BUTTON #1 macros ------------------------- */\r
+#define __bsp_NUM_BUTTON1_DEFINES__  ((defined __bsp_BUTTON1_PORT__)  + \\r
+                                      (defined __bsp_BUTTON1_BIT__)   + \\r
+                                      (defined __bsp_BUTTON1_IS_ACTIVE_LOW__))\r
+#if (__bsp_NUM_BUTTON1_DEFINES__ == 3)\r
+#define __bsp_BUTTON1__()           __bsp_BUTTON__( __bsp_BUTTON1_PORT__, __bsp_BUTTON1_BIT__, __bsp_BUTTON1_IS_ACTIVE_LOW__ )\r
+#define __bsp_BUTTON1_CONFIG__()    /* nothing required */\r
+#elif (__bsp_NUM_BUTTON1_DEFINES__ == 0)\r
+#define __bsp_BUTTON1__()           /* no button */   0\r
+#define __bsp_BUTTON1_CONFIG__()    /* no button */\r
+#else\r
+#error "ERROR: Incomplete number of macros for BUTTON1."\r
+#endif\r
+\r
+/* ------------------------- populate BUTTON #2 macros ------------------------- */\r
+#define __bsp_NUM_BUTTON2_DEFINES__  ((defined __bsp_BUTTON2_PORT__)  + \\r
+                                      (defined __bsp_BUTTON2_BIT__)   + \\r
+                                      (defined __bsp_BUTTON2_IS_ACTIVE_LOW__))\r
+#if (__bsp_NUM_BUTTON2_DEFINES__ == 3)\r
+#define __bsp_BUTTON2__()           __bsp_BUTTON__( __bsp_BUTTON2_PORT__, __bsp_BUTTON2_BIT__, __bsp_BUTTON2_IS_ACTIVE_LOW__ )\r
+#define __bsp_BUTTON2_CONFIG__()    /* nothing required */\r
+#elif (__bsp_NUM_BUTTON2_DEFINES__ == 0)\r
+#define __bsp_BUTTON2__()           /* no button */   0\r
+#define __bsp_BUTTON2_CONFIG__()    /* no button */\r
+#else\r
+#error "ERROR: Incomplete number of macros for BUTTON2."\r
+#endif\r
+\r
+/* ------------------------- populate BUTTON #3 macros ------------------------- */\r
+#define __bsp_NUM_BUTTON3_DEFINES__  ((defined __bsp_BUTTON3_PORT__)  + \\r
+                                      (defined __bsp_BUTTON3_BIT__)   + \\r
+                                      (defined __bsp_BUTTON3_IS_ACTIVE_LOW__))\r
+#if (__bsp_NUM_BUTTON3_DEFINES__ == 3)\r
+#define __bsp_BUTTON3__()           __bsp_BUTTON__( __bsp_BUTTON3_PORT__, __bsp_BUTTON3_BIT__, __bsp_BUTTON3_IS_ACTIVE_LOW__ )\r
+#define __bsp_BUTTON3_CONFIG__()    /* nothing required */\r
+#elif (__bsp_NUM_BUTTON3_DEFINES__ == 0)\r
+#define __bsp_BUTTON3__()           /* no button */   0\r
+#define __bsp_BUTTON3_CONFIG__()    /* no button */\r
+#else\r
+#error "ERROR: Incomplete number of macros for BUTTON3."\r
+#endif\r
+\r
+/* ------------------------- populate BUTTON #4 macros ------------------------- */\r
+#define __bsp_NUM_BUTTON4_DEFINES__  ((defined __bsp_BUTTON4_PORT__)  + \\r
+                                      (defined __bsp_BUTTON4_BIT__)   + \\r
+                                      (defined __bsp_BUTTON4_IS_ACTIVE_LOW__))\r
+#if (__bsp_NUM_BUTTON4_DEFINES__ == 3)\r
+#define __bsp_BUTTON4__()           __bsp_BUTTON__( __bsp_BUTTON4_PORT__, __bsp_BUTTON4_BIT__, __bsp_BUTTON4_IS_ACTIVE_LOW__ )\r
+#define __bsp_BUTTON4_CONFIG__()    /* nothing required */\r
+#elif (__bsp_NUM_BUTTON4_DEFINES__ == 0)\r
+#define __bsp_BUTTON4__()           /* no button */   0\r
+#define __bsp_BUTTON4_CONFIG__()    /* no button */\r
+#else\r
+#error "ERROR: Incomplete number of macros for BUTTON4."\r
+#endif\r
+\r
+/* ------------------------- populate BUTTON #5 macros ------------------------- */\r
+#define __bsp_NUM_BUTTON5_DEFINES__  ((defined __bsp_BUTTON5_PORT__)  + \\r
+                                      (defined __bsp_BUTTON5_BIT__)   + \\r
+                                      (defined __bsp_BUTTON5_IS_ACTIVE_LOW__))\r
+#if (__bsp_NUM_BUTTON5_DEFINES__ == 3)\r
+#define __bsp_BUTTON5__()           __bsp_BUTTON__( __bsp_BUTTON5_PORT__, __bsp_BUTTON5_BIT__, __bsp_BUTTON5_IS_ACTIVE_LOW__ )\r
+#define __bsp_BUTTON5_CONFIG__()    /* nothing required */\r
+#elif (__bsp_NUM_BUTTON5_DEFINES__ == 0)\r
+#define __bsp_BUTTON5__()           /* no button */   0\r
+#define __bsp_BUTTON5_CONFIG__()    /* no button */\r
+#else\r
+#error "ERROR: Incomplete number of macros for BUTTON5."\r
+#endif\r
+\r
+/* ------------------------- populate BUTTON #6 macros ------------------------- */\r
+#define __bsp_NUM_BUTTON6_DEFINES__  ((defined __bsp_BUTTON6_PORT__)  + \\r
+                                      (defined __bsp_BUTTON6_BIT__)   + \\r
+                                      (defined __bsp_BUTTON6_IS_ACTIVE_LOW__))\r
+#if (__bsp_NUM_BUTTON6_DEFINES__ == 3)\r
+#define __bsp_BUTTON6__()           __bsp_BUTTON__( __bsp_BUTTON6_PORT__, __bsp_BUTTON6_BIT__, __bsp_BUTTON6_IS_ACTIVE_LOW__ )\r
+#define __bsp_BUTTON6_CONFIG__()    /* nothing required */\r
+#elif (__bsp_NUM_BUTTON6_DEFINES__ == 0)\r
+#define __bsp_BUTTON6__()           /* no button */   0\r
+#define __bsp_BUTTON6_CONFIG__()    /* no button */\r
+#else\r
+#error "ERROR: Incomplete number of macros for BUTTON6."\r
+#endif\r
+\r
+/* ------------------------- populate BUTTON #7 macros ------------------------- */\r
+#define __bsp_NUM_BUTTON7_DEFINES__  ((defined __bsp_BUTTON7_PORT__)  + \\r
+                                      (defined __bsp_BUTTON7_BIT__)   + \\r
+                                      (defined __bsp_BUTTON7_IS_ACTIVE_LOW__))\r
+#if (__bsp_NUM_BUTTON7_DEFINES__ == 3)\r
+#define __bsp_BUTTON7__()           __bsp_BUTTON__( __bsp_BUTTON7_PORT__, __bsp_BUTTON7_BIT__, __bsp_BUTTON7_IS_ACTIVE_LOW__ )\r
+#define __bsp_BUTTON7_CONFIG__()    /* nothing required */\r
+#elif (__bsp_NUM_BUTTON7_DEFINES__ == 0)\r
+#define __bsp_BUTTON7__()           /* no button */   0\r
+#define __bsp_BUTTON7_CONFIG__()    /* no button */\r
+#else\r
+#error "ERROR: Incomplete number of macros for BUTTON7."\r
+#endif\r
+\r
+/* ------------------------- populate BUTTON #8 macros ------------------------- */\r
+#define __bsp_NUM_BUTTON8_DEFINES__  ((defined __bsp_BUTTON8_PORT__)  + \\r
+                                      (defined __bsp_BUTTON8_BIT__)   + \\r
+                                      (defined __bsp_BUTTON8_IS_ACTIVE_LOW__))\r
+#if (__bsp_NUM_BUTTON8_DEFINES__ == 3)\r
+#define __bsp_BUTTON8__()           __bsp_BUTTON__( __bsp_BUTTON8_PORT__, __bsp_BUTTON8_BIT__, __bsp_BUTTON8_IS_ACTIVE_LOW__ )\r
+#define __bsp_BUTTON8_CONFIG__()    /* nothing required */\r
+#elif (__bsp_NUM_BUTTON8_DEFINES__ == 0)\r
+#define __bsp_BUTTON8__()           /* no button */   0\r
+#define __bsp_BUTTON8_CONFIG__()    /* no button */\r
+#else\r
+#error "ERROR: Incomplete number of macros for BUTTON8."\r
+#endif\r
+\r
+\r
+/* ************************************************************************************************\r
+ *                                   Compile Time Integrity Checks\r
+ * ************************************************************************************************\r
+ */\r
+\r
+/* -------------------- number of buttons defined -------------------- */\r
+#ifndef __bsp_NUM_BUTTONS__\r
+#error "ERROR: Number of buttons is not specified."\r
+#else\r
+#if ((__bsp_NUM_BUTTONS__ > 8) || (__bsp_NUM_BUTTONS__ < 0))\r
+#error "ERROR: Unsupported number of buttons specified.  Maximum is eight."\r
+#endif\r
+#endif\r
+\r
+#if (((__bsp_NUM_BUTTON1_DEFINES__ != 0) + \\r
+      (__bsp_NUM_BUTTON2_DEFINES__ != 0) + \\r
+      (__bsp_NUM_BUTTON3_DEFINES__ != 0) + \\r
+      (__bsp_NUM_BUTTON4_DEFINES__ != 0) + \\r
+      (__bsp_NUM_BUTTON5_DEFINES__ != 0) + \\r
+      (__bsp_NUM_BUTTON6_DEFINES__ != 0) + \\r
+      (__bsp_NUM_BUTTON7_DEFINES__ != 0) + \\r
+      (__bsp_NUM_BUTTON8_DEFINES__ != 0)) != __bsp_NUM_BUTTONS__)\r
+#error "ERROR: Inconsistency between defined macros and specified number of buttons."\r
+#endif\r
+\r
+/* -------------------- debounce macro -------------------- */\r
+#ifndef __bsp_BUTTON_DEBOUNCE_WAIT__\r
+#error "ERROR: Debounce delay macro is missing."\r
+#endif\r
+\r
+\r
+/**************************************************************************************************\r
+ */\r
+#endif\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/Components/bsp/drivers/code/bsp_generic_leds.h b/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/Components/bsp/drivers/code/bsp_generic_leds.h
new file mode 100755 (executable)
index 0000000..6e1e42b
--- /dev/null
@@ -0,0 +1,278 @@
+/**************************************************************************************************\r
+  Revised:        $Date: 2007-07-06 11:19:00 -0700 (Fri, 06 Jul 2007) $\r
+  Revision:       $Revision: 13579 $\r
+\r
+  Copyright 2007 Texas Instruments Incorporated.  All rights reserved.\r
+\r
+  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+  the terms of a software license agreement between the user who downloaded the software,\r
+  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+  License. The License limits your use, and you acknowledge, that the Software may not be\r
+  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+  perform, display or sell this Software and/or its documentation for any purpose.\r
+\r
+  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+\r
+  Should you have any questions regarding your right to use this Software,\r
+  contact Texas Instruments Incorporated at www.TI.com. \r
+**************************************************************************************************/\r
+\r
+/* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+ *   BSP (Board Support Package)\r
+ *   Generic LED macro include file.\r
+ * =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+ */\r
+\r
+#ifndef BSP_GENERIC_LEDS_H\r
+#define BSP_GENERIC_LEDS_H\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                          Includes\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#include "bsp_macros.h"\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                           Macros\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+\r
+/*\r
+ *  Note : The conditionals in the following macros evaulate compile time constants.\r
+ *         Any compiler worth its salt will optimize these conditionals out for the\r
+ *         smallest possible code.\r
+ */\r
+\r
+#define __bsp_LED_TURN_ON__(bit,port,ddr,low)  \\r
+  st( if (low) { port &= ~BV(bit); } else { port |= BV(bit); } )\r
+\r
+#define __bsp_LED_TURN_OFF__(bit,port,ddr,low)  \\r
+  st( if (low) { port |= BV(bit); } else { port &= ~BV(bit); } )\r
+\r
+#define __bsp_LED_IS_ON__(bit,port,ddr,low)  \\r
+  ( (low) ? (!((port) & BV(bit))) : ((port) & BV(bit)) )\r
+\r
+#define __bsp_LED_TOGGLE__(bit,port,ddr,low)     st( port ^= BV(bit); )\r
+#define __bsp_LED_CONFIG__(bit,port,ddr,low)     st( ddr |= BV(bit); )\r
+\r
+\r
+\r
+/* ------------------------- populate LED1 macros ------------------------- */\r
+#define __bsp_NUM_LED1_DEFINES__  ((defined __bsp_LED1_BIT__)  + \\r
+                                   (defined __bsp_LED1_PORT__) + \\r
+                                   (defined __bsp_LED1_DDR__)  + \\r
+                                   (defined __bsp_LED1_IS_ACTIVE_LOW__))\r
+#if (__bsp_NUM_LED1_DEFINES__ == 4)\r
+#define __bsp_LED1_TURN_ON__()    __bsp_LED_TURN_ON__ ( __bsp_LED1_BIT__, __bsp_LED1_PORT__, __bsp_LED1_DDR__, __bsp_LED1_IS_ACTIVE_LOW__ )\r
+#define __bsp_LED1_TURN_OFF__()   __bsp_LED_TURN_OFF__( __bsp_LED1_BIT__, __bsp_LED1_PORT__, __bsp_LED1_DDR__, __bsp_LED1_IS_ACTIVE_LOW__ )\r
+#define __bsp_LED1_TOGGLE__()     __bsp_LED_TOGGLE__  ( __bsp_LED1_BIT__, __bsp_LED1_PORT__, __bsp_LED1_DDR__, __bsp_LED1_IS_ACTIVE_LOW__ )\r
+#define __bsp_LED1_IS_ON__()      __bsp_LED_IS_ON__   ( __bsp_LED1_BIT__, __bsp_LED1_PORT__, __bsp_LED1_DDR__, __bsp_LED1_IS_ACTIVE_LOW__ )\r
+#define __bsp_LED1_CONFIG__()     __bsp_LED_CONFIG__  ( __bsp_LED1_BIT__, __bsp_LED1_PORT__, __bsp_LED1_DDR__, __bsp_LED1_IS_ACTIVE_LOW__ )\r
+#elif (__bsp_NUM_LED1_DEFINES__ == 0)\r
+#define __bsp_LED1_TURN_ON__()    /* no LED */\r
+#define __bsp_LED1_TURN_OFF__()   /* no LED */\r
+#define __bsp_LED1_TOGGLE__()     /* no LED */\r
+#define __bsp_LED1_IS_ON__()      /* no LED */  0\r
+#define __bsp_LED1_CONFIG__()     /* no LED */\r
+#else\r
+#error "ERROR: Incomplete number of macros for LED1."\r
+#endif\r
+\r
+\r
+/* ------------------------- populate LED2 macros ------------------------- */\r
+#define __bsp_NUM_LED2_DEFINES__  ((defined __bsp_LED2_BIT__)  + \\r
+                                   (defined __bsp_LED2_PORT__) + \\r
+                                   (defined __bsp_LED2_DDR__)  + \\r
+                                   (defined __bsp_LED2_IS_ACTIVE_LOW__))\r
+#if (__bsp_NUM_LED2_DEFINES__ == 4)\r
+#define __bsp_LED2_TURN_ON__()    __bsp_LED_TURN_ON__ ( __bsp_LED2_BIT__, __bsp_LED2_PORT__, __bsp_LED2_DDR__, __bsp_LED2_IS_ACTIVE_LOW__ )\r
+#define __bsp_LED2_TURN_OFF__()   __bsp_LED_TURN_OFF__( __bsp_LED2_BIT__, __bsp_LED2_PORT__, __bsp_LED2_DDR__, __bsp_LED2_IS_ACTIVE_LOW__ )\r
+#define __bsp_LED2_TOGGLE__()     __bsp_LED_TOGGLE__  ( __bsp_LED2_BIT__, __bsp_LED2_PORT__, __bsp_LED2_DDR__, __bsp_LED2_IS_ACTIVE_LOW__ )\r
+#define __bsp_LED2_IS_ON__()      __bsp_LED_IS_ON__   ( __bsp_LED2_BIT__, __bsp_LED2_PORT__, __bsp_LED2_DDR__, __bsp_LED2_IS_ACTIVE_LOW__ )\r
+#define __bsp_LED2_CONFIG__()     __bsp_LED_CONFIG__  ( __bsp_LED2_BIT__, __bsp_LED2_PORT__, __bsp_LED2_DDR__, __bsp_LED2_IS_ACTIVE_LOW__ )\r
+#elif (__bsp_NUM_LED2_DEFINES__ == 0)\r
+#define __bsp_LED2_TURN_ON__()    /* no LED */\r
+#define __bsp_LED2_TURN_OFF__()   /* no LED */\r
+#define __bsp_LED2_TOGGLE__()     /* no LED */\r
+#define __bsp_LED2_IS_ON__()      /* no LED */  0\r
+#define __bsp_LED2_CONFIG__()     /* no LED */\r
+#else\r
+#error "ERROR: Incomplete number of macros for LED2."\r
+#endif\r
+\r
+\r
+/* ------------------------- populate LED3 macros ------------------------- */\r
+#define __bsp_NUM_LED3_DEFINES__  ((defined __bsp_LED3_BIT__)  + \\r
+                                   (defined __bsp_LED3_PORT__) + \\r
+                                   (defined __bsp_LED3_DDR__)  + \\r
+                                   (defined __bsp_LED3_IS_ACTIVE_LOW__))\r
+#if (__bsp_NUM_LED3_DEFINES__ == 4)\r
+#define __bsp_LED3_TURN_ON__()    __bsp_LED_TURN_ON__ ( __bsp_LED3_BIT__, __bsp_LED3_PORT__, __bsp_LED3_DDR__, __bsp_LED3_IS_ACTIVE_LOW__ )\r
+#define __bsp_LED3_TURN_OFF__()   __bsp_LED_TURN_OFF__( __bsp_LED3_BIT__, __bsp_LED3_PORT__, __bsp_LED3_DDR__, __bsp_LED3_IS_ACTIVE_LOW__ )\r
+#define __bsp_LED3_TOGGLE__()     __bsp_LED_TOGGLE__  ( __bsp_LED3_BIT__, __bsp_LED3_PORT__, __bsp_LED3_DDR__, __bsp_LED3_IS_ACTIVE_LOW__ )\r
+#define __bsp_LED3_IS_ON__()      __bsp_LED_IS_ON__   ( __bsp_LED3_BIT__, __bsp_LED3_PORT__, __bsp_LED3_DDR__, __bsp_LED3_IS_ACTIVE_LOW__ )\r
+#define __bsp_LED3_CONFIG__()     __bsp_LED_CONFIG__  ( __bsp_LED3_BIT__, __bsp_LED3_PORT__, __bsp_LED3_DDR__, __bsp_LED3_IS_ACTIVE_LOW__ )\r
+#elif (__bsp_NUM_LED3_DEFINES__ == 0)\r
+#define __bsp_LED3_TURN_ON__()    /* no LED */\r
+#define __bsp_LED3_TURN_OFF__()   /* no LED */\r
+#define __bsp_LED3_TOGGLE__()     /* no LED */\r
+#define __bsp_LED3_IS_ON__()      /* no LED */  0\r
+#define __bsp_LED3_CONFIG__()     /* no LED */\r
+#else\r
+#error "ERROR: Incomplete number of macros for LED3."\r
+#endif\r
+\r
+\r
+/* ------------------------- populate LED4 macros ------------------------- */\r
+#define __bsp_NUM_LED4_DEFINES__  ((defined __bsp_LED4_BIT__)  + \\r
+                                   (defined __bsp_LED4_PORT__) + \\r
+                                   (defined __bsp_LED4_DDR__)  + \\r
+                                   (defined __bsp_LED4_IS_ACTIVE_LOW__))\r
+#if (__bsp_NUM_LED4_DEFINES__ == 4)\r
+#define __bsp_LED4_TURN_ON__()    __bsp_LED_TURN_ON__ ( __bsp_LED4_BIT__, __bsp_LED4_PORT__, __bsp_LED4_DDR__, __bsp_LED4_IS_ACTIVE_LOW__ )\r
+#define __bsp_LED4_TURN_OFF__()   __bsp_LED_TURN_OFF__( __bsp_LED4_BIT__, __bsp_LED4_PORT__, __bsp_LED4_DDR__, __bsp_LED4_IS_ACTIVE_LOW__ )\r
+#define __bsp_LED4_TOGGLE__()     __bsp_LED_TOGGLE__  ( __bsp_LED4_BIT__, __bsp_LED4_PORT__, __bsp_LED4_DDR__, __bsp_LED4_IS_ACTIVE_LOW__ )\r
+#define __bsp_LED4_IS_ON__()      __bsp_LED_IS_ON__   ( __bsp_LED4_BIT__, __bsp_LED4_PORT__, __bsp_LED4_DDR__, __bsp_LED4_IS_ACTIVE_LOW__ )\r
+#define __bsp_LED4_CONFIG__()     __bsp_LED_CONFIG__  ( __bsp_LED4_BIT__, __bsp_LED4_PORT__, __bsp_LED4_DDR__, __bsp_LED4_IS_ACTIVE_LOW__ )\r
+#elif (__bsp_NUM_LED4_DEFINES__ == 0)\r
+#define __bsp_LED4_TURN_ON__()    /* no LED */\r
+#define __bsp_LED4_TURN_OFF__()   /* no LED */\r
+#define __bsp_LED4_TOGGLE__()     /* no LED */\r
+#define __bsp_LED4_IS_ON__()      /* no LED */  0\r
+#define __bsp_LED4_CONFIG__()     /* no LED */\r
+#else\r
+#error "ERROR: Incomplete number of macros for LED4."\r
+#endif\r
+\r
+/* ------------------------- populate LED5 macros ------------------------- */\r
+#define __bsp_NUM_LED5_DEFINES__  ((defined __bsp_LED5_BIT__)  + \\r
+                                   (defined __bsp_LED5_PORT__) + \\r
+                                   (defined __bsp_LED5_DDR__)  + \\r
+                                   (defined __bsp_LED5_IS_ACTIVE_LOW__))\r
+#if (__bsp_NUM_LED5_DEFINES__ == 4)\r
+#define __bsp_LED5_TURN_ON__()    __bsp_LED_TURN_ON__ ( __bsp_LED5_BIT__, __bsp_LED5_PORT__, __bsp_LED5_DDR__, __bsp_LED5_IS_ACTIVE_LOW__ )\r
+#define __bsp_LED5_TURN_OFF__()   __bsp_LED_TURN_OFF__( __bsp_LED5_BIT__, __bsp_LED5_PORT__, __bsp_LED5_DDR__, __bsp_LED5_IS_ACTIVE_LOW__ )\r
+#define __bsp_LED5_TOGGLE__()     __bsp_LED_TOGGLE__  ( __bsp_LED5_BIT__, __bsp_LED5_PORT__, __bsp_LED5_DDR__, __bsp_LED5_IS_ACTIVE_LOW__ )\r
+#define __bsp_LED5_IS_ON__()      __bsp_LED_IS_ON__   ( __bsp_LED5_BIT__, __bsp_LED5_PORT__, __bsp_LED5_DDR__, __bsp_LED5_IS_ACTIVE_LOW__ )\r
+#define __bsp_LED5_CONFIG__()     __bsp_LED_CONFIG__  ( __bsp_LED5_BIT__, __bsp_LED5_PORT__, __bsp_LED5_DDR__, __bsp_LED5_IS_ACTIVE_LOW__ )\r
+#elif (__bsp_NUM_LED5_DEFINES__ == 0)\r
+#define __bsp_LED5_TURN_ON__()    /* no LED */\r
+#define __bsp_LED5_TURN_OFF__()   /* no LED */\r
+#define __bsp_LED5_TOGGLE__()     /* no LED */\r
+#define __bsp_LED5_IS_ON__()      /* no LED */  0\r
+#define __bsp_LED5_CONFIG__()     /* no LED */\r
+#else\r
+#error "ERROR: Incomplete number of macros for LED5."\r
+#endif\r
+\r
+/* ------------------------- populate LED6 macros ------------------------- */\r
+#define __bsp_NUM_LED6_DEFINES__  ((defined __bsp_LED6_BIT__)  + \\r
+                                   (defined __bsp_LED6_PORT__) + \\r
+                                   (defined __bsp_LED6_DDR__)  + \\r
+                                   (defined __bsp_LED6_IS_ACTIVE_LOW__))\r
+#if (__bsp_NUM_LED6_DEFINES__ == 4)\r
+#define __bsp_LED6_TURN_ON__()    __bsp_LED_TURN_ON__ ( __bsp_LED6_BIT__, __bsp_LED6_PORT__, __bsp_LED6_DDR__, __bsp_LED6_IS_ACTIVE_LOW__ )\r
+#define __bsp_LED6_TURN_OFF__()   __bsp_LED_TURN_OFF__( __bsp_LED6_BIT__, __bsp_LED6_PORT__, __bsp_LED6_DDR__, __bsp_LED6_IS_ACTIVE_LOW__ )\r
+#define __bsp_LED6_TOGGLE__()     __bsp_LED_TOGGLE__  ( __bsp_LED6_BIT__, __bsp_LED6_PORT__, __bsp_LED6_DDR__, __bsp_LED6_IS_ACTIVE_LOW__ )\r
+#define __bsp_LED6_IS_ON__()      __bsp_LED_IS_ON__   ( __bsp_LED6_BIT__, __bsp_LED6_PORT__, __bsp_LED6_DDR__, __bsp_LED6_IS_ACTIVE_LOW__ )\r
+#define __bsp_LED6_CONFIG__()     __bsp_LED_CONFIG__  ( __bsp_LED6_BIT__, __bsp_LED6_PORT__, __bsp_LED6_DDR__, __bsp_LED6_IS_ACTIVE_LOW__ )\r
+#elif (__bsp_NUM_LED6_DEFINES__ == 0)\r
+#define __bsp_LED6_TURN_ON__()    /* no LED */\r
+#define __bsp_LED6_TURN_OFF__()   /* no LED */\r
+#define __bsp_LED6_TOGGLE__()     /* no LED */\r
+#define __bsp_LED6_IS_ON__()      /* no LED */  0\r
+#define __bsp_LED6_CONFIG__()     /* no LED */\r
+#else\r
+#error "ERROR: Incomplete number of macros for LED6."\r
+#endif\r
+\r
+/* ------------------------- populate LED7 macros ------------------------- */\r
+#define __bsp_NUM_LED7_DEFINES__  ((defined __bsp_LED7_BIT__)  + \\r
+                                   (defined __bsp_LED7_PORT__) + \\r
+                                   (defined __bsp_LED7_DDR__)  + \\r
+                                   (defined __bsp_LED7_IS_ACTIVE_LOW__))\r
+#if (__bsp_NUM_LED7_DEFINES__ == 4)\r
+#define __bsp_LED7_TURN_ON__()    __bsp_LED_TURN_ON__ ( __bsp_LED7_BIT__, __bsp_LED7_PORT__, __bsp_LED7_DDR__, __bsp_LED7_IS_ACTIVE_LOW__ )\r
+#define __bsp_LED7_TURN_OFF__()   __bsp_LED_TURN_OFF__( __bsp_LED7_BIT__, __bsp_LED7_PORT__, __bsp_LED7_DDR__, __bsp_LED7_IS_ACTIVE_LOW__ )\r
+#define __bsp_LED7_TOGGLE__()     __bsp_LED_TOGGLE__  ( __bsp_LED7_BIT__, __bsp_LED7_PORT__, __bsp_LED7_DDR__, __bsp_LED7_IS_ACTIVE_LOW__ )\r
+#define __bsp_LED7_IS_ON__()      __bsp_LED_IS_ON__   ( __bsp_LED7_BIT__, __bsp_LED7_PORT__, __bsp_LED7_DDR__, __bsp_LED7_IS_ACTIVE_LOW__ )\r
+#define __bsp_LED7_CONFIG__()     __bsp_LED_CONFIG__  ( __bsp_LED7_BIT__, __bsp_LED7_PORT__, __bsp_LED7_DDR__, __bsp_LED7_IS_ACTIVE_LOW__ )\r
+#elif (__bsp_NUM_LED7_DEFINES__ == 0)\r
+#define __bsp_LED7_TURN_ON__()    /* no LED */\r
+#define __bsp_LED7_TURN_OFF__()   /* no LED */\r
+#define __bsp_LED7_TOGGLE__()     /* no LED */\r
+#define __bsp_LED7_IS_ON__()      /* no LED */  0\r
+#define __bsp_LED7_CONFIG__()     /* no LED */\r
+#else\r
+#error "ERROR: Incomplete number of macros for LED7."\r
+#endif\r
+\r
+/* ------------------------- populate LED8 macros ------------------------- */\r
+#define __bsp_NUM_LED8_DEFINES__  ((defined __bsp_LED8_BIT__)  + \\r
+                                   (defined __bsp_LED8_PORT__) + \\r
+                                   (defined __bsp_LED8_DDR__)  + \\r
+                                   (defined __bsp_LED8_IS_ACTIVE_LOW__))\r
+#if (__bsp_NUM_LED8_DEFINES__ == 4)\r
+#define __bsp_LED8_TURN_ON__()    __bsp_LED_TURN_ON__ ( __bsp_LED8_BIT__, __bsp_LED8_PORT__, __bsp_LED8_DDR__, __bsp_LED8_IS_ACTIVE_LOW__ )\r
+#define __bsp_LED8_TURN_OFF__()   __bsp_LED_TURN_OFF__( __bsp_LED8_BIT__, __bsp_LED8_PORT__, __bsp_LED8_DDR__, __bsp_LED8_IS_ACTIVE_LOW__ )\r
+#define __bsp_LED8_TOGGLE__()     __bsp_LED_TOGGLE__  ( __bsp_LED8_BIT__, __bsp_LED8_PORT__, __bsp_LED8_DDR__, __bsp_LED8_IS_ACTIVE_LOW__ )\r
+#define __bsp_LED8_IS_ON__()      __bsp_LED_IS_ON__   ( __bsp_LED8_BIT__, __bsp_LED8_PORT__, __bsp_LED8_DDR__, __bsp_LED8_IS_ACTIVE_LOW__ )\r
+#define __bsp_LED8_CONFIG__()     __bsp_LED_CONFIG__  ( __bsp_LED8_BIT__, __bsp_LED8_PORT__, __bsp_LED8_DDR__, __bsp_LED8_IS_ACTIVE_LOW__ )\r
+#elif (__bsp_NUM_LED8_DEFINES__ == 0)\r
+#define __bsp_LED8_TURN_ON__()    /* no LED */\r
+#define __bsp_LED8_TURN_OFF__()   /* no LED */\r
+#define __bsp_LED8_TOGGLE__()     /* no LED */\r
+#define __bsp_LED8_IS_ON__()      /* no LED */  0\r
+#define __bsp_LED8_CONFIG__()     /* no LED */\r
+#else\r
+#error "ERROR: Incomplete number of macros for LED8."\r
+#endif\r
+\r
+\r
+/* ************************************************************************************************\r
+ *                                   Compile Time Integrity Checks\r
+ * ************************************************************************************************\r
+ */\r
+\r
+/* -------------------- number of LEDs defined -------------------- */\r
+#ifndef __bsp_NUM_LEDS__\r
+#error "ERROR: Number of LEDs is not specified."\r
+#else\r
+#if ((__bsp_NUM_LEDS__ > 8) || (__bsp_NUM_LEDS__ < 0))\r
+#error "ERROR: Unsupported number of LEDs specified.  Maximum is eight."\r
+#endif\r
+#endif\r
+\r
+#if (((__bsp_NUM_LED1_DEFINES__ != 0) + \\r
+      (__bsp_NUM_LED2_DEFINES__ != 0) + \\r
+      (__bsp_NUM_LED3_DEFINES__ != 0) + \\r
+      (__bsp_NUM_LED4_DEFINES__ != 0) + \\r
+      (__bsp_NUM_LED5_DEFINES__ != 0) + \\r
+      (__bsp_NUM_LED6_DEFINES__ != 0) + \\r
+      (__bsp_NUM_LED7_DEFINES__ != 0) + \\r
+      (__bsp_NUM_LED8_DEFINES__ != 0)) != __bsp_NUM_LEDS__)\r
+#error "ERROR: Inconsistency between defined macros and specified number of LEDs."\r
+#endif\r
+\r
+/* -------------------- blink delay loop count -------------------- */\r
+#ifndef __bsp_LED_BLINK_LOOP_COUNT__\r
+#error "ERROR: Blink delay count is missing."\r
+#endif\r
+\r
+/**************************************************************************************************\r
+ */\r
+#endif\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/Components/bsp/drivers/code/bsp_leds.c b/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/Components/bsp/drivers/code/bsp_leds.c
new file mode 100755 (executable)
index 0000000..4bc83e0
--- /dev/null
@@ -0,0 +1,107 @@
+/**************************************************************************************************\r
+  Revised:        $Date: 2007-07-06 11:19:00 -0700 (Fri, 06 Jul 2007) $\r
+  Revision:       $Revision: 13579 $\r
+\r
+  Copyright 2007 Texas Instruments Incorporated.  All rights reserved.\r
+\r
+  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+  the terms of a software license agreement between the user who downloaded the software,\r
+  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+  License. The License limits your use, and you acknowledge, that the Software may not be\r
+  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+  perform, display or sell this Software and/or its documentation for any purpose.\r
+\r
+  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+\r
+  Should you have any questions regarding your right to use this Software,\r
+  contact Texas Instruments Incorporated at www.TI.com. \r
+**************************************************************************************************/\r
+\r
+/* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+ *   BSP (Board Support Package)\r
+ *   Generic LED driver code file.\r
+ * =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+ */\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                            Includes\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#include "bsp_leds.h"\r
+#include "bsp_led_defs.h"\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                             Macros\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#define BSP_CONFIG_LED1()    __bsp_LED1_CONFIG__()\r
+#define BSP_CONFIG_LED2()    __bsp_LED2_CONFIG__()\r
+#define BSP_CONFIG_LED3()    __bsp_LED3_CONFIG__()\r
+#define BSP_CONFIG_LED4()    __bsp_LED4_CONFIG__()\r
+#define BSP_CONFIG_LED5()    __bsp_LED5_CONFIG__()\r
+#define BSP_CONFIG_LED6()    __bsp_LED6_CONFIG__()\r
+#define BSP_CONFIG_LED7()    __bsp_LED7_CONFIG__()\r
+#define BSP_CONFIG_LED8()    __bsp_LED8_CONFIG__()\r
+\r
+#ifdef __bsp_LED_EXTENDED_CONFIG__\r
+#define BSP_LED_EXTENDED_CONFIG()  __bsp_LED_EXTENDED_CONFIG__()\r
+#else\r
+#define BSP_LED_EXTENDED_CONFIG()\r
+#endif\r
+\r
+\r
+/**************************************************************************************************\r
+ * @fn          BSP_InitLeds\r
+ *\r
+ * @brief       Initialize LED hardware and driver.\r
+ *\r
+ * @param       none\r
+ *\r
+ * @return      none\r
+ **************************************************************************************************\r
+ */\r
+void BSP_InitLeds(void)\r
+{\r
+  /* configure LEDs */\r
+  BSP_CONFIG_LED1();\r
+  BSP_CONFIG_LED2();\r
+  BSP_CONFIG_LED3();\r
+  BSP_CONFIG_LED4();\r
+  BSP_CONFIG_LED5();\r
+  BSP_CONFIG_LED6();\r
+  BSP_CONFIG_LED7();\r
+  BSP_CONFIG_LED8();\r
+\r
+  /* peform extended configuration if needed */\r
+  BSP_LED_EXTENDED_CONFIG();\r
+\r
+  /* turn all LEDs off as power-up default */\r
+  BSP_TURN_OFF_LED1();\r
+  BSP_TURN_OFF_LED2();\r
+  BSP_TURN_OFF_LED3();\r
+  BSP_TURN_OFF_LED4();\r
+  BSP_TURN_OFF_LED5();\r
+  BSP_TURN_OFF_LED6();\r
+  BSP_TURN_OFF_LED7();\r
+  BSP_TURN_OFF_LED8();\r
+}\r
+\r
+\r
+/**************************************************************************************************\r
+*/\r
+\r
+   \r
+   \r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/Components/bsp/mcus/bsp_msp430_defs.h b/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/Components/bsp/mcus/bsp_msp430_defs.h
new file mode 100755 (executable)
index 0000000..af9357f
--- /dev/null
@@ -0,0 +1,141 @@
+/**************************************************************************************************\r
+  Filename:       bsp_msp430_defs.h\r
+  Revised:        $Date: 2009-10-11 18:52:46 -0700 (Sun, 11 Oct 2009) $\r
+  Revision:       $Revision: 20897 $\r
+\r
+  Copyright 2007-2009 Texas Instruments Incorporated.  All rights reserved.\r
+\r
+  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+  the terms of a software license agreement between the user who downloaded the software,\r
+  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+  License. The License limits your use, and you acknowledge, that the Software may not be\r
+  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+  perform, display or sell this Software and/or its documentation for any purpose.\r
+\r
+  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+\r
+  Should you have any questions regarding your right to use this Software,\r
+  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+/* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+ *   BSP (Board Support Package)\r
+ *   MCU : Texas Instruments MSP430 family\r
+ *   Microcontroller definition file.\r
+ * =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+ */\r
+\r
+#ifndef BSP_MSP430_DEFS_H\r
+#define BSP_MSP430_DEFS_H\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                          Defines\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#define BSP_MCU_MSP430\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                     Compiler Abstraction\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+\r
+/* ---------------------- IAR Compiler ---------------------- */\r
+#ifdef __IAR_SYSTEMS_ICC__\r
+#define BSP_COMPILER_IAR\r
+\r
+#if (__VER__ < 342)\r
+  #error "ERROR: This IAR compiler port requires at least revision v3.42A."\r
+/*\r
+ *  Compiler versions previous to v3.42A do not have the universal msp430.h include file.\r
+ *  To use an earlier version of the compiler, replace the above #error statement with\r
+ *  the appropriate, device specific #include statement.\r
+ */\r
+#endif\r
+\r
+/* Workaround for release v3.42A - the msp430.h file did not include support for some devices */\r
+#if ((__VER__ == 342) && (__SUBVERSION__ == 'A')) && \\r
+     (defined (__MSP430F1610__) || defined (__MSP430F1611__) || defined (__MSP430F1612__))\r
+#include <msp430x16x.h>\r
+#else\r
+#include <msp430.h>\r
+#endif\r
+\r
+#define __bsp_ISTATE_T__            istate_t\r
+#define __bsp_ISR_FUNCTION__(f,v)   __bsp_QUOTED_PRAGMA__(vector=v) __interrupt void f(void); \\r
+                                    __bsp_QUOTED_PRAGMA__(vector=v) __interrupt void f(void)\r
+\r
+/* Initialization call provided in IAR environment before standard C-startup */\r
+#include <intrinsics.h>\r
+#define BSP_EARLY_INIT(void) __intrinsic int __low_level_init(void)\r
+\r
+/* ---------------------- Code Composer ---------------------- */\r
+#elif (defined __TI_COMPILER_VERSION__) && (defined __MSP430__)\r
+#define BSP_COMPILER_CODE_COMPOSER\r
+\r
+/* At time of 1.1.0 release, CC430 support not in msp430.h */\r
+#if (__CC430F6137__)\r
+#include <cc430x613x.h>\r
+#else\r
+#include <msp430.h>\r
+#endif\r
+\r
+#define __bsp_ISTATE_T__            unsigned short\r
+#define __bsp_ISR_FUNCTION__(f,v)   __bsp_QUOTED_PRAGMA__(vector=v) __interrupt void f(void)\r
+\r
+/* Initialization call provided in CCE environment before standard C-startup */\r
+// [BM] Cannot have a second low level init! Already done by application!\r
+//#define BSP_EARLY_INIT(void)  int _system_pre_init(void)\r
+       \r
+/* ------------------ Unrecognized Compiler ------------------ */\r
+#else\r
+#error "ERROR: Unknown compiler."\r
+#endif\r
+\r
+#if (defined BSP_COMPILER_IAR) || (defined BSP_COMPILER_CODE_COMPOSER)\r
+#include <intrinsics.h>\r
+#define __bsp_ENABLE_INTERRUPTS__()       __enable_interrupt()\r
+#define __bsp_DISABLE_INTERRUPTS__()      __disable_interrupt()\r
+#define __bsp_INTERRUPTS_ARE_ENABLED__()  (__get_SR_register() & GIE)\r
+\r
+#define __bsp_GET_ISTATE__()              __get_interrupt_state()\r
+#define __bsp_RESTORE_ISTATE__(x)         __set_interrupt_state(x)\r
+\r
+#define __bsp_QUOTED_PRAGMA__(x)          _Pragma(#x)\r
+\r
+#endif\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                          Common\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#define __bsp_LITTLE_ENDIAN__   1\r
+#define __bsp_CODE_MEMSPACE__   /* blank */\r
+#define __bsp_XDATA_MEMSPACE__  /* blank */\r
+\r
+typedef   signed char     int8_t;\r
+typedef   signed short    int16_t;\r
+typedef   signed long     int32_t;\r
+\r
+typedef   unsigned char   uint8_t;\r
+typedef   unsigned short  uint16_t;\r
+typedef   unsigned long   uint32_t;\r
+\r
+#ifndef NULL\r
+#define NULL 0\r
+#endif\r
+\r
+/**************************************************************************************************\r
+ */\r
+#endif\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/Components/mrfi/mrfi.c b/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/Components/mrfi/mrfi.c
new file mode 100755 (executable)
index 0000000..5b7337b
--- /dev/null
@@ -0,0 +1,87 @@
+/**************************************************************************************************\r
+  Revised:        $Date: 2007-07-06 11:19:00 -0700 (Fri, 06 Jul 2007) $\r
+  Revision:       $Revision: 13579 $\r
+\r
+  Copyright 2007 Texas Instruments Incorporated.  All rights reserved.\r
+\r
+  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+  the terms of a software license agreement between the user who downloaded the software,\r
+  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+  License. The License limits your use, and you acknowledge, that the Software may not be\r
+  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+  perform, display or sell this Software and/or its documentation for any purpose.\r
+\r
+  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+\r
+  Should you have any questions regarding your right to use this Software,\r
+  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+/* ~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=\r
+ *   MRFI (Minimal RF Interface)\r
+ *   Top-level code file.\r
+ * ~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=\r
+ */\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                          Includes\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#include "mrfi_defs.h"\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                       C Code Includes\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+\r
+/* ----- Radio Family 1 ----- */\r
+#if (defined MRFI_RADIO_FAMILY1)\r
+#include "radios/family1/mrfi_radio.c"\r
+#include "radios/family1/mrfi_spi.c"\r
+#include "radios/common/mrfi_f1f2.c"\r
+#include "bsp_external/mrfi_board.c"\r
+\r
+/* ----- Radio Family 2 ----- */\r
+#elif (defined MRFI_RADIO_FAMILY2)\r
+#include "radios/family2/mrfi_radio.c"\r
+#include "radios/common/mrfi_f1f2.c"\r
+\r
+/* ----- Radio Family 3 ----- */\r
+#elif (defined MRFI_RADIO_FAMILY3)\r
+#include "bsp_external/mrfi_board.c"\r
+#include "radios/family3/mrfi_spi.c"\r
+#include "radios/family3/mrfi_radio.c"\r
+\r
+/* ----- Radio Family 4 ----- */\r
+#elif (defined MRFI_RADIO_FAMILY4)\r
+#include "radios/family4/mrfi_radio.c"\r
+\r
+/* ----- Radio Family 5 ----- */\r
+#elif (defined MRFI_RADIO_FAMILY5)\r
+#include "radios/family5/mrfi_radio.c"\r
+#include "radios/family5/mrfi_radio_interface.c"\r
+\r
+/* ----- Radio Family 6 ----- */\r
+#elif (defined MRFI_RADIO_FAMILY6)\r
+#include "radios/family6/mrfi_radio.c"\r
+\r
+#else\r
+#error "ERROR: Radio family is not defined."\r
+#endif\r
+\r
+\r
+/**************************************************************************************************\r
+ */\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/Components/mrfi/mrfi.h b/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/Components/mrfi/mrfi.h
new file mode 100755 (executable)
index 0000000..ca49e02
--- /dev/null
@@ -0,0 +1,182 @@
+/**************************************************************************************************\r
+  Revised:        $Date: 2007-07-06 11:19:00 -0700 (Fri, 06 Jul 2007) $\r
+  Revision:       $Revision: 13579 $\r
+\r
+  Copyright 2007 Texas Instruments Incorporated.  All rights reserved.\r
+\r
+  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+  the terms of a software license agreement between the user who downloaded the software,\r
+  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+  License. The License limits your use, and you acknowledge, that the Software may not be\r
+  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+  perform, display or sell this Software and/or its documentation for any purpose.\r
+\r
+  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+\r
+  Should you have any questions regarding your right to use this Software,\r
+  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+/* ~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=\r
+ *   MRFI (Minimal RF Interface)\r
+ *   Include file for all MRFI services.\r
+ * ~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=\r
+ */\r
+\r
+#ifndef MRFI_H\r
+#define MRFI_H\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                          Includes\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#include "bsp.h"\r
+#include "mrfi_defs.h"\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                          Defines\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#define MRFI_NUM_LOGICAL_CHANS           __mrfi_NUM_LOGICAL_CHANS__\r
+\r
+#define MRFI_NUM_POWER_SETTINGS          __mrfi_NUM_POWER_SETTINGS__\r
+\r
+/* return values for MRFI_Transmit */\r
+#define MRFI_TX_RESULT_SUCCESS        0\r
+#define MRFI_TX_RESULT_FAILED         1\r
+\r
+/* transmit type parameter for MRFI_Transmit */\r
+#define MRFI_TX_TYPE_FORCED           0\r
+#define MRFI_TX_TYPE_CCA              1\r
+\r
+/* Network header size definition */\r
+/* *********************************  NOTE  ****************************************\r
+ * There is a dependency here that really shouldn't exist. A reimplementation\r
+ * is necessary to avoid it.\r
+ *\r
+ * MRFI allocates the frame buffer which means it needs to know at compile time\r
+ * how big the buffer is. This means in must know the NWK header size, the\r
+ * maximum NWK and User application payload sizes and whether Security is enabled.\r
+ * ********************************************************************************\r
+ */\r
+#ifndef SMPL_SECURE\r
+#define  NWK_HDR_SIZE   3\r
+#define  NWK_PAYLOAD    MAX_NWK_PAYLOAD\r
+#else\r
+#define  NWK_HDR_SIZE   6\r
+#define  NWK_PAYLOAD    (MAX_NWK_PAYLOAD+4)\r
+#endif\r
+\r
+/* if external code has defined a maximum payload, use that instead of default */\r
+#ifdef MAX_APP_PAYLOAD\r
+#ifndef MAX_NWK_PAYLOAD\r
+#error ERROR: MAX_NWK_PAYLOAD not defined\r
+#endif\r
+#if MAX_APP_PAYLOAD < NWK_PAYLOAD\r
+#define MAX_PAYLOAD  NWK_PAYLOAD\r
+#else\r
+#define MAX_PAYLOAD  MAX_APP_PAYLOAD\r
+#endif\r
+#define MRFI_MAX_PAYLOAD_SIZE  (MAX_PAYLOAD+NWK_HDR_SIZE) /* SimpliciTI payload size plus six byte overhead */\r
+#endif\r
+\r
+\r
+/* frame definitions */\r
+#define MRFI_ADDR_SIZE              __mrfi_ADDR_SIZE__\r
+#ifndef MRFI_MAX_PAYLOAD_SIZE\r
+#define MRFI_MAX_PAYLOAD_SIZE       __mrfi_MAX_PAYLOAD_SIZE__\r
+#endif\r
+#define MRFI_MAX_FRAME_SIZE         (MRFI_MAX_PAYLOAD_SIZE + __mrfi_FRAME_OVERHEAD_SIZE__)\r
+#define MRFI_RX_METRICS_SIZE        __mrfi_RX_METRICS_SIZE__\r
+#define MRFI_RX_METRICS_RSSI_OFS    __mrfi_RX_METRICS_RSSI_OFS__\r
+#define MRFI_RX_METRICS_CRC_LQI_OFS __mrfi_RX_METRICS_CRC_LQI_OFS__\r
+\r
+/* Radio States */\r
+#define MRFI_RADIO_STATE_UNKNOWN  0\r
+#define MRFI_RADIO_STATE_OFF      1\r
+#define MRFI_RADIO_STATE_IDLE     2\r
+#define MRFI_RADIO_STATE_RX       3\r
+\r
+/* Platform constant used to calculate worst-case for an application\r
+ * acknowledgment delay. Used in the NWK_REPLY_DELAY() macro.\r
+ *\r
+\r
+                                      processing time on peer\r
+                                      |   round trip\r
+                                      |   |      max number of replays\r
+                                      |   |      |             number of backoff opportunities\r
+                                      |   |      |             |         average number of backoffs\r
+                                      |   |      |             |         |                                    */\r
+#define   PLATFORM_FACTOR_CONSTANT   (2 + 2*(MAX_HOPS*(MRFI_CCA_RETRIES*(8*MRFI_BACKOFF_PERIOD_USECS)/1000)))\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                          Macros\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#define MRFI_GET_PAYLOAD_LEN(p)         __mrfi_GET_PAYLOAD_LEN__(p)\r
+#define MRFI_SET_PAYLOAD_LEN(p,x)       __mrfi_SET_PAYLOAD_LEN__(p,x)\r
+\r
+#define MRFI_P_DST_ADDR(p)              __mrfi_P_DST_ADDR__(p)\r
+#define MRFI_P_SRC_ADDR(p)              __mrfi_P_SRC_ADDR__(p)\r
+#define MRFI_P_PAYLOAD(p)               __mrfi_P_PAYLOAD__(p)\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                          Typdefs\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+typedef struct\r
+{\r
+  uint8_t frame[MRFI_MAX_FRAME_SIZE];\r
+  uint8_t rxMetrics[MRFI_RX_METRICS_SIZE];\r
+} mrfiPacket_t;\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                         Prototypes\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+void    MRFI_Init(void);\r
+uint8_t MRFI_Transmit(mrfiPacket_t *, uint8_t);\r
+void    MRFI_Receive(mrfiPacket_t *);\r
+void    MRFI_RxCompleteISR(void); /* populated by code using MRFI */\r
+uint8_t MRFI_GetRadioState(void);\r
+void    MRFI_RxOn(void);\r
+void    MRFI_RxIdle(void);\r
+int8_t  MRFI_Rssi(void);\r
+void    MRFI_SetLogicalChannel(uint8_t);\r
+uint8_t MRFI_SetRxAddrFilter(uint8_t *);\r
+void    MRFI_EnableRxAddrFilter(void);\r
+void    MRFI_DisableRxAddrFilter(void);\r
+void    MRFI_Sleep(void);\r
+void    MRFI_WakeUp(void);\r
+uint8_t MRFI_RandomByte(void);\r
+void    MRFI_DelayMs(uint16_t);\r
+void    MRFI_ReplyDelay(void);\r
+void    MRFI_PostKillSem(void);\r
+void    MRFI_SetRFPwr(uint8_t);\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                       Global Constants\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+extern const uint8_t mrfiBroadcastAddr[];\r
+\r
+\r
+/**************************************************************************************************\r
+ */\r
+#endif\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/Components/mrfi/mrfi_defs.h b/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/Components/mrfi/mrfi_defs.h
new file mode 100755 (executable)
index 0000000..2e1c546
--- /dev/null
@@ -0,0 +1,226 @@
+/**************************************************************************************************\r
+  Revised:        $Date: 2009-01-13 16:32:00 -0700 (Wed, 13 Jan 2009) $\r
+  Revision:       $Revision: 18768 $\r
+\r
+  Copyright 2007-2009 Texas Instruments Incorporated.  All rights reserved.\r
+\r
+  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+  the terms of a software license agreement between the user who downloaded the software,\r
+  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+  License. The License limits your use, and you acknowledge, that the Software may not be\r
+  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+  perform, display or sell this Software and/or its documentation for any purpose.\r
+\r
+  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+\r
+  Should you have any questions regarding your right to use this Software,\r
+  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+/* ~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=\r
+ *   MRFI (Minimal RF Interface)\r
+ *   Definition and abstraction for radio targets.\r
+ * ~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=\r
+ */\r
+#ifndef MRFI_DEFS_H\r
+#define MRFI_DEFS_H\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                          Includes\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#include "bsp.h"\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                       Common Defines\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#define MRFI_CCA_RETRIES        4\r
+\r
+#define MRFI_ASSERT(x)          BSP_ASSERT(x)\r
+#define MRFI_FORCE_ASSERT()     BSP_FORCE_ASSERT()\r
+#define MRFI_ASSERTS_ARE_ON     BSP_ASSERTS_ARE_ON\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                    Radio Family Assigment\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+\r
+/* ------ Radio Family 1 ------ */\r
+#if (defined MRFI_CC1100) /* Sub 1 GHz RF Transceiver */ || \\r
+    (defined MRFI_CC1101) /* Sub 1 GHz RF Transceiver */ || \\r
+    (defined MRFI_CC1100E_470)  /* Sub 1 GHz RF Transceiver (CC1100E Asia) */ || \\r
+    (defined MRFI_CC1100E_950)  /* Sub 1 GHz RF Transceiver (CC1100E Asia) */ || \\r
+    (defined MRFI_CC2500) /* 2.4 GHz RF Transceiver */\r
+#define MRFI_RADIO_FAMILY1\r
+\r
+/* ------ Radio Family 2 ------ */\r
+#elif (defined MRFI_CC1110) /* Sub 1 GHz SoC */                     || \\r
+      (defined MRFI_CC1111) /* Sub 1 GHz SoC with USB controller */ || \\r
+      (defined MRFI_CC2510) /* 2.4 GHz SoC */                       || \\r
+      (defined MRFI_CC2511) /* 2.4 GHz SoC with USB controller */\r
+#define MRFI_RADIO_FAMILY2\r
+\r
+/* ------ Radio Family 3 ------ */\r
+#elif (defined MRFI_CC2420) /* 2.4 GHz IEEE 802.15.4 RF Transceiver */ || \\r
+      (defined MRFI_CC2520) /* 2.4 GHz IEEE 802.15.4 RF Transceiver */\r
+\r
+#define MRFI_RADIO_FAMILY3\r
+\r
+/* ------ Radio Family 4 ------ */\r
+#elif (defined MRFI_CC2430) /* 2.4 GHz IEEE 802.15.4 SoC */ || \\r
+      (defined MRFI_CC2431) /* 2.4 GHz IEEE 802.15.4 SoC */\r
+#define MRFI_RADIO_FAMILY4\r
+\r
+/* ------ Radio Family 5 ------ */\r
+#elif (defined MRFI_CC430)  /* Sub 1 GHz MSP SoC */\r
+#define MRFI_RADIO_FAMILY5\r
+\r
+/* ------ Radio Family 6 ------ */\r
+#elif (defined MRFI_CC2530) /* 2.4 GHz IEEE 802.15.4 SoC */\r
+\r
+#define MRFI_RADIO_FAMILY6\r
+\r
+#else\r
+#error "ERROR: Unknown or missing radio selection."\r
+#endif\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                Radio Family 1 / Radio Family 2 / Radio Family 5\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#if (defined MRFI_RADIO_FAMILY1) || (defined MRFI_RADIO_FAMILY2) || (defined MRFI_RADIO_FAMILY5)\r
+\r
+#define __mrfi_LENGTH_FIELD_SIZE__      1\r
+#define __mrfi_ADDR_SIZE__              4\r
+#define __mrfi_MAX_PAYLOAD_SIZE__       20\r
+\r
+#define __mrfi_RX_METRICS_SIZE__        2\r
+#define __mrfi_RX_METRICS_RSSI_OFS__    0\r
+#define __mrfi_RX_METRICS_CRC_LQI_OFS__ 1\r
+#define __mrfi_RX_METRICS_CRC_OK_MASK__ 0x80\r
+#define __mrfi_RX_METRICS_LQI_MASK__    0x7F\r
+\r
+#define __mrfi_NUM_LOGICAL_CHANS__      4\r
+#define __mrfi_NUM_POWER_SETTINGS__     3\r
+\r
+#define __mrfi_BACKOFF_PERIOD_USECS__   250\r
+\r
+#define __mrfi_LENGTH_FIELD_OFS__       0\r
+#define __mrfi_DST_ADDR_OFS__           (__mrfi_LENGTH_FIELD_OFS__ + __mrfi_LENGTH_FIELD_SIZE__)\r
+#define __mrfi_SRC_ADDR_OFS__           (__mrfi_DST_ADDR_OFS__ + __mrfi_ADDR_SIZE__)\r
+#define __mrfi_PAYLOAD_OFS__            (__mrfi_SRC_ADDR_OFS__ + __mrfi_ADDR_SIZE__)\r
+\r
+#define __mrfi_HEADER_SIZE__            (2 * __mrfi_ADDR_SIZE__)\r
+#define __mrfi_FRAME_OVERHEAD_SIZE__    (__mrfi_LENGTH_FIELD_SIZE__ + __mrfi_HEADER_SIZE__)\r
+\r
+#define __mrfi_GET_PAYLOAD_LEN__(p)     ((p)->frame[__mrfi_LENGTH_FIELD_OFS__] - __mrfi_HEADER_SIZE__)\r
+#define __mrfi_SET_PAYLOAD_LEN__(p,x)   st( (p)->frame[__mrfi_LENGTH_FIELD_OFS__] = x + __mrfi_HEADER_SIZE__; )\r
+\r
+#endif\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                Radio Family 3 / Radio Family 4 / Radio Family 6\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#if (defined MRFI_RADIO_FAMILY3) || (defined MRFI_RADIO_FAMILY4) || (defined MRFI_RADIO_FAMILY6)\r
+\r
+#define __mrfi_LENGTH_FIELD_SIZE__      1\r
+#define __mrfi_FCF_SIZE__               2\r
+#define __mrfi_DSN_SIZE__               1\r
+#define __mrfi_ADDR_SIZE__              4\r
+#define __mrfi_MAX_PAYLOAD_SIZE__       20\r
+\r
+#define __mrfi_RX_METRICS_SIZE__        2\r
+#define __mrfi_RX_METRICS_RSSI_OFS__    0\r
+#define __mrfi_RX_METRICS_CRC_LQI_OFS__ 1\r
+#define __mrfi_RX_METRICS_CRC_OK_MASK__ 0x80\r
+#define __mrfi_RX_METRICS_LQI_MASK__    0x7F\r
+\r
+#define __mrfi_NUM_LOGICAL_CHANS__      4\r
+#define __mrfi_NUM_POWER_SETTINGS__     3\r
+\r
+#define __mrfi_BACKOFF_PERIOD_USECS__   250\r
+\r
+#define __mrfi_LENGTH_FIELD_OFS__       0\r
+#define __mrfi_FCF_OFS__                (__mrfi_LENGTH_FIELD_OFS__ +  __mrfi_LENGTH_FIELD_SIZE__)\r
+#define __mrfi_DSN_OFS__                (__mrfi_FCF_OFS__          +  __mrfi_FCF_SIZE__)\r
+#define __mrfi_DST_ADDR_OFS__           (__mrfi_DSN_OFS__          +  __mrfi_DSN_SIZE__)\r
+#define __mrfi_SRC_ADDR_OFS__           (__mrfi_DST_ADDR_OFS__     +  __mrfi_ADDR_SIZE__)\r
+#define __mrfi_PAYLOAD_OFS__            (__mrfi_SRC_ADDR_OFS__     +  __mrfi_ADDR_SIZE__)\r
+\r
+#define __mrfi_HEADER_SIZE__            ((2 * __mrfi_ADDR_SIZE__) + __mrfi_FCF_SIZE__ + __mrfi_DSN_SIZE__)\r
+#define __mrfi_FRAME_OVERHEAD_SIZE__    (__mrfi_LENGTH_FIELD_SIZE__ + __mrfi_HEADER_SIZE__)\r
+\r
+#define __mrfi_GET_PAYLOAD_LEN__(p)     ((p)->frame[__mrfi_LENGTH_FIELD_OFS__] - __mrfi_HEADER_SIZE__)\r
+#define __mrfi_SET_PAYLOAD_LEN__(p,x)   st( (p)->frame[__mrfi_LENGTH_FIELD_OFS__] = x + __mrfi_HEADER_SIZE__; )\r
+\r
+#endif\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                   Radio Family Commonality\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#define __mrfi_P_DST_ADDR__(p)          (&((p)->frame[__mrfi_DST_ADDR_OFS__]))\r
+#define __mrfi_P_SRC_ADDR__(p)          (&((p)->frame[__mrfi_SRC_ADDR_OFS__]))\r
+#define __mrfi_P_PAYLOAD__(p)           (&((p)->frame[__mrfi_PAYLOAD_OFS__]))\r
+\r
+\r
+/* ************************************************************************************************\r
+ *                                   Compile Time Integrity Checks\r
+ * ************************************************************************************************\r
+ */\r
+\r
+/* verify that only one supported radio is selected */\r
+#define MRFI_NUM_SUPPORTED_RADIOS_SELECTED   ((defined MRFI_CC1100) + \\r
+                                              (defined MRFI_CC1101) + \\r
+                                              (defined MRFI_CC1110) + \\r
+                                              (defined MRFI_CC1111) + \\r
+                                              (defined MRFI_CC1100E_470) + \\r
+                                              (defined MRFI_CC1100E_950) + \\r
+                                              (defined MRFI_CC2500) + \\r
+                                              (defined MRFI_CC2510) + \\r
+                                              (defined MRFI_CC2511) + \\r
+                                              (defined MRFI_CC2430) + \\r
+                                              (defined MRFI_CC2431) + \\r
+                                              (defined MRFI_CC2520) + \\r
+                                              (defined MRFI_CC430)  + \\r
+                                              (defined MRFI_CC2530))\r
+#if (MRFI_NUM_SUPPORTED_RADIOS_SELECTED == 0)\r
+#error "ERROR: A valid radio is not selected."\r
+#elif (MRFI_NUM_SUPPORTED_RADIOS_SELECTED > 1)\r
+#error "ERROR: More than one radio is selected."\r
+#endif\r
+\r
+/* verify that a radio family is selected */\r
+#if (!defined MRFI_RADIO_FAMILY1) && \\r
+    (!defined MRFI_RADIO_FAMILY2) && \\r
+    (!defined MRFI_RADIO_FAMILY3) && \\r
+    (!defined MRFI_RADIO_FAMILY4) && \\r
+    (!defined MRFI_RADIO_FAMILY5) && \\r
+    (!defined MRFI_RADIO_FAMILY6)\r
+#error "ERROR: A radio family has not been assigned."\r
+#endif\r
+\r
+\r
+/**************************************************************************************************\r
+ */\r
+#endif\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/Components/mrfi/radios/family5/mrfi_radio.c b/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/Components/mrfi/radios/family5/mrfi_radio.c
new file mode 100755 (executable)
index 0000000..9de4b6a
--- /dev/null
@@ -0,0 +1,1778 @@
+/**************************************************************************************************\r
+  Revised:        $Date: 2009-11-23 07:50:43 -0800 (Mon, 23 Nov 2009) $\r
+  Revision:       $Revision: 21225 $\r
+\r
+  Copyright 2008-2009 Texas Instruments Incorporated.  All rights reserved.\r
+\r
+  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+  the terms of a software license agreement between the user who downloaded the software,\r
+  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+  License. The License limits your use, and you acknowledge, that the Software may not be\r
+  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+  perform, display or sell this Software and/or its documentation for any purpose.\r
+\r
+  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS?\r
+  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+\r
+  Should you have any questions regarding your right to use this Software,\r
+  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+/* ~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=\r
+ *   MRFI (Minimal RF Interface)\r
+ *   Radios: CC430\r
+ *   Primary code file for supported radios.\r
+ * ~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=\r
+ */\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                          Includes\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#include <string.h>\r
+#include "mrfi.h"\r
+#include "bsp.h"\r
+#include "bsp_macros.h"\r
+#include "bsp_external/mrfi_board_defs.h"\r
+#include "mrfi_defs.h"\r
+#include "mrfi_radio_interface.h"\r
+#include "smartrf/CC430/smartrf_CC430.h"\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                    Global Constants\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+const uint8_t mrfiBroadcastAddr[] = { 0xFF, 0xFF, 0xFF, 0xFF };\r
+\r
+/* verify number of table entries matches the corresponding #define */\r
+BSP_STATIC_ASSERT(MRFI_ADDR_SIZE == ((sizeof(mrfiBroadcastAddr)/sizeof(mrfiBroadcastAddr[0])) * sizeof(mrfiBroadcastAddr[0])));\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                          Defines\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#if (defined MRFI_CC430)\r
+  #define MRFI_RSSI_OFFSET    74   /* no units */\r
+#else\r
+  #error "ERROR: RSSI offset value not defined for this radio"\r
+#endif\r
+\r
+#define MRFI_LENGTH_FIELD_OFS               __mrfi_LENGTH_FIELD_OFS__\r
+#define MRFI_LENGTH_FIELD_SIZE              __mrfi_LENGTH_FIELD_SIZE__\r
+#define MRFI_HEADER_SIZE                    __mrfi_HEADER_SIZE__\r
+#define MRFI_FRAME_BODY_OFS                 __mrfi_DST_ADDR_OFS__\r
+#define MRFI_BACKOFF_PERIOD_USECS           __mrfi_BACKOFF_PERIOD_USECS__\r
+\r
+#define MRFI_RANDOM_OFFSET                   67\r
+#define MRFI_RANDOM_MULTIPLIER              109\r
+#define MRFI_MIN_SMPL_FRAME_SIZE            (MRFI_HEADER_SIZE + NWK_HDR_SIZE)\r
+\r
+/* rx metrics definitions, known as appended "packet status bytes" in datasheet parlance */\r
+#define MRFI_RX_METRICS_CRC_OK_MASK         __mrfi_RX_METRICS_CRC_OK_MASK__\r
+#define MRFI_RX_METRICS_LQI_MASK            __mrfi_RX_METRICS_LQI_MASK__\r
+\r
+\r
+/* ---------- Radio Abstraction ---------- */\r
+\r
+#define MRFI_RADIO_PARTNUM          0x00\r
+#define MRFI_RADIO_VERSION          0x06\r
+\r
+/* GDO0 == PA_PD signal */\r
+#define MRFI_SETTING_IOCFG0     27\r
+\r
+/* GDO1 == RSSI_VALID signal */\r
+#define MRFI_SETTING_IOCFG1     30\r
+\r
+/* Main Radio Control State Machine control configuration:\r
+ * Auto Calibrate - when going from IDLE to RX/TX\r
+ * XOSC is OFF in Sleep state.\r
+ */\r
+#define MRFI_SETTING_MCSM0      (0x10)\r
+\r
+/* Main Radio Control State Machine control configuration:\r
+ * - Remain RX state after RX\r
+ * - Go to IDLE after TX\r
+ * - RSSI below threshold and NOT receiving.\r
+ */\r
+#define MRFI_SETTING_MCSM1      0x3C\r
+\r
+/*\r
+ *  Packet Length - Setting for maximum allowed packet length.\r
+ *  The PKTLEN setting does not include the length field but maximum frame size does.\r
+ *  Subtract length field size from maximum frame size to get value for PKTLEN.\r
+ */\r
+#define MRFI_SETTING_PKTLEN     (MRFI_MAX_FRAME_SIZE - MRFI_LENGTH_FIELD_SIZE)\r
+\r
+/* Packet automation control - Original value except WHITE_DATA is extracted from SmartRF setting. */\r
+#define MRFI_SETTING_PKTCTRL0   (0x05 | (SMARTRF_SETTING_PKTCTRL0 & BV(6)))\r
+\r
+/* FIFO threshold - this register has fields that need to be configured for the CC1101 */\r
+#define MRFI_SETTING_FIFOTHR    (0x07 | (SMARTRF_SETTING_FIFOTHR & (BV(4)|BV(5)|BV(6)|BV(7))))\r
+\r
+/* Max time we can be in a critical section within the delay function.\r
+ * This could be fine-tuned by observing the overhead is calling the bsp delay\r
+ * function. The overhead should be very small compared to this value.\r
+ */\r
+#define MRFI_MAX_DELAY_US 16 /* usec */\r
+\r
+/* Packet automation control - base value is power up value whick has APPEND_STATUS enabled; no CRC autoflush */\r
+#define PKTCTRL1_BASE_VALUE         BV(2)\r
+#define PKTCTRL1_ADDR_FILTER_OFF    PKTCTRL1_BASE_VALUE\r
+#define PKTCTRL1_ADDR_FILTER_ON     (PKTCTRL1_BASE_VALUE | (BV(0)|BV(1)))\r
+\r
+#ifdef MRFI_ASSERTS_ARE_ON\r
+#define RX_FILTER_ADDR_INITIAL_VALUE  0xFF\r
+#endif\r
+\r
+  /* The SW timer is calibrated by adjusting the call to the microsecond delay\r
+   * routine. This allows maximum calibration control with repects to the longer\r
+   * times requested by applicationsd and decouples internal from external calls\r
+   * to the microsecond routine which can be calibrated independently.\r
+   */\r
+#if defined(SW_TIMER)\r
+#define APP_USEC_VALUE    1000\r
+#else\r
+#define APP_USEC_VALUE    1000\r
+#endif\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                           Macros\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#define MRFI_ENABLE_SYNC_PIN_INT()                  (RF1AIE |= BV(9))\r
+#define MRFI_DISABLE_SYNC_PIN_INT()                 (RF1AIE &= ~BV(9))\r
+#define MRFI_CLEAR_SYNC_PIN_INT_FLAG()              (RF1AIFG &= ~BV(9))\r
+#define MRFI_SYNC_PIN_INT_IS_ENABLED()              (RF1AIE & BV(9))\r
+#define MRFI_SYNC_PIN_IS_HIGH()                     (RF1AIN & BV(9))\r
+#define MRFI_SYNC_PIN_INT_FLAG_IS_SET()             (RF1AIFG & BV(9))\r
+\r
+\r
+#define MRFI_CLEAR_PAPD_PIN_INT_FLAG()              (RF1AIFG &= ~BV(0))\r
+#define MRFI_PAPD_PIN_IS_HIGH()                     (RF1AIN & BV(0))\r
+#define MRFI_PAPD_INT_FLAG_IS_SET()                 (RF1AIFG & BV(0))\r
+\r
+\r
+/* RSSI valid signal is available on the GDO_1 */\r
+#define MRFI_RSSI_VALID_WAIT()  while(!(RF1AIN & BV(1)));\r
+\r
+\r
+/* Abstract radio interface calls. Could use these later to\r
+ * merge code from similar radio but different interface.\r
+ */\r
+#define MRFI_STROBE(cmd)                      mrfiRadioInterfaceCmdStrobe(cmd)\r
+#define MRFI_RADIO_REG_READ(reg)              mrfiRadioInterfaceReadReg(reg)\r
+#define MRFI_RADIO_REG_WRITE(reg, value)      mrfiRadioInterfaceWriteReg(reg, value)\r
+#define MRFI_RADIO_WRITE_TX_FIFO(pData, len)  mrfiRadioInterfaceWriteTxFifo(pData, len)\r
+#define MRFI_RADIO_READ_RX_FIFO(pData, len)   mrfiRadioInterfaceReadRxFifo(pData, len)\r
+\r
+\r
+#define MRFI_STROBE_IDLE_AND_WAIT()              \\r
+{                                                \\r
+  MRFI_STROBE( SIDLE );                          \\r
+  /* Wait for XOSC to be stable and radio in IDLE state */ \\r
+  while (MRFI_STROBE( SNOP ) & 0xF0) ;           \\r
+}\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                    Local Constants\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+const uint8_t mrfiRadioCfg[][2] =\r
+{\r
+  /* internal radio configuration */\r
+  {  IOCFG0,    MRFI_SETTING_IOCFG0       }, /* Configure GDO_0 to output PA_PD signal (low during TX, high otherwise). */\r
+  {  IOCFG1,    MRFI_SETTING_IOCFG1       }, /* Configure GDO_1 to output RSSI_VALID signal (high when RSSI is valid, low otherwise). */\r
+  {  MCSM1,     MRFI_SETTING_MCSM1        }, /* CCA mode, RX_OFF_MODE and TX_OFF_MODE */\r
+  {  MCSM0,     MRFI_SETTING_MCSM0        }, /* AUTO_CAL and XOSC state in sleep */\r
+  {  PKTLEN,    MRFI_SETTING_PKTLEN       },\r
+  {  PKTCTRL0,  MRFI_SETTING_PKTCTRL0     },\r
+  {  FIFOTHR,   MRFI_SETTING_FIFOTHR      },\r
+\r
+/* imported SmartRF radio configuration */\r
+\r
+  {  FSCTRL1,   SMARTRF_SETTING_FSCTRL1   },\r
+  {  FSCTRL0,   SMARTRF_SETTING_FSCTRL0   },\r
+  {  FREQ2,     SMARTRF_SETTING_FREQ2     },\r
+  {  FREQ1,     SMARTRF_SETTING_FREQ1     },\r
+  {  FREQ0,     SMARTRF_SETTING_FREQ0     },\r
+  {  MDMCFG4,   SMARTRF_SETTING_MDMCFG4   },\r
+  {  MDMCFG3,   SMARTRF_SETTING_MDMCFG3   },\r
+  {  MDMCFG2,   SMARTRF_SETTING_MDMCFG2   },\r
+  {  MDMCFG1,   SMARTRF_SETTING_MDMCFG1   },\r
+  {  MDMCFG0,   SMARTRF_SETTING_MDMCFG0   },\r
+  {  DEVIATN,   SMARTRF_SETTING_DEVIATN   },\r
+  {  FOCCFG,    SMARTRF_SETTING_FOCCFG    },\r
+  {  BSCFG,     SMARTRF_SETTING_BSCFG     },\r
+  {  AGCCTRL2,  SMARTRF_SETTING_AGCCTRL2  },\r
+  {  AGCCTRL1,  SMARTRF_SETTING_AGCCTRL1  },\r
+  {  AGCCTRL0,  SMARTRF_SETTING_AGCCTRL0  },\r
+  {  FREND1,    SMARTRF_SETTING_FREND1    },\r
+  {  FREND0,    SMARTRF_SETTING_FREND0    },\r
+  {  FSCAL3,    SMARTRF_SETTING_FSCAL3    },\r
+  {  FSCAL2,    SMARTRF_SETTING_FSCAL2    },\r
+  {  FSCAL1,    SMARTRF_SETTING_FSCAL1    },\r
+  {  FSCAL0,    SMARTRF_SETTING_FSCAL0    },\r
+  {  TEST2,     SMARTRF_SETTING_TEST2     },\r
+  {  TEST1,     SMARTRF_SETTING_TEST1     },\r
+  {  TEST0,     SMARTRF_SETTING_TEST0     },\r
+};\r
+\r
+\r
+/*\r
+ *  Logical channel table - this table translates logical channel into\r
+ *  actual radio channel number.  Channel 0, the default channel, is\r
+ *  determined by the channel exported from SmartRF Studio.  The other\r
+ *  table entries are derived from that default.  Each derived channel is\r
+ *  masked with 0xFF to prevent generation of an illegal channel number.\r
+ *\r
+ *  This table is easily customized.  Just replace or add entries as needed.\r
+ *  If the number of entries changes, the corresponding #define must also\r
+ *  be adjusted.  It is located in mrfi_defs.h and is called __mrfi_NUM_LOGICAL_CHANS__.\r
+ *  The static assert below ensures that there is no mismatch.\r
+ */\r
+// [BM] Changed channel assignment to comply with local regulations\r
+#ifdef ISM_EU \r
+static const uint8_t mrfiLogicalChanTable[] =\r
+{\r
+  0,\r
+  50,\r
+  80,\r
+  110\r
+};\r
+#else\r
+       #ifdef ISM_US\r
+       static const uint8_t mrfiLogicalChanTable[] =\r
+       {\r
+         20,\r
+         50,\r
+         80,\r
+         110\r
+       };\r
+       #else\r
+               #ifdef ISM_LF\r
+               static const uint8_t mrfiLogicalChanTable[] =\r
+               {\r
+                 0,\r
+                 50,\r
+                 80,\r
+                 110\r
+               };              \r
+               #else\r
+                       #error "Wrong ISM band specified (valid are ISM_LF, ISM_EU and ISM_US)"\r
+               #endif\r
+       #endif\r
+#endif\r
+//static const uint8_t mrfiLogicalChanTable[] =\r
+//{\r
+//  SMARTRF_SETTING_CHANNR,\r
+//  50,\r
+//  80,\r
+//  110\r
+//};\r
+/* verify number of table entries matches the corresponding #define */\r
+BSP_STATIC_ASSERT(__mrfi_NUM_LOGICAL_CHANS__ == ((sizeof(mrfiLogicalChanTable)/sizeof(mrfiLogicalChanTable[0])) * sizeof(mrfiLogicalChanTable[0])));\r
+\r
+/*\r
+ *  RF Power setting table - this table translates logical power value\r
+ *  to radio register setting.  The logical power value is used directly\r
+ *  as an index into the power setting table. The values in the table are\r
+ *  from low to high. The default settings set 3 values: -20 dBm, -10 dBm,\r
+ *  and 0 dBm. The default at startup is the highest value. Note that these\r
+ *  are approximate depending on the radio. Information is taken from the\r
+ *  data sheet.\r
+ *\r
+ *  This table is easily customized.  Just replace or add entries as needed.\r
+ *  If the number of entries changes, the corresponding #define must also\r
+ *  be adjusted.  It is located in mrfi_defs.h and is called __mrfi_NUM_POWER_SETTINGS__.\r
+ *  The static assert below ensures that there is no mismatch.\r
+ *\r
+ * For the CC430 use the CC1100 values.\r
+ */\r
+static const uint8_t mrfiRFPowerTable[] =\r
+{\r
+// [BM] Changed default output power to comply with dongle settings\r
+  0x0F,\r
+  0x27,\r
+// [BM] Increase output power from -0.3dBm to +1.4dBm (433MHz) / +1.1dBm (868MHz) / +1.3dBm (915MHz) to compensate antenna loss  \r
+#ifdef ISM_EU \r
+  0x8C\r
+#else\r
+  #ifdef ISM_US\r
+    0x8B\r
+  #else\r
+       #ifdef ISM_LF\r
+               0x8D\r
+       #else\r
+           #error "Wrong ISM band specified (valid are ISM_LF, ISM_EU and ISM_US)"\r
+    #endif\r
+  #endif\r
+#endif\r
+};\r
+//static const uint8_t mrfiRFPowerTable[] =\r
+//{\r
+//  0x0D,\r
+//  0x34,\r
+//  0x8E\r
+//};\r
+\r
+/* verify number of table entries matches the corresponding #define */\r
+BSP_STATIC_ASSERT(__mrfi_NUM_POWER_SETTINGS__ == ((sizeof(mrfiRFPowerTable)/sizeof(mrfiRFPowerTable[0])) * sizeof(mrfiRFPowerTable[0])));\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                       Local Prototypes\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+static void Mrfi_SyncPinRxIsr(void);\r
+static void Mrfi_RxModeOn(void);\r
+static void Mrfi_RandomBackoffDelay(void);\r
+static void Mrfi_RxModeOff(void);\r
+static void Mrfi_DelayUsec(uint16_t howLong);\r
+static void Mrfi_DelayUsecSem(uint16_t howLong);\r
+static int8_t Mrfi_CalculateRssi(uint8_t rawValue);\r
+static uint8_t Mrfi_RxAddrIsFiltered(uint8_t * pAddr);\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                       Local Variables\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+static uint8_t mrfiRadioState  = MRFI_RADIO_STATE_UNKNOWN;\r
+static mrfiPacket_t mrfiIncomingPacket;\r
+static uint8_t mrfiRndSeed = 0;\r
+\r
+/* reply delay support */\r
+static volatile uint8_t  sKillSem = 0;\r
+static volatile uint8_t  sReplyDelayContext = 0;\r
+static          uint16_t sReplyDelayScalar = 0;\r
+static          uint16_t sBackoffHelper = 0;\r
+\r
+static uint8_t mrfiRxFilterEnabled = 0;\r
+static uint8_t mrfiRxFilterAddr[MRFI_ADDR_SIZE] = { RX_FILTER_ADDR_INITIAL_VALUE };\r
+\r
+/* These counters are only for diagnostic purpose */\r
+static uint32_t crcFail = 0;\r
+static uint32_t crcPass = 0;\r
+static uint32_t noFrame = 0;\r
+\r
+// [BM] Radio frequency offset read from calibration memory\r
+// Compensates crystal deviation from 26MHz nominal value\r
+extern unsigned char rf_frequoffset;\r
+\r
+/**************************************************************************************************\r
+ * @fn          MRFI_Init\r
+ *\r
+ * @brief       Initialize MRFI.\r
+ *\r
+ * @param       none\r
+ *\r
+ * @return      none\r
+ **************************************************************************************************\r
+ */\r
+void MRFI_Init(void)\r
+{\r
+  /* ------------------------------------------------------------------\r
+   *    Radio power-up reset\r
+   *   ----------------------\r
+   */\r
+  memset(&mrfiIncomingPacket, 0x0, sizeof(mrfiIncomingPacket));\r
+\r
+  /* Initialize the radio interface */\r
+  mrfiRadioInterfaceInit();\r
+\r
+  /* Strobe Reset: Resets the radio and puts it in SLEEP state. */\r
+  MRFI_STROBE( SRES );\r
+\r
+  /* verify the correct radio is installed */\r
+  MRFI_ASSERT( MRFI_RADIO_REG_READ( PARTNUM ) == MRFI_RADIO_PARTNUM );  /* incorrect radio specified */\r
+  MRFI_ASSERT( MRFI_RADIO_REG_READ( VERSION ) == MRFI_RADIO_VERSION );  /* incorrect radio specified  */\r
+\r
+  /* Put radio in Idle state */\r
+  MRFI_STROBE_IDLE_AND_WAIT();\r
+\r
+\r
+  /* ------------------------------------------------------------------\r
+   *    Configure radio\r
+   *   -----------------\r
+   */\r
+\r
+  /* Configure Radio interrupts:\r
+   *\r
+   * RF1AIN_0 => Programmed to PA_PD signal.\r
+   *             Configure it to interrupt on falling edge.\r
+   *\r
+   * RF1AIN_1 => Programmed to RSSI Valid signal.\r
+   *             No need to configure for interrupt. This value will be read\r
+   *             through polling.\r
+   *\r
+   * RF1AIN_9 => Rising edge indicates SYNC sent/received and\r
+   *             Falling edge indicates end of packet.\r
+   *             Configure it to interrupt on falling edge.\r
+   */\r
+\r
+  /* Select Interrupt edge for PA_PD and SYNC signal:\r
+   * Interrupt Edge select register: 1 == Interrupt on High to Low transition.\r
+   */\r
+  RF1AIES = BV(0) | BV(9);\r
+\r
+  /* Write the power output to the PA_TABLE and verify the write operation.  */\r
+  {\r
+    uint8_t      readbackPATableValue = 0;\r
+    bspIState_t  s;\r
+\r
+    BSP_ENTER_CRITICAL_SECTION(s);\r
+\r
+    while( !(RF1AIFCTL1 & RFINSTRIFG));\r
+    RF1AINSTRW = 0x7E51;                    /* PA Table write (burst) */\r
+\r
+    while( !(RF1AIFCTL1 & RFINSTRIFG));\r
+    RF1AINSTRB = RF_SNOP;                   /* reset pointer */\r
+\r
+    while( !(RF1AIFCTL1 & RFINSTRIFG));\r
+    RF1AINSTRB = 0xFE;                      /* PA Table read (burst) */\r
+\r
+    while( !(RF1AIFCTL1 & RFDINIFG));\r
+    RF1ADINB    = 0x00;                     /* dummy write */\r
+\r
+    while( !(RF1AIFCTL1 & RFDOUTIFG));\r
+    readbackPATableValue = RF1ADOUT0B;\r
+\r
+    MRFI_ASSERT(readbackPATableValue == 0x51);\r
+\r
+    while( !(RF1AIFCTL1 & RFINSTRIFG));\r
+    RF1AINSTRB = RF_SNOP;\r
+\r
+    BSP_EXIT_CRITICAL_SECTION(s);\r
+  }\r
+\r
+  /* initialize radio registers */\r
+  {\r
+    uint8_t i;\r
+\r
+    for (i=0; i<(sizeof(mrfiRadioCfg)/sizeof(mrfiRadioCfg[0])); i++)\r
+    {\r
+      MRFI_RADIO_REG_WRITE(mrfiRadioCfg[i][0], mrfiRadioCfg[i][1]);\r
+    }\r
+  }\r
+\r
+  /* Confirm that the values were written correctly.\r
+   */\r
+  {\r
+    uint8_t i;\r
+\r
+    for (i=0; i<(sizeof(mrfiRadioCfg)/sizeof(mrfiRadioCfg[0])); i++)\r
+    {\r
+        MRFI_ASSERT( mrfiRadioCfg[i][1] == MRFI_RADIO_REG_READ(mrfiRadioCfg[i][0]) );\r
+    }\r
+  }\r
+\r
+  // [BM] Apply global frequency offset to FSCTRL0\r
+  MRFI_STROBE_IDLE_AND_WAIT();\r
+  MRFI_RADIO_REG_WRITE(FSCTRL0, rf_frequoffset);\r
+  \r
+  /* set default channel */\r
+  MRFI_SetLogicalChannel( 0 );\r
+\r
+  /* Set default power level */\r
+  MRFI_SetRFPwr(MRFI_NUM_POWER_SETTINGS- 1);\r
+\r
+  /* Generate Random seed:\r
+   * We will use the RSSI value to generate our random seed.\r
+   */\r
+\r
+  /* Put the radio in RX state */\r
+  MRFI_STROBE( SRX );\r
+\r
+  /* delay for the rssi to be valid */\r
+  MRFI_RSSI_VALID_WAIT();\r
+\r
+  {\r
+    uint8_t i;\r
+    for(i=0; i<16; i++)\r
+    {\r
+      /* use most random bit of rssi to populate the random seed */\r
+      mrfiRndSeed = (mrfiRndSeed << 1) | (MRFI_RADIO_REG_READ(RSSI) & 0x01);\r
+    }\r
+  }\r
+\r
+  /* Force the seed to be non-zero by setting one bit, just in case... */\r
+  mrfiRndSeed |= 0x0080;\r
+\r
+  /* Turn off RF. */\r
+  Mrfi_RxModeOff();\r
+\r
+  /* Strobe Power Down (SPWD): puts the radio in SLEEP state. */\r
+  /* Chip bug: Radio does not come out of this SLEEP when put to sleep\r
+   * using the SPWD cmd. However, it does wakes up if SXOFF was used to\r
+   * put it to sleep.\r
+   */\r
+  MRFI_STROBE( SXOFF );\r
+\r
+  /* Initial radio state is IDLE state */\r
+  mrfiRadioState = MRFI_RADIO_STATE_OFF;\r
+\r
+  /*****************************************************************************************\r
+   *                            Compute reply delay scalar\r
+   *\r
+   * Formula from data sheet for all the narrow band radios is:\r
+   *\r
+   *                (256 + DATAR_Mantissa) * 2^(DATAR_Exponent)\r
+   * DATA_RATE =    ------------------------------------------ * f(xosc)\r
+   *                                    2^28\r
+   *\r
+   * To try and keep some accuracy we change the exponent of the denominator\r
+   * to (28 - (exponent from the configuration register)) so we do a division\r
+   * by a smaller number. We find the power of 2 by shifting.\r
+   *\r
+   * The maximum delay needed depends on the MAX_APP_PAYLOAD parameter. Figure\r
+   * out how many bits that will be when overhead is included. Bits/bits-per-second\r
+   * is seconds to transmit (or receive) the maximum frame. We multiply this number\r
+   * by 1000 to find the time in milliseconds. We then additionally multiply by\r
+   * 10 so we can add 5 and divide by 10 later, thus rounding up to the number of\r
+   * milliseconds. This last won't matter for slow transmissions but for faster ones\r
+   * we want to err on the side of being conservative and making sure the radio is on\r
+   * to receive the reply. The semaphore monitor will shut it down. The delay adds in\r
+   * a fudge factor that includes processing time on peer plus lags in Rx and processing\r
+   * time on receiver's side.\r
+   *\r
+   * Note that we assume a 26 MHz clock for the radio...\r
+   * ***************************************************************************************\r
+   */\r
+#define   MRFI_RADIO_OSC_FREQ         26000000\r
+#define   PHY_PREAMBLE_SYNC_BYTES     8\r
+\r
+  {\r
+    uint32_t dataRate, bits;\r
+    uint16_t exponent, mantissa;\r
+\r
+    /* mantissa is in MDMCFG3 */\r
+    mantissa = 256 + SMARTRF_SETTING_MDMCFG3;\r
+\r
+    /* exponent is lower nibble of MDMCFG4. */\r
+    exponent = 28 - (SMARTRF_SETTING_MDMCFG4 & 0x0F);\r
+\r
+    /* we can now get data rate */\r
+    dataRate = mantissa * (MRFI_RADIO_OSC_FREQ>>exponent);\r
+\r
+    bits = ((uint32_t)((PHY_PREAMBLE_SYNC_BYTES + MRFI_MAX_FRAME_SIZE)*8))*10000;\r
+\r
+    /* processing on the peer + the Tx/Rx time plus more */\r
+    sReplyDelayScalar = PLATFORM_FACTOR_CONSTANT + (((bits/dataRate)+5)/10);\r
+\r
+    /* This helper value is used to scale the backoffs during CCA. At very\r
+     * low data rates we need to backoff longer to prevent continual sampling\r
+     * of valid frames which take longer to send at lower rates. Use the scalar\r
+     * we just calculated divided by 32. With the backoff algorithm backing\r
+     * off up to 16 periods this will result in waiting up to about 1/2 the total\r
+     * scalar value. For high data rates this does not contribute at all. Value\r
+     * is in microseconds.\r
+     */\r
+    sBackoffHelper = MRFI_BACKOFF_PERIOD_USECS + (sReplyDelayScalar>>5)*1000;\r
+  }\r
+\r
+  /* Clean out buffer to protect against spurious frames */\r
+  memset(mrfiIncomingPacket.frame, 0x00, sizeof(mrfiIncomingPacket.frame));\r
+  memset(mrfiIncomingPacket.rxMetrics, 0x00, sizeof(mrfiIncomingPacket.rxMetrics));\r
+\r
+  /* enable global interrupts */\r
+  BSP_ENABLE_INTERRUPTS();\r
+}\r
+\r
+\r
+/**************************************************************************************************\r
+ * @fn          MRFI_Transmit\r
+ *\r
+ * @brief       Transmit a packet using CCA algorithm.\r
+ *\r
+ * @param       pPacket - pointer to packet to transmit\r
+ *\r
+ * @return      Return code indicates success or failure of transmit:\r
+ *                  MRFI_TX_RESULT_SUCCESS - transmit succeeded\r
+ *                  MRFI_TX_RESULT_FAILED  - transmit failed because CCA failed\r
+ **************************************************************************************************\r
+ */\r
+uint8_t MRFI_Transmit(mrfiPacket_t * pPacket, uint8_t txType)\r
+{\r
+  uint8_t ccaRetries;\r
+  uint8_t txBufLen;\r
+  uint8_t returnValue = MRFI_TX_RESULT_SUCCESS;\r
+\r
+  /* radio must be awake to transmit */\r
+  MRFI_ASSERT( mrfiRadioState != MRFI_RADIO_STATE_OFF );\r
+\r
+  /* Turn off reciever. We can ignore/drop incoming packets during transmit. */\r
+  Mrfi_RxModeOff();\r
+\r
+  /* compute number of bytes to write to transmit FIFO */\r
+  txBufLen = pPacket->frame[MRFI_LENGTH_FIELD_OFS] + MRFI_LENGTH_FIELD_SIZE;\r
+\r
+  /* ------------------------------------------------------------------\r
+   *    Write packet to transmit FIFO\r
+   *   --------------------------------\r
+   */\r
+  MRFI_RADIO_WRITE_TX_FIFO(&(pPacket->frame[0]), txBufLen);\r
+\r
+\r
+  /* ------------------------------------------------------------------\r
+   *    Immediate transmit\r
+   *   ---------------------\r
+   */\r
+  if (txType == MRFI_TX_TYPE_FORCED)\r
+  {\r
+    /* Issue the TX strobe. */\r
+    MRFI_STROBE( STX );\r
+\r
+    /* Wait for transmit to complete */\r
+    while(!MRFI_SYNC_PIN_INT_FLAG_IS_SET());\r
+\r
+    /* Clear the interrupt flag */\r
+    MRFI_CLEAR_SYNC_PIN_INT_FLAG();\r
+  }\r
+  else\r
+  {\r
+    /* ------------------------------------------------------------------\r
+     *    CCA transmit\r
+     *   ---------------\r
+     */\r
+\r
+    MRFI_ASSERT( txType == MRFI_TX_TYPE_CCA );\r
+\r
+    /* set number of CCA retries */\r
+    ccaRetries = MRFI_CCA_RETRIES;\r
+\r
+\r
+    /* ===============================================================================\r
+     *    Main Loop\r
+     *  =============\r
+     */\r
+    for (;;)\r
+    {\r
+      /* Radio must be in RX mode for CCA to happen.\r
+       * Otherwise it will transmit without CCA happening.\r
+       */\r
+\r
+      /* Can not use the Mrfi_RxModeOn() function here since it turns on the\r
+       * Rx interrupt, which we don't want in this case.\r
+       */\r
+      MRFI_STROBE( SRX );\r
+\r
+      /* wait for the rssi to be valid. */\r
+      MRFI_RSSI_VALID_WAIT();\r
+\r
+      /*\r
+       *  Clear the PA_PD pin interrupt flag.  This flag, not the interrupt itself,\r
+       *  is used to capture the transition that indicates a transmit was started.\r
+       *  The pin level cannot be used to indicate transmit success as timing may\r
+       *  prevent the transition from being detected.  The interrupt latch captures\r
+       *  the event regardless of timing.\r
+       */\r
+      MRFI_CLEAR_PAPD_PIN_INT_FLAG();\r
+\r
+      /* send strobe to initiate transmit */\r
+      MRFI_STROBE( STX );\r
+\r
+      /* Delay long enough for the PA_PD signal to indicate a\r
+       * successful transmit. This is the 250 XOSC periods\r
+       * (9.6 us for a 26 MHz crystal).\r
+       * Found out that we need a delay of atleast 25 us on CC1100 to see\r
+       * the PA_PD signal change. Hence keeping the same for CC430\r
+       */\r
+      Mrfi_DelayUsec(25);\r
+\r
+\r
+      /* PA_PD signal goes from HIGH to LOW when going from RX to TX state.\r
+       * This transition is trapped as a falling edge interrupt flag\r
+       * to indicate that CCA passed and the transmit has started.\r
+       */\r
+      if (MRFI_PAPD_INT_FLAG_IS_SET())\r
+      {\r
+        /* ------------------------------------------------------------------\r
+        *    Clear Channel Assessment passed.\r
+        *   ----------------------------------\r
+        */\r
+\r
+        /* Clear the PA_PD int flag */\r
+        MRFI_CLEAR_PAPD_PIN_INT_FLAG();\r
+\r
+        /* PA_PD signal stays LOW while in TX state and goes back to HIGH when\r
+         * the radio transitions to RX state.\r
+         */\r
+        /* wait for transmit to complete */\r
+        while (!MRFI_PAPD_PIN_IS_HIGH());\r
+\r
+        /* transmit done, break */\r
+        break;\r
+      }\r
+      else\r
+      {\r
+        /* ------------------------------------------------------------------\r
+         *    Clear Channel Assessment failed.\r
+         *   ----------------------------------\r
+         */\r
+\r
+        /* Turn off radio and save some power during backoff */\r
+\r
+        /* NOTE: Can't use Mrfi_RxModeOff() - since it tries to update the\r
+         * sync signal status which we are not using during the TX operation.\r
+         */\r
+        MRFI_STROBE_IDLE_AND_WAIT();\r
+\r
+        /* flush the receive FIFO of any residual data */\r
+        MRFI_STROBE( SFRX );\r
+\r
+        /* Retry ? */\r
+        if (ccaRetries != 0)\r
+        {\r
+          /* delay for a random number of backoffs */\r
+          Mrfi_RandomBackoffDelay();\r
+\r
+          /* decrement CCA retries before loop continues */\r
+          ccaRetries--;\r
+        }\r
+        else /* No CCA retries are left, abort */\r
+        {\r
+          /* set return value for failed transmit and break */\r
+          returnValue = MRFI_TX_RESULT_FAILED;\r
+          break;\r
+        }\r
+      } /* CCA Failed */\r
+    } /* CCA loop */\r
+  }/* txType is CCA */\r
+\r
+\r
+  /* Done with TX. Clean up time... */\r
+\r
+  /* Radio is already in IDLE state */\r
+\r
+  /*\r
+   * Flush the transmit FIFO.  It must be flushed so that\r
+   * the next transmit can start with a clean slate.\r
+   */\r
+  MRFI_STROBE( SFTX );\r
+\r
+  /* If the radio was in RX state when transmit was attempted,\r
+   * put it back to Rx On state.\r
+   */\r
+  if(mrfiRadioState == MRFI_RADIO_STATE_RX)\r
+  {\r
+    Mrfi_RxModeOn();\r
+  }\r
+\r
+  return( returnValue );\r
+}\r
+\r
+/**************************************************************************************************\r
+ * @fn          MRFI_Receive\r
+ *\r
+ * @brief       Copies last packet received to the location specified.\r
+ *              This function is meant to be called after the ISR informs\r
+ *              higher level code that there is a newly received packet.\r
+ *\r
+ * @param       pPacket - pointer to location of where to copy received packet\r
+ *\r
+ * @return      none\r
+ **************************************************************************************************\r
+ */\r
+void MRFI_Receive(mrfiPacket_t * pPacket)\r
+{\r
+  *pPacket = mrfiIncomingPacket;\r
+}\r
+\r
+/**************************************************************************************************\r
+ * @fn          Mrfi_SyncPinRxIsr\r
+ *\r
+ * @brief       This interrupt is called when the SYNC signal transition from high to low.\r
+ *              The sync signal is routed to the sync pin which is a GPIO pin.  This high-to-low\r
+ *              transition signifies a receive has completed.  The SYNC signal also goes from\r
+ *              high to low when a transmit completes.   This is protected against within the\r
+ *              transmit function by disabling sync pin interrupts until transmit completes.\r
+ *\r
+ * @param       none\r
+ *\r
+ * @return      none\r
+ **************************************************************************************************\r
+ */\r
+static void Mrfi_SyncPinRxIsr(void)\r
+{\r
+  uint8_t frameLen = 0x00;\r
+  uint8_t rxBytes;\r
+\r
+  /* We should receive this interrupt only in RX state\r
+   * Should never receive it if RX was turned On only for\r
+   * some internal mrfi processing like - during CCA.\r
+   * Otherwise something is terribly wrong.\r
+   */\r
+  MRFI_ASSERT( mrfiRadioState == MRFI_RADIO_STATE_RX );\r
+\r
+  /* ------------------------------------------------------------------\r
+   *    Get RXBYTES\r
+   *   -------------\r
+   */\r
+\r
+  /*\r
+   *  Read the RXBYTES register from the radio.\r
+   *  Bit description of RXBYTES register:\r
+   *    bit 7     - RXFIFO_OVERFLOW, set if receive overflow occurred\r
+   *    bits 6:0  - NUM_BYTES, number of bytes in receive FIFO\r
+   *\r
+   *  Due a chip bug, the RXBYTES register must read the same value twice\r
+   *  in a row to guarantee an accurate value.\r
+   */\r
+  {\r
+    uint8_t rxBytesVerify;\r
+\r
+    rxBytesVerify = MRFI_RADIO_REG_READ( RXBYTES );\r
+\r
+    do\r
+    {\r
+      rxBytes = rxBytesVerify;\r
+      rxBytesVerify = MRFI_RADIO_REG_READ( RXBYTES );\r
+    }\r
+    while (rxBytes != rxBytesVerify);\r
+  }\r
+\r
+\r
+  /* ------------------------------------------------------------------\r
+   *    FIFO empty?\r
+   *   -------------\r
+   */\r
+\r
+  /*\r
+   *  See if the receive FIFIO is empty before attempting to read from it.\r
+   *  It is possible nothing the FIFO is empty even though the interrupt fired.\r
+   *  This can happen if address check is enabled and a non-matching packet is\r
+   *  received.  In that case, the radio automatically removes the packet from\r
+   *  the FIFO.\r
+   */\r
+  if (rxBytes == 0)\r
+  {\r
+    /* receive FIFO is empty - do nothing, skip to end */\r
+  }\r
+  else\r
+  {\r
+    /* receive FIFO is not empty, continue processing */\r
+\r
+    /* ------------------------------------------------------------------\r
+     *    Process frame length\r
+     *   ----------------------\r
+     */\r
+\r
+    /* read the first byte from FIFO - the packet length */\r
+    MRFI_RADIO_READ_RX_FIFO(&frameLen, MRFI_LENGTH_FIELD_SIZE);\r
+\r
+\r
+    /*\r
+     *  Make sure that the frame length just read corresponds to number of bytes in the buffer.\r
+     *  If these do not match up something is wrong.\r
+     *\r
+     *  This can happen for several reasons:\r
+     *   1) Incoming packet has an incorrect format or is corrupted.\r
+     *   2) The receive FIFO overflowed.  Overflow is indicated by the high\r
+     *      bit of rxBytes.  This guarantees the value of rxBytes value will not\r
+     *      match the number of bytes in the FIFO for overflow condition.\r
+     *   3) Interrupts were blocked for an abnormally long time which\r
+     *      allowed a following packet to at least start filling the\r
+     *      receive FIFO.  In this case, all received and partially received\r
+     *      packets will be lost - the packet in the FIFO and the packet coming in.\r
+     *      This is the price the user pays if they implement a giant\r
+     *      critical section.\r
+     *   4) A failed transmit forced radio to IDLE state to flush the transmit FIFO.\r
+     *      This could cause an active receive to be cut short.\r
+     *\r
+     *  Also check the sanity of the length to guard against rogue frames.\r
+     */\r
+    if ((rxBytes != (frameLen + MRFI_LENGTH_FIELD_SIZE + MRFI_RX_METRICS_SIZE))           ||\r
+        ((frameLen + MRFI_LENGTH_FIELD_SIZE) > MRFI_MAX_FRAME_SIZE) ||\r
+        (frameLen < MRFI_MIN_SMPL_FRAME_SIZE)\r
+       )\r
+    {\r
+      bspIState_t s;\r
+      noFrame++;\r
+\r
+      /* mismatch between bytes-in-FIFO and frame length */\r
+\r
+      /*\r
+       *  Flush receive FIFO to reset receive.  Must go to IDLE state to do this.\r
+       *  The critical section guarantees a transmit does not occur while cleaning up.\r
+       */\r
+      BSP_ENTER_CRITICAL_SECTION(s);\r
+      MRFI_STROBE_IDLE_AND_WAIT();\r
+      MRFI_STROBE( SFRX );\r
+      MRFI_STROBE( SRX );\r
+      BSP_EXIT_CRITICAL_SECTION(s);\r
+\r
+      /* flush complete, skip to end */\r
+    }\r
+    else\r
+    {\r
+      /* bytes-in-FIFO and frame length match up - continue processing */\r
+\r
+      /* ------------------------------------------------------------------\r
+       *    Get packet\r
+       *   ------------\r
+       */\r
+\r
+      /* clean out buffer to help protect against spurious frames */\r
+      memset(mrfiIncomingPacket.frame, 0x00, sizeof(mrfiIncomingPacket.frame));\r
+\r
+      /* set length field */\r
+      mrfiIncomingPacket.frame[MRFI_LENGTH_FIELD_OFS] = frameLen;\r
+\r
+      /* get packet from FIFO */\r
+      MRFI_RADIO_READ_RX_FIFO(&(mrfiIncomingPacket.frame[MRFI_FRAME_BODY_OFS]), frameLen);\r
+\r
+      /* get receive metrics from FIFO */\r
+      MRFI_RADIO_READ_RX_FIFO(&(mrfiIncomingPacket.rxMetrics[0]), MRFI_RX_METRICS_SIZE);\r
+\r
+\r
+      /* ------------------------------------------------------------------\r
+       *    CRC check\r
+       *   ------------\r
+       */\r
+\r
+      /*\r
+       *  Note!  Automatic CRC check is not, and must not, be enabled.  This feature\r
+       *  flushes the *entire* receive FIFO when CRC fails.  If this feature is\r
+       *  enabled it is possible to be reading from the FIFO and have a second\r
+       *  receive occur that fails CRC and automatically flushes the receive FIFO.\r
+       *  This could cause reads from an empty receive FIFO which puts the radio\r
+       *  into an undefined state.\r
+       */\r
+\r
+      /* determine if CRC failed */\r
+      if (!(mrfiIncomingPacket.rxMetrics[MRFI_RX_METRICS_CRC_LQI_OFS] & MRFI_RX_METRICS_CRC_OK_MASK))\r
+      {\r
+        /* CRC failed - do nothing, skip to end */\r
+        crcFail++;\r
+      }\r
+      else\r
+      {\r
+        /* CRC passed - continue processing */\r
+        crcPass++;\r
+\r
+        /* ------------------------------------------------------------------\r
+         *    Filtering\r
+         *   -----------\r
+         */\r
+\r
+        /* if address is not filtered, receive is successful */\r
+        if (!Mrfi_RxAddrIsFiltered(MRFI_P_DST_ADDR(&mrfiIncomingPacket)))\r
+        {\r
+          {\r
+            /* ------------------------------------------------------------------\r
+             *    Receive successful\r
+             *   --------------------\r
+             */\r
+\r
+            /* Convert the raw RSSI value and do offset compensation for this radio */\r
+            mrfiIncomingPacket.rxMetrics[MRFI_RX_METRICS_RSSI_OFS] =\r
+                Mrfi_CalculateRssi(mrfiIncomingPacket.rxMetrics[MRFI_RX_METRICS_RSSI_OFS]);\r
+\r
+            /* Remove the CRC valid bit from the LQI byte */\r
+            mrfiIncomingPacket.rxMetrics[MRFI_RX_METRICS_CRC_LQI_OFS] =\r
+              (mrfiIncomingPacket.rxMetrics[MRFI_RX_METRICS_CRC_LQI_OFS] & MRFI_RX_METRICS_LQI_MASK);\r
+\r
+\r
+            /* call external, higher level "receive complete" processing routine */\r
+            MRFI_RxCompleteISR();\r
+          }\r
+        }\r
+      }\r
+    }\r
+  }\r
+\r
+  /* ------------------------------------------------------------------\r
+   *    End of function\r
+   *   -------------------\r
+   */\r
+}\r
+\r
+/**************************************************************************************************\r
+ * @fn          Mrfi_RxModeOn\r
+ *\r
+ * @brief       Put radio into receive mode.\r
+ *\r
+ * @param       none\r
+ *\r
+ * @return      none\r
+ **************************************************************************************************\r
+ */\r
+static void Mrfi_RxModeOn(void)\r
+{\r
+  /* clear any residual receive interrupt */\r
+  MRFI_CLEAR_SYNC_PIN_INT_FLAG();\r
+\r
+  /* send strobe to enter receive mode */\r
+  MRFI_STROBE( SRX );\r
+\r
+  /* enable receive interrupts */\r
+  MRFI_ENABLE_SYNC_PIN_INT();\r
+}\r
+\r
+/**************************************************************************************************\r
+ * @fn          MRFI_RxOn\r
+ *\r
+ * @brief       Turn on the receiver.  No harm is done if this function is called when\r
+ *              receiver is already on.\r
+ *\r
+ * @param       none\r
+ *\r
+ * @return      none\r
+ **************************************************************************************************\r
+ */\r
+void MRFI_RxOn(void)\r
+{\r
+  /* radio must be awake before we can move it to RX state */\r
+  MRFI_ASSERT( mrfiRadioState != MRFI_RADIO_STATE_OFF );\r
+\r
+  /* if radio is off, turn it on */\r
+  if(mrfiRadioState != MRFI_RADIO_STATE_RX)\r
+  {\r
+    mrfiRadioState = MRFI_RADIO_STATE_RX;\r
+    Mrfi_RxModeOn();\r
+  }\r
+}\r
+\r
+/**************************************************************************************************\r
+ * @fn          Mrfi_RxModeOff\r
+ *\r
+ * @brief       -\r
+ *\r
+ * @param       none\r
+ *\r
+ * @return      none\r
+ **************************************************************************************************\r
+ */\r
+static void Mrfi_RxModeOff(void)\r
+{\r
+  /* disable receive interrupts */\r
+  MRFI_DISABLE_SYNC_PIN_INT();\r
+\r
+  /* turn off radio */\r
+  MRFI_STROBE_IDLE_AND_WAIT();\r
+\r
+  /* flush the receive FIFO of any residual data */\r
+  MRFI_STROBE( SFRX );\r
+\r
+  /* clear receive interrupt */\r
+  MRFI_CLEAR_SYNC_PIN_INT_FLAG();\r
+}\r
+\r
+\r
+/**************************************************************************************************\r
+ * @fn          MRFI_RxIdle\r
+ *\r
+ * @brief       Put radio in idle mode (receiver if off).  No harm is done this function is\r
+ *              called when radio is already idle.\r
+ *\r
+ * @param       none\r
+ *\r
+ * @return      none\r
+ **************************************************************************************************\r
+ */\r
+void MRFI_RxIdle(void)\r
+{\r
+  /* radio must be awake to move it to idle mode */\r
+  MRFI_ASSERT( mrfiRadioState != MRFI_RADIO_STATE_OFF );\r
+\r
+  /* if radio is on, turn it off */\r
+  if(mrfiRadioState == MRFI_RADIO_STATE_RX)\r
+  {\r
+    Mrfi_RxModeOff();\r
+    mrfiRadioState = MRFI_RADIO_STATE_IDLE;\r
+  }\r
+}\r
+\r
+\r
+/**************************************************************************************************\r
+ * @fn          MRFI_Sleep\r
+ *\r
+ * @brief       Request radio go to sleep.\r
+ *\r
+ * @param       none\r
+ *\r
+ * @return      none\r
+ **************************************************************************************************\r
+ */\r
+void MRFI_Sleep(void)\r
+{\r
+  bspIState_t s;\r
+\r
+  /* Critical section necessary for watertight testing and\r
+   * setting of state variables.\r
+   */\r
+  BSP_ENTER_CRITICAL_SECTION(s);\r
+\r
+  /* If radio is not asleep, put it to sleep */\r
+  if(mrfiRadioState != MRFI_RADIO_STATE_OFF)\r
+  {\r
+    /* go to idle so radio is in a known state before sleeping */\r
+    MRFI_RxIdle();\r
+\r
+    /* Strobe Power Down (SPWD): puts the radio in SLEEP state. */\r
+    /* Chip bug: Radio does not come out of this SLEEP when put to sleep\r
+     * using the SPWD cmd. However, it does wakes up if SXOFF was used to\r
+     * put it to sleep.\r
+     */\r
+    MRFI_STROBE( SXOFF );\r
+\r
+    /* Our new state is OFF */\r
+    mrfiRadioState = MRFI_RADIO_STATE_OFF;\r
+  }\r
+\r
+  BSP_EXIT_CRITICAL_SECTION(s);\r
+}\r
+\r
+\r
+/**************************************************************************************************\r
+ * @fn          MRFI_WakeUp\r
+ *\r
+ * @brief       Wake up radio from sleep state.\r
+ *\r
+ * @param       none\r
+ *\r
+ * @return      none\r
+ **************************************************************************************************\r
+ */\r
+void MRFI_WakeUp(void)\r
+{\r
+  /* if radio is already awake, just ignore wakeup request */\r
+  if(mrfiRadioState != MRFI_RADIO_STATE_OFF)\r
+  {\r
+    return;\r
+  }\r
+\r
+  MRFI_STROBE_IDLE_AND_WAIT();\r
+\r
+  /* enter idle mode */\r
+  mrfiRadioState = MRFI_RADIO_STATE_IDLE;\r
+}\r
+\r
+\r
+/**************************************************************************************************\r
+ * @fn          MRFI_RadioIsr\r
+ *\r
+ * @brief       Radio Interface interrupts as well as Radio interrupts are\r
+ *              mapped to this interrupt vector.\r
+ *\r
+ * @param       -\r
+ *\r
+ * @return      -\r
+ **************************************************************************************************\r
+ */\r
+// [BM] Changed because CC1101_VECTOR ISR is declared of source code and this handler is called indirect\r
+//BSP_ISR_FUNCTION( MRFI_RadioIsr, CC1101_VECTOR )\r
+void MRFI_RadioIsr(void)\r
+{\r
+  uint16_t coreIntSource = RF1AIV;            /* Radio Core      interrupt register */\r
+  uint16_t interfaceIntSource = RF1AIFIV;     /* Radio Interface interrupt register */\r
+\r
+  /* Interface interrupt */\r
+  if(interfaceIntSource)\r
+  {\r
+    if(interfaceIntSource == RF1AIFIV_RFERRIFG)\r
+    {\r
+      uint16_t interfaceError = RF1AIFERRV;\r
+\r
+      if(interfaceError == RF1AIFERRV_LVERR)\r
+      {\r
+        /* Low core voltage error */\r
+      }\r
+      else if(interfaceError == RF1AIFERRV_OPERR)\r
+      {\r
+        /* Operand error */\r
+      }\r
+      else if(interfaceError == RF1AIFERRV_OUTERR)\r
+      {\r
+        /* output data not available error */\r
+      }\r
+      else if(interfaceError == RF1AIFERRV_OPOVERR)\r
+      {\r
+        /* Operand overwrite error */\r
+      }\r
+      else\r
+      {\r
+        /* Can't possibly happen. If interface error flag was set,\r
+         * then one of the interface errors must be set.\r
+         */\r
+        MRFI_FORCE_ASSERT();\r
+      }\r
+\r
+      /* Assert anyways. No error handling implemented. */\r
+      MRFI_FORCE_ASSERT();\r
+    }\r
+    else\r
+    {\r
+      /* Not expecting any other interface interrupts (data in/out, status/instr in, fifo rx/tx) */\r
+      MRFI_FORCE_ASSERT();\r
+    }\r
+  }\r
+\r
+  /* Radio Core interrupt */\r
+  if(coreIntSource)\r
+  {\r
+    /* Check for SYNC interrupt */\r
+    if(coreIntSource == RF1AIV_RFIFG9)\r
+    {\r
+      if(MRFI_SYNC_PIN_INT_IS_ENABLED())\r
+      {\r
+        /*  clear the sync pin interrupt, run sync pin ISR */\r
+        /*\r
+         *  NOTE!  The following macro clears the interrupt flag but it also *must*\r
+         *  reset the interrupt capture.  In other words, if a second interrupt\r
+         *  occurs after the flag is cleared it must be processed, i.e. this interrupt\r
+         *  exits then immediately starts again.  Most microcontrollers handle this\r
+         *  naturally but it must be verified for every target.\r
+         */\r
+        MRFI_CLEAR_SYNC_PIN_INT_FLAG();\r
+\r
+        Mrfi_SyncPinRxIsr();\r
+      }\r
+      else\r
+      {\r
+        /* Fatal error. SYNC interrupt is not supposed to happen at this time. */\r
+        MRFI_FORCE_ASSERT();\r
+      }\r
+    }\r
+    else\r
+    {\r
+      /* Fatal error. No other Radio interurpt is enabled. */\r
+      MRFI_FORCE_ASSERT();\r
+    }\r
+  }\r
+}\r
+\r
+\r
+/**************************************************************************************************\r
+ * @fn          MRFI_Rssi\r
+ *\r
+ * @brief       Returns "live" RSSI value\r
+ *\r
+ * @param       none\r
+ *\r
+ * @return      RSSI value in units of dBm.\r
+ **************************************************************************************************\r
+ */\r
+int8_t MRFI_Rssi(void)\r
+{\r
+  uint8_t regValue;\r
+\r
+  /* Radio must be in RX state to measure rssi. */\r
+  MRFI_ASSERT( mrfiRadioState == MRFI_RADIO_STATE_RX );\r
+\r
+  /* Wait for the RSSI to be valid:\r
+   * Just having the Radio ON is not enough to read\r
+   * the correct RSSI value. The Radio must in RX mode for\r
+   * a certain duration. This duration depends on\r
+   * the baud rate and the received signal strength itself.\r
+   */\r
+  MRFI_RSSI_VALID_WAIT();\r
+\r
+  /* Read the RSSI value */\r
+  regValue = MRFI_RADIO_REG_READ( RSSI );\r
+\r
+  /* convert and do offset compensation */\r
+  return( Mrfi_CalculateRssi(regValue) );\r
+}\r
+\r
+\r
+/**************************************************************************************************\r
+ * @fn          Mrfi_CalculateRssi\r
+ *\r
+ * @brief       Does binary to decimal conversion and offset compensation.\r
+ *\r
+ * @param       none\r
+ *\r
+ * @return      RSSI value in units of dBm.\r
+ **************************************************************************************************\r
+ */\r
+int8_t Mrfi_CalculateRssi(uint8_t rawValue)\r
+{\r
+  int16_t rssi;\r
+\r
+  /* The raw value is in 2's complement and in half db steps. Convert it to\r
+   * decimal taking into account the offset value.\r
+   */\r
+  if(rawValue >= 128)\r
+  {\r
+    rssi = (int16_t)(rawValue - 256)/2 - MRFI_RSSI_OFFSET;\r
+  }\r
+  else\r
+  {\r
+    rssi = (rawValue/2) - MRFI_RSSI_OFFSET;\r
+  }\r
+\r
+  /* Restrict this value to least value can be held in an 8 bit signed int */\r
+  if(rssi < -128)\r
+  {\r
+    rssi = -128;\r
+  }\r
+\r
+  return rssi;\r
+}\r
+\r
+/**************************************************************************************************\r
+ * @fn          MRFI_RandomByte\r
+ *\r
+ * @brief       Returns a random byte. This is a pseudo-random number generator.\r
+ *              The generated sequence will repeat every 256 values.\r
+ *              The sequence itself depends on the initial seed value.\r
+ *\r
+ * @param       none\r
+ *\r
+ * @return      a random byte\r
+ **************************************************************************************************\r
+ */\r
+uint8_t MRFI_RandomByte(void)\r
+{\r
+  mrfiRndSeed = (mrfiRndSeed*MRFI_RANDOM_MULTIPLIER) + MRFI_RANDOM_OFFSET;\r
+\r
+  return mrfiRndSeed;\r
+}\r
+\r
+/**************************************************************************************************\r
+ * @fn          Mrfi_RandomBackoffDelay\r
+ *\r
+ * @brief       -\r
+ *\r
+ * @param       none\r
+ *\r
+ * @return      none\r
+ **************************************************************************************************\r
+ */\r
+static void Mrfi_RandomBackoffDelay(void)\r
+{\r
+  uint8_t backoffs;\r
+  uint8_t i;\r
+\r
+  /* calculate random value for backoffs - 1 to 16 */\r
+  backoffs = (MRFI_RandomByte() & 0x0F) + 1;\r
+\r
+  /* delay for randomly computed number of backoff periods */\r
+  for (i=0; i<backoffs; i++)\r
+  {\r
+    Mrfi_DelayUsec( sBackoffHelper );\r
+  }\r
+}\r
+\r
+/****************************************************************************************************\r
+ * @fn          Mrfi_DelayUsec\r
+ *\r
+ * @brief       Execute a delay loop using HW timer. The macro actually used to do the delay\r
+ *              is not thread-safe. This routine makes the delay execution thread-safe by breaking\r
+ *              up the requested delay up into small chunks and executing each chunk as a critical\r
+ *              section. The chunk size is choosen to be the smallest value used by MRFI. The delay\r
+ *              is only approximate because of the overhead computations. It errs on the side of\r
+ *              being too long.\r
+ *\r
+ * input parameters\r
+ * @param   howLong - number of microseconds to delay\r
+ *\r
+ * @return      none\r
+ ****************************************************************************************************\r
+ */\r
+static void Mrfi_DelayUsec(uint16_t howLong)\r
+{\r
+  bspIState_t s;\r
+  uint16_t count = howLong/MRFI_MAX_DELAY_US;\r
+\r
+  if (howLong)\r
+  {\r
+    do\r
+    {\r
+      BSP_ENTER_CRITICAL_SECTION(s);\r
+      BSP_DELAY_USECS(MRFI_MAX_DELAY_US);\r
+      BSP_EXIT_CRITICAL_SECTION(s);\r
+    } while (count--);\r
+  }\r
+\r
+  return;\r
+}\r
+\r
+/****************************************************************************************************\r
+ * @fn          Mrfi_DelayUsecSem\r
+ *\r
+ * @brief       Execute a delay loop using a HW timer. See comments for Mrfi_DelayUsec().\r
+ *              Delay specified number of microseconds checking semaphore for\r
+ *              early-out. Run in a separate thread when the reply delay is\r
+ *              invoked. Cleaner then trying to make MRFI_DelayUsec() thread-safe\r
+ *              and reentrant.\r
+ *\r
+ * input parameters\r
+ * @param   howLong - number of microseconds to delay\r
+ *\r
+ * @return      none\r
+ ****************************************************************************************************\r
+ */\r
+static void Mrfi_DelayUsecSem(uint16_t howLong)\r
+{\r
+  bspIState_t s;\r
+  uint16_t count = howLong/MRFI_MAX_DELAY_US;\r
+\r
+  if (howLong)\r
+  {\r
+    do\r
+    {\r
+      BSP_ENTER_CRITICAL_SECTION(s);\r
+      BSP_DELAY_USECS(MRFI_MAX_DELAY_US);\r
+      BSP_EXIT_CRITICAL_SECTION(s);\r
+      if (sKillSem)\r
+      {\r
+        break;\r
+      }\r
+    } while (count--);\r
+  }\r
+\r
+  return;\r
+}\r
+\r
+/**************************************************************************************************\r
+ * @fn          MRFI_DelayMs\r
+ *\r
+ * @brief       Delay the specified number of milliseconds.\r
+ *\r
+ * @param       milliseconds - delay time\r
+ *\r
+ * @return      none\r
+ **************************************************************************************************\r
+ */\r
+void MRFI_DelayMs(uint16_t milliseconds)\r
+{\r
+  while (milliseconds)\r
+  {\r
+    Mrfi_DelayUsec( APP_USEC_VALUE );\r
+    milliseconds--;\r
+  }\r
+}\r
+\r
+/**************************************************************************************************\r
+ * @fn          MRFI_ReplyDelay\r
+ *\r
+ * @brief       Delay number of milliseconds scaled by data rate. Check semaphore for\r
+ *              early-out. Run in a separate thread when the reply delay is\r
+ *              invoked. Cleaner then trying to make MRFI_DelayMs() thread-safe\r
+ *              and reentrant.\r
+ *\r
+ * @param       none\r
+ *\r
+ * @return      none\r
+ **************************************************************************************************\r
+ */\r
+void MRFI_ReplyDelay(void)\r
+{\r
+  bspIState_t s;\r
+  uint16_t    milliseconds = sReplyDelayScalar;\r
+\r
+  BSP_ENTER_CRITICAL_SECTION(s);\r
+  sReplyDelayContext = 1;\r
+  BSP_EXIT_CRITICAL_SECTION(s);\r
+\r
+  while (milliseconds)\r
+  {\r
+    Mrfi_DelayUsecSem( APP_USEC_VALUE );\r
+    if (sKillSem)\r
+    {\r
+      break;\r
+    }\r
+    milliseconds--;\r
+  }\r
+\r
+  BSP_ENTER_CRITICAL_SECTION(s);\r
+  sKillSem           = 0;\r
+  sReplyDelayContext = 0;\r
+  BSP_EXIT_CRITICAL_SECTION(s);\r
+}\r
+\r
+/**************************************************************************************************\r
+ * @fn          MRFI_PostKillSem\r
+ *\r
+ * @brief       Post to the loop-kill semaphore that will be checked by the iteration loops\r
+ *              that control the delay thread.\r
+ *\r
+ * @param       none\r
+ *\r
+ * @return      none\r
+ **************************************************************************************************\r
+ */\r
+void MRFI_PostKillSem(void)\r
+{\r
+\r
+  if (sReplyDelayContext)\r
+  {\r
+    sKillSem = 1;\r
+  }\r
+\r
+  return;\r
+}\r
+\r
+/**************************************************************************************************\r
+ * @fn          MRFI_GetRadioState\r
+ *\r
+ * @brief       Returns the current radio state.\r
+ *\r
+ * @param       none\r
+ *\r
+ * @return      radio state - off/idle/rx\r
+ **************************************************************************************************\r
+ */\r
+uint8_t MRFI_GetRadioState(void)\r
+{\r
+  return mrfiRadioState;\r
+}\r
+\r
+\r
+/**************************************************************************************************\r
+ * @fn          MRFI_SetLogicalChannel\r
+ *\r
+ * @brief       Set logical channel.\r
+ *\r
+ * @param       chan - logical channel number\r
+ *\r
+ * @return      none\r
+ **************************************************************************************************\r
+ */\r
+void MRFI_SetLogicalChannel(uint8_t chan)\r
+{\r
+  /* logical channel is not valid? */\r
+  MRFI_ASSERT( chan < MRFI_NUM_LOGICAL_CHANS );\r
+\r
+  /* make sure radio is off before changing channels */\r
+  Mrfi_RxModeOff();\r
+\r
+  MRFI_RADIO_REG_WRITE( CHANNR, mrfiLogicalChanTable[chan] );\r
+\r
+  /* turn radio back on if it was on before channel change */\r
+  if(mrfiRadioState == MRFI_RADIO_STATE_RX)\r
+  {\r
+    Mrfi_RxModeOn();\r
+  }\r
+}\r
+\r
+/**************************************************************************************************\r
+ * @fn          MRFI_SetRFPwr\r
+ *\r
+ * @brief       Set ouput RF power level.\r
+ *\r
+ * @param       level - power level to be set\r
+ *\r
+ * @return      none\r
+ **************************************************************************************************\r
+ */\r
+void MRFI_SetRFPwr(uint8_t level)\r
+{\r
+  /* Power level is not valid? */\r
+  MRFI_ASSERT( level < MRFI_NUM_POWER_SETTINGS );\r
+\r
+  MRFI_RADIO_REG_WRITE(PATABLE, mrfiRFPowerTable[level]);\r
+\r
+  return;\r
+}\r
+/**************************************************************************************************\r
+ * @fn          MRFI_SetRxAddrFilter\r
+ *\r
+ * @brief       Set the address used for filtering received packets.\r
+ *\r
+ * @param       pAddr - pointer to address to use for filtering\r
+ *\r
+ * @return      zero     : successfully set filter address\r
+ *              non-zero : illegal address\r
+ **************************************************************************************************\r
+ */\r
+uint8_t MRFI_SetRxAddrFilter(uint8_t * pAddr)\r
+{\r
+  /*\r
+   *  If first byte of filter address match fir byte of broadcast address,\r
+   *  there is a conflict with hardware filtering.\r
+   */\r
+  if (pAddr[0] == mrfiBroadcastAddr[0])\r
+  {\r
+    /* unable to set filter address */\r
+    return( 1 );\r
+  }\r
+\r
+  /*\r
+   *  Set the hardware address register.  The hardware address filtering only recognizes\r
+   *  a single byte but this does provide at least some automatic hardware filtering.\r
+   */\r
+  MRFI_RADIO_REG_WRITE( ADDR, pAddr[0] );\r
+\r
+  /* save a copy of the filter address */\r
+  {\r
+    uint8_t i;\r
+\r
+    for (i=0; i<MRFI_ADDR_SIZE; i++)\r
+    {\r
+      mrfiRxFilterAddr[i] = pAddr[i];\r
+    }\r
+  }\r
+\r
+  /* successfully set filter address */\r
+  return( 0 );\r
+}\r
+\r
+\r
+/**************************************************************************************************\r
+ * @fn          MRFI_EnableRxAddrFilter\r
+ *\r
+ * @brief       Enable received packet filtering.\r
+ *\r
+ * @param       none\r
+ *\r
+ * @return      none\r
+ **************************************************************************************************\r
+ */\r
+void MRFI_EnableRxAddrFilter(void)\r
+{\r
+  MRFI_ASSERT(mrfiRxFilterAddr[0] != mrfiBroadcastAddr[0]); /* filter address must be set before enabling filter */\r
+\r
+  /* set flag to indicate filtering is enabled */\r
+  mrfiRxFilterEnabled = 1;\r
+\r
+  /* enable hardware filtering on the radio */\r
+  MRFI_RADIO_REG_WRITE( PKTCTRL1, PKTCTRL1_ADDR_FILTER_ON );\r
+}\r
+\r
+\r
+/**************************************************************************************************\r
+ * @fn          MRFI_DisableRxAddrFilter\r
+ *\r
+ * @brief       Disable received packet filtering.\r
+ *\r
+ * @param       pAddr - pointer to address to test for filtering\r
+ *\r
+ * @return      none\r
+ **************************************************************************************************\r
+ */\r
+void MRFI_DisableRxAddrFilter(void)\r
+{\r
+  /* clear flag that indicates filtering is enabled */\r
+  mrfiRxFilterEnabled = 0;\r
+\r
+  /* disable hardware filtering on the radio */\r
+  MRFI_RADIO_REG_WRITE( PKTCTRL1, PKTCTRL1_ADDR_FILTER_OFF );\r
+}\r
+\r
+\r
+/**************************************************************************************************\r
+ * @fn          Mrfi_RxAddrIsFiltered\r
+ *\r
+ * @brief       Determine if address is filtered.\r
+ *\r
+ * @param       none\r
+ *\r
+ * @return      zero     : address is not filtered\r
+ *              non-zero : address is filtered\r
+ **************************************************************************************************\r
+ */\r
+uint8_t Mrfi_RxAddrIsFiltered(uint8_t * pAddr)\r
+{\r
+  uint8_t i;\r
+  uint8_t addrByte;\r
+  uint8_t filterAddrMatches;\r
+  uint8_t broadcastAddrMatches;\r
+\r
+  /* first check to see if filtering is even enabled */\r
+  if (!mrfiRxFilterEnabled)\r
+  {\r
+    /*\r
+     *  Filtering is not enabled, so by definition the address is\r
+     *  not filtered.  Return zero to indicate address is not filtered.\r
+     */\r
+    return( 0 );\r
+  }\r
+\r
+  /* clear address byte match counts */\r
+  filterAddrMatches    = 0;\r
+  broadcastAddrMatches = 0;\r
+\r
+  /* loop through address to see if there is a match to filter address of broadcast address */\r
+  for (i=0; i<MRFI_ADDR_SIZE; i++)\r
+  {\r
+    /* get byte from address to check */\r
+    addrByte = pAddr[i];\r
+\r
+    /* compare byte to filter address byte */\r
+    if (addrByte == mrfiRxFilterAddr[i])\r
+    {\r
+      filterAddrMatches++;\r
+    }\r
+    if (addrByte == mrfiBroadcastAddr[i])\r
+    {\r
+      broadcastAddrMatches++;\r
+    }\r
+  }\r
+\r
+  /*\r
+   *  If address is *not* filtered, either the "filter address match count" or\r
+   *  the "broadcast address match count" will equal the total number of bytes\r
+   *  in the address.\r
+   */\r
+  if ((broadcastAddrMatches == MRFI_ADDR_SIZE) || (filterAddrMatches == MRFI_ADDR_SIZE))\r
+  {\r
+    /* address *not* filtered, return zero */\r
+    return( 0 );\r
+  }\r
+  else\r
+  {\r
+    /* address filtered, return non-zero */\r
+    return( 1 );\r
+  }\r
+}\r
+\r
+\r
+/**************************************************************************************************\r
+ *                                  Compile Time Integrity Checks\r
+ **************************************************************************************************\r
+ */\r
+\r
+/* calculate maximum value for PKTLEN and verify it directly */\r
+#define MRFI_RADIO_TX_FIFO_SIZE     64  /* from datasheet */\r
+#define MRFI_RADIO_MAX_PKTLEN       (MRFI_RADIO_TX_FIFO_SIZE - MRFI_LENGTH_FIELD_SIZE - MRFI_RX_METRICS_SIZE)\r
+#if (MRFI_RADIO_MAX_PKTLEN != 61)\r
+#error "ERROR:  The maximum value for PKTLEN is not correct."\r
+#endif\r
+\r
+/* verify setting for PKTLEN does not exceed maximum */\r
+#if (MRFI_SETTING_PKTLEN > MRFI_RADIO_MAX_PKTLEN)\r
+#error "ERROR:  Maximum possible value for PKTLEN exceeded.  Decrease value of maximum payload."\r
+#endif\r
+\r
+/* verify largest possible packet fits within FIFO buffer */\r
+#if ((MRFI_MAX_FRAME_SIZE + MRFI_RX_METRICS_SIZE) > MRFI_RADIO_TX_FIFO_SIZE)\r
+#error "ERROR:  Maximum possible packet length exceeds FIFO buffer.  Decrease value of maximum payload."\r
+#endif\r
+\r
+/* verify that the SmartRF file supplied is compatible */\r
+#if ((!defined SMARTRF_RADIO_CC430))\r
+  #error "ERROR:  The SmartRF export file is not compatible."\r
+#endif\r
+\r
+/*\r
+ *  These asserts happen if there is extraneous compiler padding of arrays.\r
+ *  Modify compiler settings for no padding, or, if that is not possible,\r
+ *  comment out the offending asserts.\r
+ */\r
+BSP_STATIC_ASSERT(sizeof(mrfiRadioCfg) == ((sizeof(mrfiRadioCfg)/sizeof(mrfiRadioCfg[0])) * sizeof(mrfiRadioCfg[0])));\r
+\r
+\r
+/*\r
+ *  These asserts happen if there is extraneous compiler padding of arrays.\r
+ *  Modify compiler settings for no padding, or, if that is not possible,\r
+ *  comment out the offending asserts.\r
+ */\r
+BSP_STATIC_ASSERT(sizeof(mrfiLogicalChanTable) == ((sizeof(mrfiLogicalChanTable)/sizeof(mrfiLogicalChanTable[0])) * sizeof(mrfiLogicalChanTable[0])));\r
+BSP_STATIC_ASSERT(sizeof(mrfiBroadcastAddr) == ((sizeof(mrfiBroadcastAddr)/sizeof(mrfiBroadcastAddr[0])) * sizeof(mrfiBroadcastAddr[0])));\r
+\r
+/**************************************************************************************************\r
+*/\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/Components/mrfi/radios/family5/mrfi_radio_interface.c b/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/Components/mrfi/radios/family5/mrfi_radio_interface.c
new file mode 100755 (executable)
index 0000000..99c5bd9
--- /dev/null
@@ -0,0 +1,374 @@
+/**************************************************************************************************\r
+  Revised:        $Date: 2009-11-23 07:50:43 -0800 (Mon, 23 Nov 2009) $\r
+  Revision:       $Revision: 21225 $\r
+\r
+  Copyright 2008-2009 Texas Instruments Incorporated.  All rights reserved.\r
+\r
+  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+  the terms of a software license agreement between the user who downloaded the software,\r
+  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+  License. The License limits your use, and you acknowledge, that the Software may not be\r
+  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+  perform, display or sell this Software and/or its documentation for any purpose.\r
+\r
+  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS?\r
+  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+\r
+  Should you have any questions regarding your right to use this Software,\r
+  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+/* ~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=\r
+ *   MRFI (Minimal RF Interface)\r
+ *   Radios: CC430\r
+ *   Radio Interface (RIF) code.\r
+ * ~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=\r
+ */\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                          Includes\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#include "mrfi_radio_interface.h"\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                            Defines\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                            Macros\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#define MRFI_RADIO_STATUS_READ_CLEAR()  RF1AIFCTL1 &= ~(RFSTATIFG);\r
+\r
+#define MRFI_RADIO_STATUS_READ_WAIT()  while( !(RF1AIFCTL1 & RFSTATIFG) );\r
+#define MRFI_RADIO_INST_WRITE_WAIT()   while( !(RF1AIFCTL1 & RFINSTRIFG));\r
+#define MRFI_RADIO_DATA_WRITE_WAIT()   while( !(RF1AIFCTL1 & RFDINIFG)  );\r
+#define MRFI_RADIO_DATA_READ_WAIT()    while( !(RF1AIFCTL1 & RFDOUTIFG) );\r
+\r
+#define MRFI_RIF_DEBUG\r
+#ifdef MRFI_RIF_DEBUG\r
+#define MRFI_RIF_ASSERT(x)      BSP_ASSERT(x)\r
+#else\r
+#define MRFI_RIF_ASSERT(x)\r
+#endif\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                       Local Prototypes\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+\r
+\r
+/**************************************************************************************************\r
+ * @fn          mrfiRadioInterfaceInit\r
+ *\r
+ * @brief       Initialize the Radio Interface\r
+ *\r
+ * @param       none\r
+ *\r
+ * @return      none\r
+ **************************************************************************************************\r
+ */\r
+void mrfiRadioInterfaceInit(void)\r
+{\r
+  /* Enable interrupt on interface error.\r
+   * The code behaves differently between different runs on the debugger, and seemingly fails\r
+   * due to error flags on the bench. The code does not fail, however, on functional tests.\r
+   * This points to problems with the debugger that need to be sorted through carefully.\r
+   * For the time being, remove the following line, since it will likely cause operational\r
+   * failures.\r
+   */\r
+  // RF1AIFCTL1 |= RFERRIE;\r
+}\r
+\r
+\r
+/**************************************************************************************************\r
+ * @fn          mrfiRadioInterfaceCmdStrobe\r
+ *\r
+ * @brief       Send command strobe to the radio.  Returns status byte read during transfer\r
+ *              of strobe command.\r
+ *\r
+ * @param       addr - address of register to strobe\r
+ *\r
+ * @return      status byte of radio\r
+ **************************************************************************************************\r
+ */\r
+uint8_t mrfiRadioInterfaceCmdStrobe(uint8_t addr)\r
+{\r
+  uint8_t statusByte, gdoState;\r
+  mrfiRIFIState_t s;\r
+\r
+  /* Check for invalid address.\r
+   * 0xBD is for SNOP with MSP set to read the bytes available in RX FIFO.\r
+   */\r
+  MRFI_RIF_ASSERT( (addr == 0xBD) || (addr >= RF_SRES) && (addr <= RF_SNOP));\r
+\r
+  /* Lock out access to Radio IF */\r
+  MRFI_RIF_ENTER_CRITICAL_SECTION(s);\r
+\r
+  /* Clear the Status read flag */\r
+  MRFI_RADIO_STATUS_READ_CLEAR();\r
+\r
+  /* Wait for radio to be ready for next instruction */\r
+  MRFI_RADIO_INST_WRITE_WAIT();\r
+\r
+  if ((addr > RF_SRES) && (addr < RF_SNOP))\r
+  {\r
+    /* buffer IOCFG2 state */\r
+    gdoState = MRFI_RADIO_REG_READ(IOCFG2);\r
+\r
+    /* c-ready to GDO2 */\r
+    MRFI_RADIO_REG_WRITE(IOCFG2, 0x29);\r
+\r
+    RF1AINSTRB = addr;\r
+\r
+    /* chip at sleep mode */\r
+    if ((RF1AIN & 0x04) == 0x04)\r
+    {\r
+      if ( (addr == RF_SXOFF) || (addr == RF_SPWD) || (addr == RF_SWOR) )\r
+      {\r
+        /* Do nothing */\r
+      }\r
+      else\r
+      {\r
+        /* c-ready */\r
+        while ((RF1AIN & 0x04) == 0x04);\r
+\r
+        /* Delay should be 760us */\r
+        Mrfi_DelayUsec(760);\r
+      }\r
+    }\r
+\r
+    /* restore IOCFG2 setting */\r
+    MRFI_RADIO_REG_WRITE(IOCFG2, gdoState);\r
+  }\r
+  else\r
+  {\r
+    /* chip active mode */\r
+    RF1AINSTRB = addr;\r
+  }\r
+\r
+  /* Read status byte */\r
+  statusByte = RF1ASTAT0B;\r
+\r
+  /* Allow access to Radio IF */\r
+  MRFI_RIF_EXIT_CRITICAL_SECTION(s);\r
+\r
+  /* return the status byte */\r
+  return statusByte;\r
+}\r
+\r
+\r
+/**************************************************************************************************\r
+ * @fn          mrfiRadioInterfaceReadReg\r
+ *\r
+ * @brief       Read value from radio register.\r
+ *\r
+ * @param       addr - address of register\r
+ *\r
+ * @return      register value\r
+ **************************************************************************************************\r
+ */\r
+uint8_t mrfiRadioInterfaceReadReg(uint8_t addr)\r
+{\r
+  mrfiRIFIState_t s;\r
+  uint8_t regValue;\r
+\r
+  /* Check for valid range. 0x3E is for PATABLE access */\r
+  MRFI_RIF_ASSERT( (addr <= 0x3B) || (addr == 0x3E) );\r
+\r
+  /* Lock out access to Radio IF */\r
+  MRFI_RIF_ENTER_CRITICAL_SECTION(s);\r
+\r
+  /* Wait for radio to be ready for next instruction */\r
+  MRFI_RADIO_INST_WRITE_WAIT();\r
+\r
+  if( (addr <= 0x2E) || (addr == 0x3E))\r
+  {\r
+    /* Write cmd: read the Configuration register */\r
+    RF1AINSTR1B = (0x80 | addr);\r
+  }\r
+  else\r
+  {\r
+    /* Write cmd: read the Status register */\r
+    RF1AINSTR1B = (0xC0 | addr);\r
+  }\r
+\r
+  /* Read out the register value */\r
+  regValue   = RF1ADOUT1B; //auto read\r
+\r
+  /* Allow access to Radio IF */\r
+  MRFI_RIF_EXIT_CRITICAL_SECTION(s);\r
+\r
+  return( regValue);\r
+}\r
+\r
+\r
+/**************************************************************************************************\r
+ * @fn          mrfiRadioInterfaceWriteReg\r
+ *\r
+ * @brief       Write value to radio register.\r
+ *\r
+ * @param       addr  - address of register\r
+ * @param       value - register value to write\r
+ *\r
+ * @return      none\r
+ **************************************************************************************************\r
+ */\r
+void mrfiRadioInterfaceWriteReg(uint8_t addr, uint8_t value)\r
+{\r
+  mrfiRIFIState_t s;\r
+\r
+  /* Check for valid range. 0x3E is for PATABLE access */\r
+  MRFI_RIF_ASSERT((addr <= 0x2E) || (addr == 0x3E));\r
+\r
+  /* Lock out access to Radio IF */\r
+  MRFI_RIF_ENTER_CRITICAL_SECTION(s);\r
+\r
+  /* Wait for radio to be ready for next instruction */\r
+  MRFI_RADIO_INST_WRITE_WAIT();\r
+\r
+  /* Write cmd: 'write to register' */\r
+  RF1AINSTRB = (0x00 | addr);\r
+\r
+  /* Wait for radio to be ready to accept the data */\r
+  MRFI_RADIO_DATA_WRITE_WAIT();\r
+\r
+  /* Write the register value */\r
+  RF1ADINB   = value; /* value to be written to the radio register */\r
+\r
+  /* Allow access to Radio IF */\r
+  MRFI_RIF_EXIT_CRITICAL_SECTION(s);\r
+}\r
+\r
+\r
+/**************************************************************************************************\r
+ * @fn          mrfiRadioInterfaceWriteTxFifo\r
+ *\r
+ * @brief       Write data to radio transmit FIFO.\r
+ *\r
+ * @param       pData - pointer for storing write data\r
+ * @param       len   - length of data in bytes\r
+ *\r
+ * @return      none\r
+ **************************************************************************************************\r
+ */\r
+void mrfiRadioInterfaceWriteTxFifo(uint8_t * pData, uint8_t len)\r
+{\r
+  mrfiRIFIState_t s;\r
+\r
+  MRFI_RIF_ASSERT(len != 0); /* zero length is not allowed */\r
+\r
+  /* Lock out access to Radio IF */\r
+  MRFI_RIF_ENTER_CRITICAL_SECTION(s);\r
+\r
+  /* Wait for radio to be ready for next instruction */\r
+  MRFI_RADIO_INST_WRITE_WAIT();\r
+\r
+  /* Write cmd: TXFIFOWR */\r
+  RF1AINSTRB = 0x7F;\r
+\r
+  do\r
+  {\r
+    /* Wait for radio to be ready to accept the data */\r
+    MRFI_RADIO_DATA_WRITE_WAIT();\r
+\r
+    /* Write one byte to FIFO */\r
+    RF1ADINB   = *pData;\r
+\r
+    pData++;\r
+    len--;\r
+\r
+  }while(len);\r
+\r
+  /* Allow access to Radio IF */\r
+  MRFI_RIF_EXIT_CRITICAL_SECTION(s);\r
+}\r
+\r
+\r
+/**************************************************************************************************\r
+ * @fn          mrfiRadioInterfaceReadRxFifo\r
+ *\r
+ * @brief       Read data from radio receive FIFO.\r
+ *\r
+ * @param       pData - pointer for storing read data\r
+ * @param       len   - length of data in bytes\r
+ *\r
+ * @return      none\r
+ **************************************************************************************************\r
+ */\r
+uint8_t method = 2;\r
+void mrfiRadioInterfaceReadRxFifo(uint8_t * pData, uint8_t len)\r
+{\r
+  mrfiRIFIState_t s;\r
+\r
+  MRFI_RIF_ASSERT(len != 0); /* zero length is not allowed */\r
+\r
+  /* Lock out access to Radio IF */\r
+  MRFI_RIF_ENTER_CRITICAL_SECTION(s);\r
+\r
+  if(method == 1)\r
+  {\r
+    /* Wait for radio to be ready for next instruction */\r
+    MRFI_RADIO_INST_WRITE_WAIT();\r
+\r
+    /* Write cmd: RXFIFORD */\r
+    RF1AINSTRB = 0xFF;\r
+\r
+    do\r
+    {\r
+      /* dummy write */\r
+      RF1ADINB = 0;\r
+\r
+      /* Wait for data to be available for reading */\r
+      MRFI_RADIO_DATA_READ_WAIT();\r
+\r
+      /* Read one byte from FIFO */\r
+      *pData = RF1ADOUT0B;\r
+\r
+      pData++;\r
+      len--;\r
+\r
+    }while(len);\r
+  }\r
+\r
+  if(method == 2)\r
+  {\r
+    do\r
+    {\r
+      /* Wait for radio to be ready for next instruction */\r
+      MRFI_RADIO_INST_WRITE_WAIT();\r
+\r
+      /* Write cmd: SNGLRXRD */\r
+      RF1AINSTR1B = 0xBF;\r
+\r
+      /* Read byte from FIFO */\r
+      *pData  = RF1ADOUT1B; //auto read register\r
+\r
+      pData++;\r
+      len--;\r
+\r
+    }while(len);\r
+  }\r
+\r
+  /* Allow access to Radio IF */\r
+  MRFI_RIF_EXIT_CRITICAL_SECTION(s);\r
+}\r
+\r
+\r
+/**************************************************************************************************\r
+*/\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/Components/mrfi/radios/family5/mrfi_radio_interface.h b/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/Components/mrfi/radios/family5/mrfi_radio_interface.h
new file mode 100755 (executable)
index 0000000..ebdacfc
--- /dev/null
@@ -0,0 +1,150 @@
+/**************************************************************************************************\r
+  Revised:        $Date: 2007-07-06 11:19:00 -0700 (Fri, 06 Jul 2007) $\r
+  Revision:       $Revision: 13579 $\r
+\r
+  Copyright 2007 Texas Instruments Incorporated.  All rights reserved.\r
+\r
+  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+  the terms of a software license agreement between the user who downloaded the software,\r
+  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+  License. The License limits your use, and you acknowledge, that the Software may not be\r
+  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+  perform, display or sell this Software and/or its documentation for any purpose.\r
+\r
+  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+\r
+  Should you have any questions regarding your right to use this Software,\r
+  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+/* ~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=\r
+ *   MRFI (Minimal RF Interface)\r
+ *   Radio interface code for CC430\r
+ * ~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=\r
+ */\r
+\r
+#ifndef MRFI_RADIO_INTERFACE_H\r
+#define MRFI_RADIO_INTERFACE_H\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                         Includes\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#include "bsp.h"\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                          Defines\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+\r
+/* configuration registers */\r
+#define IOCFG2      0x00      /*  IOCFG2   - GDO2 output pin configuration  */\r
+#define IOCFG1      0x01      /*  IOCFG1   - GDO1 output pin configuration  */\r
+#define IOCFG0      0x02      /*  IOCFG1   - GDO0 output pin configuration  */\r
+#define FIFOTHR     0x03      /*  FIFOTHR  - RX FIFO and TX FIFO thresholds */\r
+#define SYNC1       0x04      /*  SYNC1    - Sync word, high byte */\r
+#define SYNC0       0x05      /*  SYNC0    - Sync word, low byte */\r
+#define PKTLEN      0x06      /*  PKTLEN   - Packet length */\r
+#define PKTCTRL1    0x07      /*  PKTCTRL1 - Packet automation control */\r
+#define PKTCTRL0    0x08      /*  PKTCTRL0 - Packet automation control */\r
+#define ADDR        0x09      /*  ADDR     - Device address */\r
+#define CHANNR      0x0A      /*  CHANNR   - Channel number */\r
+#define FSCTRL1     0x0B      /*  FSCTRL1  - Frequency synthesizer control */\r
+#define FSCTRL0     0x0C      /*  FSCTRL0  - Frequency synthesizer control */\r
+#define FREQ2       0x0D      /*  FREQ2    - Frequency control word, high byte */\r
+#define FREQ1       0x0E      /*  FREQ1    - Frequency control word, middle byte */\r
+#define FREQ0       0x0F      /*  FREQ0    - Frequency control word, low byte */\r
+#define MDMCFG4     0x10      /*  MDMCFG4  - Modem configuration */\r
+#define MDMCFG3     0x11      /*  MDMCFG3  - Modem configuration */\r
+#define MDMCFG2     0x12      /*  MDMCFG2  - Modem configuration */\r
+#define MDMCFG1     0x13      /*  MDMCFG1  - Modem configuration */\r
+#define MDMCFG0     0x14      /*  MDMCFG0  - Modem configuration */\r
+#define DEVIATN     0x15      /*  DEVIATN  - Modem deviation setting */\r
+#define MCSM2       0x16      /*  MCSM2    - Main Radio Control State Machine configuration */\r
+#define MCSM1       0x17      /*  MCSM1    - Main Radio Control State Machine configuration */\r
+#define MCSM0       0x18      /*  MCSM0    - Main Radio Control State Machine configuration */\r
+#define FOCCFG      0x19      /*  FOCCFG   - Frequency Offset Compensation configuration */\r
+#define BSCFG       0x1A      /*  BSCFG    - Bit Synchronization configuration */\r
+#define AGCCTRL2    0x1B      /*  AGCCTRL2 - AGC control */\r
+#define AGCCTRL1    0x1C      /*  AGCCTRL1 - AGC control */\r
+#define AGCCTRL0    0x1D      /*  AGCCTRL0 - AGC control */\r
+#define WOREVT1     0x1E      /*  WOREVT1  - High byte Event0 timeout */\r
+#define WOREVT0     0x1F      /*  WOREVT0  - Low byte Event0 timeout */\r
+#define WORCTRL     0x20      /*  WORCTRL  - Wake On Radio control */\r
+#define FREND1      0x21      /*  FREND1   - Front end RX configuration */\r
+#define FREND0      0x22      /*  FREDN0   - Front end TX configuration */\r
+#define FSCAL3      0x23      /*  FSCAL3   - Frequency synthesizer calibration */\r
+#define FSCAL2      0x24      /*  FSCAL2   - Frequency synthesizer calibration */\r
+#define FSCAL1      0x25      /*  FSCAL1   - Frequency synthesizer calibration */\r
+#define FSCAL0      0x26      /*  FSCAL0   - Frequency synthesizer calibration */\r
+#define RCCTRL1     0x27      /*  RCCTRL1  - RC oscillator configuration */\r
+#define RCCTRL0     0x28      /*  RCCTRL0  - RC oscillator configuration */\r
+#define FSTEST      0x29      /*  FSTEST   - Frequency synthesizer calibration control */\r
+#define PTEST       0x2A      /*  PTEST    - Production test */\r
+#define AGCTEST     0x2B      /*  AGCTEST  - AGC test */\r
+#define TEST2       0x2C      /*  TEST2    - Various test settings */\r
+#define TEST1       0x2D      /*  TEST1    - Various test settings */\r
+#define TEST0       0x2E      /*  TEST0    - Various test settings */\r
+\r
+/* status registers */\r
+#define PARTNUM     0x30      /*  PARTNUM    - Chip ID */\r
+#define VERSION     0x31      /*  VERSION    - Chip ID */\r
+#define FREQEST     0x32      /*  FREQEST    \96 Frequency Offset Estimate from demodulator */\r
+#define LQI         0x33      /*  LQI        \96 Demodulator estimate for Link Quality */\r
+#define RSSI        0x34      /*  RSSI       \96 Received signal strength indication */\r
+#define MARCSTATE   0x35      /*  MARCSTATE  \96 Main Radio Control State Machine state */\r
+#define WORTIME1    0x36      /*  WORTIME1   \96 High byte of WOR time */\r
+#define WORTIME0    0x37      /*  WORTIME0   \96 Low byte of WOR time */\r
+#define PKTSTATUS   0x38      /*  PKTSTATUS  \96 Current GDOx status and packet status */\r
+#define VCO_VC_DAC  0x39      /*  VCO_VC_DAC \96 Current setting from PLL calibration module */\r
+#define TXBYTES     0x3A      /*  TXBYTES    \96 Underflow and number of bytes */\r
+#define RXBYTES     0x3B      /*  RXBYTES    \96 Overflow and number of bytes */\r
+\r
+/* burst write registers */\r
+#define PATABLE     0x3E      /*  PATABLE - PA control settings table */\r
+\r
+/* command strobe registers */\r
+#define SRES        0x30      /*  SRES    - Reset chip. */\r
+#define SFSTXON     0x31      /*  SFSTXON - Enable and calibrate frequency synthesizer. */\r
+#define SXOFF       0x32      /*  SXOFF   - Turn off crystal oscillator. */\r
+#define SCAL        0x33      /*  SCAL    - Calibrate frequency synthesizer and turn it off. */\r
+#define SRX         0x34      /*  SRX     - Enable RX. Perform calibration if enabled. */\r
+#define STX         0x35      /*  STX     - Enable TX. If in RX state, only enable TX if CCA passes. */\r
+#define SIDLE       0x36      /*  SIDLE   - Exit RX / TX, turn off frequency synthesizer. */\r
+#define SRSVD       0x37      /*  SRVSD   - Reserved.  Do not use. */\r
+#define SWOR        0x38      /*  SWOR    - Start automatic RX polling sequence (Wake-on-Radio) */\r
+#define SPWD        0x39      /*  SPWD    - Enter power down mode when CSn goes high. */\r
+#define SFRX        0x3A      /*  SFRX    - Flush the RX FIFO buffer. */\r
+#define SFTX        0x3B      /*  SFTX    - Flush the TX FIFO buffer. */\r
+#define SWORRST     0x3C      /*  SWORRST - Reset real time clock. */\r
+#define SNOP        0x3D      /*  SNOP    - No operation. Returns status byte. */\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                         Prototypes\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+void mrfiRadioInterfaceInit(void);\r
+void mrfiRadioInterfaceWriteReg(uint8_t addr, uint8_t value);\r
+void mrfiRadioInterfaceWriteTxFifo(uint8_t * pWriteData, uint8_t len);\r
+void mrfiRadioInterfaceReadRxFifo(uint8_t * pReadData, uint8_t len);\r
+\r
+uint8_t mrfiRadioInterfaceCmdStrobe(uint8_t addr);\r
+uint8_t mrfiRadioInterfaceReadReg(uint8_t addr);\r
+\r
+/**************************************************************************************************\r
+ */\r
+#endif\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/Components/mrfi/smartrf/CC1101/smartrf_CC1101.h b/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/Components/mrfi/smartrf/CC1101/smartrf_CC1101.h
new file mode 100755 (executable)
index 0000000..f014b1a
--- /dev/null
@@ -0,0 +1,130 @@
+/***************************************************************\r
+ *  SmartRF Studio(tm) Export\r
+ *\r
+ *  Radio register settings specifed with C-code\r
+ *  compatible #define statements.\r
+ *\r
+ ***************************************************************/\r
+\r
+#ifndef SMARTRF_CC1101_H\r
+#define SMARTRF_CC1101_H\r
+\r
+// ISM_EU configuration\r
+//\r
+// Chipcon\r
+// Product = CC1101\r
+// Chip version = A   (VERSION = 0x04)\r
+// Crystal accuracy = 10 ppm\r
+// X-tal frequency = 26 MHz\r
+// RF output power = 0 dBm\r
+// RX filterbandwidth = 232.142857 kHz\r
+// Deviation = 32 kHz\r
+// Datarate = 76.766968 kBaud\r
+// Modulation = (1) GFSK\r
+// Manchester enable = (0) Manchester disabled\r
+// RF Frequency = 869.524963 MHz\r
+// Channel spacing = 199.951172 kHz\r
+// Channel number = 0\r
+// Optimization = -\r
+// Sync mode = (3) 30/32 sync word bits detected\r
+// Format of RX/TX data = (0) Normal mode, use FIFOs for RX and TX\r
+// CRC operation = (1) CRC calculation in TX and CRC check in RX enabled\r
+// Forward Error Correction = (0) FEC disabled\r
+// Length configuration = (1) Variable length packets, packet length configured by the first received byte after sync word.\r
+// Packetlength = 255\r
+// Preamble count = (2)  4 bytes\r
+// Append status = 1\r
+// Address check = (0) No address check\r
+// FIFO autoflush = 0\r
+// Device address = 0\r
+// GDO0 signal selection = ( 6) Asserts when sync word has been sent / received, and de-asserts at the end of the packet\r
+// GDO2 signal selection = (41) CHIP_RDY\r
+\r
+// ISM_US configuration\r
+//\r
+// Chipcon\r
+// Product = CC1101\r
+// Chip version = A   (VERSION = 0x04)\r
+// Crystal accuracy = 10 ppm\r
+// X-tal frequency = 26 MHz\r
+// RF output power = 0 dBm\r
+// RX filterbandwidth = 232.142857 kHz\r
+// Deviation = 32 kHz\r
+// Datarate = 76.766968 kBaud\r
+// Modulation = (1) GFSK\r
+// Manchester enable = (0) Manchester disabled\r
+// RF Frequency = 905.998993 MHz\r
+// Channel spacing = 199.951172 kHz\r
+// Channel number = 0\r
+// Optimization = -\r
+// Sync mode = (3) 30/32 sync word bits detected\r
+// Format of RX/TX data = (0) Normal mode, use FIFOs for RX and TX\r
+// CRC operation = (1) CRC calculation in TX and CRC check in RX enabled\r
+// Forward Error Correction = (0) FEC disabled\r
+// Length configuration = (1) Variable length packets, packet length configured by the first received byte after sync word.\r
+// Packetlength = 255\r
+// Preamble count = (2)  4 bytes\r
+// Append status = 1\r
+// Address check = (0) No address check\r
+// FIFO autoflush = 0\r
+// Device address = 0\r
+// GDO0 signal selection = ( 6) Asserts when sync word has been sent / received, and de-asserts at the end of the packet\r
+// GDO2 signal selection = (41) CHIP_RDY\r
+\r
+#define SMARTRF_RADIO_CC1101\r
+\r
+#define SMARTRF_SETTING_FSCTRL1    0x08\r
+#define SMARTRF_SETTING_FSCTRL0    0x00\r
+#ifdef ISM_EU\r
+       #define SMARTRF_SETTING_FREQ2      0x21\r
+       #define SMARTRF_SETTING_FREQ1      0x71\r
+       #define SMARTRF_SETTING_FREQ0      0x7A\r
+#else\r
+  #ifdef ISM_US  \r
+    // 902MHz (CHANNR=20->906MHz)\r
+    #define SMARTRF_SETTING_FREQ2      0x22\r
+    #define SMARTRF_SETTING_FREQ1      0xB1\r
+    #define SMARTRF_SETTING_FREQ0      0x3B\r
+  #else\r
+       #ifdef ISM_LF\r
+               // 433.92MHz\r
+           #define SMARTRF_SETTING_FREQ2      0x10\r
+           #define SMARTRF_SETTING_FREQ1      0xB0\r
+           #define SMARTRF_SETTING_FREQ0      0x71\r
+       #else\r
+               #error "Wrong ISM band specified (valid are ISM_LF, ISM_EU and ISM_US)"\r
+       #endif // ISM_LF\r
+  #endif // ISM_US\r
+#endif // ISM_EU\r
+#define SMARTRF_SETTING_MDMCFG4    0x7B\r
+#define SMARTRF_SETTING_MDMCFG3    0x83\r
+#define SMARTRF_SETTING_MDMCFG2    0x13\r
+#define SMARTRF_SETTING_MDMCFG1    0x22\r
+#define SMARTRF_SETTING_MDMCFG0    0xF8\r
+#define SMARTRF_SETTING_CHANNR     0x00\r
+#define SMARTRF_SETTING_DEVIATN    0x42\r
+#define SMARTRF_SETTING_FREND1     0xB6\r
+#define SMARTRF_SETTING_FREND0     0x10\r
+#define SMARTRF_SETTING_MCSM0      0x18\r
+#define SMARTRF_SETTING_FOCCFG     0x1D\r
+#define SMARTRF_SETTING_BSCFG      0x1C\r
+#define SMARTRF_SETTING_AGCCTRL2   0xC7\r
+#define SMARTRF_SETTING_AGCCTRL1   0x00\r
+#define SMARTRF_SETTING_AGCCTRL0   0xB2\r
+#define SMARTRF_SETTING_FSCAL3     0xEA\r
+#define SMARTRF_SETTING_FSCAL2     0x2A\r
+#define SMARTRF_SETTING_FSCAL1     0x00\r
+#define SMARTRF_SETTING_FSCAL0     0x1F\r
+#define SMARTRF_SETTING_FSTEST     0x59\r
+#define SMARTRF_SETTING_TEST2      0x81\r
+#define SMARTRF_SETTING_TEST1      0x35\r
+#define SMARTRF_SETTING_TEST0      0x09\r
+#define SMARTRF_SETTING_FIFOTHR    0x47\r
+#define SMARTRF_SETTING_IOCFG2     0x29\r
+#define SMARTRF_SETTING_IOCFG0D    0x06\r
+#define SMARTRF_SETTING_PKTCTRL1   0x04\r
+#define SMARTRF_SETTING_PKTCTRL0   0x05\r
+#define SMARTRF_SETTING_ADDR       0x00\r
+#define SMARTRF_SETTING_PKTLEN     0xFF\r
+\r
+#endif // SMARTRF_CC1101_H\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/Components/mrfi/smartrf/CC430/smartrf_CC430.h b/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/Components/mrfi/smartrf/CC430/smartrf_CC430.h
new file mode 100755 (executable)
index 0000000..fc6b49e
--- /dev/null
@@ -0,0 +1,164 @@
+/***************************************************************\r
+ *  SmartRF Studio(tm) Export\r
+ *\r
+ *  Radio register settings specifed with C-code\r
+ *  compatible #define statements.\r
+ *\r
+ ***************************************************************/\r
+\r
+#ifndef SMARTRF_CC430_H\r
+#define SMARTRF_CC430_H\r
+\r
+// [BM] Modified radio settings for 433MHz, 868MHz, 915MHz \r
+\r
+// ISM_LF configuration\r
+//\r
+// Chipcon\r
+// Product = CC1101\r
+// Chip version = A   (VERSION = 0x04)\r
+// Crystal accuracy = 10 ppm\r
+// X-tal frequency = 26 MHz\r
+// RF output power = 0 dBm\r
+// RX filterbandwidth = 232.142857 kHz\r
+// Deviation = 32 kHz\r
+// Datarate = 76.766968 kBaud\r
+// Modulation = (1) GFSK\r
+// Manchester enable = (0) Manchester disabled\r
+// RF Frequency = 433.92 MHz\r
+// Channel spacing = 199.951172 kHz\r
+// Channel number = 0\r
+// Optimization = -\r
+// Sync mode = (3) 30/32 sync word bits detected\r
+// Format of RX/TX data = (0) Normal mode, use FIFOs for RX and TX\r
+// CRC operation = (1) CRC calculation in TX and CRC check in RX enabled\r
+// Forward Error Correction = (0) FEC disabled\r
+// Length configuration = (1) Variable length packets, packet length configured by the first received byte after sync word.\r
+// Packetlength = 255\r
+// Preamble count = (2)  4 bytes\r
+// Append status = 1\r
+// Address check = (0) No address check\r
+// FIFO autoflush = 0\r
+// Device address = 0\r
+// GDO0 signal selection = ( 6) Asserts when sync word has been sent / received, and de-asserts at the end of the packet\r
+// GDO2 signal selection = (41) CHIP_RDY\r
+\r
+// ISM_EU configuration\r
+//\r
+// Chipcon\r
+// Product = CC1101\r
+// Chip version = A   (VERSION = 0x04)\r
+// Crystal accuracy = 10 ppm\r
+// X-tal frequency = 26 MHz\r
+// RF output power = 0 dBm\r
+// RX filterbandwidth = 232.142857 kHz\r
+// Deviation = 32 kHz\r
+// Datarate = 76.766968 kBaud\r
+// Modulation = (1) GFSK\r
+// Manchester enable = (0) Manchester disabled\r
+// RF Frequency = 869.524963 MHz\r
+// Channel spacing = 199.951172 kHz\r
+// Channel number = 0\r
+// Optimization = -\r
+// Sync mode = (3) 30/32 sync word bits detected\r
+// Format of RX/TX data = (0) Normal mode, use FIFOs for RX and TX\r
+// CRC operation = (1) CRC calculation in TX and CRC check in RX enabled\r
+// Forward Error Correction = (0) FEC disabled\r
+// Length configuration = (1) Variable length packets, packet length configured by the first received byte after sync word.\r
+// Packetlength = 255\r
+// Preamble count = (2)  4 bytes\r
+// Append status = 1\r
+// Address check = (0) No address check\r
+// FIFO autoflush = 0\r
+// Device address = 0\r
+// GDO0 signal selection = ( 6) Asserts when sync word has been sent / received, and de-asserts at the end of the packet\r
+// GDO2 signal selection = (41) CHIP_RDY\r
+\r
+// ISM_US configuration\r
+//\r
+// Chipcon\r
+// Product = CC1101\r
+// Chip version = A   (VERSION = 0x04)\r
+// Crystal accuracy = 10 ppm\r
+// X-tal frequency = 26 MHz\r
+// RF output power = 0 dBm\r
+// RX filterbandwidth = 232.142857 kHz\r
+// Deviation = 32 kHz\r
+// Datarate = 76.766968 kBaud\r
+// Modulation = (1) GFSK\r
+// Manchester enable = (0) Manchester disabled\r
+// RF Frequency = 905.998993 MHz\r
+// Channel spacing = 199.951172 kHz\r
+// Channel number = 0\r
+// Optimization = -\r
+// Sync mode = (3) 30/32 sync word bits detected\r
+// Format of RX/TX data = (0) Normal mode, use FIFOs for RX and TX\r
+// CRC operation = (1) CRC calculation in TX and CRC check in RX enabled\r
+// Forward Error Correction = (0) FEC disabled\r
+// Length configuration = (1) Variable length packets, packet length configured by the first received byte after sync word.\r
+// Packetlength = 255\r
+// Preamble count = (2)  4 bytes\r
+// Append status = 1\r
+// Address check = (0) No address check\r
+// FIFO autoflush = 0\r
+// Device address = 0\r
+// GDO0 signal selection = ( 6) Asserts when sync word has been sent / received, and de-asserts at the end of the packet\r
+// GDO2 signal selection = (41) CHIP_RDY\r
+\r
+#define SMARTRF_RADIO_CC430\r
+\r
+#define SMARTRF_SETTING_FSCTRL1    0x08\r
+#define SMARTRF_SETTING_FSCTRL0    0x00\r
+#ifdef ISM_EU\r
+       // 869.50MHz\r
+       #define SMARTRF_SETTING_FREQ2      0x21\r
+       #define SMARTRF_SETTING_FREQ1      0x71\r
+       #define SMARTRF_SETTING_FREQ0      0x7A\r
+#else\r
+  #ifdef ISM_US  \r
+    // 902MHz (CHANNR=20->906MHz)\r
+    #define SMARTRF_SETTING_FREQ2      0x22\r
+    #define SMARTRF_SETTING_FREQ1      0xB1\r
+    #define SMARTRF_SETTING_FREQ0      0x3B\r
+  #else\r
+       #ifdef ISM_LF\r
+               // 433.92MHz\r
+           #define SMARTRF_SETTING_FREQ2      0x10\r
+           #define SMARTRF_SETTING_FREQ1      0xB0\r
+           #define SMARTRF_SETTING_FREQ0      0x71\r
+       #else\r
+               #error "Wrong ISM band specified (valid are ISM_LF, ISM_EU and ISM_US)"\r
+       #endif // ISM_LF\r
+  #endif // ISM_US\r
+#endif // ISM_EU\r
+#define SMARTRF_SETTING_MDMCFG4    0x7B\r
+#define SMARTRF_SETTING_MDMCFG3    0x83\r
+#define SMARTRF_SETTING_MDMCFG2    0x13\r
+#define SMARTRF_SETTING_MDMCFG1    0x22\r
+#define SMARTRF_SETTING_MDMCFG0    0xF8\r
+#define SMARTRF_SETTING_CHANNR     0x00\r
+#define SMARTRF_SETTING_DEVIATN    0x42\r
+#define SMARTRF_SETTING_FREND1     0xB6\r
+#define SMARTRF_SETTING_FREND0     0x10\r
+#define SMARTRF_SETTING_MCSM0      0x18\r
+#define SMARTRF_SETTING_FOCCFG     0x1D\r
+#define SMARTRF_SETTING_BSCFG      0x1C\r
+#define SMARTRF_SETTING_AGCCTRL2   0xC7\r
+#define SMARTRF_SETTING_AGCCTRL1   0x00\r
+#define SMARTRF_SETTING_AGCCTRL0   0xB2\r
+#define SMARTRF_SETTING_FSCAL3     0xEA\r
+#define SMARTRF_SETTING_FSCAL2     0x2A\r
+#define SMARTRF_SETTING_FSCAL1     0x00\r
+#define SMARTRF_SETTING_FSCAL0     0x1F\r
+#define SMARTRF_SETTING_FSTEST     0x59\r
+#define SMARTRF_SETTING_TEST2      0x81\r
+#define SMARTRF_SETTING_TEST1      0x35\r
+#define SMARTRF_SETTING_TEST0      0x09\r
+#define SMARTRF_SETTING_FIFOTHR    0x47\r
+#define SMARTRF_SETTING_IOCFG2     0x29\r
+#define SMARTRF_SETTING_IOCFG0D    0x06\r
+#define SMARTRF_SETTING_PKTCTRL1   0x04\r
+#define SMARTRF_SETTING_PKTCTRL0   0x05\r
+#define SMARTRF_SETTING_ADDR       0x00\r
+#define SMARTRF_SETTING_PKTLEN     0xFF\r
+\r
+#endif // SMARTRF_CC430_H\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/Components/nwk/nwk.c b/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/Components/nwk/nwk.c
new file mode 100755 (executable)
index 0000000..e02c77c
--- /dev/null
@@ -0,0 +1,1078 @@
+/**************************************************************************************************\r
+  Filename:       nwk.c\r
+  Revised:        $Date: 2009-03-11 15:29:07 -0700 (Wed, 11 Mar 2009) $\r
+  Revision:       $Revision: 19382 $\r
+  Author          $Author: lfriedman $\r
+\r
+  Description:    This file supports the SimpliciTI network layer.\r
+\r
+  Copyright 2007-2009 Texas Instruments Incorporated. All rights reserved.\r
+\r
+  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+  the terms of a software license agreement between the user who downloaded the software,\r
+  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+  License. The License limits your use, and you acknowledge, that the Software may not be\r
+  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+  perform, display or sell this Software and/or its documentation for any purpose.\r
+\r
+  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+\r
+  Should you have any questions regarding your right to use this Software,\r
+  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+/******************************************************************************\r
+ * INCLUDES\r
+ */\r
+#include <string.h>\r
+#include "bsp.h"\r
+#include "mrfi.h"\r
+#include "nwk_types.h"\r
+#include "nwk_frame.h"\r
+#include "nwk.h"\r
+#include "nwk_app.h"\r
+#include "nwk_globals.h"\r
+#include "nwk_QMgmt.h"\r
+\r
+/******************************************************************************\r
+ * MACROS\r
+ */\r
+/************************* NETWORK MANIFEST CONSTANT SANITY CHECKS ****************************/\r
+#if !defined(ACCESS_POINT) && !defined(RANGE_EXTENDER) && !defined(END_DEVICE)\r
+#error ERROR: No SimpliciTI device type defined\r
+#endif\r
+\r
+#if defined(END_DEVICE) && !defined(RX_POLLS)\r
+#define RX_USER\r
+#endif\r
+\r
+#ifndef MAX_HOPS\r
+#define MAX_HOPS  3\r
+#elif MAX_HOPS > 4\r
+#error ERROR: MAX_HOPS must be 4 or fewer\r
+#endif\r
+\r
+#ifndef MAX_APP_PAYLOAD\r
+#error ERROR: MAX_APP_PAYLOAD must be defined\r
+#endif\r
+\r
+#if ( MAX_PAYLOAD < MAX_FREQ_APP_FRAME )\r
+#error ERROR: Application payload size too small for Frequency frame\r
+#endif\r
+\r
+#if ( MAX_PAYLOAD < MAX_JOIN_APP_FRAME )\r
+#error ERROR: Application payload size too small for Join frame\r
+#endif\r
+\r
+#if ( MAX_PAYLOAD < MAX_LINK_APP_FRAME )\r
+#error ERROR: Application payload size too small for Link frame\r
+#endif\r
+\r
+#if ( MAX_PAYLOAD < MAX_MGMT_APP_FRAME )\r
+#error ERROR: Application payload size too small for Management frame\r
+#endif\r
+\r
+#if ( MAX_PAYLOAD < MAX_SEC_APP_FRAME )\r
+#error ERROR: Application payload size too small for Security frame\r
+#endif\r
+\r
+#if ( MAX_PAYLOAD < MAX_PING_APP_FRAME )\r
+#error ERROR: Application payload size too small for Ping frame\r
+#endif\r
+\r
+#if NWK_FREQ_TBL_SIZE < 1\r
+#error ERROR: NWK_FREQ_TBL_SIZE must be > 0\r
+#endif\r
+\r
+/************************* END NETWORK MANIFEST CONSTANT SANITY CHECKS ************************/\r
+\r
+/******************************************************************************\r
+ * CONSTANTS AND DEFINES\r
+ */\r
+#define SYS_NUM_CONNECTIONS   (NUM_CONNECTIONS+1)\r
+\r
+/* Increment this if the persistentContext_t structure is changed. It will help\r
+ * detect the upgrade context: any saved values will have a version with a\r
+ * lower number.\r
+ */\r
+#define  CONNTABLEINFO_STRUCTURE_VERSION   1\r
+\r
+#define  SIZEOF_NV_OBJ   sizeof(sPersistInfo)\r
+\r
+/******************************************************************************\r
+ * TYPEDEFS\r
+ */\r
+/* This structure aggregates eveything necessary to save if we want to restore\r
+ * the connection information later.\r
+ */\r
+typedef struct\r
+{\r
+  const uint8_t    structureVersion; /* to dectect upgrades... */\r
+        uint8_t    numConnections;   /* count includes the UUD port/link ID */\r
+/* The next two are used to detect overlapping port assignments. When _sending_ a\r
+ * link frame the local port is assigned from the top down. When sending a _reply_\r
+ * the assignment is bottom up. Overlapping assignments are rejected. That said it\r
+ * is extremely unlikely that this will ever happen. If it does the test implemented\r
+ * here is overly cautious (it will reject assignments when it needn't). But we leave\r
+ * it that way on the assumption that it will never happen anyway.\r
+ */\r
+        uint8_t    curNextLinkPort;\r
+        uint8_t    curMaxReplyPort;\r
+        linkID_t   nextLinkID;\r
+#ifdef ACCESS_POINT\r
+        sfInfo_t   sSandFContext;\r
+#endif\r
+/* Connection table entries last... */\r
+        connInfo_t connStruct[SYS_NUM_CONNECTIONS];\r
+} persistentContext_t;\r
+\r
+/******************************************************************************\r
+ * LOCAL VARIABLES\r
+ */\r
+\r
+/* This will be overwritten if we restore the structure from NV for example.\r
+ * Note that restoring will not permit overwriting the version element as it\r
+ * is declared 'const'.\r
+ */\r
+static persistentContext_t sPersistInfo = {CONNTABLEINFO_STRUCTURE_VERSION};\r
+\r
+/******************************************************************************\r
+ * LOCAL FUNCTIONS\r
+ */\r
+static uint8_t map_lid2idx(linkID_t, uint8_t *);\r
+static void    initializeConnection(connInfo_t *);\r
+\r
+/******************************************************************************\r
+ * GLOBAL VARIABLES\r
+ */\r
+\r
+/******************************************************************************\r
+ * GLOBAL FUNCTIONS\r
+ */\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_nwkInit\r
+ *\r
+ * @brief       Initialize NWK conext.\r
+ *\r
+ * input parameters\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   Status of operation.\r
+ */\r
+smplStatus_t nwk_nwkInit(uint8_t (*f)(linkID_t))\r
+{\r
+  // [BM] Added variable\r
+  uint8_t i;\r
+       \r
+  /* Truly ugly initialization because CCE won't initialize properly. Must\r
+   * skip first const element. Yuk.\r
+   */\r
+  memset((((uint8_t *)&sPersistInfo)+1), 0x0, (sizeof(sPersistInfo)-1));\r
+  /* OK. The zeroed elements are set. Now go back and do fixups...  */\r
+\r
+  sPersistInfo.numConnections   = SYS_NUM_CONNECTIONS;\r
+  sPersistInfo.curNextLinkPort  = SMPL_PORT_USER_MAX;\r
+  sPersistInfo.curMaxReplyPort  = PORT_BASE_NUMBER;\r
+  sPersistInfo.nextLinkID       = 1;\r
+\r
+  /* initialize globals */\r
+  nwk_globalsInit();\r
+\r
+  /* initialize frame processing */\r
+  nwk_frameInit(f);\r
+\r
+  /* initialize queue manager */\r
+  nwk_QInit();\r
+       \r
+  /* initialize each network application. */\r
+  nwk_freqInit();\r
+  nwk_pingInit();\r
+  nwk_joinInit(f);\r
+  nwk_mgmtInit();\r
+  nwk_linkInit();\r
+  nwk_securityInit();\r
+  \r
+  // [BM] Workaround to enable stack restarting\r
+  for (i=0; i<SYS_NUM_CONNECTIONS; ++i)\r
+  {\r
+       sPersistInfo.connStruct[i].connState = CONNSTATE_FREE;\r
+  }\r
+\r
+  /* set up the last connection as the broadcast port mapped to the broadcast Link ID */\r
+  if (CONNSTATE_FREE == sPersistInfo.connStruct[NUM_CONNECTIONS].connState)\r
+  {\r
+    sPersistInfo.connStruct[NUM_CONNECTIONS].connState   = CONNSTATE_CONNECTED;\r
+    sPersistInfo.connStruct[NUM_CONNECTIONS].hops2target = MAX_HOPS;\r
+    sPersistInfo.connStruct[NUM_CONNECTIONS].portRx      = SMPL_PORT_USER_BCAST;\r
+    sPersistInfo.connStruct[NUM_CONNECTIONS].portTx      = SMPL_PORT_USER_BCAST;\r
+    sPersistInfo.connStruct[NUM_CONNECTIONS].thisLinkID  = SMPL_LINKID_USER_UUD;\r
+    /* set peer address to broadcast so it is used when Application sends to the broadcast Link ID */\r
+    memcpy(sPersistInfo.connStruct[NUM_CONNECTIONS].peerAddr, nwk_getBCastAddress(), NET_ADDR_SIZE);\r
+  }\r
+\r
+  return SMPL_SUCCESS;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_getNextConnection\r
+ *\r
+ * @brief       Return the next free connection structure if on is available.\r
+ *\r
+ * input parameters\r
+ *\r
+ * output parameters\r
+ *      The returned structure has the Rx port number populated based on the\r
+ *      free strucure found. This is the port queried when the app wants to\r
+ *      do a receive.\r
+ *\r
+ * @return   pointer to the new connInfo_t structure. NULL if there is\r
+ *           no room in connection structure array.\r
+ */\r
+connInfo_t *nwk_getNextConnection()\r
+{\r
+  uint8_t  i;\r
+\r
+  for (i=0; i<SYS_NUM_CONNECTIONS; ++i)\r
+  {\r
+    if (sPersistInfo.connStruct[i].connState == CONNSTATE_CONNECTED)\r
+    {\r
+      continue;\r
+    }\r
+    break;\r
+  }\r
+\r
+  if (SYS_NUM_CONNECTIONS == i)\r
+  {\r
+    return (connInfo_t *)0;\r
+  }\r
+\r
+  initializeConnection(&sPersistInfo.connStruct[i]);\r
+\r
+  return &sPersistInfo.connStruct[i];\r
+}\r
+\r
+/************************************************************************************\r
+ * @fn          initializeConnection\r
+ *\r
+ * @brief       Initialize some elements of a Connection table entry.\r
+ *\r
+ * input parameters\r
+ * @param   pCInfo  - pointer to Connection Table entry to initialize. The file\r
+ *                    scope variable holding the next link ID value is also updated.\r
+ *\r
+ * output parameters\r
+ * @param   pCInfo  - certain elements are set to specific values.\r
+ *\r
+ *\r
+ * @return   void\r
+ */\r
+static void initializeConnection(connInfo_t *pCInfo)\r
+{\r
+  linkID_t *locLID = &sPersistInfo.nextLinkID;\r
+  uint8_t   tmp;\r
+\r
+    /* this element will be populated during the exchange with the peer. */\r
+  pCInfo->portTx = 0;\r
+\r
+  pCInfo->connState  =  CONNSTATE_CONNECTED;\r
+  pCInfo->thisLinkID = *locLID;\r
+\r
+  /* Generate the next Link ID. This isn't foolproof. If the count wraps\r
+   * we can end up with confusing duplicates. We can protect aginst using\r
+   * one that is already in use but we can't protect against a stale Link ID\r
+   * remembered by an application that doesn't know its connection has been\r
+   * torn down. The test for 0 will hopefully never be true (indicating a wrap).\r
+   */\r
+  (*locLID)++;\r
+\r
+  while (!*locLID || (*locLID == SMPL_LINKID_USER_UUD) || map_lid2idx(*locLID, &tmp))\r
+  {\r
+    (*locLID)++;\r
+  }\r
+\r
+  return;\r
+}\r
+\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_freeConnection\r
+ *\r
+ * @brief       Return the connection structure to the free pool. Currently\r
+ *              this routine is only called when a link freame is sent and\r
+ *              no reply is received so the freeing steps are pretty simple.\r
+ *              But eventually this will be more complex so this place-holder\r
+ *              is introduced.\r
+ *\r
+ * input parameters\r
+ * @param   pCInfo    - pointer to entry to be freed\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   None.\r
+ */\r
+void nwk_freeConnection(connInfo_t *pCInfo)\r
+{\r
+#if NUM_CONNECTIONS > 0\r
+  pCInfo->connState = CONNSTATE_FREE;\r
+#endif\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_getConnInfo\r
+ *\r
+ * @brief       Return the connection info structure to which the input Link ID maps.\r
+ *\r
+ * input parameters\r
+ * @param   port    - port for which mapping desired\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   pointer to connInfo_t structure found. NULL if no mapping\r
+ *           found or entry not valid.\r
+ */\r
+connInfo_t *nwk_getConnInfo(linkID_t linkID)\r
+{\r
+  uint8_t idx, rc;\r
+\r
+  rc = map_lid2idx(linkID, &idx);\r
+\r
+  return (rc && (CONNSTATE_CONNECTED == sPersistInfo.connStruct[idx].connState)) ? &sPersistInfo.connStruct[idx] : (connInfo_t *)0;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_isLinkDuplicate\r
+ *\r
+ * @brief       Help determine if the link has already been established.. Defense\r
+ *              against duplicate link frames. This file owns the data structure\r
+ *              so the comparison is done here.\r
+ *\r
+ * input parameters\r
+ * @param   addr       - pointer to address of linker in question\r
+ * @param   remotePort - remote port number provided by linker\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   Returns pointer to connection entry if the address and remote Port\r
+ *           match an existing entry, otherwise 0.\r
+ */\r
+connInfo_t *nwk_isLinkDuplicate(uint8_t *addr, uint8_t remotePort)\r
+{\r
+#if NUM_CONNECTIONS > 0\r
+  uint8_t       i;\r
+  connInfo_t   *ptr = sPersistInfo.connStruct;\r
+\r
+  for (i=0; i<NUM_CONNECTIONS; ++i,++ptr)\r
+  {\r
+    if (CONNSTATE_CONNECTED == ptr->connState)\r
+    {\r
+      if (!(memcmp(ptr->peerAddr, addr, NET_ADDR_SIZE)) &&\r
+          (ptr->portTx == remotePort))\r
+      {\r
+        return ptr;\r
+      }\r
+    }\r
+  }\r
+#endif\r
+\r
+  return (connInfo_t *)NULL;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_findAddressMatch\r
+ *\r
+ * @brief       Used to look for an address match in the Connection table.\r
+ *              Match is based on source address in frame.\r
+ *\r
+ * input parameters\r
+ * @param   frame    - pointer to frame in question\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   Returns non-zero if a match is found, otherwise 0.\r
+ */\r
+uint8_t nwk_findAddressMatch(mrfiPacket_t *frame)\r
+{\r
+#if NUM_CONNECTIONS > 0\r
+  uint8_t       i;\r
+  connInfo_t   *ptr = sPersistInfo.connStruct;\r
+\r
+  for (i=0; i<NUM_CONNECTIONS; ++i,++ptr)\r
+  {\r
+\r
+    if (CONNSTATE_CONNECTED == ptr->connState)\r
+    {\r
+      if (!(memcmp(ptr->peerAddr, MRFI_P_SRC_ADDR(frame), NET_ADDR_SIZE)))\r
+      {\r
+        return 1;\r
+      }\r
+    }\r
+  }\r
+#endif\r
+\r
+  return 0;\r
+}\r
+\r
+#ifdef ACCESS_POINT\r
+/******************************************************************************\r
+ * @fn          nwk_getSFInfoPtr\r
+ *\r
+ * @brief       Get pointer to store-and-forward information object kept in the\r
+ *              NV object aggregate.\r
+ *\r
+ * input parameters\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   Returns pointer to the store-nad-forward object.\r
+ */\r
+sfInfo_t *nwk_getSFInfoPtr(void)\r
+{\r
+  return &sPersistInfo.sSandFContext;\r
+}\r
+\r
+#if defined(AP_IS_DATA_HUB)\r
+/***************************************************************************************\r
+ * @fn          nwk_saveJoinedDevice\r
+ *\r
+ * @brief       Save the address of a joining device on the Connection Table expecting\r
+ *              a Link frame to follow. Only for when AP is a data hub. We want to\r
+ *              use the space already allocated for a connection able entry instead\r
+ *              of having redundant arrays for alread-joined devices in the data hub\r
+ *              case.\r
+ *\r
+ * input parameters\r
+ * @param   frame  - pointer to frame containing address or joining device.\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   Returns non-zero if this is a new device and it is saved. Returns\r
+ *           0 if device already there or there is no room in the Connection\r
+ *           Table.\r
+ */\r
+uint8_t nwk_saveJoinedDevice(mrfiPacket_t *frame)\r
+{\r
+  uint8_t     i;\r
+  connInfo_t *avail = 0;\r
+  connInfo_t *ptr   = sPersistInfo.connStruct;\r
+\r
+  for (i=0; i<NUM_CONNECTIONS; ++i, ++ptr)\r
+  {\r
+    if ((ptr->connState == CONNSTATE_CONNECTED) || (ptr->connState == CONNSTATE_JOINED))\r
+    {\r
+      if (!memcmp(ptr->peerAddr, MRFI_P_SRC_ADDR(frame), NET_ADDR_SIZE))\r
+      {\r
+        return 0;\r
+      }\r
+    }\r
+    else\r
+    {\r
+      avail = ptr;\r
+    }\r
+  }\r
+\r
+  if (!avail)\r
+  {\r
+    return 0;\r
+  }\r
+\r
+  avail->connState = CONNSTATE_JOINED;\r
+  memcpy(avail->peerAddr, MRFI_P_SRC_ADDR(frame), NET_ADDR_SIZE);\r
+\r
+  return 1;\r
+}\r
+\r
+/***********************************************************************************\r
+ * @fn          nwk_findAlreadyJoined\r
+ *\r
+ * @brief       Used when AP is a data hub to look for an address match in the\r
+ *              Connection table for a device that is already enterd in the joined\r
+ *              state. This means that the Connection Table resource is already\r
+ *              allocated so the link-listen doesn't have to do it again. Match is\r
+ *              based on source address in frame. Thsi shoudl only be called from\r
+ *              the Link-listen context during the link frame reply.\r
+ *\r
+ *              If found the Connection Table entry is initialized as if it were\r
+ *              found using the nwk_getNextConnection() method.\r
+ *\r
+ * input parameters\r
+ * @param   frame    - pointer to frame in question\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   Returns pointer to Connection Table entry if match is found, otherwise\r
+ *           0. This call will only fail if the Connection Table was full when the\r
+ *           device tried to join initially.\r
+ */\r
+connInfo_t *nwk_findAlreadyJoined(mrfiPacket_t *frame)\r
+{\r
+  uint8_t     i;\r
+  connInfo_t *ptr = sPersistInfo.connStruct;\r
+\r
+  for (i=0; i<NUM_CONNECTIONS; ++i,++ptr)\r
+  {\r
+    /* Look for an entry in the JOINED state */\r
+    if (CONNSTATE_JOINED == ptr->connState)\r
+    {\r
+      /* Is this it? */\r
+      if (!(memcmp(&ptr->peerAddr, MRFI_P_SRC_ADDR(frame), NET_ADDR_SIZE)))\r
+      {\r
+        /* Yes. Initilize tabel entry and return the pointer. */\r
+        initializeConnection(ptr);\r
+        return ptr;\r
+      }\r
+    }\r
+  }\r
+\r
+  /* Nothing found... */\r
+  return (connInfo_t *)NULL;\r
+}\r
+#endif  /* AP_IS_DATA_HUB */\r
+#endif  /* ACCESS_POINT */\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_checkConnInfo\r
+ *\r
+ * @brief       Do a sanity/validity check on the connection info\r
+ *\r
+ * input parameters\r
+ * @param   ptr     - pointer to a valid connection info structure to validate\r
+ * @param   which   - Tx or Rx port checked\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   Status of operation.\r
+ */\r
+smplStatus_t nwk_checkConnInfo(connInfo_t *ptr, uint8_t which)\r
+{\r
+  uint8_t  port;\r
+\r
+  /* make sure port isn't null and that the entry is active */\r
+  port = (CHK_RX == which) ? ptr->portRx : ptr->portTx;\r
+  if (!port || (CONNSTATE_FREE == ptr->connState))\r
+  {\r
+    return SMPL_BAD_PARAM;\r
+  }\r
+\r
+  /* validate port number */\r
+  if (port < PORT_BASE_NUMBER)\r
+  {\r
+    return SMPL_BAD_PARAM;\r
+  }\r
+\r
+  return SMPL_SUCCESS;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_isConnectionValid\r
+ *\r
+ * @brief       Do a sanity/validity check on the frame target address by\r
+ *              validating frame against connection info\r
+ *\r
+ * input parameters\r
+ * @param   frame   - pointer to frame in question\r
+ *\r
+ * output parameters\r
+ * @param   lid   - link ID of found connection\r
+ *\r
+ * @return   0 if connection specified in frame is not valid, otherwise non-zero.\r
+ */\r
+uint8_t nwk_isConnectionValid(mrfiPacket_t *frame, linkID_t *lid)\r
+{\r
+  uint8_t       i;\r
+  connInfo_t   *ptr  = sPersistInfo.connStruct;\r
+  uint8_t       port = GET_FROM_FRAME(MRFI_P_PAYLOAD(frame), F_PORT_OS);\r
+\r
+  for (i=0; i<SYS_NUM_CONNECTIONS; ++i,++ptr)\r
+  {\r
+    if (CONNSTATE_CONNECTED == ptr->connState)\r
+    {\r
+      /* check port first since we're done if the port is the user bcast port. */\r
+      if (port == ptr->portRx)\r
+      {\r
+        /* yep...ports match. */\r
+        if ((SMPL_PORT_USER_BCAST == port) || !(memcmp(ptr->peerAddr, MRFI_P_SRC_ADDR(frame), NET_ADDR_SIZE)))\r
+        {\r
+          uint8_t rc = 1;\r
+\r
+          /* we're done. */\r
+          *lid = ptr->thisLinkID;\r
+#ifdef APP_AUTO_ACK\r
+          /* can't ack the broadcast port... */\r
+          if (!(SMPL_PORT_USER_BCAST == port))\r
+          {\r
+            if (GET_FROM_FRAME(MRFI_P_PAYLOAD(frame), F_ACK_REQ))\r
+            {\r
+              /* Ack requested. Send ack now */\r
+              nwk_sendAckReply(frame, ptr->portTx);\r
+            }\r
+            else if (GET_FROM_FRAME(MRFI_P_PAYLOAD(frame), F_ACK_RPLY))\r
+            {\r
+              /* This is a reply. Signal that it was received by resetting the\r
+               * saved transaction ID in the connection object if they match. The\r
+               * main thread is polling this value. The setting here is in the\r
+               * Rx ISR thread.\r
+               */\r
+              if (ptr->ackTID == GET_FROM_FRAME(MRFI_P_PAYLOAD(frame), F_TRACTID_OS))\r
+              {\r
+                ptr->ackTID = 0;\r
+              }\r
+              /* This causes the frame to be dropped. All ack frames are\r
+               * dropped.\r
+               */\r
+              rc = 0;\r
+            }\r
+          }\r
+#endif  /* APP_AUTO_ACK */\r
+          /* Unconditionally kill the reply delay semaphore. This used to be done\r
+           * unconditionally in the calling routine.\r
+           */\r
+          MRFI_PostKillSem();\r
+          return rc;\r
+        }\r
+      }\r
+    }\r
+  }\r
+\r
+  /* no matches */\r
+  return 0;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_allocateLocalRxPort\r
+ *\r
+ * @brief       Allocate a local port on which to receive frames from a peer.\r
+ *\r
+ *              Allocation differs depending on whether the allocation is for\r
+ *              a link reply frame or a link frame. In the former case we\r
+ *              know the address of the peer so we can ensure allocating a\r
+ *              unique port number for that address. The same port number can be\r
+ *              used mulitple times for distinct peers. Allocations are done from\r
+ *              the bottom of the namespace upward.\r
+ *\r
+ *              If allocation is for a link frame we do not yet know the peer\r
+ *              address so we must ensure the port number is unique now.\r
+ *              Allocations are done from the top of the namespace downward.\r
+ *\r
+ *              The two allocation methods track the extreme values used in each\r
+ *              case to detect overlap, i.e., exhausted namespace. This can only\r
+ *              happen if the number of connections supported is greater than the\r
+ *              total namespace available.\r
+ *\r
+ * input parameters\r
+ * @param   which   - Sending a link frame or a link reply frame\r
+ * @param   newPtr  - pointer to connection info structure to be populated\r
+ *\r
+ * output parameters\r
+ * @param   newPtr->portRx  - element is populated with port number.\r
+ *\r
+ * @return   Non-zero if port number assigned. 0 if no port available.\r
+ */\r
+uint8_t nwk_allocateLocalRxPort(uint8_t which, connInfo_t *newPtr)\r
+{\r
+#if NUM_CONNECTIONS > 0\r
+  uint8_t     num, i;\r
+  uint8_t     marker[NUM_CONNECTIONS];\r
+  connInfo_t *ptr = sPersistInfo.connStruct;\r
+\r
+  memset(&marker, 0x0, sizeof(marker));\r
+\r
+  for (i=0; i<NUM_CONNECTIONS; ++i,++ptr)\r
+  {\r
+    /* Mark the port number as used unless it's a statically allocated port */\r
+    if ((ptr != newPtr) && (CONNSTATE_CONNECTED == ptr->connState) && (ptr->portRx <= SMPL_PORT_USER_MAX))\r
+    {\r
+      if (LINK_SEND == which)\r
+      {\r
+        if (ptr->portRx > sPersistInfo.curNextLinkPort)\r
+        {\r
+          marker[SMPL_PORT_USER_MAX - ptr->portRx] = 1;\r
+        }\r
+      }\r
+      else if (!memcmp(ptr->peerAddr, newPtr->peerAddr, NET_ADDR_SIZE))\r
+      {\r
+          marker[ptr->portRx - PORT_BASE_NUMBER] = 1;\r
+      }\r
+    }\r
+  }\r
+\r
+  num = 0;\r
+  for (i=0; i<NUM_CONNECTIONS; ++i)\r
+  {\r
+    if (!marker[i])\r
+    {\r
+      if (LINK_REPLY == which)\r
+      {\r
+        num = PORT_BASE_NUMBER + i;\r
+      }\r
+      else\r
+      {\r
+        num = SMPL_PORT_USER_MAX - i;\r
+      }\r
+      break;\r
+    }\r
+  }\r
+\r
+  if (LINK_REPLY == which)\r
+  {\r
+    /* if the number we have doesn't overlap the assignment of ports used\r
+     * for sending link frames, use it.\r
+     */\r
+    if (num <= sPersistInfo.curNextLinkPort)\r
+    {\r
+      if (num > sPersistInfo.curMaxReplyPort)\r
+      {\r
+        /* remember maximum port number used */\r
+        sPersistInfo.curMaxReplyPort = num;\r
+      }\r
+    }\r
+    else\r
+    {\r
+      /* the port number we need has already been used in the other context. It may or\r
+       * may not have been used for the same address but we don't bother to check...we\r
+       * just reject the asignment. This is the overly cautious part but is extermely\r
+       * unlikely to ever occur.\r
+       */\r
+      num = 0;\r
+    }\r
+  }\r
+  else\r
+  {\r
+    /* if the number we have doesn't overlap the assignment of ports used\r
+     * for sending link frame replies, use it.\r
+     */\r
+    if (num >= sPersistInfo.curMaxReplyPort)\r
+    {\r
+      if (num == sPersistInfo.curNextLinkPort)\r
+      {\r
+        sPersistInfo.curNextLinkPort--;\r
+      }\r
+    }\r
+    else\r
+    {\r
+      /* the port number we need has already been used in the other context. It may or\r
+       * may not have been used for the same address but we don't bother to check...we\r
+       * just reject the asignment. This is the overly cautious part but is extermely\r
+       * unlikely to ever occur.\r
+       */\r
+      num = 0;\r
+    }\r
+  }\r
+\r
+  newPtr->portRx = num;\r
+\r
+  return num;\r
+#else\r
+  return 0;\r
+#endif  /* NUM_CONNECTIONS > 0 */\r
+\r
+}\r
+\r
+/*******************************************************************************\r
+ * @fn          nwk_isValidReply\r
+ *\r
+ * @brief       Examine a frame to see if it is a valid reply when compared with\r
+ *              expected parameters.\r
+ *\r
+ * input parameters\r
+ * @param   frame      - pointer to frmae being examined\r
+ * @param   tid        - expected transaction ID in application payload\r
+ * @param   infoOffset - offset to payload information containing reply hint\r
+ * @param   tidOffset  - offset to transaction ID in payload\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   reply category:\r
+ *               SMPL_NOT_REPLY: not a reply\r
+ *               SMPL_MY_REPLY : a reply that matches input parameters\r
+ *               SMPL_A_REPLY  : a reply but does not match input parameters\r
+ */\r
+uint8_t nwk_isValidReply(mrfiPacket_t *frame, uint8_t tid, uint8_t infoOffset, uint8_t tidOffset)\r
+{\r
+  uint8_t rc = SMPL_NOT_REPLY;\r
+\r
+  if ((*(MRFI_P_PAYLOAD(frame)+F_APP_PAYLOAD_OS+infoOffset) & NWK_APP_REPLY_BIT))\r
+  {\r
+    if ((*(MRFI_P_PAYLOAD(frame)+F_APP_PAYLOAD_OS+tidOffset) == tid) &&\r
+        !memcmp(MRFI_P_DST_ADDR(frame), nwk_getMyAddress(), NET_ADDR_SIZE))\r
+    {\r
+      rc = SMPL_MY_REPLY;\r
+    }\r
+    else\r
+    {\r
+      rc = SMPL_A_REPLY;\r
+    }\r
+  }\r
+\r
+  return rc;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          map_lid2idx\r
+ *\r
+ * @brief       Map link ID to index into connection table.\r
+ *\r
+ * input parameters\r
+ * @param   lid   - Link ID to be matched\r
+ *\r
+ * output parameters\r
+ * @param   idx   - populated with index into connection table\r
+ *\r
+ * @return   Non-zero if Link ID found and output is valid else 0.\r
+ */\r
+static uint8_t map_lid2idx(linkID_t lid, uint8_t *idx)\r
+{\r
+  uint8_t     i;\r
+  connInfo_t *ptr = sPersistInfo.connStruct;\r
+\r
+  for (i=0; i<SYS_NUM_CONNECTIONS; ++i, ++ptr)\r
+  {\r
+    if ((CONNSTATE_CONNECTED == ptr->connState) && (ptr->thisLinkID == lid))\r
+    {\r
+      *idx = i;\r
+      return 1;\r
+    }\r
+  }\r
+\r
+  return 0;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_findPeer\r
+ *\r
+ * @brief       Find connection entry for a peer\r
+ *\r
+ * input parameters\r
+ * @param   peerAddr   - address of peer\r
+ * @param   peerPort   - port on which this device was sending to peer.\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   Pointer to matching connection table entry else 0.\r
+ */\r
+connInfo_t *nwk_findPeer(addr_t *peerAddr, uint8_t peerPort)\r
+{\r
+  uint8_t     i;\r
+  connInfo_t *ptr = sPersistInfo.connStruct;\r
+\r
+  for (i=0; i<SYS_NUM_CONNECTIONS; ++i, ++ptr)\r
+  {\r
+    if (CONNSTATE_CONNECTED == ptr->connState)\r
+    {\r
+      if (!memcmp(peerAddr, ptr->peerAddr, NET_ADDR_SIZE))\r
+      {\r
+        if (peerPort == ptr->portTx)\r
+        {\r
+          return ptr;\r
+        }\r
+      }\r
+    }\r
+  }\r
+\r
+  return (connInfo_t *)NULL;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_checkAppMsgTID\r
+ *\r
+ * @brief       Compare received TID to last-seen TID to decide whether the\r
+ *              received message is a duplicate or we missed some.\r
+ *\r
+ * input parameters\r
+ * @param   lastTID   - last-seen TID\r
+ * @param   appMsgTID - TID from current application payload.\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   Returns zero if message with supplied TID should be discarded.\r
+ *           Otherwise returns non-zero. In this case the message should be\r
+ *           processed. The last-seen TID should be updated with the current\r
+ *           application payload TID.\r
+ *\r
+ */\r
+uint8_t nwk_checkAppMsgTID(appPTid_t lastTID, appPTid_t appMsgTID)\r
+{\r
+  uint8_t rc = 0;\r
+\r
+  /* If the values are equal this is a duplicate. We're done. */\r
+  if (lastTID != appMsgTID)\r
+  {\r
+    /* Is the new TID bigger? */\r
+    if (appMsgTID > lastTID)\r
+    {\r
+      /* In this case the current payload is OK unless we've received a late\r
+       * (duplicate) message that occurred just before the TID wrapped. This is\r
+       * considered a duplicate and we should discard it.\r
+       */\r
+      if (!(DUP_TID_AFTER_WRAP(lastTID, appMsgTID)))\r
+      {\r
+        rc = 1;\r
+      }\r
+    }\r
+    else\r
+    {\r
+      /* New TID is smaller. Accept the payload if this is the wrap case or we missed\r
+       * the specific wrap frame but are still within the range in which we assume\r
+       * we missed it. Otherwise is a genuine late frame so we should ignore it.\r
+       */\r
+      if (CHECK_TID_WRAP(lastTID, appMsgTID))\r
+      {\r
+        rc = 1;\r
+      }\r
+    }\r
+  }\r
+\r
+  return rc;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_getNumObjectFromMsg\r
+ *\r
+ * @brief       Get a numeric object from a message buffer. Take care of\r
+ *              alignment and endianess issues.\r
+ *\r
+ * input parameters\r
+ * @param   src     - pointer to object location in message buffer\r
+ * @param   objSize - size of numeric object\r
+ *\r
+ * output parameters\r
+ * @param   dest - pointer to numeric type variable receiving the object\r
+ *                 contains aligned number in correct endian order on return.\r
+ *\r
+ * @return   void. There is no warning if there is no case for the supplied\r
+ *                 object size. A simple copy is then done. Alignment is\r
+ *                 guaranteed only for object size cases defined (and\r
+ *                 vacuously size 1).\r
+ *\r
+ */\r
+void nwk_getNumObjectFromMsg(void *src, void *dest, uint8_t objSize)\r
+{\r
+  /* Take care of alignment */\r
+  memmove(dest, src, objSize);\r
+\r
+  /* Take care of endianess */\r
+  switch(objSize)\r
+  {\r
+    case 2:\r
+      *((uint16_t *)dest) = ntohs(*((uint16_t *)dest));\r
+      break;\r
+\r
+    case 4:\r
+      *((uint32_t *)dest) = ntohl(*((uint32_t *)dest));\r
+      break;\r
+  }\r
+\r
+  return;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_putNumObjectIntoMsg\r
+ *\r
+ * @brief       Put a numeric object into a message buffer. Take care of\r
+ *              alignment and endianess issues.\r
+ *\r
+ * input parameters\r
+ * @param   src     - pointer to numeric type variable providing the object\r
+ * @param   objSize - size of numeric object. Fuction works for object size 1.\r
+ *\r
+ * output parameters\r
+ * @param   dest - pointer to object location in message buffer where the\r
+ *                 correct endian order representation will be placed.\r
+ *\r
+ * @return   void. There is no warning if there is no case for the supplied\r
+ *                 object size. A simple copy is then done.\r
+ *\r
+ */\r
+void nwk_putNumObjectIntoMsg(void *src, void *dest, uint8_t objSize)\r
+{\r
+\r
+  uint8_t *ptr;\r
+  uint16_t u16;\r
+  uint32_t u32;\r
+\r
+  /* Take care of endianess */\r
+  switch(objSize)\r
+  {\r
+    case 1:\r
+      ptr = (uint8_t *)src;\r
+      break;\r
+\r
+    case 2:\r
+      u16 = htons(*((uint16_t *)src));\r
+      ptr = (uint8_t *)&u16;\r
+      break;\r
+\r
+    case 4:\r
+      u32 = htonl(*((uint32_t *)src));\r
+      ptr = (uint8_t *)&u32;\r
+      break;\r
+\r
+    default:\r
+      ptr = (uint8_t *)src;\r
+      break;\r
+  }\r
+\r
+  /* Take care of alignment */\r
+  memmove(dest, ptr, objSize);\r
+\r
+  return;\r
+}\r
+/******************************************************************************\r
+ * @fn          nwk_NVObj\r
+ *\r
+ * @brief       GET and SET support for NV object (connection context).\r
+ *\r
+ * input parameters\r
+ * @param   action  - GET or SET\r
+ * @param   val     - (GET/SET) pointer to NV IOCTL object.\r
+ *                    (SET) NV length and version values to be used for sanity\r
+ *                    checks.\r
+ *\r
+ * output parameters\r
+ * @param   val     - (GET) Version number of NV object, size of NV object and\r
+ *                          pointer to the connection context memory.\r
+ *                  - (SET) Pointer to the connection context memory.\r
+ *\r
+ * @return   SMPL_SUCCESS\r
+ *           SMPL_BAD_PARAM   Object version or size do not conform on a SET call\r
+ *                            or illegal action specified.\r
+ */\r
+smplStatus_t nwk_NVObj(ioctlAction_t action, ioctlNVObj_t *val)\r
+{\r
+#ifdef NVOBJECT_SUPPORT\r
+  smplStatus_t rc = SMPL_SUCCESS;\r
+\r
+  if (IOCTL_ACT_GET == action)\r
+  {\r
+    /* Populate helper objects */\r
+    val->objLen     = SIZEOF_NV_OBJ;\r
+    val->objVersion = sPersistInfo.structureVersion;\r
+    /* Set pointer to connection context if address of pointer is not null */\r
+    if (val->objPtr)\r
+    {\r
+      *(val->objPtr) = (uint8_t *)&sPersistInfo;\r
+    }\r
+  }\r
+  else\r
+  {\r
+    rc = SMPL_BAD_PARAM;\r
+  }\r
+\r
+  return rc;\r
+#else  /* NVOBJECT_SUPPORT */\r
+  return SMPL_BAD_PARAM;\r
+#endif\r
+}\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/Components/nwk/nwk.h b/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/Components/nwk/nwk.h
new file mode 100755 (executable)
index 0000000..6009f38
--- /dev/null
@@ -0,0 +1,159 @@
+/**************************************************************************************************\r
+  Filename:       nwk.h\r
+  Revised:        $Date: 2008-12-01 11:58:33 -0800 (Mon, 01 Dec 2008) $\r
+  Revision:       $Revision: 18551 $\r
+  Author:         $Author: lfriedman $\r
+\r
+  Description:    This header file supports the SimpliciTI network layer.\r
+\r
+  Copyright 2004-2007 Texas Instruments Incorporated. All rights reserved.\r
+\r
+  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+  the terms of a software license agreement between the user who downloaded the software,\r
+  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+  License. The License limits your use, and you acknowledge, that the Software may not be\r
+  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+  perform, display or sell this Software and/or its documentation for any purpose.\r
+\r
+  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+\r
+  Should you have any questions regarding your right to use this Software,\r
+  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+#ifndef NWK_H\r
+#define NWK_H\r
+\r
+\r
+/* well known ports*/\r
+#define SMPL_PORT_PING          0x01\r
+#define SMPL_PORT_LINK          0x02\r
+#define SMPL_PORT_JOIN          0x03\r
+#define SMPL_PORT_SECURITY      0x04\r
+#define SMPL_PORT_FREQ          0x05\r
+#define SMPL_PORT_MGMT          0x06\r
+\r
+#define SMPL_PORT_NWK_BCAST     0x1F\r
+#define SMPL_PORT_USER_BCAST    0x3F\r
+\r
+/* Unconnected User Datagram Link ID */\r
+#define SMPL_LINKID_USER_UUD    ((linkID_t) ~0)\r
+\r
+#define PORT_BASE_NUMBER        0x20\r
+\r
+/* Reserve the top of the User port namespace below the broadcast\r
+ * address for static allocation.\r
+ */\r
+#define PORT_USER_STATIC_NUM    1\r
+#define SMPL_PORT_STATIC_MAX    0x3E\r
+#define SMPL_PORT_USER_MAX      (SMPL_PORT_STATIC_MAX - PORT_USER_STATIC_NUM)\r
+\r
+\r
+/* to check connection info sanity */\r
+#define CHK_RX   0\r
+#define CHK_TX   1\r
+\r
+/* return types for validating a reply frame */\r
+#define SMPL_MY_REPLY    0\r
+#define SMPL_A_REPLY     1\r
+#define SMPL_NOT_REPLY   2\r
+\r
+/* when allocating local Rx port it depends on whether the allocation\r
+ * is being done as a result of a link or a link reply\r
+ */\r
+#define LINK_SEND   1\r
+#define LINK_REPLY  2\r
+\r
+#define  CONNSTATE_FREE       (0x00)\r
+#define  CONNSTATE_JOINED     (0x01)\r
+#define  CONNSTATE_CONNECTED  (0x02)\r
+\r
+typedef struct\r
+{\r
+  volatile uint8_t     connState;\r
+           uint8_t     hops2target;\r
+#ifdef APP_AUTO_ACK\r
+  volatile uint8_t     ackTID;\r
+#endif\r
+           uint8_t     peerAddr[NET_ADDR_SIZE];\r
+           rxMetrics_t sigInfo;\r
+           uint8_t     portRx;\r
+           uint8_t     portTx;\r
+           linkID_t    thisLinkID;\r
+#ifdef SMPL_SECURE\r
+           uint32_t    connTxCTR;\r
+           uint32_t    connRxCTR;\r
+#endif\r
+} connInfo_t;\r
+\r
+/****************************************************************************************\r
+ *                         Application Payload TID support\r
+ *\r
+ * Sometimes the receiving application uses a payload TID to determine if either it\r
+ * missed frames (received TID > (last-seen TID+1)) or is seeing a duplicate (received\r
+ * TID <= last-seen TID). Typically the TID simply increments for each successive frame.\r
+ * But when the count wraps there is a problem. The received TID should always be one\r
+ * more than the last TID. If it's equal, it's a duplicate. If it's less it's late. If\r
+ * it's one more it's the one we expect. If it's more than 1 more then we missed frames.\r
+ * Simple increments work for the wrap arithmetically. If the received TID is 0 and the last\r
+ * seen ID is the biggest number in the world -- 0xFF... depending on type we can detect\r
+ * the wrap. But if the receiver misses the 0 TID value for any reason or the biggest\r
+ * number in the world TID is missed then susbequent testing for missed or duplicate\r
+ * frames can get confused. We resolve this by allowing some leeway in the wrap testing.\r
+ * this testing is assisted by the following macros. Setting TID_VALID_WINDOW to 0\r
+ * will enforce a no leniency policy. In this case you'd better not miss either the\r
+ * biggest number or the 0. The CHECK_TID_WRAP macro is only needed if the received\r
+ * TID is less than the last-seen TID. The DUP_TID_AFTER_WRAP macro is only needed if the\r
+ * received TID is greater than 1 more than the last-seen TID.\r
+ ***************************************************************************************/\r
+#define MAX_APT           ((appPTid_t)~0)    /* max value of application payload TID type */\r
+#define TID_VALID_WINDOW  2                  /* window around max and 0 */\r
+\r
+#define CHECK_TID_WRAP(lastTID, newTID)   ((lastTID >= (MAX_APT - TID_VALID_WINDOW)) &&  \\r
+                                           (newTID <= TID_VALID_WINDOW)                  \\r
+                                          )\r
+#define DUP_TID_AFTER_WRAP(lastTID, newTID)     ((newTID >= (MAX_APT - TID_VALID_WINDOW)) &&  \\r
+                                                 (lastTID <= TID_VALID_WINDOW)                  \\r
+                                                )\r
+\r
+/* prototypes */\r
+smplStatus_t  nwk_nwkInit(uint8_t (*)(linkID_t));\r
+connInfo_t   *nwk_getNextConnection(void);\r
+void          nwk_freeConnection(connInfo_t *);\r
+uint8_t       nwk_getNextClientPort(void);\r
+connInfo_t   *nwk_getConnInfo(linkID_t port);\r
+connInfo_t   *nwk_isLinkDuplicate(uint8_t *, uint8_t);\r
+uint8_t       nwk_findAddressMatch(mrfiPacket_t *);\r
+smplStatus_t  nwk_checkConnInfo(connInfo_t *, uint8_t);\r
+uint8_t       nwk_isConnectionValid(mrfiPacket_t *, linkID_t *);\r
+uint8_t       nwk_allocateLocalRxPort(uint8_t, connInfo_t *);\r
+uint8_t       nwk_isValidReply(mrfiPacket_t *, uint8_t, uint8_t, uint8_t);\r
+connInfo_t   *nwk_findPeer(addr_t *, uint8_t);\r
+smplStatus_t  nwk_NVObj(ioctlAction_t, ioctlNVObj_t *);\r
+\r
+\r
+uint8_t       nwk_checkAppMsgTID(appPTid_t, appPTid_t);\r
+void          nwk_getNumObjectFromMsg(void *, void *, uint8_t);\r
+void          nwk_putNumObjectIntoMsg(void *, void *, uint8_t);\r
+#ifdef ACCESS_POINT\r
+sfInfo_t     *nwk_getSFInfoPtr(void);\r
+#ifdef AP_IS_DATA_HUB\r
+uint8_t       nwk_saveJoinedDevice(mrfiPacket_t *);\r
+connInfo_t   *nwk_findAlreadyJoined(mrfiPacket_t *);\r
+#endif\r
+#endif\r
+\r
+\r
+#endif\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/Components/nwk/nwk_QMgmt.c b/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/Components/nwk/nwk_QMgmt.c
new file mode 100755 (executable)
index 0000000..4cb34ea
--- /dev/null
@@ -0,0 +1,417 @@
+/**************************************************************************************************\r
+  Filename:       nwk_QMgmt.c\r
+  Revised:        $Date: 2009-03-10 17:01:56 -0700 (Tue, 10 Mar 2009) $\r
+  Revision:       $Revision: 19372 $\r
+  Author:         $Author: lfriedman $\r
+\r
+  Description:    This file supports the SimpliciTI input and output frame queues\r
+\r
+  Copyright 2007-2008 Texas Instruments Incorporated. All rights reserved.\r
+\r
+  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+  the terms of a software license agreement between the user who downloaded the software,\r
+  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+  License. The License limits your use, and you acknowledge, that the Software may not be\r
+  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+  perform, display or sell this Software and/or its documentation for any purpose.\r
+\r
+  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+\r
+  Should you have any questions regarding your right to use this Software,\r
+  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+\r
+/******************************************************************************\r
+ * INCLUDES\r
+ */\r
+#include <intrinsics.h>\r
+#include <string.h>\r
+#include "bsp.h"\r
+#include "mrfi.h"\r
+#include "nwk_types.h"\r
+#include "nwk.h"\r
+#include "nwk_frame.h"\r
+#include "nwk_QMgmt.h"\r
+#include "nwk_mgmt.h"     /* need offsets for poll frames */\r
+\r
+/******************************************************************************\r
+ * MACROS\r
+ */\r
+\r
+/******************************************************************************\r
+ * CONSTANTS AND DEFINES\r
+ */\r
+\r
+/******************************************************************************\r
+ * TYPEDEFS\r
+ */\r
+\r
+/******************************************************************************\r
+ * LOCAL VARIABLES\r
+ */\r
+\r
+#if SIZE_INFRAME_Q > 0\r
+static frameInfo_t   sInFrameQ[SIZE_INFRAME_Q];\r
+#else\r
+static frameInfo_t  *sInFrameQ = NULL;\r
+#endif  /* SIZE_INFRAME_Q > 0 */\r
+\r
+static frameInfo_t   sOutFrameQ[SIZE_OUTFRAME_Q];\r
+\r
+/******************************************************************************\r
+ * LOCAL FUNCTIONS\r
+ */\r
+\r
+/******************************************************************************\r
+ * GLOBAL VARIABLES\r
+ */\r
+\r
+/******************************************************************************\r
+ * GLOBAL FUNCTIONS\r
+ */\r
+\r
+/******************************************************************************\r
+* @fn          nwk_QInit\r
+* \r
+* @brief     Initialize the input and output frame queues to hold no packets. \r
+* \r
+* input parameters\r
+* \r
+* output parameters\r
+* \r
+* @return   void\r
+*/\r
+void nwk_QInit(void)\r
+{\r
+#if SIZE_INFRAME_Q > 0\r
+  memset(sInFrameQ, 0, sizeof(sInFrameQ));\r
+#endif  // SIZE_INFRAME_Q > 0\r
+  memset(sOutFrameQ, 0, sizeof(sOutFrameQ));\r
+}\r
\r
+/******************************************************************************\r
+ * @fn          nwk_QfindSlot\r
+ *\r
+ * @brief       Finds a slot to use to retrieve the frame from the radio. It\r
+ *              uses a LRU cast-out scheme. It is possible that this routine\r
+ *              finds no slot. This can happen if the queue is of size 1 or 2\r
+ *              and the Rx interrupt occurs during a retrieval call from an\r
+ *              application. There are meta-states for frames as the application\r
+ *              looks for the oldest frame on the port being requested.\r
+ *\r
+ *              This routine is running in interrupt context.\r
+ *\r
+ * input parameters\r
+ * @param   which   - INQ or OUTQ to search\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return      Pointer to oldest available frame in the queue\r
+ */\r
+frameInfo_t *nwk_QfindSlot(uint8_t which)\r
+{\r
+  frameInfo_t *pFI, *oldest= 0, *newFI = 0;\r
+  uint8_t        i, num, newOrder = 0, orderTest;\r
+\r
+  if (INQ == which)\r
+  {\r
+    pFI  = sInFrameQ;\r
+    num  = SIZE_INFRAME_Q;\r
+  }\r
+  else\r
+  {\r
+    pFI  = sOutFrameQ;\r
+    num  = SIZE_OUTFRAME_Q;\r
+  }\r
+\r
+  orderTest = num + 1;\r
+\r
+  for (i=0; i<num; ++i, ++pFI)\r
+  {\r
+    /* if frame is available it's a candidate. */\r
+    if (pFI->fi_usage != FI_AVAILABLE)\r
+    {\r
+      if (INQ == which)  /* TODO: do cast-out for Tx as well */\r
+      {\r
+\r
+        /* need to know the number of occupied slots so we know the age value\r
+         * for the unoccupied slot (if there is one).\r
+         */\r
+        newOrder++;\r
+\r
+        /* make sure nwk_retrieveFrame() is not processing this frame */\r
+        if (FI_INUSE_TRANSITION == pFI->fi_usage)\r
+        {\r
+          continue;\r
+        }\r
+        /* is this frame older than any we've seen? */\r
+        if (orderTest > pFI->orderStamp)\r
+        {\r
+          /* yes. */\r
+          oldest    = pFI;\r
+          orderTest = pFI->orderStamp;\r
+        }\r
+      }\r
+    }\r
+    else\r
+    {\r
+      if (OUTQ == which)  /* TODO: do cast-out for Tx as well */\r
+      {\r
+        return pFI;\r
+      }\r
+      newFI = pFI;\r
+    }\r
+  }\r
+\r
+  /* did we find anything? */\r
+  if (!newFI)\r
+  {\r
+    /* queue was full. cast-out happens here...unless... */\r
+    if (!oldest)\r
+    {\r
+      /* This can happen if the queue is only of size 1 or 2 and all\r
+       * the frames are in transition when the Rx interrupt occurs.\r
+       */\r
+      return (frameInfo_t *)0;\r
+    }\r
+    newFI = oldest;\r
+    nwk_QadjustOrder(which, newFI->orderStamp);\r
+    newFI->orderStamp = i;\r
+  }\r
+  else\r
+  {\r
+    /* mark the available slot. */\r
+    newFI->orderStamp = ++newOrder;\r
+  }\r
+\r
+  return newFI;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_QadjustOrder\r
+ *\r
+ * @brief       Adjusts the age of everyone in the queue newer than the frame\r
+ *              being removed.\r
+ *\r
+ * input parameters\r
+ * @param   which   - INQ or OUTQ to adjust\r
+ * @param   stamp   - value of frame being removed\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return      void\r
+ */\r
+void nwk_QadjustOrder(uint8_t which, uint8_t stamp)\r
+{\r
+  frameInfo_t *pFI;\r
+  uint8_t      i, num;\r
+  bspIState_t  intState;\r
+\r
+  if (INQ == which)\r
+  {\r
+    pFI  = sInFrameQ;\r
+    num  = SIZE_INFRAME_Q;\r
+  }\r
+  else\r
+  {\r
+/*    pFI  = sOutFrameQ; */\r
+/*    num  = SIZE_OUTFRAME_Q; */\r
+    return;\r
+  }\r
+\r
+  BSP_ENTER_CRITICAL_SECTION(intState);\r
+\r
+  for (i=0; i<num; ++i, ++pFI)\r
+  {\r
+    if ((pFI->fi_usage != FI_AVAILABLE) && (pFI->orderStamp > stamp))\r
+    {\r
+      pFI->orderStamp--;\r
+    }\r
+  }\r
+\r
+  BSP_EXIT_CRITICAL_SECTION(intState);\r
+\r
+  return;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_QfindOldest\r
+ *\r
+ * @brief       Look through frame queue and find the oldest available frame\r
+ *              in the context in question. Supports connection-based (user),\r
+ *              non-connection based (NWK applications), and the special case\r
+ *              of store-and-forward.\r
+ *\r
+ * input parameters\r
+ * @param   which      - INQ or OUTQ to adjust\r
+ * @param   rcvContext - context information for finding the oldest\r
+ * @param   usage      - normal usage or store-and-forward usage\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return      Pointer to frame that is the oldsest on the requested port, or\r
+ *              0 if there are none.\r
+ */\r
+frameInfo_t *nwk_QfindOldest(uint8_t which, rcvContext_t *rcv, uint8_t fi_usage)\r
+{\r
+  uint8_t      i, oldest, num, port;\r
+  uint8_t      uType, addr12Compare;\r
+  bspIState_t  intState;\r
+  frameInfo_t *fPtr = 0, *wPtr;\r
+  connInfo_t  *pCInfo = 0;\r
+  uint8_t     *pAddr1, *pAddr2, *pAddr3 = 0;\r
+\r
+  if (INQ == which)\r
+  {\r
+    wPtr   = sInFrameQ;\r
+    num    = SIZE_INFRAME_Q;\r
+    oldest = SIZE_INFRAME_Q+1;\r
+  }\r
+  else\r
+  {\r
+/*    pFI  = sOutFrameQ; */\r
+/*    num  = SIZE_OUTFRAME_Q; */\r
+    return 0;\r
+  }\r
+\r
+  if (RCV_APP_LID == rcv->type)\r
+  {\r
+    pCInfo = nwk_getConnInfo(rcv->t.lid);\r
+    if (!pCInfo)\r
+    {\r
+      return (frameInfo_t *)0;\r
+    }\r
+    port   = pCInfo->portRx;\r
+    pAddr2 = pCInfo->peerAddr;\r
+  }\r
+  else if (RCV_NWK_PORT == rcv->type)\r
+  {\r
+    port = rcv->t.port;\r
+  }\r
+#ifdef ACCESS_POINT\r
+  else if (RCV_RAW_POLL_FRAME == rcv->type)\r
+  {\r
+    port   = *(MRFI_P_PAYLOAD(rcv->t.pkt)+F_APP_PAYLOAD_OS+M_POLL_PORT_OS);\r
+    pAddr2 = MRFI_P_SRC_ADDR(rcv->t.pkt);\r
+    pAddr3 = MRFI_P_PAYLOAD(rcv->t.pkt)+F_APP_PAYLOAD_OS+M_POLL_ADDR_OS;\r
+  }\r
+#endif\r
+  else\r
+  {\r
+    return (frameInfo_t *)0;\r
+  }\r
+\r
+  uType = (USAGE_NORMAL == fi_usage) ? FI_INUSE_UNTIL_DEL : FI_INUSE_UNTIL_FWD;\r
+\r
+  for (i=0; i<num; ++i, ++wPtr)\r
+  {\r
+\r
+    BSP_ENTER_CRITICAL_SECTION(intState);   /* protect the frame states */\r
+\r
+    /* only check entries in use and waiting for this port */\r
+    if (uType == wPtr->fi_usage)\r
+    {\r
+      wPtr->fi_usage = FI_INUSE_TRANSITION;\r
+\r
+      BSP_EXIT_CRITICAL_SECTION(intState);  /* release hold */\r
+      /* message sent to this device? */\r
+      if (GET_FROM_FRAME(MRFI_P_PAYLOAD(&wPtr->mrfiPkt), F_PORT_OS) == port)\r
+      {\r
+        /* Port matches. If the port of interest is a NWK applicaiton we're a\r
+         * match...the NWK applications are not connection-based. If it is a\r
+         * NWK application we need to check the source address for disambiguation.\r
+         * Also need to check source address if it's a raw frame lookup (S&F frame)\r
+         */\r
+        if (RCV_APP_LID == rcv->type)\r
+        {\r
+          if (SMPL_PORT_USER_BCAST == port)\r
+          {\r
+            /* guarantee a match... */\r
+            pAddr1 = pCInfo->peerAddr;\r
+          }\r
+          else\r
+          {\r
+            pAddr1 = MRFI_P_SRC_ADDR(&wPtr->mrfiPkt);\r
+          }\r
+        }\r
+#ifdef ACCESS_POINT\r
+        else if (RCV_RAW_POLL_FRAME == rcv->type)\r
+        {\r
+          pAddr1 = MRFI_P_DST_ADDR(&wPtr->mrfiPkt);\r
+        }\r
+#endif\r
+\r
+        addr12Compare = memcmp(pAddr1, pAddr2, NET_ADDR_SIZE);\r
+        if (  (RCV_NWK_PORT == rcv->type) ||\r
+              (!pAddr3 && !addr12Compare) ||\r
+              (pAddr3 && !memcmp(pAddr3, MRFI_P_SRC_ADDR(&wPtr->mrfiPkt), NET_ADDR_SIZE))\r
+           )\r
+        {\r
+          if (wPtr->orderStamp < oldest)\r
+          {\r
+            if (fPtr)\r
+            {\r
+              /* restore previous oldest one */\r
+              fPtr->fi_usage = uType;\r
+            }\r
+            oldest = wPtr->orderStamp;\r
+            fPtr   = wPtr;\r
+            continue;\r
+          }\r
+          else\r
+          {\r
+            /* not oldest. restore state */\r
+            wPtr->fi_usage = uType;\r
+          }\r
+        }\r
+        else\r
+        {\r
+          /* not a match. restore state */\r
+          wPtr->fi_usage = uType;\r
+        }\r
+      }\r
+      else\r
+      {\r
+        /* wrong port. restore state */\r
+        wPtr->fi_usage = uType;\r
+      }\r
+    }\r
+    else\r
+    {\r
+      BSP_EXIT_CRITICAL_SECTION(intState);\r
+    }\r
+  }\r
+\r
+  return fPtr;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_getQ\r
+ *\r
+ * @brief       Get location of teh specified frame queue.\r
+ *\r
+ * input parameters\r
+ * @param   which   - INQ or OUTQ to get\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return      Pointer to frame queue\r
+ */\r
+frameInfo_t *nwk_getQ(uint8_t which)\r
+{\r
+  return (INQ == which) ? sInFrameQ : sOutFrameQ;\r
+}\r
+\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/Components/nwk/nwk_QMgmt.h b/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/Components/nwk/nwk_QMgmt.h
new file mode 100755 (executable)
index 0000000..aa5535b
--- /dev/null
@@ -0,0 +1,53 @@
+/**************************************************************************************************\r
+  Filename:       nwk_QMgmt.h\r
+  Revised:        $Date: 2009-01-17 15:14:16 -0800 (Sat, 17 Jan 2009) $\r
+  Revision:       $Revision: 18788 $\r
+  Author:         $Author: rlord $\r
+\r
+  Description:    This header file supports the SimpliciTI input and output frame queues.\r
+\r
+  Copyright 2007-2009 Texas Instruments Incorporated. All rights reserved.\r
+\r
+  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+  the terms of a software license agreement between the user who downloaded the software,\r
+  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+  License. The License limits your use, and you acknowledge, that the Software may not be\r
+  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+  perform, display or sell this Software and/or its documentation for any purpose.\r
+\r
+  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+\r
+  Should you have any questions regarding your right to use this Software,\r
+  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+#ifndef NWK_QMGMT_H\r
+#define NWK_QMGMT_H\r
+\r
+\r
+#define  INQ   1\r
+#define  OUTQ  2\r
+\r
+#define  USAGE_NORMAL  1\r
+#define  USAGE_FWD     2\r
+\r
+/* prototypes */\r
+void              nwk_QInit(void);\r
+frameInfo_t *nwk_QfindSlot(uint8_t);\r
+void              nwk_QadjustOrder(uint8_t, uint8_t);\r
+frameInfo_t *nwk_QfindOldest(uint8_t, rcvContext_t *, uint8_t);\r
+frameInfo_t *nwk_getQ(uint8_t);\r
+\r
+#endif  /* NWK_QMGMT_H */\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/Components/nwk/nwk_api.c b/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/Components/nwk/nwk_api.c
new file mode 100755 (executable)
index 0000000..da5c0b7
--- /dev/null
@@ -0,0 +1,858 @@
+/**************************************************************************************************\r
+  Filename:       nwk_api.c\r
+  Revised:        $Date: 2009-01-28 18:27:38 -0800 (Wed, 28 Jan 2009) $\r
+  Revision:       $Revision: 18875 $\r
+  Author:         $Author: lfriedman $\r
+\r
+  Description:    This file supports the SimpliciTI appliction layer API.\r
+\r
+  Copyright 2007-2009 Texas Instruments Incorporated. All rights reserved.\r
+\r
+  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+  the terms of a software license agreement between the user who downloaded the software,\r
+  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+  License. The License limits your use, and you acknowledge, that the Software may not be\r
+  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+  perform, display or sell this Software and/or its documentation for any purpose.\r
+\r
+  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+\r
+  Should you have any questions regarding your right to use this Software,\r
+  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+/******************************************************************************\r
+ * INCLUDES\r
+ */\r
+\r
+#include <string.h>\r
+#include "bsp.h"\r
+#include "mrfi.h"\r
+#include "nwk_types.h"\r
+#include "nwk_api.h"\r
+#include "nwk_frame.h"\r
+#include "nwk.h"\r
+#include "nwk_app.h"\r
+#include "mrfi.h"\r
+#include "nwk_globals.h"\r
+#include "nwk_freq.h"\r
+\r
+/******************************************************************************\r
+ * MACROS\r
+ */\r
+\r
+/******************************************************************************\r
+ * CONSTANTS AND DEFINES\r
+ */\r
+\r
+/* These defines are in support an application listening for a link frame to\r
+ * terminate after some amount of time. The intention is that this guard be\r
+ * the exception. The intention of the SimpliciTI design is that the\r
+ * temporal contiguity between the listen and the reception of the link frame\r
+ * from the peer be very tight. The SMPL_LinkListen() should be termninated\r
+ * by the reception of the link frame. But in case it does not receive the frame\r
+ * the support below allows intervention by the application.\r
+ */\r
+\r
+/* The intention is for user to modify just the following single value */\r
+#define LINKLISTEN_MILLISECONDS_2_WAIT    (5000)\r
+\r
+#define LINKLISTEN_POLL_PERIOD_MS         (10)\r
+#define LINKLISTEN_POLL_COUNT             ( (LINKLISTEN_MILLISECONDS_2_WAIT) / (LINKLISTEN_POLL_PERIOD_MS) )\r
+\r
+/******************************************************************************\r
+ * TYPEDEFS\r
+ */\r
+\r
+/******************************************************************************\r
+ * LOCAL VARIABLES\r
+ */\r
+// [BM] Workaround to enable multiple stack restarts \r
+// static uint8_t sInit_done = 0;\r
+uint8_t sInit_done = 0;\r
+\r
+/******************************************************************************\r
+ * LOCAL FUNCTIONS\r
+ */\r
+static uint8_t ioctlPreInitAccessIsOK(ioctlObject_t);\r
+\r
+/******************************************************************************\r
+ * GLOBAL VARIABLES\r
+ */\r
+\r
+/******************************************************************************\r
+ * GLOBAL FUNCTIONS\r
+ */\r
+\r
+/***********************************************************************************\r
+ * @fn          SMPL_Init\r
+ *\r
+ * @brief       Initialize the SimpliciTI stack.\r
+ *\r
+ * input parameters\r
+ * @param   f  - Pointer to call back function. Function called by NWK when\r
+ *               user application frame received. The callback is done in the\r
+ *               ISR thread. Argument is Link ID associated with frame. Function\r
+ *               returns 0 if frame is to be kept by NWK, otherwise 1. Frame\r
+ *               should be kept if application will do a SMPL_Receive() in the\r
+ *               user thread (recommended). Pointer may be NULL.\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   Status of operation:\r
+ *             SMPL_SUCCESS\r
+ *             SMPL_NO_JOIN     No Join reply. AP possibly not yet up.\r
+ *             SMPL_NO_CHANNEL  Only if Frequency Agility enabled. Channel scan\r
+ *                              failed. AP possibly not yet up.\r
+ */\r
+smplStatus_t SMPL_Init(uint8_t (*f)(linkID_t))\r
+{\r
+  smplStatus_t rc;\r
+\r
+  if (!sInit_done)\r
+  {\r
+    /* set up radio. */\r
+    MRFI_Init();\r
+\r
+    /* initialize network */\r
+    if ((rc=nwk_nwkInit(f)) != SMPL_SUCCESS)\r
+    {\r
+      return rc;\r
+    }\r
+\r
+    MRFI_WakeUp();\r
+#if defined( FREQUENCY_AGILITY )\r
+    {\r
+      freqEntry_t chan;\r
+\r
+      chan.logicalChan = 0;\r
+      /* ok to set default channel explicitly now that MRFI initialized. */\r
+      nwk_setChannel(&chan);\r
+    }\r
+#endif\r
+    /* don't turn Rx on if we're an end device that isn't always on. */\r
+#if !defined( END_DEVICE )\r
+    MRFI_RxOn();\r
+#endif\r
+\r
+#if defined( END_DEVICE )\r
+    /* All except End Devices are in promiscuous mode */\r
+    MRFI_SetRxAddrFilter((uint8_t *)nwk_getMyAddress());\r
+    MRFI_EnableRxAddrFilter();\r
+#endif\r
+  }\r
+  sInit_done = 1;\r
+\r
+  /* Join. if no AP or Join fails that status is returned. */\r
+  rc = nwk_join();\r
+\r
+  return rc;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          SMPL_LinkListen\r
+ *\r
+ * @brief       Listen for a link frame from a 'client' device.\r
+ *\r
+ * input parameters\r
+ *\r
+ * output parameters\r
+ * @param   linkID     - pointer to Link ID to be used by application to\r
+ *                       read and write to the linked peer.\r
+ *\r
+ * @return   status of operation.\r
+ *             SMPL_SUCCESS\r
+ *             SMPL_TIMEOUT  No link frame received during listen interval.\r
+*                            Interval set in #defines above. linkID not valid.\r
+ *\r
+ */\r
+\r
+smplStatus_t SMPL_LinkListen(linkID_t *linkID)\r
+{\r
+  uint8_t  radioState = MRFI_GetRadioState();\r
+  uint16_t i;\r
+  linkID_t locLinkID;\r
+\r
+  /* Set the context. We want to reject any link frames received if\r
+   * we're not listening. For example if we're an AP we are in\r
+   * promiscuous mode and we'll see any broadcast link frames.\r
+   */\r
+  nwk_setListenContext(LINK_LISTEN_ON);\r
+\r
+  NWK_CHECK_FOR_SETRX(radioState);\r
+\r
+  for (i=0; i<LINKLISTEN_POLL_COUNT; ++i)\r
+  {\r
+    /* check the semaphore. local port is assigned when the reply is sent. */\r
+    if ((locLinkID=nwk_getLocalLinkID()))\r
+    {\r
+      break;\r
+    }\r
+    NWK_DELAY(LINKLISTEN_POLL_PERIOD_MS);\r
+  }\r
+\r
+  NWK_CHECK_FOR_RESTORE_STATE(radioState);\r
+\r
+  /* If the listen is terminated without hearing a message and setting a\r
+   * link ID the listen context must be explicitly turned off.\r
+   */\r
+  if (!(locLinkID))\r
+  {\r
+    nwk_setListenContext(LINK_LISTEN_OFF);\r
+    return SMPL_TIMEOUT;\r
+  }\r
+\r
+  *linkID = locLinkID;\r
+\r
+  return SMPL_SUCCESS;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          SMPL_Send\r
+ *\r
+ * @brief       Send a message to a peer application. Old API kept for\r
+ *              backward compatibility. Calls the new SMPL_SendOpt() with\r
+ *              no options.\r
+ *\r
+ * input parameters\r
+ * @param   lid     - Link ID (port) from application\r
+ * @param   msg     - pointer to message from app to be sent\r
+ * @param   len     - length of enclosed message\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   Status of operation. On a filaure the frame buffer is discarded\r
+ *           and the Send call must be redone by the app.\r
+ *             SMPL_SUCCESS\r
+ *             SMPL_BAD_PARAM    No valid Connection Table entry for Link ID\r
+ *                               Data in Connection Table entry bad\r
+ *                               No message or message too long\r
+ *             SMPL_NOMEM        No room in output frame queue\r
+ *             SMPL_TX_CCA_FAIL  CCA failure.\r
+ */\r
+smplStatus_t SMPL_Send(linkID_t lid, uint8_t *msg, uint8_t len)\r
+{\r
+  return SMPL_SendOpt(lid, msg, len, SMPL_TXOPTION_NONE);\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          SMPL_SendOpt\r
+ *\r
+ * @brief       Send a message to a peer application.\r
+ *\r
+ * input parameters\r
+ * @param   lid     - Link ID (port) from application\r
+ * @param   msg     - pointer to message from app to be sent\r
+ * @param   len     - length of enclosed message\r
+ * @param   options - Transmit options (bit map)\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   Status of operation. On a filaure the frame buffer is discarded\r
+ *           and the Send call must be redone by the app.\r
+ *             SMPL_SUCCESS\r
+ *             SMPL_BAD_PARAM    No valid Connection Table entry for Link ID\r
+ *                               Data in Connection Table entry bad\r
+ *                               No message or message too long\r
+ *             SMPL_NOMEM        No room in output frame queue\r
+ *             SMPL_TX_CCA_FAIL  CCA failure.\r
+ *             SMPL_NO_ACK       If application auto acknowledgement enabled\r
+ *                               and no acknowledgement is received\r
+ */\r
+smplStatus_t SMPL_SendOpt(linkID_t lid, uint8_t *msg, uint8_t len, txOpt_t options)\r
+{\r
+  frameInfo_t  *pFrameInfo;\r
+  connInfo_t   *pCInfo     = nwk_getConnInfo(lid);\r
+  smplStatus_t  rc         = SMPL_BAD_PARAM;\r
+  uint8_t       radioState = MRFI_GetRadioState();\r
+  uint8_t       ackreq     = 0;\r
+#if defined(ACCESS_POINT)\r
+  uint8_t  loc;\r
+#endif\r
+\r
+  /* we have the connection info for this Link ID. make sure it is valid. */\r
+   if (!pCInfo || ((rc=nwk_checkConnInfo(pCInfo, CHK_TX)) != SMPL_SUCCESS))\r
+  {\r
+    return rc;\r
+  }\r
+\r
+  /* parameter sanity check... */\r
+  if (!msg || (len > MAX_APP_PAYLOAD))\r
+  {\r
+    return rc;\r
+  }\r
+\r
+  /* Build an outgoing message frame destined for the port from the\r
+   * connection info using the destination address also from the\r
+   * connection info.\r
+   */\r
+  if (SMPL_TXOPTION_NONE == options)\r
+  {\r
+    pFrameInfo = nwk_buildFrame(pCInfo->portTx, msg, len, pCInfo->hops2target);\r
+  }\r
+#if defined(APP_AUTO_ACK)\r
+  else if (options & SMPL_TXOPTION_ACKREQ)\r
+  {\r
+    if (SMPL_LINKID_USER_UUD != lid)\r
+    {\r
+      pFrameInfo = nwk_buildAckReqFrame(pCInfo->portTx, msg, len, pCInfo->hops2target, &pCInfo->ackTID);\r
+      ackreq     = 1;\r
+    }\r
+    else\r
+    {\r
+      /* can't request an ack on the UUD link ID */\r
+      return SMPL_BAD_PARAM;\r
+    }\r
+  }\r
+#endif  /* APP_AUTO_ACK */\r
+  else\r
+  {\r
+    return SMPL_BAD_PARAM;\r
+  }\r
+\r
+  if (!pFrameInfo)\r
+  {\r
+    return SMPL_NOMEM;\r
+  }\r
+  memcpy(MRFI_P_DST_ADDR(&pFrameInfo->mrfiPkt), pCInfo->peerAddr, NET_ADDR_SIZE);\r
+\r
+#if defined(SMPL_SECURE)\r
+  {\r
+    uint32_t *pUL = 0;\r
+\r
+    if (pCInfo->thisLinkID != SMPL_LINKID_USER_UUD)\r
+    {\r
+      pUL = &pCInfo->connTxCTR;\r
+    }\r
+    nwk_setSecureFrame(&pFrameInfo->mrfiPkt, len, pUL);\r
+  }\r
+#endif  /* SMPL_SECURE */\r
+\r
+#if defined(ACCESS_POINT)\r
+  /* If we are an AP trying to send to a polling device, don't do it.\r
+   * See if the target is a store-and-forward client.\r
+   */\r
+  if (nwk_isSandFClient(MRFI_P_DST_ADDR(&pFrameInfo->mrfiPkt), &loc))\r
+  {\r
+     pFrameInfo->fi_usage = FI_INUSE_UNTIL_FWD;\r
+     return SMPL_SUCCESS;\r
+  }\r
+  else\r
+#endif  /* ACCESS_POINT */\r
+  {\r
+    rc = nwk_sendFrame(pFrameInfo, MRFI_TX_TYPE_CCA);\r
+  }\r
+\r
+#if !defined(APP_AUTO_ACK)\r
+  /* save a little code space with this #if */\r
+  (void) ackreq;    /* keep compiler happy */\r
+  return rc;\r
+#else\r
+  /* we're done if the send failed or no ack requested. */\r
+  if (SMPL_SUCCESS != rc || !ackreq)\r
+  {\r
+    return rc;\r
+  }\r
+\r
+  NWK_CHECK_FOR_SETRX(radioState);\r
+  NWK_REPLY_DELAY();\r
+  NWK_CHECK_FOR_RESTORE_STATE(radioState);\r
+\r
+  {\r
+    bspIState_t intState;\r
+\r
+    /* If the saved TID hasn't been reset then we never got the ack. */\r
+    BSP_ENTER_CRITICAL_SECTION(intState);\r
+    if (pCInfo->ackTID)\r
+    {\r
+      pCInfo->ackTID = 0;\r
+      rc = SMPL_NO_ACK;\r
+    }\r
+    BSP_EXIT_CRITICAL_SECTION(intState);\r
+  }\r
+\r
+  return rc;\r
+#endif  /* APP_AUTO_ACK */\r
+}\r
+\r
+/**************************************************************************************\r
+ * @fn          SMPL_Receive\r
+ *\r
+ * @brief       Receive a message from a peer application.\r
+ *\r
+ * input parameters\r
+ * @param   lid     - Link ID (port) from application\r
+ *\r
+ *\r
+ * output parameters\r
+ * @param   msg     - pointer to where received message should be copied.\r
+ *                    buffer should be of size == MAX_APP_PAYLOAD\r
+ * @param   len     - pointer to receive length of received message\r
+ *\r
+ * @return    Status of operation.\r
+ *            Caller should not use the value returned in 'len' to decide\r
+ *            whether there is a frame or not. It could be useful to the\r
+ *            Caller to distinguish between no frame and a frame with no data.\r
+ *            For example, in the polling case a frame with no application payload\r
+ *            is the way the AP conveys that there are no frames waiting.\r
+ *\r
+ *              SMPL_SUCCESS\r
+ *\r
+ *              SMPL_BAD_PARAM  No valid Connection Table entry for Link ID\r
+ *                              Data in Connection Table entry bad\r
+ *              SMPL_NO_FRAME   No frame received.\r
+ *              SMPL_NO_PAYLOAD Frame received with no payload (not necessarily\r
+ *                              an error and could be deduced by application\r
+ *                              because the returned length will be 0)\r
+ *\r
+ *            Polling device only:\r
+ *\r
+ *              SMPL_TIMEOUT        No response from Access Point\r
+ *              SMPL_NO_AP_ADDRESS  Access Point address unknown\r
+ *              SMPL_TX_CCA_FAIL    Could not send poll frame\r
+ *              SMPL_NOMEM          No memory in output frame queue\r
+ *              SMPL_NO_CHANNEL     Frequency Agility enabled and could not find channel\r
+ */\r
+smplStatus_t SMPL_Receive(linkID_t lid, uint8_t *msg, uint8_t *len)\r
+{\r
+  connInfo_t  *pCInfo = nwk_getConnInfo(lid);\r
+  smplStatus_t rc = SMPL_BAD_PARAM;\r
+  rcvContext_t rcv;\r
+\r
+  if (!pCInfo || ((rc=nwk_checkConnInfo(pCInfo, CHK_RX)) != SMPL_SUCCESS))\r
+  {\r
+    return rc;\r
+  }\r
+\r
+  rcv.type  = RCV_APP_LID;\r
+  rcv.t.lid = lid;\r
+\r
+#if defined(RX_POLLS)\r
+  {\r
+    uint8_t numChans  = 1;\r
+#if defined(FREQUENCY_AGILITY)\r
+    freqEntry_t chans[NWK_FREQ_TBL_SIZE];\r
+    uint8_t     scannedB4 = 0;\r
+#endif\r
+\r
+    do\r
+    {\r
+      uint8_t radioState = MRFI_GetRadioState();\r
+\r
+      /* I'm polling. Do the poll to stimulate the sending of a frame. If the\r
+       * frame has application length of 0 it means there were no frames.  If\r
+       * no reply is received infer that the channel is changed. We then need\r
+       * to scan and then retry the poll on each channel returned.\r
+       */\r
+      if (SMPL_SUCCESS != (rc=nwk_poll(pCInfo->portRx, pCInfo->peerAddr)))\r
+      {\r
+        /* for some reason couldn't send the poll out. */\r
+        return rc;\r
+      }\r
+\r
+      /* do this before code block below which may reset it. */\r
+      numChans--;\r
+\r
+      /* Wait until there's a frame. if the len is 0 then return SMPL_NO_FRAME\r
+       * to the caller. In the poll case the AP always sends something.\r
+       */\r
+      NWK_CHECK_FOR_SETRX(radioState);\r
+      NWK_REPLY_DELAY();\r
+      NWK_CHECK_FOR_RESTORE_STATE(radioState);\r
+\r
+      /* TODO: deal with pending */\r
+      rc = nwk_retrieveFrame(&rcv, msg, len, 0, 0);\r
+\r
+#if defined(FREQUENCY_AGILITY)\r
+      if (SMPL_SUCCESS == rc)\r
+      {\r
+        /* we received something... */\r
+        return (*len) ? SMPL_SUCCESS : SMPL_NO_PAYLOAD;\r
+      }\r
+\r
+      /* No reply. scan for other channel(s) if we haven't already. Then set\r
+       * one and try again.\r
+       */\r
+      if (!scannedB4)\r
+      {\r
+        numChans  = nwk_scanForChannels(chans);\r
+        scannedB4 = 1;\r
+      }\r
+      if (numChans)\r
+      {\r
+        nwk_setChannel(&chans[numChans-1]);\r
+      }\r
+#else /*  FREQUENCY_AGILITY */\r
+      return (*len) ? rc : ((SMPL_SUCCESS == rc) ? SMPL_NO_PAYLOAD : SMPL_TIMEOUT);\r
+#endif\r
+    } while (numChans);\r
+  }\r
+\r
+#if defined(FREQUENCY_AGILITY)\r
+  return SMPL_NO_CHANNEL;\r
+#endif\r
+\r
+#else  /* RX_POLLS */\r
+  return nwk_retrieveFrame(&rcv, msg, len, 0, 0);\r
+#endif  /* RX_POLLS */\r
+}\r
+\r
+\r
+/******************************************************************************\r
+ * @fn          SMPL_Link\r
+ *\r
+ * @brief       Link to a peer.\r
+ *\r
+ * input parameters\r
+ *\r
+ * output parameters\r
+ * @param   lid     - pointer to where we should write the link ID to which the\r
+ *                    application will read and write.\r
+ *\r
+ * @return   Status of operation.\r
+ *             SMPL_SUCCESS\r
+ *             SMPL_NOMEM         No room to allocate local Rx port, no more\r
+ *                                room in Connection Table, or no room in\r
+ *                                output frame queue.\r
+ *             SMPL_NO_LINK       No reply frame during wait window.\r
+ *             SMPL_TX_CCA_FAIL   Could not send Link frame.\r
+ */\r
+smplStatus_t SMPL_Link(linkID_t *lid)\r
+{\r
+  return nwk_link(lid);\r
+}\r
+\r
+#if defined(EXTENDED_API)\r
+/**************************************************************************************\r
+ * @fn          SMPL_Unlink\r
+ *\r
+ * @brief       Tear down connection to a peer.\r
+ *\r
+ * input parameters\r
+ * @param   lid     - Link ID whose connection is to be terminated.\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   Status of operation. The Connection Table entry for the Link ID\r
+ *           is always freed successfuly. The returned status value is the\r
+ *           status of the _peer's_ connection tear-down as a result of the\r
+ *           message sent here.\r
+ *           SMPL_SUCCESS         Local and remote connection destroyed.\r
+ *           SMPL_BAD_PARAM       No local connection table entry for this Link ID\r
+ *           SMPL_TIMEOUT         No reply from peer.\r
+ *           SMPL_NO_PEER_UNLINK  Peer did not have a Connection Table entry for me.\r
+ */\r
+smplStatus_t SMPL_Unlink(linkID_t lid)\r
+{\r
+  return nwk_unlink(lid);\r
+}\r
+\r
+/**************************************************************************************\r
+ * @fn          SMPL_Ping\r
+ *\r
+ * @brief       Ping a peer. Synchronous call. Although a link ID is used it is the\r
+ *              NWK Ping application that is pinged, not the peer of this Link ID. The\r
+ *              peer is not expected to be the responder to the frame sent from here.\r
+ *              This API is a proxy for a real ping since the application doesn't\r
+ *              have direct access to SimpliciTI device addresses. Kind of hokey but a\r
+ *              useful keep-alive mechanism without having to support it with\r
+ *              user application service.\r
+ *\r
+ * input parameters\r
+ * @param   lid  - The link ID whose peer device address is used to direct the NWK Ping\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   Status of operation.\r
+ */\r
+smplStatus_t SMPL_Ping(linkID_t lid)\r
+{\r
+  return nwk_ping(lid);\r
+}\r
+\r
+/**************************************************************************************\r
+ * @fn          SMPL_Commission\r
+ *\r
+ * @brief       Commission a connection.\r
+ *\r
+ * input parameters\r
+ * @param   peerAddr  - Pointer to address of the peer for this connection\r
+ * @param    locPort  - Port on which to listen for messages from the peer\r
+ * @param    rmtPort  - Port on which to send messages to the peer.\r
+ * @param        lid  - Pointer to Link ID object. If content of location is\r
+ *                      non-zero on input the value is placed in the Connection\r
+ *                      object.\r
+ *\r
+ * output parameters\r
+ * @param        lid  - Pointer to Link ID object. If content of location is zero\r
+ *                      on input the value in the Connection object is stored there.\r
+ *\r
+ * @return   SMPL_SUCCESS\r
+ *           SMPL_NOMEM     - No room left in Connection table.\r
+ *           SMPL_BAD_PARAM - A pointer to a Link object was not supplied.\r
+ */\r
+smplStatus_t SMPL_Commission(addr_t *peerAddr, uint8_t locPort, uint8_t rmtPort, linkID_t *lid)\r
+{\r
+  connInfo_t   *pCInfo = nwk_getNextConnection();\r
+  smplStatus_t  rc     = SMPL_BAD_PARAM;\r
+\r
+  do {\r
+    if (pCInfo)\r
+    {\r
+      /* sanity checks... */\r
+\r
+      /* Check port info. */\r
+      if ((locPort > SMPL_PORT_STATIC_MAX) || (locPort < (SMPL_PORT_STATIC_MAX - PORT_USER_STATIC_NUM + 1)))\r
+      {\r
+        continue;\r
+      }\r
+\r
+      if ((rmtPort > SMPL_PORT_STATIC_MAX) || (rmtPort < (SMPL_PORT_STATIC_MAX - PORT_USER_STATIC_NUM + 1)))\r
+      {\r
+        continue;\r
+      }\r
+\r
+      /* Must supply a pointer to the Link ID object */\r
+      if (!lid)\r
+      {\r
+        /* No Link ID pointer supplied */\r
+        continue;\r
+      }\r
+\r
+      /* we're sane */\r
+\r
+      /* Use the value generated at connection object assign time. */\r
+      *lid = pCInfo->thisLinkID;\r
+\r
+      /* store peer's address */\r
+      memcpy(pCInfo->peerAddr, peerAddr, NET_ADDR_SIZE);\r
+\r
+      /* store port info */\r
+      pCInfo->portRx = locPort;\r
+      pCInfo->portTx = rmtPort;\r
+\r
+      pCInfo->hops2target = MAX_HOPS;\r
+\r
+      rc = SMPL_SUCCESS;\r
+    }\r
+    else\r
+    {\r
+      /* No room in Connection table */\r
+      rc = SMPL_NOMEM;\r
+    }\r
+  } while (0);\r
+\r
+  if ((SMPL_SUCCESS != rc) && pCInfo)\r
+  {\r
+    nwk_freeConnection(pCInfo);\r
+  }\r
+\r
+  return rc;\r
+}\r
+#endif   /* EXTENDED_API */\r
+\r
+/******************************************************************************\r
+ * @fn          SMPL_Ioctl\r
+ *\r
+ * @brief       This routine supplies the SimpliciTI IOCTL support.\r
+ *\r
+ * input parameters\r
+ * @param   object   - The IOCTL target object\r
+ * @param   action   - The IOCTL target action on the object\r
+ * @param   val      - pointer to value. exact forn depends on object type.\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   Status of action. Value depends on object, action, and result.\r
+ *\r
+ *           SMPL_BAD_PARAM is returned if this API is called before\r
+ *                          initialization and the object is not one of\r
+ *                          the valid exceptions.\r
+ */\r
+smplStatus_t SMPL_Ioctl(ioctlObject_t object, ioctlAction_t action, void *val)\r
+{\r
+  smplStatus_t rc;\r
+\r
+  /* if init hasn't occurred see if access is still valid */\r
+  if (!sInit_done && !ioctlPreInitAccessIsOK(object))\r
+  {\r
+    return SMPL_BAD_PARAM;\r
+  }\r
+\r
+  switch (object)\r
+  {\r
+#if defined(EXTENDED_API)\r
+    case IOCTL_OBJ_TOKEN:\r
+      {\r
+        ioctlToken_t *t = (ioctlToken_t *)val;\r
+\r
+        rc = SMPL_SUCCESS;\r
+        if (TT_LINK == t->tokenType)\r
+        {\r
+          if (IOCTL_ACT_SET == action)\r
+          {\r
+            nwk_setLinkToken(t->token.linkToken);\r
+          }\r
+          else if (IOCTL_ACT_GET == action)\r
+          {\r
+            nwk_getLinkToken(&t->token.linkToken);\r
+          }\r
+          else\r
+          {\r
+            rc = SMPL_BAD_PARAM;\r
+          }\r
+        }\r
+        else if (TT_JOIN == t->tokenType)\r
+        {\r
+          if (IOCTL_ACT_SET == action)\r
+          {\r
+            nwk_setJoinToken(t->token.joinToken);\r
+          }\r
+          else if (IOCTL_ACT_GET == action)\r
+          {\r
+            nwk_getJoinToken(&t->token.joinToken);\r
+          }\r
+          else\r
+          {\r
+            rc = SMPL_BAD_PARAM;\r
+          }\r
+        }\r
+        else\r
+        {\r
+          rc = SMPL_BAD_PARAM;\r
+        }\r
+      }\r
+      break;\r
+\r
+    case IOCTL_OBJ_NVOBJ:\r
+      rc = nwk_NVObj(action, (ioctlNVObj_t *)val);\r
+      break;\r
+#endif  /* EXTENDED_API */\r
+\r
+    case IOCTL_OBJ_CONNOBJ:\r
+      rc = nwk_connectionControl(action, val);\r
+      break;\r
+\r
+    case IOCTL_OBJ_ADDR:\r
+      if ((IOCTL_ACT_GET == action) || (IOCTL_ACT_SET == action))\r
+      {\r
+        rc = nwk_deviceAddress(action, (addr_t *)val);\r
+      }\r
+      else\r
+      {\r
+        rc = SMPL_BAD_PARAM;\r
+      }\r
+      break;\r
+\r
+    case IOCTL_OBJ_RAW_IO:\r
+      if (IOCTL_ACT_WRITE == action)\r
+      {\r
+        rc = nwk_rawSend((ioctlRawSend_t *)val);\r
+      }\r
+      else if (IOCTL_ACT_READ == action)\r
+      {\r
+        rc = nwk_rawReceive((ioctlRawReceive_t *)val);\r
+      }\r
+      else\r
+      {\r
+        rc = SMPL_BAD_PARAM;\r
+      }\r
+      break;\r
+\r
+    case IOCTL_OBJ_RADIO:\r
+      rc = nwk_radioControl(action, val);\r
+      break;\r
+\r
+#if defined(ACCESS_POINT)\r
+    case IOCTL_OBJ_AP_JOIN:\r
+      rc = nwk_joinContext(action);\r
+      break;\r
+#endif\r
+#if defined(FREQUENCY_AGILITY)\r
+    case IOCTL_OBJ_FREQ:\r
+      rc = nwk_freqControl(action, val);\r
+      break;\r
+#endif\r
+    case IOCTL_OBJ_FWVER:\r
+      if (IOCTL_ACT_GET == action)\r
+      {\r
+        memcpy(val, nwk_getFWVersion(), SMPL_FWVERSION_SIZE);\r
+        rc = SMPL_SUCCESS;\r
+      }\r
+      else\r
+      {\r
+        rc = SMPL_BAD_PARAM;\r
+      }\r
+      break;\r
+\r
+    case IOCTL_OBJ_PROTOVER:\r
+      if (IOCTL_ACT_GET == action)\r
+      {\r
+        *((uint8_t *)val) = nwk_getProtocolVersion();\r
+        rc = SMPL_SUCCESS;\r
+      }\r
+      else\r
+      {\r
+        rc = SMPL_BAD_PARAM;\r
+      }\r
+      break;\r
+\r
+    default:\r
+      rc = SMPL_BAD_PARAM;\r
+      break;\r
+  }\r
+\r
+  return rc;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          ioctlPreInitAccessIsOK\r
+ *\r
+ * @brief       Is the request legal yet? Most requests are not legal before\r
+ *              SMPL_Init().\r
+ *\r
+ * input parameters\r
+ * @param   object   - The IOCTL target object\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   Returns non-zero if request should be honored for further\r
+ *           processing, otherwise returns 0. This function does not\r
+ *           determine of the object-action pair are valid. It only knows\r
+ *           about exceptions, i.e., those that are valid before the\r
+ *           SMPL_Init() call.\r
+ *\r
+ */\r
+static uint8_t ioctlPreInitAccessIsOK(ioctlObject_t object)\r
+{\r
+  uint8_t rc;\r
+\r
+  /* Currently the only legal pre-init accesses are the address and\r
+   * the token objects.\r
+   */\r
+  switch (object)\r
+  {\r
+    case IOCTL_OBJ_ADDR:\r
+    case IOCTL_OBJ_TOKEN:\r
+      rc = 1;   /* legal */\r
+      break;\r
+\r
+    default:\r
+      rc = 0;   /* not legal when init not done */\r
+      break;\r
+  }\r
+\r
+  return rc;\r
+}\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/Components/nwk/nwk_api.h b/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/Components/nwk/nwk_api.h
new file mode 100755 (executable)
index 0000000..07ccf85
--- /dev/null
@@ -0,0 +1,56 @@
+/**************************************************************************************************\r
+  Filename:       nwk_api.h\r
+  Revised:        $Date: 2008-11-24 12:09:31 -0800 (Mon, 24 Nov 2008) $\r
+  Revision:       $Revision: 18508 $\r
+  Author:         $Author: lfriedman $\r
+\r
+  Description:    This header file supports the SimpliciTI appliction layer API.\r
+\r
+  Copyright 2004-2007 Texas Instruments Incorporated. All rights reserved.\r
+\r
+  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+  the terms of a software license agreement between the user who downloaded the software,\r
+  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+  License. The License limits your use, and you acknowledge, that the Software may not be\r
+  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+  perform, display or sell this Software and/or its documentation for any purpose.\r
+\r
+  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+\r
+  Should you have any questions regarding your right to use this Software,\r
+  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+#ifndef NWK_API_H\r
+#define NWK_API_H\r
+\r
+/* Tx options (bit map) */\r
+#define  SMPL_TXOPTION_NONE       ((txOpt_t)0x00)\r
+#define  SMPL_TXOPTION_ACKREQ     ((txOpt_t)0x01)\r
+\r
+smplStatus_t SMPL_Init(uint8_t (*)(linkID_t));\r
+smplStatus_t SMPL_Link(linkID_t *);\r
+smplStatus_t SMPL_LinkListen(linkID_t *);\r
+smplStatus_t SMPL_Send(linkID_t lid, uint8_t *msg, uint8_t len);\r
+smplStatus_t SMPL_SendOpt(linkID_t lid, uint8_t *msg, uint8_t len, txOpt_t);\r
+smplStatus_t SMPL_Receive(linkID_t lid, uint8_t *msg, uint8_t *len);\r
+smplStatus_t SMPL_Ioctl(ioctlObject_t, ioctlAction_t, void *);\r
+#ifdef EXTENDED_API\r
+smplStatus_t SMPL_Ping(linkID_t);\r
+smplStatus_t SMPL_Unlink(linkID_t);\r
+smplStatus_t SMPL_Commission(addr_t *, uint8_t, uint8_t, linkID_t *);\r
+#endif  /* EXTENDED_API */\r
+\r
+#endif\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/Components/nwk/nwk_app.h b/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/Components/nwk/nwk_app.h
new file mode 100755 (executable)
index 0000000..45883b4
--- /dev/null
@@ -0,0 +1,53 @@
+\r
+/**************************************************************************************************\r
+  Filename:       nwk_app.h\r
+  Revised:        $Date: 2007-07-10 11:21:35 -0700 (Tue, 10 Jul 2007) $\r
+  Revision:       $Revision: 14865 $\r
+  Author:         $Author: lfriedman $\r
+\r
+  Description:    This header file is for convenience and includes the headers for all the\r
+                  network applications.\r
+\r
+  Copyright 2004-2007 Texas Instruments Incorporated. All rights reserved.\r
+\r
+  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+  the terms of a software license agreement between the user who downloaded the software,\r
+  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+  License. The License limits your use, and you acknowledge, that the Software may not be\r
+  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+  perform, display or sell this Software and/or its documentation for any purpose.\r
+\r
+  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+\r
+  Should you have any questions regarding your right to use this Software,\r
+  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+\r
+\r
+\r
+#ifndef NWK_APP_H\r
+#define NWK_APP_H\r
+\r
+#include "nwk_freq.h"\r
+#include "nwk_ping.h"\r
+#include "nwk_link.h"\r
+#include "nwk_mgmt.h"\r
+#include "nwk_join.h"\r
+#include "nwk_security.h"\r
+#include "nwk_ioctl.h"\r
+\r
+#endif\r
+\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/Components/nwk/nwk_frame.c b/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/Components/nwk/nwk_frame.c
new file mode 100755 (executable)
index 0000000..4279b25
--- /dev/null
@@ -0,0 +1,948 @@
+/**************************************************************************************************\r
+  Filename:       nwk_frame.c\r
+  Revised:        $Date: 2009-03-10 16:21:40 -0700 (Tue, 10 Mar 2009) $\r
+  Revision:       $Revision: 19368 $\r
+  Author          $Author: lfriedman $\r
+\r
+  Description:    This file supports the SimpliciTI frame handling functions.\r
+\r
+  Copyright 2007-2009 Texas Instruments Incorporated. All rights reserved.\r
+\r
+  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+  the terms of a software license agreement between the user who downloaded the software,\r
+  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+  License. The License limits your use, and you acknowledge, that the Software may not be\r
+  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+  perform, display or sell this Software and/or its documentation for any purpose.\r
+\r
+  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+\r
+  Should you have any questions regarding your right to use this Software,\r
+  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+\r
+/******************************************************************************\r
+ * INCLUDES\r
+ */\r
+\r
+#include <string.h>\r
+#include "bsp.h"\r
+#include "mrfi.h"\r
+#include "nwk_types.h"\r
+#include "nwk_frame.h"\r
+#include "nwk.h"\r
+#include "nwk_app.h"\r
+#include "nwk_QMgmt.h"\r
+#include "nwk_globals.h"\r
+#include "nwk_mgmt.h"\r
+#include "nwk_security.h"\r
+\r
+/******************************************************************************\r
+ * MACROS\r
+ */\r
+\r
+/******************************************************************************\r
+ * CONSTANTS AND DEFINES\r
+ */\r
+\r
+/******************************************************************************\r
+ * TYPEDEFS\r
+ */\r
+\r
+/******************************************************************************\r
+ * LOCAL VARIABLES\r
+ */\r
+\r
+#if SIZE_INFRAME_Q > 0\r
+/* array of function pointers to handle NWK application frames */\r
+static  fhStatus_t (* const func[])(mrfiPacket_t *) = { nwk_processPing,\r
+                                                        nwk_processLink,\r
+                                                        nwk_processJoin,\r
+                                                        nwk_processSecurity,\r
+                                                        nwk_processFreq,\r
+                                                        nwk_processMgmt\r
+                                                      };\r
+#endif  /* SIZE_INFRAME_Q > 0 */\r
+\r
+static uint8_t sTRACTID = 0;\r
+\r
+static addr_t const *sMyAddr = NULL;\r
+\r
+static uint8_t  sMyRxType = 0, sMyTxType = 0;\r
+\r
+#if !defined(RX_POLLS)\r
+static uint8_t  (*spCallback)(linkID_t) = NULL;\r
+#endif\r
+\r
+/******************************************************************************\r
+ * LOCAL FUNCTIONS\r
+ */\r
+\r
+#if SIZE_INFRAME_Q > 0\r
+/* local helper functions for Rx devices */\r
+static void  dispatchFrame(frameInfo_t *);\r
+#if !defined(END_DEVICE)\r
+#if defined(ACCESS_POINT)\r
+/* only Access Points need to worry about duplicate S&F frames */\r
+uint8_t  isDupSandFFrame(mrfiPacket_t *);\r
+#endif /* ACCESS_POINT */\r
+#endif  /* !END_DEVICE */\r
+#endif  /* SIZE_INFRAME_Q > 0 */\r
+\r
+/******************************************************************************\r
+ * GLOBAL VARIABLES\r
+ */\r
+\r
+/******************************************************************************\r
+ * GLOBAL FUNCTIONS\r
+ */\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_frameInit\r
+ *\r
+ * @brief       Initialize network context.\r
+ *\r
+ * input parameters\r
+ *       pF - Pointer to callback function. If none intended should be NULL.\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return    void\r
+ */\r
+\r
+void nwk_frameInit(uint8_t (*pF)(linkID_t))\r
+{\r
+\r
+/****** Fill static values for the DEVICEINFO byte that will go in each frame ******/\r
+  /* Rx type when frame originates from this device. Set in nwk_buildFrame() */\r
+  /* Tx type when frame sent from this device. Set in nwk_sendframe() */\r
+#if !defined(END_DEVICE)\r
+    sMyRxType = F_RX_TYPE_USER_CTL;\r
+  #if defined(ACCESS_POINT)\r
+    sMyTxType = F_TX_DEVICE_AP;\r
+  #else\r
+    sMyTxType = F_TX_DEVICE_RE;\r
+  #endif\r
+#else\r
+    sMyTxType = F_TX_DEVICE_ED;\r
+  #if defined(RX_POLLS)\r
+    sMyRxType = F_RX_TYPE_POLLS;\r
+  #endif\r
+  #if defined(RX_USER)\r
+    sMyRxType = F_RX_TYPE_USER_CTL;\r
+  #endif\r
+#endif\r
+/****** DONE fill static values for the DEVICEINFO byte that will go in each frame ******/\r
+\r
+#if !defined(RX_POLLS)\r
+  spCallback = pF;\r
+#else\r
+  (void) pF;\r
+#endif\r
+\r
+  sMyAddr = nwk_getMyAddress();\r
+\r
+  while (!(sTRACTID=MRFI_RandomByte())) ;\r
+\r
+  return;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_buildFrame\r
+ *\r
+ * @brief       Builds an output frame for the port and message enclosed.\r
+ *              This routine prepends the frame header and populates the\r
+ *              frame in the output queue.\r
+ *\r
+ * input parameters\r
+ * @param   port    - port from application\r
+ * @param   msg     - pointer to message from app to be sent\r
+ * @param   len     - length of enclosed message\r
+ * @param   hops    - number of hops allowed. this is less than MAX_HOPS\r
+ *                    whenever the frame is being sent to the AP. this is to\r
+ *                    help mitigate the (short) broadcast storms\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   pointer to frameInfo_t structure created. NULL if there is\r
+ *           no room in output queue.\r
+ */\r
+frameInfo_t *nwk_buildFrame(uint8_t port, uint8_t *msg, uint8_t len, uint8_t hops)\r
+{\r
+  frameInfo_t  *fInfoPtr;\r
+\r
+  if (!(fInfoPtr=nwk_QfindSlot(OUTQ)))\r
+  {\r
+    return (frameInfo_t *)NULL;\r
+  }\r
+\r
+  MRFI_SET_PAYLOAD_LEN(&fInfoPtr->mrfiPkt, len+F_APP_PAYLOAD_OS);\r
+\r
+  PUT_INTO_FRAME(MRFI_P_PAYLOAD(&fInfoPtr->mrfiPkt), F_ENCRYPT_OS, 0);\r
+  PUT_INTO_FRAME(MRFI_P_PAYLOAD(&fInfoPtr->mrfiPkt), F_PORT_OS, port);\r
+  PUT_INTO_FRAME(MRFI_P_PAYLOAD(&fInfoPtr->mrfiPkt), F_TRACTID_OS, sTRACTID);\r
+  while (!(++sTRACTID)) ;  /* transaction ID can't be 0 */\r
+  PUT_INTO_FRAME(MRFI_P_PAYLOAD(&fInfoPtr->mrfiPkt), F_RX_TYPE, sMyRxType);\r
+  PUT_INTO_FRAME(MRFI_P_PAYLOAD(&fInfoPtr->mrfiPkt), F_HOP_COUNT, hops);\r
+\r
+  /* reset ack-relevant bits */\r
+  PUT_INTO_FRAME(MRFI_P_PAYLOAD(&fInfoPtr->mrfiPkt), F_ACK_REQ, 0);\r
+  PUT_INTO_FRAME(MRFI_P_PAYLOAD(&fInfoPtr->mrfiPkt), F_ACK_RPLY, 0);\r
+\r
+  /* reset forwarding bit */\r
+  PUT_INTO_FRAME(MRFI_P_PAYLOAD(&fInfoPtr->mrfiPkt), F_FWD_FRAME, 0);\r
+\r
+  memcpy(MRFI_P_PAYLOAD(&fInfoPtr->mrfiPkt)+F_APP_PAYLOAD_OS, msg, len);\r
+  memcpy(MRFI_P_SRC_ADDR(&fInfoPtr->mrfiPkt), sMyAddr, NET_ADDR_SIZE);\r
+\r
+  return fInfoPtr;\r
+}\r
+\r
+#if defined(APP_AUTO_ACK)\r
+/******************************************************************************\r
+ * @fn          nwk_buildAckReqFrame\r
+ *\r
+ * @brief       Builds an output frame for the port and message enclosed.\r
+ *              This routine prepends the frame header and populates the\r
+ *              frame in the output queue. The frame is set to request that\r
+ *              an ack frame be sent by the peer.\r
+ *\r
+ * input parameters\r
+ * @param   port    - port from application\r
+ * @param   msg     - pointer to message from app to be sent\r
+ * @param   len     - length of enclosed message\r
+ * @param   hops    - number of hops allowed. this is less than MAX_HOPS\r
+ *                    whenever the frame is being sent to the AP. this is to\r
+ *                    help mitigate the (short) broadcast storms\r
+ * @param   tid     - Transaction ID to insert in NWK header used to match\r
+ *                    the ack reply.\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   pointer to frameInfo_t structure created. NULL if there is\r
+ *           no room in output queue.\r
+ */\r
+frameInfo_t *nwk_buildAckReqFrame(uint8_t port, uint8_t *msg, uint8_t len, uint8_t hops, volatile uint8_t *tid)\r
+{\r
+  frameInfo_t *fInfoPtr;\r
+\r
+  /* Build a normal frame first. */\r
+  if (!(fInfoPtr=nwk_buildFrame(port, msg, len, hops)))\r
+  {\r
+    return (frameInfo_t *)NULL;\r
+  }\r
+\r
+  /* save TID  */\r
+  *tid = GET_FROM_FRAME(MRFI_P_PAYLOAD(&fInfoPtr->mrfiPkt), F_TRACTID_OS);\r
+  /* Set REQ_ACK bit */\r
+  PUT_INTO_FRAME(MRFI_P_PAYLOAD(&fInfoPtr->mrfiPkt), F_ACK_REQ, F_ACK_REQ_TYPE);\r
+\r
+  return fInfoPtr;\r
+}\r
+#endif  /* APP_AUTO_ACK */\r
+\r
+#if SIZE_INFRAME_Q > 0\r
+/******************************************************************************\r
+ * @fn          MRFI_RxCompleteISR\r
+ *\r
+ * @brief       Here on Rx interrupt from radio. Process received frame from the\r
+ *              radio Rx FIFO.\r
+ *\r
+ * input parameters\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return      void\r
+ */\r
+void MRFI_RxCompleteISR()\r
+{\r
+  frameInfo_t  *fInfoPtr;\r
+\r
+  /* room for more? */\r
+  if (fInfoPtr=nwk_QfindSlot(INQ))\r
+  {\r
+    MRFI_Receive(&fInfoPtr->mrfiPkt);\r
+\r
+    dispatchFrame(fInfoPtr);\r
+  }\r
+\r
+  return;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_retrieveFrame\r
+ *\r
+ * @brief       Retrieve frame from Rx frame queue. Invoked by application-level\r
+ *              code either app through SMPL_Receive() or IOCTL through raw Rx. This\r
+ *              should run in a user thread, not an ISR thread.\r
+ *\r
+ * input parameters\r
+ * @param    port    - port on which to get a frame\r
+ *\r
+ * output parameters\r
+ * @param    msg     - pointer to where app payload should be copied. Buffer\r
+ *                     allocated should be == MAX_APP_PAYLOAD.\r
+ *\r
+ * @param    len      - pointer to where payload length should be stored. Caller\r
+ *                      can check for non-zero when polling the port. initialized\r
+ *                      to 0 even if no frame is retrieved.\r
+ * @param    srcAddr  - if non-NULL, a pointer to where to copy the source address\r
+ *                      of the retrieved message.\r
+ * @param    hopCount - if non-NULL, a pointer to where to copy the hop count\r
+                        of the retrieved message.\r
+ *\r
+ * @return    SMPL_SUCCESS\r
+ *            SMPL_NO_FRAME  - no frame found for specified destination\r
+ *            SMPL_BAD_PARAM - no valid connection info for the Link ID\r
+ *\r
+ */\r
+smplStatus_t nwk_retrieveFrame(rcvContext_t *rcv, uint8_t *msg, uint8_t *len, addr_t *srcAddr, uint8_t *hopCount)\r
+{\r
+  frameInfo_t *fPtr;\r
+  uint8_t      done;\r
+\r
+  do {\r
+    /* look for a frame on requested port. */\r
+    *len = 0;\r
+    done = 1;\r
+\r
+    fPtr = nwk_QfindOldest(INQ, rcv, USAGE_NORMAL);\r
+    if (fPtr)\r
+    {\r
+      connInfo_t  *pCInfo = 0;\r
+\r
+      if (RCV_APP_LID == rcv->type)\r
+      {\r
+        pCInfo = nwk_getConnInfo(rcv->t.lid);\r
+        if (!pCInfo)\r
+        {\r
+          return SMPL_BAD_PARAM;\r
+        }\r
+#if defined(SMPL_SECURE)\r
+        /* decrypt here...we have all the context we need. */\r
+        {\r
+          uint32_t  ctr  = pCInfo->connRxCTR;\r
+          uint32_t *pctr = &ctr;\r
+          uint8_t   len  = MRFI_GET_PAYLOAD_LEN(&fPtr->mrfiPkt) - F_SEC_CTR_OS;\r
+\r
+          if (pCInfo->thisLinkID == SMPL_LINKID_USER_UUD)\r
+          {\r
+            pctr = NULL;\r
+          }\r
+#if defined(RX_POLLS)\r
+          else if ((F_APP_PAYLOAD_OS - F_SEC_CTR_OS) == len)\r
+          {\r
+            /* This was an empty poll reply frame generated by the AP.\r
+             * It uses the single-byte CTR value like network applications.\r
+             * We do not want to use the application layer counter in this case.\r
+             */\r
+            pctr = NULL;\r
+          }\r
+#endif\r
+          if (nwk_getSecureFrame(&fPtr->mrfiPkt, len, pctr))\r
+          {\r
+            if (pctr)\r
+            {\r
+              /* Update connection's counter. */\r
+              pCInfo->connRxCTR = ctr;\r
+            }\r
+          }\r
+          else\r
+          {\r
+            /* Frame bogus. Check for another frame. */\r
+            done = 0;\r
+            continue;\r
+          }\r
+        }\r
+#endif  /* SMPL_SECURE */\r
+      }\r
+\r
+      /* it's on the requested port. */\r
+      *len = MRFI_GET_PAYLOAD_LEN(&fPtr->mrfiPkt) - F_APP_PAYLOAD_OS;\r
+      memcpy(msg, MRFI_P_PAYLOAD(&fPtr->mrfiPkt)+F_APP_PAYLOAD_OS, *len);\r
+      /* save signal info */\r
+      if (pCInfo)\r
+      {\r
+        /* Save Rx metrics... */\r
+        pCInfo->sigInfo.rssi = fPtr->mrfiPkt.rxMetrics[MRFI_RX_METRICS_RSSI_OFS];\r
+        pCInfo->sigInfo.lqi  = fPtr->mrfiPkt.rxMetrics[MRFI_RX_METRICS_CRC_LQI_OFS];\r
+      }\r
+      if (srcAddr)\r
+      {\r
+        /* copy source address if requested */\r
+        memcpy(srcAddr, MRFI_P_SRC_ADDR(&fPtr->mrfiPkt), NET_ADDR_SIZE);\r
+      }\r
+      if (hopCount)\r
+      {\r
+        /* copy hop count if requested */\r
+        *hopCount = GET_FROM_FRAME(MRFI_P_PAYLOAD(&fPtr->mrfiPkt), F_HOP_COUNT);\r
+      }\r
+      /* input frame no longer needed. free it. */\r
+      nwk_QadjustOrder(INQ, fPtr->orderStamp);\r
+\r
+      fPtr->fi_usage = FI_AVAILABLE;\r
+      return SMPL_SUCCESS;\r
+    }\r
+  } while (!done);\r
+\r
+  return SMPL_NO_FRAME;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          dispatchFrame\r
+ *\r
+ * @brief       Received frame looks OK so far. Dispatch to either NWK app by\r
+ *              invoking the handler or the user's app by simply leaving the\r
+ *              frame in the queue and letting the app poll the port.\r
+ *\r
+ * input parameters\r
+ * @param   fiPtr    - frameInfo_t pointer to received frame\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   void\r
+ */\r
+static void dispatchFrame(frameInfo_t *fiPtr)\r
+{\r
+  uint8_t     port       = GET_FROM_FRAME(MRFI_P_PAYLOAD(&fiPtr->mrfiPkt), F_PORT_OS);\r
+  uint8_t     nwkAppSize = sizeof(func)/sizeof(func[0]);\r
+  fhStatus_t  rc;\r
+  linkID_t    lid;\r
+#if defined(ACCESS_POINT)\r
+  uint8_t loc;\r
+#endif\r
+#if !defined(END_DEVICE)\r
+  uint8_t isForMe;\r
+#endif\r
+\r
+  /* be sure it's not an echo... */\r
+  if (!memcmp(MRFI_P_SRC_ADDR(&fiPtr->mrfiPkt), sMyAddr, NET_ADDR_SIZE))\r
+  {\r
+    fiPtr->fi_usage = FI_AVAILABLE;\r
+    return;\r
+  }\r
+\r
+  /* Make sure encyrption bit conforms to our security support context. */\r
+#if defined(SMPL_SECURE)\r
+  if (!(GET_FROM_FRAME(MRFI_P_PAYLOAD(&fiPtr->mrfiPkt), F_ENCRYPT_OS)))\r
+  {\r
+    /* Encyrption bit is not on when when it should be */\r
+    fiPtr->fi_usage = FI_AVAILABLE;\r
+    return;\r
+  }\r
+#else\r
+  if (GET_FROM_FRAME(MRFI_P_PAYLOAD(&fiPtr->mrfiPkt), F_ENCRYPT_OS))\r
+  {\r
+    /* Encyrption bit is on when when it should not be */\r
+    fiPtr->fi_usage = FI_AVAILABLE;\r
+    return;\r
+  }\r
+#endif  /* SMPL_SECURE */\r
+\r
+  /* If it's a network application port dispatch to service routine. Dispose\r
+   * of frame depending on return code.\r
+   */\r
+  if (port && (port <= nwkAppSize))\r
+  {\r
+#if defined(SMPL_SECURE)\r
+    /* Non-connection-based frame. We can decode here if it was encrypted */\r
+    if (!nwk_getSecureFrame(&fiPtr->mrfiPkt, MRFI_GET_PAYLOAD_LEN(&fiPtr->mrfiPkt) - F_SEC_CTR_OS, 0))\r
+    {\r
+      fiPtr->fi_usage = FI_AVAILABLE;\r
+      return;\r
+    }\r
+#endif\r
+    rc = func[port-1](&fiPtr->mrfiPkt);\r
+    if (FHS_KEEP == rc)\r
+    {\r
+      fiPtr->fi_usage = FI_INUSE_UNTIL_DEL;\r
+    }\r
+#if !defined(END_DEVICE)\r
+    else if (FHS_REPLAY == rc)\r
+    {\r
+      /* an AP or an RE could be relaying a NWK application frame... */\r
+      nwk_replayFrame(fiPtr);\r
+    }\r
+#endif\r
+    else  /* rc == FHS_RELEASE (default...) */\r
+    {\r
+      fiPtr->fi_usage = FI_AVAILABLE;\r
+    }\r
+    return;\r
+  }\r
+  /* sanity check */\r
+  else if ((port != SMPL_PORT_USER_BCAST) && ((port < PORT_BASE_NUMBER) || (port > SMPL_PORT_STATIC_MAX)))\r
+  {\r
+    /* bogus port. drop frame */\r
+    fiPtr->fi_usage = FI_AVAILABLE;\r
+    return;\r
+  }\r
+\r
+  /* At this point we know the target is a user app. If this is an end device\r
+   * and we got this far save the frame and we're done. If we're an AP there\r
+   * are 3 cases: it's for us, it's for s store-and-forward client, or we need\r
+   * to replay the frame. If we're and RE and the frame didn't come from an RE\r
+   * and it's not for us, replay the frame.\r
+   */\r
+\r
+#if defined(END_DEVICE)\r
+  /* If we're s polling end device we only accept application frames from\r
+   * the AP. This prevents duplicate reception if we happen to be on when\r
+   * a linked peer sends.\r
+   */\r
+#if defined(RX_POLLS)\r
+  if (F_TX_DEVICE_ED != GET_FROM_FRAME(MRFI_P_PAYLOAD(&fiPtr->mrfiPkt), F_TX_DEVICE))\r
+  {\r
+    if (nwk_isConnectionValid(&fiPtr->mrfiPkt, &lid))\r
+    {\r
+      fiPtr->fi_usage = FI_INUSE_UNTIL_DEL;\r
+    }\r
+    else\r
+    {\r
+      fiPtr->fi_usage = FI_AVAILABLE;\r
+    }\r
+  }\r
+  else\r
+  {\r
+    fiPtr->fi_usage = FI_AVAILABLE;\r
+  }\r
+#else\r
+  /* it's destined for a user app. */\r
+  if (nwk_isConnectionValid(&fiPtr->mrfiPkt, &lid))\r
+  {\r
+    fiPtr->fi_usage = FI_INUSE_UNTIL_DEL;\r
+    if (spCallback && spCallback(lid))\r
+    {\r
+      fiPtr->fi_usage = FI_AVAILABLE;\r
+      return;\r
+    }\r
+  }\r
+  else\r
+  {\r
+    fiPtr->fi_usage = FI_AVAILABLE;\r
+  }\r
+#endif  /* RX_POLLS */\r
+\r
+#else   /* END_DEVICE */\r
+\r
+  /* We have an issue if the frame is broadcast to the UUD port. The AP (or RE) must\r
+   * handle this frame as if it were the target in case there is an application\r
+   * running that is listening on that port. But if it's a broadcast it must also be\r
+   * replayed. It isn't enough just to test for the UUD port because it could be a\r
+   * directed frame to another device. We must check explicitly for broadcast\r
+   * destination address.\r
+   */\r
+  isForMe = !memcmp(sMyAddr, MRFI_P_DST_ADDR(&fiPtr->mrfiPkt), NET_ADDR_SIZE);\r
+  if (isForMe || ((port == SMPL_PORT_USER_BCAST) && !memcmp(nwk_getBCastAddress(), MRFI_P_DST_ADDR(&fiPtr->mrfiPkt), NET_ADDR_SIZE)))\r
+  {\r
+    /* The folllowing test will succeed for the UUD port regardless of the\r
+     * source address.\r
+     */\r
+    if (nwk_isConnectionValid(&fiPtr->mrfiPkt, &lid))\r
+    {\r
+      /* If this is for the UUD port and we are here then the device is either\r
+       * an AP or an RE. In either case it must replay the UUD port frame if the\r
+       * frame is not "for me". But it also must handle it since it could have a\r
+       * UUD-listening application. Do the reply first and let the subsequent code\r
+       * correctly set the frame usage state. Note that the routine return can be\r
+       * from this code block. If not it will drop through to the bottom without\r
+       * doing a replay.\r
+       */\r
+      /* Do I need to replay it? */\r
+      if (!isForMe)\r
+      {\r
+        /* must be a broadcast for the UUD port */\r
+        nwk_replayFrame(fiPtr);\r
+      }\r
+      /* OK. Now I handle it... */\r
+      fiPtr->fi_usage = FI_INUSE_UNTIL_DEL;\r
+      if (spCallback && spCallback(lid))\r
+      {\r
+        fiPtr->fi_usage = FI_AVAILABLE;\r
+        return;\r
+      }\r
+    }\r
+    else\r
+    {\r
+      fiPtr->fi_usage = FI_AVAILABLE;\r
+    }\r
+  }\r
+#if defined( ACCESS_POINT )\r
+  /* Check to see if we need to save this for a S and F client. Otherwise,\r
+   * if it's not for us, get rid of it.\r
+   */\r
+  else if (nwk_isSandFClient(MRFI_P_DST_ADDR(&fiPtr->mrfiPkt), &loc))\r
+  {\r
+    /* Don't bother if it is a duplicate frame or if it's a forwarded frame\r
+     * echoed back from an RE.\r
+     */\r
+    if (!isDupSandFFrame(&fiPtr->mrfiPkt) &&\r
+        !(GET_FROM_FRAME(MRFI_P_PAYLOAD(&fiPtr->mrfiPkt), F_FWD_FRAME))\r
+       )\r
+    {\r
+#if defined(APP_AUTO_ACK)\r
+      /* Make sure ack request bit is off. Sender will have gone away. */\r
+      PUT_INTO_FRAME(MRFI_P_PAYLOAD(&fiPtr->mrfiPkt), F_ACK_REQ, 0);\r
+#endif\r
+      fiPtr->fi_usage = FI_INUSE_UNTIL_FWD;\r
+    }\r
+    else\r
+    {\r
+      fiPtr->fi_usage = FI_AVAILABLE;\r
+    }\r
+  }\r
+  else if (GET_FROM_FRAME(MRFI_P_PAYLOAD(&fiPtr->mrfiPkt), F_TX_DEVICE) == F_TX_DEVICE_AP)\r
+  {\r
+    /* I'm an AP and this frame came from an AP. Don't replay. */\r
+    fiPtr->fi_usage = FI_AVAILABLE;\r
+  }\r
+#elif defined( RANGE_EXTENDER )\r
+  else if (GET_FROM_FRAME(MRFI_P_PAYLOAD(&fiPtr->mrfiPkt), F_TX_DEVICE) == F_TX_DEVICE_RE)\r
+  {\r
+    /* I'm an RE and this frame came from an RE. Don't replay. */\r
+    fiPtr->fi_usage = FI_AVAILABLE;\r
+  }\r
+#endif\r
+  else\r
+  {\r
+    /* It's not for me and I'm either an AP or I'm an RE and the frame\r
+     * didn't come from an RE. Replay the frame.\r
+     */\r
+    nwk_replayFrame(fiPtr);\r
+  }\r
+#endif  /* !END_DEVICE */\r
+  return;\r
+}\r
+#endif   /* SIZE_INFRAME_Q > 0 */\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_sendFrame\r
+ *\r
+ * @brief       Send a frame by copying it to the radio Tx FIFO.\r
+ *\r
+ * input parameters\r
+ * @param   pFrameInfo   - pointer to frame to be sent\r
+ * @param   txOption     - do CCA or force frame out.\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return    SMPL_SUCCESS\r
+ *            SMPL_TX_CCA_FAIL Tx failed because of CCA failure.\r
+ *                             Tx FIFO flushed in this case.\r
+ */\r
+smplStatus_t nwk_sendFrame(frameInfo_t *pFrameInfo, uint8_t txOption)\r
+{\r
+  smplStatus_t rc;\r
+\r
+  /* set the type of device sending the frame in the header */\r
+  PUT_INTO_FRAME(MRFI_P_PAYLOAD(&pFrameInfo->mrfiPkt), F_TX_DEVICE, sMyTxType);\r
+\r
+  if (MRFI_TX_RESULT_SUCCESS == MRFI_Transmit(&pFrameInfo->mrfiPkt, txOption))\r
+  {\r
+    rc = SMPL_SUCCESS;\r
+  }\r
+  else\r
+  {\r
+    /* Tx failed -- probably CCA. free up frame buffer. We do not have NWK\r
+     * level retries. Let application do it.\r
+     */\r
+    rc = SMPL_TX_CCA_FAIL;\r
+  }\r
+\r
+  /* TX is done. free up the frame buffer */\r
+  pFrameInfo->fi_usage = FI_AVAILABLE;\r
+\r
+  return rc;\r
+}\r
+\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_getMyRxType\r
+ *\r
+ * @brief       Get my Rx type. Used to help populate the hops count in the\r
+ *              frame header to try and limit the broadcast storm. Info is\r
+ *              exchanged when linking.\r
+ *\r
+ * input parameters\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return      The address LSB.\r
+ */\r
+uint8_t nwk_getMyRxType(void)\r
+{\r
+  return sMyRxType;\r
+}\r
+\r
+#if defined(APP_AUTO_ACK)\r
+/******************************************************************************\r
+ * @fn          nwk_sendAckReply\r
+ *\r
+ * @brief       Send an acknowledgement reply frame.\r
+ *\r
+ * input parameters\r
+ * @param   frame   - pointer to frame with ack request.\r
+ * @param   port    - port on whcih reply expected.\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return      void\r
+ */\r
+void nwk_sendAckReply(mrfiPacket_t *frame, uint8_t port)\r
+{\r
+  mrfiPacket_t dFrame;\r
+  uint8_t      tid = GET_FROM_FRAME(MRFI_P_PAYLOAD(frame), F_TRACTID_OS);\r
+\r
+  /* set the type of device sending the frame in the header */\r
+  PUT_INTO_FRAME(MRFI_P_PAYLOAD(&dFrame), F_TX_DEVICE, sMyTxType);\r
+\r
+  /* set the listen type of device sending the frame in the header. */\r
+  PUT_INTO_FRAME(MRFI_P_PAYLOAD(&dFrame), F_RX_TYPE, sMyRxType);\r
+\r
+  /* destination address from received frame */\r
+  memcpy(MRFI_P_DST_ADDR(&dFrame), MRFI_P_SRC_ADDR(frame), NET_ADDR_SIZE);\r
+\r
+  /* source address */\r
+  memcpy(MRFI_P_SRC_ADDR(&dFrame), sMyAddr, NET_ADDR_SIZE);\r
+\r
+  /* port is the source the Tx port from the connection object */\r
+  PUT_INTO_FRAME(MRFI_P_PAYLOAD(&dFrame), F_PORT_OS, port);\r
+\r
+  /* frame length... */\r
+  MRFI_SET_PAYLOAD_LEN(&dFrame,F_APP_PAYLOAD_OS);\r
+\r
+  /* transaction ID taken from source frame */\r
+  PUT_INTO_FRAME(MRFI_P_PAYLOAD(&dFrame), F_TRACTID_OS, tid);\r
+\r
+  /* hop count... */\r
+  PUT_INTO_FRAME(MRFI_P_PAYLOAD(&dFrame), F_HOP_COUNT, MAX_HOPS);\r
+\r
+  /* set ACK field */\r
+  PUT_INTO_FRAME(MRFI_P_PAYLOAD(&dFrame), F_ACK_RPLY, F_ACK_RPLY_TYPE);\r
+  PUT_INTO_FRAME(MRFI_P_PAYLOAD(&dFrame), F_ACK_REQ, 0);\r
+\r
+   /* This is not a forwarded frame */\r
+  PUT_INTO_FRAME(MRFI_P_PAYLOAD(&dFrame), F_FWD_FRAME, 0);\r
+\r
+  /* Encryption state */\r
+#if !defined(SMPL_SECURE)\r
+  PUT_INTO_FRAME(MRFI_P_PAYLOAD(&dFrame), F_ENCRYPT_OS, 0);\r
+#else\r
+  PUT_INTO_FRAME(MRFI_P_PAYLOAD(&dFrame), F_ENCRYPT_OS, F_ENCRYPT_OS_MSK);\r
+  nwk_setSecureFrame(&dFrame, 0, 0);\r
+#endif\r
+\r
+  MRFI_Transmit(&dFrame, MRFI_TX_TYPE_FORCED);\r
+\r
+  return;\r
+}\r
+#endif /* APP_AUTO_ACK */\r
+\r
+#if !defined(END_DEVICE)\r
+/******************************************************************************\r
+ * @fn          nwk_replayFrame\r
+ *\r
+ * @brief       Deal with hop count on a Range Extender or Access Point replay.\r
+ *              Queue entry usage always left as available when done.\r
+ *\r
+ * input parameters\r
+ * @param   pFrameInfo   - pointer to frame information structure\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return      void\r
+ */\r
+void nwk_replayFrame(frameInfo_t *pFrameInfo)\r
+{\r
+  uint8_t  hops = GET_FROM_FRAME(MRFI_P_PAYLOAD(&pFrameInfo->mrfiPkt), F_HOP_COUNT);\r
+\r
+  /* if hops are zero, drop frame. othewise send it. */\r
+  if (hops--)\r
+  {\r
+    PUT_INTO_FRAME(MRFI_P_PAYLOAD(&pFrameInfo->mrfiPkt),F_HOP_COUNT,hops);\r
+    /* Don't care if the Tx fails because of TO. Either someone else\r
+     * will retransmit or the application itself will recover.\r
+     */\r
+#if defined(SMPL_SECURE)\r
+    /* If the frame was targeted to a NWK port it was decrypted on spec in\r
+     * the 'dispatchFrame()' method. It must be re-encypted in this case.\r
+     */\r
+    if (GET_FROM_FRAME(MRFI_P_PAYLOAD(&pFrameInfo->mrfiPkt), F_PORT_OS) <= SMPL_PORT_NWK_BCAST)\r
+    {\r
+      nwk_setSecureFrame(&pFrameInfo->mrfiPkt, MRFI_GET_PAYLOAD_LEN(&pFrameInfo->mrfiPkt)-F_APP_PAYLOAD_OS, 0);\r
+    }\r
+#endif\r
+    MRFI_DelayMs(1);\r
+    nwk_sendFrame(pFrameInfo, MRFI_TX_TYPE_CCA);\r
+  }\r
+  else\r
+  {\r
+    pFrameInfo->fi_usage = FI_AVAILABLE;\r
+  }\r
+  return;\r
+}\r
+\r
+#if defined(ACCESS_POINT)\r
+/******************************************************************************\r
+ * @fn          nwk_getSandFFrame\r
+ *\r
+ * @brief       Get any frame waiting for the client on the port supplied in\r
+ *              the frame payload.\r
+ *              TODO: support returning NWK application frames always. the\r
+ *              port requested in the call should be an user application port.\r
+ *              NWK app ports will never be in the called frame.\r
+ *              TODO: deal with broadcast NWK frames from AP.\r
+ *\r
+ * input parameters\r
+ * @param   frame   - pointer to frame in question\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return      pointer to frame if there is one, otherwise 0.\r
+ */\r
+frameInfo_t *nwk_getSandFFrame(mrfiPacket_t *frame, uint8_t osPort)\r
+{\r
+  uint8_t        i, port = *(MRFI_P_PAYLOAD(frame)+F_APP_PAYLOAD_OS+osPort);\r
+  frameInfo_t *fiPtr;\r
+  rcvContext_t rcv;\r
+\r
+  rcv.type  = RCV_RAW_POLL_FRAME;\r
+  rcv.t.pkt = frame;\r
+  /* check the input queue for messages sent by others. */\r
+  if (fiPtr=nwk_QfindOldest(INQ, &rcv, USAGE_FWD))\r
+  {\r
+    return fiPtr;\r
+  }\r
+\r
+  /* Check the output queue to see if we ourselves need to send anything.\r
+   * TODO: use the cast-out scheme for output queue so this routine finds\r
+   * the oldest in either queue.\r
+   */\r
+  fiPtr = nwk_getQ(OUTQ);\r
+  for (i=0; i<SIZE_OUTFRAME_Q; ++i, fiPtr++)\r
+  {\r
+    if (FI_INUSE_UNTIL_FWD == fiPtr->fi_usage)\r
+    {\r
+      if (!memcmp(MRFI_P_DST_ADDR(&fiPtr->mrfiPkt), MRFI_P_SRC_ADDR(frame), NET_ADDR_SIZE))\r
+      {\r
+        if (GET_FROM_FRAME(MRFI_P_PAYLOAD(&fiPtr->mrfiPkt), F_PORT_OS) == port)\r
+        {\r
+          return fiPtr;\r
+        }\r
+      }\r
+    }\r
+  }\r
+  return 0;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_SendEmptyPollRspFrame\r
+ *\r
+ * @brief       There are no frames waiting for the requester on the specified\r
+ *              port. Send a frame back to that port with no payload.\r
+ *\r
+ * input parameters\r
+ * @param   frame   - pointer to frame in question\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return      void\r
+ */\r
+void nwk_SendEmptyPollRspFrame(mrfiPacket_t *frame)\r
+{\r
+  mrfiPacket_t dFrame;\r
+  uint8_t      port = *(MRFI_P_PAYLOAD(frame)+F_APP_PAYLOAD_OS+M_POLL_PORT_OS);\r
+\r
+  /* set the type of device sending the frame in the header. we know it's an AP */\r
+  PUT_INTO_FRAME(MRFI_P_PAYLOAD(&dFrame), F_TX_DEVICE, F_TX_DEVICE_AP);\r
+  /* set the listen type of device sending the frame in the header. we know it's\r
+   * an AP is is probably always on...but use the static variable anyway.\r
+   */\r
+  PUT_INTO_FRAME(MRFI_P_PAYLOAD(&dFrame), F_RX_TYPE, sMyRxType);\r
+  /* destination address from received frame (polling device) */\r
+  memcpy(MRFI_P_DST_ADDR(&dFrame), MRFI_P_SRC_ADDR(frame), NET_ADDR_SIZE);\r
+  /* source address */\r
+  memcpy(MRFI_P_SRC_ADDR(&dFrame), MRFI_P_PAYLOAD(frame)+F_APP_PAYLOAD_OS+M_POLL_ADDR_OS, NET_ADDR_SIZE);\r
+  /* port is the port requested */\r
+  PUT_INTO_FRAME(MRFI_P_PAYLOAD(&dFrame), F_PORT_OS, port);\r
+  /* frame length... */\r
+  MRFI_SET_PAYLOAD_LEN(&dFrame,F_APP_PAYLOAD_OS);\r
+  /* transaction ID... */\r
+  PUT_INTO_FRAME(MRFI_P_PAYLOAD(&dFrame), F_TRACTID_OS, sTRACTID);\r
+  sTRACTID++;\r
+  /* hop count... */\r
+  PUT_INTO_FRAME(MRFI_P_PAYLOAD(&dFrame), F_HOP_COUNT, MAX_HOPS_FROM_AP);\r
+\r
+  /* Ack fields */\r
+  PUT_INTO_FRAME(MRFI_P_PAYLOAD(&dFrame), F_ACK_RPLY, 0);\r
+  PUT_INTO_FRAME(MRFI_P_PAYLOAD(&dFrame), F_ACK_REQ, 0);\r
+\r
+  /* This is logically a forwarded frame */\r
+  PUT_INTO_FRAME(MRFI_P_PAYLOAD(&dFrame), F_FWD_FRAME, F_FRAME_FWD_TYPE);\r
+\r
+  /* Encryption state */\r
+#if !defined(SMPL_SECURE)\r
+  PUT_INTO_FRAME(MRFI_P_PAYLOAD(&dFrame), F_ENCRYPT_OS, 0);\r
+#else\r
+  PUT_INTO_FRAME(MRFI_P_PAYLOAD(&dFrame), F_ENCRYPT_OS, F_ENCRYPT_OS_MSK);\r
+  nwk_setSecureFrame(&dFrame, 0, 0);\r
+#endif\r
+\r
+  MRFI_Transmit(&dFrame, MRFI_TX_TYPE_FORCED);\r
+\r
+  return;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          isDupSandFFrame\r
+ *\r
+ * @brief       Have we already stored this frame on behalf of a client?\r
+ *\r
+ * input parameters\r
+ * @param   frame   - pointer to frame in question\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return      Returns 1 if the frame is a duplicate, otherwise 0.\r
+ */\r
+uint8_t  isDupSandFFrame(mrfiPacket_t *frame)\r
+{\r
+  uint8_t      i, plLen = MRFI_GET_PAYLOAD_LEN(frame);\r
+  frameInfo_t *fiPtr;\r
+\r
+  /* check the input queue for duplicate S&F frame. */\r
+  fiPtr = nwk_getQ(INQ);\r
+  for (i=0; i<SIZE_INFRAME_Q; ++i, fiPtr++)\r
+  {\r
+    if (FI_INUSE_UNTIL_FWD == fiPtr->fi_usage)\r
+    {\r
+      /* compare everything except the DEVICE INFO byte. */\r
+      if (MRFI_GET_PAYLOAD_LEN(&fiPtr->mrfiPkt) == plLen                                   &&\r
+          !memcmp(MRFI_P_DST_ADDR(&fiPtr->mrfiPkt), MRFI_P_DST_ADDR(frame), NET_ADDR_SIZE) &&\r
+          !memcmp(MRFI_P_SRC_ADDR(&fiPtr->mrfiPkt), MRFI_P_SRC_ADDR(frame), NET_ADDR_SIZE) &&\r
+          !memcmp(MRFI_P_PAYLOAD(&fiPtr->mrfiPkt), MRFI_P_PAYLOAD(frame), 1)               &&\r
+          !memcmp(MRFI_P_PAYLOAD(&fiPtr->mrfiPkt)+F_TRACTID_OS, MRFI_P_PAYLOAD(frame)+F_TRACTID_OS, plLen-F_TRACTID_OS)\r
+          )\r
+      {\r
+        return 1;\r
+      }\r
+    }\r
+  }\r
+  return 0;\r
+}\r
+#endif  /* ACCESS_POINT */\r
+\r
+#endif  /* !END_DEVICE */\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/Components/nwk/nwk_frame.h b/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/Components/nwk/nwk_frame.h
new file mode 100755 (executable)
index 0000000..6c616f8
--- /dev/null
@@ -0,0 +1,151 @@
+/**************************************************************************************************\r
+  Filename:       nwk_frame.h\r
+  Revised:        $Date: 2008-12-23 13:49:41 -0800 (Tue, 23 Dec 2008) $\r
+  Revision:       $Revision: 18651 $\r
+  Author:         $Author: lfriedman $\r
+\r
+  Description:    This header file supports the SimpliciTI frame handling functions.\r
+\r
+  Copyright 2004-2007 Texas Instruments Incorporated. All rights reserved.\r
+\r
+  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+  the terms of a software license agreement between the user who downloaded the software,\r
+  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+  License. The License limits your use, and you acknowledge, that the Software may not be\r
+  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+  perform, display or sell this Software and/or its documentation for any purpose.\r
+\r
+  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+\r
+  Should you have any questions regarding your right to use this Software,\r
+  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+\r
+#ifndef NWK_FRAME_H\r
+#define NWK_FRAME_H\r
+\r
+/* Frame field defines and masks. Mask name must be field name with '_MSK' appended\r
+ * so the GET and PUT macros work correctly -- they use token pasting. Offset values\r
+ * are with respect to the MRFI payload and not the entire frame.\r
+ */\r
+#define F_PORT_OS         0\r
+#define F_PORT_OS_MSK     (0x3F)\r
+#define F_ENCRYPT_OS      0\r
+#define F_ENCRYPT_OS_MSK  (0x40)\r
+#define F_FWD_FRAME       0\r
+#define F_FWD_FRAME_MSK   (0x80)\r
+#define F_RX_TYPE         1\r
+#define F_RX_TYPE_MSK     (0x40)\r
+#define F_ACK_REQ         1\r
+#define F_ACK_REQ_MSK     (0x80)\r
+#define F_ACK_RPLY        1\r
+#define F_ACK_RPLY_MSK    (0x08)\r
+#define F_TX_DEVICE       1\r
+#define F_TX_DEVICE_MSK   (0x30)\r
+#define F_HOP_COUNT       1\r
+#define F_HOP_COUNT_MSK   (0x07)\r
+#define F_TRACTID_OS      2\r
+#define F_TRACTID_OS_MSK  (0xFF)\r
+#define SMPL_NWK_HDR_SIZE 3\r
+\r
+#ifdef SMPL_SECURE\r
+\r
+#define F_SECURE_OS       3\r
+\r
+#define F_SEC_CTR_OS      3       /* counter hint */\r
+#define F_SEC_CTR_OS_MSK  (0xFF)\r
+#define F_SEC_ICHK_OS     4       /* Message integrity check */\r
+#define F_SEC_ICHK_OS_MSK (0xFF)\r
+#define F_SEC_MAC_OS      5       /* Message authentication code */\r
+#define F_SEC_MAC_OS_MSK  (0xFF)\r
+\r
+#else\r
+\r
+#define F_SECURE_OS       0\r
+\r
+#endif  /* SMPL_SECURE */\r
+\r
+#define F_APP_PAYLOAD_OS  (SMPL_NWK_HDR_SIZE+F_SECURE_OS)\r
+\r
+/* sub field details. they are in the correct bit locations (already shifted) */\r
+#define F_RX_TYPE_USER_CTL       0x00    /* does not poll... */\r
+#define F_RX_TYPE_POLLS          0x40    /* polls for held messages */\r
+\r
+#define F_ACK_REQ_TYPE           0x80\r
+#define F_ACK_RPLY_TYPE          0x08\r
+#define F_FRAME_FWD_TYPE         0x80\r
+#define F_FRAME_ENCRYPT_TYPE     0x40\r
+\r
+/* device type fields */\r
+#define F_TX_DEVICE_ED           0x00    /* End Device */\r
+#define F_TX_DEVICE_RE           0x10    /* Range Extender */\r
+#define F_TX_DEVICE_AP           0x20    /* Access Point */\r
+\r
+/* macro to get a field from a frame buffer */\r
+#define GET_FROM_FRAME(b,f)  ((b)[f] & (f##_MSK))\r
+\r
+/* Macro to put a value 'v' into a frame buffer 'b'. 'v' value must already be shifted\r
+ * if necessary. 'b' is a byte array\r
+ */\r
+#define PUT_INTO_FRAME(b,f,v)  do {(b)[f] = ((b)[f] & ~(f##_MSK)) | (v); } while(0)\r
+\r
+\r
+/*       ****   frame information objects\r
+ * info kept on each frame object\r
+ */\r
+#define   FI_AVAILABLE         0   /* entry available for use */\r
+#define   FI_INUSE_UNTIL_DEL   1   /* in use. will be explicitly reclaimed */\r
+#define   FI_INUSE_UNTIL_TX    2   /* in use. will be reclaimed after Tx */\r
+#define   FI_INUSE_UNTIL_FWD   3   /* in use until forwarded by AP */\r
+#define   FI_INUSE_TRANSITION  4   /* being retrieved. do not delete in Rx ISR thread. */\r
+\r
+typedef struct\r
+{\r
+  uint8_t   rssi;\r
+  uint8_t   lqi;\r
+} sigInfo_t;\r
+\r
+typedef struct\r
+{\r
+  volatile uint8_t      fi_usage;\r
+           uint8_t      orderStamp;\r
+           mrfiPacket_t mrfiPkt;\r
+} frameInfo_t;\r
+\r
+\r
+/* prototypes */\r
+frameInfo_t  *nwk_buildFrame(uint8_t, uint8_t *msg, uint8_t len, uint8_t hops);\r
+#ifdef APP_AUTO_ACK\r
+frameInfo_t  *nwk_buildAckReqFrame(uint8_t, uint8_t *, uint8_t, uint8_t, volatile uint8_t *);\r
+#endif\r
+void          nwk_receiveFrame(void);\r
+void          nwk_frameInit(uint8_t (*)(linkID_t));\r
+smplStatus_t  nwk_retrieveFrame(rcvContext_t *, uint8_t *, uint8_t *, addr_t *, uint8_t *);\r
+smplStatus_t  nwk_sendFrame(frameInfo_t *, uint8_t txOption);\r
+frameInfo_t  *nwk_getSandFFrame(mrfiPacket_t *, uint8_t);\r
+uint8_t       nwk_getMyRxType(void);\r
+void          nwk_SendEmptyPollRspFrame(mrfiPacket_t *);\r
+#ifdef APP_AUTO_ACK\r
+void          nwk_sendAckReply(mrfiPacket_t *, uint8_t);\r
+#endif\r
+\r
+#ifndef END_DEVICE\r
+/* only APs and REs repeat frames */\r
+void  nwk_replayFrame(frameInfo_t *);\r
+#endif\r
+\r
+\r
+#endif\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/Components/nwk/nwk_globals.c b/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/Components/nwk/nwk_globals.c
new file mode 100755 (executable)
index 0000000..121b5e3
--- /dev/null
@@ -0,0 +1,258 @@
+/**************************************************************************************************\r
+  Filename:       nwk_globals.c\r
+  Revised:        $Date: 2009-10-27 20:48:11 -0700 (Tue, 27 Oct 2009) $\r
+  Revision:       $Revision: 20995 $\r
+\r
+  Description:    This file manages global NWK data.\r
+\r
+  Copyright 2007-2009 Texas Instruments Incorporated. All rights reserved.\r
+\r
+  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+  the terms of a software license agreement between the user who downloaded the software,\r
+  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+  License. The License limits your use, and you acknowledge, that the Software may not be\r
+  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+  perform, display or sell this Software and/or its documentation for any purpose.\r
+\r
+  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+\r
+  Should you have any questions regarding your right to use this Software,\r
+  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+\r
+/******************************************************************************\r
+ * INCLUDES\r
+ */\r
+#include <string.h>\r
+#include "bsp.h"\r
+#include "mrfi.h"\r
+#include "nwk_types.h"\r
+#include "nwk_globals.h"\r
+\r
+/******************************************************************************\r
+ * MACROS\r
+ */\r
+\r
+/******************************************************************************\r
+ * CONSTANTS AND DEFINES\r
+ */\r
+\r
+/******************************************************************************\r
+ * TYPEDEFS\r
+ */\r
+\r
+/******************************************************************************\r
+ * LOCAL VARIABLES\r
+ */\r
+static const addr_t   sMyROMAddress = THIS_DEVICE_ADDRESS;\r
+static addr_t         sAPAddress;\r
+static addr_t         sMyRAMAddress;\r
+static uint8_t        sRAMAddressIsSet = 0;\r
+\r
+/* Version number set as a 4 byte quantity. Each byte is a revision number\r
+ * in the form w.x.y.z. The subfields are each limited to values 0x0-0xFF.\r
+ */\r
+static const smplVersionInfo_t sVersionInfo = {\r
+                                                0x02,  /* protocol version */\r
+                                                0x01,  /* major revision number */\r
+                                                0x01,  /* minor revision number */\r
+                                                0x01,  /* maintenance release number */\r
+                                                0x00   /* special release */\r
+                                               };\r
+\r
+/******************************************************************************\r
+ * LOCAL FUNCTIONS\r
+ */\r
+\r
+/******************************************************************************\r
+ * GLOBAL VARIABLES\r
+ */\r
+\r
+/******************************************************************************\r
+ * GLOBAL FUNCTIONS\r
+ */\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_globalsInit\r
+ *\r
+ * @brief       Initialization of global symbols\r
+ *\r
+ * input parameters\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   void\r
+ */\r
+void nwk_globalsInit(void)\r
+{\r
+\r
+  memset(&sAPAddress, 0x00, sizeof(addr_t));\r
+\r
+  /* populate RAM address from ROM default if it hasn't laready been set\r
+   * using the IOCTL interface.\r
+   */\r
+  if (!sRAMAddressIsSet)\r
+  {\r
+    memcpy(&sMyRAMAddress, &sMyROMAddress, sizeof(addr_t));\r
+    sRAMAddressIsSet = 1;  /* RAM address is now valid */\r
+  }\r
+\r
+  return;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_getMyAddress\r
+ *\r
+ * @brief       Return a pointer to my address. It comes either from ROM as\r
+ *              set in the configuration file or it was set using the IOCTL\r
+ *              interface -- probably from random bytes.\r
+ *\r
+ * input parameters\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   pointer to a constant address type object.\r
+ */\r
+addr_t const *nwk_getMyAddress(void)\r
+{\r
+  /* This call supports returning a valid pointer before either the\r
+   * initialization or external setting of the address. But caller needs\r
+   * to be careful -- if this routine is called immediately it will return\r
+   * the ROM address. If the application then sets the address using the\r
+   * IOCTL before doing the SMPL_Init() the original pointer is no longer\r
+   * valid as it points to the wrong address.\r
+   */\r
+  return sRAMAddressIsSet ? &sMyRAMAddress : &sMyROMAddress;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_getFWVersion\r
+ *\r
+ * @brief       Return a pointer to the current firmware version string.\r
+ *\r
+ * input parameters\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   pointer to a constant uint16_t object.\r
+ */\r
+uint8_t const *nwk_getFWVersion()\r
+{\r
+  return sVersionInfo.fwVerString;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_getProtocolVersion\r
+ *\r
+ * @brief       Return the current protocol version.\r
+ *\r
+ * input parameters\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   Protocol version.\r
+ */\r
+uint8_t nwk_getProtocolVersion(void)\r
+{\r
+  return sVersionInfo.protocolVersion;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_setMyAddress\r
+ *\r
+ * @brief       Set my address object if it hasn't already been set. This call\r
+ *              is referenced by the IOCTL support used to change the device\r
+ *              address. It is effective only if the address has not already\r
+ *              been set.\r
+ *\r
+ * input parameters\r
+ *\r
+ * @param   addr  - pointer to the address object to be used to set my address.\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   Returns non-zero if request is respected, otherwise returns 0.\r
+ */\r
+uint8_t nwk_setMyAddress(addr_t *addr)\r
+{\r
+  uint8_t rc = 0;\r
+\r
+  if (!sRAMAddressIsSet)\r
+  {\r
+    memcpy(&sMyRAMAddress, addr, sizeof(addr_t));\r
+    sRAMAddressIsSet = 1;  /* RAM address is now valid */\r
+    rc = 1;\r
+  }\r
+\r
+  return rc;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_setAPAddress\r
+ *\r
+ * @brief       Set the AP's address. Called after the AP address is gleaned\r
+ *              from the Join reply.\r
+ *\r
+ * input parameters\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   void\r
+ */\r
+void nwk_setAPAddress(addr_t *addr)\r
+{\r
+\r
+  memcpy((void *)&sAPAddress, (void *)addr, NET_ADDR_SIZE);\r
+\r
+  return;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_getAPAddress\r
+ *\r
+ * @brief       Get the AP's address.\r
+ *\r
+ * input parameters\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   Pointer to a constant address object or null if the address has not\r
+ *           yet been set.\r
+ */\r
+addr_t const *nwk_getAPAddress(void)\r
+{\r
+  addr_t addr;\r
+\r
+  memset(&addr, 0x0, sizeof(addr));\r
+\r
+  return !memcmp(&sAPAddress, &addr, NET_ADDR_SIZE) ? 0 : &sAPAddress;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_getBCastAddress\r
+ *\r
+ * @brief       Get the network broadcast address.\r
+ *\r
+ * input parameters\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   Pointer to a constant address object.\r
+ */\r
+addr_t const *nwk_getBCastAddress(void)\r
+{\r
+  return (addr_t const *)mrfiBroadcastAddr;\r
+}\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/Components/nwk/nwk_globals.h b/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/Components/nwk/nwk_globals.h
new file mode 100755 (executable)
index 0000000..728c2ab
--- /dev/null
@@ -0,0 +1,51 @@
+/**************************************************************************************************\r
+  Filename:       nwk_globals.h\r
+  Revised:        $Date: 2008-07-30 11:22:21 -0700 (Wed, 30 Jul 2008) $\r
+  Revision:       $Revision: 17655 $\r
+  Author:         $Author: lfriedman $\r
+\r
+  Description:    This header file supports the management of NWK global symbols.\r
+\r
+  Copyright 2004-2007 Texas Instruments Incorporated. All rights reserved.\r
+\r
+  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+  the terms of a software license agreement between the user who downloaded the software,\r
+  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+  License. The License limits your use, and you acknowledge, that the Software may not be\r
+  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+  perform, display or sell this Software and/or its documentation for any purpose.\r
+\r
+  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+\r
+  Should you have any questions regarding your right to use this Software,\r
+  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+#ifndef NWK_GLOBALS_H\r
+#define NWK_GLOBALS_H\r
+\r
+\r
+/* Prototypes */\r
+void           nwk_globalsInit(void);\r
+addr_t const  *nwk_getMyAddress(void);\r
+uint8_t        nwk_setMyAddress(addr_t *addr);\r
+void           nwk_setAPAddress(addr_t *addr);\r
+addr_t const  *nwk_getAPAddress(void);\r
+addr_t const  *nwk_getBCastAddress(void);\r
+uint8_t const *nwk_getFWVersion(void);\r
+uint8_t        nwk_getProtocolVersion(void);\r
+\r
+\r
+#endif\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/Components/nwk/nwk_types.h b/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/Components/nwk/nwk_types.h
new file mode 100755 (executable)
index 0000000..bb277ba
--- /dev/null
@@ -0,0 +1,344 @@
+/**************************************************************************************************\r
+  Filename:       nwk_types.h\r
+  Revised:        $Date: 2009-01-13 11:31:14 -0800 (Tue, 13 Jan 2009) $\r
+  Revision:       $Revision: 18744 $\r
+  Author:         $Author: lfriedman $\r
+\r
+  Description:    This header file defines the SimpliciTI typedefs.\r
+\r
+  Copyright 2004-2007 Texas Instruments Incorporated. All rights reserved.\r
+\r
+  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+  the terms of a software license agreement between the user who downloaded the software,\r
+  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+  License. The License limits your use, and you acknowledge, that the Software may not be\r
+  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+  perform, display or sell this Software and/or its documentation for any purpose.\r
+\r
+  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+\r
+  Should you have any questions regarding your right to use this Software,\r
+  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+#ifndef NWK_TYPES_H\r
+#define NWK_TYPES_H\r
+\r
+#define NWK_TX_RETRY_COUNT    10\r
+#define NWK_RX_RETRY_COUNT    10\r
+\r
+#define NWK_APP_REPLY_BIT  (0x80)\r
+\r
+#define NET_ADDR_SIZE      MRFI_ADDR_SIZE   /* size of address in bytes */\r
+\r
+#ifdef  FREQUENCY_AGILITY\r
+#define NWK_FREQ_TBL_SIZE  MRFI_NUM_LOGICAL_CHANS\r
+#else\r
+#define NWK_FREQ_TBL_SIZE  1\r
+#endif\r
+\r
+typedef struct\r
+{\r
+  uint8_t  addr[NET_ADDR_SIZE];\r
+} addr_t;\r
+\r
+typedef uint8_t linkID_t;\r
+typedef uint8_t ccRadioStatus_t;\r
+\r
+\r
+/*      ***********************************************\r
+ *                   Begin IOCTL Support\r
+ *      ***********************************************\r
+ */\r
+enum ioctlObject  {\r
+  IOCTL_OBJ_FREQ,\r
+  IOCTL_OBJ_CRYPTKEY,\r
+  IOCTL_OBJ_RAW_IO,\r
+  IOCTL_OBJ_RADIO,\r
+  IOCTL_OBJ_AP_JOIN,\r
+  IOCTL_OBJ_ADDR,\r
+  IOCTL_OBJ_CONNOBJ,\r
+  IOCTL_OBJ_FWVER,\r
+  IOCTL_OBJ_PROTOVER,\r
+  IOCTL_OBJ_NVOBJ,\r
+  IOCTL_OBJ_TOKEN\r
+};\r
+\r
+enum ioctlAction  {\r
+  IOCTL_ACT_SET,\r
+  IOCTL_ACT_GET,\r
+  IOCTL_ACT_READ,\r
+  IOCTL_ACT_WRITE,\r
+  IOCTL_ACT_RADIO_SLEEP,\r
+  IOCTL_ACT_RADIO_AWAKE,\r
+  IOCTL_ACT_RADIO_SIGINFO,\r
+  IOCTL_ACT_RADIO_RSSI,\r
+  IOCTL_ACT_RADIO_RXON,\r
+  IOCTL_ACT_RADIO_RXIDLE,\r
+  IOCTL_ACT_RADIO_SETPWR,\r
+  IOCTL_ACT_ON,\r
+  IOCTL_ACT_OFF,\r
+  IOCTL_ACT_SCAN,\r
+  IOCTL_ACT_DELETE\r
+};\r
+\r
+typedef enum ioctlObject   ioctlObject_t;\r
+typedef enum ioctlAction   ioctlAction_t;\r
+\r
+enum ioctlLevel\r
+{\r
+  IOCTL_LEVEL_0,\r
+  IOCTL_LEVEL_1,\r
+  IOCTL_LEVEL_2\r
+};\r
+\r
+typedef enum ioctlLevel ioctlLevel_t;\r
+\r
+typedef struct\r
+{\r
+  addr_t   *addr;\r
+  uint8_t  *msg;\r
+  uint8_t   len;\r
+  uint8_t   port;\r
+} ioctlRawSend_t;\r
+\r
+typedef struct\r
+{\r
+  addr_t  *addr;\r
+  uint8_t *msg;\r
+  uint8_t  len;\r
+  uint8_t  port;\r
+  uint8_t  hopCount;\r
+} ioctlRawReceive_t;\r
+\r
+/*\r
+ * Signal information support\r
+ */\r
+typedef int8_t rssi_t;\r
+\r
+typedef struct\r
+{\r
+  rssi_t  rssi;\r
+  uint8_t lqi;\r
+} rxMetrics_t;\r
+\r
+typedef struct\r
+{\r
+  linkID_t     lid;        /* input: Link ID for which signal info desired */\r
+  rxMetrics_t  sigInfo;\r
+} ioctlRadioSiginfo_t;\r
+\r
+\r
+/*                      *** Begin SET/GET token support ***                */\r
+enum tokenType\r
+{\r
+  TT_LINK,      /* Token Type is Link */\r
+  TT_JOIN       /* Token Type is Join */\r
+};\r
+\r
+typedef enum tokenType tokenType_t;\r
+\r
+/* Create a union. If either token ever changes type it will make things easier. */\r
+typedef union\r
+{\r
+  uint32_t linkToken;\r
+  uint32_t joinToken;\r
+} token_t;\r
+\r
+typedef struct\r
+{\r
+  tokenType_t  tokenType;\r
+  token_t      token;\r
+} ioctlToken_t;\r
+/*                      *** End SET/GET token support ***                */\r
+\r
+\r
+/*\r
+ * Frequency Agility support\r
+ */\r
+typedef struct\r
+{\r
+  uint8_t logicalChan;\r
+} freqEntry_t;\r
+\r
+typedef struct\r
+{\r
+  uint8_t      numChan;\r
+  freqEntry_t *freq;\r
+} ioctlScanChan_t;\r
+\r
+/* Security typedefs to make things easier if they change types */\r
+typedef uint8_t  secMAC_t;\r
+typedef uint8_t  secFCS_t;\r
+\r
+/***************************************************************************************\r
+ *                                 ** NV Object support **\r
+ *\r
+ * The following object supports saving and restoring the information\r
+ * necessary to save and restore a device connection context.\r
+ *\r
+ * On a GET interface populates the IOCTL object with the version and length (in bytes)\r
+ * of the current static connection iformation area. In addition it populates the address\r
+ * pointed to by 'objPtr' with the base address of the connection context. At this point\r
+ * the caller can either copy to or from the address. Note that this is a dangerous\r
+ * interface, as the caller is provided with direct access to the connection context.\r
+ *\r
+ * When restoring the connection context some sanity checks are possible. If the\r
+ * version or length elements of the saved context do not match those of the current\r
+ * static object the static object should not be populated. If this sanity fails the\r
+ * caller is not provided with the pointer to the conneciton ocntext.\r
+ *\r
+ * This interface is fairly simple and it is possible to get the address of the\r
+ * connection context to do a restore by simply doing a GET call. This avoids the\r
+ * sanity checks. However, this is not recommended because there may be other side\r
+ * effects of doing a SET that are necessary when restoring a context and are done\r
+ * only when the proper option is used to restore the connection context.\r
+ *\r
+ *************************************************************************************/\r
+typedef struct\r
+{\r
+  uint8_t    objVersion;\r
+  uint16_t   objLen;\r
+  uint8_t  **objPtr;\r
+} ioctlNVObj_t;\r
+\r
+/*      ***********************************************\r
+ *                    End IOCTL Support\r
+ *      ***********************************************\r
+ */\r
+\r
+enum smplStatus  {\r
+  SMPL_SUCCESS,\r
+  SMPL_TIMEOUT,\r
+  SMPL_BAD_PARAM,\r
+  SMPL_NOMEM,\r
+  SMPL_NO_FRAME,\r
+  SMPL_NO_LINK,\r
+  SMPL_NO_JOIN,\r
+  SMPL_NO_CHANNEL,\r
+  SMPL_NO_PEER_UNLINK,\r
+  SMPL_TX_CCA_FAIL,\r
+  SMPL_NO_PAYLOAD,\r
+  SMPL_NO_AP_ADDRESS,\r
+  SMPL_NO_ACK\r
+};\r
+\r
+typedef enum smplStatus    smplStatus_t;\r
+\r
+/* NWK application frame handling status codes */\r
+enum fhStatus\r
+{\r
+  FHS_RELEASE,   /* handled in interrupt thread */\r
+  FHS_KEEP,      /* handled by background application */\r
+  FHS_REPLAY     /* non-ED case: NWK frame not for me that should be replayed */\r
+};\r
+\r
+typedef enum fhStatus   fhStatus_t;\r
+\r
+/********    BEGIN: Object support for parameter context in queue management *********/\r
+enum rcvType\r
+{\r
+  RCV_NWK_PORT,\r
+  RCV_APP_LID,\r
+  RCV_RAW_POLL_FRAME\r
+};\r
+\r
+typedef enum rcvType rcvType_t;\r
+\r
+/* Tx options type */\r
+typedef  uint16_t   txOpt_t;\r
+\r
+typedef struct\r
+{\r
+  rcvType_t   type;\r
+  union\r
+  {\r
+    linkID_t      lid;\r
+    uint8_t       port;\r
+    mrfiPacket_t *pkt;\r
+  } t;\r
+} rcvContext_t;\r
+/********    END: Object support for parameter context in queue management *********/\r
+\r
+#define SMPL_FWVERSION_SIZE  4\r
+\r
+typedef struct\r
+{\r
+  uint8_t  protocolVersion;\r
+  uint8_t  fwVerString[SMPL_FWVERSION_SIZE];\r
+} smplVersionInfo_t;\r
+\r
+/* The following typedef is used to standardize the application Transaction ID field.\r
+ * This field can be used for detection of out-of-order application payloads if this\r
+ * is an issue. There is no real reason to use more than a byte for this support. But\r
+ * if this typedef is anything other than uint8_t be sure to attend to alignment and\r
+ * endian issues.\r
+ */\r
+typedef uint8_t  appPTid_t;\r
+\r
+#ifdef ACCESS_POINT\r
+/* Store-and-forward client info object */\r
+typedef struct\r
+{\r
+  addr_t    clientAddr;\r
+  appPTid_t lastTID;\r
+} sfClientInfo_t;\r
+\r
+typedef struct\r
+{\r
+  uint8_t        curNumSFClients;\r
+  sfClientInfo_t sfClients[NUM_STORE_AND_FWD_CLIENTS];\r
+} sfInfo_t;\r
+#endif\r
+\r
+/****************************************************************************************\r
+ *                           SOME USEFUL MACROS\r
+ ****************************************************************************************/\r
+\r
+/* Delay loop support. Requires mrfi.h */\r
+#define NWK_DELAY(spin)   MRFI_DelayMs(spin)\r
+#define NWK_REPLY_DELAY() MRFI_ReplyDelay();\r
+\r
+/* Network applications may need to remember radio state because the user\r
+ * application may choose to turn Rx off. These macros help get and restore\r
+ * the radio Rx state. The macros should be in the same code block at the same level.\r
+ * The argument 's' is the 'current' radio state and should be set in the code block\r
+ * with a call to MRFI_GetRadioState() _before_ using the macros.\r
+ *\r
+ * Used extensively by NWK but user applications may use them as well. But it is\r
+ * much more liekly that an application will know the radio state since it likely\r
+ * will have set it with IOCTL calls. Requires mrfi.h.\r
+ */\r
+#define NWK_CHECK_FOR_SETRX(s)  if (MRFI_RADIO_STATE_RX != s)    \\r
+                                {                                \\r
+                                  if (MRFI_RADIO_STATE_OFF == s) \\r
+                                  {                              \\r
+                                    MRFI_WakeUp();               \\r
+                                  }                              \\r
+                                  MRFI_RxOn();                   \\r
+                                }\r
+\r
+#define NWK_CHECK_FOR_RESTORE_STATE(s) if (MRFI_RADIO_STATE_RX != s)    \\r
+                                       {                                \\r
+                                         if (MRFI_RADIO_STATE_OFF == s) \\r
+                                         {                              \\r
+                                           MRFI_Sleep();                \\r
+                                         }                              \\r
+                                         else                           \\r
+                                         {                              \\r
+                                           MRFI_RxIdle();               \\r
+                                         }                              \\r
+                                       }\r
+#endif\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/Components/nwk_applications/nwk_freq.c b/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/Components/nwk_applications/nwk_freq.c
new file mode 100755 (executable)
index 0000000..2a93c39
--- /dev/null
@@ -0,0 +1,619 @@
+/**************************************************************************************************\r
+  Filename:       nwk_freq.c\r
+  Revised:        $Date: 2008-12-10 13:50:46 -0800 (Wed, 10 Dec 2008) $\r
+  Revision:       $Revision: 18594 $\r
+  Author:         $Author: lfriedman $\r
+\r
+  Description:    This file supports the SimpliciTI Freq network application.\r
+\r
+  Copyright 2007-2009 Texas Instruments Incorporated. All rights reserved.\r
+\r
+  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+  the terms of a software license agreement between the user who downloaded the software,\r
+  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+  License. The License limits your use, and you acknowledge, that the Software may not be\r
+  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+  perform, display or sell this Software and/or its documentation for any purpose.\r
+\r
+  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+\r
+  Should you have any questions regarding your right to use this Software,\r
+  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+/******************************************************************************\r
+ * INCLUDES\r
+ */\r
+\r
+#include <string.h>\r
+#include "bsp.h"\r
+#include "mrfi.h"\r
+#include "nwk_types.h"\r
+#include "nwk.h"\r
+#include "nwk_frame.h"\r
+#include "nwk_freq.h"\r
+#include "nwk_globals.h"\r
+#include "nwk_api.h"\r
+#include "nwk_security.h"\r
+\r
+#if defined( FREQUENCY_AGILITY )\r
+/******************************************************************************\r
+ * MACROS\r
+ */\r
+\r
+/******************************************************************************\r
+ * CONSTANTS AND DEFINES\r
+ */\r
+\r
+/******************************************************************************\r
+ * TYPEDEFS\r
+ */\r
+\r
+/******************************************************************************\r
+ * LOCAL VARIABLES\r
+ */\r
+static freqEntry_t      sCurLogicalChan;\r
+static volatile uint8_t sTid = 0;\r
+\r
+/******************************************************************************\r
+ * LOCAL FUNCTIONS\r
+ */\r
+\r
+static fhStatus_t handle_freq_cmd(mrfiPacket_t *);\r
+static fhStatus_t send_ping_reply(mrfiPacket_t *);\r
+#ifndef ACCESS_POINT\r
+static uint8_t change_channel_cmd_is_valid(mrfiPacket_t *);\r
+#endif\r
+#ifdef RANGE_EXTENDER\r
+/* REs must replay frame before changing channels */\r
+static void       replayFirst(mrfiPacket_t *);\r
+#endif\r
+#ifdef ACCESS_POINT\r
+/* only the AP can broadcast this command */\r
+static void broadcast_channel_change(uint8_t);\r
+#else\r
+/* APs do not process this frame */\r
+static void change_channel_cmd(mrfiPacket_t *);\r
+#endif\r
+\r
+/******************************************************************************\r
+ * GLOBAL VARIABLES\r
+ */\r
+\r
+/******************************************************************************\r
+ * GLOBAL FUNCTIONS\r
+ */\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_freqInit\r
+ *\r
+ * @brief       Initialize NWK Frequency application.\r
+ *\r
+ * @return   none.\r
+ */\r
+void nwk_freqInit(void)\r
+{\r
+\r
+  memset(&sCurLogicalChan, 0x0, sizeof(sCurLogicalChan));\r
+\r
+  /* pick a random value to start the transaction ID for this app. */\r
+  sTid = MRFI_RandomByte();\r
+\r
+  return;\r
+}\r
+\r
+/***************************************************************************\r
+ * @fn          nwk_setChannel\r
+ *\r
+ * @brief       Set requested logical channel.  Accessed by application\r
+ *              through IOCTL interface\r
+ *\r
+ * input parameters\r
+ * @param   chan     - pointer to channel object of requested channel\r
+ *\r
+ * @return   status of operation:\r
+ *             SMPL_SUCCESS    if channel set\r
+ *             SMPL_BAD_PARAM  if requested channel is out of range\r
+ */\r
+smplStatus_t nwk_setChannel(freqEntry_t *chan)\r
+{\r
+  smplStatus_t rc = SMPL_BAD_PARAM;\r
+\r
+  if (chan->logicalChan < NWK_FREQ_TBL_SIZE)\r
+  {\r
+    MRFI_SetLogicalChannel(chan->logicalChan);\r
+    sCurLogicalChan = *chan;\r
+    rc = SMPL_SUCCESS;\r
+  }\r
+  return rc;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_getChannel\r
+ *\r
+ * @brief       Get current logical channel. Accessed by application through\r
+ *              IOCTL interface\r
+ *\r
+ * input parameters\r
+ * @param   chan     - pointer to channel object of requested channel\r
+ *\r
+ * output parameters\r
+ * @param   chan     - populated channel object\r
+ *\r
+ * @return   none.\r
+ */\r
+void nwk_getChannel(freqEntry_t *chan)\r
+{\r
+  *chan = sCurLogicalChan;\r
+\r
+  return;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          handle_freq_cmd\r
+ *\r
+ * @brief       Handle a Frequency application command.\r
+ *\r
+ * input parameters\r
+ * @param   frame     - pointer to frame with command context\r
+ *\r
+ * @return   Return FHS_RELEASE if caller should release frame otherwise\r
+ *           return FHS_REPLAY.\r
+ */\r
+static fhStatus_t handle_freq_cmd(mrfiPacket_t *frame)\r
+{\r
+  fhStatus_t rc = FHS_RELEASE;\r
+\r
+  switch (*(MRFI_P_PAYLOAD(frame)+F_APP_PAYLOAD_OS))\r
+  {\r
+    case FREQ_REQ_PING:\r
+      rc = send_ping_reply(frame);\r
+      break;\r
+\r
+#ifndef ACCESS_POINT\r
+    case FREQ_REQ_MOVE:\r
+#ifdef RANGE_EXTENDER\r
+      replayFirst(frame);\r
+#endif\r
+      /* Make sure the change channel Freq command came from\r
+       * a valid source before obeying.\r
+       */\r
+      if (change_channel_cmd_is_valid(frame))\r
+      {\r
+        change_channel_cmd(frame);\r
+      }\r
+      break;\r
+#endif\r
+\r
+#ifdef ACCESS_POINT\r
+    case FREQ_REQ_REQ_MOVE:\r
+      break;\r
+#endif\r
+    default:\r
+      break;\r
+  }\r
+\r
+  return rc;\r
+}\r
+\r
+#ifndef ACCESS_POINT\r
+/******************************************************************************\r
+ * @fn          change_channel_cmd_is_valid\r
+ *\r
+ * @brief       Check validity of a change channel command frame.\r
+ *\r
+ * input parameters\r
+ * @param   frame  - pointer to frame with command context\r
+ *\r
+ * @return   Returns non-zero if command is valid, otherwise returns 0.\r
+ *           Command is valid if either:\r
+ *             - frame is directed\r
+ *             - frame is from an AP and we know about that AP\r
+ *\r
+ *           It is possible that either we don't know about an AP or that\r
+ *           we do but this frame comes from another AP in range.\r
+ */\r
+static uint8_t change_channel_cmd_is_valid(mrfiPacket_t *frame)\r
+{\r
+  uint8_t rc = 0;\r
+  addr_t const *apAddr;\r
+\r
+  /* If this was a directed frame obey the command. */\r
+  if (!memcmp(MRFI_P_DST_ADDR(frame), nwk_getMyAddress(), NET_ADDR_SIZE))\r
+  {\r
+    rc = 1;\r
+  }\r
+  else\r
+  {\r
+    /* Do we know about an AP? If not assume frame bogus. */\r
+    apAddr = nwk_getAPAddress();\r
+    if (apAddr)\r
+    {\r
+      /* Yes, we know about an AP. Is that who sent it? */\r
+      if (!memcmp(apAddr, MRFI_P_SRC_ADDR(frame), NET_ADDR_SIZE))\r
+      {\r
+        /* OK. We obey. */\r
+        rc = 1;\r
+      }\r
+    }\r
+  }\r
+\r
+  return rc;\r
+}\r
+#endif   /* !ACCESS_POINT */\r
+\r
+#ifdef RANGE_EXTENDER\r
+/******************************************************************************\r
+ * @fn          replayFirst\r
+ *\r
+ * @brief       Range Extenders must replay the change-channel boradcast\r
+ *              frame before actually changing its own channel.\r
+ *\r
+ * input parameters\r
+ * @param   frame     - pointer to frame with command context\r
+ *\r
+ * @return   void\r
+ */\r
+\r
+/* This routine takes care of some awkwardness. From the dispatch thread all\r
+ * we have is a pointer to the mrfiPacket_t element in the frame buffer into\r
+ * which the frame was retrieved. But to call the replay routine we need the\r
+ * entire frame information structure frameInfo_t. This routine regenerates\r
+ * the frame information structure pointer and then calls the replay routine.\r
+ *\r
+ * This approach requires that the disptach thread guarantee that it will\r
+ * always pass a pointer to the mrfiPacket_t structure in the frame\r
+ * information structure and not a copy of the mrfipacket_t element. It is\r
+ * either the approach here or change all the NWK application dispatch routine\r
+ * argument types. This latter has the downside of interfering with any\r
+ * user-implemented NWK applications. It also needlessly complicates the argument\r
+ * handling: except for this instance all any routine needs is the mrfiPacket_t\r
+ * pointer.\r
+ */\r
+static void replayFirst(mrfiPacket_t *frame)\r
+{\r
+  frameInfo_t *fiptr;\r
+  uint16_t     offset = (uint16_t)&(((frameInfo_t *)0)->mrfiPkt);\r
+\r
+  fiptr = (frameInfo_t *)(((uint8_t *)frame) - ((uint8_t *)offset));\r
+\r
+  nwk_replayFrame(fiptr);\r
+\r
+  return;\r
+}\r
+#endif  /* RANGE_EXTENDER */\r
+\r
+#ifndef ACCESS_POINT\r
+/********************************************************************************\r
+ * @fn          change_channel_cmd\r
+ *\r
+ * @brief       Change to channel specified in received frame. Polling devices\r
+ *              might be awake when the broadcast occurs but we want the channel\r
+ *              change recovery to occur in a disciplined manner using the\r
+ *              polling code. Also, with certain Test sceanrios in which a\r
+ *              sleeping device is emulated we want to emulate 'missing' the\r
+ *              broadcast change-channel command.\r
+ *\r
+ * input parameters\r
+ * @param   frame     - pointer to frame containing target logical channel.\r
+ *\r
+ * @return   none.\r
+ */\r
+static void change_channel_cmd(mrfiPacket_t *frame)\r
+{\r
+#if !defined( RX_POLLS )\r
+  freqEntry_t chan;\r
+\r
+  chan.logicalChan = *(MRFI_P_PAYLOAD(frame)+F_APP_PAYLOAD_OS+F_CHAN_OS);\r
+\r
+  nwk_setChannel(&chan);\r
+#endif\r
+  return;\r
+}\r
+#endif  /* !ACCESS_POINT */\r
+\r
+/******************************************************************************\r
+ * @fn          send_ping_reply\r
+ *\r
+ * @brief       Send Frequency application ping reply.\r
+ *\r
+ * input parameters\r
+ * @param   frame     - pointer to frame from pinger.\r
+ *\r
+ * @return   FHS_RELEASE unless this isn't an Access Point. In this case for\r
+ *           flow to et this far it is a Range Extender, so replay the frame\r
+ *           by returning FHW_REPLAY\r
+ */\r
+static fhStatus_t send_ping_reply(mrfiPacket_t *frame)\r
+{\r
+#ifdef ACCESS_POINT\r
+  uint8_t      msg[FREQ_REQ_PING_FRAME_SIZE];\r
+  frameInfo_t *pOutFrame;\r
+\r
+  /* original request with reply bit on */\r
+  msg[FB_APP_INFO_OS] = *(MRFI_P_PAYLOAD(frame)+F_APP_PAYLOAD_OS) | NWK_APP_REPLY_BIT;\r
+  msg[FB_TID_OS]      = *(MRFI_P_PAYLOAD(frame)+F_APP_PAYLOAD_OS+FB_TID_OS);\r
+\r
+  if (pOutFrame = nwk_buildFrame(SMPL_PORT_FREQ, msg, sizeof(msg), MAX_HOPS_FROM_AP))\r
+  {\r
+    /* destination address is the source address of the received frame. */\r
+    memcpy(MRFI_P_DST_ADDR(&pOutFrame->mrfiPkt), MRFI_P_SRC_ADDR(frame), NET_ADDR_SIZE);\r
+    /* must use transaction ID of source frame */\r
+    PUT_INTO_FRAME(MRFI_P_PAYLOAD(&pOutFrame->mrfiPkt), F_TRACTID_OS, (GET_FROM_FRAME(MRFI_P_PAYLOAD(frame), F_TRACTID_OS)));\r
+#ifdef SMPL_SECURE\r
+    nwk_setSecureFrame(&pOutFrame->mrfiPkt, sizeof(msg), 0);\r
+#endif  /* SMPL_SECURE */\r
+    nwk_sendFrame(pOutFrame, MRFI_TX_TYPE_FORCED);\r
+  }\r
+\r
+  return FHS_RELEASE;\r
+#else\r
+  return FHS_REPLAY;\r
+#endif  /* ACCESS_POINT */\r
+}\r
+\r
+/****************************************************************************************\r
+ * @fn          nwk_processFreq\r
+ *\r
+ * @brief       Process a Frequency application frame.\r
+ *\r
+ * input parameters\r
+ * @param   frame     - pointer to frame\r
+ *\r
+ * @return   Disposition for frame: either release (FHS_RELEASE) or replay (FHS_REPLAY).\r
+ */\r
+fhStatus_t nwk_processFreq(mrfiPacket_t *frame)\r
+{\r
+  fhStatus_t rc = FHS_RELEASE;\r
+  uint8_t    replyType;\r
+\r
+  /* Make sure this is a reply and see if we sent this. Validate the\r
+   * packet for reception by client app.\r
+   */\r
+  if (SMPL_MY_REPLY == (replyType=nwk_isValidReply(frame, sTid, FB_APP_INFO_OS, FB_TID_OS)))\r
+  {\r
+    /* It's a match and it's a reply. Validate the received packet by\r
+     * returning a 1 so it can be received by the client app.\r
+     */\r
+    MRFI_PostKillSem();\r
+    rc = FHS_KEEP;\r
+  }\r
+#if !defined( END_DEVICE )\r
+  else if (SMPL_A_REPLY == replyType)\r
+  {\r
+    /* no match. if i'm not an ED this is a reply that should be passed on. */\r
+    rc = FHS_REPLAY;\r
+  }\r
+#endif  /* !END_DEVICE */\r
+  else if (SMPL_NOT_REPLY == replyType)\r
+  {\r
+    rc = handle_freq_cmd(frame);\r
+  }\r
+\r
+  return rc;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_scanForChannels\r
+ *\r
+ * @brief       Scan for channels by sending a ping frame on each channel in the\r
+ *              channel table and listen for a reply.\r
+ *\r
+ * input parameters\r
+ * @param  channels    - pointer to area to receive list of channels from which\r
+ *                       ping replies were received.\r
+ *\r
+ * output parameters\r
+ * @param   channels   - populated list of channels.\r
+ *\r
+ * @return   statuis of operation..\r
+ */\r
+uint8_t nwk_scanForChannels(freqEntry_t *channels)\r
+{\r
+  uint8_t      msg[FREQ_REQ_PING_FRAME_SIZE], i, num=0, notBcast = 1;\r
+  addr_t      *apAddr, retAddr;\r
+  uint8_t      radioState = MRFI_GetRadioState();\r
+  freqEntry_t  chan;\r
+  freqEntry_t  curChan;\r
+\r
+  union\r
+  {\r
+    ioctlRawSend_t    send;\r
+    ioctlRawReceive_t recv;\r
+  } ioctl_info;\r
+\r
+  nwk_getChannel(&curChan);\r
+\r
+  /* send to AP. If we don't know AP address, broadcast. */\r
+  apAddr = (addr_t *)nwk_getAPAddress();\r
+  if (!apAddr)\r
+  {\r
+    apAddr = (addr_t *)nwk_getBCastAddress();\r
+    notBcast = 0;\r
+  }\r
+\r
+  for (i=0; i<NWK_FREQ_TBL_SIZE; ++i)\r
+  {\r
+    chan.logicalChan = i;\r
+\r
+    nwk_setChannel(&chan);\r
+\r
+    ioctl_info.send.addr = apAddr;\r
+    ioctl_info.send.msg  = msg;\r
+    ioctl_info.send.len  = sizeof(msg);\r
+    ioctl_info.send.port = SMPL_PORT_FREQ;\r
+\r
+    msg[FB_APP_INFO_OS] = FREQ_REQ_PING;\r
+    msg[FB_TID_OS]      = sTid;\r
+\r
+    SMPL_Ioctl(IOCTL_OBJ_RAW_IO, IOCTL_ACT_WRITE, &ioctl_info.send);\r
+\r
+    ioctl_info.recv.port = SMPL_PORT_FREQ;\r
+    ioctl_info.recv.msg  = msg;\r
+    ioctl_info.recv.addr = &retAddr;\r
+\r
+    NWK_CHECK_FOR_SETRX(radioState);\r
+    NWK_REPLY_DELAY();\r
+    NWK_CHECK_FOR_RESTORE_STATE(radioState);\r
+\r
+    if (SMPL_SUCCESS == SMPL_Ioctl(IOCTL_OBJ_RAW_IO, IOCTL_ACT_READ, &ioctl_info.recv))\r
+    {\r
+      /* Once we know the Access Point we're related to we only accept\r
+       * ping replies from that one.\r
+       */\r
+      if (!notBcast || (notBcast && !memcmp(&retAddr, apAddr, NET_ADDR_SIZE)))\r
+      {\r
+        channels[num++].logicalChan = i;\r
+      }\r
+    }\r
+\r
+    sTid++;\r
+    if (num && notBcast)\r
+    {\r
+      /* we're done...only one possible channel if we know the AP address. */\r
+      break;\r
+    }\r
+    /* TODO: process encryption stuff */\r
+  }\r
+\r
+  /* reset original channel */\r
+  nwk_setChannel(&curChan);\r
+\r
+  return num;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_freqControl\r
+ *\r
+ * @brief       Handle application requests received through IOCTL interface.\r
+ *\r
+ * input parameters\r
+ * @param   action  - requested action\r
+ * @param   val     - pointer to parameters required/returned for action\r
+ *\r
+ * output parameters\r
+ * @param   val   - populated values if action was a retrieval action.\r
+ *\r
+ * @return   status of operation.\r
+ */\r
+smplStatus_t nwk_freqControl(ioctlAction_t action, void *val)\r
+{\r
+  smplStatus_t rc;\r
+\r
+  switch (action)\r
+  {\r
+    case IOCTL_ACT_SET:\r
+#ifdef ACCESS_POINT\r
+      broadcast_channel_change(((freqEntry_t *)val)->logicalChan);\r
+#endif  /* ACCESS_POINT */\r
+      rc = nwk_setChannel((freqEntry_t *)val);\r
+      break;\r
+\r
+    case IOCTL_ACT_GET:\r
+      nwk_getChannel((freqEntry_t *)val);\r
+      rc = SMPL_SUCCESS;\r
+      break;\r
+\r
+    case IOCTL_ACT_SCAN:\r
+      {\r
+        ioctlScanChan_t *sc = (ioctlScanChan_t *)val;\r
+\r
+        sc->numChan = nwk_scanForChannels(sc->freq);\r
+        rc = SMPL_SUCCESS;\r
+      }\r
+      break;\r
+\r
+    default:\r
+      rc = SMPL_BAD_PARAM;\r
+      break;\r
+  }\r
+\r
+  return rc;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          broadcast_channel_change\r
+ *\r
+* @brief       For Access Point only: broadcast a channel change frame.\r
+ *\r
+ * input parameters\r
+ * @param   idx  -  index into channel table of new (logical) channel\r
+ *\r
+ * @return   none.\r
+ */\r
+#ifdef ACCESS_POINT\r
+#define CC_REDUNDANCY      1   /* Change-channel redundancy count */\r
+static void broadcast_channel_change(uint8_t idx)\r
+{\r
+  ioctlRawSend_t send;\r
+  uint8_t        msg[FREQ_REQ_MOVE_FRAME_SIZE];\r
+  uint8_t        repeat = CC_REDUNDANCY;\r
+\r
+  if (idx >= NWK_FREQ_TBL_SIZE)\r
+  {\r
+    return;\r
+  }\r
+\r
+  msg[FB_APP_INFO_OS] = FREQ_REQ_MOVE;\r
+  msg[F_CHAN_OS]      = idx;\r
+\r
+  send.addr = (addr_t *)nwk_getBCastAddress();\r
+  send.msg  = msg;\r
+  send.len  = sizeof(msg);\r
+  send.port = SMPL_PORT_FREQ;\r
+\r
+  SMPL_Ioctl(IOCTL_OBJ_RAW_IO, IOCTL_ACT_WRITE, &send);\r
+  /* Redundancy addresses the fact that an RE (or any always-listening\r
+   * device) might miss the command\r
+   */\r
+  while (repeat--)\r
+  {\r
+    NWK_DELAY(250);\r
+    SMPL_Ioctl(IOCTL_OBJ_RAW_IO, IOCTL_ACT_WRITE, &send);\r
+  }\r
+}\r
+#endif  /* ACCESS_POINT */\r
+\r
+#else  /* FREQUENCY_AGILITY */\r
+\r
+/**********************************************************************************\r
+ * @fn          nwk_freqInit\r
+ *\r
+ * @brief       Initialize NWK Frequency application. Stub when Frequency Agility\r
+ *              not supported.\r
+ *\r
+ * @return   none.\r
+ */\r
+void nwk_freqInit(void)\r
+{\r
+  return;\r
+}\r
+\r
+/****************************************************************************************\r
+ * @fn          nwk_processFreq\r
+ *\r
+ * @brief       Process a Frequency application frame. Stub when Frequency Agility\r
+ *              not supported.\r
+ *\r
+ * input parameters\r
+ * @param   frame     - pointer to frame\r
+ *\r
+ * @return   Disposition for frame: either release (FHS_RELEASE) or replay (FHS_REPLAY).\r
+ */\r
+fhStatus_t nwk_processFreq(mrfiPacket_t *frame)\r
+{\r
+  return FHS_RELEASE;\r
+}\r
+\r
+#endif  /* FREQUENCY_AGILITY */\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/Components/nwk_applications/nwk_freq.h b/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/Components/nwk_applications/nwk_freq.h
new file mode 100755 (executable)
index 0000000..4cc5f11
--- /dev/null
@@ -0,0 +1,72 @@
+/**************************************************************************************************\r
+  Filename:       nwk_freq.h\r
+  Revised:        $Date: 2008-05-06 16:48:33 -0700 (Tue, 06 May 2008) $\r
+  Revision:       $Revision: 17025 $\r
+  Author:         $Author: lfriedman $\r
+\r
+  Description:    This header file supports the SimpliciTI Freq network application.\r
+\r
+  Copyright 2004-2007 Texas Instruments Incorporated. All rights reserved.\r
+\r
+  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+  the terms of a software license agreement between the user who downloaded the software,\r
+  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+  License. The License limits your use, and you acknowledge, that the Software may not be\r
+  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+  perform, display or sell this Software and/or its documentation for any purpose.\r
+\r
+  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+\r
+  Should you have any questions regarding your right to use this Software,\r
+  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+#ifndef NWK_FREQ_H\r
+#define NWK_FREQ_H\r
+\r
+/* application payload offsets */\r
+/*    both */\r
+#define FB_APP_INFO_OS     0\r
+#define FB_TID_OS          1\r
+\r
+/* Logical channel number for MOVE request. Frame brodcast so no TID\r
+ * is used. Channel number can occupy the TID location. Same offset\r
+ * used for channel change request. No reply to that frame. \r
+ */\r
+#define F_CHAN_OS          1\r
+\r
+/* MGMT frame application requests */\r
+#define  FREQ_REQ_MOVE        0x01\r
+#define  FREQ_REQ_PING        0x02\r
+#define  FREQ_REQ_REQ_MOVE    0x03\r
+\r
+/* change the following as protocol developed */\r
+#define MAX_FREQ_APP_FRAME    2\r
+\r
+/* set the out frame sizes */\r
+#define  FREQ_REQ_MOVE_FRAME_SIZE   2\r
+#define  FREQ_REQ_PING_FRAME_SIZE   2\r
+\r
+/* prototypes */\r
+void         nwk_freqInit(void);\r
+fhStatus_t   nwk_processFreq(mrfiPacket_t *);\r
+#if defined( FREQUENCY_AGILITY )\r
+smplStatus_t nwk_setChannel(freqEntry_t *);\r
+void         nwk_getChannel(freqEntry_t *);\r
+uint8_t      nwk_scanForChannels(freqEntry_t *);\r
+smplStatus_t nwk_freqControl(ioctlAction_t, void *);\r
+#endif\r
+\r
+#endif\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/Components/nwk_applications/nwk_ioctl.c b/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/Components/nwk_applications/nwk_ioctl.c
new file mode 100755 (executable)
index 0000000..0dcd14a
--- /dev/null
@@ -0,0 +1,349 @@
+\r
+/**************************************************************************************************\r
+  Filename:       nwk_ioctl.c\r
+  Revised:        $Date: 2009-01-13 11:31:14 -0800 (Tue, 13 Jan 2009) $\r
+  Revision:       $Revision: 18744 $\r
+  Author:         $Author: lfriedman $\r
+\r
+  Description:    This file supports the SimpliciTI IOCTL implmentation. This interface\r
+                  gives applications access to the "driver" network level functions\r
+                  when necessary.\r
+\r
+  Copyright 2004-2007 Texas Instruments Incorporated. All rights reserved.\r
+\r
+  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+  the terms of a software license agreement between the user who downloaded the software,\r
+  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+  License. The License limits your use, and you acknowledge, that the Software may not be\r
+  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+  perform, display or sell this Software and/or its documentation for any purpose.\r
+\r
+  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+\r
+  Should you have any questions regarding your right to use this Software,\r
+  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+\r
+/******************************************************************************\r
+ * INCLUDES\r
+ */\r
+#include <string.h>\r
+#include "bsp.h"\r
+#include "mrfi.h"\r
+#include "nwk_types.h"\r
+#include "nwk_frame.h"\r
+#include "nwk.h"\r
+#include "nwk_ioctl.h"\r
+#include "nwk_globals.h"\r
+#include "nwk_security.h"\r
+#ifdef ACCESS_POINT\r
+#include "nwk_join.h"\r
+#endif\r
+\r
+/******************************************************************************\r
+ * MACROS\r
+ */\r
+\r
+/******************************************************************************\r
+ * CONSTANTS AND DEFINES\r
+ */\r
+\r
+/******************************************************************************\r
+ * TYPEDEFS\r
+ */\r
+\r
+/******************************************************************************\r
+ * LOCAL VARIABLES\r
+ */\r
+\r
+/******************************************************************************\r
+ * LOCAL FUNCTIONS\r
+ */\r
+\r
+/******************************************************************************\r
+ * GLOBAL VARIABLES\r
+ */\r
+\r
+/******************************************************************************\r
+ * GLOBAL FUNCTIONS\r
+ */\r
+\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_rawSend\r
+ *\r
+ * @brief       Builds an outut frame based on information provided by the\r
+ *              caller. This function allows a raw transmission to the target\r
+ *              if the network address is known. this function is used a lot\r
+ *              to support NWK applications.\r
+ *\r
+ * input parameters\r
+ * @param   info    - pointer to strcuture containing info on how to build\r
+ *                    the outgoing frame.\r
+ * output parameters\r
+ *\r
+ * @return         SMPL_SUCCESS\r
+ *                 SMPL_NOMEM       - no room in output frame queue\r
+ *                 SMPL_TX_CCA_FAIL - CCA failure\r
+ */\r
+smplStatus_t nwk_rawSend(ioctlRawSend_t *info)\r
+{\r
+  frameInfo_t *pOutFrame;\r
+  uint8_t      hops;\r
+\r
+  /* If we know frame is going to or from the AP then we can reduce the hop\r
+   * count.\r
+   */\r
+  switch (info->port)\r
+  {\r
+    case SMPL_PORT_JOIN:\r
+    case SMPL_PORT_FREQ:\r
+    case SMPL_PORT_MGMT:\r
+      hops = MAX_HOPS_FROM_AP;\r
+      break;\r
+\r
+    default:\r
+      hops = MAX_HOPS;\r
+      break;\r
+  }\r
+\r
+  if (pOutFrame = nwk_buildFrame(info->port, info->msg, info->len, hops))\r
+  {\r
+    memcpy(MRFI_P_DST_ADDR(&pOutFrame->mrfiPkt), info->addr, NET_ADDR_SIZE);\r
+#ifdef SMPL_SECURE\r
+    nwk_setSecureFrame(&pOutFrame->mrfiPkt, info->len, 0);\r
+#endif  /* SMPL_SECURE */\r
+    return nwk_sendFrame(pOutFrame, MRFI_TX_TYPE_CCA);\r
+  }\r
+  return SMPL_NOMEM;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_rawReceive\r
+ *\r
+ * @brief       Retriievs specified from from the input frame queue. Additional\r
+ *              information such as source address and hop count may also be\r
+ *              retrieved\r
+ *\r
+ * input parameters\r
+ * @param   info    - pointer to structure containing info on what to retrieve\r
+ *\r
+ * output parameters - actually populated by nwk_retrieveFrame()\r
+ *      info->msg      - application payload copied here\r
+ *      info->len      - length of received application payload\r
+ *      info->addr     - if non-NULL points to memory to be populated with\r
+ *                       source address of retrieved frame.\r
+ *      info->hopCount - if non-NULL points to memory to be populated with\r
+ *                       hop count of retrieved frame.\r
+ *\r
+ * @return   Status of operation.\r
+ */\r
+smplStatus_t nwk_rawReceive(ioctlRawReceive_t *info)\r
+{\r
+  rcvContext_t rcv;\r
+\r
+  rcv.type   = RCV_NWK_PORT;\r
+  rcv.t.port = info->port;\r
+\r
+  return nwk_retrieveFrame(&rcv, info->msg, &info->len, info->addr, &info->hopCount);\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_radioControl\r
+ *\r
+ * @brief       Handle radio control functions.\r
+ *\r
+ * input parameters\r
+ * @param   action   - radio operation to perform. currently suppoerted:\r
+ *                         sleep/unsleep\r
+ * output parameters\r
+ *\r
+ * @return   Status of operation.\r
+ */\r
+smplStatus_t nwk_radioControl(ioctlAction_t action, void *val)\r
+{\r
+  smplStatus_t rc = SMPL_SUCCESS;\r
+\r
+  if (IOCTL_ACT_RADIO_SLEEP == action)\r
+  {\r
+    /* go to sleep mode. */\r
+    MRFI_RxIdle();\r
+    MRFI_Sleep();\r
+  }\r
+  else if (IOCTL_ACT_RADIO_AWAKE == action)\r
+  {\r
+    MRFI_WakeUp();\r
+\r
+#if !defined( END_DEVICE )\r
+    MRFI_RxOn();\r
+#endif\r
+\r
+  }\r
+  else if (IOCTL_ACT_RADIO_SIGINFO == action)\r
+  {\r
+    ioctlRadioSiginfo_t *pSigInfo = (ioctlRadioSiginfo_t *)val;\r
+    connInfo_t          *pCInfo   = nwk_getConnInfo(pSigInfo->lid);\r
+\r
+    if (!pCInfo)\r
+    {\r
+      return SMPL_BAD_PARAM;\r
+    }\r
+    memcpy(&pSigInfo->sigInfo, &pCInfo->sigInfo, sizeof(pCInfo->sigInfo));\r
+  }\r
+  else if (IOCTL_ACT_RADIO_RSSI == action)\r
+  {\r
+    *((rssi_t *)val) = MRFI_Rssi();\r
+  }\r
+  else if (IOCTL_ACT_RADIO_RXON == action)\r
+  {\r
+    MRFI_RxOn();\r
+  }\r
+  else if (IOCTL_ACT_RADIO_RXIDLE == action)\r
+  {\r
+    MRFI_RxIdle();\r
+  }\r
+#ifdef EXTENDED_API\r
+  else if (IOCTL_ACT_RADIO_SETPWR == action)\r
+  {\r
+    uint8_t idx;\r
+\r
+    switch (*(ioctlLevel_t *)val)\r
+    {\r
+      case IOCTL_LEVEL_2:\r
+        idx = 2;\r
+        break;\r
+\r
+      case IOCTL_LEVEL_1:\r
+        idx = 1;\r
+        break;\r
+\r
+      case IOCTL_LEVEL_0:\r
+        idx = 0;\r
+        break;\r
+\r
+      default:\r
+        return SMPL_BAD_PARAM;\r
+    }\r
+    MRFI_SetRFPwr(idx);\r
+    return SMPL_SUCCESS;\r
+  }\r
+#endif  /* EXTENDED_API */\r
+  else\r
+  {\r
+    rc = SMPL_BAD_PARAM;\r
+  }\r
+  return rc;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_joinContext\r
+ *\r
+ * @brief       For Access Points we need a way to support changing the Join\r
+ *              context. This will allow arbitration bewteen potentially nearby\r
+ *              Access Points when a new device is joining.\r
+ *\r
+ * input parameters\r
+ * @param   action  - Join context is either on or off.\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   Status of operation. Currently always succeeds.\r
+ */\r
+#ifdef ACCESS_POINT\r
+smplStatus_t nwk_joinContext(ioctlAction_t action)\r
+{\r
+  nwk_setJoinContext((IOCTL_ACT_ON == action) ? JOIN_CONTEXT_ON : JOIN_CONTEXT_OFF);\r
+\r
+  return SMPL_SUCCESS;\r
+}\r
+#endif\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_deviceAddress\r
+ *\r
+ * @brief       Set or Get this device address. The Set must be done before\r
+ *              SMPL_Init() for it to take effect. The Get is always legal but\r
+ *              the value could be invalid if it is called before a valid set\r
+ *              call is made.\r
+ *\r
+ * input parameters\r
+ * @param   action  - Gte or Set\r
+ * @param   addr    - pointer to address object containing value on Set\r
+ *\r
+ * output parameters\r
+ * @param   addr    - pointer to address object to receive value on Get.\r
+ *\r
+ * @return   SMPL_SUCCESS\r
+ *           SMPL_BAD_PARAM  Action request illegal or a Set request\r
+ *                           was not respected.\r
+ */\r
+smplStatus_t nwk_deviceAddress(ioctlAction_t action, addr_t *addr)\r
+{\r
+  smplStatus_t rc = SMPL_BAD_PARAM;\r
+\r
+  if (IOCTL_ACT_GET == action)\r
+  {\r
+    memcpy(addr, nwk_getMyAddress(), sizeof(addr_t));\r
+    rc = SMPL_SUCCESS;\r
+  }\r
+  else if (IOCTL_ACT_SET == action)\r
+  {\r
+    if (nwk_setMyAddress(addr))\r
+    {\r
+      rc = SMPL_SUCCESS;\r
+    }\r
+  }\r
+\r
+  return rc;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_connectionControl\r
+ *\r
+ * @brief       Access to connection table. Currently supports only deleting\r
+ *              a connection from the table.\r
+ *\r
+ * input parameters\r
+ * @param   action  - Connection control action (only delete is curently valid).\r
+ * @param   val     - pointer to Link ID of connection on which to operate.\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   SMPL_SUCCESS\r
+ *           SMPL_BAD_PARAM  Action is not delete\r
+ *                           Link ID is the UUD Link ID\r
+ *                           No connection table info for Link ID\r
+ */\r
+smplStatus_t nwk_connectionControl(ioctlAction_t action, void *val)\r
+{\r
+  connInfo_t *pCInfo;\r
+  linkID_t    lid = *((linkID_t *)val);\r
+\r
+  if (IOCTL_ACT_DELETE != action)\r
+  {\r
+    return SMPL_BAD_PARAM;\r
+  }\r
+\r
+  if ((SMPL_LINKID_USER_UUD == lid) ||\r
+      (!(pCInfo=nwk_getConnInfo(lid))))\r
+  {\r
+    return SMPL_BAD_PARAM;\r
+  }\r
+\r
+  nwk_freeConnection(pCInfo);\r
+\r
+  return SMPL_SUCCESS;\r
+}\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/Components/nwk_applications/nwk_ioctl.h b/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/Components/nwk_applications/nwk_ioctl.h
new file mode 100755 (executable)
index 0000000..fa5b961
--- /dev/null
@@ -0,0 +1,53 @@
+/**************************************************************************************************\r
+  Filename:       nwk_ioctl.h\r
+  Revised:        $Date: 2008-04-29 15:47:05 -0700 (Tue, 29 Apr 2008) $\r
+  Revision:       $Revision: 16972 $\r
+  Author:         $Author: lfriedman $\r
+\r
+  Description:    This header file supports the SimpliciTI IOCTL implmentation. This interface\r
+                  gives applications access to the "driver" network level functions\r
+                  when necessary.\r
+\r
+  Copyright 2004-2007 Texas Instruments Incorporated. All rights reserved.\r
+\r
+  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+  the terms of a software license agreement between the user who downloaded the software,\r
+  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+  License. The License limits your use, and you acknowledge, that the Software may not be\r
+  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+  perform, display or sell this Software and/or its documentation for any purpose.\r
+\r
+  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+\r
+  Should you have any questions regarding your right to use this Software,\r
+  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+\r
+\r
+#ifndef NWK_IOCTL_H\r
+#define NWK_IOCTL_H\r
+\r
+/* prototypes */\r
+smplStatus_t nwk_rawSend(ioctlRawSend_t *);\r
+smplStatus_t nwk_rawReceive(ioctlRawReceive_t *);\r
+smplStatus_t nwk_radioControl(ioctlAction_t, void *);\r
+smplStatus_t nwk_deviceAddress(ioctlAction_t, addr_t *);\r
+smplStatus_t nwk_connectionControl(ioctlAction_t, void *);\r
+#ifdef ACCESS_POINT\r
+smplStatus_t nwk_joinContext(ioctlAction_t);\r
+#endif\r
+\r
+#endif\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/Components/nwk_applications/nwk_join.c b/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/Components/nwk_applications/nwk_join.c
new file mode 100755 (executable)
index 0000000..b96325f
--- /dev/null
@@ -0,0 +1,583 @@
+/**************************************************************************************************\r
+  Filename:       nwk_join.c\r
+  Revised:        $Date: 2009-01-06 15:45:54 -0800 (Tue, 06 Jan 2009) $\r
+  Revision:       $Revision: 18697 $\r
+\r
+  Description:    This file supports the SimpliciTI Join network application.\r
+\r
+  Copyright 2007-2009 Texas Instruments Incorporated. All rights reserved.\r
+\r
+  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+  the terms of a software license agreement between the user who downloaded the software,\r
+  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+  License. The License limits your use, and you acknowledge, that the Software may not be\r
+  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+  perform, display or sell this Software and/or its documentation for any purpose.\r
+\r
+  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+\r
+  Should you have any questions regarding your right to use this Software,\r
+  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+\r
+/******************************************************************************\r
+ * INCLUDES\r
+ */\r
+#include <string.h>\r
+#include "bsp.h"\r
+#include "mrfi.h"\r
+#include "nwk_types.h"\r
+#include "nwk_api.h"\r
+#include "nwk_frame.h"\r
+#include "nwk.h"\r
+#include "nwk_link.h"\r
+#include "nwk_join.h"\r
+#include "nwk_globals.h"\r
+#include "nwk_freq.h"\r
+#include "nwk_security.h"\r
+#include "nwk_mgmt.h"\r
+\r
+/******************************************************************************\r
+ * MACROS\r
+ */\r
+\r
+/******************************************************************************\r
+ * CONSTANTS AND DEFINES\r
+ */\r
+\r
+/******************************************************************************\r
+ * TYPEDEFS\r
+ */\r
+\r
+/******************************************************************************\r
+ * LOCAL VARIABLES\r
+ */\r
+\r
+static          uint32_t sJoinToken = 0;\r
+static          uint8_t (*spCallback)(linkID_t) = NULL;\r
+static volatile uint8_t  sTid = 0;\r
+\r
+#ifdef ACCESS_POINT\r
+static sfInfo_t *spSandFContext = NULL;\r
+static uint8_t   sJoinOK = 0;\r
+#endif /* ACCESS_POINT */\r
+\r
+/******************************************************************************\r
+ * LOCAL FUNCTIONS\r
+ */\r
+#ifdef ACCESS_POINT\r
+static void     smpl_send_join_reply(mrfiPacket_t *frame);\r
+static uint32_t generateLinkToken(void);\r
+static void     handleJoinRequest(mrfiPacket_t *);\r
+#endif  /*  ACCESS_POINT */\r
+\r
+/******************************************************************************\r
+ * GLOBAL VARIABLES\r
+ */\r
+\r
+/******************************************************************************\r
+ * GLOBAL FUNCTIONS\r
+ */\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_joinInit\r
+ *\r
+ * @brief       Initialize Join application.\r
+ *\r
+ * input parameters\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   void\r
+ */\r
+void nwk_joinInit(uint8_t (*pf)(linkID_t))\r
+{\r
+  if (!sJoinToken) \r
+  {\r
+    sJoinToken = DEFAULT_JOIN_TOKEN;\r
+  }\r
+  \r
+  spCallback = pf;\r
+  (void) spCallback;  /* keep compiler happy if we don't use this */\r
+\r
+  sTid = MRFI_RandomByte() ;\r
+\r
+#ifdef ACCESS_POINT\r
+  /* set link token to something other than deafult if desired */\r
+  nwk_setLinkToken(generateLinkToken());\r
+#if defined(STARTUP_JOINCONTEXT_ON)\r
+  sJoinOK = 1;\r
+#elif defined(STARTUP_JOINCONTEXT_OFF)\r
+  sJoinOK = 0;\r
+#else\r
+#error ERROR: Must define either STARTUP_JOINCONTEXT_ON or STARTUP_JOINCONTEXT_OFF\r
+#endif\r
+  spSandFContext = nwk_getSFInfoPtr();\r
+#endif\r
+\r
+  return;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_setJoinToken\r
+ *\r
+ * @brief       Sets the join token.\r
+ *\r
+ * input parameters\r
+ * @param   token   - join token to be used on this network.\r
+ *\r
+ * output parameters\r
+ *         no room in output queue.\r
+ *\r
+ * @return   void\r
+ */\r
+void nwk_setJoinToken(uint32_t token)\r
+{\r
+  /* only set if the supplied token is non-zero. */\r
+  if (token)\r
+  {\r
+    sJoinToken = token;\r
+  }\r
+\r
+  return;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_getJoinToken\r
+ *\r
+ * @brief       Gets the current join token.\r
+ *\r
+ * input parameters\r
+ *\r
+ * output parameters\r
+ * @param   pToken   - pointer to the returned value.\r
+ *\r
+ * @return   Current link token\r
+ */\r
+void nwk_getJoinToken(uint32_t *pToken)\r
+{\r
+  /* only set if the supplied token is non-zero. */\r
+  if (pToken)\r
+  {\r
+    *pToken = sJoinToken;\r
+  }\r
+\r
+  return;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          generateLinkToken\r
+ *\r
+ * @brief       Generate the link token to be used for the network controlled\r
+ *              by this Access Point.\r
+ *\r
+ * input parameters\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   void\r
+ */\r
+#ifdef ACCESS_POINT\r
+static uint32_t generateLinkToken(void)\r
+{\r
+  return 0xDEADBEEF;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          smpl_send_join_reply\r
+ *\r
+ * @brief       Send the Join reply. Include the Link token. If the device is\r
+ *              a polling sleeper put it into the list of store-and-forward\r
+ *              clients.\r
+ *\r
+ * input parameters\r
+ * @param   frame     - join frame for which a reply is needed...maybe\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   void\r
+ */\r
+static void smpl_send_join_reply(mrfiPacket_t *frame)\r
+{\r
+  frameInfo_t *pOutFrame;\r
+  uint8_t      msg[JOIN_REPLY_FRAME_SIZE];\r
+\r
+  /* Is this a legacy frame? If so continue. Otherwise check verion.*/\r
+  if ((MRFI_GET_PAYLOAD_LEN(frame) - F_APP_PAYLOAD_OS) > JOIN_LEGACY_MSG_LENGTH)\r
+  {\r
+    /* see if protocol version is correct... */\r
+    if (*(MRFI_P_PAYLOAD(frame)+F_APP_PAYLOAD_OS+J_PROTOCOL_VERSION_OS) != nwk_getProtocolVersion())\r
+    {\r
+      /* Accommodation of protocol version differences can be noted or accomplished here.\r
+       * Otherwise, no match and the board goes back\r
+       */\r
+      return;\r
+    }\r
+  }\r
+\r
+\r
+  /* see if join token is correct */\r
+  {\r
+    uint32_t jt;\r
+\r
+    nwk_getNumObjectFromMsg(MRFI_P_PAYLOAD(frame)+F_APP_PAYLOAD_OS+J_JOIN_TOKEN_OS, &jt, sizeof(jt));\r
+    if (jt != sJoinToken)\r
+    {\r
+      return;\r
+    }\r
+  }\r
+\r
+  /* send reply with tid, the link token, and the encryption context */\r
+  {\r
+    uint32_t linkToken;\r
+\r
+    nwk_getLinkToken(&linkToken);\r
+    nwk_putNumObjectIntoMsg((void *)&linkToken, msg+JR_LINK_TOKEN_OS, sizeof(linkToken));\r
+  }\r
+  msg[JR_CRYPTKEY_SIZE_OS] = SEC_CRYPT_KEY_SIZE;\r
+  msg[JB_REQ_OS]           = JOIN_REQ_JOIN | NWK_APP_REPLY_BIT;\r
+  /* sender's tid... */\r
+  msg[JB_TID_OS]           = *(MRFI_P_PAYLOAD(frame)+F_APP_PAYLOAD_OS+JB_TID_OS);\r
+\r
+  if (pOutFrame = nwk_buildFrame(SMPL_PORT_JOIN, msg, sizeof(msg), MAX_HOPS_FROM_AP))\r
+  {\r
+    /* destination address is the source adddress of the received frame. */\r
+    memcpy(MRFI_P_DST_ADDR(&pOutFrame->mrfiPkt), MRFI_P_SRC_ADDR(frame), NET_ADDR_SIZE);\r
+\r
+#ifdef AP_IS_DATA_HUB\r
+    /* if source device supports ED objects save source address to detect duplicate joins */\r
+    if (*(MRFI_P_PAYLOAD(frame)+F_APP_PAYLOAD_OS+J_NUMCONN_OS))\r
+    {\r
+      if (nwk_saveJoinedDevice(frame) && spCallback)\r
+      {\r
+        spCallback(0);\r
+      }\r
+    }\r
+#endif\r
+  }\r
+  else\r
+  {\r
+    /* oops -- no room left for Tx frame. Don't send reply. */\r
+    return;\r
+  }\r
+\r
+  /* If this device polls we need to provide store-and-forward support */\r
+  if (GET_FROM_FRAME(MRFI_P_PAYLOAD(frame),F_RX_TYPE) == F_RX_TYPE_POLLS)\r
+  {\r
+    uint8_t loc;\r
+\r
+    /* Check duplicate status */\r
+    if (!nwk_isSandFClient(MRFI_P_SRC_ADDR(frame), &loc))\r
+    {\r
+      uint8_t        *pNumc   = &spSandFContext->curNumSFClients;\r
+      sfClientInfo_t *pClient = &spSandFContext->sfClients[*pNumc];\r
+\r
+      /* It's not a duplicate. Save it if there's room */\r
+      if (*pNumc < NUM_STORE_AND_FWD_CLIENTS)\r
+      {\r
+        memcpy(pClient->clientAddr.addr, MRFI_P_SRC_ADDR(frame), NET_ADDR_SIZE);\r
+        *pNumc = *pNumc + 1;\r
+      }\r
+      else\r
+      {\r
+        /* No room left. Just return and don't send reply. */\r
+        return;\r
+      }\r
+    }\r
+    else\r
+    {\r
+      /* We get here if it's a duplicate. We drop through and send reply.\r
+       * Reset the S&F marker in the Management application -- we should\r
+       * assume that the Client reset so the TID will be random. If this is\r
+       * simply a duplicate frame it causes no harm.\r
+       */\r
+      nwk_resetSFMarker(loc);\r
+    }\r
+  }\r
+\r
+#ifdef SMPL_SECURE\r
+    nwk_setSecureFrame(&pOutFrame->mrfiPkt, sizeof(msg), 0);\r
+#endif  /* SMPL_SECURE */\r
+\r
+  /* It's not S&F or it is but we're OK to send reply. */\r
+  nwk_sendFrame(pOutFrame, MRFI_TX_TYPE_FORCED);\r
+\r
+  return;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_join\r
+ *\r
+ * @brief       Stub Join function for Access Points.\r
+ *\r
+ * input parameters\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   Always returns SMPL_SUCCESS.\r
+ */\r
+smplStatus_t nwk_join(void)\r
+{\r
+  return SMPL_SUCCESS;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_isSandFClient\r
+ *\r
+ * @brief       Helper function to see if the destination of a frame we have is\r
+ *              one of AP's store-and-forward clients.\r
+ *\r
+ * input parameters\r
+ * @param   fPtr     - pointer to address in frame in question\r
+ *\r
+ * output parameters\r
+ * @param   entLoc   - pointer to receive entry location in array of clients.\r
+ *\r
+ * @return   Returns client info structure pointer if the destination is a\r
+ *           store-and-forward client, else 0.\r
+ */\r
+sfClientInfo_t *nwk_isSandFClient(uint8_t *pAddr, uint8_t *entLoc)\r
+{\r
+  uint8_t i;\r
+  sfClientInfo_t *pSFClient = spSandFContext->sfClients;\r
+\r
+  for (i=0; i<spSandFContext->curNumSFClients; ++i, ++pSFClient)\r
+  {\r
+    if (!memcmp(&pSFClient->clientAddr.addr, pAddr, NET_ADDR_SIZE))\r
+    {\r
+      *entLoc = i;\r
+      return pSFClient;\r
+    }\r
+  }\r
+\r
+  return 0;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_setJoinContext\r
+ *\r
+ * @brief       Helper function to set Join context for Access Point. This will\r
+ *              allow arbitration bewteen potentially nearby Access Points when\r
+ *              a new device is joining.\r
+ *\r
+ * input parameters\r
+ * @param   which   - Join context is either off or on\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   void\r
+ */\r
+void nwk_setJoinContext(uint8_t which)\r
+{\r
+  sJoinOK = (JOIN_CONTEXT_ON == which) ? 1 : 0;\r
+\r
+  return;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          handleJoinRequest\r
+ *\r
+ * @brief       Dispatches handler for specfic join request\r
+ *\r
+ * input parameters\r
+ *\r
+ * @param   frame - Join frame received\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   void\r
+ */\r
+static void handleJoinRequest(mrfiPacket_t *frame)\r
+{\r
+  if (JOIN_LEGACY_MSG_LENGTH == (MRFI_GET_PAYLOAD_LEN(frame) - F_APP_PAYLOAD_OS))\r
+  {\r
+    /* Legacy frame. Spoof a join request */\r
+    *(MRFI_P_PAYLOAD(frame)+F_APP_PAYLOAD_OS) = JOIN_REQ_JOIN;\r
+  }\r
+\r
+  switch (*(MRFI_P_PAYLOAD(frame)+F_APP_PAYLOAD_OS))\r
+  {\r
+    case JOIN_REQ_JOIN:\r
+      smpl_send_join_reply(frame);\r
+      break;\r
+\r
+    default:\r
+      break;\r
+  }\r
+\r
+  return;\r
+}\r
+\r
+#else  /* ACCESS_POINT */\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_join\r
+ *\r
+ * @brief       Join functioanlity for non-AP devices. Send the Join token\r
+ *              and wait for the reply.\r
+ *\r
+ * input parameters\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   Status of operation.\r
+ */\r
+smplStatus_t nwk_join(void)\r
+{\r
+  uint8_t      msg[JOIN_FRAME_SIZE];\r
+  uint32_t     linkToken;\r
+  addr_t       apAddr;\r
+  uint8_t      radioState = MRFI_GetRadioState();\r
+  smplStatus_t rc = SMPL_NO_JOIN;\r
+  union\r
+  {\r
+    ioctlRawSend_t    send;\r
+    ioctlRawReceive_t recv;\r
+  } ioctl_info;\r
+\r
+#if defined( FREQUENCY_AGILITY )\r
+  uint8_t  i, numChan;\r
+  freqEntry_t channels[NWK_FREQ_TBL_SIZE];\r
+\r
+  if (!(numChan=nwk_scanForChannels(channels)))\r
+  {\r
+    return SMPL_NO_CHANNEL;\r
+  }\r
+\r
+  for (i=0; i<numChan; ++i)\r
+  {\r
+    nwk_setChannel(&channels[i]);\r
+#else\r
+  {\r
+#endif\r
+\r
+    ioctl_info.send.addr = (addr_t *)nwk_getBCastAddress();\r
+    ioctl_info.send.msg  = msg;\r
+    ioctl_info.send.len  = sizeof(msg);\r
+    ioctl_info.send.port = SMPL_PORT_JOIN;\r
+\r
+    /* Put join token in */\r
+    nwk_putNumObjectIntoMsg((void *)&sJoinToken, msg+J_JOIN_TOKEN_OS, sizeof(sJoinToken));\r
+    /* set app info byte */\r
+    msg[JB_REQ_OS] = JOIN_REQ_JOIN;\r
+    msg[JB_TID_OS] = sTid;\r
+    /* Set number of connections supported. Used only by AP if it is\r
+     * a data hub.\r
+     */\r
+    msg[J_NUMCONN_OS] = NUM_CONNECTIONS;\r
+    /* protocol version number */\r
+    msg[J_PROTOCOL_VERSION_OS] = nwk_getProtocolVersion();\r
+\r
+    SMPL_Ioctl(IOCTL_OBJ_RAW_IO, IOCTL_ACT_WRITE, &ioctl_info.send);\r
+\r
+    ioctl_info.recv.port = SMPL_PORT_JOIN;\r
+    ioctl_info.recv.msg  = msg;\r
+    ioctl_info.recv.addr = &apAddr;    /* save AP address from reply */\r
+\r
+    NWK_CHECK_FOR_SETRX(radioState);\r
+    NWK_REPLY_DELAY();\r
+    NWK_CHECK_FOR_RESTORE_STATE(radioState);\r
+\r
+    if (SMPL_SUCCESS == SMPL_Ioctl(IOCTL_OBJ_RAW_IO, IOCTL_ACT_READ, &ioctl_info.recv))\r
+    {\r
+      uint8_t firstByte = msg[JB_REQ_OS] & (~NWK_APP_REPLY_BIT);\r
+\r
+      /* Sanity check for correct reply frame. Older version\r
+       * has the length instead of the request as the first byte.\r
+       */\r
+      if ((firstByte == JOIN_REQ_JOIN) ||\r
+          (firstByte == JOIN_REPLY_LEGACY_MSG_LENGTH)\r
+         )\r
+      {\r
+        /* join reply returns link token */\r
+        memcpy(&linkToken, msg+JR_LINK_TOKEN_OS, sizeof(linkToken));\r
+\r
+        nwk_setLinkToken(linkToken);\r
+        /* save AP address */\r
+        nwk_setAPAddress(&apAddr);\r
+        sTid++;   /* guard against duplicates */\r
+        rc = SMPL_SUCCESS;\r
+#if defined( FREQUENCY_AGILITY )\r
+        break;\r
+#endif\r
+      }\r
+    }\r
+    /* TODO: process encryption stuff */\r
+  }\r
+\r
+  return rc;\r
+\r
+}\r
+\r
+#endif /* ACCESS_POINT */\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_processJoin\r
+ *\r
+ * @brief       Processes a Join frame. If this is a reply let it go to the\r
+ *              application. Otherwise generate and send the reply.\r
+ *\r
+ * input parameters\r
+ * @param   frame     - Pointer to Join frame\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   Keep frame for application, release frame, or replay frame.\r
+ */\r
+fhStatus_t nwk_processJoin(mrfiPacket_t *frame)\r
+{\r
+  fhStatus_t rc = FHS_RELEASE;\r
+  uint8_t    replyType;\r
+\r
+  /* Make sure this is a reply and see if we sent this. Validate the\r
+   * packet for reception by client app.\r
+   */\r
+  if (SMPL_MY_REPLY == (replyType=nwk_isValidReply(frame, sTid, JB_REQ_OS, JB_TID_OS)))\r
+  {\r
+    /* It's a match and it's a reply. Validate the received packet by\r
+     * returning a 1 so it can be received by the client app.\r
+     */\r
+    MRFI_PostKillSem();\r
+    rc = FHS_KEEP;\r
+  }\r
+#if defined(ACCESS_POINT)\r
+  else if (SMPL_A_REPLY == replyType)\r
+  {\r
+    /* No match. If I'm not an ED this is a reply that should be passed on. */\r
+    rc = FHS_REPLAY;\r
+  }\r
+  else\r
+  {\r
+    /* Send reply if we're an Access Point otherwise ignore the frame. */\r
+    if ((SMPL_NOT_REPLY == replyType) && sJoinOK)\r
+    {\r
+      handleJoinRequest(frame);\r
+    }\r
+  }\r
+#elif defined(RANGE_EXTENDER)\r
+  else\r
+  {\r
+    /* Either a reply that has to be replayed or a request that\r
+     * also must be replayed.\r
+     */\r
+    rc = FHS_REPLAY;\r
+  }\r
+#endif /* not END_DEVICE */\r
+\r
+  (void) replyType;  /* keep compiler happy */\r
+\r
+  return rc;\r
+}\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/Components/nwk_applications/nwk_join.h b/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/Components/nwk_applications/nwk_join.h
new file mode 100755 (executable)
index 0000000..69ccc36
--- /dev/null
@@ -0,0 +1,91 @@
+/**************************************************************************************************\r
+  Filename:       nwk_join.h\r
+  Revised:        $Date: 2009-01-06 12:26:02 -0800 (Tue, 06 Jan 2009) $\r
+  Revision:       $Revision: 18693 $\r
+  Author:         $Author: lfriedman $\r
+\r
+  Description:    This header file supports the SimpliciTI Join network application.\r
+\r
+  Copyright 2004-2007 Texas Instruments Incorporated. All rights reserved.\r
+\r
+  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+  the terms of a software license agreement between the user who downloaded the software,\r
+  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+  License. The License limits your use, and you acknowledge, that the Software may not be\r
+  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+  perform, display or sell this Software and/or its documentation for any purpose.\r
+\r
+  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+\r
+  Should you have any questions regarding your right to use this Software,\r
+  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+\r
+#ifndef NWK_JOIN_H\r
+#define NWK_JOIN_H\r
+\r
+#define JOIN_CONTEXT_ON  (0x01)\r
+#define JOIN_CONTEXT_OFF (0x02)\r
+\r
+/* Macros needed for protocol backward compatibility */\r
+#define JOIN_LEGACY_MSG_LENGTH        7\r
+#define JOIN_REPLY_LEGACY_MSG_LENGTH  6\r
+\r
+/* place holder... */\r
+#define SEC_CRYPT_KEY_SIZE  0\r
+\r
+/* application payload offsets */\r
+/*    both */\r
+#define JB_REQ_OS                0\r
+#define JB_TID_OS                1\r
+/*    join frame */\r
+#define J_JOIN_TOKEN_OS          2\r
+#define J_NUMCONN_OS             6\r
+#define J_PROTOCOL_VERSION_OS    7\r
+/*    join reply frame */\r
+#define JR_LINK_TOKEN_OS         2\r
+#define JR_CRYPTKEY_SIZE_OS      6\r
+#define JR_CRYPTKEY_OS           7\r
+\r
+/* change the following as protocol developed */\r
+#define MAX_JOIN_APP_FRAME    (JR_CRYPTKEY_OS + SEC_CRYPT_KEY_SIZE)\r
+\r
+/* set out frame size */\r
+#define JOIN_FRAME_SIZE         8\r
+#define JOIN_REPLY_FRAME_SIZE   MAX_JOIN_APP_FRAME\r
+\r
+/* join requests\r
+ * NOTE: If aditional command codes are required do _not_ use the\r
+ *       value JOIN_REPLY_LEGACY_MSG_LENGTH. This numeral is used\r
+ *       to guarantee that legacy Join frames (from before release\r
+ *       1.0.6) work correctly. Don't ask.\r
+ */\r
+#define JOIN_REQ_JOIN       1\r
+\r
+/* prototypes */\r
+void            nwk_joinInit(uint8_t (*)(linkID_t));\r
+smplStatus_t    nwk_join(void);\r
+fhStatus_t      nwk_processJoin(mrfiPacket_t *);\r
+void            nwk_getJoinToken(uint32_t *);\r
+void            nwk_setJoinContext(uint8_t);\r
+void            nwk_setJoinToken(uint32_t);\r
+void            nwk_getJoinToken(uint32_t *);\r
+#ifdef ACCESS_POINT\r
+sfClientInfo_t *nwk_isSandFClient(uint8_t *, uint8_t *);\r
+#endif\r
+\r
+#endif\r
+\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/Components/nwk_applications/nwk_link.c b/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/Components/nwk_applications/nwk_link.c
new file mode 100755 (executable)
index 0000000..c7e2a19
--- /dev/null
@@ -0,0 +1,853 @@
+/**************************************************************************************************\r
+  Filename:       nwk_link.c\r
+  Revised:        $Date: 2008-12-23 13:54:27 -0800 (Tue, 23 Dec 2008) $\r
+  Revision:       $Revision: 18652 $\r
+  Author:         $Author: lfriedman $\r
+\r
+  Description:    This file supports the SimpliciTI Link network application.\r
+\r
+  Copyright 2007-2008 Texas Instruments Incorporated. All rights reserved.\r
+\r
+  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+  the terms of a software license agreement between the user who downloaded the software,\r
+  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+  License. The License limits your use, and you acknowledge, that the Software may not be\r
+  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+  perform, display or sell this Software and/or its documentation for any purpose.\r
+\r
+  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+\r
+  Should you have any questions regarding your right to use this Software,\r
+  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+\r
+/******************************************************************************\r
+ * INCLUDES\r
+ */\r
+\r
+#include <string.h>\r
+#include "bsp.h"\r
+#include "mrfi.h"\r
+#include "nwk_types.h"\r
+#include "nwk_api.h"\r
+#include "nwk_frame.h"\r
+#include "nwk.h"\r
+#include "nwk_link.h"\r
+#include "nwk_globals.h"\r
+#include "nwk_security.h"\r
+\r
+/******************************************************************************\r
+ * MACROS\r
+ */\r
+\r
+/******************************************************************************\r
+ * CONSTANTS AND DEFINES\r
+ */\r
+\r
+/******************************************************************************\r
+ * TYPEDEFS\r
+ */\r
+\r
+/******************************************************************************\r
+ * LOCAL VARIABLES\r
+ */\r
+static uint32_t          sLinkToken = 0;\r
+static volatile uint8_t  sListenActive = 0;\r
+#if NUM_CONNECTIONS > 0\r
+static volatile linkID_t sServiceLinkID[NUM_CONNECTIONS];\r
+#endif\r
+static volatile uint8_t  sNumLinkers = 0;\r
+static volatile uint8_t  sTid = 0;\r
+\r
+/******************************************************************************\r
+ * LOCAL FUNCTIONS\r
+ */\r
+\r
+#define  SENT_REPLY       1\r
+#define  SENT_NO_REPLY    2\r
+static uint8_t    smpl_send_link_reply(mrfiPacket_t *);\r
+static fhStatus_t handleLinkRequest(mrfiPacket_t *);\r
+#if defined(EXTENDED_API)\r
+static void       smpl_send_unlink_reply(mrfiPacket_t *);\r
+#endif\r
+\r
+\r
+/******************************************************************************\r
+ * GLOBAL VARIABLES\r
+ */\r
+\r
+/******************************************************************************\r
+ * GLOBAL FUNCTIONS\r
+ */\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_linkInit\r
+ *\r
+ * @brief       Initialize link app. Set link token to the default.\r
+ *\r
+ * input parameters\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   void\r
+ */\r
+void nwk_linkInit(void)\r
+{\r
+  if (!sLinkToken)\r
+  {\r
+    /* if the link token has not been set externally by the time we get here\r
+     * (such as by the ioctl token-setting interface) assign the default\r
+     */\r
+    sLinkToken = DEFAULT_LINK_TOKEN;\r
+  }\r
+\r
+  /* set a non-zero TID. */\r
+  while (!(sTid = MRFI_RandomByte()))  ;\r
+\r
+#if NUM_CONNECTIONS > 0\r
+  memset((void *)&sServiceLinkID, 0x0, sizeof(sServiceLinkID));\r
+#endif\r
+\r
+  return;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_setLinkToken\r
+ *\r
+ * @brief       Sets the link token received in a Join reply.\r
+ *\r
+ * input parameters\r
+ * @param   token   - Link token to be used on this network to link to any peer.\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   void\r
+ */\r
+void nwk_setLinkToken(uint32_t token)\r
+{\r
+  /* only set if the supplied token is non-zero. */\r
+  if (token)\r
+  {\r
+    sLinkToken = token;\r
+  }\r
+\r
+  return;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_getLinkToken\r
+ *\r
+ * @brief       Gets the current link token.\r
+ *\r
+ * input parameters\r
+ *\r
+ * output parameters\r
+ * @param   pToken   - pointer to the returned value.\r
+ *\r
+ * @return   Current link token\r
+ */\r
+void nwk_getLinkToken(uint32_t *pToken)\r
+{\r
+  /* only set if the supplied token is non-zero. */\r
+  if (pToken)\r
+  {\r
+    *pToken = sLinkToken;\r
+  }\r
+\r
+  return;\r
+}\r
+\r
+#if defined(EXTENDED_API)\r
+/******************************************************************************\r
+ * @fn          nwk_unlink\r
+ *\r
+ * @brief       Called from the application level to tear down a link.\r
+ *\r
+ * input parameters\r
+ *\r
+ * output parameters\r
+ * @param   lid     - Link ID assigned for this link\r
+ *\r
+ * @return   Status of the operation.\r
+ *           SMPL_SUCCESS\r
+ *           SMPL_BAD_PARAM       No connection table entry for this Link ID;\r
+ *                                SMPL_LINKID_USER_UUD not valid since it is not\r
+ *                                connection-based.\r
+ *           SMPL_TIMEOUT         No reply from peer.\r
+ *           SMPL_NO_PEER_UNLINK  Peer did not have a Connection Table entry for me.\r
+ */\r
+smplStatus_t nwk_unlink(linkID_t lid)\r
+{\r
+  uint8_t      msg[UNLINK_FRAME_SIZE];\r
+  connInfo_t  *pCInfo = nwk_getConnInfo(lid);\r
+  smplStatus_t rc     = SMPL_SUCCESS;\r
+  addr_t       addr;\r
+  union\r
+  {\r
+    ioctlRawSend_t    send;\r
+    ioctlRawReceive_t recv;\r
+  } ioctl_info;\r
+\r
+  /* is there connection info? */\r
+   if (!pCInfo || (lid == SMPL_LINKID_USER_UUD))\r
+  {\r
+    return SMPL_BAD_PARAM;\r
+  }\r
+\r
+  /* set request byte */\r
+  msg[LB_REQ_OS] = LINK_REQ_UNLINK;\r
+\r
+  /* set the transaction ID. this allows target to figure out duplicates */\r
+  msg[LB_TID_OS] = sTid;\r
+\r
+  /* remote port to be sent in message to help match connection */\r
+  msg[UL_RMT_PORT_OS] = pCInfo->portRx;\r
+\r
+  /* setup for ioctl raw I/O */\r
+  memcpy(addr.addr, pCInfo->peerAddr, NET_ADDR_SIZE);\r
+  ioctl_info.send.addr = &addr;\r
+  ioctl_info.send.msg  = msg;\r
+  ioctl_info.send.len  = sizeof(msg);\r
+  ioctl_info.send.port = SMPL_PORT_LINK;\r
+\r
+  SMPL_Ioctl(IOCTL_OBJ_RAW_IO, IOCTL_ACT_WRITE, &ioctl_info.send);\r
+\r
+  {\r
+    uint8_t spin       = NWK_RX_RETRY_COUNT;\r
+    uint8_t radioState = MRFI_GetRadioState();\r
+\r
+    ioctl_info.recv.port = SMPL_PORT_LINK;\r
+    ioctl_info.recv.msg  = msg;\r
+    ioctl_info.recv.addr = (addr_t *)0;\r
+\r
+    do\r
+    {\r
+      NWK_CHECK_FOR_SETRX(radioState);\r
+      NWK_REPLY_DELAY();\r
+      NWK_CHECK_FOR_RESTORE_STATE(radioState);\r
+\r
+      if (SMPL_SUCCESS == SMPL_Ioctl(IOCTL_OBJ_RAW_IO, IOCTL_ACT_READ, &ioctl_info.recv))\r
+      {\r
+        if ((msg[LB_REQ_OS] & (~NWK_APP_REPLY_BIT)) == LINK_REQ_UNLINK)\r
+        {\r
+          rc = (smplStatus_t)msg[ULR_RESULT_OS];\r
+          break;\r
+        }\r
+      }\r
+      if (!spin)\r
+      {\r
+        rc = SMPL_TIMEOUT;\r
+        break;\r
+      }\r
+      --spin;\r
+    } while (1);\r
+\r
+   /* it's ok to unconditionally invalidate connection object */\r
+    nwk_freeConnection(pCInfo);\r
+  }\r
+  return rc;\r
+}\r
+#endif  /* EXTENDED_API */\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_link\r
+ *\r
+ * @brief       Called from the application level to accomplish the link\r
+ *\r
+ * input parameters\r
+ *\r
+ * output parameters\r
+ * @param   lid     - pointer to Link ID (port) assigned for this link\r
+ *\r
+ * @return   Status of the operation.\r
+ */\r
+smplStatus_t nwk_link(linkID_t *lid)\r
+{\r
+  uint8_t       msg[LINK_FRAME_SIZE];\r
+  connInfo_t   *pCInfo = nwk_getNextConnection();\r
+  smplStatus_t  rc;\r
+\r
+  if (pCInfo)\r
+  {\r
+    addr_t              addr;\r
+    union\r
+    {\r
+      ioctlRawSend_t    send;\r
+      ioctlRawReceive_t recv;\r
+    } ioctl_info;\r
+\r
+    if (!nwk_allocateLocalRxPort(LINK_SEND, pCInfo))\r
+    {\r
+      nwk_freeConnection(pCInfo);\r
+      return SMPL_NOMEM;\r
+    }\r
+\r
+    memcpy(addr.addr, nwk_getBCastAddress(), NET_ADDR_SIZE);\r
+    ioctl_info.send.addr = &addr;\r
+    ioctl_info.send.msg  = msg;\r
+    ioctl_info.send.len  = sizeof(msg);\r
+    ioctl_info.send.port = SMPL_PORT_LINK;\r
+\r
+    /* Put link token in */\r
+    nwk_putNumObjectIntoMsg((void *)&sLinkToken, msg+L_LINK_TOKEN_OS, sizeof(sLinkToken));\r
+\r
+    /* set port to which the remote device should send */\r
+    msg[L_RMT_PORT_OS] = pCInfo->portRx;\r
+\r
+    /* set the transaction ID. this allows target to figure out duplicates */\r
+    msg[LB_TID_OS] = sTid;\r
+\r
+    /* set my Rx type */\r
+    msg[L_MY_RXTYPE_OS] = nwk_getMyRxType();\r
+\r
+    /* set request byte */\r
+    msg[LB_REQ_OS] = LINK_REQ_LINK;\r
+\r
+    /* protocol version number */\r
+    msg[L_PROTOCOL_VERSION_OS] = nwk_getProtocolVersion();\r
+\r
+#if defined(SMPL_SECURE)\r
+    pCInfo->connTxCTR = MRFI_RandomByte()                   | \\r
+                        ((uint32_t)(MRFI_RandomByte())<<8)  | \\r
+                        ((uint32_t)(MRFI_RandomByte())<<16) | \\r
+                        ((uint32_t)(MRFI_RandomByte())<<24);\r
+\r
+    nwk_putNumObjectIntoMsg((void *)&pCInfo->connTxCTR, (void *)&msg[L_CTR_OS], 4);\r
+#endif\r
+\r
+\r
+    if (SMPL_SUCCESS != (rc=SMPL_Ioctl(IOCTL_OBJ_RAW_IO, IOCTL_ACT_WRITE, &ioctl_info.send)))\r
+    {\r
+      return rc;\r
+    }\r
+\r
+    {\r
+      uint8_t radioState = MRFI_GetRadioState();\r
+\r
+      ioctl_info.recv.port = SMPL_PORT_LINK;\r
+      ioctl_info.recv.msg  = msg;\r
+      ioctl_info.recv.addr = (addr_t *)pCInfo->peerAddr;\r
+\r
+      NWK_CHECK_FOR_SETRX(radioState);\r
+      NWK_REPLY_DELAY();\r
+      NWK_CHECK_FOR_RESTORE_STATE(radioState);\r
+\r
+      if (SMPL_SUCCESS == SMPL_Ioctl(IOCTL_OBJ_RAW_IO, IOCTL_ACT_READ, &ioctl_info.recv))\r
+      {\r
+        uint8_t firstByte = msg[LB_REQ_OS] & (~NWK_APP_REPLY_BIT);\r
+\r
+        /* Sanity check for correct reply frame. Older version\r
+         * has the length instead of the request as the first byte.\r
+         */\r
+        if ((firstByte != LINK_REQ_LINK) &&\r
+            (firstByte != LINK_REPLY_LEGACY_MSG_LENGTH)\r
+           )\r
+        {\r
+          /* invalidate connection object */\r
+          nwk_freeConnection(pCInfo);\r
+          return SMPL_NO_LINK;\r
+\r
+        }\r
+      }\r
+      else\r
+      {\r
+        /* no successful receive */\r
+        nwk_freeConnection(pCInfo);\r
+        return SMPL_TIMEOUT;\r
+      }\r
+\r
+      pCInfo->connState = CONNSTATE_CONNECTED;\r
+      pCInfo->portTx    = msg[LR_RMT_PORT_OS];    /* link reply returns remote port */\r
+      *lid              = pCInfo->thisLinkID;     /* return our local port number */\r
+\r
+      /* Set hop count. If it's a polling device set the count to the\r
+       * distance to the AP. Otherwise, set it to the max less the remaining\r
+       * which will be the path taken for this frame. It will be no worse\r
+       * then tha max and probably will be better.\r
+       */\r
+      if (F_RX_TYPE_POLLS == msg[LR_MY_RXTYPE_OS])\r
+      {\r
+        pCInfo->hops2target = MAX_HOPS_FROM_AP;\r
+      }\r
+      else\r
+      {\r
+        /* Can't really use this trick because the device could move. If the\r
+         * devices are all static this may work unless the initial reception\r
+         * was marginal.\r
+         */\r
+#if defined(DEVICE_DOES_NOT_MOVE)\r
+        pCInfo->hops2target = MAX_HOPS - ioctl_info.recv.hopCount;\r
+#else\r
+        pCInfo->hops2target = MAX_HOPS;\r
+#endif\r
+      }\r
+\r
+#if defined(SMPL_SECURE)\r
+      nwk_getNumObjectFromMsg((void *)&msg[LR_CTR_OS], (void *)&pCInfo->connRxCTR, 4);\r
+#endif\r
+    }\r
+\r
+    /* guard against duplicates... */\r
+    ++sTid;\r
+    if (!sTid)\r
+    {\r
+      sTid = 1;\r
+    }\r
+    return SMPL_SUCCESS;\r
+  }\r
+\r
+  return SMPL_NOMEM;\r
+}\r
+\r
+#if defined(EXTENDED_API)\r
+/******************************************************************************\r
+ * @fn          smpl_send_unlink_reply\r
+ *\r
+ * @brief       Send the unlink reply to the device trying to unlink\r
+ *\r
+ * input parameters\r
+ * @param   frame   - frame received from linker\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   void\r
+ */\r
+static void smpl_send_unlink_reply(mrfiPacket_t *frame)\r
+{\r
+  connInfo_t  *pCInfo;\r
+  frameInfo_t *pOutFrame;\r
+  uint8_t      msg[UNLINK_REPLY_FRAME_SIZE];\r
+  smplStatus_t rc = SMPL_NO_PEER_UNLINK;\r
+\r
+  /* match the remote port and source address with a connection table entry */\r
+  if (pCInfo = nwk_findPeer((addr_t *)MRFI_P_SRC_ADDR(frame), *(MRFI_P_PAYLOAD(frame)+F_APP_PAYLOAD_OS+UL_RMT_PORT_OS)))\r
+  {\r
+    /* Note we unconditionally free the connection resources */\r
+    nwk_freeConnection(pCInfo);\r
+    rc = SMPL_SUCCESS;\r
+  }\r
+\r
+  /* set reply bit */\r
+  msg[LB_REQ_OS] = LINK_REQ_UNLINK | NWK_APP_REPLY_BIT;\r
+\r
+  /* sender's TID */\r
+  msg[LB_TID_OS] = *(MRFI_P_PAYLOAD(frame)+F_APP_PAYLOAD_OS+LB_TID_OS);\r
+\r
+  /* result of freeing local connection */\r
+  msg[ULR_RESULT_OS] = rc;\r
+\r
+  if (pOutFrame = nwk_buildFrame(SMPL_PORT_LINK, msg, sizeof(msg), MAX_HOPS))\r
+  {\r
+    /* destination address is the source adddress of the received frame. */\r
+    memcpy(MRFI_P_DST_ADDR(&pOutFrame->mrfiPkt), MRFI_P_SRC_ADDR(frame), NET_ADDR_SIZE);\r
+#if defined(SMPL_SECURE)\r
+    nwk_setSecureFrame(&pOutFrame->mrfiPkt, sizeof(msg), 0);\r
+#endif  /* SMPL_SECURE */\r
+    nwk_sendFrame(pOutFrame, MRFI_TX_TYPE_FORCED);\r
+  }\r
+}\r
+#endif  /* EXTENDED_API */\r
+\r
+/******************************************************************************\r
+ * @fn          smpl_send_link_reply\r
+ *\r
+ * @brief       Send the link reply to the device trying to link. This routine\r
+ *              will handle duplicates.\r
+ *\r
+ * input parameters\r
+ * @param   frame   - frame received from linker\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   Returns SENT_REPLY if reply sent, else SENT_NO_REPLY.\r
+ *           The return value is used as this routine unwinds to know\r
+ *           whether to replay the frame. An RE or AP can host an ED\r
+ *           object in which case it might send a reply (possibly from\r
+ *           a duplicate frame). If we do reply we do not want to replay.\r
+ */\r
+static uint8_t smpl_send_link_reply(mrfiPacket_t *frame)\r
+{\r
+#if NUM_CONNECTIONS > 0\r
+  frameInfo_t *pOutFrame;\r
+  connInfo_t  *pCInfo;\r
+  uint8_t      remotePort;\r
+  uint8_t      msg[LINK_REPLY_FRAME_SIZE];\r
+\r
+  /* Is this a legacy frame? If so continue. Otherwise check version.*/\r
+  if ((MRFI_GET_PAYLOAD_LEN(frame) - F_APP_PAYLOAD_OS) > LINK_LEGACY_MSG_LENGTH)\r
+  {\r
+    /* see if protocol version is correct... */\r
+    if (*(MRFI_P_PAYLOAD(frame)+F_APP_PAYLOAD_OS+L_PROTOCOL_VERSION_OS) != nwk_getProtocolVersion())\r
+    {\r
+      /* Accommodation of protocol version differences can be noted or accomplished here.\r
+       * This field was also checked in the join transaction but it is checked again here\r
+       * because that check may not have occurred if thre is no AP in this topology.\r
+       * Otherwise, no match and the board goes back\r
+       */\r
+      return SENT_NO_REPLY;\r
+    }\r
+  }\r
+\r
+  /* see if token is correct */\r
+  {\r
+    uint32_t lt;\r
+\r
+    nwk_getNumObjectFromMsg(MRFI_P_PAYLOAD(frame)+F_APP_PAYLOAD_OS+L_LINK_TOKEN_OS, &lt, sizeof(lt));\r
+    if (lt != sLinkToken)\r
+    {\r
+      return SENT_NO_REPLY;\r
+    }\r
+  }\r
+\r
+  /* if we get here the token matched. */\r
+\r
+  /* is this a duplicate request? */\r
+  remotePort = *(MRFI_P_PAYLOAD(frame)+F_APP_PAYLOAD_OS+L_RMT_PORT_OS);\r
+  if (pCInfo=nwk_isLinkDuplicate(MRFI_P_SRC_ADDR(frame), remotePort))\r
+  {\r
+    /* resend reply */\r
+    msg[LB_REQ_OS] = LINK_REQ_LINK | NWK_APP_REPLY_BIT;\r
+\r
+    /* sender's TID */\r
+    msg[LB_TID_OS] = *(MRFI_P_PAYLOAD(frame)+F_APP_PAYLOAD_OS+LB_TID_OS);\r
+\r
+    /* Send reply with the local port number so the remote device knows where to\r
+     * send packets.\r
+     */\r
+    msg[LR_RMT_PORT_OS] = pCInfo->portRx;\r
+\r
+    /* put my Rx type in there. used to know how to set hops when sending back. */\r
+    msg[LR_MY_RXTYPE_OS] = nwk_getMyRxType();\r
+#if defined(SMPL_SECURE)\r
+    /* Set the Tx counter value for peer's Rx counter object */\r
+    nwk_putNumObjectIntoMsg((void *)&pCInfo->connTxCTR, (void *)&msg[LR_CTR_OS], 4);\r
+    /* We also need to save the newly generated Rx counter value. */\r
+    nwk_getNumObjectFromMsg((void *)(MRFI_P_PAYLOAD(frame)+F_APP_PAYLOAD_OS+L_CTR_OS), (void *)&pCInfo->connRxCTR, 4);\r
+#endif\r
+    if (pOutFrame = nwk_buildFrame(SMPL_PORT_LINK, msg, sizeof(msg), MAX_HOPS-(GET_FROM_FRAME(MRFI_P_PAYLOAD(frame),F_HOP_COUNT))))\r
+    {\r
+      /* destination address is the source adddress of the received frame. */\r
+      memcpy(MRFI_P_DST_ADDR(&pOutFrame->mrfiPkt), MRFI_P_SRC_ADDR(frame), NET_ADDR_SIZE);\r
+#if defined(SMPL_SECURE)\r
+      nwk_setSecureFrame(&pOutFrame->mrfiPkt, sizeof(msg), 0);\r
+#endif  /* SMPL_SECURE */\r
+      nwk_sendFrame(pOutFrame, MRFI_TX_TYPE_FORCED);\r
+    }\r
+    return SENT_REPLY;\r
+  }\r
+\r
+  if (!sListenActive)\r
+  {\r
+    /* We've checked for duplicate and resent reply. In that case we weren't listening\r
+     * so just go back`.\r
+     */\r
+    return SENT_NO_REPLY;\r
+  }\r
+\r
+  /* room to link? */\r
+#if defined(AP_IS_DATA_HUB)\r
+  pCInfo = nwk_findAlreadyJoined(frame);\r
+\r
+  if (!pCInfo)\r
+#endif\r
+  {\r
+    pCInfo = nwk_getNextConnection();\r
+  }\r
+\r
+  if (pCInfo)\r
+  {\r
+    /* yes there's room and it's not a dup. address. */\r
+    memcpy(&pCInfo->peerAddr, MRFI_P_SRC_ADDR(frame), NET_ADDR_SIZE);\r
+\r
+    if (!nwk_allocateLocalRxPort(LINK_REPLY, pCInfo))\r
+    {\r
+      nwk_freeConnection(pCInfo);\r
+      /* we're done with the packet */\r
+      return SENT_REPLY;\r
+    }\r
+\r
+    /* The local Rx port is the one returned in the connection structure. The\r
+     * caller is waiting on this to be set. The code here is running in an ISR\r
+     * thread so the caller will see this change after RETI.\r
+     */\r
+    if (NUM_CONNECTIONS == sNumLinkers)\r
+    {\r
+      /* Something is wrong -- no room to stack Link request */\r
+      nwk_freeConnection(pCInfo);\r
+      /* we're done with the packet */\r
+      return SENT_REPLY;\r
+    }\r
+    sServiceLinkID[sNumLinkers++] = pCInfo->thisLinkID;\r
+\r
+    /* save the remote Tx port */\r
+    pCInfo->portTx = remotePort;\r
+\r
+    /* connection is valid... */\r
+    pCInfo->connState = CONNSTATE_CONNECTED;\r
+\r
+    /* Set hop count. If it's a polling device set the count to the\r
+     * distance to the AP. otherwise, set it to the max less the remaining\r
+     * which will be the path taken for this frame. It will be no worse\r
+     * then tha max and probably will be better.\r
+     */\r
+    if (F_RX_TYPE_POLLS == *(MRFI_P_PAYLOAD(frame)+F_APP_PAYLOAD_OS+L_MY_RXTYPE_OS))\r
+    {\r
+      /* It polls. so. we'll be sending to the AP which will store the\r
+       * frame. The AP is only MAX_HOPS_FROM_AP hops away from us.\r
+       */\r
+      pCInfo->hops2target = MAX_HOPS_FROM_AP;\r
+    }\r
+    else\r
+    {\r
+      /* Can't really use this trick because the device could move. If the\r
+       * devices are all static this may work unless the initial reception\r
+       * was marginal.\r
+       */\r
+#if defined(DEVICE_DOES_NOT_MOVE)\r
+      pCInfo->hops2target = MAX_HOPS - GET_FROM_FRAME(MRFI_P_PAYLOAD(frame), F_HOP_COUNT);\r
+#else\r
+      pCInfo->hops2target = MAX_HOPS;\r
+#endif\r
+    }\r
+    /* Send reply with the local port number so the remote device knows where to\r
+     * send packets.\r
+     */\r
+    msg[LR_RMT_PORT_OS]  = pCInfo->portRx;\r
+\r
+    /* put my Rx type in there. used to know how to set hops when sending back. */\r
+    msg[LR_MY_RXTYPE_OS] = nwk_getMyRxType();\r
+\r
+    msg[LB_REQ_OS] = LINK_REQ_LINK | NWK_APP_REPLY_BIT;\r
+\r
+    /* sender's TID */\r
+    msg[LB_TID_OS] = *(MRFI_P_PAYLOAD(frame)+F_APP_PAYLOAD_OS+LB_TID_OS);\r
+#if defined(SMPL_SECURE)\r
+    nwk_getNumObjectFromMsg((void *)(MRFI_P_PAYLOAD(frame)+F_APP_PAYLOAD_OS+L_CTR_OS), (void *)&pCInfo->connRxCTR, 4);\r
+    pCInfo->connTxCTR = MRFI_RandomByte()                   | \\r
+                        ((uint32_t)(MRFI_RandomByte())<<8)  | \\r
+                        ((uint32_t)(MRFI_RandomByte())<<16) | \\r
+                        ((uint32_t)(MRFI_RandomByte())<<24);\r
+\r
+    nwk_putNumObjectIntoMsg((void *)&pCInfo->connTxCTR, (void *)&msg[LR_CTR_OS], 4);\r
+#endif\r
+    if (pOutFrame = nwk_buildFrame(SMPL_PORT_LINK, msg, sizeof(msg), MAX_HOPS-(GET_FROM_FRAME(MRFI_P_PAYLOAD(frame),F_HOP_COUNT))))\r
+    {\r
+      /* destination address is the source adddress of the received frame. */\r
+      memcpy(MRFI_P_DST_ADDR(&pOutFrame->mrfiPkt), MRFI_P_SRC_ADDR(frame), NET_ADDR_SIZE);\r
+#if defined(SMPL_SECURE)\r
+      nwk_setSecureFrame(&pOutFrame->mrfiPkt, sizeof(msg), 0);\r
+#endif\r
+      if (SMPL_SUCCESS != nwk_sendFrame(pOutFrame, MRFI_TX_TYPE_FORCED))\r
+      {\r
+        /* better release the connection structure */\r
+        nwk_freeConnection(pCInfo);\r
+      }\r
+    }\r
+    else\r
+    {\r
+      /* better release the connection structure */\r
+      nwk_freeConnection(pCInfo);\r
+    }\r
+  }\r
+  /* we're done with the packet */\r
+  return SENT_REPLY;\r
+#else\r
+  return SENT_NO_REPLY;\r
+#endif  /* NUM_CONNECTIONS */\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_processLink\r
+ *\r
+ * @brief       Process Link frame. Just save the frame for the Link app if it\r
+ *              a reply. If it isn't a reply, send the reply in this thread.\r
+ *\r
+ * input parameters\r
+ * @param   frame   - pointer to frame to be processed\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   Keep frame for application, release frame, or replay frame..\r
+ */\r
+fhStatus_t nwk_processLink(mrfiPacket_t *frame)\r
+{\r
+  fhStatus_t   rc;\r
+  uint8_t      replyType;\r
+\r
+  /* If we sent this then this is the reply. Validate the\r
+   * packet for reception by client app. If we didn't send\r
+   * it then we are the target. send the reply.\r
+   */\r
+  if (SMPL_MY_REPLY == (replyType=nwk_isValidReply(frame, sTid, LB_REQ_OS, LB_TID_OS)))\r
+  {\r
+    /* It's a match and it's a reply. Validate the received packet by\r
+     * returning a 1 so it can be received by the client app.\r
+     */\r
+    MRFI_PostKillSem();\r
+    rc = FHS_KEEP;\r
+  }\r
+#if !defined( END_DEVICE )\r
+  else if (SMPL_A_REPLY == replyType)\r
+  {\r
+    /* no match. if i'm not an ED this is a reply that should be passed on. */\r
+    rc = FHS_REPLAY;\r
+  }\r
+#endif  /* !END_DEVICE */\r
+  else\r
+  {\r
+    /* No, we didn't send it. Process request assuming it's\r
+     * intended for us.\r
+     */\r
+    rc = handleLinkRequest(frame);\r
+  }\r
+\r
+  (void) replyType;  /* keep compiler happy when ED built... */\r
+\r
+  return rc;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_getLocalLinkID\r
+ *\r
+ * @brief       This routine checks to see if a service port has been assigned\r
+ *              as a result of a link reply frame being received. It is the means\r
+ *              by which the user thread knows that the waiting is over for the\r
+ *              link listen. the value is set in an interrupt thread.\r
+ *\r
+ * input parameters\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   Local port assigned when the link reply was received.\r
+ */\r
+linkID_t nwk_getLocalLinkID(void)\r
+{\r
+  linkID_t    lid = 0;\r
+#if NUM_CONNECTIONS > 0\r
+  uint8_t     i;\r
+  bspIState_t intState;\r
+\r
+\r
+  BSP_ENTER_CRITICAL_SECTION(intState);\r
+  if (sNumLinkers)\r
+  {\r
+    sNumLinkers--;\r
+    BSP_EXIT_CRITICAL_SECTION(intState);\r
+\r
+    nwk_setListenContext(LINK_LISTEN_OFF);\r
+    lid = sServiceLinkID[0];\r
+    /* If more than one Link frame has been processed without an intervening\r
+     * Listen assume that there will be another Link Listen call that will\r
+     * poll for completion which has already occurred. Age any existing entries.\r
+     * This code was added to deal with the possibility of mulitple EDs being\r
+     * activated simultaneously in the AP-as-data-hub example. This opens a\r
+     * window of opportunity for a "typical" scenario to get hosed. But for\r
+     * a "typical" scenario to get hosed a number of improbable events have to\r
+     * occur. These are deemed far less likely than the multiple-ED-activation\r
+     * scenario in the AP-as-dat-hub case.\r
+     */\r
+    for (i=0; i<sNumLinkers; ++i)\r
+    {\r
+      sServiceLinkID[i] = sServiceLinkID[i+1];\r
+    }\r
+  }\r
+  else\r
+  {\r
+    BSP_EXIT_CRITICAL_SECTION(intState);\r
+  }\r
+#endif  /* NUM_CONNECTIONS */\r
+\r
+  return lid;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_setListenContext\r
+ *\r
+ * @brief       Sets the context when a LinkListen is executed. This prevents\r
+ *              processing other link frames from being confused with the real\r
+ *              one. Without this semaphore other broadcast link messages\r
+ *              could wait int the input queue and accidently be processed if\r
+ *              a listen is done later.\r
+ *\r
+ * input parameters\r
+ *\r
+ * @param   context - listen on or off\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   void\r
+ */\r
+void nwk_setListenContext(uint8_t context)\r
+{\r
+  sListenActive = (context == LINK_LISTEN_ON) ? 1 : 0;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          handleLinkRequest\r
+ *\r
+ * @brief       Dispatches handler for specfic link request\r
+ *\r
+ * input parameters\r
+ *\r
+ * @param   frame - Link frame received\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   void\r
+ */\r
+static fhStatus_t handleLinkRequest(mrfiPacket_t *frame)\r
+{\r
+  fhStatus_t rc = FHS_RELEASE;\r
+  uint8_t    isReplySent;\r
+\r
+  if (LINK_LEGACY_MSG_LENGTH == (MRFI_GET_PAYLOAD_LEN(frame) - F_APP_PAYLOAD_OS))\r
+  {\r
+    /* Legacy frame. Spoof a link request */\r
+    *(MRFI_P_PAYLOAD(frame)+F_APP_PAYLOAD_OS) = LINK_REQ_LINK;\r
+  }\r
+\r
+  switch (*(MRFI_P_PAYLOAD(frame)+F_APP_PAYLOAD_OS))\r
+  {\r
+    case LINK_REQ_LINK:\r
+      isReplySent = smpl_send_link_reply(frame);\r
+#if !defined(END_DEVICE)\r
+      /* If I am an AP or RE and not listening I need to replay frame.\r
+       * The exception is if I am an AP or RE hosting an End Device\r
+       * object and I just sent a reply frame to a duplicate link frame\r
+       * for which I was not listening. In this case don't replay.\r
+       */\r
+      if (!sListenActive && (SENT_REPLY != isReplySent))\r
+      {\r
+        rc = FHS_REPLAY;\r
+      }\r
+#endif   /* !END_DEVICE */\r
+      break;\r
+\r
+#if defined(EXTENDED_API)\r
+    case LINK_REQ_UNLINK:\r
+      smpl_send_unlink_reply(frame);\r
+      break;\r
+#endif\r
+\r
+    default:\r
+      break;\r
+  }\r
+\r
+  /* keep compiler happy if I'm compiled as an End Device */\r
+  (void) isReplySent;\r
+\r
+  return rc;\r
+}\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/Components/nwk_applications/nwk_link.h b/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/Components/nwk_applications/nwk_link.h
new file mode 100755 (executable)
index 0000000..6abc1e2
--- /dev/null
@@ -0,0 +1,106 @@
+/**************************************************************************************************\r
+  Filename:       nwk_link.h\r
+  Revised:        $Date: 2008-12-10 16:52:14 -0800 (Wed, 10 Dec 2008) $\r
+  Revision:       $Revision: 18596 $\r
+  Author:         $Author: lfriedman $\r
+\r
+  Description:    This header file supports the SimpliciTI Join network application.\r
+\r
+  Copyright 2004-2007 Texas Instruments Incorporated. All rights reserved.\r
+\r
+  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+  the terms of a software license agreement between the user who downloaded the software,\r
+  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+  License. The License limits your use, and you acknowledge, that the Software may not be\r
+  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+  perform, display or sell this Software and/or its documentation for any purpose.\r
+\r
+  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+\r
+  Should you have any questions regarding your right to use this Software,\r
+  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+#ifndef NWK_LINK_H\r
+#define NWK_LINK_H\r
+\r
+/* Macros needed for protocol backward compatibility */\r
+#define LINK_LEGACY_MSG_LENGTH       8\r
+#define LINK_REPLY_LEGACY_MSG_LENGTH 3\r
+\r
+\r
+#define LINK_LISTEN_ON   0\r
+#define LINK_LISTEN_OFF  1\r
+\r
+/* application payload offsets */\r
+/*    both */\r
+#define LB_REQ_OS         0\r
+#define LB_TID_OS         1\r
+\r
+/*    link frame */\r
+#define L_LINK_TOKEN_OS        2\r
+#define L_RMT_PORT_OS          6\r
+#define L_MY_RXTYPE_OS         7\r
+#define L_PROTOCOL_VERSION_OS  8\r
+#define L_CTR_OS               9\r
+/*    link reply frame */\r
+#define LR_RMT_PORT_OS         2\r
+#define LR_MY_RXTYPE_OS        3\r
+#define LR_CTR_OS              4\r
+\r
+/*    unlink frame */\r
+#define UL_RMT_PORT_OS        2\r
+/*    unlink reply frame */\r
+#define ULR_RESULT_OS         2\r
+\r
+/* change the following as protocol developed */\r
+#ifndef SMPL_SECURE\r
+#define MAX_LINK_APP_FRAME      9\r
+#else\r
+#define MAX_LINK_APP_FRAME      13\r
+#endif\r
+\r
+/* frame sizes */\r
+#ifndef SMPL_SECURE\r
+#define LINK_FRAME_SIZE         9\r
+#define LINK_REPLY_FRAME_SIZE   4\r
+#else\r
+#define LINK_FRAME_SIZE         13\r
+#define LINK_REPLY_FRAME_SIZE   8\r
+#endif\r
+#define UNLINK_FRAME_SIZE       3\r
+#define UNLINK_REPLY_FRAME_SIZE 3\r
+\r
+/* link requests\r
+ * NOTE: If aditional command codes are required do _not_ use the\r
+ *       value LINK_REPLY_LEGACY_MSG_LENGTH. This numeral is used\r
+ *       to guarantee that legacy Link frames (from before release\r
+ *       1.0.6) work correctly. Don't ask.\r
+ */\r
+\r
+#define LINK_REQ_LINK       1\r
+#define LINK_REQ_UNLINK     2\r
+\r
+/* prototypes */\r
+fhStatus_t   nwk_processLink(mrfiPacket_t *);\r
+linkID_t     nwk_getLocalLinkID(void);\r
+void         nwk_linkInit(void);\r
+smplStatus_t nwk_link(linkID_t *);\r
+smplStatus_t nwk_unlink(linkID_t);\r
+void         nwk_setLinkToken(uint32_t);\r
+void         nwk_getLinkToken(uint32_t *);\r
+void         nwk_setListenContext(uint8_t);\r
+\r
+#endif\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/Components/nwk_applications/nwk_mgmt.c b/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/Components/nwk_applications/nwk_mgmt.c
new file mode 100755 (executable)
index 0000000..ec2eb0e
--- /dev/null
@@ -0,0 +1,349 @@
+/**************************************************************************************************\r
+  Filename:       nwk_mgmt.c\r
+  Revised:        $Date: 2009-01-06 15:45:54 -0800 (Tue, 06 Jan 2009) $\r
+  Revision:       $Revision: 18697 $\r
+  Author:         $Author: lfriedman $\r
+\r
+  Description:    This file supports the SimpliciTI Mgmt network application.\r
+\r
+  Copyright 2007-2009 Texas Instruments Incorporated. All rights reserved.\r
+\r
+  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+  the terms of a software license agreement between the user who downloaded the software,\r
+  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+  License. The License limits your use, and you acknowledge, that the Software may not be\r
+  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+  perform, display or sell this Software and/or its documentation for any purpose.\r
+\r
+  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+\r
+  Should you have any questions regarding your right to use this Software,\r
+  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+\r
+/******************************************************************************\r
+ * INCLUDES\r
+ */\r
+#include <string.h>\r
+#include "bsp.h"\r
+#include "mrfi.h"\r
+#include "nwk_types.h"\r
+#include "nwk_api.h"\r
+#include "nwk_frame.h"\r
+#include "nwk.h"\r
+#include "nwk_mgmt.h"\r
+#include "nwk_join.h"\r
+#include "nwk_globals.h"\r
+#include "nwk_QMgmt.h"\r
+\r
+/******************************************************************************\r
+ * MACROS\r
+ */\r
+\r
+/******************************************************************************\r
+ * CONSTANTS AND DEFINES\r
+ */\r
+\r
+/******************************************************************************\r
+ * TYPEDEFS\r
+ */\r
+\r
+/******************************************************************************\r
+ * LOCAL VARIABLES\r
+ */\r
+#ifndef ACCESS_POINT\r
+static addr_t const *sAPAddr = NULL;\r
+#else\r
+static uint8_t sSFMarker[NUM_STORE_AND_FWD_CLIENTS] = {0};\r
+#endif\r
+\r
+static volatile uint8_t sTid = 0;\r
+\r
+/******************************************************************************\r
+ * LOCAL FUNCTIONS\r
+ */\r
+static void  smpl_send_mgmt_reply(mrfiPacket_t *);\r
+#ifdef ACCESS_POINT\r
+static void  send_poll_reply(mrfiPacket_t *);\r
+#endif\r
+\r
+/******************************************************************************\r
+ * GLOBAL VARIABLES\r
+ */\r
+\r
+/******************************************************************************\r
+ * GLOBAL FUNCTIONS\r
+ */\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_mgmtInit\r
+ *\r
+ * @brief       Initialize Management functions.\r
+ *\r
+ * input parameters\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   void\r
+ */\r
+\r
+void nwk_mgmtInit(void)\r
+{\r
+  sTid = MRFI_RandomByte();\r
+\r
+#ifdef ACCESS_POINT\r
+  memset(&sSFMarker, 0x0, sizeof(sSFMarker));\r
+#endif\r
+\r
+  return;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_processMgmt\r
+ *\r
+ * @brief       Process Management frame. Just save the frame for the Management\r
+ *              app it it is a reply. If it isn't a reply, send the reply in this\r
+ *              thread.\r
+ *\r
+ * input parameters\r
+ * @param   frame   - pointer to frame to be processed\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   Keep frame for application, release frame, or replay frame.\r
+ */\r
+fhStatus_t nwk_processMgmt(mrfiPacket_t *frame)\r
+{\r
+  fhStatus_t   rc;\r
+  uint8_t      replyType;\r
+\r
+  /* If we sent this then this is the reply. Validate the\r
+   * packet for reception by client app. If we didn't send\r
+   * it then we are the target. send the reply.\r
+   */\r
+  if (SMPL_MY_REPLY == (replyType=nwk_isValidReply(frame, sTid, MB_APP_INFO_OS, MB_TID_OS)))\r
+  {\r
+    /* It's a match and it's a reply. Validate the received packet by\r
+     * returning a 1 so it can be received by the client app.\r
+     */\r
+    MRFI_PostKillSem();\r
+    rc = FHS_KEEP;\r
+  }\r
+#if !defined( END_DEVICE )\r
+  else if (SMPL_A_REPLY == replyType)\r
+  {\r
+    /* no match. if i'm not an ED this is a reply that should be passed on. */\r
+    rc = FHS_REPLAY;\r
+  }\r
+#endif  /* !END_DEVICE */\r
+  else\r
+  {\r
+    /* no, we didn't send it. send reply if it's intended for us */\r
+    if (!memcmp(MRFI_P_DST_ADDR(frame), nwk_getMyAddress(), NET_ADDR_SIZE))\r
+    {\r
+      smpl_send_mgmt_reply(frame);\r
+\r
+      /* we're done with the frame. */\r
+      rc = FHS_RELEASE;\r
+    }\r
+    else\r
+    {\r
+      rc = FHS_REPLAY;\r
+    }\r
+  }\r
+\r
+  (void) replyType;  /* keep compiler happy */\r
+\r
+  return rc;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          smpl_send_mgmt_reply\r
+ *\r
+ * @brief       Send appropriate reply to Management frame.\r
+ *\r
+ * input parameters\r
+ * @param  frame  - Pointer to frame for which reply required.\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   void\r
+ */\r
+static void smpl_send_mgmt_reply(mrfiPacket_t *frame)\r
+{\r
+#ifdef ACCESS_POINT\r
+  /* what kind of management frame is this? */\r
+  switch (*(MRFI_P_PAYLOAD(frame)+F_APP_PAYLOAD_OS+MB_APP_INFO_OS))\r
+  {\r
+    case MGMT_REQ_POLL:\r
+      send_poll_reply(frame);\r
+      break;\r
+\r
+    default:\r
+      break;\r
+  }\r
+#endif  /* ACCESS_POINT */\r
+  return;\r
+}\r
+\r
+\r
+#ifdef ACCESS_POINT\r
+/******************************************************************************\r
+ * @fn          send_poll_reply\r
+ *\r
+ * @brief       Send reply to polling frame.\r
+ *\r
+ * input parameters\r
+ * @param  frame  - Pointer to frame for which reply required.\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   void\r
+ */\r
+static void send_poll_reply(mrfiPacket_t *frame)\r
+{\r
+  uint8_t         msgtid = *(MRFI_P_PAYLOAD(frame)+F_APP_PAYLOAD_OS+MB_TID_OS);\r
+  frameInfo_t    *pOutFrame;\r
+  sfClientInfo_t *pClientInfo;\r
+  uint8_t         loc;\r
+\r
+  /* Make sure this guy is really a client. We can tell from the source address. */\r
+  if (!(pClientInfo=nwk_isSandFClient(MRFI_P_SRC_ADDR(frame), &loc)))\r
+  {\r
+    /* TODO: maybe send an error frame? */\r
+    return;\r
+  }\r
+\r
+  /* If we have to resync the TID then do it based on the first\r
+   * poll frame we see\r
+  */\r
+  if (!sSFMarker[loc])\r
+  {\r
+    /* If the marker flag is null then it has been initialized, i.e.,\r
+     * there has been a reset. In this case infer that we need to update\r
+     * a (probably) stale last TID. The test will always be true the first\r
+     * time through after a client is established even when an NV restore\r
+     * did not take place but this does no harm.\r
+     */\r
+    pClientInfo->lastTID = msgtid;\r
+    sSFMarker[loc]       = 1;\r
+  }\r
+  /* If we've seen this poll frame before ignore it. Otherwise we\r
+   * may send a stored frame when we shouldn't.\r
+   */\r
+  else if (nwk_checkAppMsgTID(pClientInfo->lastTID, msgtid))\r
+  {\r
+    pClientInfo->lastTID = msgtid;\r
+  }\r
+  else\r
+  {\r
+    return;\r
+  }\r
+\r
+  if (pOutFrame = nwk_getSandFFrame(frame, M_POLL_PORT_OS))\r
+  {\r
+    /* We need to adjust the order in the queue in this case. Currently\r
+     * we know it is in the input queue and that this adjustment is safe\r
+     * because we're in an ISR thread. This is a fragile fix, though, and\r
+     * should be revisited when time permits.\r
+     */\r
+    nwk_QadjustOrder(INQ, pOutFrame->orderStamp);\r
+\r
+    /* reset hop count... */\r
+    PUT_INTO_FRAME(MRFI_P_PAYLOAD(&pOutFrame->mrfiPkt), F_HOP_COUNT, MAX_HOPS_FROM_AP);\r
+    /* It's gonna be a forwarded frame. */\r
+    PUT_INTO_FRAME(MRFI_P_PAYLOAD(&pOutFrame->mrfiPkt), F_FWD_FRAME, 0x80);\r
+\r
+    nwk_sendFrame(pOutFrame, MRFI_TX_TYPE_FORCED);\r
+  }\r
+  else\r
+  {\r
+    nwk_SendEmptyPollRspFrame(frame);\r
+  }\r
+\r
+  return;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_resetSFMarker\r
+ *\r
+ * @brief       Reset S&F cklient marker so the TIDs resync.\r
+ *\r
+ * input parameters\r
+ * @param  idx  - index of the client that should be reset.\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   void\r
+ */\r
+void nwk_resetSFMarker(uint8_t idx)\r
+{\r
+  sSFMarker[idx] = 0;\r
+\r
+  return;\r
+}\r
+\r
+#else  /* ACCESS_POINT */\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_poll\r
+ *\r
+ * @brief       Poll S&F server for any waiting frames.\r
+ *\r
+ * input parameters\r
+ * @param  port  - Port on peer.\r
+ * @param  addr  - SimpliciTI address of peer.\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   SMPL_SUCCESS\r
+ *           SMPL_NO_AP_ADDRESS - We don't know Access Point's address\r
+ *           SMPL_NOMEM         - no room in output frame queue\r
+ *           SMPL_TX_CCA_FAIL   - CCA failure\r
+ */\r
+smplStatus_t nwk_poll(uint8_t port, uint8_t *addr)\r
+{\r
+  uint8_t        msg[MGMT_POLL_FRAME_SIZE];\r
+  ioctlRawSend_t send;\r
+\r
+  msg[MB_APP_INFO_OS] = MGMT_REQ_POLL;\r
+  msg[MB_TID_OS]      = sTid;\r
+  msg[M_POLL_PORT_OS] = port;\r
+  memcpy(msg+M_POLL_ADDR_OS, addr, NET_ADDR_SIZE);\r
+\r
+  /* it's OK to increment the TID here because the reply will not be\r
+   * matched based on this number. The reply to the poll comes back\r
+   * to the client port, not the Management port.\r
+   */\r
+  sTid++;\r
+\r
+  if (!sAPAddr)\r
+  {\r
+    sAPAddr = nwk_getAPAddress();\r
+    if (!sAPAddr)\r
+    {\r
+      return SMPL_NO_AP_ADDRESS;\r
+    }\r
+  }\r
+  send.addr = (addr_t *)sAPAddr;\r
+  send.msg  = msg;\r
+  send.len  = sizeof(msg);\r
+  send.port = SMPL_PORT_MGMT;\r
+\r
+  return SMPL_Ioctl(IOCTL_OBJ_RAW_IO, IOCTL_ACT_WRITE, &send);\r
+}\r
+\r
+#endif /* ACCESS_POINT */\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/Components/nwk_applications/nwk_mgmt.h b/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/Components/nwk_applications/nwk_mgmt.h
new file mode 100755 (executable)
index 0000000..d913abb
--- /dev/null
@@ -0,0 +1,67 @@
+/**************************************************************************************************\r
+  Filename:       nwk_mgmt.h\r
+  Revised:        $Date: 2009-01-06 15:45:54 -0800 (Tue, 06 Jan 2009) $\r
+  Revision:       $Revision: 18697 $\r
+  Author:         $Author: lfriedman $\r
+\r
+  Description:    This header file supports the SimpliciTI Mgmt network application.\r
+\r
+  Copyright 2004-2007 Texas Instruments Incorporated. All rights reserved.\r
+\r
+  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+  the terms of a software license agreement between the user who downloaded the software,\r
+  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+  License. The License limits your use, and you acknowledge, that the Software may not be\r
+  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+  perform, display or sell this Software and/or its documentation for any purpose.\r
+\r
+  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+\r
+  Should you have any questions regarding your right to use this Software,\r
+  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+\r
+#ifndef NWK_MGMT_H\r
+#define NWK_MGMT_H\r
+\r
+/* MGMT frame application requests */\r
+#define  MGMT_REQ_POLL        0x01\r
+\r
+/* change the following as protocol developed */\r
+#define MAX_MGMT_APP_FRAME    7\r
+\r
+/* application payload offsets */\r
+/*    both */\r
+#define MB_APP_INFO_OS           0\r
+#define MB_TID_OS                1\r
+\r
+/*    Poll frame */\r
+#define M_POLL_PORT_OS          2\r
+#define M_POLL_ADDR_OS          3\r
+\r
+/* change the following as protocol developed */\r
+#define MAX_MGMT_APP_FRAME    7\r
+\r
+/* frame sizes */\r
+#define MGMT_POLL_FRAME_SIZE  7\r
+\r
+/* prototypes */\r
+void         nwk_mgmtInit(void);\r
+fhStatus_t   nwk_processMgmt(mrfiPacket_t *);\r
+smplStatus_t nwk_poll(uint8_t, uint8_t *);\r
+void         nwk_resetSFMarker(uint8_t);\r
+\r
+#endif\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/Components/nwk_applications/nwk_ping.c b/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/Components/nwk_applications/nwk_ping.c
new file mode 100755 (executable)
index 0000000..2e55a48
--- /dev/null
@@ -0,0 +1,314 @@
+/**************************************************************************************************\r
+  Filename:       nwk_ping.c\r
+  Revised:        $Date: 2009-01-18 16:01:08 -0800 (Sun, 18 Jan 2009) $\r
+  Revision:       $Revision: 18796 $\r
+  Author:         $Author: lfriedman $\r
+\r
+  Description:    This file supports the SimpliciTI Ping network application.\r
+\r
+  Copyright 2007-2009 Texas Instruments Incorporated. All rights reserved.\r
+\r
+  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+  the terms of a software license agreement between the user who downloaded the software,\r
+  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+  License. The License limits your use, and you acknowledge, that the Software may not be\r
+  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+  perform, display or sell this Software and/or its documentation for any purpose.\r
+\r
+  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+\r
+  Should you have any questions regarding your right to use this Software,\r
+  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+\r
+/******************************************************************************\r
+ * INCLUDES\r
+ */\r
+#include <string.h>\r
+#include "bsp.h"\r
+#include "mrfi.h"\r
+#include "nwk_types.h"\r
+#include "nwk_frame.h"\r
+#include "nwk.h"\r
+#include "nwk_ping.h"\r
+#include "nwk_globals.h"\r
+#include "nwk_api.h"\r
+#include "nwk_freq.h"\r
+#include "nwk_security.h"\r
+\r
+/******************************************************************************\r
+ * MACROS\r
+ */\r
+\r
+/******************************************************************************\r
+ * CONSTANTS AND DEFINES\r
+ */\r
+\r
+/******************************************************************************\r
+ * TYPEDEFS\r
+ */\r
+\r
+/******************************************************************************\r
+ * LOCAL VARIABLES\r
+ */\r
+\r
+static volatile uint8_t sTid = 0;\r
+\r
+/******************************************************************************\r
+ * LOCAL FUNCTIONS\r
+ */\r
+static void smpl_send_ping_reply(mrfiPacket_t *);\r
+static void handlePingRequest(mrfiPacket_t *);\r
+\r
+/******************************************************************************\r
+ * GLOBAL VARIABLES\r
+ */\r
+\r
+/******************************************************************************\r
+ * GLOBAL FUNCTIONS\r
+ */\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_pingInit\r
+ *\r
+ * @brief       Initialize Ping application.\r
+ *\r
+ * input parameters\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   void\r
+ */\r
+void nwk_pingInit(void)\r
+{\r
+  sTid = MRFI_RandomByte();\r
+\r
+  return;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_ping\r
+ *\r
+ * @brief       Called from the application level to ping a peer. A small\r
+ *              payload is sent that includes a tid to detect correct reply.\r
+ *              Caller does not supply payload.\r
+ *\r
+ * input parameters\r
+ * @param   lid     - Link ID representing peer to ping\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   SMPL_SUCCESS   valid reply received\r
+ *           SMPL_TIMEOUT   no valid reply received\r
+ *           SMPL_NO_CHANNEL  no channels returned on a scan\r
+ */\r
+smplStatus_t nwk_ping(linkID_t lid)\r
+{\r
+  connInfo_t  *pCInfo   = nwk_getConnInfo(lid);\r
+  smplStatus_t rc       = SMPL_BAD_PARAM;\r
+  uint8_t      done     = 0;\r
+  uint8_t      repeatIt = 2;\r
+  uint8_t      msg[MAX_PING_APP_FRAME];\r
+  uint8_t      radioState = MRFI_GetRadioState();\r
+  union\r
+  {\r
+    ioctlRawSend_t    send;\r
+    ioctlRawReceive_t recv;\r
+  } ioctl_info;\r
+\r
+  if (!pCInfo || (SMPL_LINKID_USER_UUD == lid))\r
+  {\r
+    /* either link ID bogus or tried to ping the unconnected user datagram link ID. */\r
+    return rc;\r
+  }\r
+\r
+  do\r
+  {\r
+#if defined(FREQUENCY_AGILITY) && !defined(ACCESS_POINT)\r
+    uint8_t     i, numChan;\r
+    freqEntry_t channels[NWK_FREQ_TBL_SIZE];\r
+\r
+    if (repeatIt == 2)\r
+    {\r
+      /* If FA enabled, first time through set up so that the 'for'\r
+       * loop checks the current channel. This saves time (no scan)\r
+       * and is very likely to succeed. Populate the proper strucure.\r
+       */\r
+      SMPL_Ioctl(IOCTL_OBJ_FREQ, IOCTL_ACT_GET, channels);\r
+      numChan = 1;\r
+    }\r
+    else\r
+    {\r
+      /* If we get here we must scan for the channel we're now on */\r
+      if (!(numChan=nwk_scanForChannels(channels)))\r
+      {\r
+        return SMPL_NO_CHANNEL;\r
+      }\r
+    }\r
+    /* Either we scan next time through or we're done */\r
+    repeatIt--;\r
+\r
+    /* this loop Pings on each channel (probably only 1) looking\r
+     * for peer.\r
+     */\r
+    for (i=0; i<numChan && !done; ++i)\r
+    {\r
+      nwk_setChannel(&channels[i]);\r
+#else\r
+    {\r
+      repeatIt = 0;\r
+#endif  /* defined(FREQUENCY_AGILITY) && !defined(ACCESS_POINT) */\r
+\r
+      ioctl_info.send.addr = (addr_t *)pCInfo->peerAddr;\r
+      ioctl_info.send.msg  = msg;\r
+      ioctl_info.send.len  = sizeof(msg);\r
+      ioctl_info.send.port = SMPL_PORT_PING;\r
+\r
+      /* fill in msg */\r
+      msg[PB_REQ_OS] = PING_REQ_PING;\r
+      msg[PB_TID_OS] = sTid;\r
+\r
+      SMPL_Ioctl(IOCTL_OBJ_RAW_IO, IOCTL_ACT_WRITE, &ioctl_info.send);\r
+\r
+      ioctl_info.recv.port = SMPL_PORT_PING;\r
+      ioctl_info.recv.msg  = msg;\r
+      ioctl_info.recv.addr = 0;\r
+\r
+      NWK_CHECK_FOR_SETRX(radioState);\r
+      NWK_REPLY_DELAY();\r
+      NWK_CHECK_FOR_RESTORE_STATE(radioState);\r
+\r
+      if (SMPL_SUCCESS == SMPL_Ioctl(IOCTL_OBJ_RAW_IO, IOCTL_ACT_READ, &ioctl_info.recv))\r
+      {\r
+        repeatIt = 0;\r
+        done     = 1;\r
+        sTid++;   /* guard against duplicates */\r
+      }\r
+    }\r
+  } while (repeatIt);\r
+\r
+  return done ? SMPL_SUCCESS : SMPL_TIMEOUT;\r
+\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          smpl_send_ping_reply\r
+ *\r
+ * @brief       Send a reply to a ping request.\r
+ *\r
+ * input parameters\r
+ * @param   frame     - pointer to frame containing request\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   void\r
+ */\r
+static void smpl_send_ping_reply(mrfiPacket_t *frame)\r
+{\r
+  frameInfo_t *pOutFrame;\r
+\r
+  /* Build the reply frame. The application payload is the one included in the\r
+   * received frame payload.\r
+   */\r
+  if (pOutFrame = nwk_buildFrame(SMPL_PORT_PING, MRFI_P_PAYLOAD(frame)+F_APP_PAYLOAD_OS, MRFI_GET_PAYLOAD_LEN(frame)-F_APP_PAYLOAD_OS, MAX_HOPS))\r
+  {\r
+    /* destination address is the source adddress of the received frame. */\r
+    memcpy(MRFI_P_DST_ADDR(&pOutFrame->mrfiPkt), MRFI_P_SRC_ADDR(frame), NET_ADDR_SIZE);\r
+\r
+    /* turn on the reply bit in the application payload */\r
+    *(MRFI_P_PAYLOAD(&pOutFrame->mrfiPkt)+F_APP_PAYLOAD_OS+PB_REQ_OS) |= NWK_APP_REPLY_BIT;\r
+#ifdef SMPL_SECURE\r
+    nwk_setSecureFrame(&pOutFrame->mrfiPkt, MRFI_GET_PAYLOAD_LEN(frame)-F_APP_PAYLOAD_OS, 0);\r
+#endif  /* SMPL_SECURE */\r
+    nwk_sendFrame(pOutFrame, MRFI_TX_TYPE_FORCED);\r
+  }\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_processPing\r
+ *\r
+ * @brief       Ping network application frame handler.\r
+ *\r
+ * input parameters\r
+ * @param   frame   - pointer to frame in question\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return    Keep frame for application, release frame, or replay frame.\r
+ */\r
+fhStatus_t nwk_processPing(mrfiPacket_t *frame)\r
+{\r
+  fhStatus_t   rc;\r
+  uint8_t      replyType;\r
+\r
+  /* If we sent this then this is the reply. Validate the\r
+   * packet for reception by client app. If we didn't send\r
+   * it then we are the target. Send the reply.\r
+   */\r
+  replyType = nwk_isValidReply(frame, sTid, PB_REQ_OS, PB_TID_OS);\r
+  if (SMPL_MY_REPLY == replyType)\r
+  {\r
+    /* It's a match and it's a reply. Validate the received packet by\r
+     * returning a 1 so it can be received by the client app.\r
+     */\r
+    MRFI_PostKillSem();\r
+    rc = FHS_KEEP;\r
+  }\r
+#if !defined( END_DEVICE )\r
+  else if (SMPL_A_REPLY == replyType)\r
+  {\r
+    /* no match. If I'm not an ED this is a reply that should be passed on. */\r
+    rc = FHS_REPLAY;\r
+  }\r
+#endif  /* !END_DEVICE */\r
+  else\r
+  {\r
+    /* No, we didn't send it. Send reply assuming it's a Ping intended for us. */\r
+    handlePingRequest(frame);\r
+\r
+    rc = FHS_RELEASE;\r
+  }\r
+\r
+  return rc;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          handlePingRequest\r
+ *\r
+ * @brief       Dispatches handler for specfic Ping request\r
+ *\r
+ * input parameters\r
+ *\r
+ * @param   frame - Ping frame received\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   void\r
+ */\r
+static void handlePingRequest(mrfiPacket_t *frame)\r
+{\r
+  switch (*(MRFI_P_PAYLOAD(frame)+F_APP_PAYLOAD_OS))\r
+  {\r
+    case PING_REQ_PING:\r
+      smpl_send_ping_reply(frame);\r
+      break;\r
+\r
+    default:\r
+      break;\r
+  }\r
+\r
+  return;\r
+}\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/Components/nwk_applications/nwk_ping.h b/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/Components/nwk_applications/nwk_ping.h
new file mode 100755 (executable)
index 0000000..c7dd3be
--- /dev/null
@@ -0,0 +1,58 @@
+/**************************************************************************************************\r
+  Filename:       nwk_ping.h\r
+  Revised:        $Date: 2008-05-14 14:22:31 -0700 (Wed, 14 May 2008) $\r
+  Revision:       $Revision: 17075 $\r
+  Author:         $Author: lfriedman $\r
+\r
+  Description:    This file supports the SimpliciTI Ping network application.\r
+\r
+  Copyright 2004-2007 Texas Instruments Incorporated. All rights reserved.\r
+\r
+  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+  the terms of a software license agreement between the user who downloaded the software,\r
+  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+  License. The License limits your use, and you acknowledge, that the Software may not be\r
+  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+  perform, display or sell this Software and/or its documentation for any purpose.\r
+\r
+  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+\r
+  Should you have any questions regarding your right to use this Software,\r
+  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+\r
+#ifndef NWK_PING_H\r
+#define NWK_PING_H\r
+\r
+/* change the following as protocol developed */\r
+#define MAX_PING_APP_FRAME    2\r
+\r
+/* application payload offsets */\r
+/*    both */\r
+#define PB_REQ_OS     0\r
+#define PB_TID_OS     1\r
+\r
+\r
+/* ping requests */\r
+#define PING_REQ_PING       1\r
+\r
+/* prototypes */\r
+fhStatus_t   nwk_processPing(mrfiPacket_t *);\r
+void         nwk_pingInit(void);\r
+smplStatus_t nwk_ping(linkID_t);\r
+\r
+\r
+#endif\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/Components/nwk_applications/nwk_security.c b/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/Components/nwk_applications/nwk_security.c
new file mode 100755 (executable)
index 0000000..5ee4acc
--- /dev/null
@@ -0,0 +1,549 @@
+/**************************************************************************************************\r
+  Filename:       nwk_security.c\r
+  Revised:        $Date: 2009-01-20 14:05:46 -0800 (Tue, 20 Jan 2009) $\r
+  Revision:       $Revision: 18816 $\r
+  Author:         $Author: lfriedman $\r
+\r
+  Description:    This file supports the SimpliciTI Security network application.\r
+\r
+  Copyright 2008-2009 Texas Instruments Incorporated. All rights reserved.\r
+\r
+  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+  the terms of a software license agreement between the user who downloaded the software,\r
+  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+  License. The License limits your use, and you acknowledge, that the Software may not be\r
+  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+  perform, display or sell this Software and/or its documentation for any purpose.\r
+\r
+  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+\r
+  Should you have any questions regarding your right to use this Software,\r
+  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+/******************************************************************************\r
+ * INCLUDES\r
+ */\r
+\r
+#include <string.h>     /* needed for NULL */\r
+#include "mrfi.h"\r
+#include "nwk_types.h"\r
+#include "nwk_security.h"\r
+#include "nwk_frame.h"\r
+#include "nwk.h"\r
+\r
+#ifdef SMPL_SECURE\r
+\r
+/*                   *** GENERAL SECURITY OUTLINE ***\r
+ *\r
+ * We are using XTEA (eXtended Tiny Encryption Algorithm) with a fixed\r
+ * number of rounds (32). We have removed the parameters from the API\r
+ * we harvested from the public domain.\r
+ *\r
+ * We are using a CTR-like mode. We use the 64-bit block cipher function of the\r
+ * XTEA code to encipher a concatenation of the 32-bit initialization vector and\r
+ * a 32-bit counter that increments each block. We encrypt using a fixed 128-bit\r
+ * key. The resulting 64-bit output is XOR'ed with the message. If the message is\r
+ * longer than 64 bits we encipher the next block (incrementing the counter) and\r
+ * continue until the message is exhausted. If the last cipher block is longer\r
+ * than the message we simply discard the remaining cipher block.\r
+ */\r
+\r
+\r
+/******************************************************************************\r
+ * MACROS\r
+ */\r
+\r
+/******************************************************************************\r
+ * CONSTANTS AND DEFINES\r
+ */\r
+\r
+/* The counter can be off by quite a bit because the number of cipher\r
+ * blocks can easily be more than 1 per frame. Value limited to a\r
+ * maximum of 255.\r
+ */\r
+#define CTR_WINDOW  255\r
+\r
+#if (CTR_WINDOW > 255) || (CTR_WINDOW < 0)\r
+#error ERROR: 0 <= CTR_WINDOW < 256\r
+#endif\r
+\r
+/* Number of rounds for XTEA algorithm. A parameter in the public domain code\r
+ * but we fix it here at 32.\r
+ */\r
+#define NUM_ROUNDS  32\r
+\r
+/* Key and cipher block size constants */\r
+#define SMPL_KEYSIZE_BYTES    16\r
+#define SMPL_KEYSIZE_LONGS     4\r
+\r
+/******************************************************************************\r
+ * TYPEDEFS\r
+ */\r
+/* Union used to access key as both a string and as unsigned longs */\r
+typedef union\r
+{\r
+  uint8_t  keyS[SMPL_KEYSIZE_BYTES];\r
+  uint32_t keyL[SMPL_KEYSIZE_LONGS];\r
+} key_t;\r
+\r
+\r
+/******************************************************************************\r
+ * LOCAL VARIABLES\r
+ */\r
+/* 32-bit Initialization vector */\r
+static uint32_t const sIV = 0x87654321;\r
+\r
+/* 128-bit (16 byte) key. Initialized as string but fetched and used in XTEA\r
+ * encryption as 4 unsigned longs. Endianess could count if the peers are on\r
+ * two different MCUs. Endianess is rectified in initialization code.\r
+ *\r
+ * Initialization _MUST_ be done as a string (or character array). Though it\r
+ * won't matter how the initialization is done if both peers are the same\r
+ * endianness, good prectice will initialize these as a string (or character\r
+ * array) so that the endianess reconciliation works properly for all cases.\r
+ */\r
+static key_t sKey = {"SimpliciTI's Key"};\r
+\r
+/* Constant set as an authentication code. Note that since it is a\r
+ * fixed value as opposed to a hash of the message it does not provide\r
+ * an integrity check. It will only differentiate two message encryptions\r
+ * with the same LSB but different MSB components. Thus it helps guard\r
+ * against replays.\r
+ */\r
+static secMAC_t const sMAC = 0xA5;\r
+\r
+/* This is the 64-bit cipher block target. It is this 64-bit block that\r
+ * is XOR'ed with the actual message to be encrypted.\r
+ */\r
+static uint32_t sMsg[2] = {0, 0};\r
+\r
+/******************************************************************************\r
+ * LOCAL FUNCTIONS\r
+ */\r
+static secFCS_t calcFCS(uint8_t *, uint8_t);\r
+static void     msg_encipher(uint8_t *, uint8_t, uint32_t *);\r
+static void     msg_decipher(uint8_t *, uint8_t, uint32_t *);\r
+static void     xtea_encipher(void);\r
+\r
+#endif  /* SMPL_SECURE */\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_securityInit\r
+ *\r
+ * @brief       Initialize Security network application.\r
+ *\r
+ * input parameters\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return      void\r
+ */\r
+void nwk_securityInit(void)\r
+{\r
+#ifdef SMPL_SECURE\r
+  uint8_t  i;\r
+\r
+  /* The key is set as a string. But the XTEA routines operate on 32-bit\r
+   * unsigned longs. Endianess should be taken into account and we do that\r
+   * here by treating the key as being an array of unsigned longs in\r
+   * network order.\r
+   */\r
+  for (i=0; i<sizeof(sKey.keyL)/sizeof(uint32_t); ++i)\r
+  {\r
+    sKey.keyL[i] = ntohl(sKey.keyL[i]);\r
+  }\r
+\r
+#endif  /* SMPL_SECURE */\r
+  return;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_processSecurity\r
+ *\r
+ * @brief       Security network application frame handler.\r
+ *\r
+ * input parameters\r
+ * @param   frame   - pointer to frame in question\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return    Keep frame for application, release frame, or replay frame.\r
+ */\r
+fhStatus_t nwk_processSecurity(mrfiPacket_t *frame)\r
+{\r
+  return FHS_RELEASE;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          msg_encipher\r
+ *\r
+ * @brief       Encipher a message using the XTEA algorithm and the modified\r
+ *              CTR mode method.\r
+ *\r
+ * input parameters\r
+ * @param   msg      - pointer to message to encipher\r
+ * @param   len      - length of message\r
+ * @param   cntStart - pointer to the counter used in the cipher block.\r
+ *\r
+ * output parameters\r
+ * @param   cntStart - counter is updated during encryption.\r
+ *\r
+ * @return      void\r
+ */\r
+#ifdef SMPL_SECURE\r
+static void msg_encipher(uint8_t *msg, uint8_t len, uint32_t *cntStart)\r
+{\r
+  uint8_t  i, idx, done;\r
+  uint8_t *mptr = (uint8_t *)&sMsg[0];\r
+  uint32_t ctr;\r
+\r
+  if ((NULL == msg) || !len)\r
+  {\r
+    return;\r
+  }\r
+\r
+  /* set local counter from input */\r
+  ctr = *cntStart;\r
+\r
+  idx  = 0;\r
+  done = 0;\r
+  do\r
+  {\r
+    /* Set block to be enciphered. 1st 32 bits are the IV. The second\r
+     * 32 bits are the current CTR value.\r
+     */\r
+    sMsg[0] = sIV;\r
+    sMsg[1] = ctr;\r
+    /* encrypt */\r
+    xtea_encipher();\r
+    /* increment counter for next time. */\r
+    ctr++;\r
+    /* XOR ciphered block with message to be sent. Only operate\r
+     * up to and including the last message byte which may not\r
+     * be on a cipher block boundary (64 bits == 8 bytes).\r
+     */\r
+    for (i=0; i<sizeof(sMsg) && idx<len; ++i, ++idx)\r
+    {\r
+      msg[idx] ^= mptr[i];\r
+    }\r
+\r
+    if (idx >= len)\r
+    {\r
+      /* we're done */\r
+      done = 1;\r
+    }\r
+  } while (!done);\r
+\r
+  /* return counter value start for next time */\r
+  *cntStart = ctr;\r
+\r
+  return;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          msg_decipher\r
+ *\r
+ * @brief       Decipher a message using the XTEA algorithm and the modified\r
+ *              CTR mode method.\r
+ *\r
+ * input parameters\r
+ * @param   msg      - pointer to message to decipher\r
+ * @param   len      - length of message\r
+ * @param   cntStart - pointer to the counter used in the cipher block.\r
+ *\r
+ * output parameters\r
+ * @param   cntStart - counter is updated during decryption.\r
+ *\r
+ * @return      void\r
+ */\r
+static void msg_decipher(uint8_t *msg, uint8_t len, uint32_t *cntStart)\r
+{\r
+  msg_encipher(msg, len, cntStart);\r
+\r
+  return;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          xtea_encipher\r
+ *\r
+ * @brief       XTEA encipher algorithm. Calling arguments removed from public\r
+ *              domain code and static-scope values used instead.\r
+ *\r
+ * input parameters\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return      void\r
+ */\r
+void xtea_encipher(void)\r
+{\r
+  uint32_t v0=sMsg[0], v1=sMsg[1];\r
+  uint16_t i;\r
+  uint32_t sum=0, delta=0x9E3779B9;\r
+\r
+  for(i=0; i<NUM_ROUNDS; i++)\r
+  {\r
+    v0  += (((v1 << 4) ^ (v1 >> 5)) + v1) ^ (sum + sKey.keyL[sum & 3]);\r
+    sum += delta;\r
+    v1  += (((v0 << 4) ^ (v0 >> 5)) + v0) ^ (sum + sKey.keyL[(sum>>11) & 3]);\r
+  }\r
+\r
+  sMsg[0]=v0;\r
+  sMsg[1]=v1;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_setSecureFrame\r
+ *\r
+ * @brief       Called from NWK to secure a frame.\r
+ *\r
+ * input parameters\r
+ * @param   frame   - pointer to frame to secure\r
+ * @param   msglen  - length of message\r
+ * @param   ctr     - pointer to the counter used in the cipher block. This will\r
+ *                    be NULL if a network application is sending a frame. Since\r
+ *                    these are not connection-based there is no counter sync\r
+ *                    issue but we still need a counter value. A random value\r
+ *                    is used.\r
+ *\r
+ * output parameters\r
+ * @param   cntStart - counter is updated during encryption.\r
+ *\r
+ * @return      void\r
+ */\r
+void nwk_setSecureFrame(mrfiPacket_t *frame, uint8_t msglen, uint32_t *ctr)\r
+{\r
+  uint32_t locCnt;\r
+\r
+  /* If an encrypted frame is to be sent to a non-connection based port use a\r
+   * random number as the lsb counter value. In this case only the lsb is used\r
+   * for a counter value during decryption. Not as secure but there are still\r
+   * the 32 bits in the IV.\r
+   */\r
+  locCnt = ctr ? *ctr : MRFI_RandomByte();\r
+\r
+  /* place counter value into frame */\r
+  PUT_INTO_FRAME(MRFI_P_PAYLOAD(frame), F_SEC_CTR_OS, (uint8_t)(locCnt & 0xFF));\r
+\r
+  /* Put MAC value in */\r
+  nwk_putNumObjectIntoMsg((void *)&sMAC, (void *)(MRFI_P_PAYLOAD(frame)+F_SEC_MAC_OS), sizeof(secMAC_t));\r
+\r
+  /* Put FCS value in */\r
+  {\r
+    secFCS_t fcs = calcFCS(MRFI_P_PAYLOAD(frame)+F_SEC_MAC_OS, msglen+sizeof(secMAC_t));\r
+\r
+    nwk_putNumObjectIntoMsg((void *)&fcs, (void *)(MRFI_P_PAYLOAD(frame)+F_SEC_ICHK_OS), sizeof(secFCS_t));\r
+  }\r
+\r
+  /* Encrypt frame */\r
+  msg_encipher(MRFI_P_PAYLOAD(frame)+F_SEC_ICHK_OS, msglen+sizeof(secMAC_t)+sizeof(secFCS_t), &locCnt);\r
+\r
+  /* Set the Encryption bit */\r
+  PUT_INTO_FRAME(MRFI_P_PAYLOAD(frame), F_ENCRYPT_OS, F_ENCRYPT_OS_MSK);\r
+\r
+  /* Update the counter if it was a "real" counter. */\r
+  if (ctr)\r
+  {\r
+    *ctr = locCnt;\r
+  }\r
+\r
+  return;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          calcFCS\r
+ *\r
+ * @brief       Calculate the frame check sequence. Currently it's just a\r
+ *              cumulative XOR of each byte starting with the MAC byte. The\r
+ *              FCS is placed in front of the MAC after the counter hint and is\r
+ *              included in the encryption.\r
+ *\r
+ * input parameters\r
+ * @param   msg      - pointer to message\r
+ * @param   len      - length of message\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return      Returns the FCS using the typedef.\r
+ */\r
+static secFCS_t calcFCS(uint8_t *msg, uint8_t len)\r
+{\r
+  uint8_t  i;\r
+  secFCS_t result = 0;\r
+\r
+  for (i=0; i<len; ++i)\r
+  {\r
+    result ^= *(msg+i);\r
+  }\r
+\r
+  return result;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_getSecureFrame\r
+ *\r
+ * @brief       Called from NWK to get a secure a frame and decrypt.\r
+ *\r
+ * input parameters\r
+ * @param   frame    - pointer to frame containing encrypted message\r
+ * @param   msglen   - length of message\r
+ * @param   ctr      - pointer to the counter used in the cipher block. This will\r
+ *                     be NULL if a network applicaiton is getting a frame. Since\r
+ *                     these are not connection-nbased there is no counter sync\r
+ *                     issue but we still need a counter value.\r
+ *\r
+ * output parameters\r
+ * @param   cntStart - counter is updated during decryption. If decryption fails\r
+ *                     this value is not changed.\r
+ *\r
+ * @return      Returns non-zero if frame decryption is valid, otherwise returns 0.\r
+ */\r
+uint8_t nwk_getSecureFrame(mrfiPacket_t *frame, uint8_t msglen, uint32_t *ctr)\r
+{\r
+  uint8_t  rc = 1;\r
+  uint8_t  done = 0;\r
+  uint8_t  cntHint = GET_FROM_FRAME(MRFI_P_PAYLOAD(frame), F_SEC_CTR_OS);\r
+  uint32_t locCnt, frameCnt;\r
+\r
+  /* Construct proposed CTR values */\r
+\r
+  /* Just like encryption, we may be talking to a non-connection based\r
+   * peer in which case the counter value is represented by the lsb byte\r
+   * conveyed in the frame.\r
+   */\r
+  locCnt = ctr ? *ctr : cntHint;\r
+\r
+  frameCnt = (locCnt & 0xFFFFFF00) + cntHint;\r
+\r
+  do\r
+  {\r
+    /* See if counters match */\r
+    if (locCnt == frameCnt)\r
+    {\r
+      /* When the counters appear to match is the only time we actually decipher\r
+       * the message. It is the only time we can do so since out-of-sync lsb counter\r
+       * values guarantees that something is wrong somewhere. Decryption is successful\r
+       * only if the MAC and FCS values match. The message is left as-is after the\r
+       * decipher attempt. Either it appears valid or is doesn't and is discarded.\r
+       * There is no recovery attempt if the counters match but the MAC or FCS do\r
+       * not. It is considered a rogue message.\r
+       */\r
+      msg_decipher(MRFI_P_PAYLOAD(frame)+F_SEC_ICHK_OS, msglen-1, &locCnt);\r
+\r
+      /* Get MAC and make sure it matches. A failure can occur if a replayed frame happens\r
+       * to have the correct counter sync value but was encoded with the wrong complete\r
+       * counter value. Otherwise the MAC values must match when the counter values are equal.\r
+       */\r
+      {\r
+        secMAC_t mac;\r
+\r
+        nwk_getNumObjectFromMsg((void *)(MRFI_P_PAYLOAD(frame)+F_SEC_MAC_OS), (void *)&mac, sizeof(secMAC_t));\r
+        if (mac != sMAC)\r
+        {\r
+          rc = 0;\r
+        }\r
+      }\r
+\r
+      /* FCS check... */\r
+      {\r
+        secFCS_t fcs;\r
+\r
+        nwk_getNumObjectFromMsg((void *)(MRFI_P_PAYLOAD(frame)+F_SEC_ICHK_OS), (void *)&fcs, sizeof(secFCS_t));\r
+        if (fcs != calcFCS(MRFI_P_PAYLOAD(frame)+F_SEC_MAC_OS, msglen-1-sizeof(secMAC_t)))\r
+        {\r
+          rc = 0;\r
+        }\r
+      }\r
+\r
+      /* we're done. */\r
+      done = 1;\r
+    }\r
+    else\r
+    {\r
+      /* Uh oh. Counters don't match. Try and resync. We need to distinguish among\r
+       * missed frames, duplicates and rogues plus account for counter wrap.\r
+       */\r
+      if (frameCnt > locCnt)\r
+      {\r
+        /* frameCnt is bigger. Second part of test below takes care of\r
+         * the unlikely case of a complete counter wrap (msb's all 0) in\r
+         * which case the test will incorrectly fail when the count is\r
+         * actually within the (wrapped) window. #ifdef'ed to avoid compiler\r
+         * warning in case user sets CNT_WINDOW to 0 (pointless comparison of\r
+         * unsigned value).\r
+         */\r
+        if (((frameCnt-CTR_WINDOW) <= locCnt)\r
+#if CTR_WINDOW > 0\r
+            || (frameCnt < CTR_WINDOW)\r
+#endif\r
+           )\r
+        {\r
+          /* Value within window. We probably missed something. Adjust and decipher.\r
+           * If locCnt is less because it wrapped and frameCnt didn't it means that\r
+           * it's a duplicate or late frame. In that case the following will lead to\r
+           * a decryption that fails sanity checks which is OK because the frame will\r
+           * be correctly rejected.\r
+           */\r
+          locCnt = frameCnt;\r
+        }\r
+        else\r
+        {\r
+          /* It's either a rogue or a really old duplicate packet. In either case\r
+           * we dismiss the frame.\r
+           */\r
+          rc   = 0;\r
+          done = 1;\r
+        }\r
+      }\r
+      else\r
+      {\r
+        /* locCnt is bigger. The only way the frame can be valid is if the\r
+         * counter wrapped causing frameCnt to appear to be smaller. Wrap the\r
+         * counter and decrypt. If the frame isn't valid, i.e., it's late,\r
+         * a duplicate, or a rogue, the decryption will fail sanity checks and\r
+         * the frame will be correctly rejected. The following arithmetic works\r
+         * correctly without a special test for the complete counter wrap case.\r
+         */\r
+        frameCnt += 0x100;   /* wrap the hint-based counter */\r
+        if (((frameCnt-CTR_WINDOW) <= locCnt))\r
+        {\r
+          /* An lsb wrap but still within window. We probably missed something.\r
+           * Adjust (with wrap) and decrypt.\r
+           */\r
+          locCnt = frameCnt;\r
+        }\r
+        else\r
+        {\r
+          /* rogue frame */\r
+          rc   = 0;\r
+          done = 1;\r
+        }\r
+      }\r
+    }\r
+  } while (!done);\r
+\r
+  if (ctr && rc)\r
+  {\r
+    /* Only update the counter if the count was a "real" one and the\r
+     * decryption succeeded.\r
+     */\r
+    *ctr = locCnt;\r
+  }\r
+\r
+  return rc;\r
+}\r
+\r
+#endif  /* SMPL_SECURE */\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/Components/nwk_applications/nwk_security.h b/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/Components/nwk_applications/nwk_security.h
new file mode 100755 (executable)
index 0000000..212ce8f
--- /dev/null
@@ -0,0 +1,48 @@
+/**************************************************************************************************\r
+  Filename:       nwk_security.h\r
+  Revised:        $Date: 2009-01-09 15:02:17 -0800 (Fri, 09 Jan 2009) $\r
+  Revision:       $Revision: 18728 $\r
+  Author:         $Author: lfriedman $\r
+\r
+  Description:    This file supports the SimpliciTI Security network application.\r
+\r
+  Copyright 2004-2007 Texas Instruments Incorporated. All rights reserved.\r
+\r
+  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+  the terms of a software license agreement between the user who downloaded the software,\r
+  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+  License. The License limits your use, and you acknowledge, that the Software may not be\r
+  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+  perform, display or sell this Software and/or its documentation for any purpose.\r
+\r
+  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+\r
+  Should you have any questions regarding your right to use this Software,\r
+  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+\r
+#ifndef NWK_SECURITY_H\r
+#define NWK_SECURITY_H\r
+\r
+/* change the following as Security application is developed */\r
+#define MAX_SEC_APP_FRAME    0\r
+\r
+/* prototypes  */\r
+void       nwk_securityInit(void);\r
+fhStatus_t nwk_processSecurity(mrfiPacket_t *);\r
+void       nwk_setSecureFrame(mrfiPacket_t *, uint8_t, uint32_t *);\r
+uint8_t    nwk_getSecureFrame(mrfiPacket_t *, uint8_t, uint32_t *);\r
+#endif\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/simpliciti.h b/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/simpliciti.h
new file mode 100755 (executable)
index 0000000..f528db8
--- /dev/null
@@ -0,0 +1,163 @@
+// *************************************************************************************************\r
+//\r
+//     Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/ \r
+//      \r
+//      \r
+//       Redistribution and use in source and binary forms, with or without \r
+//       modification, are permitted provided that the following conditions \r
+//       are met:\r
+//     \r
+//         Redistributions of source code must retain the above copyright \r
+//         notice, this list of conditions and the following disclaimer.\r
+//      \r
+//         Redistributions in binary form must reproduce the above copyright\r
+//         notice, this list of conditions and the following disclaimer in the \r
+//         documentation and/or other materials provided with the   \r
+//         distribution.\r
+//      \r
+//         Neither the name of Texas Instruments Incorporated nor the names of\r
+//         its contributors may be used to endorse or promote products derived\r
+//         from this software without specific prior written permission.\r
+//     \r
+//       THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \r
+//       "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT \r
+//       LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//       A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT \r
+//       OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, \r
+//       SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT \r
+//       LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//       DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//       THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT \r
+//       (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE \r
+//       OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+//\r
+// SimpliciTI packet size (TX only mode)\r
+// -------------------------------------\r
+// \r
+//             * packet rate                   (100/3) packets/second = 33.3 packets/second                            \r
+//             * packet length                 28 bytes \r
+//             * packet structure              4 bytes         preamble \r
+//                                                             4 bytes         sync \r
+//                                                             1 bytes         length \r
+//                                                             1 bytes         address \r
+//                                                             16 bytes        data\r
+//                                                                      12 byte network data\r
+//                                                                      4  byte user data\r
+//                                                             2 bytes         crc \r
+//\r
+// SimpliciTI frequency overview\r
+// -----------------------------\r
+//\r
+// CC430_End_Device_433MHz.lib (433MHz ISM band)\r
+//\r
+//             * base frequency                433.92 MHz\r
+//             * deviation                             32 kHz\r
+//             * channel spacing               25 kHz\r
+//             * used channel number   0 (frequency agility/hopping disabled)\r
+//             * data rate                             76.8 kBaud\r
+//             * output power                  1.4 dBm\r
+//             * duty                                  9,6% (TX only mode, 32 packets / second)\r
+//\r
+// CC430_End_Device_868MHz.lib (868MHz ISM band)\r
+//\r
+//             * base frequency                869.525 MHz\r
+//             * deviation                             32 kHz\r
+//             * channel spacing               25 kHz\r
+//             * used channel number   0 (frequency agility/hopping disabled)\r
+//             * data rate                             76.8 kBaud\r
+//             * output power                  1.1 dBm\r
+//             * duty                                  9,6% (TX only mode, 32 packets / second)\r
+//\r
+// CC430_End_Device_915MHz.lib (915MHz ISM band)\r
+//\r
+//             * base frequency                902.000 MHz\r
+//             * deviation                             32 kHz\r
+//             * channel spacing               200 kHz\r
+//             * used channel number   20 (frequency agility/hopping disabled)\r
+//             * data rate                             76.8 kBaud\r
+//             * output power                  1.3 dBm\r
+//             * duty                                  9.6% (TX only mode, 32 packets / second)\r
+//\r
+// *************************************************************************************************\r
+\r
+// ---------------------------------------------------------------\r
+// Generic defines and variables\r
+\r
+// Entry point into SimpliciTI library\r
+extern unsigned char simpliciti_link(void);\r
+\r
+// 4 byte device address overrides device address set during compile time\r
+extern unsigned char simpliciti_ed_address[4];\r
+\r
+// Maximum data length\r
+#define SIMPLICITI_MAX_PAYLOAD_LENGTH          (32u)\r
+\r
+// Data to send / receive \r
+extern unsigned char simpliciti_data[SIMPLICITI_MAX_PAYLOAD_LENGTH];\r
+\r
+// Flag contains status information and triggers to send data or to exit SimpliciTI library\r
+// Control is done from outside SimpliciTI library\r
+extern unsigned char simpliciti_flag;\r
+#define SIMPLICITI_STATUS_LINKING                      (BIT0)  \r
+#define SIMPLICITI_STATUS_LINKED                       (BIT1)\r
+#define SIMPLICITI_STATUS_ERROR                            (BIT2)\r
+#define SIMPLICITI_TRIGGER_SEND_DATA           (BIT3)\r
+#define SIMPLICITI_TRIGGER_RECEIVED_DATA           (BIT4)\r
+#define SIMPLICITI_TRIGGER_STOP                            (BIT5)\r
+\r
+// Radio frequency offset read from calibration memory\r
+// Compensates crystal deviation from 26MHz nominal value\r
+extern unsigned char rf_frequoffset;\r
+\r
+// Macros\r
+#define getFlag(val, flag)                                             ((val&flag)==flag)\r
+#define setFlag(val, flag)                                             (val|=flag)\r
+#define clearFlag(val, flag)                                   (val&=(~flag))\r
+#define toggleFlag(val, flag)                                  (val^=flag)\r
+\r
+\r
+// ---------------------------------------------------------------\r
+// SimpliciTI RX only\r
+\r
+// Entry point into SimpliciTI library\r
+extern void simpliciti_main_tx_only(void);\r
+\r
+// Callback function to read data from acceleration sensor or buttons and trigger sending \r
+extern void simpliciti_get_ed_data_callback(void);\r
+\r
+\r
+// ---------------------------------------------------------------\r
+// SimpliciTI Sync\r
+\r
+// Sync data length\r
+#define BM_SYNC_DATA_LENGTH                     (19u)\r
+\r
+// Device data  (0)TYPE   (1) - (18) DATA \r
+#define SYNC_ED_TYPE_R2R                        (1u)\r
+#define SYNC_ED_TYPE_MEMORY                     (2u)\r
+#define SYNC_ED_TYPE_STATUS                     (3u)\r
+\r
+// Host data    (0)CMD    (1) - (18) DATA \r
+#define SYNC_AP_CMD_NOP                         (1u)\r
+#define SYNC_AP_CMD_GET_STATUS                                 (2u)\r
+#define SYNC_AP_CMD_SET_WATCH                   (3u)\r
+#define SYNC_AP_CMD_GET_MEMORY_BLOCKS_MODE_1           (4u)\r
+#define SYNC_AP_CMD_GET_MEMORY_BLOCKS_MODE_2           (5u)\r
+#define SYNC_AP_CMD_ERASE_MEMORY                (6u)\r
+#define SYNC_AP_CMD_EXIT                                               (7u)\r
+\r
+\r
+// Entry point into SimpliciTI library\r
+extern void simpliciti_main_sync(void);\r
+\r
+// Callback function to decode access point command\r
+extern void simpliciti_sync_decode_ap_cmd_callback(void);\r
+\r
+// Callback function to read data from application and trigger sending\r
+extern void simpliciti_sync_get_data_callback(unsigned int index);\r
+\r
+// Send reply packets (>0), 0=no need to reply\r
+extern unsigned char simpliciti_reply_count;\r
+\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/simpliciti_readme.txt b/chronos-ti/Software Projects/Chronos Watch/IAR/Sports Watch/simpliciti/simpliciti_readme.txt
new file mode 100755 (executable)
index 0000000..d1ff81d
--- /dev/null
@@ -0,0 +1,46 @@
+Some notes about the SimpliciTI configuration used in this project\r
+\r
+- The source code is based on the SimpliciTI 1.1.1 release.\r
+\r
+- A full SimpliciTI installation contains configurations for many targets and device types. To avoid confusion,\r
+  only the configuration (End Device) and target files (CC430EM) required for the eZ430-Chronos have been used.\r
+\r
+- All source code files have been copied into the project physically. Symbolic links have been replaced with\r
+  the real source code file. \r
+  \r
+- Due to the indirect inclusion scheme of hardware-dependent source code, some source code files have been\r
+  excluded from build. However, they will be included through higher level source code.  \r
+\r
+- Some modifications where required to the original source code. All these changes have been marked with [BM].\r
+\r
+       bsp_board.c/BSP_InitBoard(void)                 Changed from TA0 to TA1 for delay function, because TA0 is already occupied.\r
+\r
+       bsp_msp430_defs.h/BSP_EarlyInit(void)   Function removed, because SimpliciTI must run in watch context\r
+\r
+       mrfi_radio_interface.c/mrfiRadioInterfaceCmdStrobe(uint8_t addr)\r
+                                                                                       Added code to properly synchronize with radio interface. Otherwise\r
+                                                                                       interface could get stuck.\r
+                                                                                       \r
+       mrfi_radio.c                                                    Changed channel assignment (mrfiLogicalChanTable) for three ISM bands\r
+                                                                                       Changed power output settings (mrfiRFPowerTable) for three ISM bands\r
+                               \r
+       mrfi_radio.c/MRFI_Init(void)                    Added frequency offset correction to use calibrated frequency offset\r
+                                                                                       when starting RF communication\r
+                                                                                       \r
+       mrfi_radio.c/MRFI_RadioIsr(void)                Changed radio ISR to normal function, since we have a shared radio ISR\r
+       \r
+       nwk_api.c                                                               Made variable sInit_done globally available to allow SimpliciTI to shutdown \r
+                                                                                       and restart multiple times\r
+       \r
+       nwk.c/nwk_nwkInit                                               Added workaround to allow allow SimpliciTI to shutdown \r
+                                                                                       and restart multiple times\r
+\r
+- If you (for whatever reason) want to upgrade to a newer version of SimpliciTI, please bear in mind that\r
+\r
+       a) the access point SimpliciTI version is 1.1.1 (and cannot be updated)\r
+\r
+       b) the workarounds used here to enable SimpliciTI to shutdown and restart multiple times might not necessarily\r
+          work when used with later revisions\r
+                  \r
+          \r
+       
\ No newline at end of file
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Wireless Update/RFBSL_Low_Level_Init.s43 b/chronos-ti/Software Projects/Chronos Watch/IAR/Wireless Update/RFBSL_Low_Level_Init.s43
new file mode 100755 (executable)
index 0000000..6d20311
--- /dev/null
@@ -0,0 +1,58 @@
+//**************************************************************\r
+// BSL SW low level functions\r
+//**************************************************************\r
+#include <cc430x613x.h>\r
+\r
+#ifndef RAM_BASED_RFBSL\r
+\r
+\r
+#define RET_low  R12\r
+#define RET_high r13\r
+\r
+EXTERN __program_start\r
+\r
+               COMMON   ZAREA\r
+;--------------------------------------------------------------\r
+               ;BSL Z-Area \r
+;--------------------------------------------------------------\r
+BSL_Entry_JMP:JMP    __program_start             ; BSL ENTRY AREA\r
+              JMP    __port2_isr                 ; BSL_ACTION1 unused\r
+              JMP    $                           ; BSL_ACTION0 unused\r
+              \r
+              RSEG ZAREA_CODE\r
+             \r
+__port2_isr: \r
+             BIT.B  #01h, P2IFG\r
+             JNC    isr_return\r
+             BIC    #LPM4,0(SP)         // Wake from sleep upon returning from the ISR\r
+isr_return:  MOV.B  #00h, P2IFG\r
+             RETI\r
+             \r
+\r
+BSL_REQ_APP_CALL   EQU  0x0002                  ;Return Value for BSLUNLOCK Function to Call BSL again\r
+BSL_Protect:     \r
+              CLR      RET_low                  ;lock (keep JTAGLOCK_KEY state)\r
+              \r
+              BIS     #SYSBSLPE+SYSBSLSIZE0+SYSBSLSIZE1 , &SYSBSLC ; protects BSL\r
+              CMP.W   #0FFFFh, &0FFFEh  // Check if device is not programmed, go to recovery procedure\r
+              JNZ     BCC2BSL\r
+              BIS.W   #BSL_REQ_APP_CALL, RET_low\r
+BCC2BSL       RETA\r
+\r
+              COMMON   BSLSIG\r
+                 DW       0xFFFF\r
+BslProtectVecLoc DW       BSL_Protect             ;address of function\r
+PBSLSigLoc       DW       03CA5h                  ;1st BSL signature\r
+SBSLSigLoc       DW       0C35Ah                  ;2nd BSL signature\r
+                 DW       0xFFFF\r
+BslEntryLoc      DW       BSL_Entry_JMP\r
+\r
+\r
+              COMMON   JTAGLOCK_KEY\r
+PJTAGLOCK_KEY DW       0xFFFF                  ; Primary Key Location\r
+SJTAGLOCK_KEY DW       0xFFFF                  ; Secondary Key Location\r
+                                               ; set default unlock JTAG with option to lock with writting\r
+                                               ; a value <> 0x0000 or 0xFFFF\r
+\r
+#endif\r
+END
\ No newline at end of file
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Wireless Update/Wireless_Update.ewd b/chronos-ti/Software Projects/Chronos Watch/IAR/Wireless Update/Wireless_Update.ewd
new file mode 100755 (executable)
index 0000000..3a79d78
--- /dev/null
@@ -0,0 +1,1311 @@
+<?xml version="1.0" encoding="iso-8859-1"?>\r
+\r
+<project>\r
+  <fileVersion>2</fileVersion>\r
+  <configuration>\r
+    <name>RAM Based Updater</name>\r
+    <toolchain>\r
+      <name>MSP430</name>\r
+    </toolchain>\r
+    <debug>1</debug>\r
+    <settings>\r
+      <name>C-SPY</name>\r
+      <archiveVersion>4</archiveVersion>\r
+      <data>\r
+        <version>24</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>OCImagesSuppressCheck1</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OCImagesPath1</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>OCImagesSuppressCheck2</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OCImagesPath2</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>OCImagesSuppressCheck3</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OCImagesPath3</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>CInput</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>MacOverride</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>MacFile</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>IProcessor</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>GoToEnable</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>GoToName</name>\r
+          <state>main</state>\r
+        </option>\r
+        <option>\r
+          <name>DynDriver</name>\r
+          <state>SIM430</state>\r
+        </option>\r
+        <option>\r
+          <name>dDllSlave</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>DdfFileSlave</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>DdfOverride</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>DdfFileName</name>\r
+          <state>$TOOLKIT_DIR$\config\CC430F6137.ddf</state>\r
+        </option>\r
+        <option>\r
+          <name>ProcTMS</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CExtraOptionsCheck</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CExtraOptions</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>ProcMSP430X</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CompilerDataModel</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>IVBASE</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CPUTAG</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>L092Mode</name>\r
+          <state>1</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>430FET</name>\r
+      <archiveVersion>1</archiveVersion>\r
+      <data>\r
+        <version>21</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>CFetMandatory</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Erase</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>EMUVerifyDownloadP7</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>EraseOptionSlaveP7</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>ExitBreakpointP7</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>PutcharBreakpointP7</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>GetcharBreakpointP7</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>derivativeP7</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>ParallelPortP7</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>TargetVoltage</name>\r
+          <state>3.3</state>\r
+        </option>\r
+        <option>\r
+          <name>AllowLockedFlashAccessP7</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>EMUAttach</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AttachOptionSlave</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CRadioProtocolType</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCRadioModuleTypeSlave</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>EEMLevel</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>DiasbleMemoryCache</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>NeedLockedFlashAccess</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>UsbComPort</name>\r
+          <state>Automatic</state>\r
+        </option>\r
+        <option>\r
+          <name>FetConnection</name>\r
+          <version>2</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>SoftwareBreakpointEnable</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>RadioSoftwareBreakpointType</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>TargetSettlingtime</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AllowAccessToBSL</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OTargetVccTypeDefault</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCBetaDll</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>GPassword</name>\r
+          <state>###Uninitialized###</state>\r
+        </option>\r
+        <option>\r
+          <name>DebugLPM5</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>LPM5Slave</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CRadioAutoManualType</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>ExternalCodeDownload</name>\r
+          <state>0</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>SIM430</name>\r
+      <archiveVersion>1</archiveVersion>\r
+      <data>\r
+        <version>4</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>SimOddAddressCheckP7</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CSimMandatory</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>derivativeSim</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>SimEnablePSP</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>SimPspOverrideConfig</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>SimPspConfigFile</name>\r
+          <state>###Uninitialized###</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <debuggerPlugins>\r
+      <plugin>\r
+        <file>$TOOLKIT_DIR$\plugins\Lcd\lcd.ewplugin</file>\r
+        <loadFlag>1</loadFlag>\r
+      </plugin>\r
+      <plugin>\r
+        <file>$TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin</file>\r
+        <loadFlag>0</loadFlag>\r
+      </plugin>\r
+      <plugin>\r
+        <file>$TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin</file>\r
+        <loadFlag>0</loadFlag>\r
+      </plugin>\r
+      <plugin>\r
+        <file>$TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin</file>\r
+        <loadFlag>0</loadFlag>\r
+      </plugin>\r
+      <plugin>\r
+        <file>$TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin</file>\r
+        <loadFlag>0</loadFlag>\r
+      </plugin>\r
+      <plugin>\r
+        <file>$EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin</file>\r
+        <loadFlag>1</loadFlag>\r
+      </plugin>\r
+      <plugin>\r
+        <file>$EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin</file>\r
+        <loadFlag>0</loadFlag>\r
+      </plugin>\r
+      <plugin>\r
+        <file>$EW_DIR$\common\plugins\Profiling\Profiling.ENU.ewplugin</file>\r
+        <loadFlag>1</loadFlag>\r
+      </plugin>\r
+      <plugin>\r
+        <file>$EW_DIR$\common\plugins\Stack\Stack.ENU.ewplugin</file>\r
+        <loadFlag>1</loadFlag>\r
+      </plugin>\r
+      <plugin>\r
+        <file>$EW_DIR$\common\plugins\SymList\SymList.ENU.ewplugin</file>\r
+        <loadFlag>1</loadFlag>\r
+      </plugin>\r
+    </debuggerPlugins>\r
+  </configuration>\r
+  <configuration>\r
+    <name>915MHz Flash Based Updater</name>\r
+    <toolchain>\r
+      <name>MSP430</name>\r
+    </toolchain>\r
+    <debug>1</debug>\r
+    <settings>\r
+      <name>C-SPY</name>\r
+      <archiveVersion>4</archiveVersion>\r
+      <data>\r
+        <version>24</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>OCImagesSuppressCheck1</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OCImagesPath1</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>OCImagesSuppressCheck2</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OCImagesPath2</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>OCImagesSuppressCheck3</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OCImagesPath3</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>CInput</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>MacOverride</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>MacFile</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>IProcessor</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>GoToEnable</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>GoToName</name>\r
+          <state>main</state>\r
+        </option>\r
+        <option>\r
+          <name>DynDriver</name>\r
+          <state>430FET</state>\r
+        </option>\r
+        <option>\r
+          <name>dDllSlave</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>DdfFileSlave</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>DdfOverride</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>DdfFileName</name>\r
+          <state>$TOOLKIT_DIR$\config\CC430F6137.ddf</state>\r
+        </option>\r
+        <option>\r
+          <name>ProcTMS</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CExtraOptionsCheck</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CExtraOptions</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>ProcMSP430X</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CompilerDataModel</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>IVBASE</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CPUTAG</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>L092Mode</name>\r
+          <state>1</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>430FET</name>\r
+      <archiveVersion>1</archiveVersion>\r
+      <data>\r
+        <version>21</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>CFetMandatory</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Erase</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>EMUVerifyDownloadP7</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>EraseOptionSlaveP7</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>ExitBreakpointP7</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>PutcharBreakpointP7</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>GetcharBreakpointP7</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>derivativeP7</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>ParallelPortP7</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>TargetVoltage</name>\r
+          <state>3.3</state>\r
+        </option>\r
+        <option>\r
+          <name>AllowLockedFlashAccessP7</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>EMUAttach</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AttachOptionSlave</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CRadioProtocolType</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCRadioModuleTypeSlave</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>EEMLevel</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>DiasbleMemoryCache</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>NeedLockedFlashAccess</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>UsbComPort</name>\r
+          <state>HID0012</state>\r
+        </option>\r
+        <option>\r
+          <name>FetConnection</name>\r
+          <version>2</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>SoftwareBreakpointEnable</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>RadioSoftwareBreakpointType</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>TargetSettlingtime</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AllowAccessToBSL</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OTargetVccTypeDefault</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCBetaDll</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>GPassword</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>DebugLPM5</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>LPM5Slave</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CRadioAutoManualType</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>ExternalCodeDownload</name>\r
+          <state>0</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>SIM430</name>\r
+      <archiveVersion>1</archiveVersion>\r
+      <data>\r
+        <version>4</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>SimOddAddressCheckP7</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CSimMandatory</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>derivativeSim</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>SimEnablePSP</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>SimPspOverrideConfig</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>SimPspConfigFile</name>\r
+          <state>###Uninitialized###</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <debuggerPlugins>\r
+      <plugin>\r
+        <file>$TOOLKIT_DIR$\plugins\Lcd\lcd.ewplugin</file>\r
+        <loadFlag>1</loadFlag>\r
+      </plugin>\r
+      <plugin>\r
+        <file>$TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin</file>\r
+        <loadFlag>0</loadFlag>\r
+      </plugin>\r
+      <plugin>\r
+        <file>$TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin</file>\r
+        <loadFlag>0</loadFlag>\r
+      </plugin>\r
+      <plugin>\r
+        <file>$TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin</file>\r
+        <loadFlag>0</loadFlag>\r
+      </plugin>\r
+      <plugin>\r
+        <file>$TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin</file>\r
+        <loadFlag>0</loadFlag>\r
+      </plugin>\r
+      <plugin>\r
+        <file>$EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin</file>\r
+        <loadFlag>1</loadFlag>\r
+      </plugin>\r
+      <plugin>\r
+        <file>$EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin</file>\r
+        <loadFlag>0</loadFlag>\r
+      </plugin>\r
+      <plugin>\r
+        <file>$EW_DIR$\common\plugins\Profiling\Profiling.ENU.ewplugin</file>\r
+        <loadFlag>1</loadFlag>\r
+      </plugin>\r
+      <plugin>\r
+        <file>$EW_DIR$\common\plugins\Stack\Stack.ENU.ewplugin</file>\r
+        <loadFlag>1</loadFlag>\r
+      </plugin>\r
+      <plugin>\r
+        <file>$EW_DIR$\common\plugins\SymList\SymList.ENU.ewplugin</file>\r
+        <loadFlag>1</loadFlag>\r
+      </plugin>\r
+    </debuggerPlugins>\r
+  </configuration>\r
+  <configuration>\r
+    <name>868MHz Flash Based Updater</name>\r
+    <toolchain>\r
+      <name>MSP430</name>\r
+    </toolchain>\r
+    <debug>1</debug>\r
+    <settings>\r
+      <name>C-SPY</name>\r
+      <archiveVersion>4</archiveVersion>\r
+      <data>\r
+        <version>24</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>OCImagesSuppressCheck1</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OCImagesPath1</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>OCImagesSuppressCheck2</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OCImagesPath2</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>OCImagesSuppressCheck3</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OCImagesPath3</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>CInput</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>MacOverride</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>MacFile</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>IProcessor</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>GoToEnable</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>GoToName</name>\r
+          <state>main</state>\r
+        </option>\r
+        <option>\r
+          <name>DynDriver</name>\r
+          <state>430FET</state>\r
+        </option>\r
+        <option>\r
+          <name>dDllSlave</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>DdfFileSlave</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>DdfOverride</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>DdfFileName</name>\r
+          <state>$TOOLKIT_DIR$\config\CC430F6137.ddf</state>\r
+        </option>\r
+        <option>\r
+          <name>ProcTMS</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CExtraOptionsCheck</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CExtraOptions</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>ProcMSP430X</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CompilerDataModel</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>IVBASE</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CPUTAG</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>L092Mode</name>\r
+          <state>1</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>430FET</name>\r
+      <archiveVersion>1</archiveVersion>\r
+      <data>\r
+        <version>21</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>CFetMandatory</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Erase</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>EMUVerifyDownloadP7</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>EraseOptionSlaveP7</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>ExitBreakpointP7</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>PutcharBreakpointP7</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>GetcharBreakpointP7</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>derivativeP7</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>ParallelPortP7</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>TargetVoltage</name>\r
+          <state>3.3</state>\r
+        </option>\r
+        <option>\r
+          <name>AllowLockedFlashAccessP7</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>EMUAttach</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AttachOptionSlave</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CRadioProtocolType</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCRadioModuleTypeSlave</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>EEMLevel</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>DiasbleMemoryCache</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>NeedLockedFlashAccess</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>UsbComPort</name>\r
+          <state>HID0067:COM24</state>\r
+        </option>\r
+        <option>\r
+          <name>FetConnection</name>\r
+          <version>2</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>SoftwareBreakpointEnable</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>RadioSoftwareBreakpointType</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>TargetSettlingtime</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AllowAccessToBSL</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OTargetVccTypeDefault</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCBetaDll</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>GPassword</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>DebugLPM5</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>LPM5Slave</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CRadioAutoManualType</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>ExternalCodeDownload</name>\r
+          <state>0</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>SIM430</name>\r
+      <archiveVersion>1</archiveVersion>\r
+      <data>\r
+        <version>4</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>SimOddAddressCheckP7</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CSimMandatory</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>derivativeSim</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>SimEnablePSP</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>SimPspOverrideConfig</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>SimPspConfigFile</name>\r
+          <state>###Uninitialized###</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <debuggerPlugins>\r
+      <plugin>\r
+        <file>$TOOLKIT_DIR$\plugins\Lcd\lcd.ewplugin</file>\r
+        <loadFlag>1</loadFlag>\r
+      </plugin>\r
+      <plugin>\r
+        <file>$TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin</file>\r
+        <loadFlag>0</loadFlag>\r
+      </plugin>\r
+      <plugin>\r
+        <file>$TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin</file>\r
+        <loadFlag>0</loadFlag>\r
+      </plugin>\r
+      <plugin>\r
+        <file>$TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin</file>\r
+        <loadFlag>0</loadFlag>\r
+      </plugin>\r
+      <plugin>\r
+        <file>$TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin</file>\r
+        <loadFlag>0</loadFlag>\r
+      </plugin>\r
+      <plugin>\r
+        <file>$EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin</file>\r
+        <loadFlag>1</loadFlag>\r
+      </plugin>\r
+      <plugin>\r
+        <file>$EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin</file>\r
+        <loadFlag>0</loadFlag>\r
+      </plugin>\r
+      <plugin>\r
+        <file>$EW_DIR$\common\plugins\Profiling\Profiling.ENU.ewplugin</file>\r
+        <loadFlag>1</loadFlag>\r
+      </plugin>\r
+      <plugin>\r
+        <file>$EW_DIR$\common\plugins\Stack\Stack.ENU.ewplugin</file>\r
+        <loadFlag>1</loadFlag>\r
+      </plugin>\r
+      <plugin>\r
+        <file>$EW_DIR$\common\plugins\SymList\SymList.ENU.ewplugin</file>\r
+        <loadFlag>1</loadFlag>\r
+      </plugin>\r
+    </debuggerPlugins>\r
+  </configuration>\r
+  <configuration>\r
+    <name>433MHz Flash Based Updater</name>\r
+    <toolchain>\r
+      <name>MSP430</name>\r
+    </toolchain>\r
+    <debug>1</debug>\r
+    <settings>\r
+      <name>C-SPY</name>\r
+      <archiveVersion>4</archiveVersion>\r
+      <data>\r
+        <version>24</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>OCImagesSuppressCheck1</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OCImagesPath1</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>OCImagesSuppressCheck2</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OCImagesPath2</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>OCImagesSuppressCheck3</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OCImagesPath3</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>CInput</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>MacOverride</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>MacFile</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>IProcessor</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>GoToEnable</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>GoToName</name>\r
+          <state>main</state>\r
+        </option>\r
+        <option>\r
+          <name>DynDriver</name>\r
+          <state>SIM430</state>\r
+        </option>\r
+        <option>\r
+          <name>dDllSlave</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>DdfFileSlave</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>DdfOverride</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>DdfFileName</name>\r
+          <state>$TOOLKIT_DIR$\config\CC430F6137.ddf</state>\r
+        </option>\r
+        <option>\r
+          <name>ProcTMS</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CExtraOptionsCheck</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CExtraOptions</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>ProcMSP430X</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CompilerDataModel</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>IVBASE</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CPUTAG</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>L092Mode</name>\r
+          <state>1</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>430FET</name>\r
+      <archiveVersion>1</archiveVersion>\r
+      <data>\r
+        <version>21</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>CFetMandatory</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Erase</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>EMUVerifyDownloadP7</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>EraseOptionSlaveP7</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>ExitBreakpointP7</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>PutcharBreakpointP7</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>GetcharBreakpointP7</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>derivativeP7</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>ParallelPortP7</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>TargetVoltage</name>\r
+          <state>3.3</state>\r
+        </option>\r
+        <option>\r
+          <name>AllowLockedFlashAccessP7</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>EMUAttach</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AttachOptionSlave</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CRadioProtocolType</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCRadioModuleTypeSlave</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>EEMLevel</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>DiasbleMemoryCache</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>NeedLockedFlashAccess</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>UsbComPort</name>\r
+          <state>Automatic</state>\r
+        </option>\r
+        <option>\r
+          <name>FetConnection</name>\r
+          <version>2</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>SoftwareBreakpointEnable</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>RadioSoftwareBreakpointType</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>TargetSettlingtime</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AllowAccessToBSL</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OTargetVccTypeDefault</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCBetaDll</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>GPassword</name>\r
+          <state>###Uninitialized###</state>\r
+        </option>\r
+        <option>\r
+          <name>DebugLPM5</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>LPM5Slave</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CRadioAutoManualType</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>ExternalCodeDownload</name>\r
+          <state>0</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>SIM430</name>\r
+      <archiveVersion>1</archiveVersion>\r
+      <data>\r
+        <version>4</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>SimOddAddressCheckP7</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CSimMandatory</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>derivativeSim</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>SimEnablePSP</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>SimPspOverrideConfig</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>SimPspConfigFile</name>\r
+          <state>###Uninitialized###</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <debuggerPlugins>\r
+      <plugin>\r
+        <file>$TOOLKIT_DIR$\plugins\Lcd\lcd.ewplugin</file>\r
+        <loadFlag>1</loadFlag>\r
+      </plugin>\r
+      <plugin>\r
+        <file>$TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin</file>\r
+        <loadFlag>0</loadFlag>\r
+      </plugin>\r
+      <plugin>\r
+        <file>$TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin</file>\r
+        <loadFlag>0</loadFlag>\r
+      </plugin>\r
+      <plugin>\r
+        <file>$TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin</file>\r
+        <loadFlag>0</loadFlag>\r
+      </plugin>\r
+      <plugin>\r
+        <file>$TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin</file>\r
+        <loadFlag>0</loadFlag>\r
+      </plugin>\r
+      <plugin>\r
+        <file>$EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin</file>\r
+        <loadFlag>1</loadFlag>\r
+      </plugin>\r
+      <plugin>\r
+        <file>$EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin</file>\r
+        <loadFlag>0</loadFlag>\r
+      </plugin>\r
+      <plugin>\r
+        <file>$EW_DIR$\common\plugins\Profiling\Profiling.ENU.ewplugin</file>\r
+        <loadFlag>1</loadFlag>\r
+      </plugin>\r
+      <plugin>\r
+        <file>$EW_DIR$\common\plugins\Stack\Stack.ENU.ewplugin</file>\r
+        <loadFlag>1</loadFlag>\r
+      </plugin>\r
+      <plugin>\r
+        <file>$EW_DIR$\common\plugins\SymList\SymList.ENU.ewplugin</file>\r
+        <loadFlag>1</loadFlag>\r
+      </plugin>\r
+    </debuggerPlugins>\r
+  </configuration>\r
+</project>\r
+\r
+\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Wireless Update/Wireless_Update.ewp b/chronos-ti/Software Projects/Chronos Watch/IAR/Wireless Update/Wireless_Update.ewp
new file mode 100755 (executable)
index 0000000..150168e
--- /dev/null
@@ -0,0 +1,3580 @@
+<?xml version="1.0" encoding="iso-8859-1"?>\r
+\r
+<project>\r
+  <fileVersion>2</fileVersion>\r
+  <configuration>\r
+    <name>RAM Based Updater</name>\r
+    <toolchain>\r
+      <name>MSP430</name>\r
+    </toolchain>\r
+    <debug>1</debug>\r
+    <settings>\r
+      <name>General</name>\r
+      <archiveVersion>7</archiveVersion>\r
+      <data>\r
+        <version>27</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>ExePath</name>\r
+          <state>RAM Based Updater\Exe</state>\r
+        </option>\r
+        <option>\r
+          <name>ObjPath</name>\r
+          <state>RAM Based Updater\Obj</state>\r
+        </option>\r
+        <option>\r
+          <name>ListPath</name>\r
+          <state>RAM Based Updater\List</state>\r
+        </option>\r
+        <option>\r
+          <name>PosIndCode</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Hardware Multiplier</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>GOutputBinary</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AssemblerOnly</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OGDouble</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>GRuntimeLibSelect</name>\r
+          <version>0</version>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>RTDescription</name>\r
+          <state>Use the normal configuration of the C/EC++ runtime library. No locale interface, C locale, no file descriptor support, no multibytes in printf and scanf, and no hex floats in strtod.</state>\r
+        </option>\r
+        <option>\r
+          <name>RTConfigPath</name>\r
+          <state>$TOOLKIT_DIR$\LIB\DLIB\dl430xsfn.h</state>\r
+        </option>\r
+        <option>\r
+          <name>RTLibraryPath</name>\r
+          <state>$TOOLKIT_DIR$\LIB\DLIB\dl430xsfn.r43</state>\r
+        </option>\r
+        <option>\r
+          <name>Input variant</name>\r
+          <version>0</version>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Input description</name>\r
+          <state>No specifier n, no float or long long.</state>\r
+        </option>\r
+        <option>\r
+          <name>Output variant</name>\r
+          <version>0</version>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Output description</name>\r
+          <state>No specifier a or A.</state>\r
+        </option>\r
+        <option>\r
+          <name>GRuntimeLibSelectSlave</name>\r
+          <version>0</version>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OGCore</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>GeneralEnableMisra</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>GeneralMisraVerbose</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OGChipSelectMenu</name>\r
+          <state>CC430F6137    CC430F6137</state>\r
+        </option>\r
+        <option>\r
+          <name>GStackHeapOverride</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>GStackSize2</name>\r
+          <state>256</state>\r
+        </option>\r
+        <option>\r
+          <name>GHeapSize2</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>RadioDataModelType</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>GHeap20Size</name>\r
+          <state>80</state>\r
+        </option>\r
+        <option>\r
+          <name>GeneralMisraRules98</name>\r
+          <version>0</version>\r
+          <state>1000111110110101101110011100111111101110011011000101110111101101100111111111111100110011111001110111001111111111111111111111111</state>\r
+        </option>\r
+        <option>\r
+          <name>RadioHeapSizeType</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>RadioHardwareMultiplierType</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>GeneralMisraVer</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>GeneralMisraRules04</name>\r
+          <version>0</version>\r
+          <state>111101110010111111111000110111111111111111111111111110010111101111010101111111111111111111111111101111111011111001111011111011111111111111111</state>\r
+        </option>\r
+        <option>\r
+          <name>RadioL092ModelType</name>\r
+          <state>0</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>ICC430</name>\r
+      <archiveVersion>4</archiveVersion>\r
+      <data>\r
+        <version>30</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>CCDefines</name>\r
+          <state>RAM_BASED_RFBSL</state>\r
+        </option>\r
+        <option>\r
+          <name>CCPreprocFile</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCPreprocComments</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCPreprocLine</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCListCFile</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCListCMnemonics</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCListCMessages</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCListAssFile</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCListAssSource</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCEnableRemarks</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCDiagSuppress</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>CCDiagRemark</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>CCDiagWarning</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>CCDiagError</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>IObjPrefix2</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CCRequirePrototypes</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCAllowList</name>\r
+          <version>1</version>\r
+          <state>11111</state>\r
+        </option>\r
+        <option>\r
+          <name>CCObjUseModuleName</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCObjModuleName</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>CCDebugInfo</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>IProcessor</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCDiagWarnAreErr</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCCharIs</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CCExt</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCMultibyteSupport</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCMigrationPreprocExtentions</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCCompilerRuntimeInfo</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>IDoubleSize</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OutputFile</name>\r
+          <state>$FILE_BNAME$.r43</state>\r
+        </option>\r
+        <option>\r
+          <name>CCLibConfigHeader</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OCCR4Utilize</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OCCR5Utilize</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CPIC</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>IExtraOptionsCheck</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>IExtraOptions</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>PreInclude</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>CCOverrideModuleTypeDefault</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCRadioModuleType</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCRadioModuleTypeSlave</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>newCCIncludePaths</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>CCStdIncCheck</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CompilerMisraOverride</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OI430X</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>ReduceStack</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Save20bit</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CompilerDataModel</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CCOptLevel</name>\r
+          <state>3</state>\r
+        </option>\r
+        <option>\r
+          <name>CCOptStrategy</name>\r
+          <version>0</version>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CCOptLevelSlave</name>\r
+          <state>3</state>\r
+        </option>\r
+        <option>\r
+          <name>CInput</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CompilerMisraRules98</name>\r
+          <version>0</version>\r
+          <state>1000111110110101101110011100111111101110011011000101110111101101100111111111111100110011111001110111001111111111111111111111111</state>\r
+        </option>\r
+        <option>\r
+          <name>CompilerMisraRules04</name>\r
+          <version>0</version>\r
+          <state>111101110010111111111000110111111111111111111111111110010111101111010101111111111111111111111111101111111011111001111011111011111111111111111</state>\r
+        </option>\r
+        <option>\r
+          <name>IccLang</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>IccCDialect</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>IccAllowVLA</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>IccCppDialect</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>IccRelaxedFpPrecision</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCPUTAG</name>\r
+          <state>1</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>A430</name>\r
+      <archiveVersion>4</archiveVersion>\r
+      <data>\r
+        <version>13</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>AObjPrefix</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>ACaseSensitivity</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>MacroChars</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AWarnEnable</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AWarnWhat</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AWarnOne</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>AWarnRange1</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>AWarnRange2</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>ADefines</name>\r
+          <state>RAM_BASED_RFBSL</state>\r
+        </option>\r
+        <option>\r
+          <name>AList</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AListHeader</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>AListing</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Includes</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>MacDefs</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>MacExps</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>MacExec</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OnlyAssed</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>MultiLine</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>PageLengthCheck</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>PageLength</name>\r
+          <state>80</state>\r
+        </option>\r
+        <option>\r
+          <name>TabSpacing</name>\r
+          <state>8</state>\r
+        </option>\r
+        <option>\r
+          <name>AXRef</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AXRefDefines</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AXRefInternal</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AXRefDual</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>ADebug</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>ADebugType</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>IProcessor</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AMaxErrOn</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AMaxErrNum</name>\r
+          <state>100</state>\r
+        </option>\r
+        <option>\r
+          <name>OutputFile</name>\r
+          <state>$FILE_BNAME$.r43</state>\r
+        </option>\r
+        <option>\r
+          <name>AMultibyteSupport</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AExtraOptionsCheck</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AExtraOptions</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>OA1M</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>AIgnoreStdInclude</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AStdIncludes</name>\r
+          <state>$TOOLKIT_DIR$\INC\</state>\r
+        </option>\r
+        <option>\r
+          <name>AUserIncludes</name>\r
+          <state></state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>CUSTOM</name>\r
+      <archiveVersion>3</archiveVersion>\r
+      <data>\r
+        <extensions></extensions>\r
+        <cmdline></cmdline>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>BICOMP</name>\r
+      <archiveVersion>0</archiveVersion>\r
+      <data/>\r
+    </settings>\r
+    <settings>\r
+      <name>BUILDACTION</name>\r
+      <archiveVersion>1</archiveVersion>\r
+      <data>\r
+        <prebuild></prebuild>\r
+        <postbuild></postbuild>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>XLINK</name>\r
+      <archiveVersion>4</archiveVersion>\r
+      <data>\r
+        <version>22</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>XOutOverride</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OutputFile</name>\r
+          <state>ram_based_rfbsl.d43</state>\r
+        </option>\r
+        <option>\r
+          <name>OutputFormat</name>\r
+          <version>11</version>\r
+          <state>33</state>\r
+        </option>\r
+        <option>\r
+          <name>FormatVariant</name>\r
+          <version>8</version>\r
+          <state>2</state>\r
+        </option>\r
+        <option>\r
+          <name>SecondaryOutputFile</name>\r
+          <state>(None for the selected format)</state>\r
+        </option>\r
+        <option>\r
+          <name>XDefines</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>AlwaysOutput</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OverlapWarnings</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>NoGlobalCheck</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>XList</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>SegmentMap</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>ListSymbols</name>\r
+          <state>2</state>\r
+        </option>\r
+        <option>\r
+          <name>PageLengthCheck</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>PageLength</name>\r
+          <state>80</state>\r
+        </option>\r
+        <option>\r
+          <name>XIncludes</name>\r
+          <state>$TOOLKIT_DIR$\LIB\</state>\r
+        </option>\r
+        <option>\r
+          <name>ModuleStatus</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>XclOverride</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>XclFile</name>\r
+          <state>$PROJ_DIR$\ram_based_lnkcc430F6137.xcl</state>\r
+        </option>\r
+        <option>\r
+          <name>XclFileSlave</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>DoFill</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>FillerByte</name>\r
+          <state>0xFF</state>\r
+        </option>\r
+        <option>\r
+          <name>DoCrc</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CrcSize</name>\r
+          <version>0</version>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CrcAlgo</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CrcPoly</name>\r
+          <state>0x11021</state>\r
+        </option>\r
+        <option>\r
+          <name>CrcCompl</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>RangeCheckAlternatives</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>SuppressAllWarn</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>SuppressDiags</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>TreatAsWarn</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>TreatAsErr</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>ModuleLocalSym</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CrcBitOrder</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>XHardwareMul</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>IncludeSuppressed</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>ModuleSummary</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>XlinkStackSize</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>XlinkCodeModel</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>xcProgramEntryLabel</name>\r
+          <state>__program_start</state>\r
+        </option>\r
+        <option>\r
+          <name>DebugInformation</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>RuntimeControl</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>IoEmulation</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>XcRTLibraryFile</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OXLibIOConfig</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>XLibraryHeap</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>AllowExtraOutput</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>GenerateExtraOutput</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>XExtraOutOverride</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>ExtraOutputFile</name>\r
+          <state>ram_based_updater.txt</state>\r
+        </option>\r
+        <option>\r
+          <name>ExtraOutputFormat</name>\r
+          <version>11</version>\r
+          <state>33</state>\r
+        </option>\r
+        <option>\r
+          <name>ExtraFormatVariant</name>\r
+          <version>8</version>\r
+          <state>2</state>\r
+        </option>\r
+        <option>\r
+          <name>xcOverrideProgramEntryLabel</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>xcProgramEntryLabelSelect</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>ListOutputFormat</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>BufferedTermOutput</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>XExtraOptionsCheck</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>XExtraOptions</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>OverlaySystemMap</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>RawBinaryFile</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>RawBinarySymbol</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>RawBinarySegment</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>RawBinaryAlign</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>XLinkMisraHandler</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CrcAlign</name>\r
+          <state>2</state>\r
+        </option>\r
+        <option>\r
+          <name>CrcInitialValue</name>\r
+          <state>0x0</state>\r
+        </option>\r
+        <option>\r
+          <name>XLibraryHeap20</name>\r
+          <state>1</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>XAR</name>\r
+      <archiveVersion>4</archiveVersion>\r
+      <data>\r
+        <version>0</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>XAROutOverride</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>XARInputs</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>OutputFile</name>\r
+          <state></state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>BILINK</name>\r
+      <archiveVersion>0</archiveVersion>\r
+      <data/>\r
+    </settings>\r
+  </configuration>\r
+  <configuration>\r
+    <name>915MHz Flash Based Updater</name>\r
+    <toolchain>\r
+      <name>MSP430</name>\r
+    </toolchain>\r
+    <debug>1</debug>\r
+    <settings>\r
+      <name>General</name>\r
+      <archiveVersion>7</archiveVersion>\r
+      <data>\r
+        <version>27</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>ExePath</name>\r
+          <state>915MHz Flash Based Updater\Exe</state>\r
+        </option>\r
+        <option>\r
+          <name>ObjPath</name>\r
+          <state>915MHz Flash Based Updater\Obj</state>\r
+        </option>\r
+        <option>\r
+          <name>ListPath</name>\r
+          <state>915MHz Flash Based Updater\List</state>\r
+        </option>\r
+        <option>\r
+          <name>PosIndCode</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Hardware Multiplier</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>GOutputBinary</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AssemblerOnly</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OGDouble</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>GRuntimeLibSelect</name>\r
+          <version>0</version>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>RTDescription</name>\r
+          <state>Use the normal configuration of the C/EC++ runtime library. No locale interface, C locale, no file descriptor support, no multibytes in printf and scanf, and no hex floats in strtod.</state>\r
+        </option>\r
+        <option>\r
+          <name>RTConfigPath</name>\r
+          <state>$TOOLKIT_DIR$\LIB\DLIB\dl430xsfn.h</state>\r
+        </option>\r
+        <option>\r
+          <name>RTLibraryPath</name>\r
+          <state>$TOOLKIT_DIR$\LIB\DLIB\dl430xsfn.r43</state>\r
+        </option>\r
+        <option>\r
+          <name>Input variant</name>\r
+          <version>0</version>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Input description</name>\r
+          <state>No specifier n, no float or long long.</state>\r
+        </option>\r
+        <option>\r
+          <name>Output variant</name>\r
+          <version>0</version>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Output description</name>\r
+          <state>No specifier a or A.</state>\r
+        </option>\r
+        <option>\r
+          <name>GRuntimeLibSelectSlave</name>\r
+          <version>0</version>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OGCore</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>GeneralEnableMisra</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>GeneralMisraVerbose</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OGChipSelectMenu</name>\r
+          <state>CC430F6137    CC430F6137</state>\r
+        </option>\r
+        <option>\r
+          <name>GStackHeapOverride</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>GStackSize2</name>\r
+          <state>256</state>\r
+        </option>\r
+        <option>\r
+          <name>GHeapSize2</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>RadioDataModelType</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>GHeap20Size</name>\r
+          <state>80</state>\r
+        </option>\r
+        <option>\r
+          <name>GeneralMisraRules98</name>\r
+          <version>0</version>\r
+          <state>1000111110110101101110011100111111101110011011000101110111101101100111111111111100110011111001110111001111111111111111111111111</state>\r
+        </option>\r
+        <option>\r
+          <name>RadioHeapSizeType</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>RadioHardwareMultiplierType</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>GeneralMisraVer</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>GeneralMisraRules04</name>\r
+          <version>0</version>\r
+          <state>111101110010111111111000110111111111111111111111111110010111101111010101111111111111111111111111101111111011111001111011111011111111111111111</state>\r
+        </option>\r
+        <option>\r
+          <name>RadioL092ModelType</name>\r
+          <state>0</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>ICC430</name>\r
+      <archiveVersion>4</archiveVersion>\r
+      <data>\r
+        <version>30</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>CCDefines</name>\r
+          <state>ISM_US</state>\r
+        </option>\r
+        <option>\r
+          <name>CCPreprocFile</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCPreprocComments</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCPreprocLine</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCListCFile</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCListCMnemonics</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCListCMessages</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCListAssFile</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCListAssSource</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCEnableRemarks</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCDiagSuppress</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>CCDiagRemark</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>CCDiagWarning</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>CCDiagError</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>IObjPrefix2</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CCRequirePrototypes</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCAllowList</name>\r
+          <version>1</version>\r
+          <state>11111</state>\r
+        </option>\r
+        <option>\r
+          <name>CCObjUseModuleName</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCObjModuleName</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>CCDebugInfo</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>IProcessor</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCDiagWarnAreErr</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCCharIs</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CCExt</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCMultibyteSupport</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCMigrationPreprocExtentions</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCCompilerRuntimeInfo</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>IDoubleSize</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OutputFile</name>\r
+          <state>$FILE_BNAME$.r43</state>\r
+        </option>\r
+        <option>\r
+          <name>CCLibConfigHeader</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OCCR4Utilize</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OCCR5Utilize</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CPIC</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>IExtraOptionsCheck</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>IExtraOptions</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>PreInclude</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>CCOverrideModuleTypeDefault</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCRadioModuleType</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCRadioModuleTypeSlave</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>newCCIncludePaths</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>CCStdIncCheck</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CompilerMisraOverride</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OI430X</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>ReduceStack</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Save20bit</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CompilerDataModel</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CCOptLevel</name>\r
+          <state>3</state>\r
+        </option>\r
+        <option>\r
+          <name>CCOptStrategy</name>\r
+          <version>0</version>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CCOptLevelSlave</name>\r
+          <state>3</state>\r
+        </option>\r
+        <option>\r
+          <name>CInput</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CompilerMisraRules98</name>\r
+          <version>0</version>\r
+          <state>1000111110110101101110011100111111101110011011000101110111101101100111111111111100110011111001110111001111111111111111111111111</state>\r
+        </option>\r
+        <option>\r
+          <name>CompilerMisraRules04</name>\r
+          <version>0</version>\r
+          <state>111101110010111111111000110111111111111111111111111110010111101111010101111111111111111111111111101111111011111001111011111011111111111111111</state>\r
+        </option>\r
+        <option>\r
+          <name>IccLang</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>IccCDialect</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>IccAllowVLA</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>IccCppDialect</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>IccRelaxedFpPrecision</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCPUTAG</name>\r
+          <state>1</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>A430</name>\r
+      <archiveVersion>4</archiveVersion>\r
+      <data>\r
+        <version>13</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>AObjPrefix</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>ACaseSensitivity</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>MacroChars</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AWarnEnable</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AWarnWhat</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AWarnOne</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>AWarnRange1</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>AWarnRange2</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>ADefines</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>AList</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AListHeader</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>AListing</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Includes</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>MacDefs</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>MacExps</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>MacExec</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OnlyAssed</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>MultiLine</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>PageLengthCheck</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>PageLength</name>\r
+          <state>80</state>\r
+        </option>\r
+        <option>\r
+          <name>TabSpacing</name>\r
+          <state>8</state>\r
+        </option>\r
+        <option>\r
+          <name>AXRef</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AXRefDefines</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AXRefInternal</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AXRefDual</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>ADebug</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>ADebugType</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>IProcessor</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AMaxErrOn</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AMaxErrNum</name>\r
+          <state>100</state>\r
+        </option>\r
+        <option>\r
+          <name>OutputFile</name>\r
+          <state>$FILE_BNAME$.r43</state>\r
+        </option>\r
+        <option>\r
+          <name>AMultibyteSupport</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AExtraOptionsCheck</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AExtraOptions</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>OA1M</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>AIgnoreStdInclude</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AStdIncludes</name>\r
+          <state>$TOOLKIT_DIR$\INC\</state>\r
+        </option>\r
+        <option>\r
+          <name>AUserIncludes</name>\r
+          <state></state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>CUSTOM</name>\r
+      <archiveVersion>3</archiveVersion>\r
+      <data>\r
+        <extensions></extensions>\r
+        <cmdline></cmdline>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>BICOMP</name>\r
+      <archiveVersion>0</archiveVersion>\r
+      <data/>\r
+    </settings>\r
+    <settings>\r
+      <name>BUILDACTION</name>\r
+      <archiveVersion>1</archiveVersion>\r
+      <data>\r
+        <prebuild></prebuild>\r
+        <postbuild></postbuild>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>XLINK</name>\r
+      <archiveVersion>4</archiveVersion>\r
+      <data>\r
+        <version>22</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>XOutOverride</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OutputFile</name>\r
+          <state>flash_based_rfbsl_ism_us.d43</state>\r
+        </option>\r
+        <option>\r
+          <name>OutputFormat</name>\r
+          <version>11</version>\r
+          <state>33</state>\r
+        </option>\r
+        <option>\r
+          <name>FormatVariant</name>\r
+          <version>8</version>\r
+          <state>2</state>\r
+        </option>\r
+        <option>\r
+          <name>SecondaryOutputFile</name>\r
+          <state>(None for the selected format)</state>\r
+        </option>\r
+        <option>\r
+          <name>XDefines</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>AlwaysOutput</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OverlapWarnings</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>NoGlobalCheck</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>XList</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>SegmentMap</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>ListSymbols</name>\r
+          <state>2</state>\r
+        </option>\r
+        <option>\r
+          <name>PageLengthCheck</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>PageLength</name>\r
+          <state>80</state>\r
+        </option>\r
+        <option>\r
+          <name>XIncludes</name>\r
+          <state>$TOOLKIT_DIR$\LIB\</state>\r
+        </option>\r
+        <option>\r
+          <name>ModuleStatus</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>XclOverride</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>XclFile</name>\r
+          <state>$PROJ_DIR$\flash_based_lnkcc430F6137.xcl</state>\r
+        </option>\r
+        <option>\r
+          <name>XclFileSlave</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>DoFill</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>FillerByte</name>\r
+          <state>0xFF</state>\r
+        </option>\r
+        <option>\r
+          <name>DoCrc</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CrcSize</name>\r
+          <version>0</version>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CrcAlgo</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CrcPoly</name>\r
+          <state>0x11021</state>\r
+        </option>\r
+        <option>\r
+          <name>CrcCompl</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>RangeCheckAlternatives</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>SuppressAllWarn</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>SuppressDiags</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>TreatAsWarn</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>TreatAsErr</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>ModuleLocalSym</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CrcBitOrder</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>XHardwareMul</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>IncludeSuppressed</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>ModuleSummary</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>XlinkStackSize</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>XlinkCodeModel</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>xcProgramEntryLabel</name>\r
+          <state>__program_start</state>\r
+        </option>\r
+        <option>\r
+          <name>DebugInformation</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>RuntimeControl</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>IoEmulation</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>XcRTLibraryFile</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OXLibIOConfig</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>XLibraryHeap</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>AllowExtraOutput</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>GenerateExtraOutput</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>XExtraOutOverride</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>ExtraOutputFile</name>\r
+          <state>flash_based_rfbsl_ism_us.txt</state>\r
+        </option>\r
+        <option>\r
+          <name>ExtraOutputFormat</name>\r
+          <version>11</version>\r
+          <state>33</state>\r
+        </option>\r
+        <option>\r
+          <name>ExtraFormatVariant</name>\r
+          <version>8</version>\r
+          <state>2</state>\r
+        </option>\r
+        <option>\r
+          <name>xcOverrideProgramEntryLabel</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>xcProgramEntryLabelSelect</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>ListOutputFormat</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>BufferedTermOutput</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>XExtraOptionsCheck</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>XExtraOptions</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>OverlaySystemMap</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>RawBinaryFile</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>RawBinarySymbol</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>RawBinarySegment</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>RawBinaryAlign</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>XLinkMisraHandler</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CrcAlign</name>\r
+          <state>2</state>\r
+        </option>\r
+        <option>\r
+          <name>CrcInitialValue</name>\r
+          <state>0x0</state>\r
+        </option>\r
+        <option>\r
+          <name>XLibraryHeap20</name>\r
+          <state>1</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>XAR</name>\r
+      <archiveVersion>4</archiveVersion>\r
+      <data>\r
+        <version>0</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>XAROutOverride</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>XARInputs</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>OutputFile</name>\r
+          <state></state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>BILINK</name>\r
+      <archiveVersion>0</archiveVersion>\r
+      <data/>\r
+    </settings>\r
+  </configuration>\r
+  <configuration>\r
+    <name>868MHz Flash Based Updater</name>\r
+    <toolchain>\r
+      <name>MSP430</name>\r
+    </toolchain>\r
+    <debug>1</debug>\r
+    <settings>\r
+      <name>General</name>\r
+      <archiveVersion>7</archiveVersion>\r
+      <data>\r
+        <version>27</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>ExePath</name>\r
+          <state>868MHz Flash Based Updater\Exe</state>\r
+        </option>\r
+        <option>\r
+          <name>ObjPath</name>\r
+          <state>868MHz Flash Based Updater\Obj</state>\r
+        </option>\r
+        <option>\r
+          <name>ListPath</name>\r
+          <state>868MHz Flash Based Updater\List</state>\r
+        </option>\r
+        <option>\r
+          <name>PosIndCode</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Hardware Multiplier</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>GOutputBinary</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AssemblerOnly</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OGDouble</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>GRuntimeLibSelect</name>\r
+          <version>0</version>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>RTDescription</name>\r
+          <state>Use the normal configuration of the C/EC++ runtime library. No locale interface, C locale, no file descriptor support, no multibytes in printf and scanf, and no hex floats in strtod.</state>\r
+        </option>\r
+        <option>\r
+          <name>RTConfigPath</name>\r
+          <state>$TOOLKIT_DIR$\LIB\DLIB\dl430xsfn.h</state>\r
+        </option>\r
+        <option>\r
+          <name>RTLibraryPath</name>\r
+          <state>$TOOLKIT_DIR$\LIB\DLIB\dl430xsfn.r43</state>\r
+        </option>\r
+        <option>\r
+          <name>Input variant</name>\r
+          <version>0</version>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Input description</name>\r
+          <state>No specifier n, no float or long long.</state>\r
+        </option>\r
+        <option>\r
+          <name>Output variant</name>\r
+          <version>0</version>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Output description</name>\r
+          <state>No specifier a or A.</state>\r
+        </option>\r
+        <option>\r
+          <name>GRuntimeLibSelectSlave</name>\r
+          <version>0</version>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OGCore</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>GeneralEnableMisra</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>GeneralMisraVerbose</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OGChipSelectMenu</name>\r
+          <state>CC430F6137    CC430F6137</state>\r
+        </option>\r
+        <option>\r
+          <name>GStackHeapOverride</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>GStackSize2</name>\r
+          <state>256</state>\r
+        </option>\r
+        <option>\r
+          <name>GHeapSize2</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>RadioDataModelType</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>GHeap20Size</name>\r
+          <state>80</state>\r
+        </option>\r
+        <option>\r
+          <name>GeneralMisraRules98</name>\r
+          <version>0</version>\r
+          <state>1000111110110101101110011100111111101110011011000101110111101101100111111111111100110011111001110111001111111111111111111111111</state>\r
+        </option>\r
+        <option>\r
+          <name>RadioHeapSizeType</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>RadioHardwareMultiplierType</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>GeneralMisraVer</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>GeneralMisraRules04</name>\r
+          <version>0</version>\r
+          <state>111101110010111111111000110111111111111111111111111110010111101111010101111111111111111111111111101111111011111001111011111011111111111111111</state>\r
+        </option>\r
+        <option>\r
+          <name>RadioL092ModelType</name>\r
+          <state>0</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>ICC430</name>\r
+      <archiveVersion>4</archiveVersion>\r
+      <data>\r
+        <version>30</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>CCDefines</name>\r
+          <state>ISM_EU</state>\r
+        </option>\r
+        <option>\r
+          <name>CCPreprocFile</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCPreprocComments</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCPreprocLine</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCListCFile</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCListCMnemonics</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCListCMessages</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCListAssFile</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCListAssSource</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CCEnableRemarks</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCDiagSuppress</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>CCDiagRemark</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>CCDiagWarning</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>CCDiagError</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>IObjPrefix2</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CCRequirePrototypes</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCAllowList</name>\r
+          <version>1</version>\r
+          <state>10111</state>\r
+        </option>\r
+        <option>\r
+          <name>CCObjUseModuleName</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCObjModuleName</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>CCDebugInfo</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>IProcessor</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCDiagWarnAreErr</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCCharIs</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CCExt</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCMultibyteSupport</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCMigrationPreprocExtentions</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCCompilerRuntimeInfo</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>IDoubleSize</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OutputFile</name>\r
+          <state>$FILE_BNAME$.r43</state>\r
+        </option>\r
+        <option>\r
+          <name>CCLibConfigHeader</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OCCR4Utilize</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OCCR5Utilize</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CPIC</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>IExtraOptionsCheck</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>IExtraOptions</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>PreInclude</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>CCOverrideModuleTypeDefault</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCRadioModuleType</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCRadioModuleTypeSlave</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>newCCIncludePaths</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>CCStdIncCheck</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CompilerMisraOverride</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OI430X</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>ReduceStack</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Save20bit</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CompilerDataModel</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CCOptLevel</name>\r
+          <state>3</state>\r
+        </option>\r
+        <option>\r
+          <name>CCOptStrategy</name>\r
+          <version>0</version>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CCOptLevelSlave</name>\r
+          <state>3</state>\r
+        </option>\r
+        <option>\r
+          <name>CInput</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CompilerMisraRules98</name>\r
+          <version>0</version>\r
+          <state>1000111110110101101110011100111111101110011011000101110111101101100111111111111100110011111001110111001111111111111111111111111</state>\r
+        </option>\r
+        <option>\r
+          <name>CompilerMisraRules04</name>\r
+          <version>0</version>\r
+          <state>111101110010111111111000110111111111111111111111111110010111101111010101111111111111111111111111101111111011111001111011111011111111111111111</state>\r
+        </option>\r
+        <option>\r
+          <name>IccLang</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>IccCDialect</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>IccAllowVLA</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>IccCppDialect</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>IccRelaxedFpPrecision</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCPUTAG</name>\r
+          <state>1</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>A430</name>\r
+      <archiveVersion>4</archiveVersion>\r
+      <data>\r
+        <version>13</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>AObjPrefix</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>ACaseSensitivity</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>MacroChars</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AWarnEnable</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AWarnWhat</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AWarnOne</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>AWarnRange1</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>AWarnRange2</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>ADefines</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>AList</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AListHeader</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>AListing</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Includes</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>MacDefs</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>MacExps</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>MacExec</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OnlyAssed</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>MultiLine</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>PageLengthCheck</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>PageLength</name>\r
+          <state>80</state>\r
+        </option>\r
+        <option>\r
+          <name>TabSpacing</name>\r
+          <state>8</state>\r
+        </option>\r
+        <option>\r
+          <name>AXRef</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AXRefDefines</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AXRefInternal</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AXRefDual</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>ADebug</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>ADebugType</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>IProcessor</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AMaxErrOn</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AMaxErrNum</name>\r
+          <state>100</state>\r
+        </option>\r
+        <option>\r
+          <name>OutputFile</name>\r
+          <state>$FILE_BNAME$.r43</state>\r
+        </option>\r
+        <option>\r
+          <name>AMultibyteSupport</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AExtraOptionsCheck</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AExtraOptions</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>OA1M</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>AIgnoreStdInclude</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AStdIncludes</name>\r
+          <state>$TOOLKIT_DIR$\INC\</state>\r
+        </option>\r
+        <option>\r
+          <name>AUserIncludes</name>\r
+          <state></state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>CUSTOM</name>\r
+      <archiveVersion>3</archiveVersion>\r
+      <data>\r
+        <extensions></extensions>\r
+        <cmdline></cmdline>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>BICOMP</name>\r
+      <archiveVersion>0</archiveVersion>\r
+      <data/>\r
+    </settings>\r
+    <settings>\r
+      <name>BUILDACTION</name>\r
+      <archiveVersion>1</archiveVersion>\r
+      <data>\r
+        <prebuild></prebuild>\r
+        <postbuild></postbuild>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>XLINK</name>\r
+      <archiveVersion>4</archiveVersion>\r
+      <data>\r
+        <version>22</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>XOutOverride</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OutputFile</name>\r
+          <state>flash_based_rfbsl_ism_eu.d43</state>\r
+        </option>\r
+        <option>\r
+          <name>OutputFormat</name>\r
+          <version>11</version>\r
+          <state>33</state>\r
+        </option>\r
+        <option>\r
+          <name>FormatVariant</name>\r
+          <version>8</version>\r
+          <state>2</state>\r
+        </option>\r
+        <option>\r
+          <name>SecondaryOutputFile</name>\r
+          <state>(None for the selected format)</state>\r
+        </option>\r
+        <option>\r
+          <name>XDefines</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>AlwaysOutput</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OverlapWarnings</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>NoGlobalCheck</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>XList</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>SegmentMap</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>ListSymbols</name>\r
+          <state>2</state>\r
+        </option>\r
+        <option>\r
+          <name>PageLengthCheck</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>PageLength</name>\r
+          <state>80</state>\r
+        </option>\r
+        <option>\r
+          <name>XIncludes</name>\r
+          <state>$TOOLKIT_DIR$\LIB\</state>\r
+        </option>\r
+        <option>\r
+          <name>ModuleStatus</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>XclOverride</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>XclFile</name>\r
+          <state>$PROJ_DIR$\flash_based_lnkcc430F6137.xcl</state>\r
+        </option>\r
+        <option>\r
+          <name>XclFileSlave</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>DoFill</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>FillerByte</name>\r
+          <state>0xFF</state>\r
+        </option>\r
+        <option>\r
+          <name>DoCrc</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CrcSize</name>\r
+          <version>0</version>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CrcAlgo</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CrcPoly</name>\r
+          <state>0x11021</state>\r
+        </option>\r
+        <option>\r
+          <name>CrcCompl</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>RangeCheckAlternatives</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>SuppressAllWarn</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>SuppressDiags</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>TreatAsWarn</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>TreatAsErr</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>ModuleLocalSym</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CrcBitOrder</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>XHardwareMul</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>IncludeSuppressed</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>ModuleSummary</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>XlinkStackSize</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>XlinkCodeModel</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>xcProgramEntryLabel</name>\r
+          <state>__program_start</state>\r
+        </option>\r
+        <option>\r
+          <name>DebugInformation</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>RuntimeControl</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>IoEmulation</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>XcRTLibraryFile</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OXLibIOConfig</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>XLibraryHeap</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>AllowExtraOutput</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>GenerateExtraOutput</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>XExtraOutOverride</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>ExtraOutputFile</name>\r
+          <state>flash_based_rfbsl_ism_eu.txt</state>\r
+        </option>\r
+        <option>\r
+          <name>ExtraOutputFormat</name>\r
+          <version>11</version>\r
+          <state>33</state>\r
+        </option>\r
+        <option>\r
+          <name>ExtraFormatVariant</name>\r
+          <version>8</version>\r
+          <state>2</state>\r
+        </option>\r
+        <option>\r
+          <name>xcOverrideProgramEntryLabel</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>xcProgramEntryLabelSelect</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>ListOutputFormat</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>BufferedTermOutput</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>XExtraOptionsCheck</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>XExtraOptions</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>OverlaySystemMap</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>RawBinaryFile</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>RawBinarySymbol</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>RawBinarySegment</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>RawBinaryAlign</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>XLinkMisraHandler</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CrcAlign</name>\r
+          <state>2</state>\r
+        </option>\r
+        <option>\r
+          <name>CrcInitialValue</name>\r
+          <state>0x0</state>\r
+        </option>\r
+        <option>\r
+          <name>XLibraryHeap20</name>\r
+          <state>1</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>XAR</name>\r
+      <archiveVersion>4</archiveVersion>\r
+      <data>\r
+        <version>0</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>XAROutOverride</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>XARInputs</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>OutputFile</name>\r
+          <state></state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>BILINK</name>\r
+      <archiveVersion>0</archiveVersion>\r
+      <data/>\r
+    </settings>\r
+  </configuration>\r
+  <configuration>\r
+    <name>433MHz Flash Based Updater</name>\r
+    <toolchain>\r
+      <name>MSP430</name>\r
+    </toolchain>\r
+    <debug>1</debug>\r
+    <settings>\r
+      <name>General</name>\r
+      <archiveVersion>7</archiveVersion>\r
+      <data>\r
+        <version>27</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>ExePath</name>\r
+          <state>433MHz Flash Based Updater\Exe</state>\r
+        </option>\r
+        <option>\r
+          <name>ObjPath</name>\r
+          <state>433MHz Flash Based Updater\Obj</state>\r
+        </option>\r
+        <option>\r
+          <name>ListPath</name>\r
+          <state>433MHz Flash Based Updater\List</state>\r
+        </option>\r
+        <option>\r
+          <name>PosIndCode</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Hardware Multiplier</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>GOutputBinary</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AssemblerOnly</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OGDouble</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>GRuntimeLibSelect</name>\r
+          <version>0</version>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>RTDescription</name>\r
+          <state>Use the normal configuration of the C/EC++ runtime library. No locale interface, C locale, no file descriptor support, no multibytes in printf and scanf, and no hex floats in strtod.</state>\r
+        </option>\r
+        <option>\r
+          <name>RTConfigPath</name>\r
+          <state>$TOOLKIT_DIR$\LIB\DLIB\dl430xsfn.h</state>\r
+        </option>\r
+        <option>\r
+          <name>RTLibraryPath</name>\r
+          <state>$TOOLKIT_DIR$\LIB\DLIB\dl430xsfn.r43</state>\r
+        </option>\r
+        <option>\r
+          <name>Input variant</name>\r
+          <version>0</version>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Input description</name>\r
+          <state>No specifier n, no float or long long.</state>\r
+        </option>\r
+        <option>\r
+          <name>Output variant</name>\r
+          <version>0</version>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Output description</name>\r
+          <state>No specifier a or A.</state>\r
+        </option>\r
+        <option>\r
+          <name>GRuntimeLibSelectSlave</name>\r
+          <version>0</version>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OGCore</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>GeneralEnableMisra</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>GeneralMisraVerbose</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OGChipSelectMenu</name>\r
+          <state>CC430F6137    CC430F6137</state>\r
+        </option>\r
+        <option>\r
+          <name>GStackHeapOverride</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>GStackSize2</name>\r
+          <state>256</state>\r
+        </option>\r
+        <option>\r
+          <name>GHeapSize2</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>RadioDataModelType</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>GHeap20Size</name>\r
+          <state>80</state>\r
+        </option>\r
+        <option>\r
+          <name>GeneralMisraRules98</name>\r
+          <version>0</version>\r
+          <state>1000111110110101101110011100111111101110011011000101110111101101100111111111111100110011111001110111001111111111111111111111111</state>\r
+        </option>\r
+        <option>\r
+          <name>RadioHeapSizeType</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>RadioHardwareMultiplierType</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>GeneralMisraVer</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>GeneralMisraRules04</name>\r
+          <version>0</version>\r
+          <state>111101110010111111111000110111111111111111111111111110010111101111010101111111111111111111111111101111111011111001111011111011111111111111111</state>\r
+        </option>\r
+        <option>\r
+          <name>RadioL092ModelType</name>\r
+          <state>0</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>ICC430</name>\r
+      <archiveVersion>4</archiveVersion>\r
+      <data>\r
+        <version>30</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>CCDefines</name>\r
+          <state>ISM_LF</state>\r
+        </option>\r
+        <option>\r
+          <name>CCPreprocFile</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCPreprocComments</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCPreprocLine</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCListCFile</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCListCMnemonics</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCListCMessages</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCListAssFile</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCListAssSource</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCEnableRemarks</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCDiagSuppress</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>CCDiagRemark</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>CCDiagWarning</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>CCDiagError</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>IObjPrefix2</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CCRequirePrototypes</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCAllowList</name>\r
+          <version>1</version>\r
+          <state>11111</state>\r
+        </option>\r
+        <option>\r
+          <name>CCObjUseModuleName</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCObjModuleName</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>CCDebugInfo</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>IProcessor</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCDiagWarnAreErr</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCCharIs</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CCExt</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCMultibyteSupport</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCMigrationPreprocExtentions</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCCompilerRuntimeInfo</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>IDoubleSize</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OutputFile</name>\r
+          <state>$FILE_BNAME$.r43</state>\r
+        </option>\r
+        <option>\r
+          <name>CCLibConfigHeader</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OCCR4Utilize</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OCCR5Utilize</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CPIC</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>IExtraOptionsCheck</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>IExtraOptions</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>PreInclude</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>CCOverrideModuleTypeDefault</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCRadioModuleType</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCRadioModuleTypeSlave</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>newCCIncludePaths</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>CCStdIncCheck</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CompilerMisraOverride</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OI430X</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>ReduceStack</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Save20bit</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CompilerDataModel</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CCOptLevel</name>\r
+          <state>3</state>\r
+        </option>\r
+        <option>\r
+          <name>CCOptStrategy</name>\r
+          <version>0</version>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CCOptLevelSlave</name>\r
+          <state>3</state>\r
+        </option>\r
+        <option>\r
+          <name>CInput</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CompilerMisraRules98</name>\r
+          <version>0</version>\r
+          <state>1000111110110101101110011100111111101110011011000101110111101101100111111111111100110011111001110111001111111111111111111111111</state>\r
+        </option>\r
+        <option>\r
+          <name>CompilerMisraRules04</name>\r
+          <version>0</version>\r
+          <state>111101110010111111111000110111111111111111111111111110010111101111010101111111111111111111111111101111111011111001111011111011111111111111111</state>\r
+        </option>\r
+        <option>\r
+          <name>IccLang</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>IccCDialect</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>IccAllowVLA</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>IccCppDialect</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>IccRelaxedFpPrecision</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCPUTAG</name>\r
+          <state>1</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>A430</name>\r
+      <archiveVersion>4</archiveVersion>\r
+      <data>\r
+        <version>13</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>AObjPrefix</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>ACaseSensitivity</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>MacroChars</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AWarnEnable</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AWarnWhat</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AWarnOne</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>AWarnRange1</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>AWarnRange2</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>ADefines</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>AList</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AListHeader</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>AListing</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Includes</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>MacDefs</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>MacExps</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>MacExec</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OnlyAssed</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>MultiLine</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>PageLengthCheck</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>PageLength</name>\r
+          <state>80</state>\r
+        </option>\r
+        <option>\r
+          <name>TabSpacing</name>\r
+          <state>8</state>\r
+        </option>\r
+        <option>\r
+          <name>AXRef</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AXRefDefines</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AXRefInternal</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AXRefDual</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>ADebug</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>ADebugType</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>IProcessor</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AMaxErrOn</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AMaxErrNum</name>\r
+          <state>100</state>\r
+        </option>\r
+        <option>\r
+          <name>OutputFile</name>\r
+          <state>$FILE_BNAME$.r43</state>\r
+        </option>\r
+        <option>\r
+          <name>AMultibyteSupport</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AExtraOptionsCheck</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AExtraOptions</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>OA1M</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>AIgnoreStdInclude</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AStdIncludes</name>\r
+          <state>$TOOLKIT_DIR$\INC\</state>\r
+        </option>\r
+        <option>\r
+          <name>AUserIncludes</name>\r
+          <state></state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>CUSTOM</name>\r
+      <archiveVersion>3</archiveVersion>\r
+      <data>\r
+        <extensions></extensions>\r
+        <cmdline></cmdline>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>BICOMP</name>\r
+      <archiveVersion>0</archiveVersion>\r
+      <data/>\r
+    </settings>\r
+    <settings>\r
+      <name>BUILDACTION</name>\r
+      <archiveVersion>1</archiveVersion>\r
+      <data>\r
+        <prebuild></prebuild>\r
+        <postbuild></postbuild>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>XLINK</name>\r
+      <archiveVersion>4</archiveVersion>\r
+      <data>\r
+        <version>22</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>XOutOverride</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OutputFile</name>\r
+          <state>flash_based_rfbsl_ism_lf.d43</state>\r
+        </option>\r
+        <option>\r
+          <name>OutputFormat</name>\r
+          <version>11</version>\r
+          <state>33</state>\r
+        </option>\r
+        <option>\r
+          <name>FormatVariant</name>\r
+          <version>8</version>\r
+          <state>2</state>\r
+        </option>\r
+        <option>\r
+          <name>SecondaryOutputFile</name>\r
+          <state>(None for the selected format)</state>\r
+        </option>\r
+        <option>\r
+          <name>XDefines</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>AlwaysOutput</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OverlapWarnings</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>NoGlobalCheck</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>XList</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>SegmentMap</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>ListSymbols</name>\r
+          <state>2</state>\r
+        </option>\r
+        <option>\r
+          <name>PageLengthCheck</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>PageLength</name>\r
+          <state>80</state>\r
+        </option>\r
+        <option>\r
+          <name>XIncludes</name>\r
+          <state>$TOOLKIT_DIR$\LIB\</state>\r
+        </option>\r
+        <option>\r
+          <name>ModuleStatus</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>XclOverride</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>XclFile</name>\r
+          <state>$PROJ_DIR$\flash_based_lnkcc430F6137.xcl</state>\r
+        </option>\r
+        <option>\r
+          <name>XclFileSlave</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>DoFill</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>FillerByte</name>\r
+          <state>0xFF</state>\r
+        </option>\r
+        <option>\r
+          <name>DoCrc</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CrcSize</name>\r
+          <version>0</version>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CrcAlgo</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CrcPoly</name>\r
+          <state>0x11021</state>\r
+        </option>\r
+        <option>\r
+          <name>CrcCompl</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>RangeCheckAlternatives</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>SuppressAllWarn</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>SuppressDiags</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>TreatAsWarn</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>TreatAsErr</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>ModuleLocalSym</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CrcBitOrder</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>XHardwareMul</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>IncludeSuppressed</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>ModuleSummary</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>XlinkStackSize</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>XlinkCodeModel</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>xcProgramEntryLabel</name>\r
+          <state>__program_start</state>\r
+        </option>\r
+        <option>\r
+          <name>DebugInformation</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>RuntimeControl</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>IoEmulation</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>XcRTLibraryFile</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OXLibIOConfig</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>XLibraryHeap</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>AllowExtraOutput</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>GenerateExtraOutput</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>XExtraOutOverride</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>ExtraOutputFile</name>\r
+          <state>flash_based_rfbsl_ism_lf.txt</state>\r
+        </option>\r
+        <option>\r
+          <name>ExtraOutputFormat</name>\r
+          <version>11</version>\r
+          <state>33</state>\r
+        </option>\r
+        <option>\r
+          <name>ExtraFormatVariant</name>\r
+          <version>8</version>\r
+          <state>2</state>\r
+        </option>\r
+        <option>\r
+          <name>xcOverrideProgramEntryLabel</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>xcProgramEntryLabelSelect</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>ListOutputFormat</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>BufferedTermOutput</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>XExtraOptionsCheck</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>XExtraOptions</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>OverlaySystemMap</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>RawBinaryFile</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>RawBinarySymbol</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>RawBinarySegment</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>RawBinaryAlign</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>XLinkMisraHandler</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CrcAlign</name>\r
+          <state>2</state>\r
+        </option>\r
+        <option>\r
+          <name>CrcInitialValue</name>\r
+          <state>0x0</state>\r
+        </option>\r
+        <option>\r
+          <name>XLibraryHeap20</name>\r
+          <state>1</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>XAR</name>\r
+      <archiveVersion>4</archiveVersion>\r
+      <data>\r
+        <version>0</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>XAROutOverride</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>XARInputs</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>OutputFile</name>\r
+          <state></state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>BILINK</name>\r
+      <archiveVersion>0</archiveVersion>\r
+      <data/>\r
+    </settings>\r
+  </configuration>\r
+  <file>\r
+    <name>$PROJ_DIR$\display.c</name>\r
+  </file>\r
+  <file>\r
+    <name>$PROJ_DIR$\display.h</name>\r
+  </file>\r
+  <file>\r
+    <name>$PROJ_DIR$\display1.c</name>\r
+  </file>\r
+  <file>\r
+    <name>$PROJ_DIR$\project_defs.h</name>\r
+  </file>\r
+  <file>\r
+    <name>$PROJ_DIR$\radio.c</name>\r
+  </file>\r
+  <file>\r
+    <name>$PROJ_DIR$\radio.h</name>\r
+  </file>\r
+  <file>\r
+    <name>$PROJ_DIR$\rf1a.c</name>\r
+  </file>\r
+  <file>\r
+    <name>$PROJ_DIR$\rf1a.h</name>\r
+  </file>\r
+  <file>\r
+    <name>$PROJ_DIR$\RFBSL_Low_Level_Init.s43</name>\r
+  </file>\r
+  <file>\r
+    <name>$PROJ_DIR$\wbsl.c</name>\r
+  </file>\r
+  <file>\r
+    <name>$PROJ_DIR$\wbsl.h</name>\r
+  </file>\r
+</project>\r
+\r
+\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Wireless Update/Wireless_Update.eww b/chronos-ti/Software Projects/Chronos Watch/IAR/Wireless Update/Wireless_Update.eww
new file mode 100755 (executable)
index 0000000..8f632ca
--- /dev/null
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="iso-8859-1"?>\r
+\r
+<workspace>\r
+  <project>\r
+    <path>$WS_DIR$\Wireless_Update.ewp</path>\r
+  </project>\r
+  <batchBuild/>\r
+</workspace>\r
+\r
+\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Wireless Update/display.c b/chronos-ti/Software Projects/Chronos Watch/IAR/Wireless Update/display.c
new file mode 100755 (executable)
index 0000000..b505154
--- /dev/null
@@ -0,0 +1,316 @@
+// *************************************************************************************************\r
+//\r
+//     Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//       Redistribution and use in source and binary forms, with or without\r
+//       modification, are permitted provided that the following conditions\r
+//       are met:\r
+//\r
+//         Redistributions of source code must retain the above copyright\r
+//         notice, this list of conditions and the following disclaimer.\r
+//\r
+//         Redistributions in binary form must reproduce the above copyright\r
+//         notice, this list of conditions and the following disclaimer in the\r
+//         documentation and/or other materials provided with the\r
+//         distribution.\r
+//\r
+//         Neither the name of Texas Instruments Incorporated nor the names of\r
+//         its contributors may be used to endorse or promote products derived\r
+//         from this software without specific prior written permission.\r
+//\r
+//       THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//       "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//       LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//       A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//       OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//       SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//       LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//       DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//       THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//       (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//       OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+// Display functions.\r
+// *************************************************************************************************\r
+\r
+\r
+// *************************************************************************************************\r
+// Include section\r
+\r
+// system\r
+#include "project_defs.h"\r
+\r
+#ifdef RAM_BASED_RFBSL\r
+#    include <string.h>\r
+\r
+// driver\r
+#    include "display.h"\r
+\r
+// *************************************************************************************************\r
+// Prototypes section\r
+void write_lcd_mem(u8 * lcdmem, u8 bits, u8 bitmask, u8 state);\r
+void display_symbol(u8 symbol, u8 mode);\r
+void display_char(u8 segment, u8 chr, u8 mode);\r
+void display_chars(u8 line, u8 * str);\r
+\r
+\r
+// *************************************************************************************************\r
+// Defines section\r
+\r
+\r
+\r
+// *************************************************************************************************\r
+// Global Variable section\r
+\r
+// Global return string for itoa function\r
+u8 itoa_str[4];\r
+\r
+// *************************************************************************************************\r
+// @fn          lcd_init\r
+// @brief       Erase LCD memory. Init LCD peripheral.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void lcd_init(void)\r
+{\r
+    // Clear entire display memory\r
+    LCDBMEMCTL |= LCDCLRBM + LCDCLRM;\r
+\r
+    // LCD_FREQ = ACLK/16/8 = 256Hz\r
+    // Frame frequency = 256Hz/4 = 64Hz, LCD mux 4, LCD on\r
+    LCDBCTL0 = (LCDDIV0 + LCDDIV1 + LCDDIV2 + LCDDIV3) | (LCDPRE0 + LCDPRE1) | LCD4MUX | LCDON;\r
+\r
+    // LCB_BLK_FREQ = ACLK/8/4096 = 1Hz\r
+    LCDBBLKCTL = LCDBLKPRE0 | LCDBLKPRE1 | LCDBLKDIV0 | LCDBLKDIV1 | LCDBLKDIV2 | LCDBLKMOD0;\r
+\r
+    // I/O to COM outputs\r
+    P5SEL |= (BIT5 | BIT6 | BIT7);\r
+    P5DIR |= (BIT5 | BIT6 | BIT7);\r
+\r
+    // Activate LCD output\r
+    LCDBPCTL0 = 0xFFFF;                        // Select LCD segments S0-S15\r
+    LCDBPCTL1 = 0x00FF;                        // Select LCD segments S16-S22\r
+\r
+#    ifdef USE_LCD_CHARGE_PUMP\r
+    // Charge pump voltage generated internally, internal bias (V2-V4) generation\r
+    LCDBVCTL = LCDCPEN | VLCD_2_72;\r
+#    endif\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          clear_display\r
+// @brief       Erase LINE1 and LINE2 segments. Keep icons.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void clear_display(void)\r
+{\r
+    display_chars(LINE1, (u8 *)"  ");\r
+    display_chars(LINE2, (u8 *)"      ");\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          write_segment\r
+// @brief       Write to one or multiple LCD segments\r
+// @param       lcdmem         Pointer to LCD byte memory\r
+//             bits            Segments to address\r
+//             bitmask         Bitmask for particular display item\r
+//             mode            On, off or blink segments\r
+// @return\r
+// *************************************************************************************************\r
+void write_lcd_mem(u8 * lcdmem, u8 bits, u8 bitmask, u8 state)\r
+{\r
+    if (state == SEG_ON)\r
+    {\r
+        // Clear segments before writing\r
+        *lcdmem = (u8)(*lcdmem & ~bitmask);\r
+\r
+        // Set visible segments\r
+        *lcdmem = (u8)(*lcdmem | bits);\r
+    }\r
+    else if (state == SEG_OFF)\r
+    {\r
+        // Clear segments\r
+        *lcdmem = (u8)(*lcdmem & ~bitmask);\r
+    }\r
+    else if (state == SEG_ON_BLINK_ON)\r
+    {\r
+        // Clear visible / blink segments before writing\r
+        *lcdmem           = (u8)(*lcdmem & ~bitmask);\r
+        *(lcdmem + 0x20)    = (u8)(*(lcdmem + 0x20) & ~bitmask);\r
+\r
+        // Set visible / blink segments\r
+        *lcdmem           = (u8)(*lcdmem | bits);\r
+        *(lcdmem + 0x20)    = (u8)(*(lcdmem + 0x20) | bits);\r
+    }\r
+    else if (state == SEG_ON_BLINK_OFF)\r
+    {\r
+        // Clear visible segments before writing\r
+        *lcdmem = (u8)(*lcdmem & ~bitmask);\r
+\r
+        // Set visible segments\r
+        *lcdmem = (u8)(*lcdmem | bits);\r
+\r
+        // Clear blink segments\r
+        *(lcdmem + 0x20)    = (u8)(*(lcdmem + 0x20) & ~bitmask);\r
+    }\r
+    else if (state == SEG_OFF_BLINK_OFF)\r
+    {\r
+        // Clear segments\r
+        *lcdmem = (u8)(*lcdmem & ~bitmask);\r
+\r
+        // Clear blink segments\r
+        *(lcdmem + 0x20)    = (u8)(*(lcdmem + 0x20) & ~bitmask);\r
+    }\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          itoa\r
+// @brief       Generic integer to array routine. Converts integer n to string.\r
+//                             Default conversion result has leading zeros, e.g. "01"\r
+//                             Option to convert leading '0' into whitespace (blanks)\r
+// @param       u32 n          integer to convert\r
+//             u8 digits       number of digits\r
+//             u8 blanks       fill up result string with number of whitespaces instead of leading\r
+// zeros\r
+// @return      u8             string\r
+// *************************************************************************************************\r
+u8 *itoa(u32 n, u8 digits, u8 blanks)\r
+{\r
+    // Preset result string\r
+    memcpy(itoa_str, "00", 2);\r
+\r
+    // Return empty string if number of digits is invalid (valid range for digits: 1-7)\r
+    if ((digits == 0) || (digits > 2) || n > 99) return (itoa_str);\r
+\r
+    // Numbers 0 .. 99 can be copied from itoa_conversion_table without conversion\r
+    memcpy(itoa_str, itoa_conversion_table[n] + (2 - digits), digits);\r
+\r
+    return (itoa_str);\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          display_symbol\r
+// @brief       Switch symbol on or off on LCD.\r
+// @param       u8 symbol              A valid LCD symbol (index 0..42)\r
+//             u8 state                SEG_ON, SEG_OFF, SEG_BLINK\r
+// @return      none\r
+// *************************************************************************************************\r
+void display_symbol(u8 symbol, u8 mode)\r
+{\r
+    u8 * lcdmem;\r
+    u8 bits;\r
+    u8 bitmask;\r
+\r
+    if (symbol <= LCD_SEG_L2_DP)\r
+    {\r
+        // Get LCD memory address for symbol from table\r
+        lcdmem    = (u8 *)segments_lcdmem[symbol];\r
+\r
+        // Get bits for symbol from table\r
+        bits      = segments_bitmask[symbol];\r
+\r
+        // Bitmask for symbols equals bits\r
+        bitmask = bits;\r
+\r
+        // Write LCD memory\r
+        write_lcd_mem(lcdmem, bits, bitmask, mode);\r
+    }\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          display_char\r
+// @brief       Write to 7-segment characters.\r
+// @param       u8 segment             A valid LCD segment\r
+//             u8 chr                  Character to display\r
+//             u8 mode         SEG_ON, SEG_OFF, SEG_BLINK\r
+// @return      none\r
+// *************************************************************************************************\r
+void display_char(u8 segment, u8 chr, u8 mode)\r
+{\r
+    u8 * lcdmem;                // Pointer to LCD memory\r
+    u8 bitmask;                 // Bitmask for character\r
+    u8 bits, bits1;             // Bits to write\r
+\r
+    // Write to single 7-segment character\r
+    if ((segment >= LCD_SEG_L1_3) && (segment <= LCD_SEG_L2_DP))\r
+    {\r
+        // Get LCD memory address for segment from table\r
+        lcdmem = (u8 *)segments_lcdmem[segment];\r
+\r
+        // Get bitmask for character from table\r
+        bitmask = segments_bitmask[segment];\r
+\r
+        // Get bits from font set\r
+        if ((chr >= 0x30) && (chr <= 0x5A))\r
+        {\r
+            // Use font set\r
+            bits = lcd_font[chr - 0x30];\r
+        }\r
+        else if (chr == 0x2D)\r
+        {\r
+            // '-' not in font set\r
+            bits = BIT1;\r
+        }\r
+        else\r
+        {\r
+            // Other characters map to ' ' (blank)\r
+            bits = 0;\r
+        }\r
+        // When addressing LINE2 7-segment characters need to swap high- and low-nibble,\r
+        // because LCD COM/SEG assignment is mirrored against LINE1\r
+        if (segment >= LCD_SEG_L2_5)\r
+        {\r
+            bits1 = ((bits << 4) & 0xF0) | ((bits >> 4) & 0x0F);\r
+            bits = bits1;\r
+\r
+            // When addressing LCD_SEG_L2_5, need to convert ASCII '1' and 'L' to 1 bit,\r
+            // because LCD COM/SEG assignment is special for this incomplete character\r
+            if (segment == LCD_SEG_L2_5)\r
+            {\r
+                if ((chr == '1') || (chr == 'L')) bits = BIT7;\r
+            }\r
+        }\r
+\r
+        // Physically write to LCD memory\r
+        write_lcd_mem(lcdmem, bits, bitmask, mode);\r
+    }\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          display_chars\r
+// @brief       Write to consecutive 7-segment characters.\r
+// @param       u8 segments    LCD segment array\r
+//             u8 * str        Pointer to a string\r
+//             u8 mode         SEG_ON, SEG_OFF, SEG_BLINK\r
+// @return      none\r
+// *************************************************************************************************\r
+//void display_chars(u8 segments, u8 * str, u8 mode)\r
+void display_chars(u8 line, u8 * str)\r
+{\r
+    u8 i;\r
+    u8 char_start;                      // Starting point for consecutive write\r
+    u8 length = 0;\r
+\r
+    if (line == LINE2)\r
+    {\r
+        char_start = LCD_SEG_L2_5;\r
+        length = 6;\r
+    }\r
+    else\r
+    {\r
+        char_start = LCD_SEG_L1_1;\r
+        length = 2;\r
+    }\r
+\r
+    // Write consecutive characters\r
+    for (i = 0; i < length; i++)\r
+    {\r
+        // Use single character routine to write display memory\r
+        display_char(char_start + i, *(str + i), SEG_ON);\r
+    }\r
+}\r
+\r
+#endif  // RAM_BASED_RFBSL\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Wireless Update/display.h b/chronos-ti/Software Projects/Chronos Watch/IAR/Wireless Update/display.h
new file mode 100755 (executable)
index 0000000..f17cb1c
--- /dev/null
@@ -0,0 +1,226 @@
+// *************************************************************************************************\r
+//\r
+//     Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//       Redistribution and use in source and binary forms, with or without\r
+//       modification, are permitted provided that the following conditions\r
+//       are met:\r
+//\r
+//         Redistributions of source code must retain the above copyright\r
+//         notice, this list of conditions and the following disclaimer.\r
+//\r
+//         Redistributions in binary form must reproduce the above copyright\r
+//         notice, this list of conditions and the following disclaimer in the\r
+//         documentation and/or other materials provided with the\r
+//         distribution.\r
+//\r
+//         Neither the name of Texas Instruments Incorporated nor the names of\r
+//         its contributors may be used to endorse or promote products derived\r
+//         from this software without specific prior written permission.\r
+//\r
+//       THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//       "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//       LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//       A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//       OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//       SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//       LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//       DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//       THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//       (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//       OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+\r
+#ifndef __DISPLAY_H\r
+#define __DISPLAY_H\r
+\r
+\r
+// *************************************************************************************************\r
+// Include section\r
+\r
+#include "project_defs.h"\r
+\r
+#ifdef RAM_BASED_RFBSL\r
+\r
+// *************************************************************************************************\r
+// Extern section\r
+\r
+// Constants defined in library\r
+extern const u8 lcd_font[];\r
+extern const u8 * segments_lcdmem[];\r
+extern const u8 segments_bitmask[];\r
+extern const u8 itoa_conversion_table[][2];\r
+\r
+\r
+// *************************************************************************************************\r
+// Global Variable section\r
+\r
+// Definitions for line access\r
+#    define LINE1                   (1u)\r
+#    define LINE2                   (2u)\r
+\r
+// LCD display modes\r
+#    define SEG_OFF                 (0u)\r
+#    define SEG_ON                  (1u)\r
+#    define SEG_ON_BLINK_ON         (2u)\r
+#    define SEG_ON_BLINK_OFF        (3u)\r
+#    define SEG_OFF_BLINK_OFF       (4u)\r
+\r
+// 7-segment character bit assignments\r
+#    define SEG_A                   (BIT4)\r
+#    define SEG_B                   (BIT5)\r
+#    define SEG_C                   (BIT6)\r
+#    define SEG_D                   (BIT7)\r
+#    define SEG_E                   (BIT2)\r
+#    define SEG_F                   (BIT0)\r
+#    define SEG_G                   (BIT1)\r
+\r
+// ------------------------------------------\r
+// LCD symbols for easier access\r
+//\r
+// xxx_SEG_xxx          = Seven-segment character (sequence 5-4-3-2-1-0)\r
+// xxx_SYMB_xxx         = Display symbol, e.g. "AM" for ante meridiem\r
+// xxx_UNIT_xxx         = Display unit, e.g. "km/h" for kilometers per hour\r
+// xxx_ICON_xxx         = Display icon, e.g. heart to indicate reception of heart rate data\r
+// xxx_L1_xxx           = Item is part of Line1 information\r
+// xxx_L2_xxx           = Item is part of Line2 information\r
+\r
+// Symbols for Line1\r
+#    define LCD_SYMB_PERCENT                        0\r
+\r
+#    define LCD_ICON_BEEPER1                        1\r
+#    define LCD_ICON_BEEPER2                        2\r
+#    define LCD_ICON_BEEPER3                        3\r
+\r
+// Line1 7-segments\r
+#    define LCD_SEG_L1_3                            4\r
+#    define LCD_SEG_L1_2                            5\r
+#    define LCD_SEG_L1_1                            6\r
+#    define LCD_SEG_L1_0                            7\r
+#    define LCD_SEG_L1_COL                          8\r
+#    define LCD_SEG_L1_DP1                          9\r
+#    define LCD_SEG_L1_DP0                          10\r
+\r
+// Line2 7-segments\r
+#    define LCD_SEG_L2_5                            11\r
+#    define LCD_SEG_L2_4                            12\r
+#    define LCD_SEG_L2_3                            13\r
+#    define LCD_SEG_L2_2                            14\r
+#    define LCD_SEG_L2_1                            15\r
+#    define LCD_SEG_L2_0                            16\r
+#    define LCD_SEG_L2_COL1                         17\r
+#    define LCD_SEG_L2_COL0                         18\r
+#    define LCD_SEG_L2_DP                           19\r
+\r
+\r
+// Line1 7-segment arrays\r
+#    define LCD_SEG_L1_3_0                          70\r
+#    define LCD_SEG_L1_2_0                          71\r
+#    define LCD_SEG_L1_1_0                          72\r
+#    define LCD_SEG_L1_3_1                          73\r
+#    define LCD_SEG_L1_3_2                          74\r
+\r
+// Line2 7-segment arrays\r
+#    define LCD_SEG_L2_5_0                          90\r
+#    define LCD_SEG_L2_4_0                          91\r
+#    define LCD_SEG_L2_3_0                          92\r
+#    define LCD_SEG_L2_2_0                          93\r
+#    define LCD_SEG_L2_1_0                          94\r
+#    define LCD_SEG_L2_5_2                          95\r
+#    define LCD_SEG_L2_3_2                          96\r
+#    define LCD_SEG_L2_5_4                          97\r
+#    define LCD_SEG_L2_4_2                          98\r
+\r
+\r
+// LCD controller memory map\r
+#    define LCD_MEM_1                               ((u8*)0x0A20)\r
+#    define LCD_MEM_2                               ((u8*)0x0A21)\r
+#    define LCD_MEM_3                               ((u8*)0x0A22)\r
+#    define LCD_MEM_4                               ((u8*)0x0A23)\r
+#    define LCD_MEM_5                               ((u8*)0x0A24)\r
+#    define LCD_MEM_6                               ((u8*)0x0A25)\r
+#    define LCD_MEM_7                               ((u8*)0x0A26)\r
+#    define LCD_MEM_8                               ((u8*)0x0A27)\r
+#    define LCD_MEM_9                               ((u8*)0x0A28)\r
+#    define LCD_MEM_10                              ((u8*)0x0A29)\r
+#    define LCD_MEM_11                              ((u8*)0x0A2A)\r
+#    define LCD_MEM_12                              ((u8*)0x0A2B)\r
+\r
+\r
+// Memory assignment\r
+#    define LCD_SEG_L1_0_MEM                        (LCD_MEM_6)\r
+#    define LCD_SEG_L1_1_MEM                        (LCD_MEM_4)\r
+#    define LCD_SEG_L1_2_MEM                        (LCD_MEM_3)\r
+#    define LCD_SEG_L1_3_MEM                        (LCD_MEM_2)\r
+#    define LCD_SEG_L1_COL_MEM                      (LCD_MEM_1)\r
+#    define LCD_SEG_L1_DP1_MEM                      (LCD_MEM_1)\r
+#    define LCD_SEG_L1_DP0_MEM                      (LCD_MEM_5)\r
+#    define LCD_SEG_L2_0_MEM                        (LCD_MEM_8)\r
+#    define LCD_SEG_L2_1_MEM                        (LCD_MEM_9)\r
+#    define LCD_SEG_L2_2_MEM                        (LCD_MEM_10)\r
+#    define LCD_SEG_L2_3_MEM                        (LCD_MEM_11)\r
+#    define LCD_SEG_L2_4_MEM                        (LCD_MEM_12)\r
+#    define LCD_SEG_L2_5_MEM                        (LCD_MEM_12)\r
+#    define LCD_SEG_L2_COL1_MEM                     (LCD_MEM_1)\r
+#    define LCD_SEG_L2_COL0_MEM                     (LCD_MEM_5)\r
+#    define LCD_SEG_L2_DP_MEM                       (LCD_MEM_9)\r
+\r
+#    define LCD_SYMB_PERCENT_MEM            (LCD_MEM_5)\r
+#    define LCD_ICON_BEEPER1_MEM            (LCD_MEM_5)\r
+#    define LCD_ICON_BEEPER2_MEM            (LCD_MEM_6)\r
+#    define LCD_ICON_BEEPER3_MEM            (LCD_MEM_7)\r
+\r
+// Bit masks for write access\r
+#    define LCD_SEG_L1_0_MASK                       (BIT2 + BIT1 + BIT0 + BIT7 + BIT6 + BIT5 + BIT4)\r
+#    define LCD_SEG_L1_1_MASK                       (BIT2 + BIT1 + BIT0 + BIT7 + BIT6 + BIT5 + BIT4)\r
+#    define LCD_SEG_L1_2_MASK                       (BIT2 + BIT1 + BIT0 + BIT7 + BIT6 + BIT5 + BIT4)\r
+#    define LCD_SEG_L1_3_MASK                       (BIT2 + BIT1 + BIT0 + BIT7 + BIT6 + BIT5 + BIT4)\r
+#    define LCD_SEG_L1_COL_MASK                     (BIT5)\r
+#    define LCD_SEG_L1_DP1_MASK                     (BIT6)\r
+#    define LCD_SEG_L1_DP0_MASK                     (BIT2)\r
+#    define LCD_SEG_L2_0_MASK                       (BIT3 + BIT2 + BIT1 + BIT0 + BIT6 + BIT5 + BIT4)\r
+#    define LCD_SEG_L2_1_MASK                       (BIT3 + BIT2 + BIT1 + BIT0 + BIT6 + BIT5 + BIT4)\r
+#    define LCD_SEG_L2_2_MASK                       (BIT3 + BIT2 + BIT1 + BIT0 + BIT6 + BIT5 + BIT4)\r
+#    define LCD_SEG_L2_3_MASK                       (BIT3 + BIT2 + BIT1 + BIT0 + BIT6 + BIT5 + BIT4)\r
+#    define LCD_SEG_L2_4_MASK                       (BIT3 + BIT2 + BIT1 + BIT0 + BIT6 + BIT5 + BIT4)\r
+#    define LCD_SEG_L2_5_MASK                       (BIT7)\r
+#    define LCD_SEG_L2_COL1_MASK            (BIT4)\r
+#    define LCD_SEG_L2_COL0_MASK            (BIT0)\r
+#    define LCD_SEG_L2_DP_MASK                      (BIT7)\r
+\r
+#    define LCD_SYMB_PERCENT_MASK           (BIT4)\r
+#    define LCD_ICON_BEEPER1_MASK           (BIT3)\r
+#    define LCD_ICON_BEEPER2_MASK           (BIT3)\r
+#    define LCD_ICON_BEEPER3_MASK           (BIT3)\r
+\r
+#    define LCD_DISPLAY_DONE            (1u)\r
+#    define LCD_DISPLAY_RFBSL           (2u)\r
+#    define LCD_DISPLAY_FAIL            (3u)\r
+\r
+// *************************************************************************************************\r
+// API section\r
+\r
+// Physical LCD memory write\r
+extern void write_lcd_mem(u8 * lcdmem, u8 bits, u8 bitmask, u8 state);\r
+\r
+// Display init / clear\r
+extern void lcd_init(void);\r
+extern void clear_display(void);\r
+\r
+\r
+// Character / symbol draw functions\r
+extern void display_char(u8 segment, u8 chr, u8 mode);\r
+extern void display_chars(u8 line, u8 * str);\r
+extern void display_symbol(u8 symbol, u8 mode);\r
+\r
+// Integer to string conversion\r
+extern u8 *itoa(u32 n, u8 digits, u8 blanks);\r
+\r
+// Segment index helper function\r
+extern u8 switch_seg(u8 line, u8 index1, u8 index2);\r
+\r
+#endif // RAM_BASED_RFBSL\r
+\r
+#endif // __DISPLAY_\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Wireless Update/display1.c b/chronos-ti/Software Projects/Chronos Watch/IAR/Wireless Update/display1.c
new file mode 100755 (executable)
index 0000000..a29da5e
--- /dev/null
@@ -0,0 +1,174 @@
+// *************************************************************************************************\r
+//\r
+//     Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//       Redistribution and use in source and binary forms, with or without\r
+//       modification, are permitted provided that the following conditions\r
+//       are met:\r
+//\r
+//         Redistributions of source code must retain the above copyright\r
+//         notice, this list of conditions and the following disclaimer.\r
+//\r
+//         Redistributions in binary form must reproduce the above copyright\r
+//         notice, this list of conditions and the following disclaimer in the\r
+//         documentation and/or other materials provided with the\r
+//         distribution.\r
+//\r
+//         Neither the name of Texas Instruments Incorporated nor the names of\r
+//         its contributors may be used to endorse or promote products derived\r
+//         from this software without specific prior written permission.\r
+//\r
+//       THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//       "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//       LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//       A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//       OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//       SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//       LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//       DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//       THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//       (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//       OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+// Basic display functions.\r
+// *************************************************************************************************\r
+\r
+\r
+// *************************************************************************************************\r
+// Include section\r
+// system\r
+#include "project_defs.h"\r
+\r
+#ifdef RAM_BASED_RFBSL\r
+\r
+\r
+// driver\r
+#    include "display.h"\r
+\r
+\r
+// *************************************************************************************************\r
+// Prototypes section\r
+\r
+\r
+// *************************************************************************************************\r
+// Defines section\r
+\r
+// *************************************************************************************************\r
+// Global Variable section\r
+\r
+// Table with memory bit assignment for digits "0" to "9" and characters "A" to "Z"\r
+const u8 lcd_font[] =\r
+{\r
+    SEG_A + SEG_B + SEG_C + SEG_D + SEG_E + SEG_F,         // Displays "0"\r
+    SEG_B + SEG_C,                                         // Displays "1"\r
+    SEG_A + SEG_B +      SEG_D + SEG_E +      SEG_G,       // Displays "2"\r
+    SEG_A + SEG_B + SEG_C + SEG_D +            SEG_G,      // Displays "3"\r
+    SEG_B + SEG_C +            SEG_F + SEG_G,              // Displays "4"\r
+    SEG_A +      SEG_C + SEG_D +      SEG_F + SEG_G,       // Displays "5"\r
+    SEG_A +      SEG_C + SEG_D + SEG_E + SEG_F + SEG_G,    // Displays "6"\r
+    SEG_A + SEG_B + SEG_C,                                 // Displays "7"\r
+    SEG_A + SEG_B + SEG_C + SEG_D + SEG_E + SEG_F + SEG_G, // Displays "8"\r
+    SEG_A + SEG_B + SEG_C + SEG_D +      SEG_F + SEG_G,    // Displays "9"\r
+    0,                                                     // Displays " "\r
+    0,                                                     // Displays " "\r
+    0,                                                     // Displays " "\r
+    0,                                                     // Displays " "\r
+    0,                                                     // Displays " "\r
+    SEG_D + SEG_E +       SEG_G,                           // Displays "c"\r
+    0,                                                     // Displays " "\r
+    SEG_A + SEG_B + SEG_C +      SEG_E + SEG_F + SEG_G,    // Displays "A"\r
+    SEG_C + SEG_D + SEG_E + SEG_F + SEG_G,                 // Displays "b"\r
+    SEG_A +            SEG_D + SEG_E + SEG_F,              // Displays "C"\r
+    SEG_B + SEG_C + SEG_D + SEG_E +      SEG_G,            // Displays "d"\r
+    SEG_A +           +SEG_D + SEG_E + SEG_F + SEG_G,      // Displays "E"\r
+    SEG_A +                  SEG_E + SEG_F + SEG_G,        // Displays "F"\r
+    //  SEG_A+      SEG_C+SEG_D+SEG_E+SEG_F+SEG_G,     // Displays "G"\r
+    SEG_A + SEG_B + SEG_C + SEG_D +      SEG_F + SEG_G,    // Displays "g"\r
+    SEG_B + SEG_C +      SEG_E + SEG_F + SEG_G,            // Displays "H"\r
+    SEG_E + SEG_F,                                         // Displays "I"\r
+    SEG_A + SEG_B + SEG_C + SEG_D,                         // Displays "J"\r
+    //                  SEG_B+SEG_C+      SEG_E+SEG_F+SEG_G,     // Displays "k"\r
+    SEG_D + SEG_E + SEG_F + SEG_G,                         // Displays "k"\r
+    SEG_D + SEG_E + SEG_F,                                 // Displays "L"\r
+    SEG_A + SEG_B + SEG_C +      SEG_E + SEG_F,            // Displays "M"\r
+    SEG_C +      SEG_E +      SEG_G,                       // Displays "n"\r
+    SEG_C + SEG_D + SEG_E +      SEG_G,                    // Displays "o"\r
+    SEG_A + SEG_B +            SEG_E + SEG_F + SEG_G,      // Displays "P"\r
+    SEG_A + SEG_B + SEG_C + SEG_D + SEG_E + SEG_F,         // Displays "Q"\r
+    SEG_E +      SEG_G,                                    // Displays "r"\r
+    SEG_A +      SEG_C + SEG_D +      SEG_F + SEG_G,       // Displays "S"\r
+    SEG_D + SEG_E + SEG_F + SEG_G,                         // Displays "t"\r
+    SEG_C + SEG_D + SEG_E,                                 // Displays "u"\r
+    SEG_C + SEG_D + SEG_E,                                 // Displays "u"\r
+    SEG_G,                                                 // Displays "-"\r
+    SEG_B + SEG_C +     +SEG_E + SEG_F + SEG_G,            // Displays "X"\r
+    SEG_B + SEG_C + SEG_D +      SEG_F + SEG_G,            // Displays "Y"\r
+    SEG_A + SEG_B +      SEG_D + SEG_E +      SEG_G,       // Displays "Z"\r
+};\r
+\r
+\r
+// Table with memory address for each display element\r
+const u8 * segments_lcdmem[] =\r
+{\r
+    LCD_SYMB_PERCENT_MEM,\r
+    LCD_ICON_BEEPER1_MEM,\r
+    LCD_ICON_BEEPER2_MEM,\r
+    LCD_ICON_BEEPER3_MEM,\r
+    LCD_SEG_L1_3_MEM,\r
+    LCD_SEG_L1_2_MEM,\r
+    LCD_SEG_L1_1_MEM,\r
+    LCD_SEG_L1_0_MEM,\r
+    LCD_SEG_L1_COL_MEM,\r
+    LCD_SEG_L1_DP1_MEM,\r
+    LCD_SEG_L1_DP0_MEM,\r
+    LCD_SEG_L2_5_MEM,\r
+    LCD_SEG_L2_4_MEM,\r
+    LCD_SEG_L2_3_MEM,\r
+    LCD_SEG_L2_2_MEM,\r
+    LCD_SEG_L2_1_MEM,\r
+    LCD_SEG_L2_0_MEM,\r
+    LCD_SEG_L2_COL1_MEM,\r
+    LCD_SEG_L2_COL0_MEM,\r
+    LCD_SEG_L2_DP_MEM,\r
+};\r
+\r
+// Table with bit mask for each display element\r
+const u8 segments_bitmask[] =\r
+{\r
+    LCD_SYMB_PERCENT_MASK,\r
+    LCD_ICON_BEEPER1_MASK,\r
+    LCD_ICON_BEEPER2_MASK,\r
+    LCD_ICON_BEEPER3_MASK,\r
+    LCD_SEG_L1_3_MASK,\r
+    LCD_SEG_L1_2_MASK,\r
+    LCD_SEG_L1_1_MASK,\r
+    LCD_SEG_L1_0_MASK,\r
+    LCD_SEG_L1_COL_MASK,\r
+    LCD_SEG_L1_DP1_MASK,\r
+    LCD_SEG_L1_DP0_MASK,\r
+    LCD_SEG_L2_5_MASK,\r
+    LCD_SEG_L2_4_MASK,\r
+    LCD_SEG_L2_3_MASK,\r
+    LCD_SEG_L2_2_MASK,\r
+    LCD_SEG_L2_1_MASK,\r
+    LCD_SEG_L2_0_MASK,\r
+    LCD_SEG_L2_COL1_MASK,\r
+    LCD_SEG_L2_COL0_MASK,\r
+    LCD_SEG_L2_DP_MASK,\r
+};\r
+\r
+// Quick integer to array conversion table for most common integer values\r
+const u8 itoa_conversion_table[][2] =\r
+{\r
+    "00", "01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12", "13", "14", "15",\r
+    "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "30", "31",\r
+    "32", "33", "34", "35", "36", "37", "38", "39", "40", "41", "42", "43", "44", "45", "46", "47",\r
+    "48", "49", "50", "51", "52", "53", "54", "55", "56", "57", "58", "59", "60", "61", "62", "63",\r
+    "64", "65", "66", "67", "68", "69", "70", "71", "72", "73", "74", "75", "76", "77", "78", "79",\r
+    "80", "81", "82", "83", "84", "85", "86", "87", "88", "89", "90", "91", "92", "93", "94", "95",\r
+    "96", "97", "98", "99",\r
+};\r
+\r
+#endif //RAM_BASED_RFBSL\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Wireless Update/flash_based_lnkcc430F6137.xcl b/chronos-ti/Software Projects/Chronos Watch/IAR/Wireless Update/flash_based_lnkcc430F6137.xcl
new file mode 100755 (executable)
index 0000000..b12b0ab
--- /dev/null
@@ -0,0 +1,161 @@
+//*****************************************************************\r
+//\r
+// XLINK command file for IAR Embedded Workbench for MSP430.\r
+//\r
+// This file should be used with the CC430F6137 microprocessor.\r
+//\r
+// Copyright 1996-2007 IAR Systems. All rights reserved.\r
+//\r
+// Usage:  xlink your_file(s) -f lnkcc430f6137 library\r
+//\r
+// $Revision: 1.30 $\r
+//\r
+//*****************************************************************\r
+\r
+//*****************************************************************\r
+//\r
+// The memory areas of the CC430F6137 microprocessor:\r
+//\r
+//   Peripheral units:                0 - 01FF\r
+//\r
+//   Information memory (FLASH):   1800 - 19FF\r
+//\r
+//   Read-write memory (RAM):      1C00 - 2BFD\r
+//\r
+//   Read-only memory (FLASH):     8000 - FF7F\r
+//                                 \r
+//\r
+//*****************************************************************\r
+\r
+//*****************************************************************\r
+//\r
+// The following segments are defined in this linker command file:\r
+//\r
+// Data read/write segments (RAM)\r
+// ==============================\r
+//\r
+// segment     Restrictions    Usage\r
+// -------     ------------    --------------------------\r
+// DATA16_I    < 10000         Data16 initialized variables\r
+// DATA16_Z    < 10000         Data16 zero initialized variables\r
+// DATA16_N    < 10000         Data16 uninitialized variables\r
+// DATA16_HEAP < 10000         Data16 heap used by malloc and free\r
+// DATA20_I                    Data20 initialized variables\r
+// DATA20_Z                    Data20 zero initialized variables\r
+// DATA20_N                    Data20 uninitialized variables\r
+// DATA20_HEAP                 Data20 heap used by malloc and free\r
+// CSTACK      < 10000         Runtime stack\r
+//\r
+//\r
+// Program and data read-only segments (FLASH)\r
+// ===========================================\r
+//\r
+// segment     Restrictions    Usage\r
+// -------     ------------    --------------------------\r
+// INFO                        Information memory\r
+// CSTART      < 10000         Program startup code\r
+// CODE                        Program code\r
+// ISR_CODE    < 10000         Program code for interrupt service routines\r
+// DATA16_C    < 10000         Data16 constant data and string literals\r
+// DATA16_ID   < 10000         Data16 initializers for DATA16_I\r
+// DATA20_C                    Data20 constant data and string literals\r
+// DATA20_ID                   Data20 initializers for DATA20_I\r
+// DIFUNCT     < 10000         Dynamic initialization vector used by C++\r
+// CHECKSUM                    Checksum byte(s) generated by the -J option\r
+// INTVEC      FF80-FFFF       Interrupt vectors\r
+// RESET       FFFE-FFFF       The reset vector\r
+//\r
+//*****************************************************************\r
+\r
+\r
+// ---------------------------------------------------------\r
+// Stack and heap sizes.\r
+// ---------------------------------------------------------\r
+\r
+// Uncomment for command line use\r
+//-D_STACK_SIZE=80\r
+//-D_DATA16_HEAP_SIZE=80\r
+\r
+\r
+// ---------------------------------------------------------\r
+// Define cpu.\r
+// ---------------------------------------------------------\r
+\r
+-cmsp430\r
+\r
+\r
+// ---------------------------------------------------------\r
+// Read-write memory.\r
+// ---------------------------------------------------------\r
+\r
+-Z(DATA)DATA16_I,DATA16_Z,DATA16_N,DATA16_HEAP+_DATA16_HEAP_SIZE=1C00-2B79\r
+-Z(DATA)CSTACK+_STACK_SIZE#\r
+\r
+-Z(DATA)RAM_INTERRUPT_VECTOR=2B80-2BFF\r
+\r
+\r
+// ---------------------------------------------------------\r
+// Read only memory\r
+\r
+\r
+// ---------------------------------------------------------\r
+// Information memory\r
+// ---------------------------------------------------------\r
+\r
+-Z(CODE)INFO=1800-19FF\r
+-Z(CODE)INFOA=1980-19FF\r
+-Z(CODE)INFOB=1900-197F\r
+-Z(CODE)INFOC=1880-18FF\r
+-Z(CODE)INFOD=1800-187F\r
+\r
+// -------------------------------------------------------------------\r
+//  BSL Memory\r
+// -------------------------------------------------------------------\r
+-Z(CODE)ZAREA=1000-1005\r
+-Z(CODE)ZAREA_CODE=1006-102F\r
+-Z(CODE)BSL0=1006-11FF\r
+-Z(CODE)BSL1=1200-13FF\r
+-Z(CODE)BSL2=1400-15FF\r
+-Z(CODE)BSL3=1600-17EF\r
+\r
+\r
+// ---------------------------------------------------------\r
+// Code\r
+// ---------------------------------------------------------\r
+\r
+-Z(CODE)CSTART,ISR_CODE=1020-17EF\r
+\r
+// ---------------------------------------------------------\r
+// Constant data\r
+// ---------------------------------------------------------\r
+\r
+-Z(CONST)DATA16_C,DATA16_ID,DIFUNCT,CHECKSUM=1020-17EF\r
+\r
+\r
+// ---------------------------------------------------------\r
+// Code\r
+// ---------------------------------------------------------\r
+-P(CODE)CODE=1006-17EF\r
+\r
+\r
+// ---------------------------------------------------------\r
+// Interrupt vectors\r
+// ---------------------------------------------------------\r
+-Z(CODE)INTVEC=FF80-FFFF\r
+-Z(CODE)RESET=FFD8-FFD9\r
+\r
+-Z(CONST)BSLSIG=0x17F0-17FB\r
+  //  contains:\r
+  //  BSL Start Vector             \r
+  //  BSL Unlock Function Vector   \r
+  //  BSL Unlock Signature 1       \r
+  //  BSL Unlock Signature 2       \r
+\r
+-Z(CONST)JTAGLOCK_KEY=0x17FC-17FF\r
+  //  if it contains:\r
+  //  0x0000 0x0000 or\r
+  //  0xFFFF 0xFFFF the JTAG will be unlocked otherwise JTAG is locked\r
+\r
+// ---------------------------------------------------------\r
+// The end\r
+// ---------------------------------------------------------\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Wireless Update/project_defs.h b/chronos-ti/Software Projects/Chronos Watch/IAR/Wireless Update/project_defs.h
new file mode 100755 (executable)
index 0000000..a495a8a
--- /dev/null
@@ -0,0 +1,35 @@
+#ifndef PROJECT_DEFS_H_\r
+#define PROJECT_DEFS_H_\r
+\r
+#include <cc430x613x.h>\r
+\r
+#define u8 unsigned char\r
+#define u16 unsigned int\r
+#define u32 unsigned long int\r
+\r
+// Conversion from usec to ACLK timer ticks\r
+#define CONV_US_TO_TICKS(usec)                          (((usec) * 32768) / 1000000)\r
+\r
+// Conversion from msec to ACLK timer ticks\r
+#define CONV_MS_TO_TICKS(msec)                          (((msec) * 32768) / 1000)\r
+\r
+#define st(x)                                           do { x } while (__LINE__ == -1)\r
+#define ENTER_CRITICAL_SECTION(x)                       st( \\r
+        x = __get_interrupt_state(); __disable_interrupt(); )\r
+#define EXIT_CRITICAL_SECTION(x)                        __set_interrupt_state(x)\r
+\r
+#define BV(x)                                           (1 << (x))\r
+\r
+// Use CCA to sense the traffic before transmitting\r
+#define CCA\r
+\r
+\r
+// This Macro is defined of undefined using the active configuration of CCS, if not implemented this\r
+// way define it here\r
+//#define RAM_BASED_RFBSL\r
+\r
+// Testing\r
+//#define TESTING_INTERRUPT_CATCHER\r
+\r
+\r
+#endif /*PROJECT_DEFS_H_*/\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Wireless Update/radio.c b/chronos-ti/Software Projects/Chronos Watch/IAR/Wireless Update/radio.c
new file mode 100755 (executable)
index 0000000..f0ef0c0
--- /dev/null
@@ -0,0 +1,191 @@
+// *************************************************************************************************\r
+//\r
+//     Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//       Redistribution and use in source and binary forms, with or without\r
+//       modification, are permitted provided that the following conditions\r
+//       are met:\r
+//\r
+//         Redistributions of source code must retain the above copyright\r
+//         notice, this list of conditions and the following disclaimer.\r
+//\r
+//         Redistributions in binary form must reproduce the above copyright\r
+//         notice, this list of conditions and the following disclaimer in the\r
+//         documentation and/or other materials provided with the\r
+//         distribution.\r
+//\r
+//         Neither the name of Texas Instruments Incorporated nor the names of\r
+//         its contributors may be used to endorse or promote products derived\r
+//         from this software without specific prior written permission.\r
+//\r
+//       THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//       "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//       LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//       A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//       OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//       SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//       LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//       DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//       THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//       (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//       OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+// Radio core access functions. Taken from TI reference code for CC430.\r
+// *************************************************************************************************\r
+\r
+// system\r
+#include "project_defs.h"\r
+\r
+// driver\r
+#include "rf1a.h"\r
+#include "radio.h"\r
+\r
+// logic\r
+#include "wbsl.h"\r
+\r
+\r
+//RF Test Values\r
+const u8 RF1A_REG_SMARTRF_SETTING[][2] =\r
+{\r
+    /* internal radio configuration */\r
+    {  IOCFG0,    SMARTRF_SETTING_IOCFG0    }, /* Configure GDO_0 to output PA_PD signal (low during\r
+                                                *TX, high otherwise). */\r
+    {  IOCFG1,    SMARTRF_SETTING_IOCFG1    }, /* Configure GDO_1 to output RSSI_VALID signal (high\r
+                                                *when RSSI is valid, low otherwise). */\r
+    {  IOCFG2,    SMARTRF_SETTING_IOCFG2    },\r
+    {  MCSM2,     SMARTRF_SETTING_MCSM2     },\r
+    {  MCSM1,     SMARTRF_SETTING_MCSM1     }, /* CCA mode, RX_OFF_MODE and TX_OFF_MODE */\r
+    {  MCSM0,     SMARTRF_SETTING_MCSM0     }, /* AUTO_CAL and XOSC state in sleep */\r
+    {  SYNC1,     0xD3                      },\r
+    {  SYNC0,     0x91                      },\r
+    {  PKTLEN,    SMARTRF_SETTING_PKTLEN    },\r
+    {  PKTCTRL1,  SMARTRF_SETTING_PKTCTRL1  },\r
+    {  PKTCTRL0,  SMARTRF_SETTING_PKTCTRL0  },\r
+    {  ADDR,      SMARTRF_SETTING_ADDR      },\r
+    {  FIFOTHR,   SMARTRF_SETTING_FIFOTHR   },\r
+    {  WOREVT1,   SMARTRF_SETTING_WOREVT1   },\r
+    {  WOREVT0,   SMARTRF_SETTING_WOREVT0   },\r
+    {  WORCTRL,    SMARTRF_SETTING_WORCTL    },\r
+    /* imported SmartRF radio configuration */\r
+    {  CHANNR,    SMARTRF_SETTING_CHANNR    },\r
+    {  FSCTRL1,   SMARTRF_SETTING_FSCTRL1   },\r
+    {  FSCTRL0,   SMARTRF_SETTING_FSCTRL0   },\r
+    {  FREQ2,     SMARTRF_SETTING_FREQ2     },\r
+    {  FREQ1,     SMARTRF_SETTING_FREQ1     },\r
+    {  FREQ0,     SMARTRF_SETTING_FREQ0     },\r
+    {  MDMCFG4,   SMARTRF_SETTING_MDMCFG4   },\r
+    {  MDMCFG3,   SMARTRF_SETTING_MDMCFG3   },\r
+    {  MDMCFG2,   SMARTRF_SETTING_MDMCFG2   },\r
+    {  MDMCFG1,   SMARTRF_SETTING_MDMCFG1   },\r
+    {  MDMCFG0,   SMARTRF_SETTING_MDMCFG0   },\r
+    {  DEVIATN,   SMARTRF_SETTING_DEVIATN   },\r
+\r
+    {  FOCCFG,    SMARTRF_SETTING_FOCCFG    },\r
+    {  BSCFG,     SMARTRF_SETTING_BSCFG     },\r
+    {  AGCCTRL2,  SMARTRF_SETTING_AGCCTRL2  },\r
+    {  AGCCTRL1,  SMARTRF_SETTING_AGCCTRL1  },\r
+    {  AGCCTRL0,  SMARTRF_SETTING_AGCCTRL0  },\r
+    {  FREND1,    SMARTRF_SETTING_FREND1    },\r
+    {  FREND0,    SMARTRF_SETTING_FREND0    },\r
+    {  FSCAL3,    SMARTRF_SETTING_FSCAL3    },\r
+    {  FSCAL2,    SMARTRF_SETTING_FSCAL2    },\r
+    {  FSCAL1,    SMARTRF_SETTING_FSCAL1    },\r
+    {  FSCAL0,    SMARTRF_SETTING_FSCAL0    },\r
+    {  AGCTEST,   SMARTRF_SETTING_AGCTEST   },\r
+    {  PTEST,     SMARTRF_SETTING_PTEST     },\r
+    {  FSTEST,    SMARTRF_SETTING_FSTEST    },\r
+    {  TEST2,     SMARTRF_SETTING_TEST2     },\r
+    {  TEST1,     SMARTRF_SETTING_TEST1     },\r
+    {  TEST0,     SMARTRF_SETTING_TEST0     },\r
+};\r
+// *************************************************************************************************\r
+// @fn          radio_reset\r
+// @brief       Reset radio core.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void radio_reset(void)\r
+{\r
+    volatile u16 i;\r
+    u8 x;\r
+\r
+    // Clear any radio pending interrupt\r
+    RF1AIFG = 0;\r
+\r
+    // Reset radio core\r
+    Strobe(RF_SRES);\r
+    // Wait before checking IDLE\r
+    for (i = 0; i < 100; i++) ;\r
+\r
+    do {\r
+        x = Strobe(RF_SIDLE);\r
+    } while ((x & 0x70) != 0x00);\r
+\r
+    // Clear radio error register\r
+    RF1AIFERR = 0;\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          WriteSmartRFReg\r
+// @brief       Writes all the Radio Settings to the Radio module\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void WriteSmartRFReg(const u8 SmartRFSetting[][2], u8 size)\r
+{\r
+    u8 i;\r
+\r
+    for (i = 0; i < (size); i++)\r
+        WriteSingleReg(SmartRFSetting[i][0], SmartRFSetting[i][1]);\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          config_radio_wbsl\r
+// @brief       Configure the RF Module to start the WBSL Process\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void config_radio_wbsl(void)\r
+{\r
+    WritePATable(WBSL_SETTING_PATABLE);\r
+    WriteSmartRFReg(RF1A_REG_SMARTRF_SETTING, sizeof(RF1A_REG_SMARTRF_SETTING) / 2);\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          ReceiveOn\r
+// @brief       Put Radio in RX Mode\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void ReceiveOn(void)\r
+{\r
+    RF1AIFG = 0; //&= ~BIT9;                         // Clear a pending interrupt\r
+    // Update Mode Flag\r
+    wbslMode_flag = WBSL_RX_MODE;\r
+    Strobe(RF_SRX);\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          ReceiveOff\r
+// @brief       Put Radio in Idle Mode\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void ReceiveOff(void)\r
+{\r
+    u8 x;\r
+\r
+    // Update Mode Flag\r
+    wbslMode_flag = WBSL_IDLE_MODE;\r
+    do {\r
+        x = Strobe(RF_SIDLE);\r
+    } while (x & 0x70);\r
+    /* Wait for XOSC to be stable and radio in IDLE state */\r
+\r
+    Strobe(RF_SFRX);      /* Flush the receive FIFO of any residual data */\r
+\r
+    RF1AIFG = 0;          // Clear pending IFG\r
+}\r
+\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Wireless Update/radio.h b/chronos-ti/Software Projects/Chronos Watch/IAR/Wireless Update/radio.h
new file mode 100755 (executable)
index 0000000..6f9d0e2
--- /dev/null
@@ -0,0 +1,150 @@
+// *************************************************************************************************\r
+//\r
+//     Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/ \r
+//      \r
+//      \r
+//       Redistribution and use in source and binary forms, with or without \r
+//       modification, are permitted provided that the following conditions \r
+//       are met:\r
+//     \r
+//         Redistributions of source code must retain the above copyright \r
+//         notice, this list of conditions and the following disclaimer.\r
+//      \r
+//         Redistributions in binary form must reproduce the above copyright\r
+//         notice, this list of conditions and the following disclaimer in the \r
+//         documentation and/or other materials provided with the   \r
+//         distribution.\r
+//      \r
+//         Neither the name of Texas Instruments Incorporated nor the names of\r
+//         its contributors may be used to endorse or promote products derived\r
+//         from this software without specific prior written permission.\r
+//     \r
+//       THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \r
+//       "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT \r
+//       LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//       A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT \r
+//       OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, \r
+//       SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT \r
+//       LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//       DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//       THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT \r
+//       (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE \r
+//       OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+\r
+#ifndef RADIO_H_\r
+#define RADIO_H_\r
+\r
+#define SMARTRF_RADIO_CC430\r
+\r
+#define SMARTRF_SETTING_FSCTRL1    0x0C //\r
+#define SMARTRF_SETTING_FSCTRL0    0x00 //\r
+\r
+\r
+#ifdef ISM_EU\r
+/*   #define SMARTRF_SETTING_FREQ2      0x21 // 868 Mhz\r
+   #define SMARTRF_SETTING_FREQ1      0x62 //\r
+   #define SMARTRF_SETTING_FREQ0      0x76 //\r
+   #define SMARTRF_SETTING_CHANNR     0    //\r
+   #define WBSL_SETTING_PATABLE       0x8C //\r
+*/\r
+   #define SMARTRF_SETTING_FREQ2      0x21 // 869.525 Mhz\r
+   #define SMARTRF_SETTING_FREQ1      0x71 //\r
+   #define SMARTRF_SETTING_FREQ0      0x7A //\r
+   #define SMARTRF_SETTING_CHANNR     0    //\r
+   #define WBSL_SETTING_PATABLE       0x8C //\r
+\r
+#else\r
+  #ifdef ISM_US  \r
+/*   #define SMARTRF_SETTING_FREQ2      0x23 // 915 Mhz\r
+   #define SMARTRF_SETTING_FREQ1      0x31 //\r
+   #define SMARTRF_SETTING_FREQ0      0x3B //\r
+   #define SMARTRF_SETTING_CHANNR     20   //\r
+   #define WBSL_SETTING_PATABLE       0x8B //\r
+*/\r
+   #define SMARTRF_SETTING_FREQ2      0x22 // 902 Mhz --> 906 MHz (CHANNR = 20)\r
+   #define SMARTRF_SETTING_FREQ1      0xB1 //\r
+   #define SMARTRF_SETTING_FREQ0      0x3B //\r
+   #define SMARTRF_SETTING_CHANNR     20   //\r
+   #define WBSL_SETTING_PATABLE       0x8B //\r
+\r
+  #else\r
+    #ifdef ISM_LF\r
+          // 433.92MHz\r
+           #define SMARTRF_SETTING_FREQ2      0x10\r
+           #define SMARTRF_SETTING_FREQ1      0xB0\r
+           #define SMARTRF_SETTING_FREQ0      0x71\r
+            #define SMARTRF_SETTING_CHANNR     0 \r
+            #define WBSL_SETTING_PATABLE       0x8D\r
+\r
+      #else\r
+      #ifdef RAM_BASED_RFBSL  // We don't need these values on the RAM_BASED_RFBSL, but need to define STUBS to make it compile\r
+        #define SMARTRF_SETTING_FREQ2      0x00 //\r
+        #define SMARTRF_SETTING_FREQ1      0x00 //\r
+        #define SMARTRF_SETTING_FREQ0      0x00 //\r
+        #define SMARTRF_SETTING_CHANNR     0x00 //\r
+        #define WBSL_SETTING_PATABLE       0x00 //\r
+      #else\r
+        #error "Wrong ISM band specified (valid are ISM_LF, ISM_EU and ISM_US)"\r
+      #endif // RAM_BASED_RFBSL\r
+    #endif // ISM_LF\r
+  #endif // ISM_US\r
+#endif // ISM_EU\r
+\r
+\r
+#define SMARTRF_SETTING_MDMCFG4    0x2D //\r
+#define SMARTRF_SETTING_MDMCFG3    0x3B //\r
+#define SMARTRF_SETTING_MDMCFG2    0x13 //\r
+#define SMARTRF_SETTING_MDMCFG1    0x22 //\r
+#define SMARTRF_SETTING_MDMCFG0    0xF8 //\r
+\r
+\r
+\r
+#define SMARTRF_SETTING_DEVIATN    0x62 //\r
+#define SMARTRF_SETTING_FREND1     0xB6 // \r
+#define SMARTRF_SETTING_FREND0     0x10 //\r
+#define SMARTRF_SETTING_MCSM0      0x18 // \r
+#define SMARTRF_SETTING_MCSM1      0x3C // \r
+#define SMARTRF_SETTING_MCSM2      0x07 //\r
+#define SMARTRF_SETTING_WOREVT1    0x87 //\r
+#define SMARTRF_SETTING_WOREVT0    0x6B //  \r
+#define SMARTRF_SETTING_WORCTL     0xF8  /* Note: WOR not supported on CC430 */   \r
+#define SMARTRF_SETTING_FOCCFG     0x1D //\r
+#define SMARTRF_SETTING_BSCFG      0x1C //\r
+#define SMARTRF_SETTING_AGCCTRL2   0xC7 //\r
+#define SMARTRF_SETTING_AGCCTRL1   0x00 //\r
+#define SMARTRF_SETTING_AGCCTRL0   0xB0 //\r
+#define SMARTRF_SETTING_FSCAL3     0xEA //\r
+#define SMARTRF_SETTING_FSCAL2     0x2A //\r
+#define SMARTRF_SETTING_FSCAL1     0x00 //\r
+#define SMARTRF_SETTING_FSCAL0     0x1F //\r
+#define SMARTRF_SETTING_FSTEST     0x59 //\r
+#define SMARTRF_SETTING_TEST2      0x88 //\r
+#define SMARTRF_SETTING_TEST1      0x31 //\r
+#define SMARTRF_SETTING_TEST0      0x09 //\r
+#define SMARTRF_SETTING_PTEST      0x7F //\r
+#define SMARTRF_SETTING_AGCTEST    0x88 //\r
+#define SMARTRF_SETTING_FIFOTHR    0x07 //\r
+#define SMARTRF_SETTING_IOCFG2     0x29 //\r
+#define SMARTRF_SETTING_IOCFG1     0x1E //\r
+#define SMARTRF_SETTING_IOCFG0     0x1B //\r
+#define SMARTRF_SETTING_PKTCTRL1   0x05 // Address Check and Append Status\r
+#define SMARTRF_SETTING_PKTCTRL0   0x45 //\r
+#define SMARTRF_SETTING_ADDR       WBSL_ED_ADDRESS //\r
+#define SMARTRF_SETTING_PKTLEN     0xFE //\r
+\r
+\r
+extern void radio_reset(void);\r
+extern void radio_sxoff(void);\r
+extern void open_radio(void);\r
+extern void close_radio(void);\r
+\r
+\r
+void config_radio_wbsl(void);\r
+void stop_radio_wbsl(void);\r
+void WriteSmartRFReg(const u8 SmartRFSetting[][2], u8 size);\r
+void ReceiveOn(void);\r
+void ReceiveOff(void);\r
+\r
+#endif /*RADIO_H_*/\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Wireless Update/ram_based_lnkcc430F6137.xcl b/chronos-ti/Software Projects/Chronos Watch/IAR/Wireless Update/ram_based_lnkcc430F6137.xcl
new file mode 100755 (executable)
index 0000000..1032924
--- /dev/null
@@ -0,0 +1,145 @@
+//*****************************************************************\r
+//\r
+// XLINK command file for IAR Embedded Workbench for MSP430.\r
+//\r
+// This file should be used with the CC430F6137 microprocessor.\r
+//\r
+// Copyright 1996-2007 IAR Systems. All rights reserved.\r
+//\r
+// Usage:  xlink your_file(s) -f lnkcc430f6137 library\r
+//\r
+// $Revision: 1.30 $\r
+//\r
+//*****************************************************************\r
+\r
+//*****************************************************************\r
+//\r
+// The memory areas of the CC430F6137 microprocessor:\r
+//\r
+//   Peripheral units:                0 - 01FF\r
+//\r
+//   Information memory (FLASH):   1800 - 19FF\r
+//\r
+//   Read-write memory (RAM):      1C00 - 2BFD\r
+//\r
+//   Read-only memory (FLASH):     8000 - FF7F\r
+//                                 \r
+//\r
+//*****************************************************************\r
+\r
+//*****************************************************************\r
+//\r
+// The following segments are defined in this linker command file:\r
+//\r
+// Data read/write segments (RAM)\r
+// ==============================\r
+//\r
+// segment     Restrictions    Usage\r
+// -------     ------------    --------------------------\r
+// DATA16_I    < 10000         Data16 initialized variables\r
+// DATA16_Z    < 10000         Data16 zero initialized variables\r
+// DATA16_N    < 10000         Data16 uninitialized variables\r
+// DATA16_HEAP < 10000         Data16 heap used by malloc and free\r
+// DATA20_I                    Data20 initialized variables\r
+// DATA20_Z                    Data20 zero initialized variables\r
+// DATA20_N                    Data20 uninitialized variables\r
+// DATA20_HEAP                 Data20 heap used by malloc and free\r
+// CSTACK      < 10000         Runtime stack\r
+//\r
+//\r
+// Program and data read-only segments (FLASH)\r
+// ===========================================\r
+//\r
+// segment     Restrictions    Usage\r
+// -------     ------------    --------------------------\r
+// INFO                        Information memory\r
+// CSTART      < 10000         Program startup code\r
+// CODE                        Program code\r
+// ISR_CODE    < 10000         Program code for interrupt service routines\r
+// DATA16_C    < 10000         Data16 constant data and string literals\r
+// DATA16_ID   < 10000         Data16 initializers for DATA16_I\r
+// DATA20_C                    Data20 constant data and string literals\r
+// DATA20_ID                   Data20 initializers for DATA20_I\r
+// DIFUNCT     < 10000         Dynamic initialization vector used by C++\r
+// CHECKSUM                    Checksum byte(s) generated by the -J option\r
+// INTVEC      FF80-FFFF       Interrupt vectors\r
+// RESET       FFFE-FFFF       The reset vector\r
+//\r
+//*****************************************************************\r
+\r
+\r
+// ---------------------------------------------------------\r
+// Stack and heap sizes.\r
+// ---------------------------------------------------------\r
+\r
+// Uncomment for command line use\r
+//-D_STACK_SIZE=80\r
+//-D_DATA16_HEAP_SIZE=80\r
+\r
+\r
+// ---------------------------------------------------------\r
+// Define cpu.\r
+// ---------------------------------------------------------\r
+\r
+-cmsp430\r
+\r
+\r
+// ---------------------------------------------------------\r
+// Read-write memory.\r
+// ---------------------------------------------------------\r
+\r
+-Z(DATA)DATA16_I,DATA16_Z,DATA16_N,DATA16_HEAP+_DATA16_HEAP_SIZE=2951-2BFE\r
+-Z(DATA)CSTACK+_STACK_SIZE#\r
+\r
+\r
+// ---------------------------------------------------------\r
+// Read only memory\r
+\r
+\r
+// ---------------------------------------------------------\r
+// Information memory\r
+// ---------------------------------------------------------\r
+\r
+-Z(CODE)INFO=1800-19FF\r
+-Z(CODE)INFOA=1980-19FF\r
+-Z(CODE)INFOB=1900-197F\r
+-Z(CODE)INFOC=1880-18FF\r
+-Z(CODE)INFOD=1800-187F\r
+\r
+// ---------------------------------------------------------\r
+// Code\r
+// ---------------------------------------------------------\r
+\r
+-Z(CODE)CSTART,ISR_CODE=1D30-2950\r
+\r
+// ---------------------------------------------------------\r
+// Constant data\r
+// ---------------------------------------------------------\r
+\r
+-Z(CONST)DATA16_C,DATA16_ID,DIFUNCT,CHECKSUM=1D30-2950\r
+\r
+// -------------------------------------------------------------------\r
+//  BSL Memory\r
+// -------------------------------------------------------------------\r
+//-Z(CODE)ZAREA=1000-100F\r
+//-Z(CODE)ZAREA_CODE=1010-102F\r
+\r
+\r
+// ---------------------------------------------------------\r
+// Code\r
+// ---------------------------------------------------------\r
+\r
+-P(CODE)CODE=1D30-2950\r
+\r
+\r
+// ---------------------------------------------------------\r
+// Interrupt vectors\r
+// ---------------------------------------------------------\r
+\r
+-Z(CODE)INTVEC=FF80-FFFF\r
+-Z(CODE)RESET=FFFE-FFFF\r
+\r
+\r
+// ---------------------------------------------------------\r
+// The end\r
+// ---------------------------------------------------------\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Wireless Update/rf1a.c b/chronos-ti/Software Projects/Chronos Watch/IAR/Wireless Update/rf1a.c
new file mode 100755 (executable)
index 0000000..b191f8d
--- /dev/null
@@ -0,0 +1,214 @@
+// *************************************************************************************************\r
+//\r
+// Actual revision: $Revision: $\r
+// Revision label:  $Name: $\r
+// Revision state:  $State: $\r
+//\r
+// *************************************************************************************************\r
+// Radio core access functions. Taken from TI reference code for CC430.\r
+// *************************************************************************************************\r
+\r
+\r
+// *************************************************************************************************\r
+// Include section\r
+\r
+// system\r
+#include "project_defs.h"\r
+\r
+// driver\r
+#include "rf1a.h"\r
+#include "wbsl.h"\r
+// *************************************************************************************************\r
+// Global section\r
+\r
+\r
+// *************************************************************************************************\r
+// @fn          Strobe\r
+// @brief       Send command to radio.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+u8 Strobe(u8 strobe)\r
+{\r
+    u8 statusByte = 0;\r
+    u16 int_state, gdo_state;\r
+\r
+    // Check for valid strobe command\r
+    if ((strobe == 0xBD) || ((strobe > RF_SRES) && (strobe < RF_SNOP)))\r
+    {\r
+        ENTER_CRITICAL_SECTION(int_state);\r
+\r
+        // Clear the Status read flag\r
+        RF1AIFCTL1 &= ~(RFSTATIFG);\r
+\r
+        // Wait for radio to be ready for next instruction\r
+        while (!(RF1AIFCTL1 & RFINSTRIFG)) ;\r
+\r
+        // Write the strobe instruction\r
+        if ((strobe > RF_SRES) && (strobe < RF_SNOP))\r
+        {\r
+\r
+            gdo_state = ReadSingleReg(IOCFG2);         // buffer IOCFG2 state\r
+            WriteSingleReg(IOCFG2, 0x29);              // c-ready to GDO2\r
+\r
+            RF1AINSTRB = strobe;\r
+            if ((RF1AIN & 0x04) == 0x04)               // chip at sleep mode\r
+            {\r
+                if ((strobe == RF_SXOFF) || (strobe == RF_SPWD) || (strobe == RF_SWOR)){ }\r
+                else\r
+                {\r
+                    while ((RF1AIN & 0x04) == 0x04) ;  // c-ready ?\r
+                    __delay_cycles(9800);              // Delay for ~810usec at 12MHz CPU clock\r
+                }\r
+            }\r
+            WriteSingleReg(IOCFG2, gdo_state);         // restore IOCFG2 setting\r
+        }\r
+        else                                           // chip active mode\r
+        {\r
+            RF1AINSTRB = strobe;\r
+        }\r
+        statusByte = RF1ASTATB;\r
+\r
+        EXIT_CRITICAL_SECTION(int_state);\r
+    }\r
+    return statusByte;\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          ResetRadioCore\r
+// @brief       Software reset radio core.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+\r
+/*\r
+ * void ResetRadioCore(void)\r
+ * {\r
+ * Strobe(RF_SRES);                             // Reset the Radio Core\r
+ * Strobe(RF_SNOP);                             // Reset Radio Pointer\r
+ * }\r
+ */\r
+\r
+// *************************************************************************************************\r
+// @fn          ReadSingleReg\r
+// @brief       Read byte from register.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+u8 ReadSingleReg(u8 addr)\r
+{\r
+    u8 x;\r
+    u16 int_state;\r
+\r
+    ENTER_CRITICAL_SECTION(int_state);\r
+\r
+    while (!(RF1AIFCTL1 & RFINSTRIFG)) ;\r
+\r
+    if ((addr <= 0x2E) || (addr == 0x3E))\r
+    {\r
+        RF1AINSTR1B = (addr | RF_SNGLREGRD);\r
+    }\r
+    else\r
+    {\r
+        RF1AINSTR1B = (addr | RF_REGRD);\r
+    }\r
+\r
+    x = RF1ADOUTB;\r
+    //RF1ADINB = 0; //dummy write\r
+    EXIT_CRITICAL_SECTION(int_state);\r
+\r
+    return x;\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          WriteSingleReg\r
+// @brief       Write byte to register.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void WriteSingleReg(u8 addr, u8 value)\r
+{\r
+    volatile u16 i;\r
+    u16 int_state;\r
+\r
+    ENTER_CRITICAL_SECTION(int_state);\r
+\r
+    while (!(RF1AIFCTL1 & RFINSTRIFG)) ;           // Wait for the Radio to be ready for the next\r
+                                                   // instruction\r
+\r
+    RF1AINSTRW = ((addr | RF_REGWR) << 8) + value; // Send address + Instruction\r
+    while (!(RFDINIFG & RF1AIFCTL1)) ;\r
+\r
+    i = RF1ADOUTB;                                 // Reset RFDOUTIFG flag which contains status\r
+                                                   // byte\r
+\r
+    EXIT_CRITICAL_SECTION(int_state);\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          WriteBurstReg\r
+// @brief       Write sequence of bytes to register.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void WriteBurstReg(u8 addr, u8 *buffer, u8 count)\r
+{\r
+    // Write Burst works wordwise not bytewise - bug known already\r
+    u8 i;\r
+    u16 int_state;\r
+\r
+    ENTER_CRITICAL_SECTION(int_state);\r
+\r
+    while (!(RF1AIFCTL1 & RFINSTRIFG)) ;               // Wait for the Radio to be ready for next\r
+                                                       // instruction\r
+    RF1AINSTRW = ((addr | RF_REGWR) << 8) + buffer[0]; // Send address + Instruction\r
+\r
+    for (i = 1; i < count; i++)\r
+    {\r
+        while (!(RFDINIFG & RF1AIFCTL1)) ;             // Wait for TX to finish\r
+        RF1ADINB = buffer[i];                          // Send data\r
+    }\r
+    i = RF1ADOUTB;                                     // Reset RFDOUTIFG flag which contains status\r
+                                                       // byte\r
+\r
+    EXIT_CRITICAL_SECTION(int_state);\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          WritePATable\r
+// @brief       Write data to power table\r
+// @param       u8 value               Value to write\r
+// @return      none\r
+// *************************************************************************************************\r
+void WritePATable(u8 value)\r
+{\r
+    u8 readbackPATableValue = 0;\r
+    u16 int_state;\r
+\r
+    ENTER_CRITICAL_SECTION(int_state);\r
+\r
+    while (readbackPATableValue != value)\r
+    {\r
+        while (!(RF1AIFCTL1 & RFINSTRIFG)) ;\r
+        RF1AINSTRW = 0x7E00 + value;         // PA Table write (burst)\r
+\r
+        while (!(RF1AIFCTL1 & RFINSTRIFG)) ;\r
+        RF1AINSTRB = RF_SNOP;                // reset pointer\r
+\r
+\r
+        while (!(RF1AIFCTL1 & RFINSTRIFG)) ;\r
+        RF1AINSTRB = 0xFE;                   // PA Table read (burst)\r
+\r
+        while (!(RF1AIFCTL1 & RFDINIFG)) ;\r
+        RF1ADINB = 0x00;                     //dummy write\r
+\r
+        while (!(RF1AIFCTL1 & RFDOUTIFG)) ;\r
+        readbackPATableValue = RF1ADOUT0B;\r
+\r
+        while (!(RF1AIFCTL1 & RFINSTRIFG)) ;\r
+        RF1AINSTRB = RF_SNOP;\r
+    }\r
+\r
+    EXIT_CRITICAL_SECTION(int_state);\r
+}\r
+\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Wireless Update/rf1a.h b/chronos-ti/Software Projects/Chronos Watch/IAR/Wireless Update/rf1a.h
new file mode 100755 (executable)
index 0000000..64f7fa8
--- /dev/null
@@ -0,0 +1,21 @@
+// *************************************************************************************************\r
+//\r
+// Actual revision: $Revision: $\r
+// Revision label:  $Name: $\r
+// Revision state:  $State: $\r
+//\r
+// *************************************************************************************************\r
+// Radio core access functions. Taken from TI reference code for CC430.\r
+// *************************************************************************************************\r
+\r
+// *************************************************************************************************\r
+// Prototype section\r
+u8 Strobe(u8 strobe);\r
+u8 ReadSingleReg(u8 addr);\r
+void WriteSingleReg(u8 addr, u8 value);\r
+void ReadBurstReg(u8 addr, u8 *buffer, u8 count);\r
+void WriteBurstReg(u8 addr, u8 *buffer, u8 count);\r
+void ResetRadioCore(void);\r
+void WritePATable(u8 value);\r
+void WaitForXT2(void);\r
+void Transmit(u8 *buffer, u8 length);\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Wireless Update/settings/Wireless_Update.cspy.bat b/chronos-ti/Software Projects/Chronos Watch/IAR/Wireless Update/settings/Wireless_Update.cspy.bat
new file mode 100755 (executable)
index 0000000..04d300e
--- /dev/null
@@ -0,0 +1,15 @@
+@REM This batch file has been generated by the IAR Embedded Workbench\r
+@REM C-SPY Debugger, as an aid to preparing a command line for running\r
+@REM the cspybat command line utility using the appropriate settings.\r
+@REM\r
+@REM You can launch cspybat by typing the name of this batch file followed\r
+@REM by the name of the debug file (usually an ELF/DWARF or UBROF file).\r
+@REM Note that this file is generated every time a new debug session\r
+@REM is initialized, so you may want to move or rename the file before\r
+@REM making changes.\r
+@REM \r
+\r
+\r
+"C:\Program Files\IAR Systems\Embedded Workbench 6.0\common\bin\cspybat" "C:\Program Files\IAR Systems\Embedded Workbench 6.0\430\bin\430proc.dll" "C:\Program Files\IAR Systems\Embedded Workbench 6.0\430\bin\430sim.dll"  %1 --plugin "C:\Program Files\IAR Systems\Embedded Workbench 6.0\430\bin\430bat.dll" --backend -B "-p" "C:\Program Files\IAR Systems\Embedded Workbench 6.0\430\config\CC430F6137.ddf" "--core=430Xv2" "--data_model=small" "--iv_base" "0xFF80" "--no_wrap_around" "--odd_word_check" "-d" "sim" "--derivativeSim" "CC430F6137" \r
+\r
+\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Wireless Update/settings/Wireless_Update.dbgdt b/chronos-ti/Software Projects/Chronos Watch/IAR/Wireless Update/settings/Wireless_Update.dbgdt
new file mode 100755 (executable)
index 0000000..40b907d
--- /dev/null
@@ -0,0 +1,89 @@
+<?xml version="1.0" encoding="iso-8859-1"?>\r
+\r
+<Project>\r
+  <Desktop>\r
+    <Static>\r
+      <Debug-Log>\r
+        \r
+        \r
+      <ColumnWidth0>20</ColumnWidth0><ColumnWidth1>1222</ColumnWidth1></Debug-Log>\r
+      <Build>\r
+        <ColumnWidth0>20</ColumnWidth0>\r
+        <ColumnWidth1>916</ColumnWidth1>\r
+        <ColumnWidth2>244</ColumnWidth2>\r
+        <ColumnWidth3>61</ColumnWidth3>\r
+      </Build>\r
+      <Workspace>\r
+        <ColumnWidths>\r
+          \r
+          \r
+          \r
+          \r
+        <Column0>124</Column0><Column1>27</Column1><Column2>27</Column2><Column3>27</Column3></ColumnWidths>\r
+      </Workspace>\r
+      <Disassembly>\r
+        \r
+        \r
+        \r
+      <MixedMode>1</MixedMode><CodeCovShow>0</CodeCovShow><InstrProfShow>0</InstrProfShow></Disassembly>\r
+    </Static>\r
+    <Windows>\r
+      \r
+      \r
+      \r
+    <Wnd0>\r
+        <Tabs>\r
+          <Tab>\r
+            <Identity>TabID-21663-24053</Identity>\r
+            <TabName>Debug Log</TabName>\r
+            <Factory>Debug-Log</Factory>\r
+            <Session/>\r
+          </Tab>\r
+          <Tab>\r
+            <Identity>TabID-9346-24079</Identity>\r
+            <TabName>Build</TabName>\r
+            <Factory>Build</Factory>\r
+            <Session/>\r
+          </Tab>\r
+        </Tabs>\r
+        \r
+      <SelectedTab>0</SelectedTab></Wnd0><Wnd1>\r
+        <Tabs>\r
+          <Tab>\r
+            <Identity>TabID-32411-24056</Identity>\r
+            <TabName>Workspace</TabName>\r
+            <Factory>Workspace</Factory>\r
+            <Session>\r
+              \r
+            <NodeDict><ExpandedNode>Wireless_Update</ExpandedNode><ExpandedNode>Wireless_Update/Output</ExpandedNode></NodeDict></Session>\r
+          </Tab>\r
+        </Tabs>\r
+        \r
+      <SelectedTab>0</SelectedTab></Wnd1><Wnd2>\r
+        <Tabs>\r
+          <Tab>\r
+            <Identity>TabID-10392-24059</Identity>\r
+            <TabName>Disassembly</TabName>\r
+            <Factory>Disassembly</Factory>\r
+            <Session/>\r
+          </Tab>\r
+        </Tabs>\r
+        \r
+      <SelectedTab>0</SelectedTab></Wnd2></Windows>\r
+    <Editor>\r
+      \r
+      \r
+      \r
+      \r
+    <Pane><Tab><Factory>TextEditor</Factory><Filename>$WS_DIR$\RFBSL_Low_Level_Init.s43</Filename><XPos>0</XPos><YPos>3</YPos><SelStart>1457</SelStart><SelEnd>1457</SelEnd></Tab><Tab><Factory>TextEditor</Factory><Filename>$WS_DIR$\868MHz Flash Based Updater\List\flash_based_rfbsl_ism_eu.map</Filename><XPos>0</XPos><YPos>1312</YPos><SelStart>68368</SelStart><SelEnd>68368</SelEnd></Tab><ActiveTab>1</ActiveTab></Pane><ActivePane>0</ActivePane><Sizes><Pane><X>1000000</X><Y>1000000</Y></Pane></Sizes><SplitMode>1</SplitMode></Editor>\r
+    <Positions>\r
+      \r
+      \r
+      \r
+      \r
+      \r
+    <Top><Row0><Sizes><Toolbar-00a2b058><key>iaridepm.enu1</key></Toolbar-00a2b058></Sizes></Row0><Row1><Sizes><Toolbar-03852898><key>debuggergui.enu1</key></Toolbar-03852898></Sizes></Row1><Row2><Sizes><Toolbar-039819a8><key>430fet1</key></Toolbar-039819a8></Sizes></Row2><Row3><Sizes/></Row3><Row4><Sizes/></Row4><Row5><Sizes/></Row5><Row6><Sizes/></Row6><Row7><Sizes/></Row7><Row8><Sizes/></Row8><Row9><Sizes/></Row9><Row10><Sizes/></Row10><Row11><Sizes/></Row11><Row12><Sizes/></Row12><Row13><Sizes/></Row13><Row14><Sizes/></Row14><Row15><Sizes/></Row15></Top><Left><Row0><Sizes><Wnd1><Rect><Top>-2</Top><Left>-2</Left><Bottom>668</Bottom><Right>198</Right><x>-2</x><y>-2</y><xscreen>200</xscreen><yscreen>200</yscreen><sizeHorzCX>156250</sizeHorzCX><sizeHorzCY>208768</sizeHorzCY><sizeVertCX>156250</sizeVertCX><sizeVertCY>699374</sizeVertCY></Rect></Wnd1></Sizes></Row0></Left><Right><Row0><Sizes><Wnd2><Rect><Top>-2</Top><Left>-2</Left><Bottom>668</Bottom><Right>198</Right><x>-2</x><y>-2</y><xscreen>200</xscreen><yscreen>200</yscreen><sizeHorzCX>156250</sizeHorzCX><sizeHorzCY>208768</sizeHorzCY><sizeVertCX>156250</sizeVertCX><sizeVertCY>699374</sizeVertCY></Rect></Wnd2></Sizes></Row0></Right><Bottom><Row0><Sizes><Wnd0><Rect><Top>-2</Top><Left>-2</Left><Bottom>198</Bottom><Right>1282</Right><x>-2</x><y>-2</y><xscreen>1284</xscreen><yscreen>200</yscreen><sizeHorzCX>1003125</sizeHorzCX><sizeHorzCY>208768</sizeHorzCY><sizeVertCX>156250</sizeVertCX><sizeVertCY>208768</sizeVertCY></Rect></Wnd0></Sizes></Row0></Bottom><Float><Sizes/></Float></Positions>\r
+  </Desktop>\r
+</Project>\r
+\r
+\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Wireless Update/settings/Wireless_Update.dni b/chronos-ti/Software Projects/Chronos Watch/IAR/Wireless Update/settings/Wireless_Update.dni
new file mode 100755 (executable)
index 0000000..3602a0e
--- /dev/null
@@ -0,0 +1,81 @@
+[State Storage]\r
+Control Register=0\r
+[Sequencer]\r
+Control Register=0\r
+NextState0=0\r
+NextState1=0\r
+[Action Register]\r
+Break=0\r
+State Storage=0\r
+[DebugChecksum]\r
+Checksum=1750648671\r
+[DisAssemblyWindow]\r
+NumStates=_ 1\r
+State 1=_ 1\r
+[InstructionProfiling]\r
+Enabled=_ 0\r
+[CodeCoverage]\r
+Enabled=_ 0\r
+[Profiling]\r
+Enabled=0\r
+[StackPlugin]\r
+Enabled=1\r
+OverflowWarningsEnabled=1\r
+WarningThreshold=90\r
+SpWarningsEnabled=1\r
+WarnHow=0\r
+UseTrigger=1\r
+TriggerName=main\r
+LimitSize=0\r
+ByteLimit=50\r
+[Log file]\r
+LoggingEnabled=_ 0\r
+LogFile=_ ""\r
+Category=_ 0\r
+[TermIOLog]\r
+LoggingEnabled=_ 0\r
+LogFile=_ ""\r
+[FET]\r
+Clock mode=14\r
+Extended Clock mode=-1\r
+Secure Password=\r
+Extended Clock Control Enable=1\r
+Advanced Extended Clock Control=0\r
+Emulation mode=0\r
+Free running=0\r
+Shutting Down=3\r
+[Memory Dump]\r
+Start address=\r
+Lenghth=\r
+Address info=0\r
+Format=0\r
+Dump registers=0\r
+PC=0\r
+SP=0\r
+SR=0\r
+all registers=0\r
+File name=\r
+[InterruptLog]\r
+LogEnabled=0\r
+SumEnabled=0\r
+GraphEnabled=0\r
+ShowTimeLog=1\r
+ShowTimeSum=1\r
+SumSortOrder=0\r
+[Breakpoints]\r
+Count=0\r
+[Interrupts]\r
+Enabled=1\r
+[MemoryMap]\r
+Enabled=0\r
+Base=0\r
+UseAuto=0\r
+TypeViolation=1\r
+UnspecRange=1\r
+ActionState=1\r
+[Aliases]\r
+Count=0\r
+SuppressDialog=0\r
+[TraceHelper]\r
+Enabled=0\r
+ShowSource=1\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Wireless Update/settings/Wireless_Update.wsdt b/chronos-ti/Software Projects/Chronos Watch/IAR/Wireless Update/settings/Wireless_Update.wsdt
new file mode 100755 (executable)
index 0000000..6e957a1
--- /dev/null
@@ -0,0 +1,66 @@
+<?xml version="1.0" encoding="iso-8859-1"?>\r
+\r
+<Workspace>\r
+  <ConfigDictionary>\r
+    \r
+  <CurrentConfigs><Project>Wireless_Update/433MHz Flash Based Updater</Project></CurrentConfigs></ConfigDictionary>\r
+  <Desktop>\r
+    <Static>\r
+      <Workspace>\r
+        <ColumnWidths>\r
+          \r
+          \r
+          \r
+          \r
+        <Column0>257</Column0><Column1>27</Column1><Column2>27</Column2><Column3>1242260</Column3></ColumnWidths>\r
+      </Workspace>\r
+      <Build>\r
+        \r
+        \r
+        \r
+        \r
+      <ColumnWidth0>20</ColumnWidth0><ColumnWidth1>915</ColumnWidth1><ColumnWidth2>244</ColumnWidth2><ColumnWidth3>61</ColumnWidth3></Build>\r
+    <TerminalIO/><Debug-Log><ColumnWidth0>21</ColumnWidth0><ColumnWidth1>1221</ColumnWidth1></Debug-Log><Tool-Output/></Static>\r
+    <Windows>\r
+      \r
+      \r
+    <Wnd0>\r
+        <Tabs>\r
+          <Tab>\r
+            <Identity>TabID-13995-11954</Identity>\r
+            <TabName>Workspace</TabName>\r
+            <Factory>Workspace</Factory>\r
+            <Session>\r
+              \r
+            <NodeDict><ExpandedNode>Wireless_Update</ExpandedNode></NodeDict></Session>\r
+          </Tab>\r
+        </Tabs>\r
+        \r
+      <SelectedTab>0</SelectedTab></Wnd0><Wnd1>\r
+        <Tabs>\r
+          <Tab>\r
+            <Identity>TabID-11903-11993</Identity>\r
+            <TabName>Build</TabName>\r
+            <Factory>Build</Factory>\r
+            <Session/>\r
+          </Tab>\r
+        <Tab><Identity>TabID-6546-5487</Identity><TabName>Debug Log</TabName><Factory>Debug-Log</Factory><Session/></Tab><Tab><Identity>TabID-24855-28189</Identity><TabName>Tool Output</TabName><Factory>Tool-Output</Factory><Session/></Tab></Tabs>\r
+        \r
+      <SelectedTab>0</SelectedTab></Wnd1></Windows>\r
+    <Editor>\r
+      \r
+      \r
+      \r
+      \r
+    <Pane><Tab><Factory>TextEditor</Factory><Filename>$WS_DIR$\radio.c</Filename><XPos>0</XPos><YPos>138</YPos><SelStart>6412</SelStart><SelEnd>6412</SelEnd></Tab><ActiveTab>0</ActiveTab></Pane><ActivePane>0</ActivePane><Sizes><Pane><X>1000000</X><Y>1000000</Y></Pane></Sizes><SplitMode>1</SplitMode></Editor>\r
+    <Positions>\r
+      \r
+      \r
+      \r
+      \r
+      \r
+    <Top><Row0><Sizes><Toolbar-012ab140><key>iaridepm.enu1</key></Toolbar-012ab140></Sizes></Row0></Top><Left><Row0><Sizes><Wnd0><Rect><Top>-2</Top><Left>-2</Left><Bottom>460</Bottom><Right>331</Right><x>-2</x><y>-2</y><xscreen>200</xscreen><yscreen>202</yscreen><sizeHorzCX>156250</sizeHorzCX><sizeHorzCY>210856</sizeHorzCY><sizeVertCX>260156</sizeVertCX><sizeVertCY>482255</sizeVertCY></Rect></Wnd0></Sizes></Row0></Left><Right><Row0><Sizes/></Row0></Right><Bottom><Row0><Sizes><Wnd1><Rect><Top>-2</Top><Left>-2</Left><Bottom>454</Bottom><Right>1282</Right><x>-2</x><y>-2</y><xscreen>1284</xscreen><yscreen>456</yscreen><sizeHorzCX>1003125</sizeHorzCX><sizeHorzCY>475992</sizeHorzCY><sizeVertCX>156250</sizeVertCX><sizeVertCY>210856</sizeVertCY></Rect></Wnd1></Sizes></Row0></Bottom><Float><Sizes/></Float></Positions>\r
+  </Desktop>\r
+</Workspace>\r
+\r
+\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Wireless Update/settings/flash_based_rfbsl.cspy.bat b/chronos-ti/Software Projects/Chronos Watch/IAR/Wireless Update/settings/flash_based_rfbsl.cspy.bat
new file mode 100755 (executable)
index 0000000..14f4adc
--- /dev/null
@@ -0,0 +1,34 @@
+@REM This bat file has been generated by the IAR Embeddded Workbench\r
+@REM C-SPY interactive debugger,as an aid to preparing a command\r
+@REM line for running the cspybat command line utility with the\r
+@REM appropriate settings.\r
+@REM\r
+@REM After making some adjustments to this file, you can launch cspybat\r
+@REM by typing the name of this file followed by the name of the debug\r
+@REM file (usually an ubrof file). Note that this file is generated\r
+@REM every time a new debug session is initialized, so you may want to\r
+@REM move or rename the file before making changes.\r
+@REM\r
+@REM Note: some command line arguments cannot be properly generated\r
+@REM by this process. Specifically, the plugin which is responsible\r
+@REM for the Terminal I/O window (and other C runtime functionality)\r
+@REM comes in a special version for cspybat, and the name of that\r
+@REM plugin dll is not known when generating this file. It resides in\r
+@REM the $TOOLKIT_DIR$\bin folder and is usually called XXXbat.dll or\r
+@REM XXXlibsupportbat.dll, where XXX is the name of the corresponding\r
+@REM tool chain. Replace the '<libsupport_plugin>' parameter\r
+@REM below with the appropriate file name. Other plugins loaded by\r
+@REM C-SPY are usually not needed by, or will not work in, cspybat\r
+@REM but they are listed at the end of this file for reference.\r
+\r
+\r
+"C:\Program Files\IAR Systems\Embedded Workbench 5.4 Kickstart\common\bin\cspybat" "C:\Program Files\IAR Systems\Embedded Workbench 5.4 Kickstart\430\bin\430proc.dll" "C:\Program Files\IAR Systems\Embedded Workbench 5.4 Kickstart\430\bin\430fet.dll"  %1 --plugin "C:\Program Files\IAR Systems\Embedded Workbench 5.4 Kickstart\430\bin\<libsupport_plugin>" --backend -B "-p" "C:\Program Files\IAR Systems\Embedded Workbench 5.4 Kickstart\430\config\CC430F6137.ddf" "--core=430Xv2" "--data_model=small" "--iv_base" "0xFF80" "--no_wrap_around" "-d" "fet" "--erase_main" "--derivative" "CC430F6137" "--protocol" "spy-bi-wire" "--eem" "EMEX_LOW" "--port" "HID0012" "--connection" "ti_usb" "--settlingtime=0" "--allow_access_to_BSL" \r
+\r
+\r
+@REM Loaded plugins:\r
+@REM    C:\Program Files\IAR Systems\Embedded Workbench 5.4 Kickstart\430\bin\430libsupport.dll\r
+@REM    C:\Program Files\IAR Systems\Embedded Workbench 5.4 Kickstart\430\plugins\lcd\lcd.dll\r
+@REM    C:\Program Files\IAR Systems\Embedded Workbench 5.4 Kickstart\common\plugins\CodeCoverage\CodeCoverage.dll\r
+@REM    C:\Program Files\IAR Systems\Embedded Workbench 5.4 Kickstart\common\plugins\Profiling\Profiling.dll\r
+@REM    C:\Program Files\IAR Systems\Embedded Workbench 5.4 Kickstart\common\plugins\stack\stack.dll\r
+@REM    C:\Program Files\IAR Systems\Embedded Workbench 5.4 Kickstart\common\plugins\SymList\SymList.dll\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Wireless Update/settings/flash_based_rfbsl.dbgdt b/chronos-ti/Software Projects/Chronos Watch/IAR/Wireless Update/settings/flash_based_rfbsl.dbgdt
new file mode 100755 (executable)
index 0000000..00f7214
--- /dev/null
@@ -0,0 +1,89 @@
+<?xml version="1.0" encoding="iso-8859-1"?>\r
+\r
+<Project>\r
+  <Desktop>\r
+    <Static>\r
+      <Debug-Log>\r
+        \r
+        \r
+      <ColumnWidth0>20</ColumnWidth0><ColumnWidth1>1221</ColumnWidth1></Debug-Log>\r
+      <Build>\r
+        <ColumnWidth0>20</ColumnWidth0>\r
+        <ColumnWidth1>915</ColumnWidth1>\r
+        <ColumnWidth2>244</ColumnWidth2>\r
+        <ColumnWidth3>61</ColumnWidth3>\r
+      </Build>\r
+      <Workspace>\r
+        <ColumnWidths>\r
+          \r
+          \r
+          \r
+          \r
+        <Column0>156</Column0><Column1>27</Column1><Column2>27</Column2><Column3>27</Column3></ColumnWidths>\r
+      </Workspace>\r
+      <Disassembly>\r
+        \r
+        \r
+        \r
+      <MixedMode>1</MixedMode><CodeCovShow>0</CodeCovShow><InstrProfShow>0</InstrProfShow></Disassembly>\r
+    <Register><PreferedWindows><Position>2</Position><ScreenPosX>0</ScreenPosX><ScreenPosY>0</ScreenPosY><Windows/></PreferedWindows></Register><Watch><Format><struct_types/><watch_formats><Fmt><Key>{W}Watch-0:RxBufferLength</Key><Value>3</Value></Fmt><Fmt><Key>{W}Watch-1:*((unsigned int *)0x294E)</Key><Value>4</Value></Fmt><Fmt><Key>{W}Watch-1:*((unsigned int *)0x294F)</Key><Value>4</Value></Fmt><Fmt><Key>{W}Watch-1:*((unsigned int *)0x2950)</Key><Value>4</Value></Fmt><Fmt><Key>{W}Watch-1:*((unsigned int *)0x2951)</Key><Value>4</Value></Fmt><Fmt><Key>{W}Watch-1:*((unsigned int *)0x2953)</Key><Value>4</Value></Fmt><Fmt><Key>{W}Watch-1:*((unsigned int *)0x2955)</Key><Value>4</Value></Fmt><Fmt><Key>{W}Watch-1:*((unsigned int *)0x2957)</Key><Value>4</Value></Fmt><Fmt><Key>{W}Watch-1:*((unsigned int *)0x2959)</Key><Value>4</Value></Fmt><Fmt><Key>{W}Watch-1:*((unsigned int *)0x295B)</Key><Value>4</Value></Fmt><Fmt><Key>{W}Watch-1:*((unsigned int *)0x29FE)</Key><Value>4</Value></Fmt><Fmt><Key>{W}Watch-1:*((unsigned int *)0x8000)</Key><Value>4</Value></Fmt><Fmt><Key>{W}Watch-1:*data</Key><Value>4</Value></Fmt><Fmt><Key>{W}Watch-1:P2IFG</Key><Value>1</Value></Fmt><Fmt><Key>{W}Watch-1:RxBufferLength</Key><Value>3</Value></Fmt><Fmt><Key>{W}Watch-1:size</Key><Value>3</Value></Fmt></watch_formats></Format><PreferedWindows><Position>2</Position><ScreenPosX>0</ScreenPosX><ScreenPosY>0</ScreenPosY><Windows><Window><Factory>Locals</Factory></Window></Windows></PreferedWindows><Column0>100</Column0><Column1>100</Column1><Column2>100</Column2><Column3>100</Column3></Watch><Memory><FindDirection>1</FindDirection><FindAsHex>0</FindAsHex></Memory><Locals><PreferedWindows><Position>2</Position><ScreenPosX>0</ScreenPosX><ScreenPosY>0</ScreenPosY><Windows><Window><Factory>Watch</Factory></Window></Windows></PreferedWindows><Column0>100</Column0><Column1>100</Column1><Column2>100</Column2><Column3>100</Column3></Locals><Find-in-Files><ColumnWidth0>216</ColumnWidth0><ColumnWidth1>30</ColumnWidth1><ColumnWidth2>370</ColumnWidth2></Find-in-Files></Static>\r
+    <Windows>\r
+      \r
+      \r
+      \r
+    <Wnd3>\r
+        <Tabs>\r
+          <Tab>\r
+            <Identity>TabID-8687-22903</Identity>\r
+            <TabName>Debug Log</TabName>\r
+            <Factory>Debug-Log</Factory>\r
+            <Session/>\r
+          </Tab>\r
+          <Tab>\r
+            <Identity>TabID-18912-22916</Identity>\r
+            <TabName>Build</TabName>\r
+            <Factory>Build</Factory>\r
+            <Session/>\r
+          </Tab>\r
+        <Tab><Identity>TabID-20193-4795</Identity><TabName>Breakpoints</TabName><Factory>Breakpoints</Factory></Tab><Tab><Identity>TabID-3275-21487</Identity><TabName>Find in Files</TabName><Factory>Find-in-Files</Factory><Session/></Tab></Tabs>\r
+        \r
+      <SelectedTab>0</SelectedTab></Wnd3><Wnd4>\r
+        <Tabs>\r
+          <Tab>\r
+            <Identity>TabID-19435-22906</Identity>\r
+            <TabName>Workspace</TabName>\r
+            <Factory>Workspace</Factory>\r
+            <Session>\r
+              \r
+            <NodeDict><ExpandedNode>flash_based_rfbsl</ExpandedNode><ExpandedNode>flash_based_rfbsl/Output</ExpandedNode></NodeDict></Session>\r
+          </Tab>\r
+        </Tabs>\r
+        \r
+      <SelectedTab>0</SelectedTab></Wnd4><Wnd6>\r
+        <Tabs>\r
+          <Tab>\r
+            <Identity>TabID-30183-22909</Identity>\r
+            <TabName>Disassembly</TabName>\r
+            <Factory>Disassembly</Factory>\r
+            <Session/>\r
+          </Tab>\r
+        </Tabs>\r
+        \r
+      <SelectedTab>0</SelectedTab></Wnd6><Wnd9><Tabs><Tab><Identity>TabID-5377-26173</Identity><TabName>Memory</TabName><Factory>Memory</Factory><Session><ZoneNumber>0</ZoneNumber><SelectionAnchor>4096</SelectionAnchor><SelectionEnd>4096</SelectionEnd><UnitsPerGroup>1</UnitsPerGroup><EndianMode>0</EndianMode><DataCovEnabled>0</DataCovEnabled><DataCovShown>0</DataCovShown><AutoRefresh>0</AutoRefresh><HScroll>0</HScroll><VScroll>247</VScroll></Session></Tab></Tabs><SelectedTab>0</SelectedTab></Wnd9><Wnd10><Tabs><Tab><Identity>TabID-6016-9768</Identity><TabName>Watch</TabName><Factory>Watch</Factory><Session><Expressions><Expression><Expression>packetSize</Expression></Expression><Expression><Expression>payloadStart</Expression></Expression><Expression><Expression>ptrRam</Expression></Expression><Expression><Expression>startAddr</Expression></Expression><Expression><Expression>size</Expression></Expression><Expression><Expression>data</Expression></Expression><Expression><Expression>i</Expression></Expression><Expression><Expression>RxBuffer</Expression></Expression><Expression><Expression>payloadBuffer</Expression></Expression><Expression><Expression>totalPackets</Expression></Expression><Expression><Expression>currentPacket</Expression></Expression><Expression><Expression>discoveryReply</Expression></Expression><Expression><Expression>i</Expression></Expression><Expression><Expression>buffer+7</Expression></Expression><Expression><Expression>length</Expression></Expression><Expression><Expression>max_link_attempts</Expression></Expression><Expression><Expression>initOk</Expression></Expression><Expression><Expression>rxtx_flag</Expression></Expression><Expression><Expression>RxBufferLength</Expression></Expression><Expression><Expression>ackReply</Expression></Expression><Expression><Expression>max_link_attempts</Expression></Expression><Expression><Expression>RxBuffer</Expression></Expression><Expression><Expression>ptrMemory</Expression></Expression><Expression><Expression>P2IFG</Expression></Expression><Expression><Expression>P2IE</Expression></Expression></Expressions><TabId>1</TabId><Column0>100</Column0><Column1>100</Column1><Column2>100</Column2><Column3>100</Column3></Session></Tab></Tabs><SelectedTab>0</SelectedTab></Wnd10><Wnd11><Tabs><Tab><Identity>TabID-24163-19464</Identity><TabName>Register</TabName><Factory>Register</Factory><Session><REG1>0</REG1><REG2>0</REG2><Group>0</Group><States>0</States></Session></Tab></Tabs><SelectedTab>0</SelectedTab></Wnd11></Windows>\r
+    <Editor>\r
+      \r
+      \r
+      \r
+      \r
+    <Pane/><ActivePane>0</ActivePane><Sizes><Pane><X>1000000</X><Y>1000000</Y></Pane></Sizes><SplitMode>1</SplitMode></Editor>\r
+    <Positions>\r
+      \r
+      \r
+      \r
+      \r
+      \r
+    <Top><Row0><Sizes><Toolbar-0101a0b8><key>iaridepm.enu1</key></Toolbar-0101a0b8></Sizes></Row0><Row1><Sizes><Toolbar-02c25be0><key>debuggergui.enu1</key></Toolbar-02c25be0></Sizes></Row1></Top><Left><Row0><Sizes><Wnd4><Rect><Top>-2</Top><Left>-2</Left><Bottom>514</Bottom><Right>230</Right><x>-2</x><y>-2</y><xscreen>0</xscreen><yscreen>81</yscreen><sizeHorzCX>0</sizeHorzCX><sizeHorzCY>98301</sizeHorzCY><sizeVertCX>161111</sizeVertCX><sizeVertCY>626214</sizeVertCY></Rect></Wnd4></Sizes></Row0></Left><Right><Row0><Sizes><Wnd6><Rect><Top>-2</Top><Left>-2</Left><Bottom>514</Bottom><Right>381</Right><x>-2</x><y>-2</y><xscreen>0</xscreen><yscreen>81</yscreen><sizeHorzCX>0</sizeHorzCX><sizeHorzCY>98301</sizeHorzCY><sizeVertCX>265972</sizeVertCX><sizeVertCY>626214</sizeVertCY></Rect></Wnd6></Sizes></Row0><Row1><Sizes><Wnd10><Rect><Top>-2</Top><Left>379</Left><Bottom>514</Bottom><Right>619</Right><x>379</x><y>-2</y><xscreen>6</xscreen><yscreen>114</yscreen><sizeHorzCX>4167</sizeHorzCX><sizeHorzCY>138350</sizeHorzCY><sizeVertCX>166667</sizeVertCX><sizeVertCY>626214</sizeVertCY></Rect></Wnd10></Sizes></Row1><Row2><Sizes><Wnd11><Rect><Top>-2</Top><Left>617</Left><Bottom>514</Bottom><Right>858</Right><x>617</x><y>-2</y><xscreen>54</xscreen><yscreen>149</yscreen><sizeHorzCX>37500</sizeHorzCX><sizeHorzCY>180825</sizeHorzCY><sizeVertCX>167361</sizeVertCX><sizeVertCY>626214</sizeVertCY></Rect></Wnd11></Sizes></Row2></Right><Bottom><Row0><Sizes><Wnd3><Rect><Top>-2</Top><Left>-2</Left><Bottom>242</Bottom><Right>722</Right><x>-2</x><y>-2</y><xscreen>724</xscreen><yscreen>244</yscreen><sizeHorzCX>502778</sizeHorzCX><sizeHorzCY>296117</sizeHorzCY><sizeVertCX>0</sizeVertCX><sizeVertCY>98301</sizeVertCY></Rect></Wnd3><Wnd9><Rect><Top>0</Top><Left>0</Left><Bottom>0</Bottom><Right>2</Right><x>720</x><y>-2</y><xscreen>722</xscreen><yscreen>244</yscreen><sizeHorzCX>501389</sizeHorzCX><sizeHorzCY>296117</sizeHorzCY><sizeVertCX>0</sizeVertCX><sizeVertCY>104369</sizeVertCY></Rect></Wnd9></Sizes></Row0></Bottom><Float><Sizes/></Float></Positions>\r
+  </Desktop>\r
+</Project>\r
+\r
+\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Wireless Update/settings/flash_based_rfbsl.dni b/chronos-ti/Software Projects/Chronos Watch/IAR/Wireless Update/settings/flash_based_rfbsl.dni
new file mode 100755 (executable)
index 0000000..5dbb325
--- /dev/null
@@ -0,0 +1,77 @@
+[DebugChecksum]\r
+Checksum=326321235\r
+[State Storage]\r
+Control Register=0\r
+[Sequencer]\r
+Control Register=0\r
+NextState0=0\r
+NextState1=0\r
+[Action Register]\r
+Break=3\r
+State Storage=0\r
+[DisAssemblyWindow]\r
+NumStates=_ 1\r
+State 1=_ 1\r
+[InstructionProfiling]\r
+Enabled=_ 0\r
+[CodeCoverage]\r
+Enabled=_ 0\r
+[Profiling]\r
+Enabled=0\r
+[StackPlugin]\r
+Enabled=1\r
+OverflowWarningsEnabled=1\r
+WarningThreshold=90\r
+SpWarningsEnabled=1\r
+WarnHow=0\r
+UseTrigger=1\r
+TriggerName=main\r
+LimitSize=0\r
+ByteLimit=50\r
+[TermIOLog]\r
+LoggingEnabled=_ 0\r
+LogFile=_ ""\r
+[DriverProfiling]\r
+Enabled=0\r
+Source=1\r
+Graph=0\r
+[Interrupts]\r
+Enabled=1\r
+[MemoryMap]\r
+Enabled=0\r
+Base=0\r
+UseAuto=0\r
+TypeViolation=1\r
+UnspecRange=1\r
+ActionState=1\r
+[TraceHelper]\r
+Enabled=0\r
+ShowSource=1\r
+[Log file]\r
+LoggingEnabled=_ 0\r
+LogFile=_ ""\r
+Category=_ 0\r
+[Breakpoints]\r
+Bp0=_ "STD_CODE" "{$PROJ_DIR$\wbsl.c}.145.3@1" 0 0 0 0 "" 0 ""\r
+Bp1=_ "STD_CODE" "{$PROJ_DIR$\RFBSL_Low_Level_Init.s43}.25.1@1" 0 0 0 0 "" 0 ""\r
+Count=2\r
+[FET]\r
+Clock mode=14\r
+Extended Clock mode=61663\r
+Secure Password=\r
+Extended Clock Control Enable=1\r
+Advanced Extended Clock Control=0\r
+Emulation mode=0\r
+Free running=0\r
+Shutting Down=3\r
+[Memory Dump]\r
+Start address=\r
+Lenghth=\r
+Address info=0\r
+Format=0\r
+Dump registers=0\r
+PC=0\r
+SP=0\r
+SR=0\r
+all registers=0\r
+File name=\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Wireless Update/settings/flash_based_rfbsl.wsdt b/chronos-ti/Software Projects/Chronos Watch/IAR/Wireless Update/settings/flash_based_rfbsl.wsdt
new file mode 100755 (executable)
index 0000000..44c7243
--- /dev/null
@@ -0,0 +1,61 @@
+<?xml version="1.0" encoding="iso-8859-1"?>\r
+\r
+<Workspace>\r
+  <ConfigDictionary>\r
+    \r
+  <CurrentConfigs><Project>flash_based_rfbsl/FLASH_BASED_RFBSL_ISM_EU</Project></CurrentConfigs></ConfigDictionary>\r
+  <Desktop>\r
+    <Static>\r
+      <Workspace>\r
+        <ColumnWidths>\r
+          \r
+          \r
+          \r
+          \r
+        <Column0>401</Column0><Column1>21</Column1><Column2>80</Column2><Column3>1242260</Column3></ColumnWidths>\r
+      </Workspace>\r
+      <Build>\r
+        \r
+        \r
+        \r
+        \r
+      <ColumnWidth0>20</ColumnWidth0><ColumnWidth1>915</ColumnWidth1><ColumnWidth2>244</ColumnWidth2><ColumnWidth3>61</ColumnWidth3></Build>\r
+    <TerminalIO/><Debug-Log><ColumnWidth0>19</ColumnWidth0><ColumnWidth1>1222</ColumnWidth1></Debug-Log><Find-in-Files><ColumnWidth0>440</ColumnWidth0><ColumnWidth1>62</ColumnWidth1><ColumnWidth2>754</ColumnWidth2></Find-in-Files><Disassembly><MixedMode>1</MixedMode><CodeCovShow>0</CodeCovShow><InstrProfShow>0</InstrProfShow></Disassembly></Static>\r
+    <Windows>\r
+      \r
+      \r
+    <Wnd1>\r
+        <Tabs>\r
+          \r
+        <Tab>\r
+            <Identity>TabID-2601-19128</Identity>\r
+            <TabName>Build</TabName>\r
+            <Factory>Build</Factory>\r
+            <Session/>\r
+          </Tab><Tab><Identity>TabID-17364-20199</Identity><TabName>Find in Files</TabName><Factory>Find-in-Files</Factory><Session/></Tab><Tab><Identity>TabID-6287-8523</Identity><TabName>Debug Log</TabName><Factory>Debug-Log</Factory><Session/></Tab></Tabs>\r
+        \r
+      <SelectedTab>2</SelectedTab></Wnd1><Wnd3><Tabs><Tab>\r
+            <Identity>TabID-32336-18161</Identity>\r
+            <TabName>Workspace</TabName>\r
+            <Factory>Workspace</Factory>\r
+            <Session>\r
+              \r
+            <NodeDict><ExpandedNode>flash_based_rfbsl</ExpandedNode></NodeDict></Session>\r
+          </Tab></Tabs><SelectedTab>0</SelectedTab></Wnd3></Windows>\r
+    <Editor>\r
+      \r
+      \r
+      \r
+      \r
+    <Pane/><ActivePane>0</ActivePane><Sizes><Pane><X>1000000</X><Y>1000000</Y></Pane></Sizes><SplitMode>1</SplitMode></Editor>\r
+    <Positions>\r
+      \r
+      \r
+      \r
+      \r
+      \r
+    <Top><Row0><Sizes><Toolbar-0101a0b8><key>iaridepm.enu1</key></Toolbar-0101a0b8></Sizes></Row0></Top><Left><Row0><Sizes><Wnd3><Rect><Top>-2</Top><Left>-2</Left><Bottom>557</Bottom><Right>522</Right><x>-2</x><y>-2</y><xscreen>460</xscreen><yscreen>198</yscreen><sizeHorzCX>319444</sizeHorzCX><sizeHorzCY>240291</sizeHorzCY><sizeVertCX>363889</sizeVertCX><sizeVertCY>678398</sizeVertCY></Rect></Wnd3></Sizes></Row0></Left><Right><Row0><Sizes/></Row0></Right><Bottom><Row0><Sizes><Wnd1><Rect><Top>-2</Top><Left>-2</Left><Bottom>223</Bottom><Right>1442</Right><x>-2</x><y>-2</y><xscreen>1444</xscreen><yscreen>225</yscreen><sizeHorzCX>1002778</sizeHorzCX><sizeHorzCY>273058</sizeHorzCY><sizeVertCX>549306</sizeVertCX><sizeVertCY>813107</sizeVertCY></Rect></Wnd1></Sizes></Row0></Bottom><Float><Sizes/></Float></Positions>\r
+  </Desktop>\r
+</Workspace>\r
+\r
+\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Wireless Update/wbsl.c b/chronos-ti/Software Projects/Chronos Watch/IAR/Wireless Update/wbsl.c
new file mode 100755 (executable)
index 0000000..7c3b6ea
--- /dev/null
@@ -0,0 +1,1154 @@
+// *************************************************************************************************\r
+//\r
+//     Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//       Redistribution and use in source and binary forms, with or without\r
+//       modification, are permitted provided that the following conditions\r
+//       are met:\r
+//\r
+//         Redistributions of source code must retain the above copyright\r
+//         notice, this list of conditions and the following disclaimer.\r
+//\r
+//         Redistributions in binary form must reproduce the above copyright\r
+//         notice, this list of conditions and the following disclaimer in the\r
+//         documentation and/or other materials provided with the\r
+//         distribution.\r
+//\r
+//         Neither the name of Texas Instruments Incorporated nor the names of\r
+//         its contributors may be used to endorse or promote products derived\r
+//         from this software without specific prior written permission.\r
+//\r
+//       THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//       "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//       LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//       A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//       OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//       SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//       LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//       DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//       THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//       (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//       OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+// WBSL functions.\r
+// *************************************************************************************************\r
+\r
+// *************************************************************************************************\r
+// Include section\r
+\r
+// system\r
+#include "project_defs.h"\r
+#include <string.h>\r
+#include "intrinsics.h"\r
+\r
+#ifdef RAM_BASED_RFBSL\r
+#    include "display.h"\r
+#endif\r
+\r
+// driver\r
+#include "radio.h"\r
+#include "rf1a.h"\r
+\r
+// logic\r
+#include "wbsl.h"\r
+\r
+// *************************************************************************************************\r
+// Global Variable section\r
+struct RFwbsl sRFwbsl = { WBSL_OFF, 0, 0 };\r
+\r
+// Rx Buffer to store Received Packages, make sure it starts on an even address so that the payload\r
+// can be written to flash\r
+// with no issues\r
+#pragma data_alignment=2\r
+u8 RxBuffer[258] = {0};\r
+\r
+u8 RxBufferLength = 0;\r
+\r
+// Pointer to write to RAM/Flash\r
+u8 *ptrMemory = (u8 *) 0x0;\r
+\r
+//Address to branch to start RAM Based BSL\r
+u16 start_ram_bsl_address = 0;\r
+\r
+//u8 discoveryPayload[4] = {0xDE,0xAD,0xBE,0xEF};\r
+u8 discoveryPayload[4] = {0xBA, 0x5E, 0xBA, 0x11};\r
+\r
+/*Length*/   /*Ap Address*/ /*My Address*/ /*Batt Volt*/ /*Discovery Payload*/\r
+u8 discoveryReply[8] = {    7,       0, WBSL_ED_ADDRESS,      0, 0xBA, 0x5E, 0xBA, 0x11};\r
+// flag contains status information, trigger to receive data and trigger to exit WBSL\r
+volatile u8 wbsl_flag = 0;\r
+// RF Mode Flag\r
+volatile u8 wbslMode_flag = 0;\r
+// RX Flag\r
+volatile u8 rxtx_flag = 0;\r
+// ACK Reply Package Format    Size   / Dongle ID /   Watch ID   /  ACK Status  / Package Number /\r
+// Package Numer 2\r
+u8 ackReply[6] =           {    5,    0, WBSL_ED_ADDRESS,      0,       0,     0          };\r
+// How far along is the Update procedure Range: 0 - 100\r
+volatile u8 wbsl_progress = 0;\r
+// This is the Address of the Access point which we receive during the linking phase\r
+u8 AP_address = 0;\r
+// Handle number of ACKs sent for an indivudual packet\r
+u8 wbsl_number_of_retries = 0;\r
+// Variable to see if the Init Packet has been successfully sent\r
+u8 initOk = 0;\r
+// Store the total number of packets to be sent to the Watch\r
+u16 totalPackets = 0;\r
+// Keep track of which packet needs to be sent to the Watch\r
+u16 currentPacket = 0;\r
+\r
+#ifndef RAM_BASED_RFBSL\r
+#    pragma location=0x2BE0\r
+__no_init u16 port2_isrAddress;    // Interrupt Vector Address for PORT2 in RAM\r
+#endif\r
+\r
+// Function Prototypes for Local Functions\r
+void start_wbsl(void);\r
+void config_radio_wbsl(void);\r
+void stop_radio_wbsl(void);\r
+u8 wbsl_receivePackets(void);\r
+void wbsl_replyAck(u8 status, u16 packetNummer);\r
+void init_watch(void);\r
+u8 wbsl_link(void);\r
+\r
+#ifndef RAM_BASED_RFBSL\r
+void init_watchButtons(void);\r
+\r
+#endif\r
+\r
+#ifdef RAM_BASED_RFBSL\r
+void massEraseFlash(void);\r
+void wbsl_openFlashForWrite(void);\r
+void wbsl_lockFlash(void);\r
+void init_interrupt_vector(void);\r
+\r
+#endif\r
+\r
+// *************************************************************************************************\r
+// @fn          main\r
+// @brief       Starting point of the RFBSL, calls the needed routines prior to starting\r
+// communication\r
+// @param       none\r
+// @return      u8  exit status\r
+// *************************************************************************************************\r
+int main(){\r
+    WDTCTL = WDTPW + WDTHOLD;        // Stop watchdog timer\r
+\r
+#ifndef RAM_BASED_RFBSL\r
+    if (*((u16*)(0xFFFE)) == 0xFFFF) // Check if recovery procedure needs to be started\r
+    {\r
+        port2_isrAddress = 0x1002;   // Move the address of the Port2_ISR to the address of the\r
+                                     // Port2 interrupt vector in RAM\r
+        SYSCTL |= SYSRIVECT;         // Move interrupt vector to RAM\r
+        init_watchButtons();         // Initialize button S2 so that we wait until is pressed to\r
+                                     // continue\r
+        _BIS_SR(LPM4_bits + GIE);    // Wait until Button is pressed to go to ISR\r
+    }\r
+#endif\r
+\r
+    //Disable all interrupts\r
+    __disable_interrupt();\r
+\r
+    // Initialize clocks and the LCD only in the case of the RAM_BASED_RFBSL\r
+    init_watch();\r
+\r
+#ifdef RAM_BASED_RFBSL\r
+    display_wbsl(LINE2, 0);\r
+#endif\r
+\r
+    while (1){\r
+\r
+#ifdef RAM_BASED_RFBSL\r
+        // Wait for AP/GUI to be ready to send update image\r
+        wbsl_setTimer(CONV_MS_TO_TICKS(900));\r
+        while (!(TA0CCTL1 & CCIFG)) ;\r
+        wbsl_resetTimer();\r
+#endif\r
+\r
+        start_wbsl();\r
+\r
+        // If no AP was found during discovery phase, reset the device\r
+        PMMCTL0 = PMMPW | PMMSWBOR; // generate BOR\r
+\r
+    }\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          init_watchButtons\r
+// @brief       Inits the S2 (Down) button so that it triggers the interrupt to wake up in the case\r
+// of\r
+//              of a recovery procedure\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+#ifndef RAM_BASED_RFBSL\r
+void init_watchButtons(void)\r
+{\r
+    // Set button ports to input\r
+    BUTTONS_DIR &= ~BUTTON_S2_PIN;\r
+\r
+    // Enable internal pull-downs\r
+    BUTTONS_OUT &= ~BUTTON_S2_PIN;\r
+    BUTTONS_REN |= BUTTON_S2_PIN;\r
+\r
+    // IRQ triggers on rising edge\r
+    BUTTONS_IES &= ~BUTTON_S2_PIN;\r
+\r
+    // Reset IRQ flags\r
+    BUTTONS_IFG &= ~BUTTON_S2_PIN;\r
+\r
+    // Enable button S2 interrupts\r
+    BUTTONS_IE |= BUTTON_S2_PIN;\r
+}\r
+\r
+#endif\r
+\r
+// *************************************************************************************************\r
+// @fn          wbsl_openFlashForWrite\r
+// @brief       Opens the Flash for writing by setting the appropriate bits\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+#ifdef RAM_BASED_RFBSL\r
+void wbsl_openFlashForWrite()\r
+{\r
+    FCTL3 = FWKEY;                      // Clear Lock bit\r
+    FCTL1 = FWKEY + WRT;                // Set write bit\r
+}\r
+\r
+#endif\r
+\r
+// *************************************************************************************************\r
+// @fn          wbsl_lockFlash\r
+// @brief       Locks the Flash by setting the appropriate bits\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+#ifdef RAM_BASED_RFBSL\r
+void wbsl_lockFlash(void)\r
+{\r
+    FCTL1 = FWKEY;                      // Clear WRT bit\r
+    FCTL3 = FWKEY + LOCK;               // Set LOCK bit\r
+}\r
+\r
+#endif\r
+\r
+// *************************************************************************************************\r
+// @fn          wbsl_writeByte\r
+// @brief       writes a byte to Memory and checks if it was correctly written\r
+// @param       u8 *address    Address to which you want to write the byte\r
+//             u8 data         The data to be written at the given address\r
+// @return      u8             status\r
+//              WBSL_OPERATION_SUCC   Byte successfully written\r
+//              WBSL_OPERATION_FAIL   Write Check failed\r
+// *************************************************************************************************\r
+u8 wbsl_writeByte(u8 *address, u8 data)\r
+{\r
+    u8 ret_status = WBSL_OPERATION_SUCC;\r
+\r
+#ifdef RAM_BASED_RFBSL\r
+    while (FCTL3 & BUSY) ;\r
+#endif\r
+    *address = data;\r
+#ifdef RAM_BASED_RFBSL\r
+    while (FCTL3 & BUSY) ;\r
+#endif\r
+    // Check if write was successfull\r
+    if (*address != data)\r
+    {\r
+        ret_status = WBSL_OPERATION_FAIL;\r
+    }\r
+    return ret_status;\r
+}\r
+\r
+u8 wbsl_writeWord(u16 *addr, u16 data)\r
+{\r
+    u8 ret_status = WBSL_OPERATION_SUCC;\r
+\r
+#ifdef RAM_BASED_RFBSL\r
+    while (FCTL3 & BUSY) ;\r
+#endif\r
+    *addr = data;\r
+#ifdef RAM_BASED_RFBSL\r
+    while (FCTL3 & BUSY) ;\r
+#endif\r
+    if (*addr != data)\r
+    {\r
+        ret_status = WBSL_OPERATION_FAIL;\r
+    }\r
+    return ret_status;\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          wbsl_writeBytes\r
+// @brief       writes a byte to Memory and checks if it was correctly written\r
+//              the function will write in word mode if possible\r
+// @param       u8 *address    Address to which you want to write the byte\r
+//              u8 size         The number of bytes to be written\r
+//             u8 data         The data to be written at the given address (must be even aligned)\r
+// @return      u8             status\r
+//              WBSL_OPERATION_SUCC   Bytes successfully written\r
+//              WBSL_OPERATION_FAIL   Write Check failed\r
+// *************************************************************************************************\r
+u8 wbsl_writeBytes(u8 *startAddr, u8 size,  u8 *data)\r
+{\r
+    //u8 *i;\r
+    u32 i;\r
+    u8 ret_status = WBSL_OPERATION_SUCC;\r
+\r
+    // Make sure that the comparison doesn't overflow at the End of the 16 bit address, make the\r
+    // comparison in 32bit\r
+    for (i = (u32)startAddr; i < ((u32)startAddr) + ((u32)size); i++)\r
+    {\r
+#ifdef RAM_BASED_RFBSL\r
+        if ((((u16)startAddr) & 0x01) || i == (u32)startAddr + (u32)size - 1)\r
+#endif\r
+        {\r
+            ret_status = wbsl_writeByte((u8 *)((u16)i), *data);\r
+            data += 1;\r
+        }\r
+#ifdef RAM_BASED_RFBSL\r
+        else\r
+        {\r
+            ret_status = wbsl_writeWord((u16 *)((u16)i), *((u16 *)(data)));\r
+            data += 2;\r
+            i++;\r
+        }\r
+#endif\r
+        if (ret_status != WBSL_OPERATION_SUCC)\r
+        {\r
+            return ret_status;\r
+        } // if\r
+\r
+    }     // for\r
+    return ret_status;\r
+\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          wbsl_writePacket\r
+// @brief       writes the packet which is in the global RxBuffer to the address pointed by\r
+//              the global ptrMemory address\r
+// @param       none\r
+// @return      u8             status\r
+//              WBSL_OPERATION_SUCC   Packet successfully written\r
+//              WBSL_OPERATION_FAIL   Write Check failed for some byte of the packet\r
+// *************************************************************************************************\r
+u8 wbsl_writePacket(void){\r
+\r
+    u16 packetSize;\r
+    u8 payloadStart;\r
+    u8 ret_status = WBSL_OPERATION_SUCC;\r
+\r
+    packetSize = RxBuffer[0] - WBSL_PACKET_OVERHEAD;\r
+    payloadStart = FIRST_PAYLOAD_BYTE;\r
+\r
+    // Write to flash the packet\r
+    if (RxBuffer[WBSL_OPCODE_OFFSET] == ADDRESS_PACKET_OPCODE)\r
+    {\r
+        ptrMemory = (u8 *)((RxBuffer[FIRST_PAYLOAD_BYTE] << 8) + RxBuffer[FIRST_PAYLOAD_BYTE + 1]);\r
+        packetSize -= 2;   // Substract the address length\r
+        payloadStart += 2; // Move Offset to compensate for the Address Length\r
+\r
+#ifndef RAM_BASED_RFBSL    // This is only for the flash based BSL, for the RAM Based the address\r
+                           // should be written to flash\r
+        if (ptrMemory == (u8 *)(0xFFFE))\r
+        {\r
+            start_ram_bsl_address = RxBuffer[payloadStart] + (RxBuffer[payloadStart + 1] << 8);\r
+            packetSize -= 2;\r
+        }\r
+#endif\r
+    }\r
+\r
+#ifdef RAM_BASED_RFBSL\r
+    wbsl_openFlashForWrite();\r
+#endif\r
+    // Only if there is something to write\r
+    if (packetSize)\r
+    {\r
+#ifdef RAM_BASED_RFBSL\r
+        // Check memory write boundaries Main Memory 0x8000 - 0xFFFF\r
+        if ((u16)ptrMemory < LOWER_BOUND_MAIN_MEMORY || ((u32)ptrMemory + (u32)packetSize) >\r
+            (u32)UPPER_BOUND_MAIN_MEMORY)\r
+#else\r
+        // Check memory write boundaries Main Memory 0x1D30 - 0x2AFE   (Depends on how you set up\r
+        // the linker file for the flash based RFBSL)\r
+        if ((u16)ptrMemory < LOWER_BOUND_RAM_MEMORY || ((u32)ptrMemory + (u32)packetSize) >\r
+            (u32)UPPER_BOUND_RAM_MEMORY)\r
+#endif\r
+        {\r
+            ret_status = WBSL_OPERATION_FAIL;\r
+        }\r
+        else\r
+        {\r
+            ret_status = wbsl_writeBytes(ptrMemory, packetSize, &RxBuffer[payloadStart]);\r
+        }\r
+\r
+        if (ret_status == WBSL_OPERATION_SUCC)\r
+        {\r
+            ptrMemory += packetSize;\r
+        }\r
+    }\r
+\r
+#ifdef RAM_BASED_RFBSL\r
+    wbsl_lockFlash();\r
+#endif\r
+\r
+    return ret_status;\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          start_wbsl\r
+// @brief       This is the main body of the RFBSL, this functions calls all the auxiliary functions\r
+//              of the RFBSL and handles some of the state flags\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void start_wbsl(void)\r
+{\r
+#ifdef RAM_BASED_RFBSL\r
+    u8 max_link_attempts;\r
+    max_link_attempts = 3;\r
+\r
+    while (max_link_attempts >= 1 && !initOk)\r
+    {\r
+#endif\r
+    //Reset all WBSL Variables\r
+    reset_wbsl();\r
+\r
+    /* Select Interrupt edge for PA_PD and SYNC signal:\r
+     * Interrupt Edge select register: 0 == Interrupt on Low to High transition.\r
+     * SYNC word Detected\r
+     */\r
+    RF1AIES = 0;\r
+\r
+#ifdef RAM_BASED_RFBSL\r
+    // Clear LINE1 Display\r
+    clear_display();\r
+    display_wbsl(LINE1, 0);\r
+\r
+    // Turn on beeper icon to show activity\r
+    display_symbol(LCD_ICON_BEEPER1, SEG_ON_BLINK_ON);\r
+    display_symbol(LCD_ICON_BEEPER2, SEG_ON_BLINK_ON);\r
+    display_symbol(LCD_ICON_BEEPER3, SEG_ON_BLINK_ON);\r
+\r
+#endif // RAM_BASED_RFBSL\r
+\r
+    // Prepare radio for RF communication\r
+    radio_reset();\r
+\r
+#ifndef RAM_BASED_RFBSL\r
+    // It only needs to be configured when the Flash Based RFBSL is running since when the RAM RFBSL\r
+    // runs, the radio registers are already configured\r
+    config_radio_wbsl();\r
+#endif\r
+\r
+#ifdef RAM_BASED_RFBSL\r
+    display_symbol(LCD_SYMB_PERCENT, SEG_ON);\r
+#endif\r
+    // Set WBSL smode\r
+    sRFwbsl.mode = WBSL_SEARCHING;\r
+    wbsl_flag = WBSL_STATUS_LINKING;\r
+\r
+    // Try to link once only to save watch battery\r
+    if (wbsl_link() == WBSL_LINK_SUCC)\r
+    {\r
+        wbsl_flag = WBSL_STATUS_LINKED;\r
+\r
+#ifdef RAM_BASED_RFBSL\r
+        // Turn off blinking on beeper icon to show that the device is linked\r
+        display_symbol(LCD_ICON_BEEPER1, SEG_ON_BLINK_OFF);\r
+        display_symbol(LCD_ICON_BEEPER2, SEG_ON_BLINK_OFF);\r
+        display_symbol(LCD_ICON_BEEPER3, SEG_ON_BLINK_OFF);\r
+\r
+        //Erase all memory main memory\r
+        massEraseFlash();\r
+\r
+#endif  // RAM_BASED_RFBSL\r
+\r
+        while (currentPacket < totalPackets || !initOk)\r
+        {\r
+            if (wbsl_receivePackets() == WBSL_RECEIVE_SUCC)\r
+            {\r
+#ifdef RAM_BASED_RFBSL\r
+                if (wbsl_progress < 100)\r
+                {\r
+                    display_chars(LINE1, itoa(wbsl_progress, 2, 0));\r
+                }\r
+                else\r
+                {\r
+                    display_chars(LINE1, "  ");\r
+                    display_symbol(LCD_SYMB_PERCENT, SEG_OFF);\r
+                    display_chars(LINE2, (u8 *)"  DONE");\r
+                }\r
+#endif\r
+            }\r
+\r
+            // If image has been completely received or the RFBSL was triggered to stop\r
+            if (wbsl_flag == WBSL_TRIGGER_STOP || (currentPacket >= totalPackets && initOk))\r
+            {\r
+                break;\r
+            }\r
+\r
+        }\r
+    }\r
+\r
+\r
+#ifdef RAM_BASED_RFBSL\r
+    // Clear icons\r
+    display_symbol(LCD_ICON_BEEPER1, SEG_OFF_BLINK_OFF);\r
+    display_symbol(LCD_ICON_BEEPER2, SEG_OFF_BLINK_OFF);\r
+    display_symbol(LCD_ICON_BEEPER3, SEG_OFF_BLINK_OFF);\r
+\r
+    // Powerdown radio\r
+    radio_reset();\r
+\r
+    // Clear the LCD segments\r
+    display_symbol(LCD_SYMB_PERCENT, SEG_OFF);\r
+\r
+#endif  // RAM_BASED_RFBSL\r
+\r
+    // Set WBSL state to OFF\r
+    sRFwbsl.mode = WBSL_OFF;\r
+\r
+\r
+    if (currentPacket >= totalPackets && initOk)\r
+    {\r
+#ifdef RAM_BASED_RFBSL\r
+        // Reset the device so that the application which was just downloaded starts from the RESET\r
+        // VECTOR\r
+        PMMCTL0 = PMMPW | PMMSWBOR;  // generate BOR\r
+#else    //Only for the Flash Based RFBSL, jump to the address at which the RAM_RFBSL starts\r
+        asm (" mov.w &start_ram_bsl_address,PC");\r
+#endif\r
+    }\r
+#ifdef RAM_BASED_RFBSL\r
+    else if (max_link_attempts < 1)\r
+    {\r
+        display_chars(LINE1, (u8 *)"  ");\r
+        display_chars(LINE2, (u8 *)"  FAIL");\r
+        break;\r
+    }\r
+\r
+    // Link Failed, decrement link attempts to keep track of how many times we've tried\r
+    max_link_attempts--;\r
+}\r
+\r
+#endif\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          transmitPacket\r
+// @brief       This functions handles the transmission of a packet by filling the\r
+//              TXFIFO and Strobing the Radio with TX, it uses CCA if is defined in\r
+//              the project, if not, it forces the transmit\r
+// @param       u8 *buffer     Buffer containing the bytes to be transmitted\r
+//             u8 length       Length of the buffer to be transmitted\r
+// @return      none\r
+// *************************************************************************************************\r
+void transmitPacket(u8 *buffer, u8 length)\r
+{\r
+#ifdef CCA\r
+    u8 ccaRetries;\r
+    u8 x;\r
+#endif\r
+    // Turn off receiver\r
+    ReceiveOff();\r
+    // Write the Buffer to the Transmit FIFO\r
+    WriteBurstReg(RF_TXFIFOWR, buffer, length);\r
+\r
+#ifdef CCA\r
+    ccaRetries = 4;\r
+\r
+    while (1){\r
+        /* Radio must be in RX mode for CCA to happen.\r
+         * Otherwise it will transmit without CCA happening.\r
+         * We don't use the RxModeOn because it turns the RX interrupt\r
+         * which we don't need\r
+         */\r
+        Strobe(RF_SRX);\r
+\r
+        //Wait for valid RSSI\r
+        while (!(RF1AIN & BV(1))) ;\r
+\r
+        /*\r
+         *  Clear the PA_PD pin interrupt flag.  This flag, not the interrupt itself,\r
+         *  is used to capture the transition that indicates a transmit was started.\r
+         *  The pin level cannot be used to indicate transmit success as timing may\r
+         *  prevent the transition from being detected.  The interrupt latch captures\r
+         *  the event regardless of timing.\r
+         */\r
+        RF1AIFG &= ~BV(0);\r
+\r
+        Strobe(RF_STX);      // Strobe STX    to initiate transfer\r
+\r
+        /*   Found out that we need a delay of atleast 25 us on CC1100 to see\r
+         * the PA_PD signal change. Hence keeping the same for CC430\r
+         */\r
+        wbsl_setTimer(25);\r
+        while (!(TA0CCTL1 & CCIFG)) ;\r
+        wbsl_resetTimer();\r
+\r
+        if (RF1AIFG & BV(0))\r
+        {\r
+            /* ------------------------------------------------------------------\r
+             *    Clear Channel Assessment passed.\r
+             *   ----------------------------------\r
+             */\r
+\r
+            //Clear the PA_PD pin interrupt flag.\r
+            RF1AIFG &= ~BV(0);\r
+\r
+            /* wait for transmit to complete */\r
+            while (!(RF1AIN & BV(0))) ;\r
+            // Transmit done, break of loop\r
+            break;\r
+        }\r
+        else\r
+        {\r
+            /* ------------------------------------------------------------------\r
+             *    Clear Channel Assessment failed.\r
+             *   ----------------------------------\r
+             */\r
+            // Turn off radio to save power\r
+            do {\r
+                x = Strobe(RF_SIDLE);\r
+            } while (x & 0x70);\r
+            /* Wait for XOSC to be stable and radio in IDLE state */\r
+\r
+            // Flush receive FIFO of residual Data\r
+            Strobe(RF_SFRX);\r
+\r
+            if (ccaRetries != 0)\r
+            {\r
+                /* delay for a number of us */\r
+                wbsl_setTimer(15);\r
+                while (!(TA0CCTL1 & CCIFG)) ;\r
+                wbsl_resetTimer();\r
+\r
+                /* decrement CCA retries before loop continues */\r
+                ccaRetries--;\r
+            }\r
+            else /* No CCA retries are left, abort */\r
+            {\r
+                /* set return value for failed transmit and break */\r
+                return;\r
+            }\r
+        }\r
+    }\r
+#else            // Forced TX\r
+\r
+    Strobe(RF_STX);\r
+\r
+    while (!(RF1AIFG & BIT9)) ;  //Wait until packet has been sent\r
+\r
+    // Clear the interrupt flag\r
+    RF1AIFG &= ~BIT9;\r
+#endif // CCA\r
+\r
+    // Flush transmit FIFO, Radio is already in IDLE state due to Register configuration\r
+    Strobe(RF_SFTX);\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          wbsl_link\r
+// @brief       Tries to link with a AP by sending a discovery packet and waiting for\r
+//              a discovery reply or TIMEOUT_FOR_ACK time\r
+// @param       none\r
+// @return      u8 link_Status\r
+//              WBSL_LINK_SUCC   The watch found an AP and they're both linked\r
+//              WBSL_LINK_FAIL   The watch didn't find any AP which responded to\r
+//                               the discovery packet\r
+// *************************************************************************************************\r
+u8 wbsl_link(void){\r
+    u8 crcOk = 0;\r
+    u8 retStatus = WBSL_LINK_FAIL;\r
+\r
+    //u8 temp_PKTCTRL1;\r
+    // Already Set\r
+    //discoveryReply[AP_ADDRESS_OFFSET_TX] = 0x00;   // Broadcast so that any AP listening receives\r
+    // the package\r
+\r
+    transmitPacket((u8*)discoveryReply, sizeof discoveryReply);\r
+\r
+    // Activate RX Mode to wait for ACK of pairing from the AP\r
+    ReceiveOn();\r
+\r
+    // Wait for a packet to be received or timeout\r
+    wbsl_setTimer(TIMEOUT_FOR_ACK);\r
+\r
+    // Go to LPM3 and wait for either the interrupt from the timer or the RX Interrupt\r
+    //_BIS_SR(LPM3_bits);\r
+\r
+    while (!(TA0CCTL1 & CCIFG) && rxtx_flag != WBSL_RXTX_RECEIVED)\r
+    {\r
+        if (RF1AIFG & BIT9)   // Check for the SYNC WORD detected flag\r
+            RadioIsr_wbsl();  // Call the ISR to retrieve the received packet\r
+\r
+        //Here we should sleep to wait for either Timeout or Radio\r
+        //_BIS_SR(LPM0_bits);\r
+    }\r
+\r
+    // Reset the timer so that next time it starts from fresh state.\r
+    wbsl_resetTimer();\r
+\r
+    // Turn radio off during the decoding of the package\r
+    ReceiveOff();\r
+\r
+    if (rxtx_flag == WBSL_RXTX_RECEIVED)\r
+    {\r
+        // Clear RX Flag\r
+        rxtx_flag = 0;\r
+\r
+        crcOk = RxBuffer[RxBuffer[0] + WBSL_CRC_STATUS_OFFSET] & CRC_STATUS; //CRC status is\r
+                                                                             // appended at the end\r
+                                                                             // of RXFIFO\r
+\r
+        if (                                                                 //RxBuffer[ED_ADDRESS_OFFSET_RX]!=\r
+                                                                             // WBSL_ED_ADDRESS ||\r
+            RxBuffer[LINK_ACK_OFFSET] != WBSL_LINK_SUCC      ||\r
+            !crcOk)                                                          // Check the package is\r
+                                                                             // from the AP, the\r
+                                                                             // Address check is\r
+                                                                             // done in hardware\r
+        {\r
+            return retStatus;\r
+        }\r
+        else\r
+        {\r
+            //Save AP_address\r
+            AP_address = RxBuffer[AP_ADDRESS_OFFSET_RX];\r
+\r
+            // Set the Link as succesfull so the actual communication can start\r
+            retStatus = WBSL_LINK_SUCC;\r
+        }\r
+    }\r
+    return retStatus;\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          wbsl_replyAck\r
+// @brief       Replies with an ACK or NACK to the AP\r
+// @param       u8 status          ACK or NACK\r
+//              u16 packetNummer   The packet number for which the ACK is\r
+// @return      none\r
+// *************************************************************************************************\r
+void wbsl_replyAck(u8 status, u16 packetNummer){\r
+    // Delay to let AP Dongle be in RX Mode\r
+    // Set the timeout\r
+    wbsl_setTimer(CONV_US_TO_TICKS(300));\r
+    // Wait for a timeout\r
+    while (!(TA0CCTL1 & CCIFG)) ;\r
+    // Reset the timer\r
+    wbsl_resetTimer();\r
+    //Fill the ACK Reply Buffer\r
+    ackReply[AP_ADDRESS_OFFSET_TX] = AP_address;\r
+    //ackReply[ED_ADDRESS_OFFSET_TX] = WBSL_ED_ADDRESS;  // This is put on declaration\r
+    ackReply[ED_ADDRESS_OFFSET_TX + 1] = status;\r
+\r
+    ackReply[ED_ADDRESS_OFFSET_TX + 2] = (packetNummer >> 8) & 0x7F;\r
+    ackReply[ED_ADDRESS_OFFSET_TX + 3] = packetNummer;\r
+\r
+    transmitPacket((u8*)ackReply, sizeof(ackReply));\r
+\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          wbsl_receivePackets\r
+// @brief       This functions puts the radio in RX Mode to listen for new packages\r
+//              and waits for TIMEOUT, if packet is received, check for CRC,\r
+//              if packet was sent from AP and addressed to us, if everything\r
+//              checks out, it calls the write packet function\r
+// @param       none\r
+// @return      u8 status\r
+//              WBSL_ERROR      No packet was received or error during writing\r
+//              WBSL_SUCC       Packet was received and written to memory\r
+// *************************************************************************************************\r
+u8 wbsl_receivePackets(void){\r
+    u8 crcOk = 0;\r
+    u16 tempCurrentPacket = 0;\r
+    u8 retStatus = WBSL_LINK_FAIL;\r
+\r
+    // Increment the number of retries to send the ACK\r
+    wbsl_number_of_retries++;\r
+\r
+    // Check if too many retries for one packet have been already made\r
+    if (wbsl_number_of_retries >= WBSL_MAXIMUM_RETRIES)\r
+    {\r
+        // Trigger the stop of the WBSL Update procedure\r
+        wbsl_flag = WBSL_TRIGGER_STOP;\r
+        return retStatus;\r
+    }\r
+    // Activate RX Mode to listen to new packets\r
+    ReceiveOn();\r
+\r
+    // Set the timeout so we don't get stuck waiting for a packet\r
+    wbsl_setTimer(TIMEOUT_FOR_ACK);\r
+\r
+    // Wait for a packet to be received or timeout\r
+    while (!(TA0CCTL1 & CCIFG) && rxtx_flag != WBSL_RXTX_RECEIVED)\r
+    {\r
+        // Check the SYNC Word detected flag\r
+        if (RF1AIFG & BIT9)\r
+            RadioIsr_wbsl();\r
+\r
+        //Here we should sleep to wait for either Timeout or Radio\r
+        //_BIS_SR(LPM0_bits);\r
+    }\r
+\r
+    // Reset the timer so that next time it starts from fresh state.\r
+    wbsl_resetTimer();\r
+    // Turn radio off during the decoding of the package\r
+    ReceiveOff();\r
+\r
+    // If the was no packet received, then a TIMEOUT happened, we need to send\r
+    // an ack for previous pkt, but just in the case it was a regular packet and not a init Packet\r
+    if (rxtx_flag != WBSL_RXTX_RECEIVED && initOk)\r
+    {\r
+        //Reply Positive ACK for previous packet, in case AP didn't receive last ACK\r
+        wbsl_replyAck(WBSL_LINK_SUCC, currentPacket - 1);\r
+    }\r
+    else if (rxtx_flag == WBSL_RXTX_RECEIVED)\r
+    {\r
+        // Clear RX Flag\r
+        rxtx_flag = 0;\r
+\r
+        crcOk = RxBuffer[RxBuffer[0] + WBSL_CRC_STATUS_OFFSET] & CRC_STATUS; //CRC status is\r
+                                                                             // appended at the end\r
+                                                                             // of RXFIFO\r
+\r
+        if (                                                                 //RxBuffer[ED_ADDRESS_OFFSET_RX]\r
+                                                                             // == WBSL_ED_ADDRESS\r
+                                                                             // &&  // Address check\r
+                                                                             // is now done in\r
+                                                                             // hardware\r
+            RxBuffer[AP_ADDRESS_OFFSET_RX] == AP_address)                    // Check that the\r
+                                                                             // packet comes from\r
+                                                                             // the AP we're linked\r
+                                                                             // to\r
+        {\r
+            // If we're not initialized for communication, this should be an Init packet, treat it\r
+            // as such\r
+            if (!initOk)\r
+            {\r
+                if (crcOk)\r
+                {\r
+                    // Reset the retry counter for ACKs\r
+                    wbsl_number_of_retries = 0;\r
+                    // Total number of packets to be sent during the update process\r
+                    totalPackets = RxBuffer[3] + (RxBuffer[4] << 8);\r
+\r
+                    //Reply Positive ACK\r
+                    wbsl_replyAck(WBSL_LINK_SUCC, 0xFFFF);\r
+\r
+                    initOk = 1;\r
+                }\r
+                else\r
+                {\r
+                    // CRC ERROR Reply Negative ACK\r
+                    wbsl_replyAck(WBSL_LINK_FAIL, 0xFFFF);\r
+                }\r
+            }\r
+            else\r
+            {\r
+                // Delay to let AP Dongle be in RX Mode\r
+                // Set the timeout\r
+                //wbsl_setTimer(CONV_US_TO_TICKS(500));\r
+                // Wait for a packet to be received or timeout\r
+                //while(!(TA0CCTL1 & CCIFG));\r
+                // Reset the timer\r
+                //wbsl_resetTimer();\r
+\r
+                if (crcOk)\r
+                {\r
+                    tempCurrentPacket = RxBuffer[4] + (RxBuffer[3] << 8 & 0xFF00);                    //\r
+                                                                                                      // Keep\r
+                                                                                                      // track\r
+                                                                                                      // of\r
+                                                                                                      // which\r
+                                                                                                      // packet\r
+                                                                                                      // is\r
+                                                                                                      // being\r
+                                                                                                      // sent\r
+\r
+                    //Check that we are receiving the next packet needed\r
+                    if (tempCurrentPacket == currentPacket)\r
+                    {\r
+                        if (wbsl_writePacket() == WBSL_OPERATION_SUCC)\r
+                        {\r
+                            // Reset the retry counter for ACKs\r
+                            wbsl_number_of_retries = 0;\r
+                            //Reply Positive ACK\r
+                            wbsl_replyAck(WBSL_LINK_SUCC, currentPacket);\r
+                            //Increment the currentPacket to keep track of which packets we have\r
+                            // received\r
+                            currentPacket++;\r
+                            wbsl_progress = (currentPacket * 100) / totalPackets;\r
+                            retStatus = WBSL_LINK_SUCC;\r
+                        }\r
+                        else\r
+                        {\r
+                            // Write Error ask AP to send package again.\r
+                            wbsl_replyAck(WBSL_LINK_FAIL, currentPacket);\r
+                        }\r
+                    }\r
+                    else\r
+                    {\r
+                        //There is an error on the flow of packets DEAL with it\r
+                        //Reply Positive ACK for previous packet, in case AP didn't receive last ACK\r
+                        wbsl_replyAck(WBSL_LINK_SUCC, currentPacket - 1);\r
+                    }\r
+                }\r
+                else\r
+                {\r
+                    // CRC Error reply with a NACK\r
+                    wbsl_replyAck(WBSL_LINK_FAIL, currentPacket);\r
+                }\r
+            }\r
+        }\r
+    }\r
+\r
+    return retStatus;\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          RadioIsr_wbsl\r
+// @brief       Retrieves the packet waiting on the RXFIFO of the Radio\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void RadioIsr_wbsl(void)\r
+{\r
+    u8 rxBytes;\r
+    u8 tL;\r
+    u8 *tmpRxBuffer;\r
+    u16 coreIntSource = RF1AIV;\r
+\r
+    // Clear RX Interrupt Flag\r
+    RF1AIFG &= ~BIT9;\r
+\r
+    // We should only be here in RX mode, not in TX mode, nor if RX mode was turned on during CCA\r
+    if (wbslMode_flag != WBSL_RX_MODE)\r
+    {\r
+        return;\r
+    }\r
+\r
+    // Clean Buffer to help protect against spurios frames\r
+    memset(RxBuffer, 0x00, sizeof(RxBuffer));\r
+\r
+    // Use a pointer to move through the Buffer\r
+    tmpRxBuffer = RxBuffer;\r
+\r
+    // Read the number of bytes ready on the FIFO\r
+    rxBytes = ReadSingleReg(RXBYTES);\r
+\r
+    do {\r
+        tL = rxBytes;\r
+        rxBytes = ReadSingleReg(RXBYTES);\r
+    } while (tL != rxBytes);                 // Due to a chip bug, the RXBYTES has to read the same\r
+                                             // value twice for it to be correct\r
+\r
+    if (rxBytes == 0)                        // Check if the RX FIFO is empty, this may happen if\r
+                                             // address check is enabled and the FIFO is flushed\r
+                                             // when address doesn't match\r
+    {\r
+        return;\r
+    }\r
+\r
+    *tmpRxBuffer++ = ReadSingleReg(RXFIFO);\r
+    RxBufferLength = *(tmpRxBuffer - 1) + 2; // Add 2 for the status bytes which are appended by the\r
+                                             // Radio\r
+\r
+\r
+    // Check if number of bytes in Fifo exceed the FIFO Size, if so, assume FIFO overflow due to\r
+    // something\r
+    // gone wrong with radio, and the only way to fix it, is to force IDLE mode and then back to RX\r
+    // Mode\r
+    if (rxBytes > MAX_RXFIFO_SIZE)\r
+    {\r
+        ReceiveOff();\r
+        ReceiveOn();\r
+        return;\r
+    }\r
+    // else: everything matches continue\r
+\r
+    //Copy Rest of packet\r
+    while (RxBufferLength > 1){\r
+\r
+        rxBytes = ReadSingleReg(RXBYTES);\r
+\r
+        do {\r
+            tL = rxBytes;\r
+            rxBytes = ReadSingleReg(RXBYTES);\r
+        } while (tL != rxBytes); // Due to a chip bug, the RXBYTES has to read the same value twice\r
+                                 // for it to be correct\r
+\r
+        while (rxBytes > 1)\r
+        {\r
+            *tmpRxBuffer++ = ReadSingleReg(RXFIFO);\r
+            RxBufferLength--; rxBytes--;\r
+        }\r
+    }\r
+    *tmpRxBuffer++ = ReadSingleReg(RXFIFO);\r
+\r
+    // Signal main program that packet has been received and ready in RxBuffer\r
+    rxtx_flag = WBSL_RXTX_RECEIVED;\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          massEraseFlash\r
+// @brief       Erases the main memory flash of the watch\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+#ifdef RAM_BASED_RFBSL\r
+void massEraseFlash(void)\r
+{\r
+    volatile char *Flash_ptr;                           //Flash pointer\r
+\r
+    while (FCTL3 & BUSY) ;\r
+    FCTL3 = FWKEY;\r
+    while (FCTL3 & BUSY) ;\r
+    Flash_ptr = (char *)INTERRUPT_VECTOR_START_ADDRESS; //Interrupt Vector Start\r
+    FCTL1 = FWKEY + MERAS + ERASE;                      // Set Mass Erase Bits\r
+    *Flash_ptr = 0;\r
+    while (FCTL3 & BUSY) ;\r
+    FCTL3 = FWKEY +  LOCK;\r
+}\r
+\r
+#endif // RAM_BASED_RFBSL\r
+\r
+// *************************************************************************************************\r
+// @fn          init_watch\r
+// @brief       Inits basic options in the watch and depending of the type of RFBSL\r
+//              being compiled it choses which components to initialize\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void init_watch(void){\r
+\r
+\r
+    // Initialize Clocks\r
+    // ---------------------------------------------------------------------\r
+    // Enable 32kHz ACLK\r
+    P5SEL |= 0x03;                     // Select XIN, XOUT on P5.0 and P5.1\r
+    UCSCTL6 &= ~(XT1OFF + XT1DRIVE_3); // XT1 On, Lowest drive strength\r
+    UCSCTL6 |= XCAP_3;                 // Internal load cap\r
+\r
+    UCSCTL3 = SELA__XT1CLK;            // Select XT1 as FLL reference\r
+    UCSCTL4 = SELA__XT1CLK | SELS__DCOCLKDIV | SELM__DCOCLKDIV;\r
+    // ---------------------------------------------------------------------\r
+    // Configure CPU clock for 12MHz\r
+    _BIS_SR(SCG0);                     // Disable the FLL control loop\r
+    UCSCTL0 = 0x0000;                  // Set lowest possible DCOx, MODx\r
+    UCSCTL1 = DCORSEL_5;               // Select suitable range\r
+    UCSCTL2 = FLLD_1 + 0x16E;          // Set DCO Multiplier\r
+    _BIC_SR(SCG0);                     // Enable the FLL control loop\r
+\r
+    // Worst-case settling time for the DCO when the DCO range bits have been\r
+    // changed is n x 32 x 32 x f_MCLK / f_FLL_reference. See UCS chapter in 5xx\r
+    // UG for optimization.\r
+    // 32 x 32 x 8 MHz / 32,768 Hz = 250000 = MCLK cycles for DCO to settle\r
+    __delay_cycles(250000);\r
+\r
+    // Loop until XT1 & DCO stabilizes, use do-while to insure that\r
+    // body is executed at least once\r
+    do\r
+    {\r
+        UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG + XT1HFOFFG + DCOFFG);\r
+        SFRIFG1 &= ~OFIFG;             // Clear fault flags\r
+    } while ((SFRIFG1 & OFIFG));\r
+\r
+#ifdef RAM_BASED_RFBSL\r
+    lcd_init();\r
+#endif\r
+\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          display_wbsl\r
+// @brief       WBSL display routine.\r
+// @param       u8 line                        LINE2\r
+//             u8 update               DISPLAY_LINE_UPDATE_FULL\r
+// @return      none\r
+// *************************************************************************************************\r
+#ifdef RAM_BASED_RFBSL\r
+void display_wbsl(u8 line, u8 update)\r
+{\r
+    display_chars(LINE2, (u8 *)" RFBSL");\r
+}\r
+\r
+#endif\r
+\r
+// *************************************************************************************************\r
+// @fn          reset_wbsl\r
+// @brief       Reset WBSL data.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void reset_wbsl(void)\r
+{\r
+    // No connection\r
+    sRFwbsl.mode = WBSL_OFF;\r
+\r
+    //Reset the progress variables\r
+    wbsl_progress = 0;\r
+    currentPacket = 0;\r
+    totalPackets = 0;\r
+\r
+    // Reset the number of retries to send the ACK\r
+    wbsl_number_of_retries = 0;\r
+\r
+    // Clear init flag to send the total number of packets on the first transmission packet\r
+    initOk = 0;\r
+    RF1AIFG = 0;   // Clear Radio Flags\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          wbsl_resetTimer\r
+// @brief       Resets the timer TA0 and stops it\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void wbsl_resetTimer(void){\r
+\r
+    // Reset IRQ flag\r
+    TA0CCTL1 &= ~CCIFG;\r
+\r
+    // Stop Timer0\r
+    TA0CTL &= ~(MC1 + MC0);\r
+\r
+    // Set Timer0 count register to 0x0000\r
+    TA0R = 0;\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          wbsl_setTimer\r
+// @brief       Set the timer for the Packet timeouts the timeout param is in ticks 1 tick = 1 /\r
+// 32768 sec\r
+// @param       u16 ticks   Value in ticks (1 tick = 1 / 32768 secs) that wants the timeout to run\r
+// must\r
+//                          be less than 32768 if greater than 32768 it is set to 32767\r
+// @return      none\r
+// *************************************************************************************************\r
+void wbsl_setTimer(u16 ticks)\r
+{\r
+\r
+    if (ticks > 32767)\r
+        ticks = 32767;\r
+\r
+    // Update CCR\r
+    TA0CCR1 = ticks;\r
+\r
+    // Reset IRQ flag\r
+    TA0CCTL1 &= ~CCIFG;\r
+\r
+    // Clear and start timer now\r
+    // Continuous mode: Count to 0xFFFF and restart from 0 again - 1sec timing will be generated by\r
+    // ISR\r
+    TA0CTL   |= TASSEL0 + MC1 + TACLR;\r
+\r
+}\r
+\r
diff --git a/chronos-ti/Software Projects/Chronos Watch/IAR/Wireless Update/wbsl.h b/chronos-ti/Software Projects/Chronos Watch/IAR/Wireless Update/wbsl.h
new file mode 100755 (executable)
index 0000000..546c667
--- /dev/null
@@ -0,0 +1,241 @@
+// *************************************************************************************************\r
+//\r
+//     Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/\r
+//\r
+//\r
+//       Redistribution and use in source and binary forms, with or without\r
+//       modification, are permitted provided that the following conditions\r
+//       are met:\r
+//\r
+//         Redistributions of source code must retain the above copyright\r
+//         notice, this list of conditions and the following disclaimer.\r
+//\r
+//         Redistributions in binary form must reproduce the above copyright\r
+//         notice, this list of conditions and the following disclaimer in the\r
+//         documentation and/or other materials provided with the\r
+//         distribution.\r
+//\r
+//         Neither the name of Texas Instruments Incorporated nor the names of\r
+//         its contributors may be used to endorse or promote products derived\r
+//         from this software without specific prior written permission.\r
+//\r
+//       THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//       "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//       LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//       A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//       OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//       SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//       LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//       DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//       THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//       (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//       OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+#ifndef WBSL_H_\r
+#define WBSL_H_\r
+\r
+#include "project_defs.h"\r
+\r
+//Temporal Defines\r
+\r
+/*\r
+ * Product = CC430\r
+ * Chip version (VERSION = 0x06)\r
+ * Crystal accuracy = 10 ppm\r
+ * X-tal frequency = 26 MHz\r
+ * RF output power = 0 dBm\r
+ * RX filterbandwidth = 101.562500 kHz\r
+ * Deviation = 19 kHz\r
+ * Datarate = 38.383484 kBaud\r
+ * Modulation = (1) GFSK\r
+ * Manchester enable = (0) Manchester disabled\r
+ * RF Frequency = 914.999 MHz\r
+ * Channel spacing = 199.951172 kHz\r
+ * Channel number = 0\r
+ * Optimization = -\r
+ * Sync mode = (3) 30/32 sync word bits detected\r
+ * Format of RX/TX data = (0) Normal mode, use FIFOs for RX and TX\r
+ * CRC operation = (1) CRC calculation in TX and CRC check in RX disabled\r
+ * Forward Error Correction = (0) FEC disabled\r
+ * Length configuration = (1) Variable length packets, packet length configured by the first\r
+ * received byte after sync word.\r
+ * Packetlength = 10\r
+ * Preamble count = 0 bytes - sync word is always accepted\r
+ * Append status = 0\r
+ * Address check = (0) No Address check\r
+ * FIFO autoflush = 0\r
+ * Device address = 0\r
+ * GDO0 signals on PA power down signal to control RX/TX switch\r
+ * GDO1 signals on RSSI_VALID\r
+ * GDO2 signal selection = (41) CHIP_RDY\r
+ */\r
+\r
+//#include "cc430x613x.cmd"\r
+\r
+//Watch ports\r
+#define BUTTONS_IN              (P2IN)\r
+#define BUTTONS_OUT             (P2OUT)\r
+#define BUTTONS_DIR             (P2DIR)\r
+#define BUTTONS_REN             (P2REN)\r
+#define BUTTONS_IE              (P2IE)\r
+#define BUTTONS_IES             (P2IES)\r
+#define BUTTONS_IFG             (P2IFG)\r
+#define BUTTONS_IRQ_VECT2       (PORT2_VECTOR)\r
+\r
+// Button ports\r
+#define BUTTON_M1_PIN           (BIT2)\r
+#define BUTTON_M2_PIN           (BIT1)\r
+#define BUTTON_S1_PIN           (BIT4)\r
+#define BUTTON_S2_PIN           (BIT0)\r
+#define BUTTON_BL_PIN           (BIT3)\r
+#define ALL_BUTTONS                             (BUTTON_M1_PIN + BUTTON_M2_PIN + BUTTON_S1_PIN + \\r
+                                                 BUTTON_S2_PIN + BUTTON_BL_PIN)\r
+\r
+\r
+#define FLASH_RFSBL_ENTRY       (0x1000)\r
+#define RESET_VECTOR_ADDRESS    (0xFFFE)\r
+#define PORT2_VECTOR_ADDRESS    (0xFFE0)\r
+\r
+#ifdef RAM_BASED_RFBSL\r
+extern void wbsl_vector_write(void);\r
+\r
+#endif\r
+\r
+// ---------------------------------------------------------------\r
+// Generic Defines and variables\r
+// Maximum data length\r
+#define WBSL_MAX_PAYLOAD_LENGTH         (253u)\r
+#define WBSL_ED_ADDRESS                 (0xAD)\r
+#define WBSL_CRC_STATUS_OFFSET          (2)\r
+#define DISCOVERY_PAYLOAD_LENGTH        (4u)\r
+#define DISCOVERY_OVERHEAD_LENGTH       (3u)\r
+#define AP_ADDRESS_OFFSET_TX            (1u)\r
+#define ED_ADDRESS_OFFSET_TX            (2u)\r
+#define BATTERY_VOLTAGE_OFFSET          (3u)\r
+#define LINK_ACK_OFFSET                 (3u)\r
+#define AP_ADDRESS_OFFSET_RX            (2u)\r
+#define ED_ADDRESS_OFFSET_RX            (1u)\r
+#define WBSL_OPCODE_OFFSET              (5u)\r
+\r
+#define MAX_RXFIFO_SIZE                 (64u)\r
+\r
+#define WBSL_PACKET_OVERHEAD            (5u)\r
+#define WBSL_LENGTH_FIELD_SIZE          (1u)\r
+#define PACKET_HEADER_OFFSET            (3u)\r
+//#define IS_ADDRESS                      (0x80)\r
+//#define MSB_PACKET_NUMBER               (0x7F)\r
+//#define LSB_PACKET_NUMBER               (0xFF)\r
+\r
+#define INIT_PACKET_OPCODE              (0u)\r
+#define ADDRESS_PACKET_OPCODE           (1u)\r
+#define NORMAL_PACKET_OPCODE            (2u)\r
+\r
+#define FIRST_PAYLOAD_BYTE              (WBSL_PACKET_OVERHEAD + WBSL_LENGTH_FIELD_SIZE)\r
+\r
+#define WBSL_LAST_FLASH_WORD_ADDRESS   ((u8 *)0xFFFE)\r
+\r
+#define WBSL_ACK_PKT_SIZE               (5u)\r
+\r
+#define WBSL_LINK_FAIL                   (0u)\r
+#define WBSL_LINK_SUCC                   (1u)\r
+\r
+#define WBSL_RECEIVE_FAIL               (0u)\r
+#define WBSL_RECEIVE_SUCC               (1u)\r
+\r
+#define WBSL_INIT_ACK                    (0)\r
+#define WBSL_PKT_ACK                     (1u)\r
+\r
+#define CRC_STATUS                      (0x80)\r
+\r
+#define WBSL_MAXIMUM_RETRIES            (5u)\r
+\r
+#define START_USER_FLASH_MEMORY         (0x8000)\r
+#define END_USER_FLASH_MEMORY           (0xFFFE)\r
+#define FLASH_SEGMENT_SIZE              (0x200)\r
+#define INTERRUPT_VECTOR_START_ADDRESS  (0xFFE0)\r
+#define RESET VECTOR_SIZE(0x80)\r
+\r
+#define WBSL_STATUS_LINKING             (BIT0)\r
+#define WBSL_STATUS_LINKED              (BIT1)\r
+#define WBSL_STATUS_ERROR               (BIT2)\r
+#define WBSL_TRIGGER_SEND_DATA          (BIT3)\r
+#define WBSL_TRIGGER_RECEIVED_DATA      (BIT4)\r
+#define WBSL_TRIGGER_STOP               (BIT5)\r
+#define WBSL_TRIGGER_SEND_CMD           (BIT6)\r
+#define WBSL_ILLEGAL_MEMORY_ERROR       (BIT7)\r
+\r
+// Flag for status information, to see if WBSL is in RX/TX/IDLE mode\r
+extern volatile u8 wbslMode_flag;\r
+#define WBSL_IDLE_MODE                  (BIT0)\r
+#define WBSL_RX_MODE                    (BIT1)\r
+#define WBSL_TX_MODE                    (BIT2)\r
+\r
+\r
+#define WBSL_RXTX_RECEIVED              (BIT0)\r
+#define WBSL_RXTX_SEND                  (BIT1)\r
+\r
+#define WBSL_PACKET_WRITTEN_FAIL        (0u)\r
+#define WBSL_PACKET_WRITTEN_SUCC        (1u)\r
+\r
+#define WBSL_OPERATION_FAIL             (0u)\r
+#define WBSL_OPERATION_SUCC             (1u)\r
+\r
+#define TIMEOUT_FOR_ACK                 (CONV_MS_TO_TICKS(500)) // 500 milliseconds in ticks\r
+\r
+#define LOWER_BOUND_MAIN_MEMORY         (0x8000)\r
+#define UPPER_BOUND_MAIN_MEMORY         (0x10000)\r
+\r
+#define LOWER_BOUND_RAM_MEMORY          (0x1D30)\r
+#define UPPER_BOUND_RAM_MEMORY          (0x2AFE)\r
+\r
+// SimpliciTI connection states\r
+typedef enum\r
+{\r
+    WBSL_OFF = 0,                                               // Not connected\r
+    WBSL_SEARCHING,                                             // Trying to pair with End Device\r
+    WBSL_ERROR,                                                 // Connection Error\r
+    WBSL_TIMEOUT,                                               // Packet timeout during WBSL\r
+                                                                // transfer\r
+    WBSL_CONNECTED                                              // Bsl Update\r
+} wbsl_mode_t;\r
+\r
+// *************************************************************************************************\r
+// Global Variable section\r
+struct RFwbsl\r
+{\r
+    // Different WBSL Modes\r
+    volatile wbsl_mode_t mode;\r
+    //Watch ID\r
+    volatile u32 wId;\r
+    // Timeout until WBSL is automatically stopped\r
+    volatile u16 timeout;\r
+};\r
+//Prototypes\r
+extern void sx_wbsl(u8 line);\r
+\r
+#ifdef RAM_BASED_RFBSL\r
+extern void display_wbsl(u8 line, u8 update);\r
+\r
+#endif\r
+\r
+extern void reset_wbsl(void);\r
+extern void RadioIsr_wbsl(void);\r
+\r
+extern void wbsl_resetTimer(void);\r
+extern void wbsl_setTimer(u16 ticks);\r
+\r
+extern void init_watchButtons(void);\r
+extern u8 wbsl_writeWord(u16 *addr, u16 data);\r
+\r
+extern struct RFwbsl sRFwbsl;\r
+\r
+extern volatile u8 wbsl_progress;\r
+extern u8 AP_address;\r
+\r
+extern volatile u8 wbsl_flag;\r
+// Flag to signal a packet received to the main program\r
+extern volatile u8 rxtx_flag;\r
+\r
+\r
+#endif /*WBSL_H_*/\r
diff --git a/chronos-ti/Software Projects/RF Access Point/IAR/BM_API.h b/chronos-ti/Software Projects/RF Access Point/IAR/BM_API.h
new file mode 100755 (executable)
index 0000000..a1647d5
--- /dev/null
@@ -0,0 +1,112 @@
+// *************************************************************************************************\r
+//\r
+//     Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/ \r
+//      \r
+//      \r
+//       Redistribution and use in source and binary forms, with or without \r
+//       modification, are permitted provided that the following conditions \r
+//       are met:\r
+//     \r
+//         Redistributions of source code must retain the above copyright \r
+//         notice, this list of conditions and the following disclaimer.\r
+//      \r
+//         Redistributions in binary form must reproduce the above copyright\r
+//         notice, this list of conditions and the following disclaimer in the \r
+//         documentation and/or other materials provided with the   \r
+//         distribution.\r
+//      \r
+//         Neither the name of Texas Instruments Incorporated nor the names of\r
+//         its contributors may be used to endorse or promote products derived\r
+//         from this software without specific prior written permission.\r
+//     \r
+//       THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \r
+//       "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT \r
+//       LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//       A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT \r
+//       OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, \r
+//       SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT \r
+//       LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//       DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//       THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT \r
+//       (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE \r
+//       OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+// Defines required for USB communication\r
+// *************************************************************************************************\r
+\r
+// USB packet length\r
+#define        PACKET_OVERHEAD_BYTES       3\r
+#define        PACKET_DATA_BYTES           2\r
+#define PACKET_TOTAL_BYTES          (PACKET_OVERHEAD_BYTES + PACKET_DATA_BYTES)\r
+\r
+// Packet bytes\r
+//\r
+// Byte 0              Start marker (0xFF)\r
+#define PACKET_BYTE_START          (0u)\r
+// Byte 1              Command code\r
+#define PACKET_BYTE_CMD            (1u)\r
+// Byte 2              Packet size (including overhead)\r
+#define PACKET_BYTE_SIZE           (2u)\r
+// Byte 3..packet_size  Data\r
+#define PACKET_BYTE_FIRST_DATA     (3u)\r
+\r
+\r
+// Command codes\r
+#define BM_GET_STATUS           0x00\r
+#define BM_GET_PRODUCT_ID       0x20\r
+\r
+// BlueRobin\r
+#define BM_RESET                    0x01\r
+#define BM_START_BLUEROBIN          0x02\r
+#define BM_SET_BLUEROBIN_ID         0x03\r
+#define BM_GET_BLUEROBIN_ID         0x04\r
+#define BM_SET_HEARTRATE            0x05    \r
+#define BM_STOP_BLUEROBIN           0x06\r
+#define BM_SET_SPEED                0x0A\r
+\r
+// Simpliciti\r
+#define BM_START_SIMPLICITI         0x07\r
+#define BM_GET_SIMPLICITIDATA       0x08\r
+#define BM_STOP_SIMPLICITI          0x09\r
+\r
+// Sync\r
+#define BM_SYNC_START              0x30\r
+#define BM_SYNC_SEND_COMMAND        0x31\r
+#define BM_SYNC_GET_BUFFER_STATUS   0x32\r
+#define BM_SYNC_READ_BUFFER        0x33\r
+\r
+//Wireless BSL\r
+#define BM_START_WBSL               0x40\r
+#define BM_GET_WBSL_STATUS          0x41\r
+#define BM_INIT_OK_WBSL             0x42\r
+#define BM_INIT_INVALID_WBSL        0x43\r
+#define BM_TRANSFER_OK_WBSL         0x44\r
+#define BM_TRANSFER_INVALID_WBSL    0x45\r
+#define BM_STOP_WBSL                0x46\r
+#define BM_SEND_DATA_WBSL           0x47\r
+#define BM_GET_PACKET_STATUS_WBSL   0x48\r
+#define BM_GET_MAX_PAYLOAD_WBSL     0x49\r
+\r
+// Test\r
+#define BM_INIT_TEST                0x70\r
+#define BM_NEXT_TEST                0x71\r
+#define BM_WRITE_BYTE               0x72\r
+#define BM_GET_TEST_RESULT          0x73\r
+\r
+// System states  \r
+#define HW_IDLE                         0x00\r
+#define HW_SIMPLICITI_STOPPED           0x01\r
+#define HW_SIMPLICITI_TRYING_TO_LINK    0x02\r
+#define HW_SIMPLICITI_LINKED            0x03\r
+#define HW_BLUEROBIN_STOPPED            0x04\r
+#define HW_BLUEROBIN_TRANSMITTING       0x05\r
+#define HW_ERROR                       0x05\r
+#define HW_NO_ERROR                    0x06\r
+#define HW_NOT_CONNECTED               0x07\r
+#define HW_SIMPLICITI_LINK_TIMEOUT      0x08\r
+#define HW_WBSL_TRYING_TO_LINK          0x09\r
+#define HW_WBSL_LINKED                  0x0A\r
+#define HW_WBSL_ERROR                   0x0B\r
+#define HW_WBSL_STOPPED                 0x0C\r
+#define HW_WBSL_LINK_TIMEOUT            0x0D
\ No newline at end of file
diff --git a/chronos-ti/Software Projects/RF Access Point/IAR/HAL/include/hal.h b/chronos-ti/Software Projects/RF Access Point/IAR/HAL/include/hal.h
new file mode 100755 (executable)
index 0000000..0fc37a3
--- /dev/null
@@ -0,0 +1,2363 @@
+/*\r
++------------------------------------------------------------------------------\r
+|  Copyright 2004-2007 Texas Instruments Incorporated. All rights reserved.\r
+|\r
+|  IMPORTANT: Your use of this Software is limited to those specific rights\r
+|  granted under the terms of a software license agreement between the user who\r
+|  downloaded the software, his/her employer (which must be your employer) and\r
+|  Texas Instruments Incorporated (the "License"). You may not use this Software\r
+|  unless you agree to abide by the terms of the License. The License limits\r
+|  your use, and you acknowledge, that the Software may not be modified, copied\r
+|  or distributed unless embedded on a Texas Instruments microcontroller or used\r
+|  solely and exclusively in conjunction with a Texas Instruments radio\r
+|  frequency transceiver, which is integrated into your product. Other than for\r
+|  the foregoing purpose, you may not use, reproduce, copy, prepare derivative\r
+|  works of, modify, distribute, perform, display or sell this Software and/or\r
+|  its documentation for any purpose.\r
+|\r
+|  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE\r
+|  PROVIDED \93AS IS\94 WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED,\r
+|  INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE,\r
+|  NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL\r
+|  TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+|  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER\r
+|  LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING\r
+|  BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR\r
+|  CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT OF\r
+|  SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES\r
+|  (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+|\r
+|  Should you have any questions regarding your right to use this Software,\r
+|  contact Texas Instruments Incorporated at www.TI.com.\r
+|\r
++------------------------------------------------------------------------------\r
+|   File:      hal.h\r
+|   Target:    cc2430, cc2431, cc1110, cc2510, cc2511, cc1111\r
+|   Author:    EFU/ KJA / TBR\r
+|   Revised:   2007-09-21\r
+|   Revision:  1.0\r
+|   Description:\r
+|   Hardware Abstraction Layer, Utility Library.\r
+******************************************************************************/\r
+\r
+#ifndef HAL_H\r
+#define HAL_H\r
+\r
+#include "project.h"\r
+\r
+#if(chip == 2430)\r
+#include "ioCC2430.h"\r
+#endif\r
+\r
+#if(chip == 2431)\r
+#include "ioCC2431.h"\r
+#endif\r
+\r
+#if(chip == 1110)\r
+#include "ioCC1110.h"\r
+#endif\r
+\r
+#if(chip == 1111)\r
+#include "ioCC1111.h"\r
+#endif\r
+\r
+#if(chip == 2510)\r
+#include "ioCC2510.h"\r
+#endif\r
+\r
+#if(chip == 2511)\r
+#include "ioCC2511.h"\r
+#endif\r
+\r
+/******************************************************************************\r
+*******************              Chip revisions             *******************\r
+******************************************************************************/\r
+#define REV_A   0x00\r
+#define REV_B   0x01\r
+#define REV_C   0x02\r
+#define REV_D   0x03\r
+#define REV_E   0x04\r
+\r
+\r
+/******************************************************************************\r
+*******************              Commonly used types        *******************\r
+******************************************************************************/\r
+typedef unsigned char       BOOL;\r
+\r
+// Data\r
+typedef unsigned char       BYTE;\r
+typedef unsigned short      WORD;\r
+typedef unsigned long       DWORD;\r
+\r
+// Unsigned numbers\r
+typedef unsigned char       UINT8;\r
+typedef unsigned short      UINT16;\r
+typedef unsigned long       UINT32;\r
+\r
+// Signed numbers\r
+typedef signed char         INT8;\r
+typedef signed short        INT16;\r
+typedef signed long         INT32;\r
+\r
+// Common values\r
+#ifndef FALSE\r
+   #define FALSE 0\r
+#endif\r
+\r
+#ifndef TRUE\r
+   #define TRUE 1\r
+#endif\r
+\r
+#ifndef NULL\r
+   #define NULL 0\r
+#endif\r
+\r
+#ifndef HIGH\r
+   #define HIGH 1\r
+#endif\r
+\r
+#ifndef LOW\r
+   #define LOW 0\r
+#endif\r
+\r
+// Typedef void pointer\r
+//typedef void (*VFPTR)(void);\r
+\r
+/******************************************************************************\r
+*******************        Bit, byte and word macros        *******************\r
+******************************************************************************/\r
+\r
+// bit mask\r
+#define BM( b )       ( 0x01 << ( b ))\r
+\r
+#define HIBYTE(a)     (BYTE) ((WORD)(a) >> 8 )\r
+#define LOBYTE(a)     (BYTE)  (WORD)(a)\r
+\r
+#define SET_WORD(regH, regL, word) \\r
+   do{                             \\r
+      (regH) = HIBYTE( word );     \\r
+      (regL) = LOBYTE( word );     \\r
+   }while(0)\r
+\r
+#define GET_WORD(regH, regL, word) \\r
+   do{                             \\r
+      word = (WORD)regH << 8;      \\r
+      word |= regL;                \\r
+   }while(0)\r
+\r
+/******************************************************************************\r
+*******************             Port functions/macros       *******************\r
+*******************************************************************************\r
+\r
+Macros for simplifying access to I/O pin setup and usage.\r
+\r
+MCU pin configuration:\r
+---------------------------------------------\r
+| Peripheral I/O signal  |  Alt1   |   Alt2 |\r
+---------------------------------------------\r
+| Timer1 channel0        |  P0.2   |   P1.2 |\r
+| Timer1 channel1        |  P0.3   |   P1.1 |\r
+| Timer1 channel2        |  P0.4   |   P1.0 |\r
+| Timer3 channel0        |  P1.3   |   P1.6 |\r
+| Timer3 channel1        |  P1.4   |   P1.7 |\r
+| Timer4 channel0        |  P1.0   |   P2.0 |\r
+| Timer4 channel1        |  P1.1   |   P2.3 |\r
+| USART0 TXD/MOSI        |  P0.3   |   P1.5 |\r
+| USART0 RXD/MISO        |  P0.2   |   P1.4 |\r
+| USART0 RTS/SCK         |  P0.5   |   P1.3 |\r
+| USART0 CTS/SS_N        |  P0.4   |   P1.2 |\r
+| USART1 TXD/MOSI        |  P0.4   |   P1.6 |\r
+| USART1 RXD/MISO        |  P0.5   |   P1.7 |\r
+| USART1 RTS/SCK         |  P0.3   |   P1.5 |\r
+| USART1 CTS/SS_N        |  P0.2   |   P1.4 |\r
+---------------------------------------------\r
+\r
+******************************************************************************/\r
+\r
+\r
+// Macros for configuring IO peripheral location:\r
+// Example usage:\r
+//   IO_PER_LOC_TIMER1_AT_PORT0_PIN234();\r
+//   IO_PER_LOC_TIMER4_AT_PORT2_PIN03();\r
+//   IO_PER_LOC_USART1_AT_PORT0_PIN2345();\r
+\r
+#define IO_PER_LOC_TIMER1_AT_PORT0_PIN234()  do { PERCFG = (PERCFG&~0x40)|0x00; } while (0)\r
+#define IO_PER_LOC_TIMER1_AT_PORT1_PIN012()  do { PERCFG = (PERCFG&~0x40)|0x40; } while (0)\r
+\r
+#define IO_PER_LOC_TIMER3_AT_PORT1_PIN34()   do { PERCFG = (PERCFG&~0x20)|0x00; } while (0)\r
+#define IO_PER_LOC_TIMER3_AT_PORT1_PIN67()   do { PERCFG = (PERCFG&~0x20)|0x20; } while (0)\r
+\r
+#define IO_PER_LOC_TIMER4_AT_PORT1_PIN01()   do { PERCFG = (PERCFG&~0x10)|0x00; } while (0)\r
+#define IO_PER_LOC_TIMER4_AT_PORT2_PIN03()   do { PERCFG = (PERCFG&~0x10)|0x10; } while (0)\r
+\r
+#define IO_PER_LOC_USART1_AT_PORT0_PIN2345() do { PERCFG = (PERCFG&~0x02)|0x00; } while (0)\r
+#define IO_PER_LOC_USART1_AT_PORT1_PIN4567() do { PERCFG = (PERCFG&~0x02)|0x02; } while (0)\r
+\r
+#define IO_PER_LOC_USART0_AT_PORT0_PIN2345() do { PERCFG = (PERCFG&~0x01)|0x00; } while (0)\r
+#define IO_PER_LOC_USART0_AT_PORT1_PIN2345() do { PERCFG = (PERCFG&~0x01)|0x01; } while (0)\r
+\r
+\r
+\r
+// Macros for configuring IO direction:\r
+// Example usage:\r
+//   IO_DIR_PORT_PIN(0, 3, IO_IN);    // Set P0_3 to input\r
+//   IO_DIR_PORT_PIN(2, 1, IO_OUT);   // Set P2_1 to output\r
+\r
+#define IO_DIR_PORT_PIN(port, pin, dir)  \\r
+   do {                                  \\r
+      if (dir == IO_OUT)                 \\r
+         P##port##DIR |= BM( pin );      \\r
+      else                               \\r
+         P##port##DIR &= ~BM( pin );     \\r
+   }while(0)\r
+\r
+// Where port={0,1,2}, pin={0,..,7} and dir is one of:\r
+#define IO_IN   0\r
+#define IO_OUT  1\r
+\r
+// Macros for configuring IO input mode:\r
+// Example usage:\r
+//   IO_IMODE_PORT_PIN(0, 0, IO_IMODE_PUD);\r
+//   IO_IMODE_PORT_PIN(2, 0, IO_IMODE_TRI);\r
+//   IO_IMODE_PORT_PIN(1, 3, IO_IMODE_PUD);\r
+\r
+#define IO_IMODE_PORT_PIN(port, pin, imode) \\r
+   do {                                     \\r
+      if (imode == IO_IMODE_TRI)            \\r
+         P##port##INP |= BM( pin );         \\r
+      else                                  \\r
+         P##port##INP &= ~BM( pin );        \\r
+   } while (0)\r
+\r
+// where imode is one of:\r
+#define IO_IMODE_PUD  0 // Pull-up/pull-down\r
+#define IO_IMODE_TRI  1 // Tristate\r
+\r
+// Macro for configuring IO drive mode:\r
+// Example usage:\r
+//   IIO_PUD_PORT(0, IO_PULLUP);\r
+//   IIO_PUD_PORT(1, IO_PULLDOWN);\r
+//   IIO_PUD_PORT(2, IO_PULLUP);\r
+\r
+#define IO_PUD_PORT(port, pud)        \\r
+   do {                               \\r
+      if (pud == IO_PULLDOWN)         \\r
+         P2INP |= BM( port + 5 );     \\r
+      else                            \\r
+         P2INP &= ~BM( port + 5 );    \\r
+   } while (0)\r
+\r
+#define IO_PULLUP          0\r
+#define IO_PULLDOWN        1\r
+\r
+// Macros for function select (General purpose I/O / Peripheral function):\r
+// Example usage:\r
+//   IO_FUNC_PORT0_PIN0(0, 0, IO_FUNC_PERIPH);\r
+//   IO_FUNC_PORT0_PIN1(0, 1, IO_FUNC_GIO);\r
+//   IO_FUNC_PORT2_PIN3(2, 3, IO_FUNC_PERIPH);\r
+\r
+#define IO_FUNC_PORT_PIN(port, pin, func)  \\r
+   do {                                    \\r
+      if((port == 2) && (pin == 3)){       \\r
+         if (func) {                       \\r
+            P2SEL |= 0x02;                 \\r
+         } else {                          \\r
+            P2SEL &= ~0x02;                \\r
+         }                                 \\r
+      }                                    \\r
+      else if((port == 2) && (pin == 4)){  \\r
+         if (func) {                       \\r
+            P2SEL |= 0x04;                 \\r
+         } else {                          \\r
+            P2SEL &= ~0x04;                \\r
+         }                                 \\r
+      }                                    \\r
+      else{                                \\r
+         if (func) {                       \\r
+            P##port##SEL |= BM( pin );     \\r
+         } else {                          \\r
+            P##port##SEL &= ~BM( pin );    \\r
+        }                                  \\r
+      }                                    \\r
+   } while (0)\r
+\r
+// where func is one of:\r
+#define IO_FUNC_GIO     0 // General purpose I/O\r
+#define IO_FUNC_PERIPH  1 // Peripheral function\r
+\r
+// Macros for configuring the ADC input:\r
+// Example usage:\r
+//   IO_ADC_PORT0_PIN(0, IO_ADC_EN);\r
+//   IO_ADC_PORT0_PIN(4, IO_ADC_DIS);\r
+//   IO_ADC_PORT0_PIN(6, IO_ADC_EN);\r
+\r
+#define IO_ADC_PORT0_PIN(pin, adcEn)  \\r
+  do {                                \\r
+    if (adcEn)                        \\r
+      ADCCFG |= BM( pin );            \\r
+    else                              \\r
+      ADCCFG &= ~BM( pin );           \\r
+  }while (0)\r
+\r
+// where adcEn is one of:\r
+#define IO_ADC_EN           1 // ADC input enabled\r
+#define IO_ADC_DIS          0 // ADC input disab\r
+\r
+\r
+/******************************************************************************\r
+*******************       Interrupt functions/macros        *******************\r
+*******************************************************************************\r
+\r
+Macros which simplify access to interrupt enables, interrupt flags and\r
+interrupt priorities. Increases code legibility.\r
+\r
+******************************************************************************/\r
+\r
+#define INT_ON   1\r
+#define INT_OFF  0\r
+#define INT_SET  1\r
+#define INT_CLR  0\r
+\r
+// Global interrupt enables\r
+#define INT_GLOBAL_ENABLE(on) EA = (!!on)\r
+\r
+#define DISABLE_ALL_INTERRUPTS() (IEN0 = IEN1 = IEN2 = 0x00)\r
+\r
+#if(chip == 2430 || chip == 2431)\r
+#define INUM_RFERR 0\r
+#endif\r
+#if(chip == 1110 || chip == 1111 || chip == 2510 || chip == 2511)\r
+#define INUM_RFTXRX 0\r
+#endif\r
+#define INUM_ADC   1\r
+#define INUM_URX0  2\r
+#define INUM_URX1  3\r
+#define INUM_ENC   4\r
+#define INUM_ST    5\r
+#define INUM_P2INT 6\r
+#define INUM_UTX0  7\r
+#define INUM_DMA   8\r
+#define INUM_T1    9\r
+#define INUM_T2    10\r
+#define INUM_T3    11\r
+#define INUM_T4    12\r
+#define INUM_P0INT 13\r
+#define INUM_UTX1  14\r
+#define INUM_P1INT 15\r
+#define INUM_RF    16\r
+#define INUM_WDT   17\r
+\r
+#define NBR_OF_INTERRUPTS 18\r
+\r
+// Macro used together with the INUM_* constants\r
+// to enable or disable certain interrupts.\r
+// Example usage:\r
+//   INT_ENABLE(INUM_RFERR, INT_ON);\r
+//   INT_ENABLE(INUM_URX0, INT_OFF);\r
+//   INT_ENABLE(INUM_T1, INT_ON);\r
+//   INT_ENABLE(INUM_T2, INT_OFF);\r
+#if(chip == 2430 || chip == 2431)\r
+#define INT_ENABLE(inum, on)                                                    \\r
+   do {                                                                         \\r
+      if      (inum==INUM_RFERR) { RFERRIE = on; }                              \\r
+      else if (inum==INUM_ADC)   { ADCIE   = on; }                              \\r
+      else if (inum==INUM_URX0)  { URX0IE  = on; }                              \\r
+      else if (inum==INUM_URX1)  { URX1IE  = on; }                              \\r
+      else if (inum==INUM_ENC)   { ENCIE   = on; }                              \\r
+      else if (inum==INUM_ST)    { STIE    = on; }                              \\r
+      else if (inum==INUM_P2INT) { (on) ? (IEN2 |= 0x02) : (IEN2 &= ~0x02); }   \\r
+      else if (inum==INUM_UTX0)  { (on) ? (IEN2 |= 0x04) : (IEN2 &= ~0x04); }   \\r
+      else if (inum==INUM_DMA)   { DMAIE   = on; }                              \\r
+      else if (inum==INUM_T1)    { T1IE    = on; }                              \\r
+      else if (inum==INUM_T2)    { T2IE    = on; }                              \\r
+      else if (inum==INUM_T3)    { T3IE    = on; }                              \\r
+      else if (inum==INUM_T4)    { T4IE    = on; }                              \\r
+      else if (inum==INUM_P0INT) { P0IE    = on; }                              \\r
+      else if (inum==INUM_UTX1)  { (on) ? (IEN2 |= 0x08) : (IEN2 &= ~0x08); }   \\r
+      else if (inum==INUM_P1INT) { (on) ? (IEN2 |= 0x10) : (IEN2 &= ~0x10); }   \\r
+      else if (inum==INUM_RF)    { (on) ? (IEN2 |= 0x01) : (IEN2 &= ~0x01); }   \\r
+      else if (inum==INUM_WDT)   { (on) ? (IEN2 |= 0x20) : (IEN2 &= ~0x20); }   \\r
+   } while (0)\r
+#endif\r
+\r
+#if(chip == 1110 || chip == 1111 || chip == 2510 || chip == 2511)\r
+#define INT_ENABLE(inum, on)                                                    \\r
+   do {                                                                         \\r
+      if      (inum==INUM_RFTXRX) { RFTXRXIE = on; }                            \\r
+      else if (inum==INUM_ADC)    { ADCIE   = on;  }                            \\r
+      else if (inum==INUM_URX0)   { URX0IE  = on;  }                            \\r
+      else if (inum==INUM_URX1)   { URX1IE  = on;  }                            \\r
+      else if (inum==INUM_ENC)    { ENCIE   = on;  }                            \\r
+      else if (inum==INUM_ST)     { STIE    = on;  }                            \\r
+      else if (inum==INUM_P2INT)  { (on) ? (IEN2 |= 0x02) : (IEN2 &= ~0x02); }  \\r
+      else if (inum==INUM_UTX0)   { (on) ? (IEN2 |= 0x04) : (IEN2 &= ~0x04); }  \\r
+      else if (inum==INUM_DMA)    { DMAIE   = on;  }                            \\r
+      else if (inum==INUM_T1)     { T1IE    = on;  }                            \\r
+      else if (inum==INUM_T2)     { T2IE    = on;  }                            \\r
+      else if (inum==INUM_T3)     { T3IE    = on;  }                            \\r
+      else if (inum==INUM_T4)     { T4IE    = on;  }                            \\r
+      else if (inum==INUM_P0INT)  { P0IE    = on;  }                            \\r
+      else if (inum==INUM_UTX1)   { (on) ? (IEN2 |= 0x08) : (IEN2 &= ~0x08); }  \\r
+      else if (inum==INUM_P1INT)  { (on) ? (IEN2 |= 0x10) : (IEN2 &= ~0x10); }  \\r
+      else if (inum==INUM_RF)     { (on) ? (IEN2 |= 0x01) : (IEN2 &= ~0x01); }  \\r
+      else if (inum==INUM_WDT)    { (on) ? (IEN2 |= 0x20) : (IEN2 &= ~0x20); }  \\r
+   } while (0)\r
+#endif\r
+\r
+\r
+// Macro for setting interrupt group priority\r
+// Example usage:\r
+//   INT_PRIORITY(RFERR_RF_DMA, 3);\r
+#define INT_PRIORITY(group, pri)                      \\r
+   do {                                               \\r
+      if (pri == 0) { IP0 &= ~group; IP1 &= ~group; } \\r
+      if (pri == 1) { IP0 |=  group; IP1 &= ~group; } \\r
+      if (pri == 2) { IP0 &= ~group; IP1 |=  group; } \\r
+      if (pri == 3) { IP0 |=  group; IP1 |=  group; } \\r
+   } while (0)\r
+// Where pri is one of:\r
+//   0 = Level 0 (lowest priority)\r
+//   1 = Level 1\r
+//   2 = Level 2\r
+//   3 = Level 3 (highest priority)\r
+\r
+// Where group is one of\r
+#define RFERR_RF_DMA    0x01 // Group IP0\r
+#define ADC_P2INT_T1    0x02 // Group IP1\r
+#define URX0_UTX0_T2    0x04 // Group IP2\r
+#define URX1_UTX1_T3    0x08 // Group IP3\r
+#define ENC_P1INT_T4    0x10 // Group IP4\r
+#define ST_WDT_P0INT    0x20 // Group IP5\r
+\r
+\r
+// Macro used together with the INUM_* constants\r
+// to read the interrupt flags.\r
+// Example usage:\r
+//   if (INT_GETFLAG(INUM_URX0))\r
+//     ...\r
+//   while (!INT_GETFLAG(INUM_URX0));\r
+\r
+#if(chip == 2430 || chip == 2431)\r
+#define INT_GETFLAG(inum) (                       \\r
+   (inum==INUM_RFERR)       ? RFERRIF           : \\r
+   (inum==INUM_ADC)         ? ADCIF             : \\r
+   (inum==INUM_URX0)        ? URX0IF            : \\r
+   (inum==INUM_URX1)        ? URX1IF            : \\r
+   (inum==INUM_ENC)         ? ENCIF_0           : \\r
+   (inum==INUM_ST)          ? STIF              : \\r
+   (inum==INUM_P2INT)       ? P2IF              : \\r
+   (inum==INUM_UTX0)        ? UTX0IF            : \\r
+   (inum==INUM_DMA)         ? DMAIF             : \\r
+   (inum==INUM_T1)          ? T1IF              : \\r
+   (inum==INUM_T2)          ? T2IF              : \\r
+   (inum==INUM_T3)          ? T3IF              : \\r
+   (inum==INUM_T4)          ? T4IF              : \\r
+   (inum==INUM_P0INT)       ? P0IF              : \\r
+   (inum==INUM_UTX1)        ? UTX1IF            : \\r
+   (inum==INUM_P1INT)       ? P1IF              : \\r
+   (inum==INUM_RF)          ? S1CON &= ~0x03    : \\r
+   (inum==INUM_WDT)         ? WDTIF             : \\r
+   0                                              \\r
+)\r
+#endif\r
+#if(chip == 1110 || chip == 1111 || chip == 2510 || chip == 2511)\r
+#define INT_GETFLAG(inum) (                       \\r
+   (inum==INUM_RFTXRX)      ? RFTXRXIF          : \\r
+   (inum==INUM_ADC)         ? ADCIF             : \\r
+   (inum==INUM_URX0)        ? URX0IF            : \\r
+   (inum==INUM_URX1)        ? URX1IF            : \\r
+   (inum==INUM_ENC)         ? ENCIF_0           : \\r
+   (inum==INUM_ST)          ? STIF              : \\r
+   (inum==INUM_P2INT)       ? P2IF              : \\r
+   (inum==INUM_UTX0)        ? UTX0IF            : \\r
+   (inum==INUM_DMA)         ? DMAIF             : \\r
+   (inum==INUM_T1)          ? T1IF              : \\r
+   (inum==INUM_T2)          ? T2IF              : \\r
+   (inum==INUM_T3)          ? T3IF              : \\r
+   (inum==INUM_T4)          ? T4IF              : \\r
+   (inum==INUM_P0INT)       ? P0IF              : \\r
+   (inum==INUM_UTX1)        ? UTX1IF            : \\r
+   (inum==INUM_P1INT)       ? P1IF              : \\r
+   (inum==INUM_RF)          ? S1CON &= ~0x03    : \\r
+   (inum==INUM_WDT)         ? WDTIF             : \\r
+   0                                              \\r
+)\r
+\r
+#endif\r
+\r
+\r
+// Macro used to set or clear certain interrupt flags.\r
+// Example usage:\r
+//   INT_SETFLAG(INUM_URX0, INT_SET;\r
+//   INT_SETFLAG(INUM_T3, INT_CLR);\r
+#if(chip == 2430 || chip == 2431)\r
+#define INT_SETFLAG(inum, f)                                                    \\r
+   do {                                                                         \\r
+      if      (inum==INUM_RFERR) { RFERRIF= f; }                                \\r
+      else if (inum==INUM_ADC)   { ADCIF  = f; }                                \\r
+      else if (inum==INUM_URX0)  { URX0IF = f; }                                \\r
+      else if (inum==INUM_URX1)  { URX1IF = f; }                                \\r
+      else if (inum==INUM_ENC)   { (f) ? (S0CON |= 0x03) : (S0CON &= ~0x03); }  \\r
+      else if (inum==INUM_ST)    { STIF  = f;  }                                \\r
+      else if (inum==INUM_P2INT) { P2IF  = f;  }                                \\r
+      else if (inum==INUM_UTX0)  { UTX0IF= f;  }                                \\r
+      else if (inum==INUM_DMA)   { DMAIF = f;  }                                \\r
+      else if (inum==INUM_T1)    { T1IF  = f;  }                                \\r
+      else if (inum==INUM_T2)    { T2IF  = f;  }                                \\r
+      else if (inum==INUM_T3)    { T3IF  = f;  }                                \\r
+      else if (inum==INUM_T4)    { T4IF  = f;  }                                \\r
+      else if (inum==INUM_P0INT) { P0IF  = f;  }                                \\r
+      else if (inum==INUM_UTX1)  { UTX1IF= f;  }                                \\r
+      else if (inum==INUM_P1INT) { P1IF  = f;  }                                \\r
+      else if (inum==INUM_RF)    { (f) ? (S1CON |= 0x03) : (S1CON &= ~0x03); }  \\r
+      else if (inum==INUM_WDT)   { WDTIF = f;  }                                \\r
+   } while (0)\r
+#endif\r
+#if(chip == 1110 || chip == 1111 || chip == 2510 || chip == 2511)\r
+#define INT_SETFLAG(inum, f)                                                    \\r
+   do {                                                                         \\r
+      if      (inum==INUM_RFTXRX){ RFTXRXIF = f; }                              \\r
+      else if (inum==INUM_ADC)   { ADCIF  = f; }                                \\r
+      else if (inum==INUM_URX0)  { URX0IF = f; }                                \\r
+      else if (inum==INUM_URX1)  { URX1IF = f; }                                \\r
+      else if (inum==INUM_ENC)   { ENCIF_1 = ENCIF_0 = f; }                     \\r
+      else if (inum==INUM_ST)    { STIF  = f;  }                                \\r
+      else if (inum==INUM_P2INT) { P2IF  = f;  }                                \\r
+      else if (inum==INUM_UTX0)  { UTX0IF= f;  }                                \\r
+      else if (inum==INUM_DMA)   { DMAIF = f;  }                                \\r
+      else if (inum==INUM_T1)    { T1IF  = f;  }                                \\r
+      else if (inum==INUM_T2)    { T2IF  = f;  }                                \\r
+      else if (inum==INUM_T3)    { T3IF  = f;  }                                \\r
+      else if (inum==INUM_T4)    { T4IF  = f;  }                                \\r
+      else if (inum==INUM_P0INT) { P0IF  = f;  }                                \\r
+      else if (inum==INUM_UTX1)  { UTX1IF= f;  }                                \\r
+      else if (inum==INUM_P1INT) { P1IF  = f;  }                                \\r
+      else if (inum==INUM_RF)    { (f) ? (S1CON |= 0x03) : (S1CON &= ~0x03); }  \\r
+      else if (inum==INUM_WDT)   { WDTIF = f;  }                                \\r
+   } while (0)\r
+#endif\r
+\r
+\r
+\r
+/******************************************************************************\r
+**************************   DMA structures / macros  *************************\r
+*******************************************************************************\r
+\r
+The macros and structs in this section simplify setup and usage of DMA.\r
+\r
+******************************************************************************/\r
+\r
+#define DMA_CHANNEL_0           0x01\r
+#define DMA_CHANNEL_1           0x02\r
+#define DMA_CHANNEL_2           0x04\r
+#define DMA_CHANNEL_3           0x08\r
+#define DMA_CHANNEL_4           0x10\r
+\r
+#define VLEN_USE_LEN            0x00 // Use LEN for transfer count\r
+#define VLEN_FIXED              0x00 // Use LEN for transfer count\r
+#define VLEN_1_P_VALOFFIRST     0x01 // Transfer the first byte + the number of bytes indicated by the first byte\r
+#define VLEN_VALOFFIRST         0x02 // Transfer the number of bytes indicated by the first byte (starting with the first byte)\r
+#define VLEN_1_P_VALOFFIRST_P_1 0x03 // Transfer the first byte + the number of bytes indicated by the first byte + 1 more byte\r
+#define VLEN_1_P_VALOFFIRST_P_2 0x04 // Transfer the first byte + the number of bytes indicated by the first byte + 2 more bytes\r
+\r
+#define WORDSIZE_BYTE           0x00 // Transfer a byte at a time\r
+#define WORDSIZE_WORD           0x01 // Transfer a 16-bit word at a time\r
+\r
+#define TMODE_SINGLE            0x00 // Transfer a single byte/word after each DMA trigger\r
+#define TMODE_BLOCK             0x01 // Transfer block of data (length len) after each DMA trigger\r
+#define TMODE_SINGLE_REPEATED   0x02 // Transfer single byte/word (after len transfers, rearm DMA)\r
+#define TMODE_BLOCK_REPEATED    0x03 // Transfer block of data (after len transfers, rearm DMA)\r
+\r
+#define DMATRIG_NONE               0 // No trigger, setting DMAREQ.DMAREQx bit starts transfer\r
+#define DMATRIG_PREV               1 // DMA channel is triggered by completion of previous channel\r
+#define DMATRIG_T1_CH0             2 // Timer 1, compare, channel 0\r
+#define DMATRIG_T1_CH1             3 // Timer 1, compare, channel 1\r
+#define DMATRIG_T1_CH2             4 // Timer 1, compare, channel 2\r
+#define DMATRIG_T2_COMP            5 // Timer 2, compare\r
+#define DMATRIG_T2_OVFL            6 // Timer 2, overflow\r
+#define DMATRIG_T3_CH0             7 // Timer 3, compare, channel 0\r
+#define DMATRIG_T3_CH1             8 // Timer 3, compare, channel 1\r
+#define DMATRIG_T4_CH0             9 // Timer 4, compare, channel 0\r
+#define DMATRIG_T4_CH1            10 // Timer 4, compare, channel 1\r
+#define DMATRIG_ST                11 // Sleep Timer compare\r
+#define DMATRIG_IOC_0             12 // Port 0 I/O pin input transition\r
+#define DMATRIG_IOC_1             13 // Port 1 I/O pin input transition\r
+#define DMATRIG_URX0              14 // USART0 RX complete\r
+#define DMATRIG_UTX0              15 // USART0 TX complete\r
+#define DMATRIG_URX1              16 // USART1 RX complete\r
+#define DMATRIG_UTX1              17 // USART1 TX complete\r
+#define DMATRIG_FLASH             18 // Flash data write complete\r
+#define DMATRIG_RADIO             19 // RF packet byte received/transmit\r
+#define DMATRIG_ADC_CHALL         20 // ADC end of a conversion in a sequence, sample ready\r
+#define DMATRIG_ADC_CH0           21 // ADC end of conversion channel 0 in sequence, sample ready\r
+#define DMATRIG_ADC_CH1           22 // ADC end of conversion channel 1 in sequence, sample ready\r
+#define DMATRIG_ADC_CH2           23 // ADC end of conversion channel 2 in sequence, sample ready\r
+#define DMATRIG_ADC_CH3           24 // ADC end of conversion channel 3 in sequence, sample ready\r
+#define DMATRIG_ADC_CH4           25 // ADC end of conversion channel 4 in sequence, sample ready\r
+#define DMATRIG_ADC_CH5           26 // ADC end of conversion channel 5 in sequence, sample ready\r
+#define DMATRIG_ADC_CH6           27 // ADC end of conversion channel 6 in sequence, sample ready\r
+#define DMATRIG_ADC_CH7           28 // ADC end of conversion channel 7 in sequence, sample ready\r
+#define DMATRIG_ENC_DW            29 // AES encryption processor requests download input data\r
+#define DMATRIG_ENC_UP            30 // AES encryption processor requests upload output data\r
+\r
+#define SRCINC_0                0x00 // Increment source pointer by 0 bytes/words after each transfer\r
+#define SRCINC_1                0x01 // Increment source pointer by 1 bytes/words after each transfer\r
+#define SRCINC_2                0x02 // Increment source pointer by 2 bytes/words after each transfer\r
+#define SRCINC_M1               0x03 // Decrement source pointer by 1 bytes/words after each transfer\r
+\r
+#define DESTINC_0               0x00 // Increment destination pointer by 0 bytes/words after each transfer\r
+#define DESTINC_1               0x01 // Increment destination pointer by 1 bytes/words after each transfer\r
+#define DESTINC_2               0x02 // Increment destination pointer by 2 bytes/words after each transfer\r
+#define DESTINC_M1              0x03 // Decrement destination pointer by 1 bytes/words after each transfer\r
+\r
+#define IRQMASK_DISABLE         0x00 // Disable interrupt generation\r
+#define IRQMASK_ENABLE          0x01 // Enable interrupt generation upon DMA channel done\r
+\r
+#define M8_USE_8_BITS           0x00 // Use all 8 bits for transfer count\r
+#define M8_USE_7_BITS           0x01 // Use 7 LSB for transfer count\r
+\r
+#define PRI_LOW                 0x00 // Low, CPU has priority\r
+#define PRI_GUARANTEED          0x01 // Guaranteed, DMA at least every second try\r
+#define PRI_HIGH                0x02 // High, DMA has priority\r
+#define PRI_ABSOLUTE            0x03 // Highest, DMA has priority. Reserved for DMA port access.\r
+\r
+\r
+#pragma bitfields=reversed\r
+typedef struct {\r
+   BYTE SRCADDRH;\r
+   BYTE SRCADDRL;\r
+   BYTE DESTADDRH;\r
+   BYTE DESTADDRL;\r
+   BYTE VLEN      : 3;\r
+   BYTE LENH      : 5;\r
+   BYTE LENL      : 8;\r
+   BYTE WORDSIZE  : 1;\r
+   BYTE TMODE     : 2;\r
+   BYTE TRIG      : 5;\r
+   BYTE SRCINC    : 2;\r
+   BYTE DESTINC   : 2;\r
+   BYTE IRQMASK   : 1;\r
+   BYTE M8        : 1;\r
+   BYTE PRIORITY  : 2;\r
+} DMA_DESC;\r
+#pragma bitfields=default\r
+\r
+\r
+#define DMA_SET_ADDR_DESC0(a)           \\r
+   do{                                  \\r
+      DMA0CFGH = HIBYTE( a );           \\r
+      DMA0CFGL = LOBYTE( a );           \\r
+   } while(0)\r
+\r
+#define DMA_SET_ADDR_DESC1234(a)        \\r
+   do{                                  \\r
+      DMA1CFGH = HIBYTE( a );           \\r
+      DMA1CFGL = LOBYTE( a );           \\r
+   } while(0)\r
+\r
+#if(chip == 2430 || chip == 2431)\r
+#define DMA_ARM_CHANNEL(ch)             \\r
+      DMAARM = ((0x01 << ch) & 0x1F);\r
+#endif\r
+\r
+#if(chip == 0000)\r
+//Todo: remove NOPs\r
+#endif\r
+#if(chip == 1110 || chip == 1111 || chip == 2510 || chip == 2511)\r
+#define DMA_ARM_CHANNEL(ch)           \\r
+   do{                                \\r
+      asm("NOP");                     \\r
+      asm("NOP");                     \\r
+      asm("NOP");                     \\r
+      asm("NOP");                     \\r
+      asm("NOP");                     \\r
+      asm("NOP");                     \\r
+      asm("NOP");                     \\r
+      asm("NOP");                     \\r
+      DMAARM = ((0x01 << ch) & 0x1F); \\r
+      asm("NOP");                     \\r
+      asm("NOP");                     \\r
+      asm("NOP");                     \\r
+      asm("NOP");                     \\r
+      asm("NOP");                     \\r
+      asm("NOP");                     \\r
+      asm("NOP");                     \\r
+   } while(0)\r
+#endif\r
+\r
+#define DMA_ABORT_CHANNEL(ch)    DMAARM = (0x80 | ( BM( ch ) & 0x1F) )\r
+#define DMA_MAN_TRIGGER(ch)      DMAREQ = BM( ch )\r
+#define DMA_START_CHANNEL(ch)    DMA_MAN_TRIGGER( ch )\r
+\r
+// Macro for quickly setting the destination address of a DMA structure\r
+#define SET_DMA_DEST(pDmaDesc, dest)                  \\r
+   do{                                                \\r
+      pDmaDesc->DESTADDRH = HIBYTE( dest );           \\r
+      pDmaDesc->DESTADDRL = LOBYTE( dest );           \\r
+   } while (0)\r
+\r
+// Macro for quickly setting the source address of a DMA structure\r
+#define SET_DMA_SOURCE(pDmaDesc, source)              \\r
+   do{                                                \\r
+      pDmaDesc->SRCADDRH =  HIBYTE( source );         \\r
+      pDmaDesc->SRCADDRL =  LOBYTE( source );         \\r
+   } while (0)\r
+\r
+// Macro for quickly setting the number of bytes to be transferred by the DMA.\r
+// Max lenght is 0x1FFF\r
+#define SET_DMA_LENGTH(pDmaDesc, length)              \\r
+   do{                                                \\r
+      pDmaDesc->LENH = HIBYTE( length );              \\r
+      pDmaDesc->LENL = LOBYTE( length );              \\r
+   } while (0)\r
+\r
+// Macro for getting the destination address of a DMA channel\r
+#define GET_DMA_DEST(pDmaDesc)   \\r
+   ( (WORD)pDmaDesc->DESTADDRL | ( (WORD)pDmaDesc->DESTADDRH << 8 ))\r
+\r
+// Macro for getting the source address of a DMA channel\r
+#define GET_DMA_SOURCE(pDmaDesc) \\r
+   ( (WORD)pDmaDesc->SRCADDRL  | ( (WORD)pDmaDesc->SRCADDRH << 8 ))\r
+\r
+\r
+/******************************************************************************\r
+*******************         Common USART functions/macros   *******************\r
+*******************************************************************************\r
+\r
+The macros in this section are available for both SPI and UART operation.\r
+\r
+******************************************************************************/\r
+\r
+// Example usage:\r
+//   USART0_FLUSH();\r
+#define USART_FLUSH(num)              (U##num##UCR |= 0x80)\r
+#define USART0_FLUSH()                USART_FLUSH(0)\r
+#define USART1_FLUSH()                USART_FLUSH(1)\r
+\r
+// Example usage:\r
+//   if (USART0_BUSY())\r
+//     ...\r
+#define USART_BUSY(num)               (U##num##CSR & 0x01)\r
+#define USART0_BUSY()                 USART_BUSY(0)\r
+#define USART1_BUSY()                 USART_BUSY(1)\r
+\r
+// Example usage:\r
+//   while(!USART1_BYTE_RECEIVED())\r
+//     ...\r
+#define USART_BYTE_RECEIVED(num)      (U##num##CSR & 0x04)\r
+#define USART0_BYTE_RECEIVED()        USART_BYTE_RECEIVED(0)\r
+#define USART1_BYTE_RECEIVED()        USART_BYTE_RECEIVED(1)\r
+\r
+// Example usage:\r
+//   if(USART1_BYTE_TRANSMITTED())\r
+//     ...\r
+#define USART_BYTE_TRANSMITTED(num)   (U##num##CSR & 0x02)\r
+#define USART0_BYTE_TRANSMITTED()     USART_BYTE_TRANSMITTED(0)\r
+#define USART1_BYTE_TRANSMITTED()     USART_BYTE_TRANSMITTED(1)\r
+\r
+\r
+/******************************************************************************\r
+*******************  USART-UART specific functions/macros   *******************\r
+******************************************************************************/\r
+#if (chip == 2430 || chip == 2431)\r
+// The macros in this section simplify UART operation.\r
+#define BAUD_E(baud, clkDivPow) (     \\r
+    (baud==2400)   ?  6  +clkDivPow : \\r
+    (baud==4800)   ?  7  +clkDivPow : \\r
+    (baud==9600)   ?  8  +clkDivPow : \\r
+    (baud==14400)  ?  8  +clkDivPow : \\r
+    (baud==19200)  ?  9  +clkDivPow : \\r
+    (baud==28800)  ?  9  +clkDivPow : \\r
+    (baud==38400)  ?  10 +clkDivPow : \\r
+    (baud==57600)  ?  10 +clkDivPow : \\r
+    (baud==76800)  ?  11 +clkDivPow : \\r
+    (baud==115200) ?  11 +clkDivPow : \\r
+    (baud==153600) ?  12 +clkDivPow : \\r
+    (baud==230400) ?  12 +clkDivPow : \\r
+    (baud==307200) ?  13 +clkDivPow : \\r
+    0  )\r
+\r
+\r
+#define BAUD_M(baud) (      \\r
+    (baud==2400)   ?  59  : \\r
+    (baud==4800)   ?  59  : \\r
+    (baud==9600)   ?  59  : \\r
+    (baud==14400)  ?  216 : \\r
+    (baud==19200)  ?  59  : \\r
+    (baud==28800)  ?  216 : \\r
+    (baud==38400)  ?  59  : \\r
+    (baud==57600)  ?  216 : \\r
+    (baud==76800)  ?  59  : \\r
+    (baud==115200) ?  216 : \\r
+    (baud==153600) ?  59  : \\r
+    (baud==230400) ?  216 : \\r
+    (baud==307200) ?  59  : \\r
+  0)\r
+#endif\r
+\r
+\r
+#if (chip == 1110 || chip == 2510)\r
+#define BAUD_E(baud, clkDivPow)( \\r
+   (baud ==   2400) ?   6 +clkDivPow : \\r
+   (baud ==   4800) ?   7 +clkDivPow : \\r
+   (baud ==   9600) ?   8 +clkDivPow : \\r
+   (baud ==  14400) ?   9 +clkDivPow : \\r
+   (baud ==  19200) ?   9 +clkDivPow : \\r
+   (baud ==  28800) ?  10 +clkDivPow : \\r
+   (baud ==  38400) ?  10 +clkDivPow : \\r
+   (baud ==  57600) ?  11 +clkDivPow : \\r
+   (baud ==  76800) ?  11 +clkDivPow : \\r
+   (baud == 115200) ?  12 +clkDivPow : \\r
+   (baud == 230400) ?  13 +clkDivPow : \\r
+   (baud == 307200) ?  13 +clkDivPow : \\r
+   (baud == 460800) ?  14 +clkDivPow : \\r
+   0)\r
+\r
+#define BAUD_M(baud) ( \\r
+   (baud ==   2400) ?  131 : \\r
+   (baud ==   4800) ?  131 : \\r
+   (baud ==   9600) ?  131 : \\r
+   (baud ==  14400) ?   34 : \\r
+   (baud ==  19200) ?  131 : \\r
+   (baud ==  28800) ?   34 : \\r
+   (baud ==  38400) ?  131 : \\r
+   (baud ==  57600) ?   34 : \\r
+   (baud ==  76800) ?  131 : \\r
+   (baud == 115200) ?   34 : \\r
+   (baud == 230400) ?   34 : \\r
+   (baud == 307200) ?  131 : \\r
+   (baud == 460800) ?   34 : \\r
+   0)\r
+#endif\r
+\r
+#if (chip == 1111 || chip == 2511)\r
+#define BAUD_E(baud, clkDivPow)( \\r
+   (baud ==   2400) ?   6 +clkDivPow : \\r
+   (baud ==   4800) ?   7 +clkDivPow : \\r
+   (baud ==   9600) ?   8 +clkDivPow : \\r
+   (baud ==  14400) ?   9 +clkDivPow : \\r
+   (baud ==  19200) ?   9 +clkDivPow : \\r
+   (baud ==  28800) ?  10 +clkDivPow : \\r
+   (baud ==  38400) ?  10 +clkDivPow : \\r
+   (baud ==  57600) ?  11 +clkDivPow : \\r
+   (baud ==  76800) ?  11 +clkDivPow : \\r
+   (baud == 115200) ?  12 +clkDivPow : \\r
+   (baud == 230400) ?  13 +clkDivPow : \\r
+   (baud == 307200) ?  13 +clkDivPow : \\r
+   (baud == 460800) ?  14 +clkDivPow : \\r
+   0)\r
+\r
+#define BAUD_M(baud) ( \\r
+   (baud ==   2400) ?  163 : \\r
+   (baud ==   4800) ?  163 : \\r
+   (baud ==   9600) ?  163 : \\r
+   (baud ==  14400) ?   59 : \\r
+   (baud ==  19200) ?  163 : \\r
+   (baud ==  28800) ?   59 : \\r
+   (baud ==  38400) ?  163 : \\r
+   (baud ==  57600) ?   59 : \\r
+   (baud ==  76800) ?  163 : \\r
+   (baud == 115200) ?   59 : \\r
+   (baud == 230400) ?   59 : \\r
+   (baud == 307200) ?  163 : \\r
+   (baud == 460800) ?   59 : \\r
+   0)\r
+#endif\r
+\r
+// Macro for setting up a UART transfer channel. The macro sets the appropriate\r
+// pins for peripheral operation, sets the baudrate, and the desired options of\r
+// the selected uart. _uart_ indicates which uart to configure and must be\r
+// either 0 or 1. _baudRate_ must be one of 2400, 4800, 9600, 14400, 19200,\r
+// 28800, 38400, 57600, 76800, 115200, 153600, 230400 or 307200. Possible\r
+// options are defined below.\r
+//\r
+// Example usage:\r
+//\r
+//      UART_SETUP(0,115200,HIGH_STOP);\r
+//\r
+// This configures uart 0 for contact with "hyperTerminal", setting:\r
+//      Baudrate:           115200\r
+//      Data bits:          8\r
+//      Parity:             None\r
+//      Stop bits:          1\r
+//      Flow control:       None\r
+//\r
+\r
+#define UART_SETUP(uart, baudRate, options)      \\r
+   do {                                          \\r
+      if ((options) & FLOW_CONTROL_ENABLE){      \\r
+         if((uart) == 0){      /* USART0       */\\r
+            if(PERCFG & 0x01){ /* Alt 2        */\\r
+               P1SEL |= 0x3C;                    \\r
+            } else {           /* Alt 1        */\\r
+               P0SEL |= 0x3C;                    \\r
+            }                                    \\r
+         }                                       \\r
+         else {                /* USART1       */\\r
+            if(PERCFG & 0x02){ /* Alt 2        */\\r
+               P1SEL |= 0xF0;                    \\r
+            } else {           /* Alt 1        */\\r
+               P0SEL |= 0x3C;                    \\r
+            }                                    \\r
+         }                                       \\r
+      }                                          \\r
+      else{                    /* Flow Ctrl Dis*/\\r
+         if((uart) == 0){      /* USART0       */\\r
+            if(PERCFG & 0x01){ /* Alt 2        */\\r
+               P1SEL |= 0x30;                    \\r
+            } else {           /* Alt 1        */\\r
+               P0SEL |= 0x0C;                    \\r
+            }                                    \\r
+         }                                       \\r
+         else {                /* USART1       */\\r
+            if(PERCFG & 0x02){ /* Alt 2        */\\r
+               P1SEL |= 0xC0;                    \\r
+            } else {           /* Alt 1        */\\r
+               P0SEL |= 0x30;                    \\r
+            }                                    \\r
+         }                                       \\r
+      }                                          \\r
+                                                 \\r
+      U##uart##GCR = BAUD_E((baudRate), CLKSPD); \\r
+      U##uart##BAUD = BAUD_M(baudRate);          \\r
+                                                 \\r
+      U##uart##CSR |= 0x80;                      \\r
+                                                 \\r
+      U##uart##UCR |= ((options) | 0x80);        \\r
+                                                 \\r
+      if((options) & TRANSFER_MSB_FIRST){        \\r
+         U##uart##GCR |= 0x20;                   \\r
+      }                                          \\r
+   } while(0)\r
+\r
+\r
+// Options for UART_SETUP macro\r
+#define FLOW_CONTROL_ENABLE         0x40\r
+#define FLOW_CONTROL_DISABLE        0x00\r
+#define EVEN_PARITY                 0x20\r
+#define ODD_PARITY                  0x00\r
+#define NINE_BIT_TRANSFER           0x10\r
+#define EIGHT_BIT_TRANSFER          0x00\r
+#define PARITY_ENABLE               0x08\r
+#define PARITY_DISABLE              0x00\r
+#define TWO_STOP_BITS               0x04\r
+#define ONE_STOP_BITS               0x00\r
+#define HIGH_STOP                   0x02\r
+#define LOW_STOP                    0x00\r
+#define HIGH_START                  0x01\r
+#define TRANSFER_MSB_FIRST          0x80\r
+#define TRANSFER_MSB_LAST           0x00\r
+\r
+\r
+// Example usage:\r
+//   if(UART0_PARERR())\r
+//     ...\r
+#define UART_PARERR(num)      (U##num##CSR & 0x08)\r
+#define UART0_PARERR()        UART_PARERR(0)\r
+#define UART1_PARERR()        UART_PARERR(1)\r
+\r
+// Example usage:\r
+//   if(UART1_FRAMEERR())\r
+//     ...\r
+#define UART_FRAMEERR(num)    (U ##num## CSR & 0x10)\r
+#define UART0_FRAMEERR()      UART_FRAMEERR(0)\r
+#define UART1_FRAMEERR()      UART_FRAMEERR(1)\r
+\r
+\r
+// Example usage:\r
+//   char ch = 'A';\r
+//   UART1_SEND(ch);\r
+//   ...\r
+//   UART1_RECEIVE(ch);\r
+#define UART_SEND(num, x)     U##num##DBUF = x\r
+#define UART0_SEND(x)         UART_SEND(0, x)\r
+#define UART1_SEND(x)         UART_SEND(1, x)\r
+\r
+#define UART_RECEIVE(num, x)  x = U##num##DBUF\r
+#define UART0_RECEIVE(x)      UART_RECEIVE(0, x)\r
+#define UART1_RECEIVE(x)      UART_RECEIVE(1, x)\r
+\r
+\r
+\r
+/******************************************************************************\r
+*******************    USART-SPI specific functions/macros  *******************\r
+*******************************************************************************\r
+\r
+The macros in this section simplify SPI operation.\r
+\r
+******************************************************************************/\r
+\r
+// Macro for setting up an SPI connection. The macro configures the appropriate\r
+// pins for peripheral operation, sets the baudrate if the chip is configured\r
+// to be SPI master, and sets the desired clock polarity and phase. Whether to\r
+// transfer MSB or LSB first is also determined. _spi_ indicates whether\r
+// to use spi 0 or 1. _baudRate_ must be one of 2400, 4800, 9600, 14400, 19200,\r
+// 28800, 38400, 57600, 76800, 115200, 153600, 230400 or 307200.\r
+// Possible options are defined below.\r
+\r
+#define SPI_SETUP(spi, baudRate, options)           \\r
+   do {                                             \\r
+      U##spi##UCR = 0x80;                           \\r
+      U##spi##CSR = 0x00;                           \\r
+                                                    \\r
+      if((options) & SPI_SLAVE){  /* Slave        */\\r
+         if(spi == 0){            /* USART0       */\\r
+            if(PERCFG & 0x01){    /* Alt 2        */\\r
+               P1SEL |= 0x3C;                       \\r
+            } else {              /* Alt 1        */\\r
+               P0SEL |= 0x3C;                       \\r
+            }                                       \\r
+         } else {                 /* USART1       */\\r
+            if(PERCFG & 0x02){    /* Alt 2        */\\r
+               P1SEL |= 0xF0;                       \\r
+            } else {                                \\r
+              P0SEL |= 0x3C;      /* Alt 1        */\\r
+            }                                       \\r
+         }                                          \\r
+         U##spi##CSR = 0x20;                        \\r
+      }                                             \\r
+      else {                      /* Master       */\\r
+         if(spi == 0){            /* USART0       */\\r
+            if(PERCFG & 0x01){    /* Alt 2        */\\r
+                P1SEL |= 0x38;                      \\r
+                P1SEL &= ~0x04;                     \\r
+            } else {              /* Alt 1        */\\r
+               P0SEL |= 0x2C;                       \\r
+               P0SEL &= ~0x10;                      \\r
+            }                                       \\r
+         } else {                 /* USART 1      */\\r
+            if(PERCFG & 0x02){    /* Alt 2        */\\r
+               P1SEL |= 0xE0;                       \\r
+               P1SEL &= ~0x10;                      \\r
+            } else {              /* Alt 1        */\\r
+               P0SEL |= 0x38;                       \\r
+               P0SEL &= ~0x04;                      \\r
+            }                                       \\r
+         }                                          \\r
+         U##spi##GCR = BAUD_E(baudRate, CLKSPD);    \\r
+         U##spi##BAUD = BAUD_M(baudRate);           \\r
+      }                                             \\r
+      U##spi##GCR |= ((options) & 0xE0);            \\r
+   } while(0)\r
+\r
+\r
+// Options for the SPI_SETUP macro.\r
+#define SPI_SLAVE              0x01\r
+#define SPI_MASTER             0x00\r
+#define SPI_CLOCK_POL_LO       0x00\r
+#define SPI_CLOCK_POL_HI       0x80\r
+#define SPI_CLOCK_PHA_0        0x00\r
+#define SPI_CLOCK_PHA_1        0x40\r
+#define SPI_TRANSFER_MSB_FIRST 0x20\r
+#define SPI_TRANSFER_MSB_LAST  0x00\r
+\r
+\r
+\r
+/******************************************************************************\r
+*******************       FLASH programming functions       *******************\r
+*******************************************************************************\r
+\r
+_halFlashWritePage(...)_ writes a whole flash page. Because code memory cannot\r
+be read during flash write, the writing routines are copied to XDATA RAM. The\r
+function is implemented in assembly code with file extensions .s51 rather than .c\r
+\r
+The Direct Memory Access (DMA) may also be used for flash write.\r
+\r
+******************************************************************************/\r
+\r
+#if (chip == 2430 || chip == 2431)\r
+//Macro for erasing a given flash page\r
+#define FLASH_ERASE_PAGE(page)    \\r
+   do{                            \\r
+      FADDRH = (page) << 1;       \\r
+      FCTL = 0x01;                \\r
+      asm("NOP");                 \\r
+      while(FCTL == 0x80);        \\r
+   }while (0)\r
+\r
+#define SET_FLASH_WRITE_TIME()    \\r
+   FWT  = 0x2A >> CLKSPD;\r
+\r
+#endif\r
+\r
+#if (chip == 2510 || chip == 1110 || chip == 1111 || chip == 2511)\r
+//Macro for erasing a given flash page - NOT TESTED/VERIFIED!\r
+#define FLASH_ERASE_PAGE(page)    \\r
+   do{                            \\r
+      FADDRH = (page) << 1;       \\r
+      FADDRL = 0x00;              \\r
+      FLASH_CONFIG(0x01);        \\r
+   }while (0)\r
+\r
+#define SET_FLASH_WRITE_TIME()    \\r
+   FWT  = 0x22 >> CLKSPD;\r
+\r
+#endif\r
+\r
+#if (chip == 2510 || chip == 1110 || chip == 1111 || chip == 2511)\r
+#define FLASH_CONFIG(options)     \\r
+   do {                           \\r
+      FWT  = ( 0x22 >> CLKSPD );  \\r
+      FCTL = (options);           \\r
+   } while (0)\r
+#endif\r
+\r
+#if (chip == 2510 || chip == 1110 || chip == 1111 || chip == 2511)\r
+// _options_ may be the following:\r
+#define READ_WHEN_NEED  0x00\r
+#define CONTINOUS_READ  0x10\r
+#define WRITE           0x02\r
+#define FLASH_BUSY      0x80\r
+#endif\r
+\r
+/******************************************************************************\r
+* @fn  halFlashDmaTrigger\r
+*\r
+* @brief\r
+*       This function gives the first FLASH DMA trigger.\r
+*\r
+* Parameters:\r
+*\r
+* @param  void\r
+*\r
+* @return void\r
+*\r
+******************************************************************************/\r
+void halFlashDmaTrigger(void);\r
+\r
+\r
+/******************************************************************************\r
+* @fn  halFlashWritePage\r
+*\r
+* @brief\r
+*       This function writes a byte field in XDATA RAM to a given flash\r
+*       page. Normal program execution is run from flash. However during flash\r
+*       write, flash memory is not available for reading. To circumvent this\r
+*       problem the core operation of this procedure, namely the actual flash\r
+*       write procedure, is copied to XDATA RAM and run from there. The flash\r
+*       write procedure is copied to a 35 byte XDATA RAM buffer.\r
+*       Prior to a write the page is erased.\r
+*\r
+*       This function disables interrupts when running, and re-enables interrupt\r
+*       if interrupts were enabled at function entry.\r
+*\r
+* Parameters:\r
+*\r
+* @param  BYTE*         pSrcAddr\r
+*         Pointer to first byte in xdata space which is to be written to\r
+*         flash. The number of bytes a flash page consists of starting from\r
+*         this address will be written to the page _page_.\r
+* @param  BYTE*         pBuffer\r
+*         Pointer to a buffer of 35 bytes in XDATA RAM to which the flash\r
+*         write procedure\r
+*         can be copied.\r
+* @param  BYTE     page\r
+*         Indicates which of the flash pages the data is to be written to.\r
+*\r
+* @return void\r
+*\r
+******************************************************************************/\r
+void halFlashWritePage(BYTE *pSrcAddr, BYTE *pBuffer, BYTE page);\r
+\r
+\r
+/******************************************************************************\r
+*******************      Power and clock management        ********************\r
+*******************************************************************************\r
+\r
+These macros are used to set power-mode, clock source and clock speed.\r
+\r
+******************************************************************************/\r
+\r
+// Macro for getting the clock division factor\r
+#if (chip == 2430 || chip == 2431)\r
+#define CLKSPD  ( CLKCON & 0x01 )\r
+#endif\r
+\r
+#if (chip == 2510 || chip == 2511 || chip == 1110 || chip == 1111)\r
+#define CLKSPD  (CLKCON & 0x07)\r
+#endif\r
+\r
+// Macro for getting the timer tick division factor\r
+#define TICKSPD ((CLKCON & 0x38) >> 3)\r
+\r
+// Macro for checking status of the crystal oscillator\r
+#define XOSC_STABLE (SLEEP & 0x40)\r
+\r
+// Macro for checking status of the high frequency RC oscillator.\r
+#define HIGH_FREQUENCY_RC_OSC_STABLE    (SLEEP & 0x20)\r
+\r
+// Macro for setting power mode\r
+#define SET_POWER_MODE(mode)    \\r
+   do {                         \\r
+      SLEEP &= ~0x03;           \\r
+      SLEEP |= mode;            \\r
+      PCON |= 0x01;             \\r
+   }while (0)\r
+\r
+// Where _mode_ is one of\r
+#define POWER_MODE_0  0x00  // Clock oscillators on, voltage regulator on\r
+#define POWER_MODE_1  0x01  // 32.768 KHz oscillator on, voltage regulator on\r
+#define POWER_MODE_2  0x02  // 32.768 KHz oscillator on, voltage regulator off\r
+#define POWER_MODE_3  0x03  // All clock oscillators off, voltage regulator off\r
+\r
+// Macro for setting the 32 kHz clock source\r
+// Please not that this macro only can be run when the device run on the RC osc\r
+#define SET_32KHZ_CLOCK_SOURCE(source) \\r
+   do {                                \\r
+      if( source ) {                   \\r
+         CLKCON |= 0x80;               \\r
+      } else {                         \\r
+         CLKCON &= ~0x80;              \\r
+      }                                \\r
+   } while (0)\r
+\r
+// Where _source_ is one of\r
+#define CRYSTAL 0x00\r
+#define RC      0x01\r
+\r
+// Macro for setting the main clock oscillator source,\r
+// turns off the clock source not used. Settings TICKSPD\r
+// equal CLKSPD\r
+#if (chip == 2430 || chip == 2431 )\r
+// Use this for CC2430 rev. B\r
+#define REV_B_SET_MAIN_CLOCK_SOURCE(source)   \\r
+   do {                                       \\r
+      if(source) {                            \\r
+        CLKCON |= 0x40;                       \\r
+        while(!HIGH_FREQUENCY_RC_OSC_STABLE); \\r
+        SLEEP |= 0x04;                        \\r
+      }                                       \\r
+      else {                                  \\r
+        SLEEP &= ~0x04;                       \\r
+        while(!XOSC_STABLE);                  \\r
+        asm("NOP");                           \\r
+        CLKCON &= ~0x40;                      \\r
+        SLEEP |= 0x04;                        \\r
+      }                                       \\r
+   }while (0)\r
+\r
+// Use this for CC2430 rev. C ->\r
+#define REV_C_SET_MAIN_CLOCK_SOURCE(source)   \\r
+   do {                                       \\r
+      if(source) {                            \\r
+        CLKCON |= 0x40;                       \\r
+        while( !(CLKCON & 0x40) );            \\r
+      }                                       \\r
+      else {                                  \\r
+        CLKCON &= ~0x40;                      \\r
+        while( CLKCON & 0x40 );               \\r
+      }                                       \\r
+   }while (0)\r
+\r
+#define SET_MAIN_CLOCK_SOURCE( source )       \\r
+  do {                                        \\r
+    if( CHVER < REV_C )                       \\r
+      REV_B_SET_MAIN_CLOCK_SOURCE( source );  \\r
+    else                                      \\r
+      REV_C_SET_MAIN_CLOCK_SOURCE( source );  \\r
+  }while(0)\r
+#endif\r
+\r
+#if (chip == 1110 || chip == 1111 || chip == 2510 || chip == 2511)\r
+#define SET_MAIN_CLOCK_SOURCE( source )       \\r
+  do {                                        \\r
+    if(source) {                              \\r
+      CLKCON |= 0x40;                         \\r
+      while(!HIGH_FREQUENCY_RC_OSC_STABLE);   \\r
+      SLEEP |= 0x04;                          \\r
+    }                                         \\r
+    else {                                    \\r
+      SLEEP &= ~0x04;                         \\r
+      while(!XOSC_STABLE);                    \\r
+      asm("NOP");                             \\r
+      CLKCON &= ~0x47;                        \\r
+      SLEEP |= 0x04;                          \\r
+    }                                         \\r
+  }while(0)\r
+#endif\r
+\r
+\r
+#if (chip == 1110 || chip == 2510)\r
+// Macro for setting the main clock division,\r
+#define SET_MAIN_CLOCK_SPEED(frequency)   \\r
+   do {                                   \\r
+        CLKCON = ((CLKCON & ~0x07) | (frequency & 0x07));     \\r
+   }while (0)\r
+\r
+// where frequency is one of\r
+#define MHZ_26          0x00\r
+#define MHZ_13          0x01\r
+#define MHZ_6_5         0x02\r
+#define MHZ_3_25        0x03\r
+#define MHZ_1_62        0x04\r
+#define MHZ_0_81        0x05\r
+#define MHZ_0_40        0x06\r
+#define MHZ_0_20        0x07\r
+#endif\r
+\r
+#if (chip == 1111 || chip == 2511)\r
+// Macro for setting the main clock division,\r
+#define SET_MAIN_CLOCK_SPEED(frequency)   \\r
+   do {                                   \\r
+        CLKCON = ((CLKCON & ~0x07) | (frequency & 0x07));     \\r
+   }while (0)\r
+\r
+// where frequency is one of\r
+#define MHZ_24          0x00\r
+#define MHZ_12          0x01\r
+#define MHZ_6           0x02\r
+#define MHZ_3           0x03\r
+#define MHZ_1_5         0x04\r
+#define MHZ_0_75        0x05\r
+#define MHZ_0_37        0x06\r
+#define MHZ_0_19        0x07\r
+#endif\r
+\r
+/******************************************************************************\r
+*******************           Timer macros/functions        *******************\r
+*******************************************************************************\r
+General:\r
+The timers/counters can be configured in a number of ways. The following\r
+functions allow basic configuration of the timers as interrupt timers,\r
+pulse width modulators (PWM) and capture timers. Other uses require manual\r
+configuration of the timers/counters.\r
+\r
+Generally 3 steps are nescessary to start a timer:\r
+\r
+   TIMERx_INIT();\r
+   BOOL halSetTimerxPeriod(period);\r
+   TIMERx_RUN(TRUE);\r
+\r
+where x is the timer number. Please see the function / macro in question for\r
+details.\r
+\r
+All timers can generate interrupts. The configuration of interrupts is not\r
+included in the HAL.\r
+\r
+******************************************************************************/\r
+\r
+#define CLR_TIMER34_IF( bitMask )\\r
+  TIMIF = ( TIMIF & 0x40 ) | ( 0x3F & (~bitMask) )\r
+\r
+#define CLR_TIMER1_IF( bitMask )\\r
+  T1CTL = ( T1CTL & 0x0F ) | ( 0xF0 & (~bitMask) )\r
+\r
+/******************************************************************************\r
+* @fn  halSetTimer1Period\r
+*\r
+* @brief\r
+*      This function sets up timer 1 to run with a given period. If _period_ is\r
+*      set to 0, maximum period length will be used. The first time the timer\r
+*      is used the macro TIMER1_INIT() should be run to clear all settings. The\r
+*      timer is started and stopped with the macro TIMER1_RUN(TRUE / FALSE).\r
+*\r
+* Parameters:\r
+*\r
+* @param  DWORD         period\r
+*         The desired timer period in u-seconds.\r
+*\r
+* @return WORD\r
+*         The timer value written to the register if the configuration was\r
+*         successful and 0 if the period could not be achieved. This return\r
+*         value can be used for determining pulse widths when the timer is\r
+*         used in PWM mode.\r
+*\r
+******************************************************************************/\r
+WORD halSetTimer1Period(DWORD period);\r
+\r
+\r
+// Macro for initialising timer 1. Resets all involved registers and disables\r
+// all interrupt masks\r
+#define TIMER1_INIT()   \\r
+   do {                 \\r
+      T1CTL  = 0x00;    \\r
+      T1CCTL0 = 0x00;   \\r
+      T1CCTL1 = 0x00;   \\r
+      T1CCTL2 = 0x00;   \\r
+      TIMIF = ~0x40;    \\r
+   } while (0)\r
+\r
+// Macro for configuring a channel of timer 1 for PWM. Channel may be\r
+// either 1 or 2\r
+#define TIMER1_PWM_CONFIG(channel)                    \\r
+   do {                                               \\r
+      T1CCTL##channel## = 0x24;                       \\r
+      if(PERCFG&0x40) {                               \\r
+         if(channel == 0x01){                         \\r
+            IO_FUNC_PORT_PIN(1,1,IO_FUNC_PERIPH);     \\r
+         }                                            \\r
+         else {                                       \\r
+            IO_FUNC_PORT_PIN(1,0,IO_FUNC_PERIPH);     \\r
+         }                                            \\r
+      }                                               \\r
+      else {                                          \\r
+         if(channel == 0x01){                         \\r
+            IO_FUNC_PORT_PIN(0,3,IO_FUNC_PERIPH);     \\r
+         }                                            \\r
+         else {                                       \\r
+            IO_FUNC_PORT_PIN(0,4,IO_FUNC_PERIPH);     \\r
+         }                                            \\r
+      }                                               \\r
+   } while(0)\r
+\r
+// Macro for changing the pulse length of a timer in PWM mode. The value is\r
+// not scaled and the user must verify that it is correct. _channel_ is the\r
+// channel (1 or 2) configured for PWM operation, whereas _value_ is the\r
+// 16 bit word giving the pulse length. This argument should be shorter than\r
+// or equal to the value returned from the function halSetTimer1Period(...).\r
+#define TIMER1_SET_PWM_PULSE_LENGTH(channel, value)   \\r
+   do {                                               \\r
+      T1CC##channel##L = LOBYTE( value );             \\r
+      T1CC##channel##H = HIBYTE( value );             \\r
+   } while(0)\r
+\r
+\r
+// Macro for configuring a channel of timer 1 for capture.\r
+#define TIMER1_CAPTURE_CHANNEL(channel, edge)         \\r
+   do {                                               \\r
+      T1CCTL ##channel = edge;                        \\r
+      if(PERCFG&0x40) {                               \\r
+         if(channel == 0x01){                         \\r
+            IO_FUNC_PORT_PIN(1,1,IO_FUNC_PERIPH);     \\r
+         }                                            \\r
+         else {                                       \\r
+            IO_FUNC_PORT_PIN(1,0,IO_FUNC_PERIPH);     \\r
+         }                                            \\r
+      }                                               \\r
+      else {                                          \\r
+         if(channel == 0x01){                         \\r
+            IO_FUNC_PORT_PIN(0,3,IO_FUNC_PERIPH);     \\r
+         }                                            \\r
+         else {                                       \\r
+            IO_FUNC_PORT_PIN(0,4,IO_FUNC_PERIPH);     \\r
+         }                                            \\r
+      }                                               \\r
+   } while(0)\r
+\r
+// Where _edge_ is either\r
+#define POS_EDGE 0x01  // Capture when a positive edge on the channel input is detected\r
+#define NEG_EDGE 0x02  // Capture when a negative edge on the channel input is detected\r
+#define ANY_EDGE 0x03  // Capture when either a positive or a negative edge on the\r
+                       // channel input is detected.\r
+\r
+// Macro for enabling or disabling overflow interrupts of timer 1.\r
+#define TIMER1_ENABLE_OVERFLOW_INT(val) \\r
+   (TIMIF =  (val) ? TIMIF | 0x40 : TIMIF & ~0x40)\r
+\r
+\r
+#if (chip == 2430 || chip == 2431)\r
+/******************************************************************************\r
+* @fn  halSetTimer2Period\r
+*\r
+* @brief\r
+*      This function sets the period and overflow counter value of the MAC timer\r
+*      (timer 2). The timer can be set up with 320 u-second periods according to\r
+*      IEEE 802.15.4 or as a normal counter with 1 m-second period by using the\r
+*      option TIMER2_MAC_TIMER or TIMER2_NORMAL_TIMER respectively. The value of\r
+*      _period_ gives the number of periods (320 u-seconds or 1 m-seconds) to\r
+*      generate a compare event. The timer is set up to compensate for any clock\r
+*      division. The timer is also set up to be synchronised with the 32.768 KHz\r
+*      clock when entering or leaving power mode 0. When starting synchronously\r
+*      from power mode 1 or 2, the timer value is updated by adding the time\r
+*      passed since PM 0 was left. This time is kept by the 32.768 KHz clock.\r
+*      This way the time is kept as if the chip had been in power mode 0 the\r
+*      whole time. The timer must be started with the macro\r
+*      TIMER2_RUN(TRUE) or MAC_TIMER_RUN(TRUE). The macro TIMER2_INIT() should be\r
+*      run in advance to reset all register values.\r
+*\r
+* Parameters:\r
+*\r
+* @param  BYTE  mode\r
+*         Determines which time period Timer 2 is to use. The period of Timer 2\r
+*         is either 320 u-seconds (TIMER2_MAC_TIMER) or 1 m-second\r
+*         (TIMER2_NORMAL_TIMER).\r
+* @param  DWORD         period\r
+*         This value indicates how many periods (320 u-second or 1 m-second) to\r
+*         pass before an overflow compare event is generated.\r
+*\r
+* @return BOOL\r
+          Returns 0 if period is too large, 1 otherwise.\r
+*\r
+******************************************************************************/\r
+BOOL halSetTimer2Period(BYTE mode, DWORD period);\r
+\r
+// _mode_ may be of the following:\r
+#define TIMER2_MAC_TIMER    0x01  // Counts 320 u-second periods\r
+#define TIMER2_NORMAL_TIMER 0x02  // Uses the timer as a normal timer with 1 m-second period.\r
+\r
+// Macro for initialising timer 2\r
+#define TIMER2_INIT()  \\r
+   do {                \\r
+      T2THD = 0x00;    \\r
+      T2TLD = 0x00;    \\r
+      T2CMP = 0x00;    \\r
+      T2OF0 = 0x00;    \\r
+      T2OF1 = 0x00;    \\r
+      T2OF2 = 0x00;    \\r
+      T2CAPHPH = 0x00; \\r
+      T2CAPLPL = 0x00; \\r
+      T2PEROF0 = 0x00; \\r
+      T2PEROF1 = 0x00; \\r
+      T2PEROF2 = 0x00; \\r
+      T2CNF = 0x06;    \\r
+   } while (0)\r
+\r
+#define TIMER2_ENABLE_OVERFLOW_COMP_INT(val) (T2PEROF2 =  (val) ? T2PEROF2 | 0x20 : T2PEROF2 & ~0x20)\r
+#endif\r
+\r
+\r
+#if (chip == 1110 || chip == 1111 || chip == 2510 || chip == 2511)\r
+/******************************************************************************\r
+* @fn  halSetTimer2Period\r
+*\r
+* @brief\r
+*      This function sets the period timer 2. The values for the counter,\r
+*      prescaler and tick period is calculated and written to the corresponding\r
+*      registers.\r
+*\r
+* Parameters:\r
+*\r
+* @param  UINT32 period\r
+*         Period of the timer in u-seconds.\r
+* @param  UINT8* cnt\r
+*         The value written to T2CT (counter). This value is returned to enable\r
+*         a fast setup (without calculation) using the SET_TIMER2_COUNTER.\r
+* @param  UINT8* presc\r
+*         The value written to T2PR (prescaler). This value is returned to enable\r
+*         a fast setup (without calculation) using the SET_TIMER2_PRESCALER.\r
+*\r
+* @return BOOL\r
+          Returns FALSE if period is too large, TRUE otherwise.\r
+*\r
+******************************************************************************/\r
+BOOL halSetTimer2Period(UINT32 period, UINT8* cnt, UINT8* presc);\r
+\r
+#define TIMER2_INIT()  \\r
+   do {                \\r
+      T2CTL = 0x00;    \\r
+      T2CT = 0x00;     \\r
+      T2PR = 0x00;     \\r
+   } while (0)\r
+\r
+#define TIMER2_SET_COUNTER(counter)     do{ T2CT = counter; }while(0)\r
+#define TIMER2_SET_PRESCALER(prescaler) do{ T2PR = prescaler; }while(0)\r
+#define TIMER2_SET_TICK_PERIOD(tick)    do{ T2CTL = ((T2CTL & ~0x03) | tick); }while(0)\r
+#define TIMER2_ENABLE_INTERRUPT()       do{ T2CTL |= 0x10; }while(0)\r
+#define TIMER2_DISABLE_INTERRUPT()      do{ T2CTL &= ~0x10; }while(0)\r
+#define TIMER2_CLEAR_EXPIRED()          do{ T2CTL &= ~0x40; }while(0)\r
+#define TIMER2_EXPIRED                  (T2CTL & 0x40)\r
+#define TIMER2_SET_MODE(mode)           (T2CTL  = (mode) ? T2CTL|0x04  : T2CTL&~0x04)\r
+\r
+#define TIMER2_USE_REG  FALSE\r
+#define TIMER2_FREE     TRUE\r
+\r
+#endif\r
+/******************************************************************************\r
+* @fn  halSetTimer34Period\r
+*\r
+* @brief\r
+*      This function sets the period of timer 3 or 4 according to the value of\r
+*      _timer_. The two timers are identical. Clock division is used to fit the\r
+*      desired period within the timer range. If the period is too short or too\r
+*      long the function returns 0. If the period is successfully set, the\r
+*      function returns the BYTE value written to the timer register. This\r
+*      value can be used to set the pulse length if the timer is used for PWM.\r
+*      If _period_ is set to 0, maximum timeout value will be used.\r
+*\r
+* Parameters:\r
+*\r
+* @param  BYTE  timer\r
+*         Indicates which timer to configure. Must be either 3 or 4\r
+*         (0x03 or 0x04).\r
+* @param  DWORD         period - Describe value.\r
+*         The desired period in microseconds.\r
+*\r
+* @return BYTE\r
+*         The value written to the TxCC0 register. The timer is incremented up\r
+*         to this value before the timer is reset. This value may be used to\r
+*         set the pulse length in PWM mode.\r
+*\r
+******************************************************************************/\r
+BYTE halSetTimer34Period(BYTE timer, DWORD period);\r
+\r
+// Macro for initialising timer 3 or 4\r
+#define TIMER34_INIT(timer)   \\r
+   do {                       \\r
+      T##timer##CTL   = 0x06; \\r
+      T##timer##CCTL0 = 0x00; \\r
+      T##timer##CC0   = 0x00; \\r
+      T##timer##CCTL1 = 0x00; \\r
+      T##timer##CC1   = 0x00; \\r
+   } while (0)\r
+\r
+// Macro for enabling overflow interrupt\r
+#define TIMER34_ENABLE_OVERFLOW_INT(timer, val)   \\r
+   (T##timer##CTL =  (val) ? T##timer##CTL | 0x08 : T##timer##CTL & ~0x08)\r
+\r
+\r
+// Macro for configuring channel 1 of timer 3 or 4 for PWM mode.\r
+#define TIMER34_PWM_CONFIG(timer)                 \\r
+   do{                                            \\r
+      T##timer##CCTL1 = 0x24;                     \\r
+      if(timer == 3){                             \\r
+         if(PERCFG & 0x20) {                      \\r
+            IO_FUNC_PORT_PIN(1,7,IO_FUNC_PERIPH); \\r
+         }                                        \\r
+         else {                                   \\r
+            IO_FUNC_PORT_PIN(1,4,IO_FUNC_PERIPH); \\r
+         }                                        \\r
+      }                                           \\r
+      else {                                      \\r
+         if(PERCFG & 0x10) {                      \\r
+             IO_FUNC_PORT_PIN(2,3,IO_FUNC_PERIPH);\\r
+         }                                        \\r
+         else {                                   \\r
+            IO_FUNC_PORT_PIN(1,1,IO_FUNC_PERIPH); \\r
+         }                                        \\r
+      }                                           \\r
+   } while(0)\r
+\r
+// Macro for setting pulse length of the timer in PWM mode\r
+#define TIMER34_SET_PWM_PULSE_LENGTH(timer, value) \\r
+   do {                                            \\r
+      T##timer##CC1 = (BYTE)value;                 \\r
+   } while (0)\r
+\r
+\r
+// Macros for turning timers on or off\r
+#define TIMER1_RUN(value)      (T1CTL = (value) ? T1CTL | 0x02 : T1CTL & ~0x03)\r
+#if (chip == 2430 || chip == 2431)\r
+#define TIMER2_RUN(value)      (T2CNF = (value) ? T2CNF | 0x01  : T2CNF & ~0x01)\r
+// MAC-timer == timer 2\r
+#define MAC_TIMER_RUN(value)   do{ TIMER2_RUN(value); }while(0)\r
+#endif\r
+#define TIMER3_RUN(value)      (T3CTL = (value) ? T3CTL | 0x10 : T3CTL & ~0x10)\r
+#define TIMER4_RUN(value)      (T4CTL = (value) ? T4CTL | 0x10 : T4CTL & ~0x10)\r
+\r
+// Macro for enabling/ disabling interrupts from the channels of timer 1, 3 or 4.\r
+#define TIMER_CHANNEL_INTERRUPT_ENABLE(timer, channel, value) \\r
+   do{                                                        \\r
+      if(value){                                              \\r
+         T##timer##CCTL##channel## |= 0x40;                   \\r
+      } else {                                                \\r
+         T##timer##CCTL##channel## &= ~0x40;                  \\r
+      }                                                       \\r
+   } while(0)\r
+\r
+#if (chip == 1110 || chip == 1111 || chip == 2510 || chip == 2511)\r
+// Sleep Timer / Wake On Radio (WOR) Timer\r
+\r
+// Macro for initialising the sleep timer / WOR timer.\r
+#define SLEEP_TIMER_INIT()                                    \\r
+   do{                                                        \\r
+      WOREVT1 = 0x87;                                         \\r
+      WOREVT0 = 0x6B;                                         \\r
+      WORCTL = 0x74;                                          \\r
+      WORIRQ = 0x00;                                          \\r
+   } while(0)\r
+\r
+// Macros for enabling / disabling interrupt for event 0 and 1.\r
+#define SLEEP_TIMER_ENABLE_EVENT0_INT(val) do{ WORIRQ = (val) ? WORIRQ | 0x10 : WORIRQ & ~0x10; }while(0)\r
+#define SLEEP_TIMER_ENABLE_EVENT1_INT(val) do{ WORIRQ = (val) ? WORIRQ | 0x20 : WORIRQ & ~0x20; }while(0)\r
+\r
+// Macro for resetting the Sleep / WOR timer\r
+#define SLEEP_TIMER_RESET()      WORCTL |= 0x04\r
+\r
+\r
+#endif\r
+\r
+\r
+/******************************************************************************\r
+*******************          Watch Dog Timer (WDT)          *******************\r
+*******************************************************************************\r
+\r
+The WDT may be used to prevent the unit from being trapped in a system\r
+stalemate, i.e. an endless waiting state. The WDT must be reset before it times\r
+out. If a timeout occurs, the system is reset.\r
+\r
+The WDT can also be configured as a normal timer which generates interrupt at\r
+each timeout. This must be configured manually.\r
+******************************************************************************/\r
+\r
+// Macro for turning on the WDT\r
+#define WDT_ENABLE()   WDCTL |= 0x08\r
+\r
+// Macro for setting the WDT timeout interval\r
+#define WDT_SET_TIMEOUT_PERIOD(timeout) \\r
+   do {                                 \\r
+       WDCTL &= ~0x03;                  \\r
+       WDCTL |= timeout;                \\r
+   } while (0)\r
+\r
+// Where _timeout_ is one of\r
+#define SEC_1          0x00     // after 1 second\r
+#define M_SEC_250      0x01     // after 250 ms\r
+#define M_SEC_15       0x02     // after 15 ms\r
+#define M_SEC_2        0x03     // after 2 ms\r
+\r
+// Macro for resetting the WDT. If this is not done before the WDT times out,\r
+// the system is reset\r
+#define WDT_RESET()                 \\r
+  do {                              \\r
+   WDCTL = (WDCTL & ~0xF0) | 0xA0;  \\r
+   WDCTL = (WDCTL & ~0xF0) | 0x50;  \\r
+} while (0)\r
+\r
+\r
+/******************************************************************************\r
+*******************             ADC macros/functions        *******************\r
+*******************************************************************************\r
+\r
+These functions/macros simplifies usage of the ADC.\r
+\r
+******************************************************************************/\r
+\r
+// Macro for setting up a single conversion. If ADCCON1.STSEL = 11, using this\r
+// macro will also start the conversion.\r
+#define ADC_SINGLE_CONVERSION(settings) \\r
+  do{                                   \\r
+    ADCCON3 = (settings);               \\r
+  }while(0)\r
+\r
+// Macro for setting up a single conversion\r
+#define ADC_SEQUENCE_SETUP(settings)    \\r
+  do{                                   \\r
+    ADCCON2 = (settings);               \\r
+  }while(0)\r
+\r
+// Where _settings_ are the following:\r
+// Reference voltage:\r
+#define ADC_REF_1_25_V      0x00     // Internal 1.25V reference\r
+#define ADC_REF_P0_7        0x40     // External reference on AIN7 pin\r
+#define ADC_REF_AVDD        0x80     // AVDD_SOC pin\r
+#define ADC_REF_P0_6_P0_7   0xC0     // External reference on AIN6-AIN7 differential input\r
+\r
+// Resolution (decimation rate):\r
+#define ADC_8_BIT           0x00     //  64 decimation rate\r
+#define ADC_10_BIT          0x10     // 128 decimation rate\r
+#define ADC_12_BIT          0x20     // 256 decimation rate\r
+#define ADC_14_BIT          0x30     // 512 decimation rate\r
+\r
+// Input channel:\r
+#define ADC_AIN0            0x00     // single ended P0_0\r
+#define ADC_AIN1            0x01     // single ended P0_1\r
+#define ADC_AIN2            0x02     // single ended P0_2\r
+#define ADC_AIN3            0x03     // single ended P0_3\r
+#define ADC_AIN4            0x04     // single ended P0_4\r
+#define ADC_AIN5            0x05     // single ended P0_5\r
+#define ADC_AIN6            0x06     // single ended P0_6\r
+#define ADC_AIN7            0x07     // single ended P0_7\r
+#define ADC_GND             0x0C     // Ground\r
+#define ADC_TEMP_SENS       0x0E     // on-chip temperature sensor\r
+#define ADC_VDD_3           0x0F     // (vdd/3)\r
+\r
+// Macro for starting the ADC in continuous conversion mode\r
+#define ADC_SAMPLE_CONTINUOUS()   \\r
+  do {                            \\r
+    ADCCON1 &= ~0x30;             \\r
+    ADCCON1 |= 0x10;              \\r
+  } while (0)\r
+\r
+// Macro for stopping the ADC in continuous mode\r
+#define ADC_STOP()                \\r
+  do {                            \\r
+    ADCCON1 |= 0x30;              \\r
+  } while (0)\r
+\r
+// Macro for initiating a single sample in single-conversion mode (ADCCON1.STSEL = 11).\r
+#define ADC_SAMPLE_SINGLE()       \\r
+  do{                             \\r
+    ADC_STOP();                   \\r
+    ADCCON1 |= 0x40;              \\r
+} while (0)\r
+\r
+// Macro for configuring the ADC to be started from T1 channel 0. (T1 ch 0 must be in compare mode!!)\r
+#define ADC_TRIGGER_FROM_TIMER1() \\r
+  do {                            \\r
+    ADC_STOP();                   \\r
+    ADCCON1 &= ~0x10;             \\r
+  } while (0)\r
+\r
+// Expression indicating whether a conversion is finished or not.\r
+#define ADC_SAMPLE_READY()      (ADCCON1 & 0x80)\r
+\r
+// Macro for setting/clearing a channel as input of the ADC\r
+#define ADC_ENABLE_CHANNEL(ch)   ADCCFG |=  (0x01 << ch)\r
+#define ADC_DISABLE_CHANNEL(ch)  ADCCFG &= ~(0x01 << ch)\r
+\r
+#define ADC_GET_VALUE( v )       GET_WORD( ADCH, ADCL, v )\r
+\r
+\r
+/******************************************************************************\r
+* @fn  halAdcSampleSingle\r
+*\r
+* @brief\r
+*      This function makes the adc sample the given channel at the given\r
+*      resolution with the given reference.\r
+*\r
+* Parameters:\r
+*\r
+* @param BYTE reference\r
+*          The reference to compare the channel to be sampled.\r
+*        BYTE resolution\r
+*          The resolution to use during the sample (8, 10, 12 or 14 bit)\r
+*        BYTE input\r
+*          The channel to be sampled.\r
+*\r
+* @return INT16\r
+*          The conversion result\r
+*\r
+******************************************************************************/\r
+INT16 halAdcSampleSingle(BYTE reference, BYTE resolution, UINT8 input);\r
+\r
+\r
+\r
+\r
+/******************************************************************************\r
+*******************    RF communication functions/macros    *******************\r
+*******************************************************************************\r
+\r
+The functions in this section are designed to simplify usage of the radio.\r
+A function for setup, transmitting and receiption are included. In addition,\r
+macros for writing instructions to the Command Stobe Processor are included.\r
+\r
+******************************************************************************/\r
+\r
+/******************************************************************************\r
+* @fn  halRfSend\r
+*\r
+* @brief\r
+*      This function sends the given number of bytes using the radio. The radio\r
+*      frequency must be set before sending. Can send a maximum of 125 bytes.\r
+*      The function waits until the transfer is complete.\r
+*\r
+* Parameters:\r
+*\r
+* @param  BYTE*         pData\r
+*         Pointer to the start of the data to be transferred.\r
+* @param  BYTE  length\r
+*         The number of bytes to be transferred.\r
+*\r
+* @return BYTE\r
+*         Returns the number of transferred bytes.\r
+*\r
+******************************************************************************/\r
+BYTE halRfSendPacket(BYTE* pData, BYTE length);\r
+\r
+\r
+\r
+/******************************************************************************\r
+* @fn  halRfReceivePacket\r
+*\r
+* @brief\r
+*      This function receives a maximum of 128 bytes sent by another radio\r
+*      transmitter. The function will wait for _timeOut_ ms before returning\r
+*      without receiving any data.\r
+*\r
+* Parameters:\r
+*\r
+* @param  BYTE*         pData\r
+*         Pointer to the received packet is to be stored.\r
+* @param  BYTE pRssi\r
+*         Pointer to where to store the received signal strength indicator calculation.\r
+* @param  BYTE pLqi\r
+*         Pointer to where to store the link quality indicator.\r
+* @param  BYTE  timeOut\r
+*         The number of ms the chip will wait for a packet to be received.\r
+*\r
+* @return BYTE\r
+*         Returns the number of received bytes.\r
+*\r
+******************************************************************************/\r
+BYTE halRfReceivePacket(BYTE* pData, BYTE*pRssi, BYTE* pLqi, BYTE timeOut);\r
+\r
+/******************************************************************************\r
+* @fn  halRfConfig\r
+*\r
+* @brief\r
+*      This function configures the radio for simple send and receive operation.\r
+*      Advanced IEEE 802.15.4 functionality such as Address Decoding, AutoAck\r
+*      etc is not employed. CRC value is automatically calculated to enable\r
+*      detection of packet corruption. The desired frequency is set. The\r
+*      function returns TRUE if the configuration is successful.\r
+*\r
+* Parameters:\r
+*\r
+* @param  UINT32 frequency\r
+*         The desired Radio Frequency in kHz.\r
+*\r
+* @return BOOL\r
+*         Returns TRUE if the configuration is successful and FALSE otherwise.\r
+*\r
+******************************************************************************/\r
+BOOL halRfConfig(UINT32 frequency);\r
+\r
+/******************************************************************************\r
+* @fn  halRfSetRadioFrequency\r
+*\r
+* @brief\r
+*      This function sets the radio frequency of the radio. The requency must\r
+*      be within the range of the radio.\r
+*\r
+* Parameters:\r
+*\r
+* @param  WORD  frequency\r
+*         The desired Radio Frequency in kHz.\r
+*\r
+* @return void\r
+*\r
+******************************************************************************/\r
+void halRfSetRadioFrequency(UINT32 frequency);\r
+\r
+#if (chip == 2430 || chip == 2431)\r
+#define STOP_RADIO()        ISRFOFF;\r
+\r
+// RF interrupt flags\r
+#define IRQ_RREG_ON         0x80\r
+#define IRQ_TXDONE          0x40\r
+#define IRQ_FIFOP           0x20\r
+#define IRQ_SFD             0x10\r
+#define IRQ_CCA             0x08\r
+#define IRQ_CSP_WT          0x04\r
+#define IRQ_CSP_STOP        0x02\r
+#define IRQ_CSP_INT         0x01\r
+\r
+// RF status flags\r
+#define TX_ACTIVE_FLAG      0x10\r
+#define FIFO_FLAG           0x08\r
+#define FIFOP_FLAG          0x04\r
+#define SFD_FLAG            0x02\r
+#define CCA_FLAG            0x01\r
+\r
+// Radio status states\r
+#define TX_ACTIVE   (RFSTATUS & TX_ACTIVE_FLAG)\r
+#define FIFO        (RFSTATUS & FIFO_FLAG)\r
+#define FIFOP       (RFSTATUS & FIFOP_FLAG)\r
+#define SFD         (RFSTATUS & SFD_FLAG)\r
+#define CCA         (RFSTATUS & CCA_FLAG)\r
+\r
+// Various radio settings\r
+#define ADR_DECODE          0x08\r
+#define AUTO_CRC            0x20\r
+#define AUTO_TX2RX_OFF      0x08\r
+#define RX2RX_TIME_OFF      0x04\r
+#define ACCEPT_ACKPKT       0x01\r
+#endif\r
+\r
+\r
+#if (chip == 1110 || chip == 1111 || chip == 2510 || chip == 2511)\r
+#define STOP_RADIO()        SIDLE();\r
+// RF interrupt flags\r
+#define IRQ_TXUNF           0x80\r
+#define IRQ_RXOVF           0x40\r
+#define IRQ_TIMEOUT         0x20\r
+#define IRQ_DONE            0x10\r
+#define IRQ_CS              0x08\r
+#define IRQ_PQT             0x04\r
+#define IRQ_CCA             0x02\r
+#define IRQ_SFD             0x01\r
+\r
+// RF status flags\r
+#define CRC_OK_FLAG         0x80\r
+#define CS_FLAG             0x40\r
+#define PQT_REACHED_FLAG    0x20\r
+#define CCA_FLAG            0x10\r
+#define SFD_FLAG            0x08\r
+\r
+// Radio status flags\r
+#define CRC_OK_FLAG         0x80\r
+#define CS_FLAG             0x40\r
+#define PQT_REACHED_FLAG    0x20\r
+#define CCA_FLAG            0x10\r
+#define SFD_FLAG            0x08\r
+\r
+// Radio status states\r
+#define CRC_OK             (PKTSTATUS & CRC_OK_FLAG)\r
+#define CS                 (PKTSTATUS & CS_FLAG)\r
+#define PQT_REACHED        (PKTSTATUS & PQT_REACHED_FLAG)\r
+#define CCA                (PKTSTATUS & CCA_FLAG)\r
+#define SFD                (PKTSTATUS & SFD_FLAG)\r
+\r
+// Various radio settings\r
+#define APPEND_STATUS         0x04\r
+#define WHITE_DATA            0x40\r
+#define CRC_EN                0x04\r
+#define VARIABLE_PKT_LEN      0x01\r
+#define STAY_INR_RX_AFTER_RX  0x0C\r
+#define RX_AFTER_TX           0x03\r
+#define CALIBRATE_WHEN_COMING_FROM_IDLE   0x10\r
+#define CALIBRATE_EVERY_4TH   0x30\r
+#define PA_POWER_7            0x07\r
+#define PA_POWER_0            0x00\r
+#endif\r
+\r
+\r
+\r
+#if (chip == 1110 || chip == 1111 || chip == 2510 || chip == 2511)\r
+//-----------------------------------------------------------------------------\r
+// Command Strobes\r
+//-----------------------------------------------------------------------------\r
+#define SFSTXON()     do{RFST = 0x00;}while(0)\r
+#define SCAL()        do{RFST = 0x01;}while(0)\r
+#define SRX()         do{RFST = 0x02;}while(0)\r
+#define STX()         do{RFST = 0x03;}while(0)\r
+#define SIDLE()       do{RFST = 0x04;}while(0)\r
+#define SAFC()        do{RFST = 0x05;}while(0)\r
+#define SNOP()        do{RFST = 0xFF;}while(0)\r
+//-----------------------------------------------------------------------------\r
+#endif\r
+\r
+#if (chip == 2430 || chip == 2431)\r
+//-----------------------------------------------------------------------------\r
+// Command Strobe Processor (CSP) instructions\r
+//-----------------------------------------------------------------------------\r
+#define DECZ        do{RFST = 0xBF;                       }while(0)\r
+#define DECY        do{RFST = 0xBE;                       }while(0)\r
+#define INCY        do{RFST = 0xBD;                       }while(0)\r
+#define INCMAXY(m)  do{RFST = (0xB8 | m);                 }while(0) // m < 8 !!\r
+#define RANDXY      do{RFST = 0xBC;                       }while(0)\r
+#define INT         do{RFST = 0xB9;                       }while(0)\r
+#define WAITX       do{RFST = 0xBB;                       }while(0)\r
+#define WAIT(w)     do{RFST = (0x80 | w);                 }while(0) // w < 64 !!\r
+#define WEVENT      do{RFST = 0xB8;                       }while(0)\r
+#define LABEL       do{RFST = 0xBA;                       }while(0)\r
+#define RPT(n,c)    do{RFST = (0xA0 | (n << 3) | c);      }while(0) // n = TRUE/FALSE && (c < 8)\r
+#define SKIP(s,n,c) do{RFST = ((s << 4) | (n << 3) | c);  }while(0) // && (s < 8)\r
+#define STOP        do{RFST = 0xDF;                       }while(0)\r
+#define SNOP        do{RFST = 0xC0;                       }while(0)\r
+#define STXCALN     do{RFST = 0xC1;                       }while(0)\r
+#define SRXON       do{RFST = 0xC2;                       }while(0)\r
+#define STXON       do{RFST = 0xC3;                       }while(0)\r
+#define STXONCCA    do{RFST = 0xC4;                       }while(0)\r
+#define SRFOFF      do{RFST = 0xC5;                       }while(0)\r
+#define SFLUSHRX    do{RFST = 0xC6;                       }while(0)\r
+#define SFLUSHTX    do{RFST = 0xC7;                       }while(0)\r
+#define SACK        do{RFST = 0xC8;                       }while(0)\r
+#define SACKPEND    do{RFST = 0xC9;                       }while(0)\r
+#define ISSTOP      do{RFST = 0xFF;                       }while(0)\r
+#define ISSTART     do{RFST = 0xFE;                       }while(0)\r
+#define ISTXCALN    do{RFST = 0xE1;                       }while(0)\r
+#define ISRXON      do{RFST = 0xE2;                       }while(0)\r
+#define ISTXON      do{RFST = 0xE3;                       }while(0)\r
+#define ISTXONCCA   do{RFST = 0xE4;                       }while(0)\r
+#define ISRFOFF     do{RFST = 0xE5;                       }while(0)\r
+#define ISFLUSHRX   do{RFST = 0xE6;                       }while(0)\r
+#define ISFLUSHTX   do{RFST = 0xE7;                       }while(0)\r
+#define ISACK       do{RFST = 0xE8;                       }while(0)\r
+#define ISACKPEND   do{RFST = 0xE9;                       }while(0)\r
+#endif\r
+\r
+\r
+// Conditions _c_ for the RPT and SKIP instructions of the CSP\r
+#define CCA_TRUE            0x00;\r
+#define RECEIVING           0x01;\r
+#define MCU_BIT_IS_1        0x02;\r
+#define COMMAND_BUF_EMPT    0x03;\r
+#define REGX_IS_0           0x04;\r
+#define REGY_IS_0           0x05;\r
+#define REGZ_IS_0           0x06;\r
+#define NO_OP               0x07;\r
+\r
+\r
+\r
+/******************************************************************************\r
+******************* Memory space mapping macros/functions  ********************\r
+*******************************************************************************/\r
+\r
+// Macros for enabling or disabling unified code space.\r
+// Unified code space is generally used when executing programs from RAM.\r
+#define ENABLE_UINIFIED_CODE_SPACE()   do { MEMCTR |= 0x40;  } while (0)\r
+#define DISABLE_UINIFIED_CODE_SPACE()  do { MEMCTR &= ~0x40;  } while (0)\r
+\r
+\r
+/******************************************************************************\r
+*******************   AES encryption / decryption functions *******************\r
+*******************************************************************************\r
+\r
+Functions for performing a encryption or decryption using the Advanced\r
+Encryption Standard. A unique 16 byte key must be loaded prior to the\r
+encryption or decryption process.\r
+\r
+The Direct Memory Access (DMA) may also be used for data transfer to and from\r
+the AES module.\r
+\r
+******************************************************************************/\r
+\r
+\r
+/******************************************************************************\r
+* @fn  halAesLoadKeyOrInitVector\r
+*\r
+* @brief\r
+*      This function Loads an AES key or an initialisation vector. The data\r
+*      (key or vector) must be 16 bytes long (128 bit).\r
+*\r
+* Parameters:\r
+*\r
+* @param  BYTE*         pData\r
+*         Pointer to the start of the 16 bit key or the 16 bit initialisation\r
+*         vector to be loaded.\r
+* @param  BOOL key\r
+*         Boolean value. Set to TRUE if a key is to be loaded and FALSE if an\r
+*         initialisation vector is to be loaded.\r
+*\r
+* @return void\r
+*\r
+******************************************************************************/\r
+void halAesLoadKeyOrInitVector(BYTE* pData, BOOL key);\r
+\r
+\r
+/******************************************************************************\r
+* @fn  halAesEncrDecr\r
+*\r
+* @brief\r
+*      Encrypts or decrypts a given number of bytes and stores the result at a\r
+*      given location.\r
+*\r
+* Parameters:\r
+*\r
+* @param  BYTE*         pDataIn\r
+*         Pointer to the start of the data to be decrypted or encrypted\r
+* @param  UINT16        length\r
+*         The number of bytes to be encrypted/decrypted. Should be a multiplum\r
+*         of 16 bytes.\r
+* @param  BYTE*         pDataOut.\r
+*         Pointer to the location at which the converted data is to be stored.\r
+* @param  BYTE*         pInitVector\r
+*         Initialisation vector to fill the AES module at startup. Must be\r
+*         identical for encryption\r
+*         and decryption.\r
+* @param  BOOL  decr\r
+*         Indicates whether an encryption or decryption is to be performed.\r
+*         0 indicates encryption whereas 1 indicates decryption.\r
+*\r
+* @return void\r
+*\r
+******************************************************************************/\r
+void halAesEncrDecr(BYTE* pDataIn, UINT16 length, BYTE* pDataOut, BYTE* pInitVector, BOOL decr);\r
+\r
+#define AES_BUSY        0x08\r
+#define ENCRYPT         0x00\r
+#define DECRYPT         0x01\r
+\r
+// Macro for setting the mode of the AES operation\r
+#define AES_SETMODE(mode)              \\r
+  do {                                 \\r
+    ENCCS &= ~0x70;                    \\r
+    ENCCS |= mode;                     \\r
+  } while (0)\r
+\r
+// _mode_ is one of\r
+#define CBC             0x00\r
+#define CFB             0x10\r
+#define OFB             0x20\r
+#define CTR             0x30\r
+#define ECB             0x40\r
+#define CBC_MAC         0x50\r
+\r
+// Macro for starting or stopping encryption or decryption\r
+#define AES_SET_ENCR_DECR_KEY_IV(mode) \\r
+  do {                                 \\r
+    ENCCS &= ~0x07;                    \\r
+    ENCCS |=  mode;                    \\r
+  } while(0)\r
+\r
+// Where _mode_ is one of\r
+#define AES_ENCRYPT     0x00\r
+#define AES_DECRYPT     0x02\r
+#define AES_LOAD_KEY    0x04\r
+#define AES_LOAD_IV     0x06\r
+\r
+\r
+// Macro for starting the AES module for either encryption, decryption,\r
+// key or initialisation vector loading.\r
+#define AES_START()     ENCCS |= 0x01\r
+\r
+\r
+/******************************************************************************\r
+*************         Random Generator macros / functions          ************\r
+*******************************************************************************\r
+\r
+Example usage:\r
+\r
+First initialise the random generator:\r
+  halInitRandomGenerator();\r
+\r
+Each time the random generator is read, the following sequence should\r
+be used (clock the random generator for each read):\r
+  CLOCK_RANDOM_GENERATOR();\r
+  rnd = GET_RANDOM_VALUE();\r
+\r
+******************************************************************************/\r
+\r
+// Macro for enabling the random generator\r
+#define ENABLE_RANDOM_GENERATOR()      \\r
+  do{ ADCCON1 &= ~0x0C; } while(0)\r
+\r
+// Macro for clocking the random generator\r
+#define CLOCK_RANDOM_GENERATOR()       \\r
+  do{ ADCCON1 |= 0x04; } while(0)\r
+\r
+// Macro for getting a random byte\r
+#define GET_RANDOM_BYTE(a)             \\r
+   do{                                 \\r
+      CLOCK_RANDOM_GENERATOR();        \\r
+      a = RNDH;                        \\r
+   }while(0)\r
+\r
+// Macro for getting a random word\r
+#define GET_RANDOM_WORD(a)             \\r
+   do{                                 \\r
+      CLOCK_RANDOM_GENERATOR();        \\r
+      GET_WORD( RNDH, RNDL, a );       \\r
+   }while(0)\r
+\r
+\r
+/******************************************************************************\r
+* @fn  halInitRandomGenerator\r
+*\r
+* @brief\r
+*      This function generates a random sequence using the radio. The radio is\r
+*      turned on and data is sampled from the receiver. This data is used to\r
+*      seed the random generator. This seeding forms the basis for generating\r
+*      new random bytes by clocking the random generator.\r
+*\r
+* Parameters:\r
+*\r
+* @param  void\r
+*\r
+* @return void\r
+*\r
+******************************************************************************/\r
+void halInitRandomGenerator(void);\r
+\r
+#if (chip == 2431)\r
+/******************************************************************************\r
+*******************              Location Engine            *******************\r
+******************************************************************************/\r
+\r
+//Location engine enable\r
+#define LOC_ENABLE()  do { LOCENG |= 0x10;  } while(0)\r
+#define LOC_DISABLE() do { LOCENG &= ~0x10; } while(0)\r
+\r
+//Location engine load parameters\r
+#define LOC_PARAMETER_LOAD( on )\\r
+   do {                         \\r
+      if(on) LOCENG |= 0x04;    \\r
+      else LOCENG &= ~0x04;     \\r
+   } while(0)\r
+\r
+//Location engine load reference coordinates\r
+#define LOC_REFERENCE_LOAD( on )\\r
+   do {                         \\r
+      if(on) LOCENG |= 0x02;    \\r
+      else LOCENG &= ~0x02;     \\r
+} while(0)\r
+\r
+//Location engine run\r
+#define LOC_RUN()    LOCENG |= 0x01\r
+\r
+//Location engine done\r
+#define LOC_DONE()  (LOCENG & 0x08)\r
+\r
+#endif\r
+\r
+/******************************************************************************\r
+*******************              Utility functions          *******************\r
+******************************************************************************/\r
+\r
+/******************************************************************************\r
+* @fn  halWait\r
+*\r
+* @brief\r
+*      This function waits approximately a given number of m-seconds\r
+*      regardless of main clock speed.\r
+*\r
+* Parameters:\r
+*\r
+* @param  BYTE  wait\r
+*         The number of m-seconds to wait.\r
+*\r
+* @return void\r
+*\r
+******************************************************************************/\r
+void halWait(BYTE wait);\r
+\r
+\r
+\r
+/******************************************************************************\r
+* @fn  getkey\r
+*\r
+* @brief\r
+*       This function gets a char from UART0. It waits for URX0IF to be set before\r
+*       reading the value and return. If URX0IF is not set, the function will\r
+*       never return.\r
+*\r
+* Parameters:\r
+*\r
+* @param  void\r
+*\r
+* @return char\r
+*         The received byte.\r
+******************************************************************************/\r
+char getkey(void);\r
+\r
+/******************************************************************************\r
+* @fn  putchar\r
+*\r
+* @brief\r
+*      This writes a byte to the UART.\r
+*\r
+*      NOTE: This function is adapted to the printf() function of IAR (in\r
+*            accordance with ANSI C). This is the reason for the apparently\r
+*            contradictory castings/type conversions (int <-> char).\r
+*\r
+*            NOTE: A condition for using this function is that the\r
+*                  UART0 TX flag is set before usage. If this requirement is\r
+*                  not met, the function will never return.\r
+*\r
+* Parameters:\r
+*\r
+* @param  int   i\r
+*         The value to be written to the UART\r
+* @return int\r
+*\r
+******************************************************************************/\r
+int putchar(int i);\r
+\r
+#if (chip == 2510 || chip == 2511 || chip==1110 || chip==1111)\r
+/******************************************************************************\r
+* @fn  utilEnterCriticalSection\r
+*\r
+* @brief\r
+*      Turn off global interrupts and return the previous state of EA.\r
+*\r
+*\r
+*\r
+* Parameters:\r
+*\r
+* @param  void\r
+*\r
+* @return BOOL\r
+*\r
+******************************************************************************/\r
+__near_func BOOL utilEnterCriticalSection(void);\r
+\r
+/******************************************************************************\r
+* @fn  utilEnterCriticalSection\r
+*\r
+* @brief\r
+*      Restore the previous EA state from the value provided in the function parameter\r
+*\r
+*\r
+*\r
+* Parameters:\r
+*\r
+* @param  BOOL\r
+*\r
+* @return void\r
+*\r
+******************************************************************************/\r
+__near_func void utilLeaveCriticalSection(BOOL oldStatus);\r
+#endif\r
+\r
+#endif //HAL_H\r
diff --git a/chronos-ti/Software Projects/RF Access Point/IAR/HAL/include/hal_defs.h b/chronos-ti/Software Projects/RF Access Point/IAR/HAL/include/hal_defs.h
new file mode 100755 (executable)
index 0000000..ca0c274
--- /dev/null
@@ -0,0 +1,189 @@
+/***********************************************************************************\r
+  Filename:     hal_defs.h\r
+\r
+  Description:  HAL defines\r
+\r
+***********************************************************************************/\r
+\r
+#ifndef HAL_DEFS_H\r
+#define HAL_DEFS_H\r
+\r
+/***********************************************************************************\r
+* CONSTANTS AND DEFINES\r
+*/\r
+\r
+#ifndef TRUE\r
+#define TRUE 1\r
+#else\r
+#ifdef __IAR_SYSTEMS_ICC__\r
+#warning "Macro TRUE already defined"\r
+#endif\r
+#endif\r
+\r
+#ifndef FALSE\r
+#define FALSE 0\r
+#else\r
+#ifdef __IAR_SYSTEMS_ICC__\r
+#warning "Macro FALSE already defined"\r
+#endif\r
+#endif\r
+\r
+#ifndef NULL\r
+#define NULL (void *)0\r
+#else\r
+#ifdef __IAR_SYSTEMS_ICC__\r
+#warning "Macro NULL already defined"\r
+#endif\r
+#endif\r
+\r
+#ifndef SUCCESS\r
+#define SUCCESS 0\r
+#else\r
+#warning "Macro SUCCESS already defined"\r
+#endif\r
+\r
+#ifndef FAILED\r
+#ifndef WIN32\r
+#define FAILED  1\r
+#endif\r
+#else\r
+#ifdef __IAR_SYSTEMS_ICC__\r
+#warning "Macro FAILED already defined"\r
+#endif\r
+#endif\r
+\r
+/***********************************************************************************\r
+* MACROS\r
+*/\r
+\r
+#ifndef BV\r
+#define BV(n)      (1 << (n))\r
+#endif\r
+\r
+#ifndef BM\r
+#define BM(n)      (1 << (n))\r
+#endif\r
+\r
+#ifndef BF\r
+#define BF(x,b,s)  (((x) & (b)) >> (s))\r
+#endif\r
+\r
+#ifndef MIN\r
+#define MIN(n,m)   (((n) < (m)) ? (n) : (m))\r
+#endif\r
+\r
+#ifndef MAX\r
+#define MAX(n,m)   (((n) < (m)) ? (m) : (n))\r
+#endif\r
+\r
+#ifndef ABS\r
+#define ABS(n)     (((n) < 0) ? -(n) : (n))\r
+#endif\r
+\r
+\r
+/* uint32 processing */\r
+#define BREAK_UINT32( var, ByteNum ) \\r
+    (uint8)((uint32)(((var) >>((ByteNum) * 8)) & 0x00FF))\r
+\r
+#define BUILD_UINT32(Byte0, Byte1, Byte2, Byte3) \\r
+    ((uint32)((uint32)((Byte0) & 0x00FF) \\r
+        + ((uint32)((Byte1) & 0x00FF) << 8) \\r
+            + ((uint32)((Byte2) & 0x00FF) << 16) \\r
+                + ((uint32)((Byte3) & 0x00FF) << 24)))\r
+\r
+#define HI_UINT32(a) ((uint16) (((uint32)(a)) >> 16))\r
+#define LO_UINT32(a) ((uint16) ((uint32)(a)))\r
+\r
+\r
+/* uint16 processing */\r
+#define BUILD_UINT16(loByte, hiByte) \\r
+    ((uint16)(((loByte) & 0x00FF) + (((hiByte) & 0x00FF) << 8)))\r
+\r
+#define HI_UINT16(a) (((uint16)(a) >> 8) & 0xFF)\r
+#define LO_UINT16(a) ((uint16)(a) & 0xFF)\r
+\r
+\r
+/* uint16 processing */\r
+#define BUILD_UINT8(hiByte, loByte) \\r
+    ((uint8)(((loByte) & 0x0F) + (((hiByte) & 0x0F) << 4)))\r
+\r
+#define HI_UINT8(a) (((uint8)(a) >> 4) & 0x0F)\r
+#define LO_UINT8(a) ((uint8)(a) & 0x0F)\r
+\r
+/***********************************************************************************\r
+ * Host to network byte order macros\r
+ */\r
+#ifdef BIG_ENDIAN\r
+#define UINT16_HTON(x)  st( utilReverseBuf((uint8*)&x, sizeof(uint16)); )\r
+#define UINT16_NTOH(x)  st( utilReverseBuf((uint8*)&x, sizeof(uint16)); )\r
+\r
+#define UINT32_HTON(x)  st( utilReverseBuf((uint8*)&x, sizeof(uint32)); )\r
+#define UINT32_NTOH(x)  st( utilReverseBuf((uint8*)&x, sizeof(uint32)); )\r
+#else\r
+#define UINT16_HTON(x)\r
+#define UINT16_NTOH(x)\r
+\r
+#define UINT32_HTON(x)\r
+#define UINT32_NTOH(x)\r
+#endif\r
+\r
+\r
+/*\r
+*  This macro is for use by other macros to form a fully valid C statement.\r
+*  Without this, the if/else conditionals could show unexpected behavior.\r
+*\r
+*  For example, use...\r
+*    #define SET_REGS()  st( ioreg1 = 0; ioreg2 = 0; )\r
+*  instead of ...\r
+*    #define SET_REGS()  { ioreg1 = 0; ioreg2 = 0; }\r
+*  or\r
+*    #define  SET_REGS()    ioreg1 = 0; ioreg2 = 0;\r
+*  The last macro would not behave as expected in the if/else construct.\r
+*  The second to last macro will cause a compiler error in certain uses\r
+*  of if/else construct\r
+*\r
+*  It is not necessary, or recommended, to use this macro where there is\r
+*  already a valid C statement.  For example, the following is redundant...\r
+*    #define CALL_FUNC()   st(  func();  )\r
+*  This should simply be...\r
+*    #define CALL_FUNC()   func()\r
+*\r
+* (The while condition below evaluates false without generating a\r
+*  constant-controlling-loop type of warning on most compilers.)\r
+*/\r
+#define st(x)      do { x } while (__LINE__ == -1)\r
+\r
+\r
+/***********************************************************************************\r
+  Copyright 2007 Texas Instruments Incorporated. All rights reserved.\r
+\r
+  IMPORTANT: Your use of this Software is limited to those specific rights\r
+  granted under the terms of a software license agreement between the user\r
+  who downloaded the software, his/her employer (which must be your employer)\r
+  and Texas Instruments Incorporated (the "License").  You may not use this\r
+  Software unless you agree to abide by the terms of the License. The License\r
+  limits your use, and you acknowledge, that the Software may not be modified,\r
+  copied or distributed unless embedded on a Texas Instruments microcontroller\r
+  or used solely and exclusively in conjunction with a Texas Instruments radio\r
+  frequency transceiver, which is integrated into your product.  Other than for\r
+  the foregoing purpose, you may not use, reproduce, copy, prepare derivative\r
+  works of, modify, distribute, perform, display or sell this Software and/or\r
+  its documentation for any purpose.\r
+\r
+  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE\r
+  PROVIDED \93AS IS\94 WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED,\r
+  INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE,\r
+  NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL\r
+  TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER\r
+  LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES\r
+  INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE\r
+  OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT\r
+  OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES\r
+  (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+\r
+  Should you have any questions regarding your right to use this Software,\r
+  contact Texas Instruments Incorporated at www.TI.com.\r
+***********************************************************************************/\r
+\r
+#endif\r
diff --git a/chronos-ti/Software Projects/RF Access Point/IAR/HAL/include/hal_int.h b/chronos-ti/Software Projects/RF Access Point/IAR/HAL/include/hal_int.h
new file mode 100755 (executable)
index 0000000..1f8d2df
--- /dev/null
@@ -0,0 +1,125 @@
+/******************************************************************************\r
+  Filename:     hal_int.h\r
+\r
+  Description:  HAL interrupt control header file\r
+\r
+******************************************************************************/\r
+\r
+\r
+#ifndef HAL_INT_H\r
+#define HAL_INT_H\r
+\r
+#ifdef __cplusplus\r
+extern "C" {\r
+#endif\r
+\r
+/******************************************************************************\r
+ * INCLUDES\r
+ */\r
+#include "hal_types.h"\r
+\r
+\r
+/******************************************************************************\r
+ * MACROS\r
+ */\r
+\r
+#if (defined __ICC430__) || defined(__MSP430__)\r
+\r
+// Use the macros below to reduce function call overhead for common\r
+// global interrupt control functions\r
+\r
+\r
+#if (defined __ICC430__)\r
+#define HAL_INT_ON(x)      st( __enable_interrupt(); )\r
+#define HAL_INT_OFF(x)     st( __disable_interrupt(); )\r
+#define HAL_INT_LOCK(x)    st( (x) = __get_interrupt_state(); \\r
+                               __disable_interrupt(); )\r
+#define HAL_INT_UNLOCK(x)  st( __set_interrupt_state(x); )\r
+#endif\r
+\r
+#if (defined __MSP430__)\r
+#define HAL_INT_ON(x)      st( _enable_interrupts(); )\r
+#define HAL_INT_OFF(x)     st( _disable_interrupts(); )\r
+#define HAL_INT_LOCK(x)    st( (x) = _get_SR_register(); \\r
+                               _disable_interrupts(); )\r
+#define HAL_INT_UNLOCK(x)  st( _enable_interrupts(); /*_bis_SR_register(x);*/ )\r
+#endif\r
+\r
+#elif defined __ICC8051__\r
+\r
+#define HAL_INT_ON(x)      st( EA = 1; )\r
+#define HAL_INT_OFF(x)     st( EA = 0; )\r
+#define HAL_INT_LOCK(x)    st( (x) = EA; EA = 0; )\r
+#define HAL_INT_UNLOCK(x)  st( EA = (x); )\r
+\r
+typedef unsigned short istate_t;\r
+\r
+#elif defined WIN32\r
+\r
+#define HAL_INT_ON()\r
+#define HAL_INT_OFF()\r
+#define HAL_INT_LOCK(x)    st ((x)= 1; )\r
+#define HAL_INT_UNLOCK(x)\r
+\r
+#elif defined __KEIL__\r
+\r
+#define HAL_INT_ON(x)      st( EA = 1; )\r
+#define HAL_INT_OFF(x)     st( EA = 0; )\r
+#define HAL_INT_LOCK(x)    st( (x) = EA; EA = 0; )\r
+#define HAL_INT_UNLOCK(x)  st( EA = (x); )\r
+\r
+\r
+\r
+#else\r
+#error "Unsupported compiler"\r
+#endif\r
+\r
+\r
+/******************************************************************************\r
+ * GLOBAL FUNCTIONS\r
+ */\r
+\r
+void   halIntOn(void);\r
+void   halIntOff(void);\r
+uint16 halIntLock(void);\r
+void   halIntUnlock(uint16 key);\r
+\r
+\r
+#ifdef  __cplusplus\r
+}\r
+#endif\r
+\r
+\r
+/***********************************************************************************\r
+  Copyright 2007 Texas Instruments Incorporated. All rights reserved.\r
+\r
+  IMPORTANT: Your use of this Software is limited to those specific rights\r
+  granted under the terms of a software license agreement between the user\r
+  who downloaded the software, his/her employer (which must be your employer)\r
+  and Texas Instruments Incorporated (the "License").  You may not use this\r
+  Software unless you agree to abide by the terms of the License. The License\r
+  limits your use, and you acknowledge, that the Software may not be modified,\r
+  copied or distributed unless embedded on a Texas Instruments microcontroller\r
+  or used solely and exclusively in conjunction with a Texas Instruments radio\r
+  frequency transceiver, which is integrated into your product.  Other than for\r
+  the foregoing purpose, you may not use, reproduce, copy, prepare derivative\r
+  works of, modify, distribute, perform, display or sell this Software and/or\r
+  its documentation for any purpose.\r
+\r
+  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE\r
+  PROVIDED \93AS IS\94 WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED,\r
+  INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE,\r
+  NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL\r
+  TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER\r
+  LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES\r
+  INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE\r
+  OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT\r
+  OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES\r
+  (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+\r
+  Should you have any questions regarding your right to use this Software,\r
+  contact Texas Instruments Incorporated at www.TI.com.\r
+***********************************************************************************/\r
+\r
+#endif\r
diff --git a/chronos-ti/Software Projects/RF Access Point/IAR/HAL/include/hal_led.h b/chronos-ti/Software Projects/RF Access Point/IAR/HAL/include/hal_led.h
new file mode 100755 (executable)
index 0000000..f3b60a7
--- /dev/null
@@ -0,0 +1,66 @@
+/***********************************************************************************\r
+  Filename:     hal_led.h\r
+\r
+  Description:  hal led library header file\r
+\r
+***********************************************************************************/\r
+\r
+#ifndef HAL_LED_H\r
+#define HAL_LED_H\r
+\r
+#ifdef __cplusplus\r
+extern "C" {\r
+#endif\r
+\r
+/***********************************************************************************\r
+* INCLUDES\r
+*/\r
+#include "hal_types.h"\r
+\r
+/***********************************************************************************\r
+ * GLOBAL FUNCTIONS\r
+ */\r
+void halLedInit(void);\r
+void halLedSet(uint8 led_id);\r
+void halLedClear(uint8 led_id);\r
+void halLedToggle(uint8 led_id);\r
+\r
+\r
+#ifdef  __cplusplus\r
+}\r
+#endif\r
+\r
+\r
+/***********************************************************************************\r
+  Copyright 2007 Texas Instruments Incorporated. All rights reserved.\r
+\r
+  IMPORTANT: Your use of this Software is limited to those specific rights\r
+  granted under the terms of a software license agreement between the user\r
+  who downloaded the software, his/her employer (which must be your employer)\r
+  and Texas Instruments Incorporated (the "License").  You may not use this\r
+  Software unless you agree to abide by the terms of the License. The License\r
+  limits your use, and you acknowledge, that the Software may not be modified,\r
+  copied or distributed unless embedded on a Texas Instruments microcontroller\r
+  or used solely and exclusively in conjunction with a Texas Instruments radio\r
+  frequency transceiver, which is integrated into your product.  Other than for\r
+  the foregoing purpose, you may not use, reproduce, copy, prepare derivative\r
+  works of, modify, distribute, perform, display or sell this Software and/or\r
+  its documentation for any purpose.\r
+\r
+  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE\r
+  PROVIDED \93AS IS\94 WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED,\r
+  INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE,\r
+  NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL\r
+  TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER\r
+  LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES\r
+  INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE\r
+  OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT\r
+  OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES\r
+  (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+\r
+  Should you have any questions regarding your right to use this Software,\r
+  contact Texas Instruments Incorporated at www.TI.com.\r
+***********************************************************************************/\r
+\r
+#endif\r
diff --git a/chronos-ti/Software Projects/RF Access Point/IAR/HAL/include/hal_mcu.h b/chronos-ti/Software Projects/RF Access Point/IAR/HAL/include/hal_mcu.h
new file mode 100755 (executable)
index 0000000..1fc8c53
--- /dev/null
@@ -0,0 +1,90 @@
+/***********************************************************************************\r
+  Filename:     hal_mcu.h\r
+\r
+  Description:  hal mcu library header file\r
+\r
+***********************************************************************************/\r
+\r
+#ifndef HAL_MCU_H\r
+#define HAL_MCU_H\r
+\r
+#ifdef __cplusplus\r
+extern "C" {\r
+#endif\r
+\r
+/***********************************************************************************\r
+* INCLUDES\r
+*/\r
+#include <hal_types.h>\r
+\r
+\r
+/***********************************************************************************\r
+ * CONSTANTS AND DEFINES\r
+ */\r
+enum {                  // Input values to halMcuSetLowPowerMode()\r
+    HAL_MCU_LPM_0,\r
+    HAL_MCU_LPM_1,\r
+    HAL_MCU_LPM_2,\r
+    HAL_MCU_LPM_3,\r
+    HAL_MCU_LPM_4\r
+};\r
+\r
+\r
+enum {                  // Return values of halMcuGetResetCause()\r
+    HAL_MCU_RESET_CAUSE_POR,\r
+    HAL_MCU_RESET_CAUSE_EXTERNAL,\r
+    HAL_MCU_RESET_CAUSE_WATCHDOG\r
+};\r
+\r
+\r
+/***********************************************************************************\r
+ * GLOBAL FUNCTIONS\r
+ */\r
+\r
+void halMcuInit(void);\r
+void halMcuWaitUs(uint16 usec);\r
+void halMcuWaitMs(uint16 msec);\r
+void halMcuSetLowPowerMode(uint8 mode);\r
+void halMcuReset(void);\r
+uint8 halMcuGetResetCause(void);\r
+\r
+\r
+#ifdef  __cplusplus\r
+}\r
+#endif\r
+\r
+/**********************************************************************************/\r
+#endif\r
+\r
+\r
+/***********************************************************************************\r
+  Copyright 2007 Texas Instruments Incorporated. All rights reserved.\r
+\r
+  IMPORTANT: Your use of this Software is limited to those specific rights\r
+  granted under the terms of a software license agreement between the user\r
+  who downloaded the software, his/her employer (which must be your employer)\r
+  and Texas Instruments Incorporated (the "License").  You may not use this\r
+  Software unless you agree to abide by the terms of the License. The License\r
+  limits your use, and you acknowledge, that the Software may not be modified,\r
+  copied or distributed unless embedded on a Texas Instruments microcontroller\r
+  or used solely and exclusively in conjunction with a Texas Instruments radio\r
+  frequency transceiver, which is integrated into your product.  Other than for\r
+  the foregoing purpose, you may not use, reproduce, copy, prepare derivative\r
+  works of, modify, distribute, perform, display or sell this Software and/or\r
+  its documentation for any purpose.\r
+\r
+  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE\r
+  PROVIDED \93AS IS\94 WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED,\r
+  INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE,\r
+  NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL\r
+  TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER\r
+  LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES\r
+  INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE\r
+  OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT\r
+  OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES\r
+  (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+\r
+  Should you have any questions regarding your right to use this Software,\r
+  contact Texas Instruments Incorporated at www.TI.com.\r
+***********************************************************************************/\r
diff --git a/chronos-ti/Software Projects/RF Access Point/IAR/HAL/include/hal_types.h b/chronos-ti/Software Projects/RF Access Point/IAR/HAL/include/hal_types.h
new file mode 100755 (executable)
index 0000000..e8f58f6
--- /dev/null
@@ -0,0 +1,188 @@
+/***********************************************************************************\r
+  Filename:     hal_types.h\r
+\r
+  Description:  HAL type definitions\r
+\r
+***********************************************************************************/\r
+\r
+#ifndef HAL_TYPES_H\r
+#define HAL_TYPES_H\r
+\r
+#ifdef __cplusplus\r
+extern "C" {\r
+#endif\r
+\r
+\r
+\r
+/***********************************************************************************\r
+ * TYPEDEFS\r
+ */\r
+\r
+typedef signed   char   int8;\r
+typedef unsigned char   uint8;\r
+\r
+typedef signed   short  int16;\r
+typedef unsigned short  uint16;\r
+\r
+typedef signed   long   int32;\r
+typedef unsigned long   uint32;\r
+\r
+\r
+typedef void (*ISR_FUNC_PTR)(void);\r
+typedef void (*VFPTR)(void);\r
+\r
+\r
+/***********************************************************************************\r
+ * Compiler abstraction\r
+ */\r
+\r
+/*****************************************************\r
+ * IAR MSP430\r
+ */\r
+#ifdef __IAR_SYSTEMS_ICC__\r
+\r
+#define _PRAGMA(x) _Pragma(#x)\r
+\r
+#if defined __ICC430__\r
+\r
+#ifndef CODE\r
+#define CODE\r
+#endif\r
+#ifndef XDATA\r
+#define XDATA\r
+#endif\r
+#define FAR\r
+#define NOP()  asm("NOP")\r
+\r
+#define HAL_ISR_FUNC_DECLARATION(f,v)   \\r
+    _PRAGMA(vector=v##_VECTOR) __interrupt void f(void)\r
+#define HAL_ISR_FUNC_PROTOTYPE(f,v)     \\r
+    _PRAGMA(vector=v##_VECTOR) __interrupt void f(void)\r
+#define HAL_ISR_FUNCTION(f,v)           \\r
+    HAL_ISR_FUNC_PROTOTYPE(f,v); HAL_ISR_FUNC_DECLARATION(f,v)\r
+\r
+\r
+/*****************************************************\r
+ * IAR 8051\r
+ */\r
+#elif defined __ICC8051__\r
+\r
+#ifndef BSP_H\r
+#define CODE   __code\r
+#define XDATA  __xdata\r
+#endif\r
+\r
+#define FAR\r
+#define NOP()  asm("NOP")\r
+\r
+#define HAL_MCU_LITTLE_ENDIAN()   __LITTLE_ENDIAN__\r
+#define HAL_ISR_FUNC_DECLARATION(f,v)   \\r
+    _PRAGMA(vector=v) __near_func __interrupt void f(void)\r
+#define HAL_ISR_FUNC_PROTOTYPE(f,v)     \\r
+    _PRAGMA(vector=v) __near_func __interrupt void f(void)\r
+#define HAL_ISR_FUNCTION(f,v)           \\r
+    HAL_ISR_FUNC_PROTOTYPE(f,v); HAL_ISR_FUNC_DECLARATION(f,v)\r
+\r
+#else\r
+#error "Unsupported architecture"\r
+#endif\r
+\r
+\r
+/*****************************************************\r
+ * KEIL 8051\r
+ */\r
+#elif defined __KEIL__\r
+#include <intrins.h>\r
+#define BIG_ENDIAN\r
+\r
+#define CODE   code\r
+#define XDATA  xdata\r
+#define FAR\r
+#define NOP()  _nop_()\r
+\r
+#define HAL_ISR_FUNC_DECLARATION(f,v)   \\r
+    void f(void) interrupt v\r
+#define HAL_ISR_FUNC_PROTOTYPE(f,v)     \\r
+    void f(void)\r
+#define HAL_ISR_FUNCTION(f,v)           \\r
+    HAL_ISR_FUNC_PROTOTYPE(f,v); HAL_ISR_FUNC_DECLARATION(f,v)\r
+\r
+typedef unsigned short istate_t;\r
+\r
+// Keil workaround\r
+#define __code  code\r
+#define __xdata xdata\r
+\r
+\r
+/*****************************************************\r
+ * WIN32\r
+ */\r
+#elif defined WIN32\r
+\r
+#define CODE\r
+#define XDATA\r
+#include "windows.h"\r
+#define FAR far\r
+#pragma warning (disable :4761)\r
+\r
+\r
+/*****************************************************\r
+ * Code Composer Essential\r
+ */\r
+\r
+#elif __TI_COMPILER_VERSION__\r
+#define CODE\r
+#define XDATA\r
+#define FAR\r
+\r
+typedef unsigned short istate_t;\r
+\r
+\r
+/*****************************************************\r
+ * Other compilers\r
+ */\r
+#else\r
+#error "Unsupported compiler"\r
+#endif\r
+\r
+\r
+\r
+#ifdef __cplusplus\r
+}\r
+#endif\r
+\r
+\r
+\r
+/***********************************************************************************\r
+  Copyright 2007-2008 Texas Instruments Incorporated. All rights reserved.\r
+\r
+  IMPORTANT: Your use of this Software is limited to those specific rights\r
+  granted under the terms of a software license agreement between the user\r
+  who downloaded the software, his/her employer (which must be your employer)\r
+  and Texas Instruments Incorporated (the "License").  You may not use this\r
+  Software unless you agree to abide by the terms of the License. The License\r
+  limits your use, and you acknowledge, that the Software may not be modified,\r
+  copied or distributed unless embedded on a Texas Instruments microcontroller\r
+  or used solely and exclusively in conjunction with a Texas Instruments radio\r
+  frequency transceiver, which is integrated into your product.  Other than for\r
+  the foregoing purpose, you may not use, reproduce, copy, prepare derivative\r
+  works of, modify, distribute, perform, display or sell this Software and/or\r
+  its documentation for any purpose.\r
+\r
+  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE\r
+  PROVIDED \93AS IS\94 WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED,\r
+  INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE,\r
+  NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL\r
+  TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER\r
+  LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES\r
+  INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE\r
+  OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT\r
+  OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES\r
+  (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+\r
+  Should you have any questions regarding your right to use this Software,\r
+  contact Texas Instruments Incorporated at www.TI.com.\r
+***********************************************************************************/\r
+\r
+#endif\r
diff --git a/chronos-ti/Software Projects/RF Access Point/IAR/HAL/source/adcSampleSingle.c b/chronos-ti/Software Projects/RF Access Point/IAR/HAL/source/adcSampleSingle.c
new file mode 100755 (executable)
index 0000000..f89f09f
--- /dev/null
@@ -0,0 +1,61 @@
+/*\r
++------------------------------------------------------------------------------\r
+|  Copyright 2004-2007 Texas Instruments Incorporated. All rights reserved.\r
+|\r
+|  IMPORTANT: Your use of this Software is limited to those specific rights\r
+|  granted under the terms of a software license agreement between the user who\r
+|  downloaded the software, his/her employer (which must be your employer) and\r
+|  Texas Instruments Incorporated (the "License"). You may not use this Software\r
+|  unless you agree to abide by the terms of the License. The License limits\r
+|  your use, and you acknowledge, that the Software may not be modified, copied\r
+|  or distributed unless embedded on a Texas Instruments microcontroller or used\r
+|  solely and exclusively in conjunction with a Texas Instruments radio\r
+|  frequency transceiver, which is integrated into your product. Other than for\r
+|  the foregoing purpose, you may not use, reproduce, copy, prepare derivative\r
+|  works of, modify, distribute, perform, display or sell this Software and/or\r
+|  its documentation for any purpose.\r
+|\r
+|  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE\r
+|  PROVIDED \93AS IS\94 WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED,\r
+|  INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE,\r
+|  NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL\r
+|  TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+|  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER\r
+|  LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING\r
+|  BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR\r
+|  CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT OF\r
+|  SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES\r
+|  (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+|\r
+|  Should you have any questions regarding your right to use this Software,\r
+|  contact Texas Instruments Incorporated at www.TI.com.\r
+|\r
++------------------------------------------------------------------------------\r
+|   File:      adcSampleSingle.c\r
+|   Target:    cc2430, cc2431, cc1110, cc2510, cc2511, cc1111\r
+|   Author:    EFU\r
+|   Revised:   26/10-2005\r
+|   Revision:  1.0\r
++-----------------------------------------------------------------------------*/\r
+\r
+#include "hal.h"\r
+\r
+//-----------------------------------------------------------------------------\r
+// See hal.h for a description of this function.\r
+//-----------------------------------------------------------------------------\r
+INT16 halAdcSampleSingle(BYTE reference, BYTE resolution, UINT8 input) {\r
+    BYTE volatile temp;\r
+    INT16 value;\r
+\r
+    ADC_ENABLE_CHANNEL(input);\r
+\r
+    ADCIF = 0;\r
+    ADC_SINGLE_CONVERSION(reference | resolution | input);\r
+    while(!ADCIF);\r
+    ADC_GET_VALUE( value );\r
+\r
+    ADC_DISABLE_CHANNEL(input);\r
+\r
+    resolution >>= 3;\r
+    return value >> (8 - resolution);\r
+}\r
diff --git a/chronos-ti/Software Projects/RF Access Point/IAR/HAL/source/cc8051/hal_cc8051.h b/chronos-ti/Software Projects/RF Access Point/IAR/HAL/source/cc8051/hal_cc8051.h
new file mode 100755 (executable)
index 0000000..b7c6ffa
--- /dev/null
@@ -0,0 +1,122 @@
+/******************************************************************************\r
+    Filename: hal_cc8051.h\r
+\r
+    Copyright 2007 Texas Instruments, Inc.\r
+******************************************************************************/\r
+\r
+#ifndef HAL_CC8051_H\r
+#define HAL_CC8051_H\r
+\r
+/******************************************************************************\r
+ * INCLUDES\r
+ */\r
+\r
+#include <hal_types.h>\r
+#include <hal_defs.h>\r
+\r
+\r
+/******************************************************************************\r
+ * CONSTANTS\r
+ */\r
+#define BIT0              0x01\r
+#define BIT1              0x02\r
+#define BIT2              0x04\r
+#define BIT3              0x08\r
+#define BIT4              0x10\r
+#define BIT5              0x20\r
+#define BIT6              0x40\r
+#define BIT7              0x80\r
+\r
+\r
+/******************************************************************************\r
+ * MACROS\r
+ */\r
+\r
+#define MCU_IO_TRISTATE   1             // Used as "func" for the macros below\r
+#define MCU_IO_PULLUP     2\r
+#define MCU_IO_PULLDOWN   3\r
+\r
+\r
+//-----------------------------------------------------------------------------\r
+//  Macros for simple configuration of IO pins on TI LPW SoCs\r
+//-----------------------------------------------------------------------------\r
+#define MCU_IO_PERIPHERAL(port, pin)   MCU_IO_PERIPHERAL_PREP(port, pin)\r
+#define MCU_IO_INPUT(port, pin, func)  MCU_IO_INPUT_PREP(port, pin, func)\r
+#define MCU_IO_OUTPUT(port, pin, val)  MCU_IO_OUTPUT_PREP(port, pin, val)\r
+#define MCU_IO_SET(port, pin, val)     MCU_IO_SET_PREP(port, pin, val)\r
+#define MCU_IO_SET_HIGH(port, pin)     MCU_IO_SET_HIGH_PREP(port, pin)\r
+#define MCU_IO_SET_LOW(port, pin)      MCU_IO_SET_LOW_PREP(port, pin)\r
+#define MCU_IO_TGL(port, pin)          MCU_IO_TGL_PREP(port, pin)\r
+#define MCU_IO_GET(port, pin)          MCU_IO_GET_PREP(port, pin)\r
+\r
+#define MCU_IO_DIR_INPUT(port, pin)    MCU_IO_DIR_INPUT_PREP(port, pin)\r
+#define MCU_IO_DIR_OUTPUT(port, pin)   MCU_IO_DIR_OUTPUT_PREP(port, pin)\r
+\r
+\r
+//----------------------------------------------------------------------------------\r
+//  Macros for internal use (the macros above need a new round in the preprocessor)\r
+//----------------------------------------------------------------------------------\r
+#define MCU_IO_PERIPHERAL_PREP(port, pin)   st( P##port##SEL |= BM(pin); )\r
+\r
+#define MCU_IO_INPUT_PREP(port, pin, func)  st( P##port##SEL &= ~BM(pin); \\r
+                                                P##port##DIR &= ~BM(pin); \\r
+                                                switch (func) { \\r
+                                                case MCU_IO_PULLUP: \\r
+                                                    P##port##INP &= ~BM(pin); \\r
+                                                    P2INP &= ~BM(port + 5); \\r
+                                                    break; \\r
+                                                case MCU_IO_PULLDOWN: \\r
+                                                    P##port##INP &= ~BM(pin); \\r
+                                                    P2INP |= BM(port + 5); \\r
+                                                    break; \\r
+                                                default: \\r
+                                                    P##port##INP |= BM(pin); \\r
+                                                    break; } )\r
+\r
+#define MCU_IO_OUTPUT_PREP(port, pin, val)  st( P##port##SEL &= ~BM(pin); \\r
+                                                P##port##_##pin## = val; \\r
+                                                P##port##DIR |= BM(pin); )\r
+\r
+#define MCU_IO_SET_HIGH_PREP(port, pin)     st( P##port##_##pin## = 1; )\r
+#define MCU_IO_SET_LOW_PREP(port, pin)      st( P##port##_##pin## = 0; )\r
+\r
+#define MCU_IO_SET_PREP(port, pin, val)     st( P##port##_##pin## = val; )\r
+#define MCU_IO_TGL_PREP(port, pin)          st( P##port##_##pin## ^= 1; )\r
+#define MCU_IO_GET_PREP(port, pin)          (P##port## & BM(pin))\r
+\r
+#define MCU_IO_DIR_INPUT_PREP(port, pin)    st( P##port##DIR &= ~BM(pin); )\r
+#define MCU_IO_DIR_OUTPUT_PREP(port, pin)   st( P##port##DIR |= BM(pin); )\r
+\r
+\r
+/****************************************************************************************\r
+  Copyright 2007 Texas Instruments Incorporated. All rights reserved.\r
+\r
+  IMPORTANT: Your use of this Software is limited to those specific rights\r
+  granted under the terms of a software license agreement between the user\r
+  who downloaded the software, his/her employer (which must be your employer)\r
+  and Texas Instruments Incorporated (the "License").  You may not use this\r
+  Software unless you agree to abide by the terms of the License. The License\r
+  limits your use, and you acknowledge, that the Software may not be modified,\r
+  copied or distributed unless embedded on a Texas Instruments microcontroller\r
+  or used solely and exclusively in conjunction with a Texas Instruments radio\r
+  frequency transceiver, which is integrated into your product.  Other than for\r
+  the foregoing purpose, you may not use, reproduce, copy, prepare derivative\r
+  works of, modify, distribute, perform, display or sell this Software and/or\r
+  its documentation for any purpose.\r
+\r
+  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE\r
+  PROVIDED \93AS IS\94 WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED,\r
+  INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE,\r
+  NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL\r
+  TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER\r
+  LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES\r
+  INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE\r
+  OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT\r
+  OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES\r
+  (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+\r
+  Should you have any questions regarding your right to use this Software,\r
+  contact Texas Instruments Incorporated at www.TI.com.\r
+***********************************************************************************/\r
+#endif\r
diff --git a/chronos-ti/Software Projects/RF Access Point/IAR/HAL/source/clock.c b/chronos-ti/Software Projects/RF Access Point/IAR/HAL/source/clock.c
new file mode 100755 (executable)
index 0000000..1b98f81
--- /dev/null
@@ -0,0 +1,62 @@
+/******************************************************************************\r
+    Filename: clock.c\r
+\r
+    This file defines clock related functions for the CC1110/CC2510 family\r
+    of RF system-on-chips from Texas Instruments.\r
+\r
+******************************************************************************/\r
+\r
+/******************************************************************************\r
+ * INCLUDES\r
+ */\r
+\r
+#include "clock.h"\r
+\r
+\r
+\r
+/*******************************************************************************\r
+ * PUBLIC FUNCTIONS\r
+ */\r
+\r
+\r
+/******************************************************************************\r
+* @fn  clockSetMainSrc\r
+*\r
+* @brief  Function for setting the main system clock source.\r
+*         The function turns off the clock source that is not being used.\r
+*         TICKSPD is set to the same frequency as the source.\r
+*\r
+* @param  uint8 source (one of CLOCK_SRC_HFRC or CLOCK_SRC_XOSC)\r
+*\r
+* @return void\r
+*\r
+******************************************************************************/\r
+void clockSetMainSrc(uint8 source)\r
+{\r
+    register uint8 osc32k_bm = CLKCON & CLKCON_OSC32K_BM;\r
+\r
+    // Source can have the following values:\r
+    // CLOCK_SRC_XOSC   0x00  /*  High speed Crystal Oscillator (XOSC) */\r
+    // CLOCK_SRC_HFRC   0x01  /*  Low power RC Oscillator (HFRC) */\r
+\r
+    if (source == CLOCK_SRC_HFRC)\r
+    {\r
+        SLEEP &= ~SLEEP_OSC_PD_BM;       // power up both oscillators\r
+        while (!IS_HFRC_STABLE());// wait until the oscillator is stable\r
+\r
+        CLKCON = (osc32k_bm | CLKCON_OSC_BM | TICKSPD_DIV_2 | CLKSPD_DIV_2);\r
+        while (CLKCON != (osc32k_bm | CLKCON_OSC_BM | TICKSPD_DIV_2 | CLKSPD_DIV_2));\r
+\r
+        SLEEP |= SLEEP_OSC_PD_BM;        // power down the unused oscillator\r
+    }\r
+    else if (source == CLOCK_SRC_XOSC)\r
+    {\r
+        SLEEP &= ~SLEEP_OSC_PD_BM;       // power up both oscillators\r
+        while (!IS_XOSC_STABLE());// wait until the XOSC is stable\r
+\r
+        CLKCON = (osc32k_bm | TICKSPD_DIV_1 | CLKSPD_DIV_1);\r
+        while (CLKCON != (osc32k_bm | TICKSPD_DIV_1 | CLKSPD_DIV_1));\r
+\r
+        SLEEP |= SLEEP_OSC_PD_BM;        // power down the unused oscillator\r
+    }\r
+}\r
diff --git a/chronos-ti/Software Projects/RF Access Point/IAR/HAL/source/clock.h b/chronos-ti/Software Projects/RF Access Point/IAR/HAL/source/clock.h
new file mode 100755 (executable)
index 0000000..85606de
--- /dev/null
@@ -0,0 +1,113 @@
+/******************************************************************************\r
+    Filename: clock.h\r
+\r
+    This file defines interface for clock related functions for the\r
+    CC1110/CC2510 family of RF system-on-chips from Texas Instruments.\r
+\r
+    Copyright 2007 Texas Instruments, Inc.\r
+******************************************************************************/\r
+#ifndef _CLOCK_H\r
+#define _CLOCK_H\r
+\r
+\r
+/*******************************************************************************\r
+ * INCLUDES\r
+ */\r
+\r
+#include "hal_types.h"\r
+\r
+// Include chip specific IO definition file\r
+#if (chip == 2510)\r
+#include "ioCC2510.h"\r
+#endif\r
+#if (chip == 1110)\r
+#include "ioCC1110.h"\r
+#endif\r
+#if (chip == 2511)\r
+#include "ioCC2511.h"\r
+#endif\r
+#if (chip == 1111)\r
+#include "ioCC1111.h"\r
+#endif\r
+\r
+\r
+\r
+/*******************************************************************************\r
+ * CONSTANTS\r
+ */\r
+\r
+/* SEE DATA SHEET FOR DETAILS ABOUT THE FOLLOWING BIT MASKS */\r
+\r
+/* Pre defined values for main clock source, used in cc2510ClockSetMainSrc() */\r
+#define CLOCK_SRC_XOSC      0x00  /*  High speed Crystal Oscillator Control */\r
+#define CLOCK_SRC_HFRC      0x01  /*  Low power RC Oscillator */\r
+\r
+// Bit masks to check CLKCON register\r
+#define CLKCON_OSC32K_BM    0x80  // bit mask, for the slow 32k clock oscillator\r
+#define CLKCON_OSC_BM       0x40  // bit mask, for the system clock oscillator\r
+#define CLKCON_TICKSPD_BM   0x38  // bit mask, for timer ticks output setting\r
+#define CLKCON_CLKSPD_BM    0x07  // bit maks, for the clock speed\r
+\r
+#define TICKSPD_DIV_1       (0x00 << 3)\r
+#define TICKSPD_DIV_2       (0x01 << 3)\r
+#define TICKSPD_DIV_4       (0x02 << 3)\r
+#define TICKSPD_DIV_8       (0x03 << 3)\r
+#define TICKSPD_DIV_16      (0x04 << 3)\r
+#define TICKSPD_DIV_32      (0x05 << 3)\r
+#define TICKSPD_DIV_64      (0x06 << 3)\r
+#define TICKSPD_DIV_128     (0x07 << 3)\r
+\r
+#define CLKSPD_DIV_1        (0x00)\r
+#define CLKSPD_DIV_2        (0x01)\r
+#define CLKSPD_DIV_4        (0x02)\r
+#define CLKSPD_DIV_8        (0x03)\r
+#define CLKSPD_DIV_16       (0x04)\r
+#define CLKSPD_DIV_32       (0x05)\r
+#define CLKSPD_DIV_64       (0x06)\r
+#define CLKSPD_DIV_128      (0x07)\r
+\r
+// Bit masks to check SLEEP register\r
+#define SLEEP_XOSC_STB_BM   0x40  // bit mask, check the stability of XOSC\r
+#define SLEEP_HFRC_STB_BM   0x20  // bit maks, check the stability of the High-frequency RC oscillator\r
+#define SLEEP_OSC_PD_BM     0x04  // bit mask, power down system clock oscillator(s)\r
+\r
+/*******************************************************************************\r
+ * TYPEDEFS\r
+ */\r
+\r
+/*******************************************************************************\r
+ * MACROS\r
+ */\r
+\r
+// Macro for checking status of the high frequency RC oscillator.\r
+#define IS_HFRC_STABLE()    (SLEEP & SLEEP_HFRC_STB_BM)\r
+\r
+// Macro for checking status of the crystal oscillator\r
+#define IS_XOSC_STABLE()    (SLEEP & SLEEP_XOSC_STB_BM)\r
+\r
+// Macro for getting the clock division factor\r
+#define CLKSPD_GET()        (CLKCON & CLKCON_CLKSPD_BM)\r
+\r
+// Macro for getting the timer tick division factor.\r
+#define TICKSPD_GET()       ((CLKCON & CLKCON_TICKSPD_BM) >> 3)\r
+\r
+// Macro for setting the timer division factor, x value from 0b000 to 0b111\r
+#define TICKSPD_SET(x)      do { CLKCON = ((((x) << 3) & 0x38)  \\r
+                                            | (CLKCON & 0xC7)); \\r
+                            } while (0)\r
+\r
+// Macro for setting the clock tick division factor, x value from 0b000 to 0b111\r
+#define CLKSPD_SET(x)       do { CLKCON = (((x) & 0x07)         \\r
+                                            | (CLKCON & 0xF8)); \\r
+                            } while (0)\r
+\r
+\r
+/*******************************************************************************\r
+ * FUNCTIONS\r
+ */\r
+\r
+void clockSetMainSrc(uint8 source);\r
+\r
+\r
+/*****************************************************************************/\r
+#endif\r
diff --git a/chronos-ti/Software Projects/RF Access Point/IAR/HAL/source/hal_assert.c b/chronos-ti/Software Projects/RF Access Point/IAR/HAL/source/hal_assert.c
new file mode 100755 (executable)
index 0000000..274b031
--- /dev/null
@@ -0,0 +1,74 @@
+\r
+/***********************************************************************************\r
+  Filename:     hal_assert.c\r
+    \r
+  Description:  Assert functionality\r
+    \r
+***********************************************************************************/\r
+\r
+/***********************************************************************************\r
+* INCLUDES\r
+*/\r
+#include "hal_assert.h"\r
+#include "hal_led.h"\r
+#include "hal_mcu.h"\r
+#include "hal_defs.h"\r
+\r
+\r
+/***********************************************************************************\r
+* GLOBAL FUNCTIONS\r
+*/\r
+\r
+/***********************************************************************************\r
+* @fn          halAssertHandler\r
+*\r
+* @brief       Logic to handle an assert.\r
+*\r
+* @param       none\r
+*\r
+* @return      none\r
+***********************************************************************************\r
+*/\r
+void halAssertHandler(void)\r
+{\r
+    // execute code that handles asserts \r
+    // blink all leds\r
+    while(TRUE){\r
+        halLedToggle(1);\r
+        halMcuWaitMs(50);\r
+    }\r
+}\r
+\r
+\r
+/***********************************************************************************\r
+  Copyright 2007 Texas Instruments Incorporated. All rights reserved.\r
+\r
+  IMPORTANT: Your use of this Software is limited to those specific rights\r
+  granted under the terms of a software license agreement between the user\r
+  who downloaded the software, his/her employer (which must be your employer)\r
+  and Texas Instruments Incorporated (the "License").  You may not use this\r
+  Software unless you agree to abide by the terms of the License. The License\r
+  limits your use, and you acknowledge, that the Software may not be modified,\r
+  copied or distributed unless embedded on a Texas Instruments microcontroller\r
+  or used solely and exclusively in conjunction with a Texas Instruments radio\r
+  frequency transceiver, which is integrated into your product.  Other than for\r
+  the foregoing purpose, you may not use, reproduce, copy, prepare derivative\r
+  works of, modify, distribute, perform, display or sell this Software and/or\r
+  its documentation for any purpose.\r
+\r
+  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE\r
+  PROVIDED \93AS IS\94 WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, \r
+  INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, \r
+  NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL\r
+  TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER\r
+  LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES\r
+  INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE\r
+  OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT\r
+  OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES\r
+  (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+\r
+  Should you have any questions regarding your right to use this Software,\r
+  contact Texas Instruments Incorporated at www.TI.com. \r
+***********************************************************************************/\r
+\r
diff --git a/chronos-ti/Software Projects/RF Access Point/IAR/HAL/source/hal_board.c b/chronos-ti/Software Projects/RF Access Point/IAR/HAL/source/hal_board.c
new file mode 100755 (executable)
index 0000000..4a7383a
--- /dev/null
@@ -0,0 +1,51 @@
+/***********************************************************************************\r
+    Filename: hal_board.c\r
+\r
+    Copyright 2007 Texas Instruments, Inc.\r
+***********************************************************************************/\r
+\r
+\r
+/******************************************************************************\r
+ * INCLUDES\r
+ */\r
+\r
+#include "hal_types.h"\r
+#include "hal_mcu.h"\r
+#include "hal_board.h"\r
+\r
+\r
+\r
+/*******************************************************************************\r
+ * GLOBAL FUNCTIONS\r
+ */\r
+\r
+\r
+/******************************************************************************\r
+ * @fn          halBoardInit\r
+ *\r
+ * @brief       Sets up board. Initialize MCU with HS XOSC, configure I/O pins\r
+ *              and user interface.\r
+ *\r
+ * @param       none\r
+ *\r
+ * @return      none\r
+ *****************************************************************************/\r
+void halBoardInit(void)\r
+{\r
+\r
+    // Enable HS XOSC and set maximum clock speed\r
+    halMcuInit();\r
+\r
+    // LED\r
+    MCU_IO_OUTPUT(HAL_BOARD_IO_LED_PORT, HAL_BOARD_IO_LED_PIN, 0);  // Turn off\r
+\r
+}\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
diff --git a/chronos-ti/Software Projects/RF Access Point/IAR/HAL/source/hal_board.h b/chronos-ti/Software Projects/RF Access Point/IAR/HAL/source/hal_board.h
new file mode 100755 (executable)
index 0000000..a0eecb6
--- /dev/null
@@ -0,0 +1,133 @@
+/******************************************************************************\r
+    Filename: hal_board.h\r
+\r
+    Description: HAL board peripherals header file for the\r
+                 CCxx11 USB MCU on the USB dongle.\r
+\r
+    Copyright 2007 Texas Instruments, Inc.\r
+******************************************************************************/\r
+#ifndef HAL_BOARD_H\r
+#define HAL_BOARD_H\r
+\r
+\r
+/******************************************************************************\r
+ * INCLUDES\r
+ */\r
+\r
+#include "hal_types.h"\r
+#include "hal_defs.h"\r
+\r
+#if chip==2511\r
+#include <ioCC2511.h>\r
+#elif chip==1111\r
+#include <ioCC1111.h>\r
+#else\r
+#error "chip not defined!"\r
+#endif\r
+#include <cc8051\hal_cc8051.h>\r
+\r
+#ifdef USB_UART\r
+#include "usb_uart.h"\r
+#endif\r
+\r
+/******************************************************************************\r
+ * CONSTANTS\r
+ */\r
+\r
+// Board properties\r
+#define BOARD_NAME                     "RFUSBXX11"\r
+#define NUM_LEDS                        1\r
+#define NUM_BUTTONS                     1\r
+#define NUM_JSTKS                       0\r
+#define NUM_POTS                        0\r
+\r
+\r
+//-----------------------------------------------------------------------------\r
+//  Define ports and pins used by CCxx11 on USB dongle\r
+//-----------------------------------------------------------------------------\r
+// USB\r
+#define HAL_BOARD_IO_USB_ENABLE_PORT   1\r
+#define HAL_BOARD_IO_USB_ENABLE_PIN    0\r
+\r
+// LED\r
+#define HAL_BOARD_IO_LED_PORT          1\r
+#define HAL_BOARD_IO_LED_PIN           1\r
+\r
+// Button\r
+#define HAL_BOARD_IO_BTN_PORT          1\r
+#define HAL_BOARD_IO_BTN_PIN           2\r
+\r
+\r
+/******************************************************************************\r
+ * MACROS\r
+ */\r
+\r
+//-----------------------------------------------------------------------------\r
+//  Some simple macros\r
+//-----------------------------------------------------------------------------\r
+\r
+#ifdef CC1111EM\r
+  #define HAL_LED_SET()              MCU_IO_SET_HIGH(HAL_BOARD_IO_LED_PORT, HAL_BOARD_IO_LED_PIN)\r
+  #define HAL_LED_CLR()              MCU_IO_SET_LOW(HAL_BOARD_IO_LED_PORT, HAL_BOARD_IO_LED_PIN)\r
+  #define HAL_LED_TGL()              MCU_IO_TGL(HAL_BOARD_IO_LED_PORT, HAL_BOARD_IO_LED_PIN)\r
+#else\r
+  #define HAL_LED_SET()              MCU_IO_SET_HIGH(HAL_BOARD_IO_USB_ENABLE_PORT, HAL_BOARD_IO_USB_ENABLE_PIN)\r
+  #define HAL_LED_CLR()              MCU_IO_SET_LOW(HAL_BOARD_IO_USB_ENABLE_PORT, HAL_BOARD_IO_USB_ENABLE_PIN)\r
+  #define HAL_LED_TGL()              MCU_IO_TGL(HAL_BOARD_IO_USB_ENABLE_PORT, HAL_BOARD_IO_USB_ENABLE_PIN)\r
+#endif\r
+\r
+// Push button\r
+#define HAL_BUTTON_ACTIVATE()      MCU_IO_INPUT(HAL_BOARD_IO_BTN_PORT, HAL_BOARD_IO_BTN_PIN, MCU_IO_PULLUP)\r
+#define HAL_BUTTON_PUSHED()        (!MCU_IO_GET(HAL_BOARD_IO_BTN_PORT, HAL_BOARD_IO_BTN_PIN))\r
+\r
+#define HAL_DEBOUNCE(expr)         { int i; for (i=0; i<500; i++) { if (!(expr)) i = 0; } }\r
+\r
+\r
+// USB\r
+#define HAL_USB_ENABLE()           ( SLEEP |= SLEEP_USB_EN )\r
+\r
+#ifdef CC1111EM\r
+  #define HAL_USB_PULLUP_ENABLE()    MCU_IO_OUTPUT(HAL_BOARD_IO_USB_ENABLE_PORT, HAL_BOARD_IO_USB_ENABLE_PIN, 1)\r
+  #define HAL_USB_PULLUP_DISABLE()   MCU_IO_SET_LOW(HAL_BOARD_IO_USB_ENABLE_PORT, HAL_BOARD_IO_USB_ENABLE_PIN)\r
+#else\r
+  #define HAL_USB_PULLUP_ENABLE()    MCU_IO_OUTPUT(HAL_BOARD_IO_LED_PORT, HAL_BOARD_IO_LED_PIN, 1)\r
+  #define HAL_USB_PULLUP_DISABLE()   MCU_IO_SET_LOW(HAL_BOARD_IO_LED_PORT, HAL_BOARD_IO_LED_PIN)\r
+#endif\r
+\r
+\r
+#define HAL_USB_INT_ENABLE()       st( IEN2|= 0x02; )\r
+#define HAL_USB_INT_DISABLE()      st( IEN2&= ~0x02; )\r
+#define HAL_USB_INT_CLEAR()        st( P2IFG= 0; P2IF= 0; )\r
+\r
+#define HAL_USB_RESUME_INT_ENABLE() st( P0IE= 1;)\r
+#define HAL_USB_RESUME_INT_DISABLE() st( P0IE= 0;)\r
+#define HAL_USB_RESUME_INT_CLEAR()  st(P0IFG= 0; P0IF= 0; )\r
+\r
+\r
+#define LCD_NOT_SUPPORTED\r
+\r
+#ifdef __cplusplus\r
+extern "C" {\r
+#endif\r
+\r
+#ifdef USB_UART\r
+#define HAL_PROCESS()              usbUartProcess()\r
+#else\r
+#define HAL_PROCESS()\r
+#endif\r
+\r
+\r
+/******************************************************************************\r
+ * FUNCTIONS\r
+ */\r
+\r
+void halBoardInit(void);\r
+void halButtonInit(void);\r
+\r
+\r
+#ifdef __cplusplus\r
+}\r
+#endif\r
+\r
+/*****************************************************************************/\r
+#endif\r
diff --git a/chronos-ti/Software Projects/RF Access Point/IAR/HAL/source/hal_button.c b/chronos-ti/Software Projects/RF Access Point/IAR/HAL/source/hal_button.c
new file mode 100755 (executable)
index 0000000..ab50eb4
--- /dev/null
@@ -0,0 +1,59 @@
+/***********************************************************************************\r
+\r
+    Filename:     hal_button.c\r
+\r
+    Description:  HAL button implementation for CCxx11 dongle.\r
+\r
+    Copyright 2009 Texas Instruments, Inc.\r
+\r
+***********************************************************************************/\r
+#include "hal_types.h"\r
+#include "hal_board.h"\r
+#include "hal_button.h"\r
+\r
+\r
+/******************************************************************************\r
+ * @fn          halButtonInit\r
+ *\r
+ * @brief       Button is configured as input\r
+ *\r
+ * @param       none\r
+ *\r
+ * @return      none\r
+ *****************************************************************************/\r
+void halButtonInit(void)\r
+{\r
+    MCU_IO_INPUT(HAL_BOARD_IO_BTN_PORT, HAL_BOARD_IO_BTN_PIN, MCU_IO_PULLUP);\r
+}\r
+\r
+\r
+/******************************************************************************\r
+* @fn  halButtonPushed\r
+*\r
+* @brief\r
+*      This function detects if 'S1' is being pushed. The function\r
+*      implements software debounce. Return true only if previuosly called\r
+*      with button not pushed. Return true only once each time the button\r
+*      is pressed.\r
+*\r
+* Parameters:\r
+*\r
+* @param  void\r
+*\r
+* @return uint8\r
+*          HAL_BUTTON_1:    button is being pushed\r
+*          HAL_BUTTON_NONE: button is not being pushed\r
+*\r
+******************************************************************************/\r
+uint8 halButtonPushed(void)\r
+{\r
+    uint8 v;\r
+\r
+    v= HAL_BUTTON_NONE;\r
+    if (HAL_BUTTON_PUSHED()) {\r
+        HAL_DEBOUNCE(!HAL_BUTTON_PUSHED());\r
+        v= HAL_BUTTON_1;\r
+    }\r
+\r
+    return v;\r
+}\r
diff --git a/chronos-ti/Software Projects/RF Access Point/IAR/HAL/source/hal_int.c b/chronos-ti/Software Projects/RF Access Point/IAR/HAL/source/hal_int.c
new file mode 100755 (executable)
index 0000000..a997384
--- /dev/null
@@ -0,0 +1,115 @@
+/***********************************************************************************\r
+  Filename:     hal_int.c\r
+\r
+  Description:  HAL interrupt control\r
+\r
+***********************************************************************************/\r
+\r
+/***********************************************************************************\r
+* INCLUDES\r
+*/\r
+#include "hal_types.h"\r
+#include "hal_defs.h"\r
+#include "hal_int.h"\r
+#include "hal_board.h"\r
+\r
+/***********************************************************************************\r
+* GLOBAL FUNCTIONS\r
+*/\r
+\r
+/***********************************************************************************\r
+* @fn      halIntOn\r
+*\r
+* @brief   Enable global interrupts.\r
+*\r
+* @param   none\r
+*\r
+* @return  none\r
+*/\r
+void halIntOn(void)\r
+{\r
+    HAL_INT_ON();\r
+}\r
+\r
+\r
+/***********************************************************************************\r
+* @fn      halIntOff\r
+*\r
+* @brief   Turns global interrupts off.\r
+*\r
+* @param   none\r
+*\r
+* @return  none\r
+*/\r
+void halIntOff(void)\r
+{\r
+    HAL_INT_OFF();\r
+}\r
+\r
+\r
+/***********************************************************************************\r
+* @fn      halIntLock\r
+*\r
+* @brief   Turns global interrupts off and returns current interrupt state.\r
+*          Should always be used together with halIntUnlock().\r
+*\r
+* @param   none\r
+*\r
+* @return  uint16 - current interrupt state\r
+*/\r
+uint16 halIntLock(void)\r
+{\r
+    istate_t key;\r
+    HAL_INT_LOCK(key);\r
+    return(key);\r
+}\r
+\r
+\r
+/***********************************************************************************\r
+* @fn      halIntUnlock\r
+*\r
+* @brief   Set interrupt state back to the state it had before calling halIntLock().\r
+*          Should always be used together with halIntLock().\r
+*\r
+* @param   key\r
+*\r
+* @return  none\r
+*/\r
+void halIntUnlock(uint16 key)\r
+{\r
+    HAL_INT_UNLOCK(key);\r
+}\r
+\r
+\r
+/***********************************************************************************\r
+  Copyright 2007 Texas Instruments Incorporated. All rights reserved.\r
+\r
+  IMPORTANT: Your use of this Software is limited to those specific rights\r
+  granted under the terms of a software license agreement between the user\r
+  who downloaded the software, his/her employer (which must be your employer)\r
+  and Texas Instruments Incorporated (the "License").  You may not use this\r
+  Software unless you agree to abide by the terms of the License. The License\r
+  limits your use, and you acknowledge, that the Software may not be modified,\r
+  copied or distributed unless embedded on a Texas Instruments microcontroller\r
+  or used solely and exclusively in conjunction with a Texas Instruments radio\r
+  frequency transceiver, which is integrated into your product.  Other than for\r
+  the foregoing purpose, you may not use, reproduce, copy, prepare derivative\r
+  works of, modify, distribute, perform, display or sell this Software and/or\r
+  its documentation for any purpose.\r
+\r
+  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE\r
+  PROVIDED \93AS IS\94 WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED,\r
+  INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE,\r
+  NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL\r
+  TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER\r
+  LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES\r
+  INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE\r
+  OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT\r
+  OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES\r
+  (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+\r
+  Should you have any questions regarding your right to use this Software,\r
+  contact Texas Instruments Incorporated at www.TI.com.\r
+***********************************************************************************/\r
+\r
diff --git a/chronos-ti/Software Projects/RF Access Point/IAR/HAL/source/hal_led.c b/chronos-ti/Software Projects/RF Access Point/IAR/HAL/source/hal_led.c
new file mode 100755 (executable)
index 0000000..4aaaf6c
--- /dev/null
@@ -0,0 +1,46 @@
+/***********************************************************************************\r
+    Filename: hal_led.c\r
+\r
+    Copyright 2007 Texas Instruments, Inc.\r
+***********************************************************************************/\r
+\r
+#include "hal_types.h"\r
+#include "hal_led.h"\r
+#include "hal_board.h"\r
+\r
+\r
+\r
+//----------------------------------------------------------------------------------\r
+//  void halLedSet(uint8 id)\r
+//\r
+//  DESCRIPTION:\r
+//    Turn LED on.\r
+//----------------------------------------------------------------------------------\r
+void halLedSet(uint8 id)\r
+{\r
+    HAL_LED_SET();\r
+}\r
+\r
+//----------------------------------------------------------------------------------\r
+//  void halLedClear(uint8 id)\r
+//\r
+//  DESCRIPTION:\r
+//    Turn LED off.\r
+//----------------------------------------------------------------------------------\r
+void halLedClear(uint8 id)\r
+{\r
+    HAL_LED_CLR();\r
+}\r
+\r
+//----------------------------------------------------------------------------------\r
+//  void halLedToggle(uint8 id)\r
+//\r
+//  DESCRIPTION:\r
+//    Change state of LED. If on, turn it off. Else turn on.\r
+//----------------------------------------------------------------------------------\r
+void halLedToggle(uint8 id)\r
+{\r
+    HAL_LED_TGL();\r
+}\r
+\r
+\r
diff --git a/chronos-ti/Software Projects/RF Access Point/IAR/HAL/source/hal_mcu.c b/chronos-ti/Software Projects/RF Access Point/IAR/HAL/source/hal_mcu.c
new file mode 100755 (executable)
index 0000000..9cbbdda
--- /dev/null
@@ -0,0 +1,160 @@
+/***********************************************************************************\r
+  Filename:     hal_mcu.c\r
+\r
+  Description:  hal mcu library\r
+\r
+***********************************************************************************/\r
+\r
+\r
+#include "hal_types.h"\r
+#include "hal_mcu.h"\r
+\r
+#include "clock.h"\r
+\r
+/***********************************************************************************\r
+* @fn          halMcuInit\r
+*\r
+* @brief       Set system clock\r
+*\r
+* @param       none\r
+*\r
+* @return      none\r
+*/\r
+void halMcuInit(void)\r
+{\r
+    clockSetMainSrc(CLOCK_SRC_XOSC);\r
+}\r
+\r
+\r
+/***********************************************************************************\r
+* @fn          halMcuWaitUs\r
+*\r
+* @brief       Busy wait function. Waits the specified number of microseconds. Use\r
+*              assumptions about number of clock cycles needed for the various\r
+*              instructions.\r
+*\r
+*              NB! This function is highly dependent on architecture and compiler!\r
+*\r
+* @param       uint16 usec - number of microseconds delay\r
+*\r
+* @return      none\r
+*/\r
+#pragma optimize=none\r
+void halMcuWaitUs(uint16 usec)\r
+{\r
+    usec>>= 1;          // Divide by 2 to achieve better resolution\r
+\r
+    while(usec > 1)     // compare: ~13 cycles\r
+    {\r
+        asm("NOP");     // 1 cycle/NOP\r
+        asm("NOP");\r
+        asm("NOP");\r
+        asm("NOP");\r
+        asm("NOP");\r
+        asm("NOP");\r
+        asm("NOP");\r
+        asm("NOP");\r
+        asm("NOP");\r
+        asm("NOP");\r
+\r
+        usec--;        // decr: ~7 cycles\r
+    }\r
+}\r
+\r
+/***********************************************************************************\r
+* @fn          halMcuWaitMs\r
+*\r
+* @brief       Busy wait function. Waits the specified number of milliseconds. Use\r
+*              assumptions about number of clock cycles needed for the various\r
+*              instructions.\r
+*\r
+*              NB! This function is highly dependent on architecture and compiler!\r
+*\r
+* @param       uint16 millisec - number of milliseconds delay\r
+*\r
+* @return      none\r
+*/\r
+#pragma optimize=none\r
+void halMcuWaitMs(uint16 msec)\r
+{\r
+    while(msec--)\r
+        halMcuWaitUs(1000);\r
+}\r
+\r
+/***********************************************************************************\r
+* @fn          halMcuSetLowPowerMode\r
+*\r
+* @brief      Sets the MCU in a low power mode. Will turn global interrupts on at\r
+*             the same time as entering the LPM mode. The MCU must be waken from\r
+*             an interrupt (status register on stack must be modified).\r
+*\r
+*              NB! This function is highly dependent on architecture and compiler!\r
+*\r
+* @param       uint8 mode - power mode\r
+*\r
+* @return      none\r
+*/\r
+void halMcuSetLowPowerMode(uint8 mode)\r
+{\r
+  // comment: not yet implemented\r
+  //HAL_ASSERT(FALSE);\r
+}\r
+\r
+\r
+/******************************************************************************\r
+* @fn  halMcuReset\r
+*\r
+* @brief\r
+* Resets the MCU. This utilize the watchdog timer as there is no other way\r
+* for a software reset. The reset will not occur until ~2 ms.\r
+* NB: The function will not return! (hangs until reset)\r
+*\r
+* Parameters:\r
+*\r
+* @param  void\r
+*\r
+* @return void\r
+*\r
+******************************************************************************/\r
+void halMcuReset(void)\r
+{\r
+    const uint8 WDT_INTERVAL_MSEC_2=   0x03;   // after ~2 ms\r
+\r
+    WDCTL = ((WDCTL & 0xFC) | (WDT_INTERVAL_MSEC_2 & 0x03));\r
+    // Start watchdog\r
+    WDCTL &= ~0x04;     // Select watchdog mode\r
+    WDCTL |= 0x08;      // Enable timer\r
+    while(1);                                   // Halt here until reset\r
+}\r
+\r
+/***********************************************************************************\r
+  Copyright 2007 Texas Instruments Incorporated. All rights reserved.\r
+\r
+  IMPORTANT: Your use of this Software is limited to those specific rights\r
+  granted under the terms of a software license agreement between the user\r
+  who downloaded the software, his/her employer (which must be your employer)\r
+  and Texas Instruments Incorporated (the "License").  You may not use this\r
+  Software unless you agree to abide by the terms of the License. The License\r
+  limits your use, and you acknowledge, that the Software may not be modified,\r
+  copied or distributed unless embedded on a Texas Instruments microcontroller\r
+  or used solely and exclusively in conjunction with a Texas Instruments radio\r
+  frequency transceiver, which is integrated into your product.  Other than for\r
+  the foregoing purpose, you may not use, reproduce, copy, prepare derivative\r
+  works of, modify, distribute, perform, display or sell this Software and/or\r
+  its documentation for any purpose.\r
+\r
+  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE\r
+  PROVIDED \93AS IS\94 WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED,\r
+  INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE,\r
+  NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL\r
+  TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER\r
+  LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES\r
+  INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE\r
+  OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT\r
+  OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES\r
+  (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+\r
+  Should you have any questions regarding your right to use this Software,\r
+  contact Texas Instruments Incorporated at www.TI.com.\r
+***********************************************************************************/
\ No newline at end of file
diff --git a/chronos-ti/Software Projects/RF Access Point/IAR/HAL/source/rfConfig.c b/chronos-ti/Software Projects/RF Access Point/IAR/HAL/source/rfConfig.c
new file mode 100755 (executable)
index 0000000..143be44
--- /dev/null
@@ -0,0 +1,466 @@
+/*\r
++------------------------------------------------------------------------------\r
+|  Copyright 2004-2007 Texas Instruments Incorporated. All rights reserved.\r
+|\r
+|  IMPORTANT: Your use of this Software is limited to those specific rights\r
+|  granted under the terms of a software license agreement between the user who\r
+|  downloaded the software, his/her employer (which must be your employer) and\r
+|  Texas Instruments Incorporated (the "License"). You may not use this Software\r
+|  unless you agree to abide by the terms of the License. The License limits\r
+|  your use, and you acknowledge, that the Software may not be modified, copied\r
+|  or distributed unless embedded on a Texas Instruments microcontroller or used\r
+|  solely and exclusively in conjunction with a Texas Instruments radio\r
+|  frequency transceiver, which is integrated into your product. Other than for\r
+|  the foregoing purpose, you may not use, reproduce, copy, prepare derivative\r
+|  works of, modify, distribute, perform, display or sell this Software and/or\r
+|  its documentation for any purpose.\r
+|\r
+|  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE\r
+|  PROVIDED \93AS IS\94 WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED,\r
+|  INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE,\r
+|  NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL\r
+|  TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+|  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER\r
+|  LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING\r
+|  BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR\r
+|  CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT OF\r
+|  SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES\r
+|  (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+|\r
+|  Should you have any questions regarding your right to use this Software,\r
+|  contact Texas Instruments Incorporated at www.TI.com.\r
+|\r
++------------------------------------------------------------------------------\r
+Filename:     rfConfig.c\r
+Target:       cc2430, cc2431, cc1110, cc2510, cc2511\r
+Author:       EFU\r
+Revised:      26/10-2005\r
+Revision:     0.1\r
+******************************************************************************/\r
+\r
+#include "hal.h"\r
+\r
+//-----------------------------------------------------------------------------\r
+// See hal.h for a description of this function.\r
+//-----------------------------------------------------------------------------\r
+BOOL halRfConfig(UINT32 frequency)\r
+{\r
+   BOOL status;\r
+\r
+   //Turning on crystal oscillator\r
+   SET_MAIN_CLOCK_SOURCE(CRYSTAL);\r
+\r
+   // Setting the frequency\r
+   halRfSetRadioFrequency(frequency);\r
+\r
+#if (chip == 2430 || chip == 2431)\r
+   // Checking that the entered frequency is valid\r
+   if (frequency > 2047000)\r
+   {\r
+\r
+     // turning on power to analog part of radio and waiting for voltage regulator.\r
+     RFPWR = 0x04;\r
+     while( RFPWR & 0x10 );\r
+\r
+     // Turning off Address Decoding\r
+     MDMCTRL0H &= ~ADR_DECODE;\r
+\r
+     // Setting for AUTO CRC\r
+     MDMCTRL0L |= AUTO_CRC;\r
+\r
+     // Turning on AUTO_TX2RX\r
+     FSMTC1 = ((FSMTC1 & (~AUTO_TX2RX_OFF & ~RX2RX_TIME_OFF))  | ACCEPT_ACKPKT);\r
+\r
+     // Turning off abortRxOnSrxon.\r
+     FSMTC1 &= ~0x20;\r
+\r
+#endif\r
+#if (chip == 1110)\r
+   if (frequency < 1000000)\r
+   {\r
+     // 315 MHz band\r
+     if (frequency < 400000)\r
+     {\r
+       PA_TABLE0 = 0x63;\r
+     }\r
+     // 433 MHz band\r
+     else if (frequency < 800000)\r
+     {\r
+       PA_TABLE0 = 0x33;\r
+     }\r
+     // 868 MHz band\r
+     else if (frequency < 890000)\r
+     {\r
+       PA_TABLE0 = 0x66;\r
+     }\r
+     // 915 MHz band\r
+     else\r
+     {\r
+       PA_TABLE0 = 0x66;\r
+     }\r
+\r
+     /**********************************************************************\r
+     *                                                                     *\r
+     * 250 kbps MSK  setup (for other data rates or modulation formats,    *\r
+     * please see SmartRF Studio).                                         *\r
+     *                                                                     *\r
+     **********************************************************************/\r
+\r
+     // Dynamic packet length\r
+     PKTLEN = 0xFF;\r
+     PKTCTRL0 = 0x05;\r
+\r
+     // Append status\r
+     PKTCTRL1 = 0x84;\r
+\r
+     // IF frequency\r
+     FSCTRL1 = 0x0B;\r
+\r
+     //\r
+     //      FSCTRL0 = 0x00;\r
+\r
+     // filter BW, data rate,\r
+     //      MDMCFG4 = 0x0E;\r
+     MDMCFG4 = 0x2D;\r
+     MDMCFG3 = 0x3B;\r
+     // Modulation format, detection level\r
+     MDMCFG2 = 0x73;\r
+     MDMCFG1 = 0x42;\r
+     //      MDMCFG1 = 0x22;\r
+\r
+     // Deviation setting\r
+     DEVIATN = 0x00;\r
+\r
+     // Calibration synth\r
+     MCSM0 = 0x10;\r
+\r
+     // Frequency offset compensation configuration\r
+     FOCCFG = 0x1D;\r
+\r
+     // Bit synchronization\r
+     BSCFG = 0x1C;\r
+\r
+     // AGC and front end settings (from SmartRf04)\r
+     AGCCTRL2 = 0xC7;\r
+     //      AGCCTRL1 = 0x40;\r
+     AGCCTRL1 = 0x00;\r
+     AGCCTRL0 = 0xB2;\r
+     FREND1 = 0xB6;\r
+\r
+     FSCAL3 = 0xEA;\r
+\r
+     // Synth calibration\r
+     //      FSCAL0 = 0x19;\r
+     FSCAL0 = 0x11;\r
+     //      PA_TABLE0 = 0xC3;\r
+\r
+     // Calibrating synth.\r
+     SIDLE();\r
+     SCAL();\r
+     while(MARCSTATE != 0x01);\r
+\r
+     INT_SETFLAG(INUM_RFTXRX,INT_CLR);\r
+#endif\r
+\r
+#if (chip == 1111)  \r
+   if (frequency < 1000000)\r
+   {\r
+     // 315 MHz band\r
+     if (frequency < 400000)\r
+     {\r
+       PA_TABLE0 = 0x63;\r
+     }\r
+     // 433 MHz band\r
+     else if (frequency < 800000)\r
+     {\r
+       PA_TABLE0 = 0x33;\r
+     }\r
+     // 868 MHz band\r
+     else if (frequency < 890000)\r
+     {\r
+       PA_TABLE0 = 0x66;\r
+     }\r
+     // 915 MHz band\r
+     else\r
+     {\r
+       PA_TABLE0 = 0x66;\r
+     }\r
+\r
+     /**********************************************************************\r
+     *                                                                     *\r
+     * 250 kbps MSK  setup (for other data rates or modulation formats,    *\r
+     * please see SmartRF Studio).                                         *\r
+     *                                                                     *\r
+     **********************************************************************/\r
+         \r
+     // Dynamic packet length\r
+     PKTLEN = 0xFF;\r
+     PKTCTRL0 = 0x05;\r
+     // Append status\r
+     PKTCTRL1 = 0x04;\r
+\r
+     // IF frequency\r
+     FSCTRL1 = 0x0A;\r
+     FSCTRL0 = 0x00;\r
+\r
+     // filter BW, data rate,\r
+     MDMCFG4 = 0x1D;\r
+     MDMCFG3 = 0x55;\r
+     // Modulation format, detection level\r
+     MDMCFG2 = 0x73;\r
+     MDMCFG1 = 0x23;\r
+     MDMCFG0 = 0x11;\r
+\r
+     // Deviation setting\r
+     DEVIATN = 0x00;\r
+\r
+     // Calibration synth\r
+     MCSM2 = 0x07;\r
+     MCSM1 = 0x30;\r
+     MCSM0 = 0x10;\r
+\r
+     // Frequency offset compensation configuration\r
+     FOCCFG = 0x1D;\r
+\r
+     // Bit synchronization\r
+     BSCFG = 0x1C;\r
+\r
+     // AGC and front end settings (from SmartRf04)\r
+     AGCCTRL2 = 0xC7;\r
+     AGCCTRL1 = 0x00;\r
+     AGCCTRL0 = 0xB2;\r
+     FREND1 = 0xB6;\r
+\r
+     // Synth calibration\r
+     FSCAL3 = 0xEA;\r
+     FSCAL0 = 0x11;\r
+\r
+     // Are these needed ?\r
+     // From Smart RF Studio\r
+     FOCCFG = 0x1D;\r
+     BSCFG = 0x1C;\r
+     FSTEST = 0x59;\r
+     PTEST = 0x7F;\r
+     AGCTEST = 0x3F;\r
+     TEST2 = 0x88;\r
+     TEST1 = 0x31;\r
+     TEST0 = 0x0B;\r
+\r
+     // Calibrating synth.\r
+     SIDLE();\r
+     SCAL();\r
+     while(MARCSTATE != 0x01);\r
+\r
+     INT_SETFLAG(INUM_RFTXRX,INT_CLR);\r
+#endif\r
+\r
+#if(chip == 2510)\r
+   if (frequency > 2400000)\r
+   {\r
+     /**********************************************************************\r
+     *                                                                     *\r
+     * 250 kbps MSK  setup (for other data rates or modulation formats,    *\r
+     * please see SmartRF Studio).                                         *\r
+     *                                                                     *\r
+     **********************************************************************/\r
+\r
+     // Dynamic packet length and append status\r
+     PKTLEN = 0xFF;\r
+     PKTCTRL0 = 0x05;\r
+     PKTCTRL1 = 0x04;\r
+\r
+     // IF frequency\r
+     FSCTRL1 = 0x0A;\r
+     FSCTRL0 = 0x00;\r
+\r
+     // filter BW, data rate,\r
+     MDMCFG4 = 0x2D;\r
+     MDMCFG3 = 0x3B;\r
+\r
+     // Modulation format, detection level\r
+     MDMCFG2 = 0x73;\r
+     MDMCFG1 = 0x22;\r
+     MDMCFG0 = 0xF8;\r
+\r
+     // Deviation setting\r
+     DEVIATN = 0x00;\r
+\r
+     // Calibration synth\r
+     MCSM2 = 0x07;\r
+     MCSM1 = 0x30;\r
+     MCSM0 = 0x10;\r
+\r
+     // Frequency offset compensation configuration\r
+     FOCCFG = 0x1D;\r
+\r
+     // Bit synchronization\r
+     BSCFG = 0x1C;\r
+\r
+     // AGC settings\r
+     AGCCTRL2  = 0xC7;\r
+     AGCCTRL1  = 0x00;\r
+     AGCCTRL0  = 0xB2;\r
+\r
+     // Front end settings (from SmartRf04)\r
+     FREND1 = 0xB6;\r
+     FREND0 = 0x10;\r
+\r
+     // Synth calibration\r
+     FSCAL3 = 0xEA;\r
+     FSCAL2 = 0x0A;\r
+     FSCAL1 = 0x00;\r
+     FSCAL0 = 0x11;\r
+\r
+     // From Smart RF Studio\r
+     FOCCFG = 0x1D;\r
+     BSCFG = 0x1C;\r
+     FSTEST = 0x59;\r
+     PTEST = 0x7F;\r
+     AGCTEST = 0x3F;\r
+     TEST2 = 0x88;\r
+     TEST1 = 0x31;\r
+     TEST0 = 0x0B;\r
+\r
+\r
+     // Output power\r
+     PA_TABLE0 = 0xFF;\r
+\r
+     // Calibrating synth.\r
+     SIDLE();\r
+     SCAL();\r
+     while(MARCSTATE != 0x01);\r
+\r
+     INT_SETFLAG(INUM_RFTXRX,INT_CLR);\r
+\r
+#endif\r
+\r
+#if(chip == 2511)\r
+   if (frequency > 2400000)\r
+   {\r
+     /**********************************************************************\r
+     *                                                                     *\r
+     * 250 kbps MSK  setup (for other data rates or modulation formats,    *\r
+     * please see SmartRF Studio).                                         *\r
+     *                                                                     *\r
+     **********************************************************************/\r
+\r
+     // Dynamic packet length and append status\r
+     PKTLEN = 0xFF;\r
+     PKTCTRL0 = 0x05;\r
+     PKTCTRL1 = 0x04;\r
+\r
+     // IF frequency\r
+     FSCTRL1 = 0x0A;\r
+     FSCTRL0 = 0x00;\r
+\r
+     // filter BW, data rate,\r
+     MDMCFG4 = 0x1D;\r
+     MDMCFG3 = 0x55;\r
+\r
+     // Modulation format, detection level\r
+     MDMCFG2 = 0x73;\r
+     MDMCFG1 = 0x23;\r
+     MDMCFG0 = 0xF8;\r
+\r
+     // Deviation setting\r
+     DEVIATN = 0x00;\r
+\r
+     // Calibration synth\r
+     MCSM0 = 0x07;\r
+     MCSM1 = 0x30;\r
+     MCSM0 = 0x10;\r
+\r
+     // Frequency offset compensation configuration\r
+     FOCCFG = 0x1D;\r
+\r
+     // Bit synchronization\r
+     BSCFG = 0x1C;\r
+\r
+     // AGC settings\r
+     AGCCTRL2  = 0xC7;\r
+     AGCCTRL1  = 0x00;\r
+     AGCCTRL0  = 0xB2;\r
+\r
+     // Front end settings (from SmartRf04)\r
+     FREND1 = 0xB6;\r
+     FREND0 = 0x10;\r
+\r
+     // Synth calibration\r
+     FSCAL3 = 0xEA;\r
+     FSCAL2 = 0x0A;\r
+     FSCAL1 = 0x00;\r
+     FSCAL0 = 0x11;\r
+\r
+     // From Smart RF Studio\r
+     FOCCFG = 0x1D;\r
+     BSCFG = 0x1C;\r
+     FSTEST = 0x59;\r
+     PTEST = 0x7F;\r
+     AGCTEST = 0x3F;\r
+     TEST2 = 0x88;\r
+     TEST1 = 0x31;\r
+     TEST0 = 0x0B;\r
+\r
+\r
+     // Output power\r
+     PA_TABLE0 = 0xFF;\r
+\r
+     // Calibrating synth.\r
+     SIDLE();\r
+     SCAL();\r
+     while(MARCSTATE != 0x01);\r
+\r
+     INT_SETFLAG(INUM_RFTXRX,INT_CLR);\r
+\r
+#endif\r
+     status = TRUE;\r
+   }\r
+   else {\r
+      status = FALSE;\r
+   }\r
+\r
+   return status;\r
+}\r
+\r
+\r
+//-----------------------------------------------------------------------------\r
+// See hal.h for a description of this function.\r
+//-----------------------------------------------------------------------------\r
+void halRfSetRadioFrequency(UINT32 frequency)\r
+{\r
+#if (chip == 2430 || chip == 2431)\r
+   frequency /= (UINT32)1000;\r
+   frequency -= (UINT32)2048;\r
+\r
+   FSCTRLL = LOBYTE(frequency);\r
+   FSCTRLH &= ~0x03;\r
+   FSCTRLH |= (HIBYTE(frequency) & 0x03);\r
+#endif\r
+#if (chip == 0000)\r
+   // TODO: make sure casting is done correctly\r
+#endif\r
+#if (chip == 1110 || chip == 2510)\r
+   frequency = (frequency << 10);\r
+   frequency /= 1000;\r
+   frequency = (frequency << 6);\r
+   frequency /= 26;\r
+   FREQ0 = (BYTE) frequency;\r
+   frequency >>= 8;\r
+   FREQ1 = (BYTE) frequency;\r
+   frequency >>= 8;\r
+   FREQ2 = (BYTE) frequency;\r
+#endif\r
+#if (chip == 1111 || chip == 2511)\r
+   frequency = (frequency << 10);\r
+   frequency /= 1000;\r
+   frequency = (frequency << 6);\r
+   frequency /= 24;\r
+   FREQ0 = (BYTE) frequency;\r
+   frequency >>= 8;\r
+   FREQ1 = (BYTE) frequency;\r
+   frequency >>= 8;\r
+   FREQ2 = (BYTE) frequency;\r
+#endif\r
+   return;\r
+}\r
+\r
diff --git a/chronos-ti/Software Projects/RF Access Point/IAR/HAL/source/setTimer2Period.c b/chronos-ti/Software Projects/RF Access Point/IAR/HAL/source/setTimer2Period.c
new file mode 100755 (executable)
index 0000000..057ac0e
--- /dev/null
@@ -0,0 +1,156 @@
+/*\r
++------------------------------------------------------------------------------\r
+|  Copyright 2004-2007 Texas Instruments Incorporated. All rights reserved.\r
+|\r
+|  IMPORTANT: Your use of this Software is limited to those specific rights\r
+|  granted under the terms of a software license agreement between the user who\r
+|  downloaded the software, his/her employer (which must be your employer) and\r
+|  Texas Instruments Incorporated (the "License"). You may not use this Software\r
+|  unless you agree to abide by the terms of the License. The License limits\r
+|  your use, and you acknowledge, that the Software may not be modified, copied\r
+|  or distributed unless embedded on a Texas Instruments microcontroller or used\r
+|  solely and exclusively in conjunction with a Texas Instruments radio\r
+|  frequency transceiver, which is integrated into your product. Other than for\r
+|  the foregoing purpose, you may not use, reproduce, copy, prepare derivative\r
+|  works of, modify, distribute, perform, display or sell this Software and/or\r
+|  its documentation for any purpose.\r
+|\r
+|  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE\r
+|  PROVIDED \93AS IS\94 WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED,\r
+|  INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE,\r
+|  NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL\r
+|  TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+|  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER\r
+|  LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING\r
+|  BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR\r
+|  CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT OF\r
+|  SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES\r
+|  (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+|\r
+|  Should you have any questions regarding your right to use this Software,\r
+|  contact Texas Instruments Incorporated at www.TI.com.\r
+|\r
++------------------------------------------------------------------------------\r
+Filename:     setTimer2Period.c\r
+Target:       cc2430, cc2431, cc1110, cc2510, cc2511\r
+Author:       EFU\r
+Revised:      26/10-2005\r
+Revision:     0.1\r
+******************************************************************************/\r
+#include "hal.h"\r
+\r
+//-----------------------------------------------------------------------------\r
+// See hal.h for a description of this function.\r
+//-----------------------------------------------------------------------------\r
+#if (chip == 2430 || chip == 2431)\r
+BOOL halSetTimer2Period(BYTE mode, DWORD period){\r
+   if(mode&TIMER2_MAC_TIMER){\r
+      T2CAPHPH = 0x28;  // setting for 320 u-second periods as specified by 802.15.4\r
+      T2CAPLPL = 0x00;  // (0x2800) / 32 = 320 u-seconds\r
+   }\r
+   else {\r
+       T2CAPHPH = 0x7D; // Setting timer to have 1 m-second period\r
+       T2CAPLPL = 0x00; // (0x7D00) / 32 = 1000 u-seconds\r
+   }\r
+\r
+   if(period){\r
+       if(period&0xFFF00000) {return 0;}// Setting the number of periods (timer overflows) to generate\r
+       T2PEROF0 = (BYTE) period;        // an interrupt.\r
+       period = (period >> 8);\r
+       T2PEROF1 = (BYTE) period;\r
+       period = ((period >> 8)&0x0F);\r
+       T2PEROF2 = ( T2PEROF2&~0x0F | (BYTE)period );\r
+   }\r
+   return 1;\r
+}\r
+#endif\r
+#if (chip == 1110 || chip == 2510)\r
+BOOL halSetTimer2Period(UINT32 period, UINT8* cnt, UINT8* presc)\r
+{\r
+   BYTE tip = 0;\r
+   UINT16 prescaler = 1;\r
+   UINT16 counter;\r
+\r
+   // Times 26 and devided by 64 (crystal clock frequency and minimum tick period of T2).\r
+   period = (UINT32)((float)period * 0.40625);\r
+\r
+   // Compensating for TICKSPD.\r
+   period = (period >>  TICKSPD);\r
+\r
+\r
+   while(period > 65280)\r
+   {\r
+      tip++;\r
+      if(tip == 3)\r
+      {  // Step from 256 to 1024 clock cycles\r
+         period = period >> 1;\r
+      }\r
+      period = period >> 1;\r
+   }\r
+\r
+   if(tip > 3)\r
+   {\r
+      return FALSE;\r
+   }\r
+\r
+   while(((counter = (period / prescaler))  > 255))\r
+   {\r
+      prescaler++;\r
+   }\r
+\r
+   TIMER2_SET_COUNTER((UINT8)counter);\r
+   TIMER2_SET_PRESCALER((UINT8) prescaler);\r
+   TIMER2_SET_TICK_PERIOD(tip);\r
+\r
+   *cnt = (UINT8) counter;\r
+   *presc = (UINT8) prescaler;\r
+\r
+   return TRUE;\r
+}\r
+#endif\r
+#if (chip == 1111 || chip == 2511)\r
+BOOL halSetTimer2Period(UINT32 period, UINT8* cnt, UINT8* presc)\r
+{\r
+   BYTE tip = 0;\r
+   UINT16 prescaler = 1;\r
+   UINT16 counter;\r
+   BYTE temp;\r
+\r
+   // Times 24 and devided by 64 (crystal clock frequency and minimum tick period of T2).\r
+   period = (UINT32)((float)period * 0.375);\r
+\r
+   // Compensating for TICKSPD\r
+   temp = TICKSPD;//to avoid IAR warning\r
+   if(temp <= CLKSPD) { period >>= TICKSPD; }\r
+   else { period >>= CLKSPD; }\r
+\r
+   while(period > 65280)\r
+   {\r
+      tip++;\r
+      if(tip == 3)\r
+      {  // Step from 256 to 1024 clock cycles\r
+         period = period >> 1;\r
+      }\r
+      period = period >> 1;\r
+   }\r
+\r
+   if(tip > 3)\r
+   {\r
+      return FALSE;\r
+   }\r
+\r
+   while(((counter = (period / prescaler))  > 255))\r
+   {\r
+      prescaler++;\r
+   }\r
+\r
+   TIMER2_SET_COUNTER((UINT8)counter);\r
+   TIMER2_SET_PRESCALER((UINT8) prescaler);\r
+   TIMER2_SET_TICK_PERIOD(tip);\r
+\r
+   *cnt = (UINT8) counter;\r
+   *presc = (UINT8) prescaler;\r
+\r
+   return TRUE;\r
+}\r
+#endif\r
diff --git a/chronos-ti/Software Projects/RF Access Point/IAR/HAL/source/setTimer34Period.c b/chronos-ti/Software Projects/RF Access Point/IAR/HAL/source/setTimer34Period.c
new file mode 100755 (executable)
index 0000000..c808366
--- /dev/null
@@ -0,0 +1,91 @@
+/*\r
++------------------------------------------------------------------------------\r
+|  Copyright 2004-2007 Texas Instruments Incorporated. All rights reserved.\r
+|\r
+|  IMPORTANT: Your use of this Software is limited to those specific rights\r
+|  granted under the terms of a software license agreement between the user who\r
+|  downloaded the software, his/her employer (which must be your employer) and\r
+|  Texas Instruments Incorporated (the "License"). You may not use this Software\r
+|  unless you agree to abide by the terms of the License. The License limits\r
+|  your use, and you acknowledge, that the Software may not be modified, copied\r
+|  or distributed unless embedded on a Texas Instruments microcontroller or used\r
+|  solely and exclusively in conjunction with a Texas Instruments radio\r
+|  frequency transceiver, which is integrated into your product. Other than for\r
+|  the foregoing purpose, you may not use, reproduce, copy, prepare derivative\r
+|  works of, modify, distribute, perform, display or sell this Software and/or\r
+|  its documentation for any purpose.\r
+|\r
+|  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE\r
+|  PROVIDED \93AS IS\94 WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED,\r
+|  INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE,\r
+|  NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL\r
+|  TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+|  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER\r
+|  LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING\r
+|  BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR\r
+|  CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT OF\r
+|  SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES\r
+|  (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+|\r
+|  Should you have any questions regarding your right to use this Software,\r
+|  contact Texas Instruments Incorporated at www.TI.com.\r
+|\r
++------------------------------------------------------------------------------\r
+\r
+Filename:     setTimer34Period.c\r
+Target:       cc2430, cc2431, cc1110, cc2510, cc2511\r
+Author:       EFU\r
+Revised:      26/10-2005\r
+Revision:     0.1\r
+******************************************************************************/\r
+#include "hal.h"\r
+\r
+\r
+//------------------------------------------------------------------------------------------------------\r
+// See hal.h for a description of this function.\r
+//------------------------------------------------------------------------------------------------------\r
+BYTE halSetTimer34Period(BYTE timer, DWORD period){\r
+  BYTE div = 0;\r
+\r
+  if(TICKSPD > 5) { // Checking that the period is not too short.\r
+    if( (period < 2*(TICKSPD-5)) && (period != 0) ){\r
+      return 0;\r
+    }\r
+  }\r
+\r
+  if(period == 0){  // If period is 0, max period length and max prescaler\r
+    div = 7;  // division is used.\r
+    period = 255;\r
+  } else {\r
+#if (chip == 2430 || chip == 2431)\r
+    period = ((period*32) >> TICKSPD);// Determining how many timer ticks the period consist of\r
+#endif\r
+#if (chip == 1110 || chip == 2510)\r
+    period = ((period*26) >> TICKSPD);// Determining how many timer ticks the period consist of\r
+#endif\r
+#if (chip == 1111 || chip == 2511)\r
+    period = ((period*24) >> TICKSPD);// Determining how many timer ticks the period consist of\r
+#endif\r
+    while(period > 255){              // If the period is too long, the prescaler division is\r
+      period = (period >> 1);   // increased.\r
+      div++;\r
+      if(div > 7){              // If the period is too long when using max prescaler division,\r
+        return 0;         // 0 is returned.\r
+      }\r
+    }\r
+  }\r
+\r
+  if(timer == 4){\r
+    // Timer 4 selected\r
+    T4CTL |= (div << 5);              // Setting prescaler value\r
+    T4CC0 = (BYTE) period;            // Setting timer value.\r
+  } else if(timer == 3){\r
+    // Timer 3 selected\r
+    T3CTL |= (div << 5);              // Setting prescaler value\r
+    T3CC0 = (BYTE) period;            // Setting timer value.\r
+  } else {\r
+    return 0;\r
+  }\r
+\r
+  return period;\r
+}\r
diff --git a/chronos-ti/Software Projects/RF Access Point/IAR/HAL/source/util_critical_section.s51 b/chronos-ti/Software Projects/RF Access Point/IAR/HAL/source/util_critical_section.s51
new file mode 100755 (executable)
index 0000000..a5cfbb7
--- /dev/null
@@ -0,0 +1,82 @@
+/*\r
++------------------------------------------------------------------------------\r
+|  Copyright 2004-2007 Texas Instruments Incorporated. All rights reserved.\r
+|\r
+|  IMPORTANT: Your use of this Software is limited to those specific rights\r
+|  granted under the terms of a software license agreement between the user who\r
+|  downloaded the software, his/her employer (which must be your employer) and\r
+|  Texas Instruments Incorporated (the "License"). You may not use this Software\r
+|  unless you agree to abide by the terms of the License. The License limits\r
+|  your use, and you acknowledge, that the Software may not be modified, copied\r
+|  or distributed unless embedded on a Texas Instruments microcontroller or used\r
+|  solely and exclusively in conjunction with a Texas Instruments radio\r
+|  frequency transceiver, which is integrated into your product. Other than for\r
+|  the foregoing purpose, you may not use, reproduce, copy, prepare derivative\r
+|  works of, modify, distribute, perform, display or sell this Software and/or\r
+|  its documentation for any purpose.\r
+|\r
+|  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE\r
+|  PROVIDED \93AS IS\94 WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED,\r
+|  INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE,\r
+|  NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL\r
+|  TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+|  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER\r
+|  LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING\r
+|  BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR\r
+|  CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT OF\r
+|  SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES\r
+|  (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+|\r
+|  Should you have any questions regarding your right to use this Software,\r
+|  contact Texas Instruments Incorporated at www.TI.com.\r
+|\r
++------------------------------------------------------------------------------\r
+Filename:     flashWritePage.s51\r
+Target:       cc2510, cc2511\r
+Author:       JOL\r
+Revised:      24/03-2006\r
+Revision:     1.0\r
+******************************************************************************/\r
+;;-----------------------------------------------------------------------------\r
+;; See hal.h for a description of this function.\r
+;;-----------------------------------------------------------------------------\r
+//#include "hal.h"\r
+#if (chip == 2510)\r
+#include "ioCC2510.h"\r
+#endif\r
+#if (chip == 2511)\r
+#include "ioCC2511.h"\r
+#endif\r
+#if (chip == 1110)\r
+#include "ioCC1110.h"\r
+#endif\r
+#if (chip == 1111)\r
+#include "ioCC1111.h"\r
+#endif\r
+\r
+                MODULE  util_critical_section.s51\r
+\r
+                RSEG    RCODE\r
+                PUBLIC  utilEnterCriticalSection;\r
+                FUNCTION utilEnterCriticalSection, 0203H\r
+\r
+                ; Turn off global interrupts and return the previous state of EA\r
+utilEnterCriticalSection:\r
+                MOV     A, #01H;\r
+                JBC     EA, intsTurnedOff;\r
+                MOV     A, #00H;\r
+intsTurnedOff:  MOV     R1, A;\r
+                RET;\r
+\r
+\r
+                PUBLIC  utilLeaveCriticalSection;\r
+                FUNCTION utilLeaveCriticalSection, 0203H\r
+\r
+                ; Restore the previous EA state from the value provided in the function parameter\r
+utilLeaveCriticalSection:\r
+                MOV     A, R1;\r
+                MOV     C, ACC^0;\r
+                MOV     EA, C;\r
+                RET;\r
+\r
+                END;\r
diff --git a/chronos-ti/Software Projects/RF Access Point/IAR/HAL/source/wait.c b/chronos-ti/Software Projects/RF Access Point/IAR/HAL/source/wait.c
new file mode 100755 (executable)
index 0000000..cf899ae
--- /dev/null
@@ -0,0 +1,69 @@
+/*\r
++------------------------------------------------------------------------------\r
+|  Copyright 2004-2007 Texas Instruments Incorporated. All rights reserved.\r
+|\r
+|  IMPORTANT: Your use of this Software is limited to those specific rights\r
+|  granted under the terms of a software license agreement between the user who\r
+|  downloaded the software, his/her employer (which must be your employer) and\r
+|  Texas Instruments Incorporated (the "License"). You may not use this Software\r
+|  unless you agree to abide by the terms of the License. The License limits\r
+|  your use, and you acknowledge, that the Software may not be modified, copied\r
+|  or distributed unless embedded on a Texas Instruments microcontroller or used\r
+|  solely and exclusively in conjunction with a Texas Instruments radio\r
+|  frequency transceiver, which is integrated into your product. Other than for\r
+|  the foregoing purpose, you may not use, reproduce, copy, prepare derivative\r
+|  works of, modify, distribute, perform, display or sell this Software and/or\r
+|  its documentation for any purpose.\r
+|\r
+|  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE\r
+|  PROVIDED \93AS IS\94 WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED,\r
+|  INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE,\r
+|  NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL\r
+|  TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+|  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER\r
+|  LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING\r
+|  BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR\r
+|  CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT OF\r
+|  SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES\r
+|  (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+|\r
+|  Should you have any questions regarding your right to use this Software,\r
+|  contact Texas Instruments Incorporated at www.TI.com.\r
+|\r
++------------------------------------------------------------------------------\r
+Filename:     wait.c\r
+Target:       cc2430, cc2431, cc1110, cc2510, cc2511\r
+Author:       EFU\r
+Revised:      26/10-2005\r
+Revision:     0.1\r
+******************************************************************************/\r
+#include "hal.h"\r
+\r
+\r
+//-----------------------------------------------------------------------------\r
+// See hal.h for a description of this function.\r
+//-----------------------------------------------------------------------------\r
+void halWait(BYTE wait){\r
+   UINT32 largeWait;\r
+\r
+   if(wait == 0)\r
+   {return;}\r
+#if (chip == 2430 || chip == 2431)\r
+   largeWait = ((UINT16) (wait << 7));\r
+   largeWait += 114*wait;\r
+#endif\r
+\r
+#if ((chip == 1110) || (chip == 2510))\r
+   largeWait = ((UINT16) (wait << 7));\r
+   largeWait += 59*wait;\r
+#endif\r
+#if ((chip == 1111) || (chip == 2511))\r
+   largeWait = ((UINT16) (wait << 7));\r
+   largeWait += 45*wait;\r
+#endif\r
+\r
+   largeWait = (largeWait >> CLKSPD);\r
+   while(largeWait--);\r
+\r
+   return;\r
+}\r
diff --git a/chronos-ti/Software Projects/RF Access Point/IAR/bm-br1/BlueRobin_TX_433MHz.r51 b/chronos-ti/Software Projects/RF Access Point/IAR/bm-br1/BlueRobin_TX_433MHz.r51
new file mode 100755 (executable)
index 0000000..de5a918
Binary files /dev/null and b/chronos-ti/Software Projects/RF Access Point/IAR/bm-br1/BlueRobin_TX_433MHz.r51 differ
diff --git a/chronos-ti/Software Projects/RF Access Point/IAR/bm-br1/BlueRobin_TX_868MHz.r51 b/chronos-ti/Software Projects/RF Access Point/IAR/bm-br1/BlueRobin_TX_868MHz.r51
new file mode 100755 (executable)
index 0000000..5ab2ff7
Binary files /dev/null and b/chronos-ti/Software Projects/RF Access Point/IAR/bm-br1/BlueRobin_TX_868MHz.r51 differ
diff --git a/chronos-ti/Software Projects/RF Access Point/IAR/bm-br1/BlueRobin_TX_915MHz.r51 b/chronos-ti/Software Projects/RF Access Point/IAR/bm-br1/BlueRobin_TX_915MHz.r51
new file mode 100755 (executable)
index 0000000..8d37033
Binary files /dev/null and b/chronos-ti/Software Projects/RF Access Point/IAR/bm-br1/BlueRobin_TX_915MHz.r51 differ
diff --git a/chronos-ti/Software Projects/RF Access Point/IAR/bm-br1/bm.h b/chronos-ti/Software Projects/RF Access Point/IAR/bm-br1/bm.h
new file mode 100755 (executable)
index 0000000..1c5b63c
--- /dev/null
@@ -0,0 +1,324 @@
+// *************************************************************************************************\r
+//\r
+// Copyright 2009 BM innovations GmbH (www.bm-innovations.com), all rights reserved.\r
+//\r
+// This trial version of the "BlueRobin(TM) receiver library for the Texas Instruments \r
+// CC430 SoC" may be used for non-profit non-commercial purposes only. If you want to use \r
+// BlueRobin(TM) in a commercial project, please contact the copyright holder for a \r
+// separate license agreement.  \r
+//\r
+// By using this trial version of the "BlueRobin(TM) receiver library for the Texas Instruments \r
+// CC430 SoC", you implicitly agree that you will not modify, adapt, disassemble, decompile, \r
+// reverse engineer, translate or otherwise attempt to discover the source code of the \r
+// "BlueRobin(TM) receiver library for the Texas Instruments CC430 SoC".\r
+//\r
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY \r
+// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF \r
+// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. \r
+//\r
+// IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, \r
+// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, \r
+// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS \r
+// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT \r
+// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF \r
+// THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+// \r
+// *************************************************************************************************\r
+// Standard definitions, have to be included in every source and header file.\r
+// *************************************************************************************************\r
+\r
+#ifndef __BM_H\r
+#define __BM_H\r
+\r
+#if (defined __IAR_SYSTEMS_ASM) || (defined __IAR_SYSTEMS_ASM__)\r
+  #define _ASSEMBLER_USED_\r
+#endif\r
+\r
+#ifndef _ASSEMBLER_USED_\r
+  // get the null pointer, offsetof ...\r
+  #include <stddef.h>\r
+#endif\r
+\r
+#ifndef FALSE\r
+  /*! the classic false */\r
+  #define FALSE (0 == 1)\r
+#endif\r
+\r
+#ifndef TRUE\r
+  /*! the classic true */\r
+  #define TRUE  (1 == 1)\r
+#endif\r
+\r
+#ifndef USE_RAW_ATTR\r
+  //! per default this feature is disabled\r
+  #define USE_RAW_ATTR FALSE\r
+#endif\r
+\r
+// *************************************************************************************************\r
+// First Section: Basic Data Types\r
+// *************************************************************************************************\r
+\r
+// Fundamental #definitions\r
+// CPU target idents are used for target dependant compilations\r
+\r
+/*! Intel 8051 */\r
+#define _INTEL_8051_ (20)\r
+\r
+\r
+// Find the currently running compiler\r
+// and make the related #define's\r
+\r
+// _IAR_TID_                target ID from IAR compilers\r
+// _CPU_TID_                remap to enum of processor target numbers\r
+// _CPU_8BIT_INT_           type for 8 bit int\r
+// _CPU_16BIT_INT_          type for 16 bit int\r
+// _CPU_32BIT_INT_          type for 32 bit int\r
+// _CPU_32BIT_FLOAT_        type for 32 bit float\r
+// _CPU_64BIT_FLOAT_        type for 64 bit float\r
+// INTERRUPT                declares an interrupt service routine without an entry in the vector table\r
+// ISR(vector)              declares an interrupt service routine which is added in vector table at offset vector\r
+// MONITOR                  declares a function atomic\r
+// INTERRUPTS_ENABLE        remap to the intrinsic for enable interrupts\r
+// INTERRUPTS_DISABLE       remap to the intrinsic for disable interrupts\r
+// NO_OPERATION             remap to the intrinsic for no operation\r
+// _CPU_DIRECTION_OUT_1_    if TRUE the direction register indicates with an 1: direction is output\r
+// _CPU_EDGE_HIGH_LOW_1_    if TRUE the edge select register indicates with an 1: trigger on high low\r
+// NO_INIT                  declare a variable as not initialized\r
+// INLINE_FUNC              declare a function as inline for release builds\r
+\r
+#if defined __IAR_SYSTEMS_ICC__\r
+  // Found IAR Compiler with EDG frontend\r
+  #define _IAR_TID_ ((__TID__ >> 8) & 0x7f)\r
+\r
+  #if USE_RAW_ATTR == TRUE\r
+    //! use the raw attribute in ISR's\r
+    #define _RAW __raw\r
+  #else\r
+    //! empty define RAW as it is not used\r
+    #define _RAW\r
+  #endif\r
+  #define INTERRUPT   _RAW __interrupt\r
+  #define MONITOR     __monitor\r
+  #define NO_INIT     __no_init\r
+  #define INTERRUPTS_ENABLE()   __enable_interrupt()\r
+  #define INTERRUPTS_DISABLE()  __disable_interrupt()\r
+  #define NO_OPERATION()        __no_operation()\r
+\r
+  #ifndef DEBUG\r
+    // force inlining of function in release builds\r
+    #define INLINE_FUNC PRAGMA(inline=forced)\r
+  #else\r
+    // do not force inlining of function in debug builds\r
+    #define INLINE_FUNC\r
+  #endif\r
+\r
+  #if (!defined CODECHECK) && (!defined __DA_C__)\r
+    /*! Define to a new way of using #pragmas in preprocessor */\r
+    #define PRAGMA(x) _Pragma(#x)\r
+    #define ISR(x) PRAGMA(vector = (x)) INTERRUPT\r
+  #endif\r
+\r
+  #if ((_IAR_TID_) == 32)\r
+    // Found 8051 CPU\r
+    #define _CPU_TID_             _INTEL_8051_\r
+\r
+#else\r
+    #error "Unknown new IAR Compiler, the file iar.h has to be expanded !"\r
+  #endif\r
+\r
+#else\r
+  #error "Unknown Compiler, the file iar.h has to be expanded !"\r
+#endif\r
+\r
+#ifndef _ASSEMBLER_USED_\r
+  // Get the limits to autodetect the size of integral types\r
+  #include <limits.h>\r
+  // Get floats to autodetect the size of float types\r
+  #include <float.h>\r
+\r
+  // ***********************************************************************************************\r
+  //\r
+  // Common basic datatypes\r
+  //\r
+  // ***********************************************************************************************\r
+  #if UCHAR_MAX == 0xFFu\r
+    #define _CPU_8BIT_INT_ char\r
+  #else\r
+    #error "unable to get size of u8 automatically"\r
+  #endif\r
+\r
+  #if USHRT_MAX == 0xFFFFu\r
+    #define _CPU_16BIT_INT_ short\r
+  #elif UINT_MAX == 0xFFFFu\r
+    #define _CPU_16BIT_INT_ int\r
+  #else\r
+    #error "unable to get size of u16 automatically"\r
+  #endif\r
+\r
+  #if USHRT_MAX == 0xFFFFFFFFu\r
+    #define _CPU_32BIT_INT_ short\r
+  #elif UINT_MAX == 0xFFFFFFFFu\r
+    #define _CPU_32BIT_INT_ int\r
+  #elif ULONG_MAX == 0xFFFFFFFFu\r
+    #define _CPU_32BIT_INT_ long\r
+  #else\r
+    #error "unable to get size of u32 automatically"\r
+  #endif\r
+\r
+  #ifdef __IAR_SYSTEMS_ICC__\r
+    #if __IAR_SYSTEMS_ICC__ > 1\r
+      #define _CPU_32BIT_FLOAT_ float\r
+      #if __DOUBLE_SIZE__ == 8\r
+        #define _CPU_64BIT_FLOAT_ double\r
+      #endif\r
+    #endif\r
+  #endif\r
+\r
+  #ifndef _CPU_32BIT_FLOAT_\r
+    #if FLT_MANT_DIG == 24\r
+      #define _CPU_32BIT_FLOAT_ float\r
+    #elif DBL_MANT_DIG == 24\r
+      #define _CPU_32BIT_FLOAT_ double\r
+    #else\r
+      #error "unable to get size of f32 automatically"\r
+    #endif\r
+\r
+    #if DBL_MANT_DIG == 53\r
+      #define _CPU_64BIT_FLOAT_ double\r
+    #endif\r
+  #endif\r
+\r
+\r
+  // ***********************************************************************************************\r
+  //\r
+  // Following lines #typedef the basic datatypes in a compiler independent way.\r
+  //\r
+  // ***********************************************************************************************\r
+\r
+  #ifdef _CPU_8BIT_INT_\r
+    /*! unsigned 8 bit */\r
+    typedef unsigned _CPU_8BIT_INT_ u8 ;\r
+    /*! unsigned 8 bit max value */\r
+    #define U8_MAX (0xFFU)\r
+    /*! signed 8 bit max value */\r
+    typedef   signed _CPU_8BIT_INT_ s8 ;\r
+    /*! signed 8 bit min value */\r
+    #define S8_MIN (-127 - 1)\r
+    /*! signed 8 bit max value */\r
+    #define S8_MAX (127)\r
+  #endif\r
+\r
+  #ifdef _CPU_16BIT_INT_\r
+    /*! unsigned 16 bit */\r
+    typedef unsigned _CPU_16BIT_INT_ u16 ;\r
+    /*! unsigned 16 bit max value */\r
+    #define U16_MAX (0xFFFFU)\r
+    /*! signed 16 bit */\r
+    typedef   signed _CPU_16BIT_INT_ s16 ;\r
+    /*! signed 16 bit min value */\r
+    #define S16_MIN (-32767 - 1)\r
+    /*! signed 16 bit max value */\r
+    #define S16_MAX (32767)\r
+  #endif\r
+\r
+  #ifdef _CPU_32BIT_INT_\r
+    /*! unsigned 32 bit */\r
+    typedef unsigned _CPU_32BIT_INT_ u32 ;\r
+    /*! unsigned 32 bit max value */\r
+    #define U32_MAX (0xFFFFFFFFUL)\r
+    /*! signed 32 bit */\r
+    typedef   signed _CPU_32BIT_INT_ s32 ;\r
+    /*! signed 32 bit min value */\r
+    #define S32_MIN (-2147483647L - 1L)\r
+    /*! signed 32 bit max value */\r
+    #define S32_MAX (2147483647L)\r
+  #endif\r
+\r
+  #ifdef _CPU_64BIT_INT_\r
+    /*! unsigned 64 bit */\r
+    typedef unsigned _CPU_64BIT_INT_ u64 ;\r
+    /*! signed 64 bit */\r
+    typedef   signed _CPU_64BIT_INT_ s64 ;\r
+  #endif\r
+\r
+  #ifdef _CPU_32BIT_FLOAT_\r
+    /*! float 32 bit */\r
+    typedef _CPU_32BIT_FLOAT_ f32 ;\r
+    /*! number of digits in mantissa of f32 */\r
+    #define F32_MANT_DIG   (24)\r
+    /*! epsilon for f32 */\r
+    #define F32_EPSILON    (1.192092896e-07)\r
+    /*! number of digits of precision of f32 */\r
+    #define F32_DIG        (6)\r
+    /*! exponent min of f32 */\r
+    #define F32_MIN_EXP    (-125)\r
+    /*! min positive value of f32 */\r
+    #define F32_MIN        (1.175494351e-38)\r
+    /*! decimal exponent min of f32 */\r
+    #define F32_MIN_10_EXP (-37)\r
+    /*! exponent max of f32 */\r
+    #define F32_MAX_EXP    (128)\r
+    /*! max value of f32 */\r
+    #define F32_MAX        (3.402823466e+38)\r
+    /*! decimal exponent max of f32 */\r
+    #define F32_MAX_10_EXP (38)\r
+  #endif\r
+\r
+  #ifdef _CPU_64BIT_FLOAT_\r
+    /*! float 64 bit */\r
+    typedef _CPU_64BIT_FLOAT_ f64 ;\r
+    /*! number of digits in mantissa of f64 */\r
+    #define F64_MANT_DIG   (53)\r
+    /*! epsilon for f64 */\r
+    #define F64_EPSILON    (2.2204460492503131e-016)\r
+    /*! number of digits of precision of f64 */\r
+    #define F64_DIG        (15)\r
+    /*! exponent min of f64 */\r
+    #define F64_MIN_EXP    (-1021)\r
+    /*! min positive value of f64 */\r
+    #define F64_MIN        (2.2250738585072014e-308)\r
+    /*! decimal exponent min of f64 */\r
+    #define F64_MIN_10_EXP (-307)\r
+    /*! exponent max of f64 */\r
+    #define F64_MAX_EXP    (1024)\r
+    /*! max value of f64 */\r
+    #define F64_MAX        (1.7976931348623158e+308)\r
+    /*! decimal exponent max of f64 */\r
+    #define F64_MAX_10_EXP (308)\r
+  #endif\r
+\r
+#endif // _ASSMEBLER_USED_\r
+\r
+#ifndef MONITOR\r
+  #define MONITOR\r
+#endif\r
+\r
+#ifndef NO_INIT\r
+  #define NO_INIT\r
+#endif\r
+\r
+#ifndef INTERRUPT\r
+  #define INTERRUPT\r
+#endif\r
+\r
+#ifndef ISR\r
+  #define ISR(ignore)\r
+#endif\r
+\r
+#ifndef INLINE_FUNC\r
+  #define INLINE_FUNC\r
+#endif\r
+\r
+#ifndef INTERRUPTS_ENABLE\r
+  #define INTERRUPTS_ENABLE()\r
+#endif\r
+\r
+#ifndef INTERRUPTS_DISABLE\r
+  #define INTERRUPTS_DISABLE()\r
+#endif\r
+\r
+\r
+/*! Every project has to have its own header file, so it can be included here */\r
+#include "project.h"\r
+\r
+#endif // __BM_H\r
diff --git a/chronos-ti/Software Projects/RF Access Point/IAR/bm-br1/project.h b/chronos-ti/Software Projects/RF Access Point/IAR/bm-br1/project.h
new file mode 100755 (executable)
index 0000000..31c8be2
--- /dev/null
@@ -0,0 +1,130 @@
+// *************************************************************************************************\r
+//\r
+// Copyright 2009 BM innovations GmbH (www.bm-innovations.com), all rights reserved.\r
+//\r
+// This trial version of the "BlueRobin(TM) transmitter library for the Texas Instruments \r
+// CC1111 SoC" may be used for non-profit non-commercial purposes only. If you want to use \r
+// BlueRobin(TM) in a commercial project, please contact the copyright holder for a \r
+// separate license agreement.  \r
+//\r
+// By using this trial version of the "BlueRobin(TM) transmitter library for the Texas Instruments \r
+// CC430 SoC", you implicitly agree that you will not modify, adapt, disassemble, decompile, \r
+// reverse engineer, translate or otherwise attempt to discover the source code of the \r
+// "BlueRobin(TM) transmitter library for the Texas Instruments CC1111 SoC".\r
+//\r
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY \r
+// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF \r
+// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. \r
+//\r
+// IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, \r
+// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, \r
+// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS \r
+// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT \r
+// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF \r
+// THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+// \r
+// *************************************************************************************************\r
+// Project setup for USB dongle\r
+// *************************************************************************************************\r
+\r
+\r
+#ifndef __PROJECT_H\r
+#define __PROJECT_H\r
+\r
+\r
+// *************************************************************************************************\r
+// Include section\r
+\r
+#include <bm.h>\r
+#include "hal.h"\r
+\r
+// *************************************************************************************************\r
+// Defines section\r
+\r
+//#define TX_SIMPLE_TEST\r
+//#define TX_MP_TEST\r
+\r
+// Debug\r
+#ifdef CC1111EM\r
+  \r
+  #define TOGGLE_LED              { if ((P1_1 & BIT0) == BIT0) P1_1 &= ~BIT0; else P1_1 |= BIT0; }\r
+  #define LED_ON                  { P1_1 |= BIT0; }\r
+  #define LED_OFF                 { P1_1 &= ~BIT0; }\r
+\r
+  #define DEBUG_OUTPUT\r
+  #ifdef DEBUG_OUTPUT\r
+    #define DBG_PIN_H(port, bit)       {port |= bit;}\r
+    #define DBG_PIN_L(port, bit)       {port &= ~bit;}\r
+    #define TOGGLE_P0_5           { if ((P0_5 & BIT0) == BIT0) P0_5 &= ~BIT0; else P0_5 |= BIT0; } \r
+    #define TOGGLE_P0_4           { if ((P0_4 & BIT0) == BIT0) P0_4 &= ~BIT0; else P0_4 |= BIT0; } \r
+    #define TOGGLE_P0_3           { if ((P0_3 & BIT0) == BIT0) P0_3 &= ~BIT0; else P0_3 |= BIT0; } \r
+    #define TOGGLE_P0_2           { if ((P0_2 & BIT0) == BIT0) P0_2 &= ~BIT0; else P0_2 |= BIT0; } \r
+    #define TOGGLE_P0_1           { if ((P0_1 & BIT0) == BIT0) P0_1 &= ~BIT0; else P0_1 |= BIT0; } \r
+    #define TOGGLE_P0_0           { if ((P0_0 & BIT0) == BIT0) P0_0 &= ~BIT0; else P0_0 |= BIT0; }\r
+  #else\r
+    #define DBG_PIN_H(port, bit)       { }\r
+    #define DBG_PIN_L(port, bit)       { }\r
+    #define TOGGLE_P0_5             { } \r
+    #define TOGGLE_P0_4             { } \r
+    #define TOGGLE_P0_3             { } \r
+    #define TOGGLE_P0_2             { } \r
+    #define TOGGLE_P0_1             { } \r
+    #define TOGGLE_P0_0             { } \r
+  #endif\r
+\r
+#else\r
+    \r
+  #define TOGGLE_LED              { if ((P1_0 & BIT0) == BIT0) P1_0 &= ~BIT0; else P1_0 |= BIT0; }\r
+  #define LED_ON                  { P1_0 |= BIT0; }\r
+  #define LED_OFF                 { P1_0 &= ~BIT0; }\r
+\r
+  #define TP_H                    { P1_4 |= BIT0; }\r
+  #define TP_L                    { P1_4 &= ~BIT0; }\r
+  \r
+  #define DBG_PIN_H(port, bit)   { }\r
+  #define DBG_PIN_L(port, bit)   { }\r
+  #define TOGGLE_P0_5             { } \r
+  #define TOGGLE_P0_4             { } \r
+  #define TOGGLE_P0_3             { } \r
+  #define TOGGLE_P0_2             { } \r
+  #define TOGGLE_P0_1             { } \r
+  #define TOGGLE_P0_0             { } \r
+\r
+#endif\r
+\r
+// Product ID\r
+#define PRODUCT_ID    (0x12345678)\r
+\r
+// BlueRobin TX serial\r
+#define TX_SERIAL_NO  (1234567u)\r
+\r
+// Radio to be used\r
+//#define CC2500\r
+#define CC1100\r
+\r
+\r
+#define NO                             (0)\r
+#define YES                            (1)\r
+\r
+\r
+/************************************************************\r
+* STANDARD BITS\r
+************************************************************/\r
+#define BIT0                   (0x0001)\r
+#define BIT1                   (0x0002)\r
+#define BIT2                   (0x0004)\r
+#define BIT3                   (0x0008)\r
+#define BIT4                   (0x0010)\r
+#define BIT5                   (0x0020)\r
+#define BIT6                   (0x0040)\r
+#define BIT7                   (0x0080)\r
+#define BIT8                   (0x0100)\r
+#define BIT9                   (0x0200)\r
+#define BITA                   (0x0400)\r
+#define BITB                   (0x0800)\r
+#define BITC                   (0x1000)\r
+#define BITD                   (0x2000)\r
+#define BITE                   (0x4000)\r
+#define BITF                   (0x8000)\r
+\r
+#endif // __PROJECT_H\r
diff --git a/chronos-ti/Software Projects/RF Access Point/IAR/cc1111_usb_dongle.ewd b/chronos-ti/Software Projects/RF Access Point/IAR/cc1111_usb_dongle.ewd
new file mode 100755 (executable)
index 0000000..daec8b6
--- /dev/null
@@ -0,0 +1,3805 @@
+<?xml version="1.0" encoding="iso-8859-1"?>\r
+\r
+<project>\r
+  <fileVersion>2</fileVersion>\r
+  <configuration>\r
+    <name>915MHz - Limited IAR Kickstart (USA)</name>\r
+    <toolchain>\r
+      <name>8051</name>\r
+    </toolchain>\r
+    <debug>1</debug>\r
+    <settings>\r
+      <name>C-SPY</name>\r
+      <archiveVersion>2</archiveVersion>\r
+      <data>\r
+        <version>7</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>CInput</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>MacOverride</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>MacFile</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>GoToEnable</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>GoToName</name>\r
+          <state>main</state>\r
+        </option>\r
+        <option>\r
+          <name>MemOverride</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OCProcessor</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>d24BitData</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Debugger code model</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OCNrOfVirtualRegisters</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Sim extended stack</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Debugger DPTR Settings</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Debugger Code Banking</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>DebuggerMandatory</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>DynDriver</name>\r
+          <state>CHIPCON_ID</state>\r
+        </option>\r
+        <option>\r
+          <name>Debugger Extra Options Check</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Debugger Extra Options Edit</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>Debugger data model</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OCImagesSuppressCheck1</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OCImagesPath1</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>OCImagesSuppressCheck2</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OCImagesPath2</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>OCImagesSuppressCheck3</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OCImagesPath3</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>DdfFile slave</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>DdfFile master</name>\r
+          <state>$TOOLKIT_DIR$\config\devices\_generic\io8052.ddf</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>_3RD_ID</name>\r
+      <archiveVersion>1</archiveVersion>\r
+      <data>\r
+        <version>0</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>Third-Party Driver Mandatory</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Third-Party Driver File Name Edit</name>\r
+          <state>ThirdPartyDriver.dll</state>\r
+        </option>\r
+        <option>\r
+          <name>Third-Party Driver LogFile Check</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Third-Party Driver LogFile Edit</name>\r
+          <state>cspycomm.log</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>CHIPCON_ID</name>\r
+      <archiveVersion>2</archiveVersion>\r
+      <data>\r
+        <version>3</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>ChipconDriverMandatory</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>ChipconEraseFlash</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>ChipconRetainMemory</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>ChipconSuppressDownload</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>ChipconVerifyDownload</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>ChipconVerifyRadio</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>ChipconReduceSpeed</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>ChipconStackOverflow</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>ChipconNoBanks</name>\r
+          <version>0</version>\r
+          <state>2</state>\r
+        </option>\r
+        <option>\r
+          <name>ChipconLogFileCheck</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>ChipconLogComFile</name>\r
+          <state>communication.log</state>\r
+        </option>\r
+        <option>\r
+          <name>ChipconFlashLock</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>ChipconFlashLockInfo</name>\r
+          <state>&lt;page size info. missing></state>\r
+        </option>\r
+        <option>\r
+          <name>ChipconBootLock</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>ChipconDebugLock</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>ChipconLockFlash</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>ChipconLockLabel</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>ChipconRetainPagesCtrl</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>ChipconRetainPages</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>ChipconFlashPages</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>ChipconFlashRadio</name>\r
+          <state>0</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>FS2_ID</name>\r
+      <archiveVersion>1</archiveVersion>\r
+      <data>\r
+        <version>0</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>Fs2DriverMandatory</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Configuration</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Has program RAM</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Program RAM areas</name>\r
+          <state>0x8000-0x87FF,0xC000-0xC7FF</state>\r
+        </option>\r
+        <option>\r
+          <name>Has program Flash</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Program Flash cfg entry</name>\r
+          <state>nRF24LU1</state>\r
+        </option>\r
+        <option>\r
+          <name>Program Flash areas</name>\r
+          <state>0x0000-0x7FFF</state>\r
+        </option>\r
+        <option>\r
+          <name>FS2SuppressDownload</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>FS2VerifyDownload</name>\r
+          <state>0</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>INFINEON_ID</name>\r
+      <archiveVersion>1</archiveVersion>\r
+      <data>\r
+        <version>0</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>InfineonDriverMandatory</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>InfineonEraseFlash</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>InfineonSuppressDownload</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>InfineonVerifyDownload</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>InfServerAddr</name>\r
+          <state>localhost</state>\r
+        </option>\r
+        <option>\r
+          <name>InfServerName</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>InfKey1</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>InfKey2</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>InfKey3</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>InfKey4</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>InfConnection</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>InfineonSwBp</name>\r
+          <state>0</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>NS_ID</name>\r
+      <archiveVersion>1</archiveVersion>\r
+      <data>\r
+        <version>0</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>NsDriverMandatory</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>NSSuppressDownload</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>NSVerifyDownload</name>\r
+          <state>0</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>ROM_ID</name>\r
+      <archiveVersion>1</archiveVersion>\r
+      <data>\r
+        <version>2</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>RomDriverMandatory</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>SuppressLoad</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>VerifyDownload</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AllComm</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Port</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Baud</name>\r
+          <version>0</version>\r
+          <state>6</state>\r
+        </option>\r
+        <option>\r
+          <name>Parity</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>DataBits</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>StopBits</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Handshake</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>DoLogfile</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>LogFile</name>\r
+          <state>cspycomm.log</state>\r
+        </option>\r
+        <option>\r
+          <name>ToggleDTR</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>ToggleRTS</name>\r
+          <state>0</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>AD2_ID</name>\r
+      <archiveVersion>2</archiveVersion>\r
+      <data>\r
+        <version>6</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>CygnalDriverMandatory</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CygnVerifyDownload</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Port</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Baud</name>\r
+          <version>0</version>\r
+          <state>6</state>\r
+        </option>\r
+        <option>\r
+          <name>CygnComm</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>ADuC8xx</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>ADuCpuClockFrequency</name>\r
+          <state>12582912</state>\r
+        </option>\r
+        <option>\r
+          <name>OverrideCpuClkFreq</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AD2EraseDataFlash</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Debug Interface</name>\r
+          <state>0</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>CYGNAL_ID</name>\r
+      <archiveVersion>1</archiveVersion>\r
+      <data>\r
+        <version>1</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>CygnalDriverMandatory</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CygnSuppressLoad</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CygnVerifyDownload</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CygnProtocol</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Port</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Baud</name>\r
+          <version>0</version>\r
+          <state>4</state>\r
+        </option>\r
+        <option>\r
+          <name>CygnComm</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>drv_silabs_page_size</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>SilabsUsb</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>SilabsPowerTarget</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>SilabsMulDevices</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>SilabsDevBefore</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>SilabsDevAfter</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>SilabsRegBefore</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>SilabsRegAfter</name>\r
+          <state>0</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>_SENSIUM_ID</name>\r
+      <archiveVersion>1</archiveVersion>\r
+      <data>\r
+        <version>0</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>TI Sensium Driver Mandatory</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>TI Sensium Driver File Name Edit</name>\r
+          <state>tiSensiumDbg.dll</state>\r
+        </option>\r
+        <option>\r
+          <name>TI Sensium Driver LogFile Check</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>TI Sensium Driver LogFile Edit</name>\r
+          <state>cspycomm.log</state>\r
+        </option>\r
+        <option>\r
+          <name>SensiumSuppressDownload</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>SensiumVerifyDownload</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>SensiumES2</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>SensiumProgramEPROM</name>\r
+          <state>0</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>SIM_ID</name>\r
+      <archiveVersion>1</archiveVersion>\r
+      <data>\r
+        <version>1</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>SimDriverMandatory</name>\r
+          <state>1</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <debuggerPlugins>\r
+      <plugin>\r
+        <file>$EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin</file>\r
+        <loadFlag>1</loadFlag>\r
+      </plugin>\r
+      <plugin>\r
+        <file>$EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin</file>\r
+        <loadFlag>0</loadFlag>\r
+      </plugin>\r
+      <plugin>\r
+        <file>$EW_DIR$\common\plugins\Profiling\Profiling.ENU.ewplugin</file>\r
+        <loadFlag>1</loadFlag>\r
+      </plugin>\r
+      <plugin>\r
+        <file>$EW_DIR$\common\plugins\Stack\Stack.ENU.ewplugin</file>\r
+        <loadFlag>1</loadFlag>\r
+      </plugin>\r
+      <plugin>\r
+        <file>$EW_DIR$\common\plugins\SymList\SymList.ENU.ewplugin</file>\r
+        <loadFlag>1</loadFlag>\r
+      </plugin>\r
+    </debuggerPlugins>\r
+  </configuration>\r
+  <configuration>\r
+    <name>868MHz - Limited IAR Kickstart (Europe)</name>\r
+    <toolchain>\r
+      <name>8051</name>\r
+    </toolchain>\r
+    <debug>1</debug>\r
+    <settings>\r
+      <name>C-SPY</name>\r
+      <archiveVersion>2</archiveVersion>\r
+      <data>\r
+        <version>7</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>CInput</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>MacOverride</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>MacFile</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>GoToEnable</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>GoToName</name>\r
+          <state>main</state>\r
+        </option>\r
+        <option>\r
+          <name>MemOverride</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OCProcessor</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>d24BitData</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Debugger code model</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OCNrOfVirtualRegisters</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Sim extended stack</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Debugger DPTR Settings</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Debugger Code Banking</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>DebuggerMandatory</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>DynDriver</name>\r
+          <state>CHIPCON_ID</state>\r
+        </option>\r
+        <option>\r
+          <name>Debugger Extra Options Check</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Debugger Extra Options Edit</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>Debugger data model</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OCImagesSuppressCheck1</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OCImagesPath1</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>OCImagesSuppressCheck2</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OCImagesPath2</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>OCImagesSuppressCheck3</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OCImagesPath3</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>DdfFile slave</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>DdfFile master</name>\r
+          <state>$TOOLKIT_DIR$\config\devices\_generic\io8052.ddf</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>_3RD_ID</name>\r
+      <archiveVersion>1</archiveVersion>\r
+      <data>\r
+        <version>0</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>Third-Party Driver Mandatory</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Third-Party Driver File Name Edit</name>\r
+          <state>ThirdPartyDriver.dll</state>\r
+        </option>\r
+        <option>\r
+          <name>Third-Party Driver LogFile Check</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Third-Party Driver LogFile Edit</name>\r
+          <state>cspycomm.log</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>CHIPCON_ID</name>\r
+      <archiveVersion>2</archiveVersion>\r
+      <data>\r
+        <version>3</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>ChipconDriverMandatory</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>ChipconEraseFlash</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>ChipconRetainMemory</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>ChipconSuppressDownload</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>ChipconVerifyDownload</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>ChipconVerifyRadio</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>ChipconReduceSpeed</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>ChipconStackOverflow</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>ChipconNoBanks</name>\r
+          <version>0</version>\r
+          <state>2</state>\r
+        </option>\r
+        <option>\r
+          <name>ChipconLogFileCheck</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>ChipconLogComFile</name>\r
+          <state>communication.log</state>\r
+        </option>\r
+        <option>\r
+          <name>ChipconFlashLock</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>ChipconFlashLockInfo</name>\r
+          <state>&lt;page size info. missing></state>\r
+        </option>\r
+        <option>\r
+          <name>ChipconBootLock</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>ChipconDebugLock</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>ChipconLockFlash</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>ChipconLockLabel</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>ChipconRetainPagesCtrl</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>ChipconRetainPages</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>ChipconFlashPages</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>ChipconFlashRadio</name>\r
+          <state>0</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>FS2_ID</name>\r
+      <archiveVersion>1</archiveVersion>\r
+      <data>\r
+        <version>0</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>Fs2DriverMandatory</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Configuration</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Has program RAM</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Program RAM areas</name>\r
+          <state>0x8000-0x87FF,0xC000-0xC7FF</state>\r
+        </option>\r
+        <option>\r
+          <name>Has program Flash</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Program Flash cfg entry</name>\r
+          <state>nRF24LU1</state>\r
+        </option>\r
+        <option>\r
+          <name>Program Flash areas</name>\r
+          <state>0x0000-0x7FFF</state>\r
+        </option>\r
+        <option>\r
+          <name>FS2SuppressDownload</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>FS2VerifyDownload</name>\r
+          <state>0</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>INFINEON_ID</name>\r
+      <archiveVersion>1</archiveVersion>\r
+      <data>\r
+        <version>0</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>InfineonDriverMandatory</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>InfineonEraseFlash</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>InfineonSuppressDownload</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>InfineonVerifyDownload</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>InfServerAddr</name>\r
+          <state>localhost</state>\r
+        </option>\r
+        <option>\r
+          <name>InfServerName</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>InfKey1</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>InfKey2</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>InfKey3</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>InfKey4</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>InfConnection</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>InfineonSwBp</name>\r
+          <state>0</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>NS_ID</name>\r
+      <archiveVersion>1</archiveVersion>\r
+      <data>\r
+        <version>0</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>NsDriverMandatory</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>NSSuppressDownload</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>NSVerifyDownload</name>\r
+          <state>0</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>ROM_ID</name>\r
+      <archiveVersion>1</archiveVersion>\r
+      <data>\r
+        <version>2</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>RomDriverMandatory</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>SuppressLoad</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>VerifyDownload</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AllComm</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Port</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Baud</name>\r
+          <version>0</version>\r
+          <state>6</state>\r
+        </option>\r
+        <option>\r
+          <name>Parity</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>DataBits</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>StopBits</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Handshake</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>DoLogfile</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>LogFile</name>\r
+          <state>cspycomm.log</state>\r
+        </option>\r
+        <option>\r
+          <name>ToggleDTR</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>ToggleRTS</name>\r
+          <state>0</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>AD2_ID</name>\r
+      <archiveVersion>2</archiveVersion>\r
+      <data>\r
+        <version>6</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>CygnalDriverMandatory</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CygnVerifyDownload</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Port</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Baud</name>\r
+          <version>0</version>\r
+          <state>6</state>\r
+        </option>\r
+        <option>\r
+          <name>CygnComm</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>ADuC8xx</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>ADuCpuClockFrequency</name>\r
+          <state>12582912</state>\r
+        </option>\r
+        <option>\r
+          <name>OverrideCpuClkFreq</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AD2EraseDataFlash</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Debug Interface</name>\r
+          <state>0</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>CYGNAL_ID</name>\r
+      <archiveVersion>1</archiveVersion>\r
+      <data>\r
+        <version>1</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>CygnalDriverMandatory</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CygnSuppressLoad</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CygnVerifyDownload</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CygnProtocol</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Port</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Baud</name>\r
+          <version>0</version>\r
+          <state>4</state>\r
+        </option>\r
+        <option>\r
+          <name>CygnComm</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>drv_silabs_page_size</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>SilabsUsb</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>SilabsPowerTarget</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>SilabsMulDevices</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>SilabsDevBefore</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>SilabsDevAfter</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>SilabsRegBefore</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>SilabsRegAfter</name>\r
+          <state>0</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>_SENSIUM_ID</name>\r
+      <archiveVersion>1</archiveVersion>\r
+      <data>\r
+        <version>0</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>TI Sensium Driver Mandatory</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>TI Sensium Driver File Name Edit</name>\r
+          <state>tiSensiumDbg.dll</state>\r
+        </option>\r
+        <option>\r
+          <name>TI Sensium Driver LogFile Check</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>TI Sensium Driver LogFile Edit</name>\r
+          <state>cspycomm.log</state>\r
+        </option>\r
+        <option>\r
+          <name>SensiumSuppressDownload</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>SensiumVerifyDownload</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>SensiumES2</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>SensiumProgramEPROM</name>\r
+          <state>0</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>SIM_ID</name>\r
+      <archiveVersion>1</archiveVersion>\r
+      <data>\r
+        <version>1</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>SimDriverMandatory</name>\r
+          <state>1</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <debuggerPlugins>\r
+      <plugin>\r
+        <file>$EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin</file>\r
+        <loadFlag>1</loadFlag>\r
+      </plugin>\r
+      <plugin>\r
+        <file>$EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin</file>\r
+        <loadFlag>0</loadFlag>\r
+      </plugin>\r
+      <plugin>\r
+        <file>$EW_DIR$\common\plugins\Profiling\Profiling.ENU.ewplugin</file>\r
+        <loadFlag>1</loadFlag>\r
+      </plugin>\r
+      <plugin>\r
+        <file>$EW_DIR$\common\plugins\Stack\Stack.ENU.ewplugin</file>\r
+        <loadFlag>1</loadFlag>\r
+      </plugin>\r
+      <plugin>\r
+        <file>$EW_DIR$\common\plugins\SymList\SymList.ENU.ewplugin</file>\r
+        <loadFlag>1</loadFlag>\r
+      </plugin>\r
+    </debuggerPlugins>\r
+  </configuration>\r
+  <configuration>\r
+    <name>433MHz - Limited IAR Kickstart (Other regions)</name>\r
+    <toolchain>\r
+      <name>8051</name>\r
+    </toolchain>\r
+    <debug>1</debug>\r
+    <settings>\r
+      <name>C-SPY</name>\r
+      <archiveVersion>2</archiveVersion>\r
+      <data>\r
+        <version>7</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>CInput</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>MacOverride</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>MacFile</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>GoToEnable</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>GoToName</name>\r
+          <state>main</state>\r
+        </option>\r
+        <option>\r
+          <name>MemOverride</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OCProcessor</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>d24BitData</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Debugger code model</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OCNrOfVirtualRegisters</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Sim extended stack</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Debugger DPTR Settings</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Debugger Code Banking</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>DebuggerMandatory</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>DynDriver</name>\r
+          <state>CHIPCON_ID</state>\r
+        </option>\r
+        <option>\r
+          <name>Debugger Extra Options Check</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Debugger Extra Options Edit</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>Debugger data model</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OCImagesSuppressCheck1</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OCImagesPath1</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>OCImagesSuppressCheck2</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OCImagesPath2</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>OCImagesSuppressCheck3</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OCImagesPath3</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>DdfFile slave</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>DdfFile master</name>\r
+          <state>$TOOLKIT_DIR$\config\devices\_generic\io8052.ddf</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>_3RD_ID</name>\r
+      <archiveVersion>1</archiveVersion>\r
+      <data>\r
+        <version>0</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>Third-Party Driver Mandatory</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Third-Party Driver File Name Edit</name>\r
+          <state>ThirdPartyDriver.dll</state>\r
+        </option>\r
+        <option>\r
+          <name>Third-Party Driver LogFile Check</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Third-Party Driver LogFile Edit</name>\r
+          <state>cspycomm.log</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>CHIPCON_ID</name>\r
+      <archiveVersion>2</archiveVersion>\r
+      <data>\r
+        <version>3</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>ChipconDriverMandatory</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>ChipconEraseFlash</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>ChipconRetainMemory</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>ChipconSuppressDownload</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>ChipconVerifyDownload</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>ChipconVerifyRadio</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>ChipconReduceSpeed</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>ChipconStackOverflow</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>ChipconNoBanks</name>\r
+          <version>0</version>\r
+          <state>2</state>\r
+        </option>\r
+        <option>\r
+          <name>ChipconLogFileCheck</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>ChipconLogComFile</name>\r
+          <state>communication.log</state>\r
+        </option>\r
+        <option>\r
+          <name>ChipconFlashLock</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>ChipconFlashLockInfo</name>\r
+          <state>32k bytes (all pages)</state>\r
+        </option>\r
+        <option>\r
+          <name>ChipconBootLock</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>ChipconDebugLock</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>ChipconLockFlash</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>ChipconLockLabel</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>ChipconRetainPagesCtrl</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>ChipconRetainPages</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>ChipconFlashPages</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>ChipconFlashRadio</name>\r
+          <state>0</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>FS2_ID</name>\r
+      <archiveVersion>1</archiveVersion>\r
+      <data>\r
+        <version>0</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>Fs2DriverMandatory</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Configuration</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Has program RAM</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Program RAM areas</name>\r
+          <state>0x8000-0x87FF,0xC000-0xC7FF</state>\r
+        </option>\r
+        <option>\r
+          <name>Has program Flash</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Program Flash cfg entry</name>\r
+          <state>nRF24LU1</state>\r
+        </option>\r
+        <option>\r
+          <name>Program Flash areas</name>\r
+          <state>0x0000-0x7FFF</state>\r
+        </option>\r
+        <option>\r
+          <name>FS2SuppressDownload</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>FS2VerifyDownload</name>\r
+          <state>0</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>INFINEON_ID</name>\r
+      <archiveVersion>1</archiveVersion>\r
+      <data>\r
+        <version>0</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>InfineonDriverMandatory</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>InfineonEraseFlash</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>InfineonSuppressDownload</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>InfineonVerifyDownload</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>InfServerAddr</name>\r
+          <state>localhost</state>\r
+        </option>\r
+        <option>\r
+          <name>InfServerName</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>InfKey1</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>InfKey2</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>InfKey3</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>InfKey4</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>InfConnection</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>InfineonSwBp</name>\r
+          <state>0</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>NS_ID</name>\r
+      <archiveVersion>1</archiveVersion>\r
+      <data>\r
+        <version>0</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>NsDriverMandatory</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>NSSuppressDownload</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>NSVerifyDownload</name>\r
+          <state>0</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>ROM_ID</name>\r
+      <archiveVersion>1</archiveVersion>\r
+      <data>\r
+        <version>2</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>RomDriverMandatory</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>SuppressLoad</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>VerifyDownload</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AllComm</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Port</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Baud</name>\r
+          <version>0</version>\r
+          <state>6</state>\r
+        </option>\r
+        <option>\r
+          <name>Parity</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>DataBits</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>StopBits</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Handshake</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>DoLogfile</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>LogFile</name>\r
+          <state>cspycomm.log</state>\r
+        </option>\r
+        <option>\r
+          <name>ToggleDTR</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>ToggleRTS</name>\r
+          <state>0</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>AD2_ID</name>\r
+      <archiveVersion>2</archiveVersion>\r
+      <data>\r
+        <version>6</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>CygnalDriverMandatory</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CygnVerifyDownload</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Port</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Baud</name>\r
+          <version>0</version>\r
+          <state>6</state>\r
+        </option>\r
+        <option>\r
+          <name>CygnComm</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>ADuC8xx</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>ADuCpuClockFrequency</name>\r
+          <state>12582912</state>\r
+        </option>\r
+        <option>\r
+          <name>OverrideCpuClkFreq</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AD2EraseDataFlash</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Debug Interface</name>\r
+          <state>0</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>CYGNAL_ID</name>\r
+      <archiveVersion>1</archiveVersion>\r
+      <data>\r
+        <version>1</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>CygnalDriverMandatory</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CygnSuppressLoad</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CygnVerifyDownload</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CygnProtocol</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Port</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Baud</name>\r
+          <version>0</version>\r
+          <state>4</state>\r
+        </option>\r
+        <option>\r
+          <name>CygnComm</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>drv_silabs_page_size</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>SilabsUsb</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>SilabsPowerTarget</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>SilabsMulDevices</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>SilabsDevBefore</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>SilabsDevAfter</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>SilabsRegBefore</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>SilabsRegAfter</name>\r
+          <state>0</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>_SENSIUM_ID</name>\r
+      <archiveVersion>1</archiveVersion>\r
+      <data>\r
+        <version>0</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>TI Sensium Driver Mandatory</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>TI Sensium Driver File Name Edit</name>\r
+          <state>tiSensiumDbg.dll</state>\r
+        </option>\r
+        <option>\r
+          <name>TI Sensium Driver LogFile Check</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>TI Sensium Driver LogFile Edit</name>\r
+          <state>cspycomm.log</state>\r
+        </option>\r
+        <option>\r
+          <name>SensiumSuppressDownload</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>SensiumVerifyDownload</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>SensiumES2</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>SensiumProgramEPROM</name>\r
+          <state>0</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>SIM_ID</name>\r
+      <archiveVersion>1</archiveVersion>\r
+      <data>\r
+        <version>1</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>SimDriverMandatory</name>\r
+          <state>1</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <debuggerPlugins>\r
+      <plugin>\r
+        <file>$EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin</file>\r
+        <loadFlag>1</loadFlag>\r
+      </plugin>\r
+      <plugin>\r
+        <file>$EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin</file>\r
+        <loadFlag>0</loadFlag>\r
+      </plugin>\r
+      <plugin>\r
+        <file>$EW_DIR$\common\plugins\Profiling\Profiling.ENU.ewplugin</file>\r
+        <loadFlag>1</loadFlag>\r
+      </plugin>\r
+      <plugin>\r
+        <file>$EW_DIR$\common\plugins\Stack\Stack.ENU.ewplugin</file>\r
+        <loadFlag>1</loadFlag>\r
+      </plugin>\r
+      <plugin>\r
+        <file>$EW_DIR$\common\plugins\SymList\SymList.ENU.ewplugin</file>\r
+        <loadFlag>1</loadFlag>\r
+      </plugin>\r
+    </debuggerPlugins>\r
+  </configuration>\r
+  <configuration>\r
+    <name>915MHz - Unrestricted IAR Workbench (USA)</name>\r
+    <toolchain>\r
+      <name>8051</name>\r
+    </toolchain>\r
+    <debug>1</debug>\r
+    <settings>\r
+      <name>C-SPY</name>\r
+      <archiveVersion>2</archiveVersion>\r
+      <data>\r
+        <version>7</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>CInput</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>MacOverride</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>MacFile</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>GoToEnable</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>GoToName</name>\r
+          <state>main</state>\r
+        </option>\r
+        <option>\r
+          <name>MemOverride</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OCProcessor</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>d24BitData</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Debugger code model</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OCNrOfVirtualRegisters</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Sim extended stack</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Debugger DPTR Settings</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Debugger Code Banking</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>DebuggerMandatory</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>DynDriver</name>\r
+          <state>CHIPCON_ID</state>\r
+        </option>\r
+        <option>\r
+          <name>Debugger Extra Options Check</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Debugger Extra Options Edit</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>Debugger data model</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OCImagesSuppressCheck1</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OCImagesPath1</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>OCImagesSuppressCheck2</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OCImagesPath2</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>OCImagesSuppressCheck3</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OCImagesPath3</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>DdfFile slave</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>DdfFile master</name>\r
+          <state>$TOOLKIT_DIR$\config\devices\_generic\io8052.ddf</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>_3RD_ID</name>\r
+      <archiveVersion>1</archiveVersion>\r
+      <data>\r
+        <version>0</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>Third-Party Driver Mandatory</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Third-Party Driver File Name Edit</name>\r
+          <state>ThirdPartyDriver.dll</state>\r
+        </option>\r
+        <option>\r
+          <name>Third-Party Driver LogFile Check</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Third-Party Driver LogFile Edit</name>\r
+          <state>cspycomm.log</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>CHIPCON_ID</name>\r
+      <archiveVersion>2</archiveVersion>\r
+      <data>\r
+        <version>3</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>ChipconDriverMandatory</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>ChipconEraseFlash</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>ChipconRetainMemory</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>ChipconSuppressDownload</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>ChipconVerifyDownload</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>ChipconVerifyRadio</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>ChipconReduceSpeed</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>ChipconStackOverflow</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>ChipconNoBanks</name>\r
+          <version>0</version>\r
+          <state>2</state>\r
+        </option>\r
+        <option>\r
+          <name>ChipconLogFileCheck</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>ChipconLogComFile</name>\r
+          <state>communication.log</state>\r
+        </option>\r
+        <option>\r
+          <name>ChipconFlashLock</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>ChipconFlashLockInfo</name>\r
+          <state>32k bytes (all pages)</state>\r
+        </option>\r
+        <option>\r
+          <name>ChipconBootLock</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>ChipconDebugLock</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>ChipconLockFlash</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>ChipconLockLabel</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>ChipconRetainPagesCtrl</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>ChipconRetainPages</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>ChipconFlashPages</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>ChipconFlashRadio</name>\r
+          <state>0</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>FS2_ID</name>\r
+      <archiveVersion>1</archiveVersion>\r
+      <data>\r
+        <version>0</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>Fs2DriverMandatory</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Configuration</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Has program RAM</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Program RAM areas</name>\r
+          <state>0x8000-0x87FF,0xC000-0xC7FF</state>\r
+        </option>\r
+        <option>\r
+          <name>Has program Flash</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Program Flash cfg entry</name>\r
+          <state>nRF24LU1</state>\r
+        </option>\r
+        <option>\r
+          <name>Program Flash areas</name>\r
+          <state>0x0000-0x7FFF</state>\r
+        </option>\r
+        <option>\r
+          <name>FS2SuppressDownload</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>FS2VerifyDownload</name>\r
+          <state>0</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>INFINEON_ID</name>\r
+      <archiveVersion>1</archiveVersion>\r
+      <data>\r
+        <version>0</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>InfineonDriverMandatory</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>InfineonEraseFlash</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>InfineonSuppressDownload</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>InfineonVerifyDownload</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>InfServerAddr</name>\r
+          <state>localhost</state>\r
+        </option>\r
+        <option>\r
+          <name>InfServerName</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>InfKey1</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>InfKey2</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>InfKey3</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>InfKey4</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>InfConnection</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>InfineonSwBp</name>\r
+          <state>0</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>NS_ID</name>\r
+      <archiveVersion>1</archiveVersion>\r
+      <data>\r
+        <version>0</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>NsDriverMandatory</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>NSSuppressDownload</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>NSVerifyDownload</name>\r
+          <state>0</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>ROM_ID</name>\r
+      <archiveVersion>1</archiveVersion>\r
+      <data>\r
+        <version>2</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>RomDriverMandatory</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>SuppressLoad</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>VerifyDownload</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AllComm</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Port</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Baud</name>\r
+          <version>0</version>\r
+          <state>6</state>\r
+        </option>\r
+        <option>\r
+          <name>Parity</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>DataBits</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>StopBits</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Handshake</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>DoLogfile</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>LogFile</name>\r
+          <state>cspycomm.log</state>\r
+        </option>\r
+        <option>\r
+          <name>ToggleDTR</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>ToggleRTS</name>\r
+          <state>0</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>AD2_ID</name>\r
+      <archiveVersion>2</archiveVersion>\r
+      <data>\r
+        <version>6</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>CygnalDriverMandatory</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CygnVerifyDownload</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Port</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Baud</name>\r
+          <version>0</version>\r
+          <state>6</state>\r
+        </option>\r
+        <option>\r
+          <name>CygnComm</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>ADuC8xx</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>ADuCpuClockFrequency</name>\r
+          <state>12582912</state>\r
+        </option>\r
+        <option>\r
+          <name>OverrideCpuClkFreq</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AD2EraseDataFlash</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Debug Interface</name>\r
+          <state>0</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>CYGNAL_ID</name>\r
+      <archiveVersion>1</archiveVersion>\r
+      <data>\r
+        <version>1</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>CygnalDriverMandatory</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CygnSuppressLoad</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CygnVerifyDownload</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CygnProtocol</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Port</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Baud</name>\r
+          <version>0</version>\r
+          <state>4</state>\r
+        </option>\r
+        <option>\r
+          <name>CygnComm</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>drv_silabs_page_size</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>SilabsUsb</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>SilabsPowerTarget</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>SilabsMulDevices</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>SilabsDevBefore</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>SilabsDevAfter</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>SilabsRegBefore</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>SilabsRegAfter</name>\r
+          <state>0</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>_SENSIUM_ID</name>\r
+      <archiveVersion>1</archiveVersion>\r
+      <data>\r
+        <version>0</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>TI Sensium Driver Mandatory</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>TI Sensium Driver File Name Edit</name>\r
+          <state>tiSensiumDbg.dll</state>\r
+        </option>\r
+        <option>\r
+          <name>TI Sensium Driver LogFile Check</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>TI Sensium Driver LogFile Edit</name>\r
+          <state>cspycomm.log</state>\r
+        </option>\r
+        <option>\r
+          <name>SensiumSuppressDownload</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>SensiumVerifyDownload</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>SensiumES2</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>SensiumProgramEPROM</name>\r
+          <state>0</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>SIM_ID</name>\r
+      <archiveVersion>1</archiveVersion>\r
+      <data>\r
+        <version>1</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>SimDriverMandatory</name>\r
+          <state>1</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <debuggerPlugins>\r
+      <plugin>\r
+        <file>$EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin</file>\r
+        <loadFlag>1</loadFlag>\r
+      </plugin>\r
+      <plugin>\r
+        <file>$EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin</file>\r
+        <loadFlag>0</loadFlag>\r
+      </plugin>\r
+      <plugin>\r
+        <file>$EW_DIR$\common\plugins\Profiling\Profiling.ENU.ewplugin</file>\r
+        <loadFlag>1</loadFlag>\r
+      </plugin>\r
+      <plugin>\r
+        <file>$EW_DIR$\common\plugins\Stack\Stack.ENU.ewplugin</file>\r
+        <loadFlag>1</loadFlag>\r
+      </plugin>\r
+      <plugin>\r
+        <file>$EW_DIR$\common\plugins\SymList\SymList.ENU.ewplugin</file>\r
+        <loadFlag>1</loadFlag>\r
+      </plugin>\r
+    </debuggerPlugins>\r
+  </configuration>\r
+  <configuration>\r
+    <name>868MHz - Unrestricted IAR Workbench (Europe)</name>\r
+    <toolchain>\r
+      <name>8051</name>\r
+    </toolchain>\r
+    <debug>1</debug>\r
+    <settings>\r
+      <name>C-SPY</name>\r
+      <archiveVersion>2</archiveVersion>\r
+      <data>\r
+        <version>7</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>CInput</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>MacOverride</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>MacFile</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>GoToEnable</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>GoToName</name>\r
+          <state>main</state>\r
+        </option>\r
+        <option>\r
+          <name>MemOverride</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OCProcessor</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>d24BitData</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Debugger code model</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OCNrOfVirtualRegisters</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Sim extended stack</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Debugger DPTR Settings</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Debugger Code Banking</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>DebuggerMandatory</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>DynDriver</name>\r
+          <state>CHIPCON_ID</state>\r
+        </option>\r
+        <option>\r
+          <name>Debugger Extra Options Check</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Debugger Extra Options Edit</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>Debugger data model</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OCImagesSuppressCheck1</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OCImagesPath1</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>OCImagesSuppressCheck2</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OCImagesPath2</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>OCImagesSuppressCheck3</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OCImagesPath3</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>DdfFile slave</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>DdfFile master</name>\r
+          <state>$TOOLKIT_DIR$\config\devices\_generic\io8052.ddf</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>_3RD_ID</name>\r
+      <archiveVersion>1</archiveVersion>\r
+      <data>\r
+        <version>0</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>Third-Party Driver Mandatory</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Third-Party Driver File Name Edit</name>\r
+          <state>ThirdPartyDriver.dll</state>\r
+        </option>\r
+        <option>\r
+          <name>Third-Party Driver LogFile Check</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Third-Party Driver LogFile Edit</name>\r
+          <state>cspycomm.log</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>CHIPCON_ID</name>\r
+      <archiveVersion>2</archiveVersion>\r
+      <data>\r
+        <version>3</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>ChipconDriverMandatory</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>ChipconEraseFlash</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>ChipconRetainMemory</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>ChipconSuppressDownload</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>ChipconVerifyDownload</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>ChipconVerifyRadio</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>ChipconReduceSpeed</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>ChipconStackOverflow</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>ChipconNoBanks</name>\r
+          <version>0</version>\r
+          <state>2</state>\r
+        </option>\r
+        <option>\r
+          <name>ChipconLogFileCheck</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>ChipconLogComFile</name>\r
+          <state>communication.log</state>\r
+        </option>\r
+        <option>\r
+          <name>ChipconFlashLock</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>ChipconFlashLockInfo</name>\r
+          <state>32k bytes (all pages)</state>\r
+        </option>\r
+        <option>\r
+          <name>ChipconBootLock</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>ChipconDebugLock</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>ChipconLockFlash</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>ChipconLockLabel</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>ChipconRetainPagesCtrl</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>ChipconRetainPages</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>ChipconFlashPages</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>ChipconFlashRadio</name>\r
+          <state>0</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>FS2_ID</name>\r
+      <archiveVersion>1</archiveVersion>\r
+      <data>\r
+        <version>0</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>Fs2DriverMandatory</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Configuration</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Has program RAM</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Program RAM areas</name>\r
+          <state>0x8000-0x87FF,0xC000-0xC7FF</state>\r
+        </option>\r
+        <option>\r
+          <name>Has program Flash</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Program Flash cfg entry</name>\r
+          <state>nRF24LU1</state>\r
+        </option>\r
+        <option>\r
+          <name>Program Flash areas</name>\r
+          <state>0x0000-0x7FFF</state>\r
+        </option>\r
+        <option>\r
+          <name>FS2SuppressDownload</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>FS2VerifyDownload</name>\r
+          <state>0</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>INFINEON_ID</name>\r
+      <archiveVersion>1</archiveVersion>\r
+      <data>\r
+        <version>0</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>InfineonDriverMandatory</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>InfineonEraseFlash</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>InfineonSuppressDownload</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>InfineonVerifyDownload</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>InfServerAddr</name>\r
+          <state>localhost</state>\r
+        </option>\r
+        <option>\r
+          <name>InfServerName</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>InfKey1</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>InfKey2</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>InfKey3</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>InfKey4</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>InfConnection</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>InfineonSwBp</name>\r
+          <state>0</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>NS_ID</name>\r
+      <archiveVersion>1</archiveVersion>\r
+      <data>\r
+        <version>0</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>NsDriverMandatory</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>NSSuppressDownload</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>NSVerifyDownload</name>\r
+          <state>0</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>ROM_ID</name>\r
+      <archiveVersion>1</archiveVersion>\r
+      <data>\r
+        <version>2</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>RomDriverMandatory</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>SuppressLoad</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>VerifyDownload</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AllComm</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Port</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Baud</name>\r
+          <version>0</version>\r
+          <state>6</state>\r
+        </option>\r
+        <option>\r
+          <name>Parity</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>DataBits</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>StopBits</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Handshake</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>DoLogfile</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>LogFile</name>\r
+          <state>cspycomm.log</state>\r
+        </option>\r
+        <option>\r
+          <name>ToggleDTR</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>ToggleRTS</name>\r
+          <state>0</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>AD2_ID</name>\r
+      <archiveVersion>2</archiveVersion>\r
+      <data>\r
+        <version>6</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>CygnalDriverMandatory</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CygnVerifyDownload</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Port</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Baud</name>\r
+          <version>0</version>\r
+          <state>6</state>\r
+        </option>\r
+        <option>\r
+          <name>CygnComm</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>ADuC8xx</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>ADuCpuClockFrequency</name>\r
+          <state>12582912</state>\r
+        </option>\r
+        <option>\r
+          <name>OverrideCpuClkFreq</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AD2EraseDataFlash</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Debug Interface</name>\r
+          <state>0</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>CYGNAL_ID</name>\r
+      <archiveVersion>1</archiveVersion>\r
+      <data>\r
+        <version>1</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>CygnalDriverMandatory</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CygnSuppressLoad</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CygnVerifyDownload</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CygnProtocol</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Port</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Baud</name>\r
+          <version>0</version>\r
+          <state>4</state>\r
+        </option>\r
+        <option>\r
+          <name>CygnComm</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>drv_silabs_page_size</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>SilabsUsb</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>SilabsPowerTarget</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>SilabsMulDevices</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>SilabsDevBefore</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>SilabsDevAfter</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>SilabsRegBefore</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>SilabsRegAfter</name>\r
+          <state>0</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>_SENSIUM_ID</name>\r
+      <archiveVersion>1</archiveVersion>\r
+      <data>\r
+        <version>0</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>TI Sensium Driver Mandatory</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>TI Sensium Driver File Name Edit</name>\r
+          <state>tiSensiumDbg.dll</state>\r
+        </option>\r
+        <option>\r
+          <name>TI Sensium Driver LogFile Check</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>TI Sensium Driver LogFile Edit</name>\r
+          <state>cspycomm.log</state>\r
+        </option>\r
+        <option>\r
+          <name>SensiumSuppressDownload</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>SensiumVerifyDownload</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>SensiumES2</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>SensiumProgramEPROM</name>\r
+          <state>0</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>SIM_ID</name>\r
+      <archiveVersion>1</archiveVersion>\r
+      <data>\r
+        <version>1</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>SimDriverMandatory</name>\r
+          <state>1</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <debuggerPlugins>\r
+      <plugin>\r
+        <file>$EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin</file>\r
+        <loadFlag>1</loadFlag>\r
+      </plugin>\r
+      <plugin>\r
+        <file>$EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin</file>\r
+        <loadFlag>0</loadFlag>\r
+      </plugin>\r
+      <plugin>\r
+        <file>$EW_DIR$\common\plugins\Profiling\Profiling.ENU.ewplugin</file>\r
+        <loadFlag>1</loadFlag>\r
+      </plugin>\r
+      <plugin>\r
+        <file>$EW_DIR$\common\plugins\Stack\Stack.ENU.ewplugin</file>\r
+        <loadFlag>1</loadFlag>\r
+      </plugin>\r
+      <plugin>\r
+        <file>$EW_DIR$\common\plugins\SymList\SymList.ENU.ewplugin</file>\r
+        <loadFlag>1</loadFlag>\r
+      </plugin>\r
+    </debuggerPlugins>\r
+  </configuration>\r
+  <configuration>\r
+    <name>433MHz - Unrestricted IAR Workbench (Other regions)</name>\r
+    <toolchain>\r
+      <name>8051</name>\r
+    </toolchain>\r
+    <debug>1</debug>\r
+    <settings>\r
+      <name>C-SPY</name>\r
+      <archiveVersion>2</archiveVersion>\r
+      <data>\r
+        <version>7</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>CInput</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>MacOverride</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>MacFile</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>GoToEnable</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>GoToName</name>\r
+          <state>main</state>\r
+        </option>\r
+        <option>\r
+          <name>MemOverride</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OCProcessor</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>d24BitData</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Debugger code model</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OCNrOfVirtualRegisters</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Sim extended stack</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Debugger DPTR Settings</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Debugger Code Banking</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>DebuggerMandatory</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>DynDriver</name>\r
+          <state>CHIPCON_ID</state>\r
+        </option>\r
+        <option>\r
+          <name>Debugger Extra Options Check</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Debugger Extra Options Edit</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>Debugger data model</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OCImagesSuppressCheck1</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OCImagesPath1</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>OCImagesSuppressCheck2</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OCImagesPath2</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>OCImagesSuppressCheck3</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OCImagesPath3</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>DdfFile slave</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>DdfFile master</name>\r
+          <state>$TOOLKIT_DIR$\config\devices\_generic\io8052.ddf</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>_3RD_ID</name>\r
+      <archiveVersion>1</archiveVersion>\r
+      <data>\r
+        <version>0</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>Third-Party Driver Mandatory</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Third-Party Driver File Name Edit</name>\r
+          <state>ThirdPartyDriver.dll</state>\r
+        </option>\r
+        <option>\r
+          <name>Third-Party Driver LogFile Check</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Third-Party Driver LogFile Edit</name>\r
+          <state>cspycomm.log</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>CHIPCON_ID</name>\r
+      <archiveVersion>2</archiveVersion>\r
+      <data>\r
+        <version>3</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>ChipconDriverMandatory</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>ChipconEraseFlash</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>ChipconRetainMemory</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>ChipconSuppressDownload</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>ChipconVerifyDownload</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>ChipconVerifyRadio</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>ChipconReduceSpeed</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>ChipconStackOverflow</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>ChipconNoBanks</name>\r
+          <version>0</version>\r
+          <state>2</state>\r
+        </option>\r
+        <option>\r
+          <name>ChipconLogFileCheck</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>ChipconLogComFile</name>\r
+          <state>communication.log</state>\r
+        </option>\r
+        <option>\r
+          <name>ChipconFlashLock</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>ChipconFlashLockInfo</name>\r
+          <state>32k bytes (all pages)</state>\r
+        </option>\r
+        <option>\r
+          <name>ChipconBootLock</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>ChipconDebugLock</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>ChipconLockFlash</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>ChipconLockLabel</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>ChipconRetainPagesCtrl</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>ChipconRetainPages</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>ChipconFlashPages</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>ChipconFlashRadio</name>\r
+          <state>0</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>FS2_ID</name>\r
+      <archiveVersion>1</archiveVersion>\r
+      <data>\r
+        <version>0</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>Fs2DriverMandatory</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Configuration</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Has program RAM</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Program RAM areas</name>\r
+          <state>0x8000-0x87FF,0xC000-0xC7FF</state>\r
+        </option>\r
+        <option>\r
+          <name>Has program Flash</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Program Flash cfg entry</name>\r
+          <state>nRF24LU1</state>\r
+        </option>\r
+        <option>\r
+          <name>Program Flash areas</name>\r
+          <state>0x0000-0x7FFF</state>\r
+        </option>\r
+        <option>\r
+          <name>FS2SuppressDownload</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>FS2VerifyDownload</name>\r
+          <state>0</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>INFINEON_ID</name>\r
+      <archiveVersion>1</archiveVersion>\r
+      <data>\r
+        <version>0</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>InfineonDriverMandatory</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>InfineonEraseFlash</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>InfineonSuppressDownload</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>InfineonVerifyDownload</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>InfServerAddr</name>\r
+          <state>localhost</state>\r
+        </option>\r
+        <option>\r
+          <name>InfServerName</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>InfKey1</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>InfKey2</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>InfKey3</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>InfKey4</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>InfConnection</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>InfineonSwBp</name>\r
+          <state>0</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>NS_ID</name>\r
+      <archiveVersion>1</archiveVersion>\r
+      <data>\r
+        <version>0</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>NsDriverMandatory</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>NSSuppressDownload</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>NSVerifyDownload</name>\r
+          <state>0</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>ROM_ID</name>\r
+      <archiveVersion>1</archiveVersion>\r
+      <data>\r
+        <version>2</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>RomDriverMandatory</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>SuppressLoad</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>VerifyDownload</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AllComm</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Port</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Baud</name>\r
+          <version>0</version>\r
+          <state>6</state>\r
+        </option>\r
+        <option>\r
+          <name>Parity</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>DataBits</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>StopBits</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Handshake</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>DoLogfile</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>LogFile</name>\r
+          <state>cspycomm.log</state>\r
+        </option>\r
+        <option>\r
+          <name>ToggleDTR</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>ToggleRTS</name>\r
+          <state>0</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>AD2_ID</name>\r
+      <archiveVersion>2</archiveVersion>\r
+      <data>\r
+        <version>6</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>CygnalDriverMandatory</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CygnVerifyDownload</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Port</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Baud</name>\r
+          <version>0</version>\r
+          <state>6</state>\r
+        </option>\r
+        <option>\r
+          <name>CygnComm</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>ADuC8xx</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>ADuCpuClockFrequency</name>\r
+          <state>12582912</state>\r
+        </option>\r
+        <option>\r
+          <name>OverrideCpuClkFreq</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AD2EraseDataFlash</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Debug Interface</name>\r
+          <state>0</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>CYGNAL_ID</name>\r
+      <archiveVersion>1</archiveVersion>\r
+      <data>\r
+        <version>1</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>CygnalDriverMandatory</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CygnSuppressLoad</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CygnVerifyDownload</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CygnProtocol</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Port</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Baud</name>\r
+          <version>0</version>\r
+          <state>4</state>\r
+        </option>\r
+        <option>\r
+          <name>CygnComm</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>drv_silabs_page_size</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>SilabsUsb</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>SilabsPowerTarget</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>SilabsMulDevices</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>SilabsDevBefore</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>SilabsDevAfter</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>SilabsRegBefore</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>SilabsRegAfter</name>\r
+          <state>0</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>_SENSIUM_ID</name>\r
+      <archiveVersion>1</archiveVersion>\r
+      <data>\r
+        <version>0</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>TI Sensium Driver Mandatory</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>TI Sensium Driver File Name Edit</name>\r
+          <state>tiSensiumDbg.dll</state>\r
+        </option>\r
+        <option>\r
+          <name>TI Sensium Driver LogFile Check</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>TI Sensium Driver LogFile Edit</name>\r
+          <state>cspycomm.log</state>\r
+        </option>\r
+        <option>\r
+          <name>SensiumSuppressDownload</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>SensiumVerifyDownload</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>SensiumES2</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>SensiumProgramEPROM</name>\r
+          <state>0</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>SIM_ID</name>\r
+      <archiveVersion>1</archiveVersion>\r
+      <data>\r
+        <version>1</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>SimDriverMandatory</name>\r
+          <state>1</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <debuggerPlugins>\r
+      <plugin>\r
+        <file>$EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin</file>\r
+        <loadFlag>1</loadFlag>\r
+      </plugin>\r
+      <plugin>\r
+        <file>$EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin</file>\r
+        <loadFlag>0</loadFlag>\r
+      </plugin>\r
+      <plugin>\r
+        <file>$EW_DIR$\common\plugins\Profiling\Profiling.ENU.ewplugin</file>\r
+        <loadFlag>1</loadFlag>\r
+      </plugin>\r
+      <plugin>\r
+        <file>$EW_DIR$\common\plugins\Stack\Stack.ENU.ewplugin</file>\r
+        <loadFlag>1</loadFlag>\r
+      </plugin>\r
+      <plugin>\r
+        <file>$EW_DIR$\common\plugins\SymList\SymList.ENU.ewplugin</file>\r
+        <loadFlag>1</loadFlag>\r
+      </plugin>\r
+    </debuggerPlugins>\r
+  </configuration>\r
+</project>\r
+\r
+\r
diff --git a/chronos-ti/Software Projects/RF Access Point/IAR/cc1111_usb_dongle.ewp b/chronos-ti/Software Projects/RF Access Point/IAR/cc1111_usb_dongle.ewp
new file mode 100755 (executable)
index 0000000..3686fbc
--- /dev/null
@@ -0,0 +1,6787 @@
+<?xml version="1.0" encoding="iso-8859-1"?>\r
+\r
+<project>\r
+  <fileVersion>2</fileVersion>\r
+  <configuration>\r
+    <name>915MHz - Limited IAR Kickstart (USA)</name>\r
+    <toolchain>\r
+      <name>8051</name>\r
+    </toolchain>\r
+    <debug>1</debug>\r
+    <settings>\r
+      <name>General</name>\r
+      <archiveVersion>1</archiveVersion>\r
+      <data>\r
+        <version>4</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>DerivativeDescriptionFile</name>\r
+          <state>$TOOLKIT_DIR$\config\devices\Texas Instruments\CC1111.i51</state>\r
+        </option>\r
+        <option>\r
+          <name>Previous Derivative File</name>\r
+          <state>$TOOLKIT_DIR$\config\devices\Texas Instruments\CC1111.i51</state>\r
+        </option>\r
+        <option>\r
+          <name>Showed Derivative</name>\r
+          <state>CC1111</state>\r
+        </option>\r
+        <option>\r
+          <name>CPU Core</name>\r
+          <version>1</version>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CPU Core Slave</name>\r
+          <version>1</version>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Code Memory Model</name>\r
+          <version>1</version>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Code Memory Model slave</name>\r
+          <version>1</version>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Data Memory Model</name>\r
+          <version>0</version>\r
+          <state>2</state>\r
+        </option>\r
+        <option>\r
+          <name>Data Memory Model slave</name>\r
+          <version>0</version>\r
+          <state>2</state>\r
+        </option>\r
+        <option>\r
+          <name>Use extended stack</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Use extended stack slave</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Start of extended stack</name>\r
+          <state>0x002000</state>\r
+        </option>\r
+        <option>\r
+          <name>Calling convention</name>\r
+          <version>0</version>\r
+          <state>4</state>\r
+        </option>\r
+        <option>\r
+          <name>Workseg Size</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Constant Placement</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Datapointer Size</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Nr of Datapointers</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Switch Method</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Mask Value</name>\r
+          <state>0x00</state>\r
+        </option>\r
+        <option>\r
+          <name>DPS Address</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>Sfr Visibility</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>DPTR Addresses</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>CodeBankReg</name>\r
+          <state>0x90</state>\r
+        </option>\r
+        <option>\r
+          <name>CodeBankStart</name>\r
+          <state>0x8000</state>\r
+        </option>\r
+        <option>\r
+          <name>CodeBankSize</name>\r
+          <state>0xFFFF</state>\r
+        </option>\r
+        <option>\r
+          <name>ExePath</name>\r
+          <state>915MHz - Limited IAR Kickstart (USA)\Exe</state>\r
+        </option>\r
+        <option>\r
+          <name>ObjPath</name>\r
+          <state>915MHz - Limited IAR Kickstart (USA)\Obj</state>\r
+        </option>\r
+        <option>\r
+          <name>ListPath</name>\r
+          <state>915MHz - Limited IAR Kickstart (USA)\List</state>\r
+        </option>\r
+        <option>\r
+          <name>GOutputBinary</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>GRuntimeLibSelect</name>\r
+          <version>0</version>\r
+          <state>4</state>\r
+        </option>\r
+        <option>\r
+          <name>GRuntimeLibSelectSlave</name>\r
+          <version>0</version>\r
+          <state>4</state>\r
+        </option>\r
+        <option>\r
+          <name>RTDescription</name>\r
+          <state>Use the legacy C runtime library.</state>\r
+        </option>\r
+        <option>\r
+          <name>RTConfigPath</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>RTLibraryPath</name>\r
+          <state>$TOOLKIT_DIR$\LIB\CLIB\cl-pli-nlxd-1e16x01.r51</state>\r
+        </option>\r
+        <option>\r
+          <name>Input variant</name>\r
+          <version>0</version>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Input description</name>\r
+          <state>Full formatting.</state>\r
+        </option>\r
+        <option>\r
+          <name>Output variant</name>\r
+          <version>0</version>\r
+          <state>3</state>\r
+        </option>\r
+        <option>\r
+          <name>Output description</name>\r
+          <state>No float, no field width, no precision.</state>\r
+        </option>\r
+        <option>\r
+          <name>GeneralEnableMisra</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>GeneralMisraVerbose</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>General Idata Stack Size</name>\r
+          <state>0xb0</state>\r
+        </option>\r
+        <option>\r
+          <name>General Pdata Stack Size</name>\r
+          <state>0x80</state>\r
+        </option>\r
+        <option>\r
+          <name>General Xdata Stack Size</name>\r
+          <state>0x3ff</state>\r
+        </option>\r
+        <option>\r
+          <name>General Ext Stack Size</name>\r
+          <state>0x3FF</state>\r
+        </option>\r
+        <option>\r
+          <name>General Xdata Heap Size</name>\r
+          <state>0xFF</state>\r
+        </option>\r
+        <option>\r
+          <name>General Far Heap Size</name>\r
+          <state>0xFFF</state>\r
+        </option>\r
+        <option>\r
+          <name>General Huge Heap Size</name>\r
+          <state>0xFFF</state>\r
+        </option>\r
+        <option>\r
+          <name>CodeBankNrOfs</name>\r
+          <state>0x03</state>\r
+        </option>\r
+        <option>\r
+          <name>CodeBankRegMask</name>\r
+          <state>0x30</state>\r
+        </option>\r
+        <option>\r
+          <name>GeneralMisraRules98</name>\r
+          <version>0</version>\r
+          <state>1000111110110101101110011100111111101110011011000101110111101101100111111111111100110011111001110111001111111111111111111111111</state>\r
+        </option>\r
+        <option>\r
+          <name>PDATA 8-15 register address</name>\r
+          <state>0xA0</state>\r
+        </option>\r
+        <option>\r
+          <name>PDATA 16-31 register address</name>\r
+          <state>0xEA</state>\r
+        </option>\r
+        <option>\r
+          <name>General Far22 Heap Size</name>\r
+          <state>0xFFF</state>\r
+        </option>\r
+        <option>\r
+          <name>GeneralMisraVer</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>GeneralMisraRules04</name>\r
+          <version>0</version>\r
+          <state>111101110010111111111000110111111111111111111111111110010111101111010101111111111111111111111111101111111011111001111011111011111111111111111</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>ICC8051</name>\r
+      <archiveVersion>3</archiveVersion>\r
+      <data>\r
+        <version>7</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>CCOptSizeSpeedSlave</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCOptimizationSlave</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OutputFile</name>\r
+          <state>$FILE_BNAME$.r51</state>\r
+        </option>\r
+        <option>\r
+          <name>CCDefines</name>\r
+          <state>ISM_US</state>\r
+          <state>MCU_H=&lt;ioCC1111.h></state>\r
+          <state>chip=1111</state>\r
+          <state>RF_FREQUENCY=915000</state>\r
+          <state>MRFI_CC1111</state>\r
+          <state>NDEBUG</state>\r
+        </option>\r
+        <option>\r
+          <name>CCPreprocFile</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCPreprocComments</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCPreprocLine</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCListCFile</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CCListCMnemonics</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CCListCMessages</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CCListAssFile</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCListAssSource</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCEnableRemarks</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCDiagSuppress</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>CCDiagRemark</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>CCDiagWarning</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>CCDiagError</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>CCObjPrefix</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>LangConform</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CharIs</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CCRequirePrototypes</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCMultibyteSupport</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCMigrationPreprocExtentions</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCAllowList</name>\r
+          <version>1</version>\r
+          <state>10010</state>\r
+        </option>\r
+        <option>\r
+          <name>CCObjUseModuleName</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCObjModuleName</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>CCDebugInfo</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OCCProcessorVariant</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OCCDptr</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OCCDataMemoryModel</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OCCCodeMemoryModel</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OCCCallingConvention</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OCCConstantPlacement</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OCCNrOfVirtualRegisters</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Extended stack</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CCDiagWarnAreErr</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCCompilerRuntimeInfo</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>RomMonBpPadding</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>PreInclude</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>CCLibConfigHeader</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CCLangSelect</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>NoUBROFMessages</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CompilerMisraOverride</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Compiler Extra Options Check</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Compiler Extra Options Edit</name>\r
+          <state>-f"$PROJ_DIR$\simpliciti\Configuration\Access Point\smpl_config.dat"</state>\r
+          <state>-f"$PROJ_DIR$\simpliciti\Configuration\smpl_nwk_config.dat"</state>\r
+        </option>\r
+        <option>\r
+          <name>CCIncludePath2</name>\r
+          <state>$PROJ_DIR$\bm-br1\</state>\r
+          <state>$PROJ_DIR$\HAL\include\</state>\r
+          <state>$PROJ_DIR$\HAL\source\</state>\r
+          <state>$PROJ_DIR$\wbsl\</state>\r
+          <state>$PROJ_DIR$\usb\</state>\r
+          <state>$PROJ_DIR$\usb\class_cdc\</state>\r
+          <state>$PROJ_DIR$\usb\library\</state>\r
+          <state>$PROJ_DIR$\usb\library\ccxx11</state>\r
+          <state>$PROJ_DIR$\sync\</state>\r
+          <state>$PROJ_DIR$\simpliciti\</state>\r
+          <state>$PROJ_DIR$\simpliciti\Components\bsp</state>\r
+          <state>$PROJ_DIR$\simpliciti\Components\bsp\drivers</state>\r
+          <state>$PROJ_DIR$\simpliciti\Components\bsp\boards\RFUSB</state>\r
+          <state>$PROJ_DIR$\simpliciti\Components\mrfi</state>\r
+          <state>$PROJ_DIR$\simpliciti\Components\nwk</state>\r
+          <state>$PROJ_DIR$\simpliciti\Components\nwk_applications</state>\r
+        </option>\r
+        <option>\r
+          <name>CCStdIncCheck</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCStdIncludePath</name>\r
+          <state>$TOOLKIT_DIR$\INC\</state>\r
+          <state>$TOOLKIT_DIR$\INC\CLIB\</state>\r
+        </option>\r
+        <option>\r
+          <name>CompilerMisraRules98</name>\r
+          <version>0</version>\r
+          <state>1000111110110101101110011100111111101110011011000101110111101101100111111111111100110011111001110111001111111111111111111111111</state>\r
+        </option>\r
+        <option>\r
+          <name>CCOverrideModuleTypeDefault</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCRadioModuleType</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCRadioModuleTypeSlave</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CCOptLevel</name>\r
+          <state>2</state>\r
+        </option>\r
+        <option>\r
+          <name>CCOptStrategy</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCOptLevelSlave</name>\r
+          <state>2</state>\r
+        </option>\r
+        <option>\r
+          <name>CompilerMisraRules04</name>\r
+          <version>0</version>\r
+          <state>111101110010111111111000110111111111111111111111111110010111101111010101111111111111111111111111101111111011111001111011111011111111111111111</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>A8051</name>\r
+      <archiveVersion>2</archiveVersion>\r
+      <data>\r
+        <version>4</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>OAProcessorVariant</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Generated Preproc defines</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AObjPrefix</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OutputFile</name>\r
+          <state>$FILE_BNAME$.r51</state>\r
+        </option>\r
+        <option>\r
+          <name>ACaseSensitivity</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>MacroChars</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Asm multibyte support</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Debug</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>AList</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AListHeader</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>AListing</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Includes</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>MacDefs</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>MacExps</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>MacExec</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OnlyAssed</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>MultiLine</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>NoStruct</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>PageLengthCheck</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>PageLength</name>\r
+          <state>80</state>\r
+        </option>\r
+        <option>\r
+          <name>TabSpacing</name>\r
+          <state>8</state>\r
+        </option>\r
+        <option>\r
+          <name>AXRef</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AXRefDefines</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AXRefInternal</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AXRefDual</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AIncludes</name>\r
+          <state>$TOOLKIT_DIR$\INC\</state>\r
+          <state>$PROJ_DIR$\</state>\r
+          <state>$PROJ_DIR$\USB\INCLUDE</state>\r
+          <state>$PROJ_DIR$\USB\SOURCE</state>\r
+        </option>\r
+        <option>\r
+          <name>ADefines</name>\r
+          <state>chip=1111</state>\r
+        </option>\r
+        <option>\r
+          <name>AWarnEnable</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AWarnWhat</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AWarnOne</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>AWarnRange1</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>AWarnRange2</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>Assembler Extra Options Check</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Assembler Extra Options Edit</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>AMaxErrOn</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AMaxErrNum</name>\r
+          <state>100</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>CUSTOM</name>\r
+      <archiveVersion>3</archiveVersion>\r
+      <data>\r
+        <extensions></extensions>\r
+        <cmdline></cmdline>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>BICOMP</name>\r
+      <archiveVersion>0</archiveVersion>\r
+      <data/>\r
+    </settings>\r
+    <settings>\r
+      <name>BUILDACTION</name>\r
+      <archiveVersion>1</archiveVersion>\r
+      <data>\r
+        <prebuild></prebuild>\r
+        <postbuild></postbuild>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>XLINK</name>\r
+      <archiveVersion>3</archiveVersion>\r
+      <data>\r
+        <version>17</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>XInfineonPFlashCacheBug</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OXLibIOConfig</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>XOutOverride</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OutputFile</name>\r
+          <state>ez430-chronos-AP-915MHz.hex</state>\r
+        </option>\r
+        <option>\r
+          <name>OutputFormat</name>\r
+          <version>11</version>\r
+          <state>23</state>\r
+        </option>\r
+        <option>\r
+          <name>FormatVariant</name>\r
+          <version>8</version>\r
+          <state>2</state>\r
+        </option>\r
+        <option>\r
+          <name>SecondaryOutputFile</name>\r
+          <state>(None for the selected format)</state>\r
+        </option>\r
+        <option>\r
+          <name>XDefines</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>AlwaysOutput</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OverlapWarnings</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>NoGlobalCheck</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>XList</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>SegmentMap</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>ListSymbols</name>\r
+          <state>2</state>\r
+        </option>\r
+        <option>\r
+          <name>PageLengthCheck</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>PageLength</name>\r
+          <state>80</state>\r
+        </option>\r
+        <option>\r
+          <name>XIncludes</name>\r
+          <state>$TOOLKIT_DIR$\LIB\</state>\r
+        </option>\r
+        <option>\r
+          <name>ModuleStatus</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>XclOverride</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>XclFile</name>\r
+          <state>$TOOLKIT_DIR$\config\lnk51ew_cc1111.xcl</state>\r
+        </option>\r
+        <option>\r
+          <name>XclFileSlave</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>Config Include Dir</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>XLink Dptr Switch mask</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OHXNrOfVirtualRegisters</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OHX DPS Address</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>XLINK Dptr Addresses</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Linker Code Banking</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>DoFill</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>FillerByte</name>\r
+          <state>0xFF</state>\r
+        </option>\r
+        <option>\r
+          <name>DoCrc</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CrcSize</name>\r
+          <version>0</version>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CrcAlgo</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CrcPoly</name>\r
+          <state>0x11021</state>\r
+        </option>\r
+        <option>\r
+          <name>CrcCompl</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>RangeCheckAlternatives</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>SuppressAllWarn</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>SuppressDiags</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>TreatAsWarn</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>TreatAsErr</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>ModuleLocalSym</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CrcBitOrder</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>IncludeSuppressed</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>ModuleSummary</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>xcProgramEntryLabel</name>\r
+          <state>__program_start</state>\r
+        </option>\r
+        <option>\r
+          <name>DebugInformation</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>RuntimeControl</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>IoEmulation</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>AllowExtraOutput</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>GenerateExtraOutput</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>XExtraOutOverride</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>ExtraOutputFile</name>\r
+          <state>cc1111_usb_dongle.sim</state>\r
+        </option>\r
+        <option>\r
+          <name>ExtraOutputFormat</name>\r
+          <version>11</version>\r
+          <state>60</state>\r
+        </option>\r
+        <option>\r
+          <name>ExtraFormatVariant</name>\r
+          <version>8</version>\r
+          <state>2</state>\r
+        </option>\r
+        <option>\r
+          <name>xcOverrideProgramEntryLabel</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>xcProgramEntryLabelSelect</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>ListOutputFormat</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>BufferedTermOutput</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OverlaySystemMap</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>RawBinaryFile</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>RawBinarySymbol</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>RawBinarySegment</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>RawBinaryAlign</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>XLinkMisraHandler</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>XcRTLibraryFile</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Linker Idata Stack Size</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Linker Ext Stack Size</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Linker Pdata Stack Size</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Linker Xdata Stack Size</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Linker Xdata Heap Size</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Linker Far Heap Size</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Linker Huge Heap Size</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Linker Extra Options Check</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Linker Extra Options Edit</name>\r
+          <state>--ks_version</state>\r
+        </option>\r
+        <option>\r
+          <name>CrcAlign</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CrcInitialValue</name>\r
+          <state>0x0</state>\r
+        </option>\r
+        <option>\r
+          <name>Linker Far22 Heap Size</name>\r
+          <state>1</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>XAR</name>\r
+      <archiveVersion>1</archiveVersion>\r
+      <data>\r
+        <version>0</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>XARInputs</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>XAROverride</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>XAR Standard name</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>XAROutput</name>\r
+          <state>###Uninitialized###</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>BILINK</name>\r
+      <archiveVersion>0</archiveVersion>\r
+      <data/>\r
+    </settings>\r
+  </configuration>\r
+  <configuration>\r
+    <name>868MHz - Limited IAR Kickstart (Europe)</name>\r
+    <toolchain>\r
+      <name>8051</name>\r
+    </toolchain>\r
+    <debug>1</debug>\r
+    <settings>\r
+      <name>General</name>\r
+      <archiveVersion>1</archiveVersion>\r
+      <data>\r
+        <version>4</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>DerivativeDescriptionFile</name>\r
+          <state>$TOOLKIT_DIR$\config\devices\Texas Instruments\CC1111F32.i51</state>\r
+        </option>\r
+        <option>\r
+          <name>Previous Derivative File</name>\r
+          <state>$TOOLKIT_DIR$\config\devices\Texas Instruments\CC1111F32.i51</state>\r
+        </option>\r
+        <option>\r
+          <name>Showed Derivative</name>\r
+          <state>CC1111F32</state>\r
+        </option>\r
+        <option>\r
+          <name>CPU Core</name>\r
+          <version>1</version>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CPU Core Slave</name>\r
+          <version>1</version>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Code Memory Model</name>\r
+          <version>1</version>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Code Memory Model slave</name>\r
+          <version>1</version>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Data Memory Model</name>\r
+          <version>0</version>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Data Memory Model slave</name>\r
+          <version>0</version>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Use extended stack</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Use extended stack slave</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Start of extended stack</name>\r
+          <state>0x002000</state>\r
+        </option>\r
+        <option>\r
+          <name>Calling convention</name>\r
+          <version>0</version>\r
+          <state>2</state>\r
+        </option>\r
+        <option>\r
+          <name>Workseg Size</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Constant Placement</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Datapointer Size</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Nr of Datapointers</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Switch Method</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Mask Value</name>\r
+          <state>0xFF</state>\r
+        </option>\r
+        <option>\r
+          <name>DPS Address</name>\r
+          <state>0x92</state>\r
+        </option>\r
+        <option>\r
+          <name>Sfr Visibility</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>DPTR Addresses</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>CodeBankReg</name>\r
+          <state>0x90</state>\r
+        </option>\r
+        <option>\r
+          <name>CodeBankStart</name>\r
+          <state>0x8000</state>\r
+        </option>\r
+        <option>\r
+          <name>CodeBankSize</name>\r
+          <state>0xFFFF</state>\r
+        </option>\r
+        <option>\r
+          <name>ExePath</name>\r
+          <state>868MHz - Limited IAR Kickstart (Europe)\Exe</state>\r
+        </option>\r
+        <option>\r
+          <name>ObjPath</name>\r
+          <state>868MHz - Limited IAR Kickstart (Europe)\Obj</state>\r
+        </option>\r
+        <option>\r
+          <name>ListPath</name>\r
+          <state>868MHz - Limited IAR Kickstart (Europe)\List</state>\r
+        </option>\r
+        <option>\r
+          <name>GOutputBinary</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>GRuntimeLibSelect</name>\r
+          <version>0</version>\r
+          <state>4</state>\r
+        </option>\r
+        <option>\r
+          <name>GRuntimeLibSelectSlave</name>\r
+          <version>0</version>\r
+          <state>4</state>\r
+        </option>\r
+        <option>\r
+          <name>RTDescription</name>\r
+          <state>Use the legacy C runtime library.</state>\r
+        </option>\r
+        <option>\r
+          <name>RTConfigPath</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>RTLibraryPath</name>\r
+          <state>$TOOLKIT_DIR$\LIB\CLIB\cl-pli-nsid-1e16x01.r51</state>\r
+        </option>\r
+        <option>\r
+          <name>Input variant</name>\r
+          <version>0</version>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Input description</name>\r
+          <state>Full formatting.</state>\r
+        </option>\r
+        <option>\r
+          <name>Output variant</name>\r
+          <version>0</version>\r
+          <state>3</state>\r
+        </option>\r
+        <option>\r
+          <name>Output description</name>\r
+          <state>No float, no field width, no precision.</state>\r
+        </option>\r
+        <option>\r
+          <name>GeneralEnableMisra</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>GeneralMisraVerbose</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>General Idata Stack Size</name>\r
+          <state>0xb0</state>\r
+        </option>\r
+        <option>\r
+          <name>General Pdata Stack Size</name>\r
+          <state>0x80</state>\r
+        </option>\r
+        <option>\r
+          <name>General Xdata Stack Size</name>\r
+          <state>0x3ff</state>\r
+        </option>\r
+        <option>\r
+          <name>General Ext Stack Size</name>\r
+          <state>0x3FF</state>\r
+        </option>\r
+        <option>\r
+          <name>General Xdata Heap Size</name>\r
+          <state>0xFF</state>\r
+        </option>\r
+        <option>\r
+          <name>General Far Heap Size</name>\r
+          <state>0xFFF</state>\r
+        </option>\r
+        <option>\r
+          <name>General Huge Heap Size</name>\r
+          <state>0xFFF</state>\r
+        </option>\r
+        <option>\r
+          <name>CodeBankNrOfs</name>\r
+          <state>0x03</state>\r
+        </option>\r
+        <option>\r
+          <name>CodeBankRegMask</name>\r
+          <state>0x30</state>\r
+        </option>\r
+        <option>\r
+          <name>GeneralMisraRules98</name>\r
+          <version>0</version>\r
+          <state>1000111110110101101110011100111111101110011011000101110111101101100111111111111100110011111001110111001111111111111111111111111</state>\r
+        </option>\r
+        <option>\r
+          <name>PDATA 8-15 register address</name>\r
+          <state>0x93</state>\r
+        </option>\r
+        <option>\r
+          <name>PDATA 16-31 register address</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>General Far22 Heap Size</name>\r
+          <state>0xFFF</state>\r
+        </option>\r
+        <option>\r
+          <name>GeneralMisraVer</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>GeneralMisraRules04</name>\r
+          <version>0</version>\r
+          <state>111101110010111111111000110111111111111111111111111110010111101111010101111111111111111111111111101111111011111001111011111011111111111111111</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>ICC8051</name>\r
+      <archiveVersion>3</archiveVersion>\r
+      <data>\r
+        <version>7</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>CCOptSizeSpeedSlave</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCOptimizationSlave</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OutputFile</name>\r
+          <state>$FILE_BNAME$.r51</state>\r
+        </option>\r
+        <option>\r
+          <name>CCDefines</name>\r
+          <state>ISM_EU</state>\r
+          <state>MCU_H=&lt;ioCC1111.h></state>\r
+          <state>chip=1111</state>\r
+          <state>RF_FREQUENCY=868000</state>\r
+          <state>MRFI_CC1111</state>\r
+          <state>NDEBUG</state>\r
+        </option>\r
+        <option>\r
+          <name>CCPreprocFile</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCPreprocComments</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCPreprocLine</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCListCFile</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CCListCMnemonics</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CCListCMessages</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CCListAssFile</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCListAssSource</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCEnableRemarks</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCDiagSuppress</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>CCDiagRemark</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>CCDiagWarning</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>CCDiagError</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>CCObjPrefix</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>LangConform</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CharIs</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CCRequirePrototypes</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCMultibyteSupport</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCMigrationPreprocExtentions</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCAllowList</name>\r
+          <version>1</version>\r
+          <state>10010</state>\r
+        </option>\r
+        <option>\r
+          <name>CCObjUseModuleName</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCObjModuleName</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>CCDebugInfo</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OCCProcessorVariant</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OCCDptr</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OCCDataMemoryModel</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OCCCodeMemoryModel</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OCCCallingConvention</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OCCConstantPlacement</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OCCNrOfVirtualRegisters</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Extended stack</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CCDiagWarnAreErr</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCCompilerRuntimeInfo</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>RomMonBpPadding</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>PreInclude</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>CCLibConfigHeader</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CCLangSelect</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>NoUBROFMessages</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CompilerMisraOverride</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Compiler Extra Options Check</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Compiler Extra Options Edit</name>\r
+          <state>-f"$PROJ_DIR$\simpliciti\Configuration\Access Point\smpl_config.dat"</state>\r
+          <state>-f"$PROJ_DIR$\simpliciti\Configuration\smpl_nwk_config.dat"</state>\r
+        </option>\r
+        <option>\r
+          <name>CCIncludePath2</name>\r
+          <state>$PROJ_DIR$\bm-br1\</state>\r
+          <state>$PROJ_DIR$\HAL\include\</state>\r
+          <state>$PROJ_DIR$\HAL\source\</state>\r
+          <state>$PROJ_DIR$\wbsl\</state>\r
+          <state>$PROJ_DIR$\usb\</state>\r
+          <state>$PROJ_DIR$\usb\class_cdc\</state>\r
+          <state>$PROJ_DIR$\usb\library\</state>\r
+          <state>$PROJ_DIR$\usb\library\ccxx11</state>\r
+          <state>$PROJ_DIR$\sync\</state>\r
+          <state>$PROJ_DIR$\simpliciti\</state>\r
+          <state>$PROJ_DIR$\simpliciti\Components\bsp</state>\r
+          <state>$PROJ_DIR$\simpliciti\Components\bsp\drivers</state>\r
+          <state>$PROJ_DIR$\simpliciti\Components\bsp\boards\RFUSB</state>\r
+          <state>$PROJ_DIR$\simpliciti\Components\mrfi</state>\r
+          <state>$PROJ_DIR$\simpliciti\Components\nwk</state>\r
+          <state>$PROJ_DIR$\simpliciti\Components\nwk_applications</state>\r
+        </option>\r
+        <option>\r
+          <name>CCStdIncCheck</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCStdIncludePath</name>\r
+          <state>$TOOLKIT_DIR$\INC\</state>\r
+          <state>$TOOLKIT_DIR$\INC\CLIB\</state>\r
+        </option>\r
+        <option>\r
+          <name>CompilerMisraRules98</name>\r
+          <version>0</version>\r
+          <state>1000111110110101101110011100111111101110011011000101110111101101100111111111111100110011111001110111001111111111111111111111111</state>\r
+        </option>\r
+        <option>\r
+          <name>CCOverrideModuleTypeDefault</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCRadioModuleType</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCRadioModuleTypeSlave</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CCOptLevel</name>\r
+          <state>2</state>\r
+        </option>\r
+        <option>\r
+          <name>CCOptStrategy</name>\r
+          <version>0</version>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CCOptLevelSlave</name>\r
+          <state>2</state>\r
+        </option>\r
+        <option>\r
+          <name>CompilerMisraRules04</name>\r
+          <version>0</version>\r
+          <state>111101110010111111111000110111111111111111111111111110010111101111010101111111111111111111111111101111111011111001111011111011111111111111111</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>A8051</name>\r
+      <archiveVersion>2</archiveVersion>\r
+      <data>\r
+        <version>4</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>OAProcessorVariant</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Generated Preproc defines</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AObjPrefix</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OutputFile</name>\r
+          <state>$FILE_BNAME$.r51</state>\r
+        </option>\r
+        <option>\r
+          <name>ACaseSensitivity</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>MacroChars</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Asm multibyte support</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Debug</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>AList</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AListHeader</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>AListing</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Includes</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>MacDefs</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>MacExps</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>MacExec</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OnlyAssed</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>MultiLine</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>NoStruct</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>PageLengthCheck</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>PageLength</name>\r
+          <state>80</state>\r
+        </option>\r
+        <option>\r
+          <name>TabSpacing</name>\r
+          <state>8</state>\r
+        </option>\r
+        <option>\r
+          <name>AXRef</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AXRefDefines</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AXRefInternal</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AXRefDual</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AIncludes</name>\r
+          <state>$TOOLKIT_DIR$\INC\</state>\r
+          <state>$PROJ_DIR$\</state>\r
+          <state>$PROJ_DIR$\USB\INCLUDE</state>\r
+          <state>$PROJ_DIR$\USB\SOURCE</state>\r
+        </option>\r
+        <option>\r
+          <name>ADefines</name>\r
+          <state>chip=1111</state>\r
+        </option>\r
+        <option>\r
+          <name>AWarnEnable</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AWarnWhat</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AWarnOne</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>AWarnRange1</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>AWarnRange2</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>Assembler Extra Options Check</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Assembler Extra Options Edit</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>AMaxErrOn</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AMaxErrNum</name>\r
+          <state>100</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>CUSTOM</name>\r
+      <archiveVersion>3</archiveVersion>\r
+      <data>\r
+        <extensions></extensions>\r
+        <cmdline></cmdline>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>BICOMP</name>\r
+      <archiveVersion>0</archiveVersion>\r
+      <data/>\r
+    </settings>\r
+    <settings>\r
+      <name>BUILDACTION</name>\r
+      <archiveVersion>1</archiveVersion>\r
+      <data>\r
+        <prebuild></prebuild>\r
+        <postbuild></postbuild>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>XLINK</name>\r
+      <archiveVersion>3</archiveVersion>\r
+      <data>\r
+        <version>17</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>XInfineonPFlashCacheBug</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OXLibIOConfig</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>XOutOverride</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OutputFile</name>\r
+          <state>ez430-chronos-AP-868MHz.hex</state>\r
+        </option>\r
+        <option>\r
+          <name>OutputFormat</name>\r
+          <version>11</version>\r
+          <state>23</state>\r
+        </option>\r
+        <option>\r
+          <name>FormatVariant</name>\r
+          <version>8</version>\r
+          <state>2</state>\r
+        </option>\r
+        <option>\r
+          <name>SecondaryOutputFile</name>\r
+          <state>(None for the selected format)</state>\r
+        </option>\r
+        <option>\r
+          <name>XDefines</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>AlwaysOutput</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OverlapWarnings</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>NoGlobalCheck</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>XList</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>SegmentMap</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>ListSymbols</name>\r
+          <state>2</state>\r
+        </option>\r
+        <option>\r
+          <name>PageLengthCheck</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>PageLength</name>\r
+          <state>80</state>\r
+        </option>\r
+        <option>\r
+          <name>XIncludes</name>\r
+          <state>$TOOLKIT_DIR$\LIB\</state>\r
+        </option>\r
+        <option>\r
+          <name>ModuleStatus</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>XclOverride</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>XclFile</name>\r
+          <state>$TOOLKIT_DIR$\config\lnk51ew_cc1111.xcl</state>\r
+        </option>\r
+        <option>\r
+          <name>XclFileSlave</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>Config Include Dir</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>XLink Dptr Switch mask</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OHXNrOfVirtualRegisters</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OHX DPS Address</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>XLINK Dptr Addresses</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Linker Code Banking</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>DoFill</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>FillerByte</name>\r
+          <state>0xFF</state>\r
+        </option>\r
+        <option>\r
+          <name>DoCrc</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CrcSize</name>\r
+          <version>0</version>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CrcAlgo</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CrcPoly</name>\r
+          <state>0x11021</state>\r
+        </option>\r
+        <option>\r
+          <name>CrcCompl</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>RangeCheckAlternatives</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>SuppressAllWarn</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>SuppressDiags</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>TreatAsWarn</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>TreatAsErr</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>ModuleLocalSym</name>\r
+          <version>0</version>\r
+          <state>2</state>\r
+        </option>\r
+        <option>\r
+          <name>CrcBitOrder</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>IncludeSuppressed</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>ModuleSummary</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>xcProgramEntryLabel</name>\r
+          <state>__program_start</state>\r
+        </option>\r
+        <option>\r
+          <name>DebugInformation</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>RuntimeControl</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>IoEmulation</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>AllowExtraOutput</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>GenerateExtraOutput</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>XExtraOutOverride</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>ExtraOutputFile</name>\r
+          <state>cc1111_usb_dongle.sim</state>\r
+        </option>\r
+        <option>\r
+          <name>ExtraOutputFormat</name>\r
+          <version>11</version>\r
+          <state>60</state>\r
+        </option>\r
+        <option>\r
+          <name>ExtraFormatVariant</name>\r
+          <version>8</version>\r
+          <state>2</state>\r
+        </option>\r
+        <option>\r
+          <name>xcOverrideProgramEntryLabel</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>xcProgramEntryLabelSelect</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>ListOutputFormat</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>BufferedTermOutput</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OverlaySystemMap</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>RawBinaryFile</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>RawBinarySymbol</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>RawBinarySegment</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>RawBinaryAlign</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>XLinkMisraHandler</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>XcRTLibraryFile</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Linker Idata Stack Size</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Linker Ext Stack Size</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Linker Pdata Stack Size</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Linker Xdata Stack Size</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Linker Xdata Heap Size</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Linker Far Heap Size</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Linker Huge Heap Size</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Linker Extra Options Check</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Linker Extra Options Edit</name>\r
+          <state>--ks_version</state>\r
+        </option>\r
+        <option>\r
+          <name>CrcAlign</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CrcInitialValue</name>\r
+          <state>0x0</state>\r
+        </option>\r
+        <option>\r
+          <name>Linker Far22 Heap Size</name>\r
+          <state>1</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>XAR</name>\r
+      <archiveVersion>1</archiveVersion>\r
+      <data>\r
+        <version>0</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>XARInputs</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>XAROverride</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>XAR Standard name</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>XAROutput</name>\r
+          <state>###Uninitialized###</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>BILINK</name>\r
+      <archiveVersion>0</archiveVersion>\r
+      <data/>\r
+    </settings>\r
+  </configuration>\r
+  <configuration>\r
+    <name>433MHz - Limited IAR Kickstart (Other regions)</name>\r
+    <toolchain>\r
+      <name>8051</name>\r
+    </toolchain>\r
+    <debug>1</debug>\r
+    <settings>\r
+      <name>General</name>\r
+      <archiveVersion>1</archiveVersion>\r
+      <data>\r
+        <version>4</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>DerivativeDescriptionFile</name>\r
+          <state>$TOOLKIT_DIR$\config\devices\Texas Instruments\CC1111.i51</state>\r
+        </option>\r
+        <option>\r
+          <name>Previous Derivative File</name>\r
+          <state>$TOOLKIT_DIR$\config\devices\Texas Instruments\CC1111.i51</state>\r
+        </option>\r
+        <option>\r
+          <name>Showed Derivative</name>\r
+          <state>CC1111</state>\r
+        </option>\r
+        <option>\r
+          <name>CPU Core</name>\r
+          <version>1</version>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CPU Core Slave</name>\r
+          <version>1</version>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Code Memory Model</name>\r
+          <version>1</version>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Code Memory Model slave</name>\r
+          <version>1</version>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Data Memory Model</name>\r
+          <version>0</version>\r
+          <state>2</state>\r
+        </option>\r
+        <option>\r
+          <name>Data Memory Model slave</name>\r
+          <version>0</version>\r
+          <state>2</state>\r
+        </option>\r
+        <option>\r
+          <name>Use extended stack</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Use extended stack slave</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Start of extended stack</name>\r
+          <state>0x002000</state>\r
+        </option>\r
+        <option>\r
+          <name>Calling convention</name>\r
+          <version>0</version>\r
+          <state>4</state>\r
+        </option>\r
+        <option>\r
+          <name>Workseg Size</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Constant Placement</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Datapointer Size</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Nr of Datapointers</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Switch Method</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Mask Value</name>\r
+          <state>0x00</state>\r
+        </option>\r
+        <option>\r
+          <name>DPS Address</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>Sfr Visibility</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>DPTR Addresses</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>CodeBankReg</name>\r
+          <state>0x90</state>\r
+        </option>\r
+        <option>\r
+          <name>CodeBankStart</name>\r
+          <state>0x8000</state>\r
+        </option>\r
+        <option>\r
+          <name>CodeBankSize</name>\r
+          <state>0xFFFF</state>\r
+        </option>\r
+        <option>\r
+          <name>ExePath</name>\r
+          <state>433MHz - Limited IAR Kickstart (Other regions)\Exe</state>\r
+        </option>\r
+        <option>\r
+          <name>ObjPath</name>\r
+          <state>433MHz - Limited IAR Kickstart (Other regions)\Obj</state>\r
+        </option>\r
+        <option>\r
+          <name>ListPath</name>\r
+          <state>433MHz - Limited IAR Kickstart (Other regions)\List</state>\r
+        </option>\r
+        <option>\r
+          <name>GOutputBinary</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>GRuntimeLibSelect</name>\r
+          <version>0</version>\r
+          <state>4</state>\r
+        </option>\r
+        <option>\r
+          <name>GRuntimeLibSelectSlave</name>\r
+          <version>0</version>\r
+          <state>4</state>\r
+        </option>\r
+        <option>\r
+          <name>RTDescription</name>\r
+          <state>Use the legacy C runtime library.</state>\r
+        </option>\r
+        <option>\r
+          <name>RTConfigPath</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>RTLibraryPath</name>\r
+          <state>$TOOLKIT_DIR$\LIB\CLIB\cl-pli-nlxd-1e16x01.r51</state>\r
+        </option>\r
+        <option>\r
+          <name>Input variant</name>\r
+          <version>0</version>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Input description</name>\r
+          <state>Full formatting.</state>\r
+        </option>\r
+        <option>\r
+          <name>Output variant</name>\r
+          <version>0</version>\r
+          <state>3</state>\r
+        </option>\r
+        <option>\r
+          <name>Output description</name>\r
+          <state>No float, no field width, no precision.</state>\r
+        </option>\r
+        <option>\r
+          <name>GeneralEnableMisra</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>GeneralMisraVerbose</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>General Idata Stack Size</name>\r
+          <state>0xb0</state>\r
+        </option>\r
+        <option>\r
+          <name>General Pdata Stack Size</name>\r
+          <state>0x80</state>\r
+        </option>\r
+        <option>\r
+          <name>General Xdata Stack Size</name>\r
+          <state>0x3ff</state>\r
+        </option>\r
+        <option>\r
+          <name>General Ext Stack Size</name>\r
+          <state>0x3FF</state>\r
+        </option>\r
+        <option>\r
+          <name>General Xdata Heap Size</name>\r
+          <state>0xFF</state>\r
+        </option>\r
+        <option>\r
+          <name>General Far Heap Size</name>\r
+          <state>0xFFF</state>\r
+        </option>\r
+        <option>\r
+          <name>General Huge Heap Size</name>\r
+          <state>0xFFF</state>\r
+        </option>\r
+        <option>\r
+          <name>CodeBankNrOfs</name>\r
+          <state>0x03</state>\r
+        </option>\r
+        <option>\r
+          <name>CodeBankRegMask</name>\r
+          <state>0x30</state>\r
+        </option>\r
+        <option>\r
+          <name>GeneralMisraRules98</name>\r
+          <version>0</version>\r
+          <state>1000111110110101101110011100111111101110011011000101110111101101100111111111111100110011111001110111001111111111111111111111111</state>\r
+        </option>\r
+        <option>\r
+          <name>PDATA 8-15 register address</name>\r
+          <state>0xA0</state>\r
+        </option>\r
+        <option>\r
+          <name>PDATA 16-31 register address</name>\r
+          <state>0xEA</state>\r
+        </option>\r
+        <option>\r
+          <name>General Far22 Heap Size</name>\r
+          <state>0xFFF</state>\r
+        </option>\r
+        <option>\r
+          <name>GeneralMisraVer</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>GeneralMisraRules04</name>\r
+          <version>0</version>\r
+          <state>111101110010111111111000110111111111111111111111111110010111101111010101111111111111111111111111101111111011111001111011111011111111111111111</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>ICC8051</name>\r
+      <archiveVersion>3</archiveVersion>\r
+      <data>\r
+        <version>7</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>CCOptSizeSpeedSlave</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCOptimizationSlave</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OutputFile</name>\r
+          <state>$FILE_BNAME$.r51</state>\r
+        </option>\r
+        <option>\r
+          <name>CCDefines</name>\r
+          <state>ISM_LF</state>\r
+          <state>MCU_H=&lt;ioCC1111.h></state>\r
+          <state>chip=1111</state>\r
+          <state>RF_FREQUENCY=433000</state>\r
+          <state>MRFI_CC1111</state>\r
+          <state>NDEBUG</state>\r
+        </option>\r
+        <option>\r
+          <name>CCPreprocFile</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCPreprocComments</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCPreprocLine</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCListCFile</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CCListCMnemonics</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CCListCMessages</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CCListAssFile</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCListAssSource</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCEnableRemarks</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCDiagSuppress</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>CCDiagRemark</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>CCDiagWarning</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>CCDiagError</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>CCObjPrefix</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>LangConform</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CharIs</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CCRequirePrototypes</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCMultibyteSupport</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCMigrationPreprocExtentions</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCAllowList</name>\r
+          <version>1</version>\r
+          <state>10010</state>\r
+        </option>\r
+        <option>\r
+          <name>CCObjUseModuleName</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCObjModuleName</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>CCDebugInfo</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OCCProcessorVariant</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OCCDptr</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OCCDataMemoryModel</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OCCCodeMemoryModel</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OCCCallingConvention</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OCCConstantPlacement</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OCCNrOfVirtualRegisters</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Extended stack</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CCDiagWarnAreErr</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCCompilerRuntimeInfo</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>RomMonBpPadding</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>PreInclude</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>CCLibConfigHeader</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CCLangSelect</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>NoUBROFMessages</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CompilerMisraOverride</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Compiler Extra Options Check</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Compiler Extra Options Edit</name>\r
+          <state>-f"$PROJ_DIR$\simpliciti\Configuration\Access Point\smpl_config.dat"</state>\r
+          <state>-f"$PROJ_DIR$\simpliciti\Configuration\smpl_nwk_config.dat"</state>\r
+        </option>\r
+        <option>\r
+          <name>CCIncludePath2</name>\r
+          <state>$PROJ_DIR$\bm-br1\</state>\r
+          <state>$PROJ_DIR$\HAL\include\</state>\r
+          <state>$PROJ_DIR$\HAL\source\</state>\r
+          <state>$PROJ_DIR$\wbsl\</state>\r
+          <state>$PROJ_DIR$\usb\</state>\r
+          <state>$PROJ_DIR$\usb\class_cdc\</state>\r
+          <state>$PROJ_DIR$\usb\library\</state>\r
+          <state>$PROJ_DIR$\usb\library\ccxx11</state>\r
+          <state>$PROJ_DIR$\sync\</state>\r
+          <state>$PROJ_DIR$\simpliciti\</state>\r
+          <state>$PROJ_DIR$\simpliciti\Components\bsp</state>\r
+          <state>$PROJ_DIR$\simpliciti\Components\bsp\drivers</state>\r
+          <state>$PROJ_DIR$\simpliciti\Components\bsp\boards\RFUSB</state>\r
+          <state>$PROJ_DIR$\simpliciti\Components\mrfi</state>\r
+          <state>$PROJ_DIR$\simpliciti\Components\nwk</state>\r
+          <state>$PROJ_DIR$\simpliciti\Components\nwk_applications</state>\r
+        </option>\r
+        <option>\r
+          <name>CCStdIncCheck</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCStdIncludePath</name>\r
+          <state>$TOOLKIT_DIR$\INC\</state>\r
+          <state>$TOOLKIT_DIR$\INC\CLIB\</state>\r
+        </option>\r
+        <option>\r
+          <name>CompilerMisraRules98</name>\r
+          <version>0</version>\r
+          <state>1000111110110101101110011100111111101110011011000101110111101101100111111111111100110011111001110111001111111111111111111111111</state>\r
+        </option>\r
+        <option>\r
+          <name>CCOverrideModuleTypeDefault</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCRadioModuleType</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCRadioModuleTypeSlave</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CCOptLevel</name>\r
+          <state>2</state>\r
+        </option>\r
+        <option>\r
+          <name>CCOptStrategy</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCOptLevelSlave</name>\r
+          <state>2</state>\r
+        </option>\r
+        <option>\r
+          <name>CompilerMisraRules04</name>\r
+          <version>0</version>\r
+          <state>111101110010111111111000110111111111111111111111111110010111101111010101111111111111111111111111101111111011111001111011111011111111111111111</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>A8051</name>\r
+      <archiveVersion>2</archiveVersion>\r
+      <data>\r
+        <version>4</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>OAProcessorVariant</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Generated Preproc defines</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AObjPrefix</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OutputFile</name>\r
+          <state>$FILE_BNAME$.r51</state>\r
+        </option>\r
+        <option>\r
+          <name>ACaseSensitivity</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>MacroChars</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Asm multibyte support</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Debug</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>AList</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AListHeader</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>AListing</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Includes</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>MacDefs</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>MacExps</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>MacExec</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OnlyAssed</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>MultiLine</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>NoStruct</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>PageLengthCheck</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>PageLength</name>\r
+          <state>80</state>\r
+        </option>\r
+        <option>\r
+          <name>TabSpacing</name>\r
+          <state>8</state>\r
+        </option>\r
+        <option>\r
+          <name>AXRef</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AXRefDefines</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AXRefInternal</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AXRefDual</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AIncludes</name>\r
+          <state>$TOOLKIT_DIR$\INC\</state>\r
+          <state>$PROJ_DIR$\</state>\r
+          <state>$PROJ_DIR$\USB\INCLUDE</state>\r
+          <state>$PROJ_DIR$\USB\SOURCE</state>\r
+        </option>\r
+        <option>\r
+          <name>ADefines</name>\r
+          <state>chip=1111</state>\r
+        </option>\r
+        <option>\r
+          <name>AWarnEnable</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AWarnWhat</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AWarnOne</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>AWarnRange1</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>AWarnRange2</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>Assembler Extra Options Check</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Assembler Extra Options Edit</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>AMaxErrOn</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AMaxErrNum</name>\r
+          <state>100</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>CUSTOM</name>\r
+      <archiveVersion>3</archiveVersion>\r
+      <data>\r
+        <extensions></extensions>\r
+        <cmdline></cmdline>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>BICOMP</name>\r
+      <archiveVersion>0</archiveVersion>\r
+      <data/>\r
+    </settings>\r
+    <settings>\r
+      <name>BUILDACTION</name>\r
+      <archiveVersion>1</archiveVersion>\r
+      <data>\r
+        <prebuild></prebuild>\r
+        <postbuild></postbuild>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>XLINK</name>\r
+      <archiveVersion>3</archiveVersion>\r
+      <data>\r
+        <version>17</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>XInfineonPFlashCacheBug</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OXLibIOConfig</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>XOutOverride</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OutputFile</name>\r
+          <state>ez430-chronos-AP-433MHz.hex</state>\r
+        </option>\r
+        <option>\r
+          <name>OutputFormat</name>\r
+          <version>11</version>\r
+          <state>23</state>\r
+        </option>\r
+        <option>\r
+          <name>FormatVariant</name>\r
+          <version>8</version>\r
+          <state>2</state>\r
+        </option>\r
+        <option>\r
+          <name>SecondaryOutputFile</name>\r
+          <state>(None for the selected format)</state>\r
+        </option>\r
+        <option>\r
+          <name>XDefines</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>AlwaysOutput</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OverlapWarnings</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>NoGlobalCheck</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>XList</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>SegmentMap</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>ListSymbols</name>\r
+          <state>2</state>\r
+        </option>\r
+        <option>\r
+          <name>PageLengthCheck</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>PageLength</name>\r
+          <state>80</state>\r
+        </option>\r
+        <option>\r
+          <name>XIncludes</name>\r
+          <state>$TOOLKIT_DIR$\LIB\</state>\r
+        </option>\r
+        <option>\r
+          <name>ModuleStatus</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>XclOverride</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>XclFile</name>\r
+          <state>$TOOLKIT_DIR$\config\lnk51ew_cc1111.xcl</state>\r
+        </option>\r
+        <option>\r
+          <name>XclFileSlave</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>Config Include Dir</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>XLink Dptr Switch mask</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OHXNrOfVirtualRegisters</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OHX DPS Address</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>XLINK Dptr Addresses</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Linker Code Banking</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>DoFill</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>FillerByte</name>\r
+          <state>0xFF</state>\r
+        </option>\r
+        <option>\r
+          <name>DoCrc</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CrcSize</name>\r
+          <version>0</version>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CrcAlgo</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CrcPoly</name>\r
+          <state>0x11021</state>\r
+        </option>\r
+        <option>\r
+          <name>CrcCompl</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>RangeCheckAlternatives</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>SuppressAllWarn</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>SuppressDiags</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>TreatAsWarn</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>TreatAsErr</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>ModuleLocalSym</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CrcBitOrder</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>IncludeSuppressed</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>ModuleSummary</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>xcProgramEntryLabel</name>\r
+          <state>__program_start</state>\r
+        </option>\r
+        <option>\r
+          <name>DebugInformation</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>RuntimeControl</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>IoEmulation</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>AllowExtraOutput</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>GenerateExtraOutput</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>XExtraOutOverride</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>ExtraOutputFile</name>\r
+          <state>cc1111_usb_dongle.sim</state>\r
+        </option>\r
+        <option>\r
+          <name>ExtraOutputFormat</name>\r
+          <version>11</version>\r
+          <state>60</state>\r
+        </option>\r
+        <option>\r
+          <name>ExtraFormatVariant</name>\r
+          <version>8</version>\r
+          <state>2</state>\r
+        </option>\r
+        <option>\r
+          <name>xcOverrideProgramEntryLabel</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>xcProgramEntryLabelSelect</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>ListOutputFormat</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>BufferedTermOutput</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OverlaySystemMap</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>RawBinaryFile</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>RawBinarySymbol</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>RawBinarySegment</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>RawBinaryAlign</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>XLinkMisraHandler</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>XcRTLibraryFile</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Linker Idata Stack Size</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Linker Ext Stack Size</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Linker Pdata Stack Size</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Linker Xdata Stack Size</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Linker Xdata Heap Size</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Linker Far Heap Size</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Linker Huge Heap Size</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Linker Extra Options Check</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Linker Extra Options Edit</name>\r
+          <state>--ks_version</state>\r
+        </option>\r
+        <option>\r
+          <name>CrcAlign</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CrcInitialValue</name>\r
+          <state>0x0</state>\r
+        </option>\r
+        <option>\r
+          <name>Linker Far22 Heap Size</name>\r
+          <state>1</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>XAR</name>\r
+      <archiveVersion>1</archiveVersion>\r
+      <data>\r
+        <version>0</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>XARInputs</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>XAROverride</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>XAR Standard name</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>XAROutput</name>\r
+          <state>###Uninitialized###</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>BILINK</name>\r
+      <archiveVersion>0</archiveVersion>\r
+      <data/>\r
+    </settings>\r
+  </configuration>\r
+  <configuration>\r
+    <name>915MHz - Unrestricted IAR Workbench (USA)</name>\r
+    <toolchain>\r
+      <name>8051</name>\r
+    </toolchain>\r
+    <debug>1</debug>\r
+    <settings>\r
+      <name>General</name>\r
+      <archiveVersion>1</archiveVersion>\r
+      <data>\r
+        <version>4</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>DerivativeDescriptionFile</name>\r
+          <state>$TOOLKIT_DIR$\config\devices\Texas Instruments\CC1111.i51</state>\r
+        </option>\r
+        <option>\r
+          <name>Previous Derivative File</name>\r
+          <state>$TOOLKIT_DIR$\config\devices\Texas Instruments\CC1111.i51</state>\r
+        </option>\r
+        <option>\r
+          <name>Showed Derivative</name>\r
+          <state>CC1111</state>\r
+        </option>\r
+        <option>\r
+          <name>CPU Core</name>\r
+          <version>1</version>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CPU Core Slave</name>\r
+          <version>1</version>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Code Memory Model</name>\r
+          <version>1</version>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Code Memory Model slave</name>\r
+          <version>1</version>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Data Memory Model</name>\r
+          <version>0</version>\r
+          <state>2</state>\r
+        </option>\r
+        <option>\r
+          <name>Data Memory Model slave</name>\r
+          <version>0</version>\r
+          <state>2</state>\r
+        </option>\r
+        <option>\r
+          <name>Use extended stack</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Use extended stack slave</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Start of extended stack</name>\r
+          <state>0x002000</state>\r
+        </option>\r
+        <option>\r
+          <name>Calling convention</name>\r
+          <version>0</version>\r
+          <state>4</state>\r
+        </option>\r
+        <option>\r
+          <name>Workseg Size</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Constant Placement</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Datapointer Size</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Nr of Datapointers</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Switch Method</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Mask Value</name>\r
+          <state>0x00</state>\r
+        </option>\r
+        <option>\r
+          <name>DPS Address</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>Sfr Visibility</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>DPTR Addresses</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>CodeBankReg</name>\r
+          <state>0x90</state>\r
+        </option>\r
+        <option>\r
+          <name>CodeBankStart</name>\r
+          <state>0x8000</state>\r
+        </option>\r
+        <option>\r
+          <name>CodeBankSize</name>\r
+          <state>0xFFFF</state>\r
+        </option>\r
+        <option>\r
+          <name>ExePath</name>\r
+          <state>915MHz - Unrestricted IAR Workbench (USA)\Exe</state>\r
+        </option>\r
+        <option>\r
+          <name>ObjPath</name>\r
+          <state>915MHz - Unrestricted IAR Workbench (USA)\Obj</state>\r
+        </option>\r
+        <option>\r
+          <name>ListPath</name>\r
+          <state>915MHz - Unrestricted IAR Workbench (USA)\List</state>\r
+        </option>\r
+        <option>\r
+          <name>GOutputBinary</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>GRuntimeLibSelect</name>\r
+          <version>0</version>\r
+          <state>4</state>\r
+        </option>\r
+        <option>\r
+          <name>GRuntimeLibSelectSlave</name>\r
+          <version>0</version>\r
+          <state>4</state>\r
+        </option>\r
+        <option>\r
+          <name>RTDescription</name>\r
+          <state>Use the legacy C runtime library.</state>\r
+        </option>\r
+        <option>\r
+          <name>RTConfigPath</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>RTLibraryPath</name>\r
+          <state>$TOOLKIT_DIR$\LIB\CLIB\cl-pli-nlxd-1e16x01.r51</state>\r
+        </option>\r
+        <option>\r
+          <name>Input variant</name>\r
+          <version>0</version>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Input description</name>\r
+          <state>Full formatting.</state>\r
+        </option>\r
+        <option>\r
+          <name>Output variant</name>\r
+          <version>0</version>\r
+          <state>3</state>\r
+        </option>\r
+        <option>\r
+          <name>Output description</name>\r
+          <state>No float, no field width, no precision.</state>\r
+        </option>\r
+        <option>\r
+          <name>GeneralEnableMisra</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>GeneralMisraVerbose</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>General Idata Stack Size</name>\r
+          <state>0xb0</state>\r
+        </option>\r
+        <option>\r
+          <name>General Pdata Stack Size</name>\r
+          <state>0x80</state>\r
+        </option>\r
+        <option>\r
+          <name>General Xdata Stack Size</name>\r
+          <state>0x3ff</state>\r
+        </option>\r
+        <option>\r
+          <name>General Ext Stack Size</name>\r
+          <state>0x3FF</state>\r
+        </option>\r
+        <option>\r
+          <name>General Xdata Heap Size</name>\r
+          <state>0xFF</state>\r
+        </option>\r
+        <option>\r
+          <name>General Far Heap Size</name>\r
+          <state>0xFFF</state>\r
+        </option>\r
+        <option>\r
+          <name>General Huge Heap Size</name>\r
+          <state>0xFFF</state>\r
+        </option>\r
+        <option>\r
+          <name>CodeBankNrOfs</name>\r
+          <state>0x03</state>\r
+        </option>\r
+        <option>\r
+          <name>CodeBankRegMask</name>\r
+          <state>0x30</state>\r
+        </option>\r
+        <option>\r
+          <name>GeneralMisraRules98</name>\r
+          <version>0</version>\r
+          <state>1000111110110101101110011100111111101110011011000101110111101101100111111111111100110011111001110111001111111111111111111111111</state>\r
+        </option>\r
+        <option>\r
+          <name>PDATA 8-15 register address</name>\r
+          <state>0xA0</state>\r
+        </option>\r
+        <option>\r
+          <name>PDATA 16-31 register address</name>\r
+          <state>0xEA</state>\r
+        </option>\r
+        <option>\r
+          <name>General Far22 Heap Size</name>\r
+          <state>0xFFF</state>\r
+        </option>\r
+        <option>\r
+          <name>GeneralMisraVer</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>GeneralMisraRules04</name>\r
+          <version>0</version>\r
+          <state>111101110010111111111000110111111111111111111111111110010111101111010101111111111111111111111111101111111011111001111011111011111111111111111</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>ICC8051</name>\r
+      <archiveVersion>3</archiveVersion>\r
+      <data>\r
+        <version>7</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>CCOptSizeSpeedSlave</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCOptimizationSlave</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OutputFile</name>\r
+          <state>$FILE_BNAME$.r51</state>\r
+        </option>\r
+        <option>\r
+          <name>CCDefines</name>\r
+          <state>ISM_US</state>\r
+          <state>MCU_H=&lt;ioCC1111.h></state>\r
+          <state>chip=1111</state>\r
+          <state>RF_FREQUENCY=915000</state>\r
+          <state>MRFI_CC1111</state>\r
+          <state>NDEBUG</state>\r
+        </option>\r
+        <option>\r
+          <name>CCPreprocFile</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCPreprocComments</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCPreprocLine</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCListCFile</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CCListCMnemonics</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CCListCMessages</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CCListAssFile</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCListAssSource</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCEnableRemarks</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCDiagSuppress</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>CCDiagRemark</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>CCDiagWarning</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>CCDiagError</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>CCObjPrefix</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>LangConform</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CharIs</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CCRequirePrototypes</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCMultibyteSupport</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCMigrationPreprocExtentions</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCAllowList</name>\r
+          <version>1</version>\r
+          <state>10010</state>\r
+        </option>\r
+        <option>\r
+          <name>CCObjUseModuleName</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCObjModuleName</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>CCDebugInfo</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OCCProcessorVariant</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OCCDptr</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OCCDataMemoryModel</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OCCCodeMemoryModel</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OCCCallingConvention</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OCCConstantPlacement</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OCCNrOfVirtualRegisters</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Extended stack</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CCDiagWarnAreErr</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCCompilerRuntimeInfo</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>RomMonBpPadding</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>PreInclude</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>CCLibConfigHeader</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CCLangSelect</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>NoUBROFMessages</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CompilerMisraOverride</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Compiler Extra Options Check</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Compiler Extra Options Edit</name>\r
+          <state>-f"$PROJ_DIR$\simpliciti\Configuration\Access Point\smpl_config.dat"</state>\r
+          <state>-f"$PROJ_DIR$\simpliciti\Configuration\smpl_nwk_config.dat"</state>\r
+        </option>\r
+        <option>\r
+          <name>CCIncludePath2</name>\r
+          <state>$PROJ_DIR$\bm-br1\</state>\r
+          <state>$PROJ_DIR$\HAL\include\</state>\r
+          <state>$PROJ_DIR$\HAL\source\</state>\r
+          <state>$PROJ_DIR$\wbsl\</state>\r
+          <state>$PROJ_DIR$\usb\</state>\r
+          <state>$PROJ_DIR$\usb\class_cdc\</state>\r
+          <state>$PROJ_DIR$\usb\library\</state>\r
+          <state>$PROJ_DIR$\usb\library\ccxx11</state>\r
+          <state>$PROJ_DIR$\sync\</state>\r
+          <state>$PROJ_DIR$\simpliciti\</state>\r
+          <state>$PROJ_DIR$\simpliciti\Components\bsp</state>\r
+          <state>$PROJ_DIR$\simpliciti\Components\bsp\drivers</state>\r
+          <state>$PROJ_DIR$\simpliciti\Components\bsp\boards\RFUSB</state>\r
+          <state>$PROJ_DIR$\simpliciti\Components\mrfi</state>\r
+          <state>$PROJ_DIR$\simpliciti\Components\nwk</state>\r
+          <state>$PROJ_DIR$\simpliciti\Components\nwk_applications</state>\r
+        </option>\r
+        <option>\r
+          <name>CCStdIncCheck</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCStdIncludePath</name>\r
+          <state>$TOOLKIT_DIR$\INC\</state>\r
+          <state>$TOOLKIT_DIR$\INC\CLIB\</state>\r
+        </option>\r
+        <option>\r
+          <name>CompilerMisraRules98</name>\r
+          <version>0</version>\r
+          <state>1000111110110101101110011100111111101110011011000101110111101101100111111111111100110011111001110111001111111111111111111111111</state>\r
+        </option>\r
+        <option>\r
+          <name>CCOverrideModuleTypeDefault</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCRadioModuleType</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCRadioModuleTypeSlave</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CCOptLevel</name>\r
+          <state>2</state>\r
+        </option>\r
+        <option>\r
+          <name>CCOptStrategy</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCOptLevelSlave</name>\r
+          <state>2</state>\r
+        </option>\r
+        <option>\r
+          <name>CompilerMisraRules04</name>\r
+          <version>0</version>\r
+          <state>111101110010111111111000110111111111111111111111111110010111101111010101111111111111111111111111101111111011111001111011111011111111111111111</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>A8051</name>\r
+      <archiveVersion>2</archiveVersion>\r
+      <data>\r
+        <version>4</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>OAProcessorVariant</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Generated Preproc defines</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AObjPrefix</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OutputFile</name>\r
+          <state>$FILE_BNAME$.r51</state>\r
+        </option>\r
+        <option>\r
+          <name>ACaseSensitivity</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>MacroChars</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Asm multibyte support</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Debug</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>AList</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AListHeader</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>AListing</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Includes</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>MacDefs</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>MacExps</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>MacExec</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OnlyAssed</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>MultiLine</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>NoStruct</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>PageLengthCheck</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>PageLength</name>\r
+          <state>80</state>\r
+        </option>\r
+        <option>\r
+          <name>TabSpacing</name>\r
+          <state>8</state>\r
+        </option>\r
+        <option>\r
+          <name>AXRef</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AXRefDefines</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AXRefInternal</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AXRefDual</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AIncludes</name>\r
+          <state>$TOOLKIT_DIR$\INC\</state>\r
+          <state>$PROJ_DIR$\</state>\r
+          <state>$PROJ_DIR$\USB\INCLUDE</state>\r
+          <state>$PROJ_DIR$\USB\SOURCE</state>\r
+        </option>\r
+        <option>\r
+          <name>ADefines</name>\r
+          <state>chip=1111</state>\r
+        </option>\r
+        <option>\r
+          <name>AWarnEnable</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AWarnWhat</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AWarnOne</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>AWarnRange1</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>AWarnRange2</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>Assembler Extra Options Check</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Assembler Extra Options Edit</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>AMaxErrOn</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AMaxErrNum</name>\r
+          <state>100</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>CUSTOM</name>\r
+      <archiveVersion>3</archiveVersion>\r
+      <data>\r
+        <extensions></extensions>\r
+        <cmdline></cmdline>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>BICOMP</name>\r
+      <archiveVersion>0</archiveVersion>\r
+      <data/>\r
+    </settings>\r
+    <settings>\r
+      <name>BUILDACTION</name>\r
+      <archiveVersion>1</archiveVersion>\r
+      <data>\r
+        <prebuild></prebuild>\r
+        <postbuild></postbuild>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>XLINK</name>\r
+      <archiveVersion>3</archiveVersion>\r
+      <data>\r
+        <version>17</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>XInfineonPFlashCacheBug</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OXLibIOConfig</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>XOutOverride</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OutputFile</name>\r
+          <state>ez430-chronos-AP-915MHz.hex</state>\r
+        </option>\r
+        <option>\r
+          <name>OutputFormat</name>\r
+          <version>11</version>\r
+          <state>23</state>\r
+        </option>\r
+        <option>\r
+          <name>FormatVariant</name>\r
+          <version>8</version>\r
+          <state>2</state>\r
+        </option>\r
+        <option>\r
+          <name>SecondaryOutputFile</name>\r
+          <state>(None for the selected format)</state>\r
+        </option>\r
+        <option>\r
+          <name>XDefines</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>AlwaysOutput</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OverlapWarnings</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>NoGlobalCheck</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>XList</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>SegmentMap</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>ListSymbols</name>\r
+          <state>2</state>\r
+        </option>\r
+        <option>\r
+          <name>PageLengthCheck</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>PageLength</name>\r
+          <state>80</state>\r
+        </option>\r
+        <option>\r
+          <name>XIncludes</name>\r
+          <state>$TOOLKIT_DIR$\LIB\</state>\r
+        </option>\r
+        <option>\r
+          <name>ModuleStatus</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>XclOverride</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>XclFile</name>\r
+          <state>$TOOLKIT_DIR$\config\lnk51ew_cc1111.xcl</state>\r
+        </option>\r
+        <option>\r
+          <name>XclFileSlave</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>Config Include Dir</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>XLink Dptr Switch mask</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OHXNrOfVirtualRegisters</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OHX DPS Address</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>XLINK Dptr Addresses</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Linker Code Banking</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>DoFill</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>FillerByte</name>\r
+          <state>0xFF</state>\r
+        </option>\r
+        <option>\r
+          <name>DoCrc</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CrcSize</name>\r
+          <version>0</version>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CrcAlgo</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CrcPoly</name>\r
+          <state>0x11021</state>\r
+        </option>\r
+        <option>\r
+          <name>CrcCompl</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>RangeCheckAlternatives</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>SuppressAllWarn</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>SuppressDiags</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>TreatAsWarn</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>TreatAsErr</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>ModuleLocalSym</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CrcBitOrder</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>IncludeSuppressed</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>ModuleSummary</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>xcProgramEntryLabel</name>\r
+          <state>__program_start</state>\r
+        </option>\r
+        <option>\r
+          <name>DebugInformation</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>RuntimeControl</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>IoEmulation</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>AllowExtraOutput</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>GenerateExtraOutput</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>XExtraOutOverride</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>ExtraOutputFile</name>\r
+          <state>cc1111_usb_dongle.sim</state>\r
+        </option>\r
+        <option>\r
+          <name>ExtraOutputFormat</name>\r
+          <version>11</version>\r
+          <state>60</state>\r
+        </option>\r
+        <option>\r
+          <name>ExtraFormatVariant</name>\r
+          <version>8</version>\r
+          <state>2</state>\r
+        </option>\r
+        <option>\r
+          <name>xcOverrideProgramEntryLabel</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>xcProgramEntryLabelSelect</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>ListOutputFormat</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>BufferedTermOutput</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OverlaySystemMap</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>RawBinaryFile</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>RawBinarySymbol</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>RawBinarySegment</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>RawBinaryAlign</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>XLinkMisraHandler</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>XcRTLibraryFile</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Linker Idata Stack Size</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Linker Ext Stack Size</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Linker Pdata Stack Size</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Linker Xdata Stack Size</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Linker Xdata Heap Size</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Linker Far Heap Size</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Linker Huge Heap Size</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Linker Extra Options Check</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Linker Extra Options Edit</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>CrcAlign</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CrcInitialValue</name>\r
+          <state>0x0</state>\r
+        </option>\r
+        <option>\r
+          <name>Linker Far22 Heap Size</name>\r
+          <state>1</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>XAR</name>\r
+      <archiveVersion>1</archiveVersion>\r
+      <data>\r
+        <version>0</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>XARInputs</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>XAROverride</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>XAR Standard name</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>XAROutput</name>\r
+          <state>###Uninitialized###</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>BILINK</name>\r
+      <archiveVersion>0</archiveVersion>\r
+      <data/>\r
+    </settings>\r
+  </configuration>\r
+  <configuration>\r
+    <name>868MHz - Unrestricted IAR Workbench (Europe)</name>\r
+    <toolchain>\r
+      <name>8051</name>\r
+    </toolchain>\r
+    <debug>1</debug>\r
+    <settings>\r
+      <name>General</name>\r
+      <archiveVersion>1</archiveVersion>\r
+      <data>\r
+        <version>4</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>DerivativeDescriptionFile</name>\r
+          <state>$TOOLKIT_DIR$\config\devices\Texas Instruments\CC1111.i51</state>\r
+        </option>\r
+        <option>\r
+          <name>Previous Derivative File</name>\r
+          <state>$TOOLKIT_DIR$\config\devices\Texas Instruments\CC1111.i51</state>\r
+        </option>\r
+        <option>\r
+          <name>Showed Derivative</name>\r
+          <state>CC1111</state>\r
+        </option>\r
+        <option>\r
+          <name>CPU Core</name>\r
+          <version>1</version>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CPU Core Slave</name>\r
+          <version>1</version>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Code Memory Model</name>\r
+          <version>1</version>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Code Memory Model slave</name>\r
+          <version>1</version>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Data Memory Model</name>\r
+          <version>0</version>\r
+          <state>2</state>\r
+        </option>\r
+        <option>\r
+          <name>Data Memory Model slave</name>\r
+          <version>0</version>\r
+          <state>2</state>\r
+        </option>\r
+        <option>\r
+          <name>Use extended stack</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Use extended stack slave</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Start of extended stack</name>\r
+          <state>0x002000</state>\r
+        </option>\r
+        <option>\r
+          <name>Calling convention</name>\r
+          <version>0</version>\r
+          <state>4</state>\r
+        </option>\r
+        <option>\r
+          <name>Workseg Size</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Constant Placement</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Datapointer Size</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Nr of Datapointers</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Switch Method</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Mask Value</name>\r
+          <state>0x00</state>\r
+        </option>\r
+        <option>\r
+          <name>DPS Address</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>Sfr Visibility</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>DPTR Addresses</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>CodeBankReg</name>\r
+          <state>0x90</state>\r
+        </option>\r
+        <option>\r
+          <name>CodeBankStart</name>\r
+          <state>0x8000</state>\r
+        </option>\r
+        <option>\r
+          <name>CodeBankSize</name>\r
+          <state>0xFFFF</state>\r
+        </option>\r
+        <option>\r
+          <name>ExePath</name>\r
+          <state>868MHz - Unrestricted IAR Workbench (Europe)\Exe</state>\r
+        </option>\r
+        <option>\r
+          <name>ObjPath</name>\r
+          <state>868MHz - Unrestricted IAR Workbench (Europe)\Obj</state>\r
+        </option>\r
+        <option>\r
+          <name>ListPath</name>\r
+          <state>868MHz - Unrestricted IAR Workbench (Europe)\List</state>\r
+        </option>\r
+        <option>\r
+          <name>GOutputBinary</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>GRuntimeLibSelect</name>\r
+          <version>0</version>\r
+          <state>4</state>\r
+        </option>\r
+        <option>\r
+          <name>GRuntimeLibSelectSlave</name>\r
+          <version>0</version>\r
+          <state>4</state>\r
+        </option>\r
+        <option>\r
+          <name>RTDescription</name>\r
+          <state>Use the legacy C runtime library.</state>\r
+        </option>\r
+        <option>\r
+          <name>RTConfigPath</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>RTLibraryPath</name>\r
+          <state>$TOOLKIT_DIR$\LIB\CLIB\cl-pli-nlxd-1e16x01.r51</state>\r
+        </option>\r
+        <option>\r
+          <name>Input variant</name>\r
+          <version>0</version>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Input description</name>\r
+          <state>Full formatting.</state>\r
+        </option>\r
+        <option>\r
+          <name>Output variant</name>\r
+          <version>0</version>\r
+          <state>3</state>\r
+        </option>\r
+        <option>\r
+          <name>Output description</name>\r
+          <state>No float, no field width, no precision.</state>\r
+        </option>\r
+        <option>\r
+          <name>GeneralEnableMisra</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>GeneralMisraVerbose</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>General Idata Stack Size</name>\r
+          <state>0xb0</state>\r
+        </option>\r
+        <option>\r
+          <name>General Pdata Stack Size</name>\r
+          <state>0x80</state>\r
+        </option>\r
+        <option>\r
+          <name>General Xdata Stack Size</name>\r
+          <state>0x3ff</state>\r
+        </option>\r
+        <option>\r
+          <name>General Ext Stack Size</name>\r
+          <state>0x3FF</state>\r
+        </option>\r
+        <option>\r
+          <name>General Xdata Heap Size</name>\r
+          <state>0xFF</state>\r
+        </option>\r
+        <option>\r
+          <name>General Far Heap Size</name>\r
+          <state>0xFFF</state>\r
+        </option>\r
+        <option>\r
+          <name>General Huge Heap Size</name>\r
+          <state>0xFFF</state>\r
+        </option>\r
+        <option>\r
+          <name>CodeBankNrOfs</name>\r
+          <state>0x03</state>\r
+        </option>\r
+        <option>\r
+          <name>CodeBankRegMask</name>\r
+          <state>0x30</state>\r
+        </option>\r
+        <option>\r
+          <name>GeneralMisraRules98</name>\r
+          <version>0</version>\r
+          <state>1000111110110101101110011100111111101110011011000101110111101101100111111111111100110011111001110111001111111111111111111111111</state>\r
+        </option>\r
+        <option>\r
+          <name>PDATA 8-15 register address</name>\r
+          <state>0xA0</state>\r
+        </option>\r
+        <option>\r
+          <name>PDATA 16-31 register address</name>\r
+          <state>0xEA</state>\r
+        </option>\r
+        <option>\r
+          <name>General Far22 Heap Size</name>\r
+          <state>0xFFF</state>\r
+        </option>\r
+        <option>\r
+          <name>GeneralMisraVer</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>GeneralMisraRules04</name>\r
+          <version>0</version>\r
+          <state>111101110010111111111000110111111111111111111111111110010111101111010101111111111111111111111111101111111011111001111011111011111111111111111</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>ICC8051</name>\r
+      <archiveVersion>3</archiveVersion>\r
+      <data>\r
+        <version>7</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>CCOptSizeSpeedSlave</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCOptimizationSlave</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OutputFile</name>\r
+          <state>$FILE_BNAME$.r51</state>\r
+        </option>\r
+        <option>\r
+          <name>CCDefines</name>\r
+          <state>ISM_EU</state>\r
+          <state>MCU_H=&lt;ioCC1111.h></state>\r
+          <state>chip=1111</state>\r
+          <state>RF_FREQUENCY=868000</state>\r
+          <state>MRFI_CC1111</state>\r
+          <state>NDEBUG</state>\r
+        </option>\r
+        <option>\r
+          <name>CCPreprocFile</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCPreprocComments</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCPreprocLine</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCListCFile</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CCListCMnemonics</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CCListCMessages</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CCListAssFile</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCListAssSource</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCEnableRemarks</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCDiagSuppress</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>CCDiagRemark</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>CCDiagWarning</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>CCDiagError</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>CCObjPrefix</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>LangConform</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CharIs</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CCRequirePrototypes</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCMultibyteSupport</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCMigrationPreprocExtentions</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCAllowList</name>\r
+          <version>1</version>\r
+          <state>10010</state>\r
+        </option>\r
+        <option>\r
+          <name>CCObjUseModuleName</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCObjModuleName</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>CCDebugInfo</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OCCProcessorVariant</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OCCDptr</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OCCDataMemoryModel</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OCCCodeMemoryModel</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OCCCallingConvention</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OCCConstantPlacement</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OCCNrOfVirtualRegisters</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Extended stack</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CCDiagWarnAreErr</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCCompilerRuntimeInfo</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>RomMonBpPadding</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>PreInclude</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>CCLibConfigHeader</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CCLangSelect</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>NoUBROFMessages</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CompilerMisraOverride</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Compiler Extra Options Check</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Compiler Extra Options Edit</name>\r
+          <state>-f"$PROJ_DIR$\simpliciti\Configuration\Access Point\smpl_config.dat"</state>\r
+          <state>-f"$PROJ_DIR$\simpliciti\Configuration\smpl_nwk_config.dat"</state>\r
+        </option>\r
+        <option>\r
+          <name>CCIncludePath2</name>\r
+          <state>$PROJ_DIR$\bm-br1\</state>\r
+          <state>$PROJ_DIR$\HAL\include\</state>\r
+          <state>$PROJ_DIR$\HAL\source\</state>\r
+          <state>$PROJ_DIR$\wbsl\</state>\r
+          <state>$PROJ_DIR$\usb\</state>\r
+          <state>$PROJ_DIR$\usb\class_cdc\</state>\r
+          <state>$PROJ_DIR$\usb\library\</state>\r
+          <state>$PROJ_DIR$\usb\library\ccxx11</state>\r
+          <state>$PROJ_DIR$\sync\</state>\r
+          <state>$PROJ_DIR$\simpliciti\</state>\r
+          <state>$PROJ_DIR$\simpliciti\Components\bsp</state>\r
+          <state>$PROJ_DIR$\simpliciti\Components\bsp\drivers</state>\r
+          <state>$PROJ_DIR$\simpliciti\Components\bsp\boards\RFUSB</state>\r
+          <state>$PROJ_DIR$\simpliciti\Components\mrfi</state>\r
+          <state>$PROJ_DIR$\simpliciti\Components\nwk</state>\r
+          <state>$PROJ_DIR$\simpliciti\Components\nwk_applications</state>\r
+        </option>\r
+        <option>\r
+          <name>CCStdIncCheck</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCStdIncludePath</name>\r
+          <state>$TOOLKIT_DIR$\INC\</state>\r
+          <state>$TOOLKIT_DIR$\INC\CLIB\</state>\r
+        </option>\r
+        <option>\r
+          <name>CompilerMisraRules98</name>\r
+          <version>0</version>\r
+          <state>1000111110110101101110011100111111101110011011000101110111101101100111111111111100110011111001110111001111111111111111111111111</state>\r
+        </option>\r
+        <option>\r
+          <name>CCOverrideModuleTypeDefault</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCRadioModuleType</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCRadioModuleTypeSlave</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CCOptLevel</name>\r
+          <state>2</state>\r
+        </option>\r
+        <option>\r
+          <name>CCOptStrategy</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCOptLevelSlave</name>\r
+          <state>2</state>\r
+        </option>\r
+        <option>\r
+          <name>CompilerMisraRules04</name>\r
+          <version>0</version>\r
+          <state>111101110010111111111000110111111111111111111111111110010111101111010101111111111111111111111111101111111011111001111011111011111111111111111</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>A8051</name>\r
+      <archiveVersion>2</archiveVersion>\r
+      <data>\r
+        <version>4</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>OAProcessorVariant</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Generated Preproc defines</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AObjPrefix</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OutputFile</name>\r
+          <state>$FILE_BNAME$.r51</state>\r
+        </option>\r
+        <option>\r
+          <name>ACaseSensitivity</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>MacroChars</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Asm multibyte support</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Debug</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>AList</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AListHeader</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>AListing</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Includes</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>MacDefs</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>MacExps</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>MacExec</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OnlyAssed</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>MultiLine</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>NoStruct</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>PageLengthCheck</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>PageLength</name>\r
+          <state>80</state>\r
+        </option>\r
+        <option>\r
+          <name>TabSpacing</name>\r
+          <state>8</state>\r
+        </option>\r
+        <option>\r
+          <name>AXRef</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AXRefDefines</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AXRefInternal</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AXRefDual</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AIncludes</name>\r
+          <state>$TOOLKIT_DIR$\INC\</state>\r
+          <state>$PROJ_DIR$\</state>\r
+          <state>$PROJ_DIR$\USB\INCLUDE</state>\r
+          <state>$PROJ_DIR$\USB\SOURCE</state>\r
+        </option>\r
+        <option>\r
+          <name>ADefines</name>\r
+          <state>chip=1111</state>\r
+        </option>\r
+        <option>\r
+          <name>AWarnEnable</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AWarnWhat</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AWarnOne</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>AWarnRange1</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>AWarnRange2</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>Assembler Extra Options Check</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Assembler Extra Options Edit</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>AMaxErrOn</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AMaxErrNum</name>\r
+          <state>100</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>CUSTOM</name>\r
+      <archiveVersion>3</archiveVersion>\r
+      <data>\r
+        <extensions></extensions>\r
+        <cmdline></cmdline>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>BICOMP</name>\r
+      <archiveVersion>0</archiveVersion>\r
+      <data/>\r
+    </settings>\r
+    <settings>\r
+      <name>BUILDACTION</name>\r
+      <archiveVersion>1</archiveVersion>\r
+      <data>\r
+        <prebuild></prebuild>\r
+        <postbuild></postbuild>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>XLINK</name>\r
+      <archiveVersion>3</archiveVersion>\r
+      <data>\r
+        <version>17</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>XInfineonPFlashCacheBug</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OXLibIOConfig</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>XOutOverride</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OutputFile</name>\r
+          <state>ez430-chronos-AP-868MHz.hex</state>\r
+        </option>\r
+        <option>\r
+          <name>OutputFormat</name>\r
+          <version>11</version>\r
+          <state>23</state>\r
+        </option>\r
+        <option>\r
+          <name>FormatVariant</name>\r
+          <version>8</version>\r
+          <state>2</state>\r
+        </option>\r
+        <option>\r
+          <name>SecondaryOutputFile</name>\r
+          <state>(None for the selected format)</state>\r
+        </option>\r
+        <option>\r
+          <name>XDefines</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>AlwaysOutput</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OverlapWarnings</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>NoGlobalCheck</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>XList</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>SegmentMap</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>ListSymbols</name>\r
+          <state>2</state>\r
+        </option>\r
+        <option>\r
+          <name>PageLengthCheck</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>PageLength</name>\r
+          <state>80</state>\r
+        </option>\r
+        <option>\r
+          <name>XIncludes</name>\r
+          <state>$TOOLKIT_DIR$\LIB\</state>\r
+        </option>\r
+        <option>\r
+          <name>ModuleStatus</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>XclOverride</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>XclFile</name>\r
+          <state>$TOOLKIT_DIR$\config\lnk51ew_cc1111.xcl</state>\r
+        </option>\r
+        <option>\r
+          <name>XclFileSlave</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>Config Include Dir</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>XLink Dptr Switch mask</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OHXNrOfVirtualRegisters</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OHX DPS Address</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>XLINK Dptr Addresses</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Linker Code Banking</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>DoFill</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>FillerByte</name>\r
+          <state>0xFF</state>\r
+        </option>\r
+        <option>\r
+          <name>DoCrc</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CrcSize</name>\r
+          <version>0</version>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CrcAlgo</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CrcPoly</name>\r
+          <state>0x11021</state>\r
+        </option>\r
+        <option>\r
+          <name>CrcCompl</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>RangeCheckAlternatives</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>SuppressAllWarn</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>SuppressDiags</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>TreatAsWarn</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>TreatAsErr</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>ModuleLocalSym</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CrcBitOrder</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>IncludeSuppressed</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>ModuleSummary</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>xcProgramEntryLabel</name>\r
+          <state>__program_start</state>\r
+        </option>\r
+        <option>\r
+          <name>DebugInformation</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>RuntimeControl</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>IoEmulation</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>AllowExtraOutput</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>GenerateExtraOutput</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>XExtraOutOverride</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>ExtraOutputFile</name>\r
+          <state>cc1111_usb_dongle.sim</state>\r
+        </option>\r
+        <option>\r
+          <name>ExtraOutputFormat</name>\r
+          <version>11</version>\r
+          <state>60</state>\r
+        </option>\r
+        <option>\r
+          <name>ExtraFormatVariant</name>\r
+          <version>8</version>\r
+          <state>2</state>\r
+        </option>\r
+        <option>\r
+          <name>xcOverrideProgramEntryLabel</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>xcProgramEntryLabelSelect</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>ListOutputFormat</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>BufferedTermOutput</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OverlaySystemMap</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>RawBinaryFile</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>RawBinarySymbol</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>RawBinarySegment</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>RawBinaryAlign</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>XLinkMisraHandler</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>XcRTLibraryFile</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Linker Idata Stack Size</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Linker Ext Stack Size</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Linker Pdata Stack Size</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Linker Xdata Stack Size</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Linker Xdata Heap Size</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Linker Far Heap Size</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Linker Huge Heap Size</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Linker Extra Options Check</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Linker Extra Options Edit</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>CrcAlign</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CrcInitialValue</name>\r
+          <state>0x0</state>\r
+        </option>\r
+        <option>\r
+          <name>Linker Far22 Heap Size</name>\r
+          <state>1</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>XAR</name>\r
+      <archiveVersion>1</archiveVersion>\r
+      <data>\r
+        <version>0</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>XARInputs</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>XAROverride</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>XAR Standard name</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>XAROutput</name>\r
+          <state>###Uninitialized###</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>BILINK</name>\r
+      <archiveVersion>0</archiveVersion>\r
+      <data/>\r
+    </settings>\r
+  </configuration>\r
+  <configuration>\r
+    <name>433MHz - Unrestricted IAR Workbench (Other regions)</name>\r
+    <toolchain>\r
+      <name>8051</name>\r
+    </toolchain>\r
+    <debug>1</debug>\r
+    <settings>\r
+      <name>General</name>\r
+      <archiveVersion>1</archiveVersion>\r
+      <data>\r
+        <version>4</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>DerivativeDescriptionFile</name>\r
+          <state>$TOOLKIT_DIR$\config\devices\Texas Instruments\CC1111.i51</state>\r
+        </option>\r
+        <option>\r
+          <name>Previous Derivative File</name>\r
+          <state>$TOOLKIT_DIR$\config\devices\Texas Instruments\CC1111.i51</state>\r
+        </option>\r
+        <option>\r
+          <name>Showed Derivative</name>\r
+          <state>CC1111</state>\r
+        </option>\r
+        <option>\r
+          <name>CPU Core</name>\r
+          <version>1</version>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CPU Core Slave</name>\r
+          <version>1</version>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Code Memory Model</name>\r
+          <version>1</version>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Code Memory Model slave</name>\r
+          <version>1</version>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Data Memory Model</name>\r
+          <version>0</version>\r
+          <state>2</state>\r
+        </option>\r
+        <option>\r
+          <name>Data Memory Model slave</name>\r
+          <version>0</version>\r
+          <state>2</state>\r
+        </option>\r
+        <option>\r
+          <name>Use extended stack</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Use extended stack slave</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Start of extended stack</name>\r
+          <state>0x002000</state>\r
+        </option>\r
+        <option>\r
+          <name>Calling convention</name>\r
+          <version>0</version>\r
+          <state>4</state>\r
+        </option>\r
+        <option>\r
+          <name>Workseg Size</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Constant Placement</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Datapointer Size</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Nr of Datapointers</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Switch Method</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Mask Value</name>\r
+          <state>0x00</state>\r
+        </option>\r
+        <option>\r
+          <name>DPS Address</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>Sfr Visibility</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>DPTR Addresses</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>CodeBankReg</name>\r
+          <state>0x90</state>\r
+        </option>\r
+        <option>\r
+          <name>CodeBankStart</name>\r
+          <state>0x8000</state>\r
+        </option>\r
+        <option>\r
+          <name>CodeBankSize</name>\r
+          <state>0xFFFF</state>\r
+        </option>\r
+        <option>\r
+          <name>ExePath</name>\r
+          <state>433MHz - Unrestricted IAR Workbench (Other regions)\Exe</state>\r
+        </option>\r
+        <option>\r
+          <name>ObjPath</name>\r
+          <state>433MHz - Unrestricted IAR Workbench (Other regions)\Obj</state>\r
+        </option>\r
+        <option>\r
+          <name>ListPath</name>\r
+          <state>433MHz - Unrestricted IAR Workbench (Other regions)\List</state>\r
+        </option>\r
+        <option>\r
+          <name>GOutputBinary</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>GRuntimeLibSelect</name>\r
+          <version>0</version>\r
+          <state>4</state>\r
+        </option>\r
+        <option>\r
+          <name>GRuntimeLibSelectSlave</name>\r
+          <version>0</version>\r
+          <state>4</state>\r
+        </option>\r
+        <option>\r
+          <name>RTDescription</name>\r
+          <state>Use the legacy C runtime library.</state>\r
+        </option>\r
+        <option>\r
+          <name>RTConfigPath</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>RTLibraryPath</name>\r
+          <state>$TOOLKIT_DIR$\LIB\CLIB\cl-pli-nlxd-1e16x01.r51</state>\r
+        </option>\r
+        <option>\r
+          <name>Input variant</name>\r
+          <version>0</version>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Input description</name>\r
+          <state>Full formatting.</state>\r
+        </option>\r
+        <option>\r
+          <name>Output variant</name>\r
+          <version>0</version>\r
+          <state>3</state>\r
+        </option>\r
+        <option>\r
+          <name>Output description</name>\r
+          <state>No float, no field width, no precision.</state>\r
+        </option>\r
+        <option>\r
+          <name>GeneralEnableMisra</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>GeneralMisraVerbose</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>General Idata Stack Size</name>\r
+          <state>0xb0</state>\r
+        </option>\r
+        <option>\r
+          <name>General Pdata Stack Size</name>\r
+          <state>0x80</state>\r
+        </option>\r
+        <option>\r
+          <name>General Xdata Stack Size</name>\r
+          <state>0x3ff</state>\r
+        </option>\r
+        <option>\r
+          <name>General Ext Stack Size</name>\r
+          <state>0x3FF</state>\r
+        </option>\r
+        <option>\r
+          <name>General Xdata Heap Size</name>\r
+          <state>0xFF</state>\r
+        </option>\r
+        <option>\r
+          <name>General Far Heap Size</name>\r
+          <state>0xFFF</state>\r
+        </option>\r
+        <option>\r
+          <name>General Huge Heap Size</name>\r
+          <state>0xFFF</state>\r
+        </option>\r
+        <option>\r
+          <name>CodeBankNrOfs</name>\r
+          <state>0x03</state>\r
+        </option>\r
+        <option>\r
+          <name>CodeBankRegMask</name>\r
+          <state>0x30</state>\r
+        </option>\r
+        <option>\r
+          <name>GeneralMisraRules98</name>\r
+          <version>0</version>\r
+          <state>1000111110110101101110011100111111101110011011000101110111101101100111111111111100110011111001110111001111111111111111111111111</state>\r
+        </option>\r
+        <option>\r
+          <name>PDATA 8-15 register address</name>\r
+          <state>0xA0</state>\r
+        </option>\r
+        <option>\r
+          <name>PDATA 16-31 register address</name>\r
+          <state>0xEA</state>\r
+        </option>\r
+        <option>\r
+          <name>General Far22 Heap Size</name>\r
+          <state>0xFFF</state>\r
+        </option>\r
+        <option>\r
+          <name>GeneralMisraVer</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>GeneralMisraRules04</name>\r
+          <version>0</version>\r
+          <state>111101110010111111111000110111111111111111111111111110010111101111010101111111111111111111111111101111111011111001111011111011111111111111111</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>ICC8051</name>\r
+      <archiveVersion>3</archiveVersion>\r
+      <data>\r
+        <version>7</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>CCOptSizeSpeedSlave</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCOptimizationSlave</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OutputFile</name>\r
+          <state>$FILE_BNAME$.r51</state>\r
+        </option>\r
+        <option>\r
+          <name>CCDefines</name>\r
+          <state>ISM_LF</state>\r
+          <state>MCU_H=&lt;ioCC1111.h></state>\r
+          <state>chip=1111</state>\r
+          <state>RF_FREQUENCY=433000</state>\r
+          <state>MRFI_CC1111</state>\r
+          <state>NDEBUG</state>\r
+        </option>\r
+        <option>\r
+          <name>CCPreprocFile</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCPreprocComments</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCPreprocLine</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCListCFile</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CCListCMnemonics</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CCListCMessages</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CCListAssFile</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCListAssSource</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCEnableRemarks</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCDiagSuppress</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>CCDiagRemark</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>CCDiagWarning</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>CCDiagError</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>CCObjPrefix</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>LangConform</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CharIs</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CCRequirePrototypes</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCMultibyteSupport</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCMigrationPreprocExtentions</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCAllowList</name>\r
+          <version>1</version>\r
+          <state>10010</state>\r
+        </option>\r
+        <option>\r
+          <name>CCObjUseModuleName</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCObjModuleName</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>CCDebugInfo</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OCCProcessorVariant</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OCCDptr</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OCCDataMemoryModel</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OCCCodeMemoryModel</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OCCCallingConvention</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OCCConstantPlacement</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OCCNrOfVirtualRegisters</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Extended stack</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CCDiagWarnAreErr</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCCompilerRuntimeInfo</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>RomMonBpPadding</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>PreInclude</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>CCLibConfigHeader</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CCLangSelect</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>NoUBROFMessages</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CompilerMisraOverride</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Compiler Extra Options Check</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Compiler Extra Options Edit</name>\r
+          <state>-f"$PROJ_DIR$\simpliciti\Configuration\Access Point\smpl_config.dat"</state>\r
+          <state>-f"$PROJ_DIR$\simpliciti\Configuration\smpl_nwk_config.dat"</state>\r
+        </option>\r
+        <option>\r
+          <name>CCIncludePath2</name>\r
+          <state>$PROJ_DIR$\bm-br1\</state>\r
+          <state>$PROJ_DIR$\HAL\include\</state>\r
+          <state>$PROJ_DIR$\HAL\source\</state>\r
+          <state>$PROJ_DIR$\wbsl\</state>\r
+          <state>$PROJ_DIR$\usb\</state>\r
+          <state>$PROJ_DIR$\usb\class_cdc\</state>\r
+          <state>$PROJ_DIR$\usb\library\</state>\r
+          <state>$PROJ_DIR$\usb\library\ccxx11</state>\r
+          <state>$PROJ_DIR$\sync\</state>\r
+          <state>$PROJ_DIR$\simpliciti\</state>\r
+          <state>$PROJ_DIR$\simpliciti\Components\bsp</state>\r
+          <state>$PROJ_DIR$\simpliciti\Components\bsp\drivers</state>\r
+          <state>$PROJ_DIR$\simpliciti\Components\bsp\boards\RFUSB</state>\r
+          <state>$PROJ_DIR$\simpliciti\Components\mrfi</state>\r
+          <state>$PROJ_DIR$\simpliciti\Components\nwk</state>\r
+          <state>$PROJ_DIR$\simpliciti\Components\nwk_applications</state>\r
+        </option>\r
+        <option>\r
+          <name>CCStdIncCheck</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCStdIncludePath</name>\r
+          <state>$TOOLKIT_DIR$\INC\</state>\r
+          <state>$TOOLKIT_DIR$\INC\CLIB\</state>\r
+        </option>\r
+        <option>\r
+          <name>CompilerMisraRules98</name>\r
+          <version>0</version>\r
+          <state>1000111110110101101110011100111111101110011011000101110111101101100111111111111100110011111001110111001111111111111111111111111</state>\r
+        </option>\r
+        <option>\r
+          <name>CCOverrideModuleTypeDefault</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCRadioModuleType</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCRadioModuleTypeSlave</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CCOptLevel</name>\r
+          <state>2</state>\r
+        </option>\r
+        <option>\r
+          <name>CCOptStrategy</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CCOptLevelSlave</name>\r
+          <state>2</state>\r
+        </option>\r
+        <option>\r
+          <name>CompilerMisraRules04</name>\r
+          <version>0</version>\r
+          <state>111101110010111111111000110111111111111111111111111110010111101111010101111111111111111111111111101111111011111001111011111011111111111111111</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>A8051</name>\r
+      <archiveVersion>2</archiveVersion>\r
+      <data>\r
+        <version>4</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>OAProcessorVariant</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Generated Preproc defines</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AObjPrefix</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OutputFile</name>\r
+          <state>$FILE_BNAME$.r51</state>\r
+        </option>\r
+        <option>\r
+          <name>ACaseSensitivity</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>MacroChars</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Asm multibyte support</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Debug</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>AList</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AListHeader</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>AListing</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Includes</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>MacDefs</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>MacExps</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>MacExec</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OnlyAssed</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>MultiLine</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>NoStruct</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>PageLengthCheck</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>PageLength</name>\r
+          <state>80</state>\r
+        </option>\r
+        <option>\r
+          <name>TabSpacing</name>\r
+          <state>8</state>\r
+        </option>\r
+        <option>\r
+          <name>AXRef</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AXRefDefines</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AXRefInternal</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AXRefDual</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AIncludes</name>\r
+          <state>$TOOLKIT_DIR$\INC\</state>\r
+          <state>$PROJ_DIR$\</state>\r
+          <state>$PROJ_DIR$\USB\INCLUDE</state>\r
+          <state>$PROJ_DIR$\USB\SOURCE</state>\r
+        </option>\r
+        <option>\r
+          <name>ADefines</name>\r
+          <state>chip=1111</state>\r
+        </option>\r
+        <option>\r
+          <name>AWarnEnable</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AWarnWhat</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AWarnOne</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>AWarnRange1</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>AWarnRange2</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>Assembler Extra Options Check</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Assembler Extra Options Edit</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>AMaxErrOn</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>AMaxErrNum</name>\r
+          <state>100</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>CUSTOM</name>\r
+      <archiveVersion>3</archiveVersion>\r
+      <data>\r
+        <extensions></extensions>\r
+        <cmdline></cmdline>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>BICOMP</name>\r
+      <archiveVersion>0</archiveVersion>\r
+      <data/>\r
+    </settings>\r
+    <settings>\r
+      <name>BUILDACTION</name>\r
+      <archiveVersion>1</archiveVersion>\r
+      <data>\r
+        <prebuild></prebuild>\r
+        <postbuild></postbuild>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>XLINK</name>\r
+      <archiveVersion>3</archiveVersion>\r
+      <data>\r
+        <version>17</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>XInfineonPFlashCacheBug</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OXLibIOConfig</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>XOutOverride</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OutputFile</name>\r
+          <state>ez430-chronos-AP-433MHz.hex</state>\r
+        </option>\r
+        <option>\r
+          <name>OutputFormat</name>\r
+          <version>11</version>\r
+          <state>23</state>\r
+        </option>\r
+        <option>\r
+          <name>FormatVariant</name>\r
+          <version>8</version>\r
+          <state>2</state>\r
+        </option>\r
+        <option>\r
+          <name>SecondaryOutputFile</name>\r
+          <state>(None for the selected format)</state>\r
+        </option>\r
+        <option>\r
+          <name>XDefines</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>AlwaysOutput</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OverlapWarnings</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>NoGlobalCheck</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>XList</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>SegmentMap</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>ListSymbols</name>\r
+          <state>2</state>\r
+        </option>\r
+        <option>\r
+          <name>PageLengthCheck</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>PageLength</name>\r
+          <state>80</state>\r
+        </option>\r
+        <option>\r
+          <name>XIncludes</name>\r
+          <state>$TOOLKIT_DIR$\LIB\</state>\r
+        </option>\r
+        <option>\r
+          <name>ModuleStatus</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>XclOverride</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>XclFile</name>\r
+          <state>$TOOLKIT_DIR$\config\lnk51ew_cc1111.xcl</state>\r
+        </option>\r
+        <option>\r
+          <name>XclFileSlave</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>Config Include Dir</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>XLink Dptr Switch mask</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OHXNrOfVirtualRegisters</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>OHX DPS Address</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>XLINK Dptr Addresses</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Linker Code Banking</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>DoFill</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>FillerByte</name>\r
+          <state>0xFF</state>\r
+        </option>\r
+        <option>\r
+          <name>DoCrc</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CrcSize</name>\r
+          <version>0</version>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CrcAlgo</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CrcPoly</name>\r
+          <state>0x11021</state>\r
+        </option>\r
+        <option>\r
+          <name>CrcCompl</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>RangeCheckAlternatives</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>SuppressAllWarn</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>SuppressDiags</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>TreatAsWarn</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>TreatAsErr</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>ModuleLocalSym</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>CrcBitOrder</name>\r
+          <version>0</version>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>IncludeSuppressed</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>ModuleSummary</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>xcProgramEntryLabel</name>\r
+          <state>__program_start</state>\r
+        </option>\r
+        <option>\r
+          <name>DebugInformation</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>RuntimeControl</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>IoEmulation</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>AllowExtraOutput</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>GenerateExtraOutput</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>XExtraOutOverride</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>ExtraOutputFile</name>\r
+          <state>cc1111_usb_dongle.sim</state>\r
+        </option>\r
+        <option>\r
+          <name>ExtraOutputFormat</name>\r
+          <version>11</version>\r
+          <state>60</state>\r
+        </option>\r
+        <option>\r
+          <name>ExtraFormatVariant</name>\r
+          <version>8</version>\r
+          <state>2</state>\r
+        </option>\r
+        <option>\r
+          <name>xcOverrideProgramEntryLabel</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>xcProgramEntryLabelSelect</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>ListOutputFormat</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>BufferedTermOutput</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>OverlaySystemMap</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>RawBinaryFile</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>RawBinarySymbol</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>RawBinarySegment</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>RawBinaryAlign</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>XLinkMisraHandler</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>XcRTLibraryFile</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Linker Idata Stack Size</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Linker Ext Stack Size</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Linker Pdata Stack Size</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Linker Xdata Stack Size</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Linker Xdata Heap Size</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Linker Far Heap Size</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Linker Huge Heap Size</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>Linker Extra Options Check</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>Linker Extra Options Edit</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>CrcAlign</name>\r
+          <state>1</state>\r
+        </option>\r
+        <option>\r
+          <name>CrcInitialValue</name>\r
+          <state>0x0</state>\r
+        </option>\r
+        <option>\r
+          <name>Linker Far22 Heap Size</name>\r
+          <state>1</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>XAR</name>\r
+      <archiveVersion>1</archiveVersion>\r
+      <data>\r
+        <version>0</version>\r
+        <wantNonLocal>1</wantNonLocal>\r
+        <debug>1</debug>\r
+        <option>\r
+          <name>XARInputs</name>\r
+          <state></state>\r
+        </option>\r
+        <option>\r
+          <name>XAROverride</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>XAR Standard name</name>\r
+          <state>0</state>\r
+        </option>\r
+        <option>\r
+          <name>XAROutput</name>\r
+          <state>###Uninitialized###</state>\r
+        </option>\r
+      </data>\r
+    </settings>\r
+    <settings>\r
+      <name>BILINK</name>\r
+      <archiveVersion>0</archiveVersion>\r
+      <data/>\r
+    </settings>\r
+  </configuration>\r
+  <group>\r
+    <name>BlueRobin</name>\r
+    <file>\r
+      <name>$PROJ_DIR$\bm-br1\BlueRobin_TX_433MHz.r51</name>\r
+      <excluded>\r
+        <configuration>915MHz - Limited IAR Kickstart (USA)</configuration>\r
+        <configuration>868MHz - Limited IAR Kickstart (Europe)</configuration>\r
+        <configuration>915MHz - Unrestricted IAR Workbench (USA)</configuration>\r
+        <configuration>868MHz - Unrestricted IAR Workbench (Europe)</configuration>\r
+      </excluded>\r
+    </file>\r
+    <file>\r
+      <name>$PROJ_DIR$\bm-br1\BlueRobin_TX_868MHz.r51</name>\r
+      <excluded>\r
+        <configuration>915MHz - Limited IAR Kickstart (USA)</configuration>\r
+        <configuration>433MHz - Limited IAR Kickstart (Other regions)</configuration>\r
+        <configuration>915MHz - Unrestricted IAR Workbench (USA)</configuration>\r
+        <configuration>433MHz - Unrestricted IAR Workbench (Other regions)</configuration>\r
+      </excluded>\r
+    </file>\r
+    <file>\r
+      <name>$PROJ_DIR$\bm-br1\BlueRobin_TX_915MHz.r51</name>\r
+      <excluded>\r
+        <configuration>868MHz - Limited IAR Kickstart (Europe)</configuration>\r
+        <configuration>433MHz - Limited IAR Kickstart (Other regions)</configuration>\r
+        <configuration>868MHz - Unrestricted IAR Workbench (Europe)</configuration>\r
+        <configuration>433MHz - Unrestricted IAR Workbench (Other regions)</configuration>\r
+      </excluded>\r
+    </file>\r
+    <file>\r
+      <name>$PROJ_DIR$\bm-br1\bm.h</name>\r
+    </file>\r
+    <file>\r
+      <name>$PROJ_DIR$\bm-br1\project.h</name>\r
+    </file>\r
+  </group>\r
+  <group>\r
+    <name>HAL</name>\r
+    <group>\r
+      <name>include</name>\r
+      <file>\r
+        <name>$PROJ_DIR$\HAL\include\hal.h</name>\r
+      </file>\r
+      <file>\r
+        <name>$PROJ_DIR$\HAL\include\hal_defs.h</name>\r
+      </file>\r
+      <file>\r
+        <name>$PROJ_DIR$\HAL\include\hal_types.h</name>\r
+      </file>\r
+    </group>\r
+    <group>\r
+      <name>source</name>\r
+      <file>\r
+        <name>$PROJ_DIR$\HAL\source\hal_int.c</name>\r
+      </file>\r
+    </group>\r
+  </group>\r
+  <group>\r
+    <name>SimpliciTI</name>\r
+    <group>\r
+      <name>Applications</name>\r
+      <file>\r
+        <name>$PROJ_DIR$\simpliciti\Applications\app_remap_led.h</name>\r
+      </file>\r
+      <file>\r
+        <name>$PROJ_DIR$\simpliciti\Applications\main_AP_BM.c</name>\r
+        <excluded>\r
+          <configuration>915MHz - Limited IAR Kickstart (USA)</configuration>\r
+          <configuration>868MHz - Limited IAR Kickstart (Europe)</configuration>\r
+          <configuration>433MHz - Limited IAR Kickstart (Other regions)</configuration>\r
+        </excluded>\r
+      </file>\r
+    </group>\r
+    <group>\r
+      <name>Components</name>\r
+      <group>\r
+        <name>bsp</name>\r
+        <group>\r
+          <name>boards</name>\r
+          <group>\r
+            <name>RFUSB</name>\r
+            <group>\r
+              <name>bsp_external</name>\r
+              <file>\r
+                <name>$PROJ_DIR$\simpliciti\Components\bsp\boards\RFUSB\bsp_external\mrfi_board_defs.h</name>\r
+              </file>\r
+            </group>\r
+            <file>\r
+              <name>$PROJ_DIR$\simpliciti\Components\bsp\boards\RFUSB\bsp_board.c</name>\r
+              <excluded>\r
+                <configuration>915MHz - Limited IAR Kickstart (USA)</configuration>\r
+                <configuration>868MHz - Limited IAR Kickstart (Europe)</configuration>\r
+                <configuration>433MHz - Limited IAR Kickstart (Other regions)</configuration>\r
+                <configuration>915MHz - Unrestricted IAR Workbench (USA)</configuration>\r
+                <configuration>868MHz - Unrestricted IAR Workbench (Europe)</configuration>\r
+                <configuration>433MHz - Unrestricted IAR Workbench (Other regions)</configuration>\r
+              </excluded>\r
+            </file>\r
+            <file>\r
+              <name>$PROJ_DIR$\simpliciti\Components\bsp\boards\RFUSB\bsp_board_defs.h</name>\r
+            </file>\r
+            <file>\r
+              <name>$PROJ_DIR$\simpliciti\Components\bsp\boards\RFUSB\bsp_button_defs.h</name>\r
+            </file>\r
+            <file>\r
+              <name>$PROJ_DIR$\simpliciti\Components\bsp\boards\RFUSB\bsp_driver_defs.h</name>\r
+            </file>\r
+            <file>\r
+              <name>$PROJ_DIR$\simpliciti\Components\bsp\boards\RFUSB\bsp_drivers.c</name>\r
+              <excluded>\r
+                <configuration>915MHz - Limited IAR Kickstart (USA)</configuration>\r
+                <configuration>868MHz - Limited IAR Kickstart (Europe)</configuration>\r
+                <configuration>433MHz - Limited IAR Kickstart (Other regions)</configuration>\r
+                <configuration>915MHz - Unrestricted IAR Workbench (USA)</configuration>\r
+                <configuration>868MHz - Unrestricted IAR Workbench (Europe)</configuration>\r
+                <configuration>433MHz - Unrestricted IAR Workbench (Other regions)</configuration>\r
+              </excluded>\r
+            </file>\r
+            <file>\r
+              <name>$PROJ_DIR$\simpliciti\Components\bsp\boards\RFUSB\bsp_led_defs.h</name>\r
+            </file>\r
+          </group>\r
+        </group>\r
+        <group>\r
+          <name>drivers</name>\r
+          <group>\r
+            <name>code</name>\r
+            <file>\r
+              <name>$PROJ_DIR$\simpliciti\Components\bsp\drivers\code\bsp_buttons.c</name>\r
+              <excluded>\r
+                <configuration>915MHz - Limited IAR Kickstart (USA)</configuration>\r
+                <configuration>868MHz - Limited IAR Kickstart (Europe)</configuration>\r
+                <configuration>433MHz - Limited IAR Kickstart (Other regions)</configuration>\r
+                <configuration>915MHz - Unrestricted IAR Workbench (USA)</configuration>\r
+                <configuration>868MHz - Unrestricted IAR Workbench (Europe)</configuration>\r
+                <configuration>433MHz - Unrestricted IAR Workbench (Other regions)</configuration>\r
+              </excluded>\r
+            </file>\r
+            <file>\r
+              <name>$PROJ_DIR$\simpliciti\Components\bsp\drivers\code\bsp_generic_buttons.h</name>\r
+            </file>\r
+            <file>\r
+              <name>$PROJ_DIR$\simpliciti\Components\bsp\drivers\code\bsp_generic_leds.h</name>\r
+            </file>\r
+            <file>\r
+              <name>$PROJ_DIR$\simpliciti\Components\bsp\drivers\code\bsp_leds.c</name>\r
+              <excluded>\r
+                <configuration>915MHz - Limited IAR Kickstart (USA)</configuration>\r
+                <configuration>868MHz - Limited IAR Kickstart (Europe)</configuration>\r
+                <configuration>433MHz - Limited IAR Kickstart (Other regions)</configuration>\r
+                <configuration>915MHz - Unrestricted IAR Workbench (USA)</configuration>\r
+                <configuration>868MHz - Unrestricted IAR Workbench (Europe)</configuration>\r
+                <configuration>433MHz - Unrestricted IAR Workbench (Other regions)</configuration>\r
+              </excluded>\r
+            </file>\r
+          </group>\r
+          <file>\r
+            <name>$PROJ_DIR$\simpliciti\Components\bsp\drivers\bsp_buttons.h</name>\r
+          </file>\r
+          <file>\r
+            <name>$PROJ_DIR$\simpliciti\Components\bsp\drivers\bsp_leds.h</name>\r
+          </file>\r
+        </group>\r
+        <group>\r
+          <name>mcus</name>\r
+          <file>\r
+            <name>$PROJ_DIR$\simpliciti\Components\bsp\mcus\bsp_8051_defs.h</name>\r
+          </file>\r
+        </group>\r
+        <file>\r
+          <name>$PROJ_DIR$\simpliciti\Components\bsp\bsp.c</name>\r
+          <excluded>\r
+            <configuration>915MHz - Limited IAR Kickstart (USA)</configuration>\r
+            <configuration>868MHz - Limited IAR Kickstart (Europe)</configuration>\r
+            <configuration>433MHz - Limited IAR Kickstart (Other regions)</configuration>\r
+          </excluded>\r
+        </file>\r
+        <file>\r
+          <name>$PROJ_DIR$\simpliciti\Components\bsp\bsp.h</name>\r
+        </file>\r
+        <file>\r
+          <name>$PROJ_DIR$\simpliciti\Components\bsp\bsp_macros.h</name>\r
+        </file>\r
+      </group>\r
+      <group>\r
+        <name>mrfi</name>\r
+        <group>\r
+          <name>radios</name>\r
+          <group>\r
+            <name>common</name>\r
+            <file>\r
+              <name>$PROJ_DIR$\simpliciti\Components\mrfi\radios\common\mrfi_f1f2.c</name>\r
+              <excluded>\r
+                <configuration>915MHz - Limited IAR Kickstart (USA)</configuration>\r
+                <configuration>868MHz - Limited IAR Kickstart (Europe)</configuration>\r
+                <configuration>433MHz - Limited IAR Kickstart (Other regions)</configuration>\r
+                <configuration>915MHz - Unrestricted IAR Workbench (USA)</configuration>\r
+                <configuration>868MHz - Unrestricted IAR Workbench (Europe)</configuration>\r
+                <configuration>433MHz - Unrestricted IAR Workbench (Other regions)</configuration>\r
+              </excluded>\r
+            </file>\r
+            <file>\r
+              <name>$PROJ_DIR$\simpliciti\Components\mrfi\radios\common\mrfi_f1f2.h</name>\r
+            </file>\r
+          </group>\r
+          <group>\r
+            <name>family2</name>\r
+            <file>\r
+              <name>$PROJ_DIR$\simpliciti\Components\mrfi\radios\family2\mrfi_radio.c</name>\r
+              <excluded>\r
+                <configuration>915MHz - Limited IAR Kickstart (USA)</configuration>\r
+                <configuration>868MHz - Limited IAR Kickstart (Europe)</configuration>\r
+                <configuration>433MHz - Limited IAR Kickstart (Other regions)</configuration>\r
+                <configuration>915MHz - Unrestricted IAR Workbench (USA)</configuration>\r
+                <configuration>868MHz - Unrestricted IAR Workbench (Europe)</configuration>\r
+                <configuration>433MHz - Unrestricted IAR Workbench (Other regions)</configuration>\r
+              </excluded>\r
+            </file>\r
+          </group>\r
+        </group>\r
+        <group>\r
+          <name>smartrf</name>\r
+          <group>\r
+            <name>CC1111</name>\r
+            <file>\r
+              <name>$PROJ_DIR$\simpliciti\Components\mrfi\smartrf\CC1111\smartrf_CC1111.h</name>\r
+            </file>\r
+          </group>\r
+        </group>\r
+        <file>\r
+          <name>$PROJ_DIR$\simpliciti\Components\mrfi\mrfi.c</name>\r
+          <excluded>\r
+            <configuration>915MHz - Limited IAR Kickstart (USA)</configuration>\r
+            <configuration>868MHz - Limited IAR Kickstart (Europe)</configuration>\r
+            <configuration>433MHz - Limited IAR Kickstart (Other regions)</configuration>\r
+          </excluded>\r
+        </file>\r
+        <file>\r
+          <name>$PROJ_DIR$\simpliciti\Components\mrfi\mrfi.h</name>\r
+        </file>\r
+        <file>\r
+          <name>$PROJ_DIR$\simpliciti\Components\mrfi\mrfi_defs.h</name>\r
+        </file>\r
+      </group>\r
+      <group>\r
+        <name>nwk</name>\r
+        <file>\r
+          <name>$PROJ_DIR$\simpliciti\Components\nwk\nwk.c</name>\r
+          <excluded>\r
+            <configuration>915MHz - Limited IAR Kickstart (USA)</configuration>\r
+            <configuration>868MHz - Limited IAR Kickstart (Europe)</configuration>\r
+            <configuration>433MHz - Limited IAR Kickstart (Other regions)</configuration>\r
+          </excluded>\r
+        </file>\r
+        <file>\r
+          <name>$PROJ_DIR$\simpliciti\Components\nwk\nwk.h</name>\r
+        </file>\r
+        <file>\r
+          <name>$PROJ_DIR$\simpliciti\Components\nwk\nwk_api.c</name>\r
+          <excluded>\r
+            <configuration>915MHz - Limited IAR Kickstart (USA)</configuration>\r
+            <configuration>868MHz - Limited IAR Kickstart (Europe)</configuration>\r
+            <configuration>433MHz - Limited IAR Kickstart (Other regions)</configuration>\r
+          </excluded>\r
+        </file>\r
+        <file>\r
+          <name>$PROJ_DIR$\simpliciti\Components\nwk\nwk_api.h</name>\r
+        </file>\r
+        <file>\r
+          <name>$PROJ_DIR$\simpliciti\Components\nwk\nwk_app.h</name>\r
+        </file>\r
+        <file>\r
+          <name>$PROJ_DIR$\simpliciti\Components\nwk\nwk_frame.c</name>\r
+          <excluded>\r
+            <configuration>915MHz - Limited IAR Kickstart (USA)</configuration>\r
+            <configuration>868MHz - Limited IAR Kickstart (Europe)</configuration>\r
+            <configuration>433MHz - Limited IAR Kickstart (Other regions)</configuration>\r
+          </excluded>\r
+        </file>\r
+        <file>\r
+          <name>$PROJ_DIR$\simpliciti\Components\nwk\nwk_frame.h</name>\r
+        </file>\r
+        <file>\r
+          <name>$PROJ_DIR$\simpliciti\Components\nwk\nwk_globals.c</name>\r
+          <excluded>\r
+            <configuration>915MHz - Limited IAR Kickstart (USA)</configuration>\r
+            <configuration>868MHz - Limited IAR Kickstart (Europe)</configuration>\r
+            <configuration>433MHz - Limited IAR Kickstart (Other regions)</configuration>\r
+          </excluded>\r
+        </file>\r
+        <file>\r
+          <name>$PROJ_DIR$\simpliciti\Components\nwk\nwk_globals.h</name>\r
+        </file>\r
+        <file>\r
+          <name>$PROJ_DIR$\simpliciti\Components\nwk\nwk_QMgmt.c</name>\r
+          <excluded>\r
+            <configuration>915MHz - Limited IAR Kickstart (USA)</configuration>\r
+            <configuration>868MHz - Limited IAR Kickstart (Europe)</configuration>\r
+            <configuration>433MHz - Limited IAR Kickstart (Other regions)</configuration>\r
+          </excluded>\r
+        </file>\r
+        <file>\r
+          <name>$PROJ_DIR$\simpliciti\Components\nwk\nwk_QMgmt.h</name>\r
+        </file>\r
+        <file>\r
+          <name>$PROJ_DIR$\simpliciti\Components\nwk\nwk_types.h</name>\r
+        </file>\r
+      </group>\r
+      <group>\r
+        <name>nwk_applications</name>\r
+        <file>\r
+          <name>$PROJ_DIR$\simpliciti\Components\nwk_applications\nwk_freq.c</name>\r
+          <excluded>\r
+            <configuration>915MHz - Limited IAR Kickstart (USA)</configuration>\r
+            <configuration>868MHz - Limited IAR Kickstart (Europe)</configuration>\r
+            <configuration>433MHz - Limited IAR Kickstart (Other regions)</configuration>\r
+          </excluded>\r
+        </file>\r
+        <file>\r
+          <name>$PROJ_DIR$\simpliciti\Components\nwk_applications\nwk_freq.h</name>\r
+        </file>\r
+        <file>\r
+          <name>$PROJ_DIR$\simpliciti\Components\nwk_applications\nwk_ioctl.c</name>\r
+          <excluded>\r
+            <configuration>915MHz - Limited IAR Kickstart (USA)</configuration>\r
+            <configuration>868MHz - Limited IAR Kickstart (Europe)</configuration>\r
+            <configuration>433MHz - Limited IAR Kickstart (Other regions)</configuration>\r
+          </excluded>\r
+        </file>\r
+        <file>\r
+          <name>$PROJ_DIR$\simpliciti\Components\nwk_applications\nwk_ioctl.h</name>\r
+        </file>\r
+        <file>\r
+          <name>$PROJ_DIR$\simpliciti\Components\nwk_applications\nwk_join.c</name>\r
+          <excluded>\r
+            <configuration>915MHz - Limited IAR Kickstart (USA)</configuration>\r
+            <configuration>868MHz - Limited IAR Kickstart (Europe)</configuration>\r
+            <configuration>433MHz - Limited IAR Kickstart (Other regions)</configuration>\r
+          </excluded>\r
+        </file>\r
+        <file>\r
+          <name>$PROJ_DIR$\simpliciti\Components\nwk_applications\nwk_join.h</name>\r
+        </file>\r
+        <file>\r
+          <name>$PROJ_DIR$\simpliciti\Components\nwk_applications\nwk_link.c</name>\r
+          <excluded>\r
+            <configuration>915MHz - Limited IAR Kickstart (USA)</configuration>\r
+            <configuration>868MHz - Limited IAR Kickstart (Europe)</configuration>\r
+            <configuration>433MHz - Limited IAR Kickstart (Other regions)</configuration>\r
+          </excluded>\r
+        </file>\r
+        <file>\r
+          <name>$PROJ_DIR$\simpliciti\Components\nwk_applications\nwk_link.h</name>\r
+        </file>\r
+        <file>\r
+          <name>$PROJ_DIR$\simpliciti\Components\nwk_applications\nwk_mgmt.c</name>\r
+          <excluded>\r
+            <configuration>915MHz - Limited IAR Kickstart (USA)</configuration>\r
+            <configuration>868MHz - Limited IAR Kickstart (Europe)</configuration>\r
+            <configuration>433MHz - Limited IAR Kickstart (Other regions)</configuration>\r
+          </excluded>\r
+        </file>\r
+        <file>\r
+          <name>$PROJ_DIR$\simpliciti\Components\nwk_applications\nwk_mgmt.h</name>\r
+        </file>\r
+        <file>\r
+          <name>$PROJ_DIR$\simpliciti\Components\nwk_applications\nwk_ping.c</name>\r
+          <excluded>\r
+            <configuration>915MHz - Limited IAR Kickstart (USA)</configuration>\r
+            <configuration>868MHz - Limited IAR Kickstart (Europe)</configuration>\r
+            <configuration>433MHz - Limited IAR Kickstart (Other regions)</configuration>\r
+          </excluded>\r
+        </file>\r
+        <file>\r
+          <name>$PROJ_DIR$\simpliciti\Components\nwk_applications\nwk_ping.h</name>\r
+        </file>\r
+        <file>\r
+          <name>$PROJ_DIR$\simpliciti\Components\nwk_applications\nwk_security.c</name>\r
+          <excluded>\r
+            <configuration>915MHz - Limited IAR Kickstart (USA)</configuration>\r
+            <configuration>868MHz - Limited IAR Kickstart (Europe)</configuration>\r
+            <configuration>433MHz - Limited IAR Kickstart (Other regions)</configuration>\r
+          </excluded>\r
+        </file>\r
+        <file>\r
+          <name>$PROJ_DIR$\simpliciti\Components\nwk_applications\nwk_security.h</name>\r
+        </file>\r
+      </group>\r
+    </group>\r
+    <group>\r
+      <name>Configuration</name>\r
+      <group>\r
+        <name>Access Point</name>\r
+        <file>\r
+          <name>$PROJ_DIR$\simpliciti\Configuration\Access Point\smpl_config.dat</name>\r
+        </file>\r
+      </group>\r
+      <file>\r
+        <name>$PROJ_DIR$\simpliciti\Configuration\smpl_nwk_config.dat</name>\r
+      </file>\r
+    </group>\r
+    <file>\r
+      <name>$PROJ_DIR$\simpliciti\CC1111 - Access Point - 433MHz.r51</name>\r
+      <excluded>\r
+        <configuration>915MHz - Limited IAR Kickstart (USA)</configuration>\r
+        <configuration>868MHz - Limited IAR Kickstart (Europe)</configuration>\r
+        <configuration>915MHz - Unrestricted IAR Workbench (USA)</configuration>\r
+        <configuration>868MHz - Unrestricted IAR Workbench (Europe)</configuration>\r
+        <configuration>433MHz - Unrestricted IAR Workbench (Other regions)</configuration>\r
+      </excluded>\r
+    </file>\r
+    <file>\r
+      <name>$PROJ_DIR$\simpliciti\CC1111 - Access Point - 868MHz.r51</name>\r
+      <excluded>\r
+        <configuration>915MHz - Limited IAR Kickstart (USA)</configuration>\r
+        <configuration>433MHz - Limited IAR Kickstart (Other regions)</configuration>\r
+        <configuration>915MHz - Unrestricted IAR Workbench (USA)</configuration>\r
+        <configuration>868MHz - Unrestricted IAR Workbench (Europe)</configuration>\r
+        <configuration>433MHz - Unrestricted IAR Workbench (Other regions)</configuration>\r
+      </excluded>\r
+    </file>\r
+    <file>\r
+      <name>$PROJ_DIR$\simpliciti\CC1111 - Access Point - 915MHz.r51</name>\r
+      <excluded>\r
+        <configuration>868MHz - Limited IAR Kickstart (Europe)</configuration>\r
+        <configuration>433MHz - Limited IAR Kickstart (Other regions)</configuration>\r
+        <configuration>915MHz - Unrestricted IAR Workbench (USA)</configuration>\r
+        <configuration>868MHz - Unrestricted IAR Workbench (Europe)</configuration>\r
+        <configuration>433MHz - Unrestricted IAR Workbench (Other regions)</configuration>\r
+      </excluded>\r
+    </file>\r
+    <file>\r
+      <name>$PROJ_DIR$\simpliciti\simpliciti.h</name>\r
+    </file>\r
+    <file>\r
+      <name>$PROJ_DIR$\simpliciti\simpliciti_readme.txt</name>\r
+    </file>\r
+  </group>\r
+  <group>\r
+    <name>USB</name>\r
+    <group>\r
+      <name>class_cdc</name>\r
+      <file>\r
+        <name>$PROJ_DIR$\usb\class_cdc\usb_cdc.h</name>\r
+      </file>\r
+      <file>\r
+        <name>$PROJ_DIR$\usb\class_cdc\usb_cdc_descriptor.s51</name>\r
+      </file>\r
+      <file>\r
+        <name>$PROJ_DIR$\usb\class_cdc\usb_cdc_hooks.c</name>\r
+      </file>\r
+      <file>\r
+        <name>$PROJ_DIR$\usb\class_cdc\usb_firmware_library_config.c</name>\r
+      </file>\r
+      <file>\r
+        <name>$PROJ_DIR$\usb\class_cdc\usb_firmware_library_config.h</name>\r
+      </file>\r
+      <file>\r
+        <name>$PROJ_DIR$\usb\class_cdc\usb_firmware_library_headers.h</name>\r
+      </file>\r
+      <file>\r
+        <name>$PROJ_DIR$\usb\class_cdc\usb_uart.c</name>\r
+      </file>\r
+      <file>\r
+        <name>$PROJ_DIR$\usb\class_cdc\usb_uart.h</name>\r
+      </file>\r
+    </group>\r
+    <group>\r
+      <name>library</name>\r
+      <file>\r
+        <name>$PROJ_DIR$\usb\library\usb_descriptor.h</name>\r
+      </file>\r
+      <file>\r
+        <name>$PROJ_DIR$\usb\library\usb_descriptor_parser.c</name>\r
+      </file>\r
+      <file>\r
+        <name>$PROJ_DIR$\usb\library\usb_descriptor_parser.h</name>\r
+      </file>\r
+      <file>\r
+        <name>$PROJ_DIR$\usb\library\usb_framework.c</name>\r
+      </file>\r
+      <file>\r
+        <name>$PROJ_DIR$\usb\library\usb_framework.h</name>\r
+      </file>\r
+      <file>\r
+        <name>$PROJ_DIR$\usb\library\usb_framework_structs.h</name>\r
+      </file>\r
+      <file>\r
+        <name>$PROJ_DIR$\usb\library\ccxx11\usb_interrupt.c</name>\r
+      </file>\r
+      <file>\r
+        <name>$PROJ_DIR$\usb\library\usb_interrupt.h</name>\r
+      </file>\r
+      <file>\r
+        <name>$PROJ_DIR$\usb\library\usb_reg.h</name>\r
+      </file>\r
+      <file>\r
+        <name>$PROJ_DIR$\usb\library\usb_standard_requests.c</name>\r
+      </file>\r
+      <file>\r
+        <name>$PROJ_DIR$\usb\library\usb_standard_requests.h</name>\r
+      </file>\r
+      <file>\r
+        <name>$PROJ_DIR$\usb\library\ccxx11\usb_suspend.c</name>\r
+      </file>\r
+      <file>\r
+        <name>$PROJ_DIR$\usb\library\usb_suspend.h</name>\r
+      </file>\r
+    </group>\r
+  </group>\r
+  <group>\r
+    <name>WBSL</name>\r
+    <file>\r
+      <name>$PROJ_DIR$\wbsl\ioCCxx10_bitdef.h</name>\r
+    </file>\r
+    <file>\r
+      <name>$PROJ_DIR$\wbsl\wbsl.c</name>\r
+    </file>\r
+    <file>\r
+      <name>$PROJ_DIR$\wbsl\wbsl.h</name>\r
+    </file>\r
+  </group>\r
+  <file>\r
+    <name>$PROJ_DIR$\BM_API.h</name>\r
+  </file>\r
+  <file>\r
+    <name>$PROJ_DIR$\change_record.txt</name>\r
+  </file>\r
+  <file>\r
+    <name>$PROJ_DIR$\flash.c</name>\r
+  </file>\r
+  <file>\r
+    <name>$PROJ_DIR$\main.c</name>\r
+  </file>\r
+  <file>\r
+    <name>$PROJ_DIR$\rftest.c</name>\r
+  </file>\r
+  <file>\r
+    <name>$PROJ_DIR$\timer1.c</name>\r
+  </file>\r
+</project>\r
+\r
+\r
diff --git a/chronos-ti/Software Projects/RF Access Point/IAR/cc1111_usb_dongle.eww b/chronos-ti/Software Projects/RF Access Point/IAR/cc1111_usb_dongle.eww
new file mode 100755 (executable)
index 0000000..484d16f
--- /dev/null
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="iso-8859-1"?>\r
+\r
+<workspace>\r
+  <project>\r
+    <path>$WS_DIR$\cc1111_usb_dongle.ewp</path>\r
+  </project>\r
+  <batchBuild/>\r
+</workspace>\r
+\r
+\r
diff --git a/chronos-ti/Software Projects/RF Access Point/IAR/change_record.txt b/chronos-ti/Software Projects/RF Access Point/IAR/change_record.txt
new file mode 100755 (executable)
index 0000000..c8ecbe9
--- /dev/null
@@ -0,0 +1,8 @@
+V1.2 (12.03.2010)\r
+- SimpliciTI     Added SimpliciTI sources to project. Upgraded to Version 1.1.1.\r
+- 433MHz support  Added ISM_LF support for BlueRobin and SimpliciTI\r
+- Added projects for full and kickstart (16kB code limit) license \r
+- Added RFBSL function\r
+                                                                                                       \r
+V1.1 (22.11.2009)\r
+First version released to manufacturing.
\ No newline at end of file
diff --git a/chronos-ti/Software Projects/RF Access Point/IAR/flash.c b/chronos-ti/Software Projects/RF Access Point/IAR/flash.c
new file mode 100755 (executable)
index 0000000..b1fe148
--- /dev/null
@@ -0,0 +1,238 @@
+// *************************************************************************************************\r
+//\r
+//     Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/ \r
+//      \r
+//      \r
+//       Redistribution and use in source and binary forms, with or without \r
+//       modification, are permitted provided that the following conditions \r
+//       are met:\r
+//     \r
+//         Redistributions of source code must retain the above copyright \r
+//         notice, this list of conditions and the following disclaimer.\r
+//      \r
+//         Redistributions in binary form must reproduce the above copyright\r
+//         notice, this list of conditions and the following disclaimer in the \r
+//         documentation and/or other materials provided with the   \r
+//         distribution.\r
+//      \r
+//         Neither the name of Texas Instruments Incorporated nor the names of\r
+//         its contributors may be used to endorse or promote products derived\r
+//         from this software without specific prior written permission.\r
+//     \r
+//       THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \r
+//       "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT \r
+//       LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//       A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT \r
+//       OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, \r
+//       SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT \r
+//       LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//       DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//       THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT \r
+//       (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE \r
+//       OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+// Flash write routines\r
+// *************************************************************************************************\r
+\r
+\r
+// *************************************************************************************************\r
+// Include section\r
+#include "project.h"\r
+#include "flash.h"\r
+\r
+\r
+// *************************************************************************************************\r
+// Defines section\r
+\r
+\r
+\r
+// *************************************************************************************************\r
+// Global Variable section\r
+\r
+// Reserve XDATA memory for code execution\r
+__no_init u8 __xdata flash_write_code[32] @ FLASH_WRITE_XDATA_ADDR;\r
+\r
+// Flash erase / write routines can be called\r
+u8 flash_update_init = 0;\r
+\r
+\r
+// *************************************************************************************************\r
+// Static Function prototype section\r
+\r
+\r
+// *************************************************************************************************\r
+// Implementation\r
+\r
+\r
+\r
+// *************************************************************************************************\r
+// Modify MCU registers so that flash erase / write functions can be called\r
+// *************************************************************************************************\r
+void flash_start_update(void)\r
+{\r
+  // stop all IRQ except TIMER4 and USB\r
+  IEN0 &= ~(BIT5 | BIT4 | BIT3 | BIT2 | BIT1 | BIT0);\r
+  IEN1 &= ~(              BIT3 | BIT2 | BIT1 | BIT0);\r
+  IEN2 &= ~(BIT5 | BIT4 | BIT3 | BIT2 |        BIT0);\r
+  \r
+  // Set flash write timing\r
+  FWT  = ( 0x22 >> CLKSPD );\r
+\r
+  // Copy flash write code to XDATA code\r
+  flash_write_code[0] = 0x75; // MOV FCTL, 0x02\r
+  flash_write_code[1] = 0xAE;\r
+  flash_write_code[2] = 0x02;\r
+\r
+  flash_write_code[3] = 0x00; // NOP\r
+  flash_write_code[4] = 0x00; // NOP\r
+\r
+  flash_write_code[5] = 0x74; // MOV A, data_lo\r
+  flash_write_code[6] = 0xFF;\r
+  flash_write_code[7] = 0xF5; // MOV FWDATA, A\r
+  flash_write_code[8] = 0xAF;\r
+\r
+  flash_write_code[9] = 0x00; // NOP\r
+  flash_write_code[10] = 0x00; // NOP\r
+\r
+  flash_write_code[11] = 0x74; // MOV A, data_hi\r
+  flash_write_code[12] = 0xFF;\r
+  flash_write_code[13] = 0xF5; // MOV FWDATA, A\r
+  flash_write_code[14] = 0xAF;\r
+\r
+  flash_write_code[15] = 0x00; // NOP\r
+  flash_write_code[16] = 0x00; // NOP\r
+  \r
+  flash_write_code[17] = 0xE5; // MOV A, FCTL\r
+  flash_write_code[18] = 0xAE;\r
+  flash_write_code[19] = 0x54; // loop: ANL A,0x40\r
+  flash_write_code[20] = 0x40; \r
+  flash_write_code[21] = 0x70; // JNZ loop\r
+  flash_write_code[22] = 0xFA; \r
+\r
+  flash_write_code[23] = 0x22;  // RET\r
+  \r
+  // Set init flag to prevent normal code execution\r
+  flash_update_init = 1;\r
+}\r
+\r
+\r
+// *************************************************************************************************\r
+// Read 8-bit byte from flash memory\r
+// *************************************************************************************************\r
+u8 flash_byte_read(u16 addr)\r
+{\r
+  u8 __code * pcode = (u8 __code *) addr;\r
+  u8 data = pcode[0];\r
+  \r
+  return (data);\r
+  \r
+}\r
+\r
+\r
+// *************************************************************************************************\r
+// Read 16-bit word from flash memory\r
+// *************************************************************************************************\r
+u16 flash_word_read(u16 addr)\r
+{\r
+  u8 __code * pcode = (u8 __code *) addr;\r
+  u16 data = (u16)(pcode[0] << 8);\r
+  data += pcode[1];\r
+\r
+  return (data);\r
+  \r
+}\r
+\r
+\r
+// *************************************************************************************************\r
+// Write 16-bit word to flash memory\r
+// *************************************************************************************************\r
+u8 flash_word_write(u16 addr, u16 data, u16 key, u8 verify)\r
+{\r
+  u16 readback;\r
+  \r
+  // Return immediately if wrong key was passed\r
+  if (key != FLASH_EW_KEY) return (0);\r
+  \r
+  // Disable all interrupts\r
+  INT_GLOBAL_ENABLE(INT_OFF);\r
+  \r
+  // Wait until flash write/erase busy bit is cleared\r
+  while ((FCTL & BIT7) == BIT7) {}\r
+  \r
+  // Set address register to flash address in word units\r
+  FADDRH = (u8) (addr >> 9);\r
+  FADDRL = (u8) (addr >> 1);\r
+  \r
+  // Copy only flash write data to XDATA code\r
+  flash_write_code[6] = (u8) (data >> 8);\r
+  flash_write_code[12] = (u8) (data);\r
+  \r
+  // Branch to XDATA code\r
+  asm("LCALL 0xFC00");\r
+  \r
+  // Enable all interrupts\r
+  INT_GLOBAL_ENABLE(INT_ON);\r
+\r
+  // Verify that word was written\r
+  if (verify)\r
+  {\r
+    readback = flash_word_read(addr);\r
+    if (readback != data) return (0);\r
+  }\r
+  \r
+  return(1);\r
+}\r
+\r
+\r
+\r
+// *************************************************************************************************\r
+// Erase 1kB page\r
+// *************************************************************************************************\r
+u8 page_erase(u8 page, u16 key, u8 verify) \r
+{\r
+  u16 i;\r
+  \r
+  // Return immediately if wrong key was passed\r
+  if (key != FLASH_EW_KEY) return (0);\r
+  \r
+  // Check if page address is valid\r
+  if (page < FLASH_RW_PAGE_MIN || page > FLASH_RW_PAGE_MAX) return (0);\r
+  \r
+  // Wait until flash write/erase busy bit is cleared\r
+  while ((FCTL & BIT7) == BIT7) {}\r
+\r
+  // Disable all interrupts\r
+  INT_GLOBAL_ENABLE(INT_OFF);\r
+  \r
+  // Store page in address register\r
+  FADDRH = (page) << 1;\r
+  FADDRL = 0x00; \r
+\r
+  // Set flash write timing\r
+  FWT = ( 0x22 >> CLKSPD );\r
+  \r
+  // Start page erase\r
+  FCTL = 0x01;        \r
+  asm("nop");\r
+  \r
+  // Wait until flash write/erase busy bit is cleared\r
+  while ((FCTL & BIT7) == BIT7) {}\r
+\r
+  // Enable all interrupts\r
+  INT_GLOBAL_ENABLE(INT_ON);\r
+  \r
+  // Verify that page content is all 0xFF\r
+  if (verify)\r
+  {\r
+    for (i=0; i<FLASH_PAGE_SIZE; i++) \r
+    {\r
+      if (flash_byte_read(page*FLASH_PAGE_SIZE + i) != 0xFF) return (0);\r
+    }\r
+  }\r
+  \r
+  return (1);\r
+}\r
+\r
+\r
+\r
diff --git a/chronos-ti/Software Projects/RF Access Point/IAR/flash.h b/chronos-ti/Software Projects/RF Access Point/IAR/flash.h
new file mode 100755 (executable)
index 0000000..d922ba3
--- /dev/null
@@ -0,0 +1,56 @@
+// *************************************************************************************************\r
+// Copyright 2007 BM wireless Ltd.&Co.KG, all rights reserved.\r
+// The information contained herein is confidential property of BM wireless Ltd.&Co.KG.\r
+// The use, copying, transfer or disclosure of such information is prohibited\r
+// except by written agreement with BM wireless Ltd.&Co.KG.\r
+// *************************************************************************************************\r
+//\r
+// Actual revision: $Revision: 1.2 $\r
+// Revision label:  $Name: $\r
+// Revision state:  $State: Coding $\r
+//\r
+// *************************************************************************************************\r
+\r
+\r
+// *************************************************************************************************\r
+// Include section\r
+\r
+\r
+// *************************************************************************************************\r
+// Defines section\r
+\r
+// Function jump table entries\r
+#define USER_MAIN         0\r
+#define USER_INIT         1\r
+#define USER_USB_DECODE   2\r
+#define RF_ISR            3\r
+#define RFTXRX_ISR        4\r
+#define TIMER1_ISR        5\r
+#define TIMER3_ISR        6\r
+\r
+// boundaries for flash erase and r/w area\r
+#define FLASH_RW_PAGE_MIN           (8u)\r
+#define FLASH_RW_PAGE_MAX           (30u)\r
+#define FLASH_PAGE_SIZE             (1024u)\r
+\r
+// flash write/erase key\r
+#define FLASH_EW_KEY                (0x5732)\r
+\r
+// XDATA start address for flash write routine\r
+#define FLASH_WRITE_XDATA_ADDR      (0xFC00)\r
+\r
+typedef void ( *func_ptr )( void ) ;\r
+\r
+\r
+// *************************************************************************************************\r
+// Extern section\r
+extern __code const func_ptr func_jump_table[];\r
+\r
+extern void flash_start_update(void);\r
+extern u8 flash_byte_read(u16 addr);\r
+extern u16 flash_word_read(u16 addr);\r
+extern u8 flash_word_write(u16 addr, u16 data, u16 key, u8 verify);\r
+extern u8 page_erase(u8 page, u16 key, u8 verify);\r
+extern void user_usb_decode(void);\r
+\r
+extern u8 flash_update_init;
\ No newline at end of file
diff --git a/chronos-ti/Software Projects/RF Access Point/IAR/main.c b/chronos-ti/Software Projects/RF Access Point/IAR/main.c
new file mode 100755 (executable)
index 0000000..dde831b
--- /dev/null
@@ -0,0 +1,870 @@
+// *************************************************************************************************\r
+//\r
+//     Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/ \r
+//      \r
+//      \r
+//       Redistribution and use in source and binary forms, with or without \r
+//       modification, are permitted provided that the following conditions \r
+//       are met:\r
+//     \r
+//         Redistributions of source code must retain the above copyright \r
+//         notice, this list of conditions and the following disclaimer.\r
+//      \r
+//         Redistributions in binary form must reproduce the above copyright\r
+//         notice, this list of conditions and the following disclaimer in the \r
+//         documentation and/or other materials provided with the   \r
+//         distribution.\r
+//      \r
+//         Neither the name of Texas Instruments Incorporated nor the names of\r
+//         its contributors may be used to endorse or promote products derived\r
+//         from this software without specific prior written permission.\r
+//     \r
+//       THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \r
+//       "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT \r
+//       LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//       A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT \r
+//       OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, \r
+//       SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT \r
+//       LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//       DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//       THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT \r
+//       (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE \r
+//       OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+// Main function\r
+// *************************************************************************************************\r
+\r
+\r
+// *************************************************************************************************\r
+// Include section\r
+#include "project.h"\r
+#include "timer1.h"\r
+#include "BM_API.h"\r
+#include "simpliciti.h"\r
+#include "rftest.h"\r
+#include "flash.h"\r
+#include "wbsl.h"\r
+\r
+#include "hal_types.h"\r
+#include "usb_uart.h"\r
+\r
+\r
+// *************************************************************************************************\r
+// Defines section\r
+\r
+// Service USB process directly during initial enumeration\r
+#define ENUMERATION_TIME    (20000u)\r
+\r
+\r
+// *************************************************************************************************\r
+// Global Variable section\r
+\r
+// Normal operation\r
+unsigned char system_status        = HW_IDLE;\r
+unsigned char simpliciti_on        = 0;\r
+unsigned char bluerobin_on         = 0;\r
+unsigned char wbsl_on              = 0;\r
+unsigned char bluerobin_start_now  = 0;\r
+unsigned char simpliciti_start_now = 0;\r
+unsigned char wbsl_start_now       = 0;\r
+\r
+// SimpliciTI Sync variables\r
+u8 simpliciti_sync_buffer[BM_SYNC_DATA_LENGTH];\r
+u8 simpliciti_sync_buffer_status;\r
+\r
+// WBSL\r
+u8 ptrTX;\r
+u8 wbsl_size;\r
+u8 wbsl_inc;\r
+u8 current_packet_size;\r
+u8 wbsl_OPCode;\r
+u8 wbsl_packetLength;\r
+\r
+// Test\r
+u8  test_on        = 0;\r
+u8  test_step      = 0;\r
+u8  test_step_over = 0;\r
+u16 test_result    = 0;\r
+u8  frequoffset    = 0;\r
+\r
+\r
+// *************************************************************************************************\r
+// Extern variable section\r
+extern u8 HeartRate_u8;   // BlueRobin heartrate to transmit\r
+extern u8 Speed_u8;       // BlueRobin speed to transmit\r
+extern u16 Distance_u16;  // BlueRobin distance to transmit\r
+extern u8 rf_tx_over;     // Flag to indicate last byte has been sent\r
+extern u8 BRTX__SC_u8;    // BlueRobin sequence counter\r
+extern u32 BRTX__ID_u32;  // BlueRobin TX ID\r
+extern void BR_RfTxRxIsr(void); // BlueRobin RF TXRX ISR\r
+extern unsigned char usb_buffer[USB_MAX_MESSAGE_LENGTH+2];\r
+extern unsigned char usb_sendack;\r
+\r
+\r
+// *************************************************************************************************\r
+// Extern functions section\r
+\r
+// BlueRobin init function\r
+void InitProject_v(void);\r
+// BlueRobin timer ISR\r
+extern void BRTX_OC_IRQ_v(void); \r
+// SimpliciTI RF ISR\r
+extern void MRFI_RfIsr(void);\r
+// BlueRobin RF ISR\r
+extern void BR_RfIsr(void);\r
+// Set the identification (ID, serial number) of the transmitter\r
+extern void BRTX_SetID_v(u32 ID_u32);\r
+// Stop transmission\r
+extern void BRTX_Stop_v(void);\r
+\r
+\r
+// *************************************************************************************************\r
+// Function prototype section\r
+void bluerobin_start(void);\r
+void bluerobin_stop(void);\r
+void simpliciti_config(void);\r
+\r
+\r
+// *************************************************************************************************\r
+// Implementation\r
+\r
+int main( void )\r
+{  \r
+  /*u16 enumeration = 0;\r
+  u16 i = 0;\r
+  u8  usb_service_is_disabled = 0;\r
+  u8  cal;\r
+\r
+#ifdef CC1111EM\r
+  // P1.1 (LED) to output, default state is on\r
+  P1DIR |= BIT1; \r
+  LED_ON;\r
+  \r
+  #ifdef DEBUG_OUTPUT  \r
+    // P2.0 to output\r
+    P2DIR |= BIT0; \r
+    P2_0 &= ~BIT0; \r
+    \r
+    // P0.5 - P0.0 to output\r
+    P0DIR |= BIT5 | BIT4 | BIT3 | BIT2 | BIT1 | BIT0;\r
+    P0_5 &= ~BIT0; \r
+    P0_4 &= ~BIT0; \r
+    P0_3 &= ~BIT0; \r
+    P0_2 &= ~BIT0; \r
+    P0_1 &= ~BIT0; \r
+    P0_0 &= ~BIT0; \r
+  #endif  \r
+\r
+#else\r
+  // P1.0 (LED) to output '1'\r
+  P1DIR |= BIT0; \r
+  LED_ON;\r
+  // P1.4 (TP) to output '0'\r
+  P1DIR |= BIT4; \r
+  TP_L;\r
+  \r
+  // P0.0 - P0.5 to output (unused)\r
+  P0DIR |= BIT5 | BIT4 | BIT3 | BIT2 | BIT1 | BIT0;\r
+  // P1.5, P1.6, P1.7 to output (unused)\r
+  P1DIR |= BIT5 | BIT6 | BIT7;\r
+  // P2.0, P2.3, P2.4 to output (unused)\r
+  P2DIR |= BIT0 | BIT3 | BIT4;\r
+#endif\r
+  \r
+  // Clock control\r
+  // Default settings are 0x5C\r
+  SLEEP &= ~(BIT2 | BIT1 | BIT0);   // PM0, both OSC ON   \r
+  asm("NOP");\r
+  while(!(SLEEP & (BIT6 | BIT5)));  // Wait for both OSC to be stable\r
+  for (i=0; i<20000; i++);          // Simple delay\r
+  CLKCON &= ~BIT6;                  // Crystal on \r
+  CLKCON &= ~(0x3F);                // clkspd=000, tickspd=000\r
+  CLKCON |= BIT3 | BIT4 | BIT5;     // clkspd = 24MHz, tickspd = 24MHz/128=187500Hz\r
+  while(!(SLEEP & (BIT6 | BIT5)));  // Wait for both OSC to be stable\r
+  for (i=0; i<20000; i++);          // Simple delay  \r
+\r
+  // Assign BlueRobin TX ID\r
+  BRTX_SetID_v(TX_SERIAL_NO); \r
+  \r
+  // Reset simpliciti_data\r
+  simpliciti_data[0] = 0xFF;\r
+  \r
+  // Get calibration data from memory - range check added to prevent wrong calibration\r
+  cal = flash_byte_read(0x7FF0);\r
+  if (cal == 0x00) frequoffset = flash_byte_read(0x7FF2);\r
+  if ((frequoffset > 30) && (frequoffset < (256-30))) frequoffset = 0;\r
+  \r
+  // Priority levels: USB, Timer1 (3) -> RF (3) -> Timer4 (1) -> others (0)\r
+  IP1 |= BIT5 + BIT1 + BIT0 + BIT4;\r
+  IP0 |= BIT5 + BIT1 + BIT0;\r
+\r
+#ifdef TX_SIMPLE_TEST\r
+  // TX out only\r
+  test_on=1;\r
+  rftest_radio_init(); \r
+  start_continuous_tx(); \r
+  while(1); \r
+#endif\r
+#ifdef TX_MP_TEST\r
+  test_on=1;\r
+  test_step = 1;\r
+  test_step_over = 0;\r
+#endif\r
+  \r
+  // Init USB driver and enable global IRQ\r
+  usbUartInit(115200);\r
+  \r
+  // Service USB functions normally during enumeration phase\r
+  while ( enumeration < ENUMERATION_TIME ) \r
+  {\r
+    usbUartProcess();\r
+    enumeration++;\r
+  }\r
+  LED_OFF;\r
+  \r
+  // After enumeration start Timer4 IRQ to service USB driver from now on\r
+  // f=187500Hz/64/5=3kHz/5 --> 1.7ms / IRQ  \r
+  T4CCTL0 = 0x44;\r
+  T4CC0 = 0x04;\r
+  T4CTL = 0xDE;\r
+  INT_ENABLE(INUM_T4, INT_ON);  \r
+\r
+  // Enable interrupts\r
+  INT_GLOBAL_ENABLE(TRUE);  \r
+  \r
+  // Main control loop\r
+  while(1) \r
+  { \r
+    // For BlueRobin\r
+    if ( bluerobin_start_now && !simpliciti_on && !wbsl_on)\r
+    {\r
+      // Start BlueRobin stack\r
+      bluerobin_start(); \r
+      system_status = HW_BLUEROBIN_TRANSMITTING;\r
+      // Reset start flag\r
+      bluerobin_start_now = 0;\r
+    }\r
+    else if ( bluerobin_on )\r
+    {  \r
+      // Temporarily suspend USB service when a BlueRobin TX is pending\r
+      if (sTimer1.usb_service_disable && !usb_service_is_disabled)\r
+      {\r
+        T4CTL &= ~BIT4;\r
+        usb_service_is_disabled = 1;\r
+      }\r
+      \r
+      if( sTimer1.iflag )\r
+      {\r
+        // Call BlueRobin timer ISR\r
+        BRTX_OC_IRQ_v();\r
+        \r
+        // Allow USB service again\r
+        if (usb_service_is_disabled)\r
+        {\r
+          sTimer1.usb_service_disable = 0;\r
+          usb_service_is_disabled = 0;\r
+          T4CTL |= BIT4;\r
+        }\r
+        \r
+        // New!!!\r
+        sTimer1.iflag = 0;\r
+      }\r
+    }\r
+    // For SimpliciTI AP\r
+    else if ( simpliciti_start_now && !wbsl_on )\r
+    {\r
+      LED_ON;\r
+      // Clear start trigger\r
+      simpliciti_start_now = 0;\r
+      // Config hardware for SimpliciTI\r
+      simpliciti_config();\r
+      // Assign new system status\r
+      system_status = HW_SIMPLICITI_LINKED;\r
+      simpliciti_on = 1;\r
+      // Start access point and stay there until exit flag is set\r
+      simpliciti_main();\r
+      // Clear SimpliciTI flags\r
+      system_status = HW_SIMPLICITI_STOPPED;   \r
+      simpliciti_on = 0;\r
+      // Clean up after SimpliciTI\r
+      simpliciti_data[0] = 0xFF;\r
+      LED_OFF;\r
+    }\r
+    else if( wbsl_start_now && !simpliciti_on)\r
+    {\r
+      LED_ON;\r
+      // Clear start Trigger\r
+      wbsl_start_now = 0;\r
+      //Config the RF module for WBSL\r
+      wbsl_config();\r
+      // Assign new System Status\r
+      system_status = HW_WBSL_LINKED;\r
+      wbsl_on = 1;\r
+      // Start access point and try to pair  with an End Device,\r
+      // once paired, download the software update then return.\r
+      wbsl_main();\r
+      \r
+      // Check if there was an error during the Update procedure to alert the GUI\r
+      if(getFlag(wbsl_flag,WBSL_STATUS_ERROR))\r
+      {\r
+        system_status = HW_WBSL_ERROR;\r
+      }\r
+      else\r
+      {\r
+        system_status = HW_WBSL_STOPPED;\r
+      }\r
+      //Clear WBSL Flags\r
+      wbsl_on = 0;\r
+      wbsl_data[0] = 0xFF;\r
+      \r
+      LED_OFF;\r
+    }    \r
+    else if (test_on)\r
+    {\r
+      if (!test_step_over) \r
+      {\r
+        // Each test is executed just once\r
+        switch (test_step)\r
+        {\r
+          case 1:   test_rf(); \r
+                    break;\r
+          case 2:   start_continuous_tx(); \r
+                    break;\r
+          case 3:   stop_continuous_tx(); \r
+                    break;\r
+        }\r
+        test_step_over = 1;\r
+      }\r
+    }\r
+  }\r
+  */\r
+}\r
+\r
+\r
+// *************************************************************************************************\r
+// Decode received command, extract data and trigger actions.\r
+// *************************************************************************************************\r
+void usb_decode(void)\r
+{\r
+  u32 id = 0;\r
+  u16 test_pw = 0;\r
+  u8 test_byte;\r
+  u16 test_addr;\r
+  u8 i;\r
+\r
+  // Check if start marker is set\r
+  if (usb_buffer[PACKET_BYTE_START] != 0xFF) return;\r
+\r
+  // Check command code\r
+  switch (usb_buffer[PACKET_BYTE_CMD])\r
+  {\r
+    // Generic commands\r
+    case BM_GET_PRODUCT_ID:   usb_buffer[PACKET_BYTE_FIRST_DATA+3] = (u8)(PRODUCT_ID>>24);\r
+                              usb_buffer[PACKET_BYTE_FIRST_DATA+2] = (u8)(PRODUCT_ID>>16);\r
+                              usb_buffer[PACKET_BYTE_FIRST_DATA+1] = (u8)(PRODUCT_ID>>8);\r
+                              usb_buffer[PACKET_BYTE_FIRST_DATA]   = (u8)(PRODUCT_ID); \r
+                              break;\r
+    case BM_GET_STATUS:       usb_buffer[PACKET_BYTE_FIRST_DATA] = system_status; // + 1; \r
+                              break;\r
+\r
+    // BlueRobin TX commands\r
+    case BM_RESET:            bluerobin_stop();\r
+                              bluerobin_on = 0;\r
+                              simpliciti_on = 0;\r
+                              wbsl_on = 0;\r
+                              system_status = HW_IDLE;\r
+                              break;\r
+    case BM_START_BLUEROBIN:  if (simpliciti_on) setFlag(simpliciti_flag, SIMPLICITI_TRIGGER_STOP);\r
+                              if (!bluerobin_on)\r
+                              {\r
+                                // Can only start once instance\r
+                                bluerobin_start_now = 1;\r
+                              }\r
+                              break;\r
+    case BM_STOP_BLUEROBIN:   bluerobin_stop();\r
+                              system_status = HW_BLUEROBIN_STOPPED;\r
+                              break;\r
+    case BM_SET_BLUEROBIN_ID: id  = ((unsigned long)usb_buffer[PACKET_BYTE_FIRST_DATA+3] << 12) << 12;\r
+                              id += ((unsigned long)usb_buffer[PACKET_BYTE_FIRST_DATA+2] << 8) << 8;\r
+                              id += (unsigned long)usb_buffer[PACKET_BYTE_FIRST_DATA+1] << 8;\r
+                              id += (unsigned long)usb_buffer[PACKET_BYTE_FIRST_DATA];\r
+                              BRTX__ID_u32 = id;\r
+                              break;\r
+    case BM_GET_BLUEROBIN_ID: id = BRTX__ID_u32;\r
+                              usb_buffer[PACKET_BYTE_FIRST_DATA+3] = (unsigned char)(id >> 24);\r
+                              usb_buffer[PACKET_BYTE_FIRST_DATA+2] = (unsigned char)(id >> 16);\r
+                              usb_buffer[PACKET_BYTE_FIRST_DATA+1] = (unsigned char)(id >> 8);\r
+                              usb_buffer[PACKET_BYTE_FIRST_DATA] = (unsigned char)(id);\r
+                              break;\r
+    case BM_SET_HEARTRATE:    HeartRate_u8 = usb_buffer[PACKET_BYTE_FIRST_DATA];\r
+                              break;\r
+    case BM_SET_SPEED:        Speed_u8      = usb_buffer[PACKET_BYTE_FIRST_DATA];    \r
+                              Distance_u16  = (unsigned int)(usb_buffer[PACKET_BYTE_FIRST_DATA+2] << 8); \r
+                              Distance_u16 += usb_buffer[PACKET_BYTE_FIRST_DATA+1]; \r
+                              break;\r
+   \r
+    // SimpliciTI RX commands\r
+    case BM_START_SIMPLICITI: if (bluerobin_on) bluerobin_stop();\r
+                              // Can only start one stack\r
+                              if (!simpliciti_on) \r
+                              {\r
+                                system_status = HW_SIMPLICITI_TRYING_TO_LINK;\r
+                               // simpliciti_start_rx_only_now = 1;\r
+                                simpliciti_start_now = 1;\r
+                              }\r
+                              break;\r
+    case BM_GET_SIMPLICITIDATA:   \r
+                              if (getFlag(simpliciti_flag, SIMPLICITI_TRIGGER_RECEIVED_DATA))\r
+                              {\r
+                                // Assemble IN packet (ID/BTN, DataX, DataY, DataZ)\r
+                                usb_buffer[PACKET_BYTE_FIRST_DATA+3] = simpliciti_data[3];\r
+                                usb_buffer[PACKET_BYTE_FIRST_DATA+2] = simpliciti_data[2];\r
+                                usb_buffer[PACKET_BYTE_FIRST_DATA+1] = simpliciti_data[1];\r
+                                usb_buffer[PACKET_BYTE_FIRST_DATA]   = simpliciti_data[0];\r
+                                // Mark buffer as already read\r
+                                simpliciti_data[0] = 0xFF; \r
+                                clearFlag(simpliciti_flag, SIMPLICITI_TRIGGER_RECEIVED_DATA);\r
+                              }\r
+                              else\r
+                              {\r
+                                // Return packet with "already read" marker\r
+                                usb_buffer[PACKET_BYTE_FIRST_DATA]   = 0xFF;\r
+                              }\r
+                              break;\r
+                              \r
+    // SimpliciTI Sync commands\r
+    case BM_SYNC_START:    /*   if (bluerobin_on) bluerobin_stop();\r
+                              // Can only start one stack\r
+                              if (!simpliciti_on) \r
+                              {\r
+                                system_status = HW_SIMPLICITI_TRYING_TO_LINK;\r
+                                simpliciti_start_sync_now = 1;\r
+                              }*/\r
+                              break;\r
+    case BM_SYNC_SEND_COMMAND:   \r
+                              // Copy command data to SimpliciTI buffer\r
+                              if (simpliciti_on) \r
+                              {\r
+                                for (i=0; i<BM_SYNC_DATA_LENGTH; i++) simpliciti_data[i] = usb_buffer[PACKET_BYTE_FIRST_DATA+i];\r
+                                // Set flag to send out command when receiving next ready-to-receive packet\r
+                                setFlag(simpliciti_flag, SIMPLICITI_TRIGGER_SEND_CMD);\r
+                              }\r
+                              break;\r
+    case BM_SYNC_GET_BUFFER_STATUS:   \r
+                              // Set response    \r
+                              usb_buffer[3] = simpliciti_sync_buffer_status;\r
+                              // Set reply packet length \r
+                              usb_buffer[PACKET_BYTE_SIZE] = 1 + PACKET_OVERHEAD_BYTES;\r
+                              break;\r
+    case BM_SYNC_READ_BUFFER:  \r
+                              // Copy bytes from sync buffer to USB buffer\r
+                              if (simpliciti_sync_buffer_status)\r
+                              {\r
+                                for (i=0; i<BM_SYNC_DATA_LENGTH; i++) usb_buffer[PACKET_BYTE_FIRST_DATA+i] = simpliciti_data[i];\r
+                                // Free buffer\r
+                                simpliciti_sync_buffer_status = 0;\r
+                              }\r
+                              // Set reply packet length \r
+                              usb_buffer[PACKET_BYTE_SIZE] = BM_SYNC_DATA_LENGTH + PACKET_OVERHEAD_BYTES;\r
+                              break;\r
+                              \r
+\r
+    // SimpliciTI shared commands                              \r
+    case BM_STOP_SIMPLICITI:  // Stop through remote control\r
+                              setFlag(simpliciti_flag, SIMPLICITI_TRIGGER_STOP);\r
+                              break;\r
+\r
+                              \r
+                        \r
+    // WBSL commands\r
+    case BM_START_WBSL:       //Start WBSL procedure\r
+                              \r
+                              // Can only start one stack\r
+                              if (bluerobin_on) bluerobin_stop();\r
+                              // Can only start one stack\r
+                              if (simpliciti_on) setFlag(simpliciti_flag, SIMPLICITI_TRIGGER_STOP);\r
+                              \r
+                              if(!wbsl_on)\r
+                              {\r
+                                system_status = HW_WBSL_TRYING_TO_LINK;\r
+                               // Trigger the BSL Start\r
+                                wbsl_start_now = 1;\r
+                              }\r
+                              break;\r
+                              \r
+    case BM_STOP_WBSL:        //Stop running the BSL\r
+                              //TODO\r
+                              setFlag(wbsl_flag, WBSL_TRIGGER_STOP);\r
+                              LED_OFF;\r
+                              break;\r
+    \r
+    case BM_GET_WBSL_STATUS:     //Get the status of how far along is the transmission of the Update\r
+                                usb_buffer[PACKET_BYTE_FIRST_DATA]   = wbsl_status;\r
+                              break;\r
+    \r
+    case BM_GET_PACKET_STATUS_WBSL: \r
+                                if(wbsl_on)\r
+                                {\r
+                                   //Get the status of wheter or not a new packet needs to be sent from the GUI\r
+                                   usb_buffer[PACKET_BYTE_FIRST_DATA]   = wbsl_packet_flag;\r
+                                }\r
+                                else\r
+                                {\r
+                                   // This Command shouldn't have come when wbsl is off, tell the GUI an error has ocurred\r
+                                   usb_buffer[PACKET_BYTE_FIRST_DATA] = WBSL_ERROR;\r
+                                }\r
+                                break;\r
+    case BM_GET_MAX_PAYLOAD_WBSL:  // Send the max number of bytes allowed in the payload\r
+                                usb_buffer[PACKET_BYTE_FIRST_DATA]   = WBSL_MAX_PAYLOAD_LENGTH;\r
+                                break;\r
+    case BM_SEND_DATA_WBSL:   \r
+                             // Set the flag as processing so that the GUI knows that it needs to wait before sending next packet\r
+                             wbsl_packet_flag = WBSL_PROCESSING_PACKET;\r
+                             \r
+                              // Check if this is the first message received for the current packet\r
+                             if (packet_ready_flag == WBSL_PACKET_EMPTY)\r
+                             {\r
+                               current_packet_size = 0;\r
+                               wbsl_inc = usb_buffer[PACKET_BYTE_FIRST_DATA - 1] - 3 - 2; // Get total of bytes received and substract overhead (3 from USB and 2 from Packet Length and Address Byte\r
+                               \r
+                               // Save the OP Code Byte\r
+                               wbsl_OPCode = usb_buffer[PACKET_BYTE_FIRST_DATA];\r
+                               \r
+                               if(wbsl_OPCode == WBSL_INIT_PACKET) // Init Packet\r
+                               {\r
+                                  TxBuffer[WBSL_OVERHEAD_LENGTH] = usb_buffer[PACKET_BYTE_FIRST_DATA + 1];\r
+                                  TxBuffer[WBSL_OVERHEAD_LENGTH + 1] = usb_buffer[PACKET_BYTE_FIRST_DATA + 2];\r
+                                  \r
+                                   // Save the total number of packets to be sent\r
+                                  total_packets = usb_buffer[PACKET_BYTE_FIRST_DATA + 1] +((usb_buffer[PACKET_BYTE_FIRST_DATA + 2] << 8) & 0xFF00);\r
+\r
+                                  initPacket[INIT_TOTAL_PACKETS_OFFSET] = total_packets & 0xFF;\r
+                                  initPacket[INIT_TOTAL_PACKETS_OFFSET+1] = (total_packets >> 8) & 0xFF;\r
+                                  packet_ready_flag = WBSL_PACKET_FULL;\r
+                                  ptrTX = 0;\r
+                               }\r
+                               else   // Regular data packet \r
+                               {\r
+                                 wbsl_packetLength = usb_buffer[PACKET_BYTE_FIRST_DATA + 1];\r
+                                 \r
+                                 if(wbsl_OPCode == WBSL_ADDRESS_PACKET)\r
+                                   TxBuffer[WBSL_OPCODE_OFFSET] = WBSL_ADDRESS_PACKET; // Set the address OPCODE\r
+                                 else\r
+                                   TxBuffer[WBSL_OPCODE_OFFSET] = WBSL_NORMAL_PACKET; // Set the packet as a normal packet\r
+                                 \r
+                                 //Update size of packet to be sent and substract Overhead and Length field\r
+                                 TxBuffer[0] = wbsl_packetLength + WBSL_OVERHEAD_LENGTH - 1;\r
+                                  \r
+                                 for(i=0;i<wbsl_inc;i++)  // Copy all Received Bytes to the TxBuffer\r
+                                 {\r
+                                    TxBuffer[i+WBSL_OVERHEAD_LENGTH] = usb_buffer[PACKET_BYTE_FIRST_DATA + i + 2];\r
+                                 }\r
+\r
+                                  packet_ready_flag = WBSL_PACKET_FILLING;\r
+                                  ptrTX = wbsl_inc;  // Update pointer\r
+                                  \r
+                                  // Update the current size to know when the complete packet has been received\r
+                                  current_packet_size += wbsl_inc;\r
+                                  \r
+                                  // Check if complete packet has been received\r
+                                  if(current_packet_size >= wbsl_packetLength)\r
+                                  {\r
+                                    packet_ready_flag = WBSL_PACKET_FULL;\r
+                                    ptrTX = 0;\r
+                                  }\r
+                               }\r
+                             }\r
+                             else if(packet_ready_flag == WBSL_PACKET_FILLING)\r
+                             {\r
+                                wbsl_inc = usb_buffer[PACKET_BYTE_FIRST_DATA - 1] - 3; // Get total of bytes received and substract overhead\r
+                                \r
+                                for(i=0;i<wbsl_inc;i++)// Copy all Received Bytes to the TxBuffer\r
+                                {\r
+                                  TxBuffer[ptrTX + i + WBSL_OVERHEAD_LENGTH] = usb_buffer[PACKET_BYTE_FIRST_DATA + i];\r
+                                }\r
+                                ptrTX += wbsl_inc;  // Update pointer\r
+                                \r
+                                // Update the current size to know when the complete packet has been received\r
+                                current_packet_size += wbsl_inc;\r
+\r
+                                // Check if total bytes have been received or the maximum payload length has been reached\r
+                                // reaching max payload length and still having bytes to be read is an error since bytes would be lost\r
+                                if(ptrTX >= WBSL_MAX_PAYLOAD_LENGTH || current_packet_size >= wbsl_packetLength)\r
+                                {\r
+                                  packet_ready_flag = WBSL_PACKET_FULL;\r
+                                  ptrTX = 0;\r
+                                }\r
+                             }\r
+                              break; \r
+\r
+                             \r
+    // Test commands\r
+    case BM_INIT_TEST:        test_pw = (u16)usb_buffer[PACKET_BYTE_FIRST_DATA+1] << 8;\r
+                              test_pw += (u16)usb_buffer[PACKET_BYTE_FIRST_DATA];\r
+                              if (test_pw == RFTEST_PW) \r
+                              {\r
+                                test_on        = 1;\r
+                                test_step      = 0;\r
+                                test_step_over = 1;\r
+                                bluerobin_on   = 0;\r
+                                simpliciti_on  = 0;\r
+                              }\r
+                              else                      \r
+                              {\r
+                                test_on       = 0;\r
+                              }\r
+                              break;\r
+  \r
+    case BM_NEXT_TEST:        if (test_on)\r
+                              {\r
+                                test_result = 0;\r
+                                test_step_over = 0;\r
+                                test_step++;\r
+                              }\r
+                              break;\r
+                              \r
+\r
+    case BM_GET_TEST_RESULT:  if (test_on)\r
+                              {\r
+                                usb_buffer[PACKET_BYTE_FIRST_DATA]   = (u8)test_result;\r
+                                usb_buffer[PACKET_BYTE_FIRST_DATA+1] = (u8)(test_result >> 8);\r
+                              }\r
+                              break;\r
+                           \r
+    case BM_WRITE_BYTE:       if (test_on)\r
+                              {\r
+                                test_byte  = usb_buffer[PACKET_BYTE_FIRST_DATA];\r
+                                test_addr  = (u16)usb_buffer[PACKET_BYTE_FIRST_DATA+1];\r
+                                test_addr += ((u16)usb_buffer[PACKET_BYTE_FIRST_DATA+2] << 8);\r
+\r
+                                // Allow flash write access                                \r
+                                flash_start_update();\r
+                                \r
+                                // Write calibration data only if memory location empty\r
+                                if (flash_byte_read(test_addr) == 0xFF) \r
+                                {\r
+                                  // Write byte to cal page\r
+                                  flash_word_write(test_addr, ((u16)test_byte << 8) + 0xFF, FLASH_EW_KEY, 0);\r
+                                }\r
+                              }\r
+                              break;\r
+\r
+  }\r
+  \r
+  // Return packet with original data, but modified command byte (acknowledge)\r
+  usb_sendack = 1;\r
+  usb_buffer[PACKET_BYTE_CMD] = HW_NO_ERROR;\r
+}\r
+\r
+\r
+\r
+// *************************************************************************************************\r
+// Config clock and timers for SimpliciTI\r
+// *************************************************************************************************\r
+void simpliciti_config(void)\r
+{\r
+  // OSC=XT, TICKSPD=fref/64, CLKSPD=12MHz\r
+  CLKCON = BIT7 | BIT5 | BIT4; \r
+    \r
+  // Reset radio registers to default settings\r
+  SYNC1       = 0xD3;               /*  Sync word, high byte                                */\r
+  SYNC0       = 0x91;               /*  Sync word, low byte                                 */\r
+  PKTCTRL1    = 0x04;               /*  Packet automation control                           */\r
+  ADDR        = 0x00;               /*  Device address                                      */\r
+  CHANNR      = 0x00;               /*  Channel number                                      */\r
+  MCSM2       = 0x07;               /*  Main Radio Control State Machine configuration      */\r
+  IOCFG2      = 0x00;               /*  Radio Test Signal Configuration (P1_7)              */\r
+  IOCFG1      = 0x00;               /*  Radio Test Signal Configuration (P1_6)              */\r
+  IOCFG0      = 0x00;               /*  Radio Test Signal Configuration (P1_5)              */\r
+  \r
+  // Reset RF int mask bits - SimpliciTI will set them \r
+  RFIM = 0;\r
+}\r
+\r
+\r
+// *************************************************************************************************\r
+// Start BlueRobin transmission\r
+// *************************************************************************************************\r
+void bluerobin_start(void)\r
+{\r
+  // OSC=XT, TICKSPD=fref/128, CLKSPD=24MHz\r
+  CLKCON = BIT7 | BIT5 | BIT4 | BIT3; \r
+  \r
+  // Enable RF IRQs\r
+  RFIM |= BIT7 | BIT4;\r
+  \r
+  // Clear Timer1\r
+  T1CNTL = 0x55;\r
+\r
+  // Enable Timer1 interrupt, enable compare mode\r
+  T1CCTL0 = 0x44;\r
+\r
+  // Start T1 in modulo mode\r
+  T1CTL = 0x02;\r
+\r
+  // Init hardware and BlueRobin stack\r
+  INT_ENABLE(INUM_T1, INT_ON);\r
+  \r
+  // Init s/w\r
+  InitProject_v();\r
+  \r
+  // Set FSCTRL0 to calibration value\r
+  FSCTRL0 = frequoffset;\r
+  \r
+  // Set on flag\r
+  bluerobin_on = 1;\r
+}\r
+\r
+\r
+// *************************************************************************************************\r
+// Stop BlueRobin transmission\r
+// *************************************************************************************************\r
+void bluerobin_stop(void)\r
+{\r
+  BRTX_Stop_v();\r
+\r
+  // Stop Timer1 \r
+  INT_ENABLE(INUM_T1, INT_OFF);\r
+  T1CTL = 0x00;\r
+\r
+  // Clear Timer1\r
+  T1CNTL = 0x55;\r
+\r
+  // Clear Timer1 structure\r
+  reset_timer1();\r
+  \r
+  // Clear on flag\r
+  bluerobin_on = 0;\r
+}\r
+\r
+\r
+// *************************************************************************************************\r
+// Forward RF IRQ to right handler \r
+// *************************************************************************************************\r
+#pragma vector=RF_VECTOR\r
+__interrupt void rf_ISR(void)\r
+{\r
+  if ( bluerobin_on )\r
+  {\r
+    BR_RfIsr();    \r
+  }\r
+  else if ( simpliciti_on )\r
+  {\r
+    MRFI_RfIsr();  \r
+  }\r
+  else if ( test_on )\r
+  {\r
+    rftest_RfIsr();    \r
+  }\r
+  else if ( wbsl_on )\r
+  {\r
+    wbsl_RfIsr();\r
+  }\r
+}\r
+\r
+// *************************************************************************************************\r
+// Forward RF TX/RX IRQ to right handler \r
+// *************************************************************************************************\r
+#pragma vector=RFTXRX_VECTOR\r
+__interrupt void ISR_RFTXRX(void)\r
+{\r
+  if ( bluerobin_on )\r
+  {\r
+    BR_RfTxRxIsr();    \r
+  }\r
+  else if ( test_on )\r
+  {\r
+    rftest_RfTxRxIsr();    \r
+  }\r
+}\r
+\r
+\r
+// *************************************************************************************************\r
+// Timer1 ISR\r
+// *************************************************************************************************\r
+#pragma vector=T1_VECTOR\r
+__interrupt void t1Timer_ISR(void)\r
+{\r
+  // Clear IRCON.T1IF\r
+  IRCON &= ~0x02;\r
+\r
+  // Clear Timer 1 Channel 0-2 + overflow interrupt flag\r
+  T1CTL &= ~0xF0;\r
+\r
+  // Return immediately if timer not enabled\r
+  if (!sTimer1.enable) return;\r
+\r
+  // Return immediately if s/w int flag not reset\r
+  if (sTimer1.iflag) return;\r
+  \r
+  // Set timer cycles, and call s/w int handler if no more cycles to set\r
+  if (!set_timer1_cycles()) \r
+  {\r
+    // Call BlueRobin TX function\r
+    sTimer1.iflag = 1;  \r
+  }\r
+  \r
+  // Increase global cycle count\r
+  sTimer1.cycles++;\r
+}\r
+\r
+\r
+// *************************************************************************************************\r
+// Timer4 ISR\r
+// *************************************************************************************************\r
+#pragma vector=T4_VECTOR\r
+__interrupt void timer4_ISR(void)\r
+{\r
+  \r
+  // If WBSL_ON check if any timeout entry needs to be serviced\r
+  if( wbsl_on ){\r
+    //If the timeout entry is enabled\r
+    if( timeout_table[WBSL_TIMEOUT_INDEX].timeout > 0){  \r
+        //Check if timeout has been reached\r
+       if(++timeout_table[WBSL_TIMEOUT_INDEX].counter == timeout_table[WBSL_TIMEOUT_INDEX].timeout)\r
+       {\r
+         timeout_table[WBSL_TIMEOUT_INDEX].counter = 0;    // Reset counter\r
+         timeout_table[WBSL_TIMEOUT_INDEX].timeout = 0;    // Reset timeout (Disable)\r
+         timeout_table[WBSL_TIMEOUT_INDEX].flag = 1;       // Set the flag so that WBSL knows that\r
+       }\r
+    }\r
+  }\r
+\r
+  // Clear IRQ flag\r
+  TIMIF &= ~BIT3;\r
+  \r
+  // Service USB functions\r
+  usbUartProcess();\r
+}\r
+\r
+\r
+// *************************************************************************************************\r
+// Assign all unused IRQ\r
+// *************************************************************************************************\r
+void catch_stray_irq(void)\r
+{\r
+  asm("nop");\r
+}\r
+#pragma vector=ADC_VECTOR\r
+__interrupt void adc_ISR(void) { catch_stray_irq(); }\r
+#pragma vector=URX0_VECTOR\r
+__interrupt void urx0_ISR(void) { catch_stray_irq(); }\r
+#pragma vector=URX1_VECTOR\r
+__interrupt void urx1_ISR(void) { catch_stray_irq(); }\r
+#pragma vector=ENC_VECTOR\r
+__interrupt void enc_ISR(void) { catch_stray_irq(); }\r
+#pragma vector=ST_VECTOR\r
+__interrupt void st_ISR(void) { catch_stray_irq(); }\r
+#pragma vector=UTX0_VECTOR\r
+__interrupt void utx0_ISR(void) { catch_stray_irq(); }\r
+#pragma vector=DMA_VECTOR\r
+__interrupt void dma_ISR(void) { catch_stray_irq(); }\r
+#pragma vector=T2_VECTOR\r
+__interrupt void t2_ISR(void) { catch_stray_irq(); }\r
+#pragma vector=UTX1_VECTOR\r
+__interrupt void utx1_ISR(void) { catch_stray_irq(); }\r
+#pragma vector=P1INT_VECTOR\r
+__interrupt void p1_ISR(void) { catch_stray_irq(); }\r
+#pragma vector=WDT_VECTOR\r
+__interrupt void wdt_ISR(void) { catch_stray_irq(); }\r
diff --git a/chronos-ti/Software Projects/RF Access Point/IAR/rftest.c b/chronos-ti/Software Projects/RF Access Point/IAR/rftest.c
new file mode 100755 (executable)
index 0000000..2f869cc
--- /dev/null
@@ -0,0 +1,538 @@
+// *************************************************************************************************\r
+//\r
+//     Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/ \r
+//      \r
+//      \r
+//       Redistribution and use in source and binary forms, with or without \r
+//       modification, are permitted provided that the following conditions \r
+//       are met:\r
+//     \r
+//         Redistributions of source code must retain the above copyright \r
+//         notice, this list of conditions and the following disclaimer.\r
+//      \r
+//         Redistributions in binary form must reproduce the above copyright\r
+//         notice, this list of conditions and the following disclaimer in the \r
+//         documentation and/or other materials provided with the   \r
+//         distribution.\r
+//      \r
+//         Neither the name of Texas Instruments Incorporated nor the names of\r
+//         its contributors may be used to endorse or promote products derived\r
+//         from this software without specific prior written permission.\r
+//     \r
+//       THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \r
+//       "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT \r
+//       LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//       A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT \r
+//       OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, \r
+//       SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT \r
+//       LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//       DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//       THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT \r
+//       (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE \r
+//       OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+// Test routines used for calibration during production test\r
+// *************************************************************************************************\r
+\r
+\r
+// *************************************************************************************************\r
+// Include section\r
+#include "project.h"\r
+#include "rftest.h"\r
+#include "timer1.h"\r
+\r
+\r
+// *************************************************************************************************\r
+// Defines section\r
+#define RFTEST_SYNC_WORD               (0xCABA)\r
+#define RFTEST_PACKET_LENGTH           (10u)\r
+#define RFTEST_PACKET_COUNT            (10u)\r
+#define RFTEST_OUTPUT_POWER            (0x5A)\r
+#define RFTEST_OUTPUT_POWER_MAX                (0xC0)\r
+#define RFTEST_ACLK_DEVIATION_MAX      (4u)\r
+#define RFTEST_FREQEST_MIN             (-25)\r
+#define RFTEST_FREQEST_MAX             (+25)\r
+\r
+\r
+// *************************************************************************************************\r
+// Global Variable section\r
+u8     rftest_packet[RFTEST_PACKET_LENGTH];\r
+u8      rftest_packet_ptr;\r
+u8     rftest_count;\r
+u32     rftest_time;\r
+\r
+typedef struct {\r
+       u8    valid;\r
+       u16   time;\r
+       u8    packet_nb;\r
+       u8    freqoffset;\r
+} s_rftest;\r
+\r
+s_rftest rftest[RFTEST_PACKET_COUNT];\r
+               \r
+const u8 ref_packet[RFTEST_PACKET_LENGTH] = { 0x00, 0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55 };\r
+\r
+\r
+\r
+// *************************************************************************************************\r
+// Extern section\r
+extern u16 test_result;\r
+\r
+\r
+// *************************************************************************************************\r
+// Static Function prototype section\r
+\r
+void rftest_init(void);\r
+void rftest_radio_init(void);\r
+\r
+\r
+// *************************************************************************************************\r
+// Implementation\r
+\r
+\r
+// *************************************************************************************************\r
+// Init test variables\r
+// *************************************************************************************************\r
+void rftest_init(void)\r
+{\r
+  u8 i;\r
+  \r
+  // Init and calibrate radio\r
+  rftest_radio_init();\r
+  \r
+  // Clear RX variables\r
+  rftest_count = 0;\r
+  for (i=0; i<RFTEST_PACKET_COUNT; i++)\r
+  {\r
+          rftest[i].valid      = 0;\r
+          rftest[i].time       = 0;\r
+          rftest[i].packet_nb  = 0;\r
+          rftest[i].freqoffset = 0;\r
+  }\r
+}\r
+\r
+\r
+// *************************************************************************************************\r
+// Test RF reception\r
+// *************************************************************************************************\r
+void test_rf(void) \r
+{\r
+  u16 time1, time2, packet1, packet2, div;\r
+  s16 ref, delta;\r
+  u8 i;\r
+  s16 freqest;\r
+  u8 freqest1;\r
+  s16 freqest0;\r
+  u8 continue_test = YES;\r
+  \r
+  // Config radio for RX\r
+  rftest_init();\r
+\r
+  // Set timeout in 1.5 seconds\r
+  reset_timer1();\r
+  set_timer1(32768*1.5);\r
+  T1CCTL0 = 0x44;\r
+  T1CTL   = 0x02;\r
+\r
+  // Clear RF interrupts\r
+  S1CON &= ~(BIT1 | BIT0);  // Clear MCU interrupt flag \r
+  RFIF &= ~BIT4;            // Clear "receive/transmit done" interrupt \r
+  RFIM |= BIT4;             // Enable "receive/transmit done" interrupt\r
+\r
+  // Enable IRQ\r
+  INT_ENABLE(INUM_RFTXRX, INT_ON);\r
+  INT_ENABLE(INUM_RF, INT_ON);\r
+  INT_ENABLE(INUM_T1, INT_ON);\r
+  \r
+  // Clear test result variable\r
+  test_result = 0;\r
+  \r
+  // Continue to receive packets until timeout\r
+  while ((rftest_count < RFTEST_PACKET_COUNT) && (!sTimer1.iflag))\r
+  {\r
+    // Start new RX if radio is IDLE\r
+    if (MARCSTATE == 0x01) SRX();\r
+  }\r
+  SIDLE();\r
+  \r
+  // Analyze received packets\r
+  if (sTimer1.iflag || rftest_count < RFTEST_PACKET_COUNT/2)\r
+  {\r
+    // Timeout - no or not enough packets received\r
+    test_result = 0x8000;\r
+    continue_test = NO;\r
+  }\r
+  else\r
+  {\r
+      // Store last and first packet\r
+      for (i=0; i<RFTEST_PACKET_COUNT; i++)\r
+      {\r
+        if (rftest[i].valid) \r
+        {\r
+          time1   = rftest[i].time;\r
+          packet1 = rftest[i].packet_nb;\r
+          break;\r
+        }\r
+      }\r
+      for (i=RFTEST_PACKET_COUNT-1; i>0; i--)\r
+      {\r
+        if (rftest[i].valid) \r
+        {\r
+          time2   = rftest[i].time;\r
+          packet2 = rftest[i].packet_nb;\r
+          break;\r
+        }\r
+      }\r
+      \r
+      // Calculate mean freqest\r
+      freqest = 0;\r
+      div = 0;\r
+      for (i=0; i<RFTEST_PACKET_COUNT; i++)\r
+      {\r
+        if (rftest[i].valid) \r
+        {\r
+            // Sign extend negative numbers\r
+            if ((rftest[i].freqoffset & BIT7) == BIT7) \r
+            {\r
+              freqest += (s16)(0xFF00 | rftest[i].freqoffset);\r
+            }\r
+            else\r
+            {\r
+              freqest += (s16)(rftest[i].freqoffset);\r
+            }\r
+            div++;\r
+        }\r
+      }\r
+      \r
+      // FREQEST range check\r
+      freqest0 = freqest/(s16)div;\r
+      if ((freqest0 < RFTEST_FREQEST_MIN) || (freqest0 > RFTEST_FREQEST_MAX)) \r
+      {\r
+              test_result = 0x2000 | (u8)freqest0;\r
+              continue_test = NO;\r
+      }\r
+      else\r
+      { // FREQEST range ok\r
+      \r
+        // Calculate distance between 1 and 2\r
+        // TX sends packet each 3276 ACLK ticks (= 1145 T1CLK ticks)\r
+        ref = (packet2 - packet1)*3276;\r
+        delta = time2 - time1;\r
+  \r
+        if ((ref - delta) < RFTEST_ACLK_DEVIATION_MAX)\r
+        {\r
+          // Store ACLK deviation in test result\r
+          test_result = ((ref - delta)&0x0F) << 8; \r
+          \r
+          // Store average FREQEST\r
+          if (freqest < 0)\r
+          {\r
+            freqest1 = (u8)((freqest*(-1))/div);\r
+            freqest1 = ~freqest1 + 1;\r
+            test_result |= freqest1;\r
+          }\r
+          else\r
+          {\r
+            test_result |= (u8)(freqest/div);\r
+          } \r
+        }\r
+        else if ((delta - ref) < RFTEST_ACLK_DEVIATION_MAX)\r
+        {\r
+          // Store ACLK deviation in test result\r
+          test_result = ((delta - ref)&0x0F) << 8; \r
+          \r
+          // Store average FREQEST\r
+          if (freqest < 0)\r
+          {\r
+            freqest1 = (u8)((freqest*(-1))/div);\r
+            freqest1 = ~freqest1 + 1;\r
+            test_result |= freqest1;\r
+          }\r
+          else\r
+          {\r
+            test_result |= (u8)(freqest/div);\r
+          }                    \r
+        }\r
+        else\r
+        {\r
+          // Too high ACLK deviation\r
+          test_result = 0x4000;\r
+          continue_test = NO;\r
+        }\r
+      }\r
+  }\r
+  \r
+  // 2nd test stage - use RF offset to catch another few packets\r
+  if (continue_test == YES)\r
+  {\r
+    rftest_count = 0;\r
+    \r
+    // Clear RX variables\r
+    for (i=0; i<RFTEST_PACKET_COUNT; i++)\r
+    {\r
+            rftest[i].valid      = 0;\r
+            rftest[i].time          = 0;\r
+            rftest[i].packet_nb  = 0;\r
+            rftest[i].freqoffset = 0;\r
+    }\r
+    \r
+    // Set frequency offset\r
+    FSCTRL0 = freqest0;\r
+    \r
+    // Set timeout in 0.5 seconds\r
+    reset_timer1();\r
+    set_timer1(32768*0.5);\r
+    \r
+    // Try to receive just 1 packet\r
+    while ((rftest_count < 1) && (!sTimer1.iflag))\r
+    {\r
+      // Start new RX if radio is IDLE\r
+      if (MARCSTATE == 0x01) SRX();\r
+    }\r
+    SIDLE();\r
+    \r
+    // Analyze received packets frequency offset - should be close to 0\r
+    if (rftest_count > 0)\r
+    {\r
+            if (!((rftest[0].freqoffset >= 0xFE) || (rftest[0].freqoffset <= 0x02)))\r
+            {\r
+                    test_result = 0x1000;\r
+            }\r
+    }\r
+    else\r
+    {\r
+            test_result = 0x1000;\r
+    }\r
+  }\r
+\r
+  // Disable IRQ\r
+  INT_ENABLE(INUM_RFTXRX, INT_OFF);\r
+  INT_ENABLE(INUM_RF, INT_OFF);\r
+  INT_ENABLE(INUM_T1, INT_OFF);\r
+\r
+  // Stop Timer1 \r
+  T1CTL  = 0x00;\r
+  T1CNTL = 0x55;\r
+  reset_timer1();\r
+}\r
+\r
+\r
+// *************************************************************************************************\r
+// Sets the radio hardware to the required initial state.\r
+// *************************************************************************************************\r
+void rftest_radio_init(void)\r
+{\r
+  u8 FSCAL3_Register_u8;\r
+\r
+  SYNC1       = RFTEST_SYNC_WORD >> 8;  /*  Sync word, high byte                                */\r
+  SYNC0       = (u8) RFTEST_SYNC_WORD;  /*  Sync word, low byte                                 */\r
+  PKTLEN      = RFTEST_PACKET_LENGTH;   /*  Packet length                                       */\r
+  PKTCTRL1    = 0x00;               /*  Packet automation control                           */\r
+  PKTCTRL0    = 0x00;               /*  Packet automation control                           */\r
+  ADDR        = 0x00;               /*  Device address                                      */\r
+  CHANNR      = 0x00;               /*  Channel number                                      */\r
+  FSCTRL1     = 0x12;               /*  Frequency synthesizer control                       */\r
+  FSCTRL0     = 0x00;               /*  Frequency synthesizer control                       */\r
+#ifdef ISM_EU\r
+  FREQ2       = 0x24;               /*  Frequency control word, high byte                   */\r
+  FREQ1       = 0x2D;               /*  Frequency control word, middle byte                 */\r
+  FREQ0       = 0x55;               /*  Frequency control word, low byte                    */\r
+  MDMCFG4     = 0x3D;               /*  Modem configuration                                 */\r
+  MDMCFG3     = 0x55;               /*  Modem configuration                                 */\r
+  MDMCFG2     = 0x15;               /*  Modem configuration                                 */\r
+  MDMCFG1     = 0x12;               /*  Modem configuration                                 */\r
+  MDMCFG0     = 0x11;               /*  Modem configuration                                 */\r
+#else\r
+  #ifdef ISM_US\r
+  FREQ2       = 0x26;               /*  Frequency control word, high byte                   */\r
+  FREQ1       = 0x19;               /*  Frequency control word, middle byte                 */\r
+  FREQ0       = 0x11;               /*  Frequency control word, low byte                    */\r
+  MDMCFG4     = 0x3D;               /*  Modem configuration                                 */\r
+  MDMCFG3     = 0x55;               /*  Modem configuration                                 */\r
+  MDMCFG2     = 0x15;               /*  Modem configuration                                 */\r
+  MDMCFG1     = 0x12;               /*  Modem configuration                                 */\r
+  MDMCFG0     = 0x11;               /*  Modem configuration                                 */ \r
+  #else\r
+    #ifdef ISM_LF\r
+    FREQ2       = 0x12;               /*  Frequency control word, high byte                   */\r
+    FREQ1       = 0x0A;               /*  Frequency control word, middle byte                 */\r
+    FREQ0       = 0xAA;               /*  Frequency control word, low byte                    */\r
+    MDMCFG4     = 0x3D;               /*  Modem configuration                                 */\r
+    MDMCFG3     = 0x55;               /*  Modem configuration                                 */\r
+    MDMCFG2     = 0x15;               /*  Modem configuration                                 */\r
+    MDMCFG1     = 0x12;               /*  Modem configuration                                 */\r
+    MDMCFG0     = 0x11;               /*  Modem configuration                                 */ \r
+    #else\r
+      #error "No ISM band specified"\r
+    #endif\r
+  #endif\r
+#endif\r
+  DEVIATN     = 0x60;               /*  Modem deviation setting                             */\r
+  MCSM2       = 0x07;               /*  Main Radio Control State Machine configuration      */\r
+  MCSM1       = 0x02;               /*  Main Radio Control State Machine configuration      */\r
+  MCSM0       = 0x18;               /*  Main Radio Control State Machine configuration      */\r
+  FOCCFG      = 0x1D;               /*  Frequency Offset Compensation configuration         */\r
+  BSCFG       = 0x1C;               /*  Bit Synchronization configuration                   */\r
+  AGCCTRL2    = 0xC7;               /*  AGC control                                         */\r
+  AGCCTRL1    = 0x10;               /*  AGC control                                         */\r
+  AGCCTRL0    = 0xB2;               /*  AGC control                                         */\r
+  FREND1      = 0xB6;               /*  Front end RX configuration                          */\r
+  FREND0      = 0x10;               /*  Front end TX configuration                          */\r
+  FSCAL3      = 0xEA;               /*  Frequency synthesizer calibration                   */\r
+  FSCAL2      = 0x2A;               /*  Frequency synthesizer calibration                   */\r
+  FSCAL1      = 0x00;               /*  Frequency synthesizer calibration                   */\r
+  FSCAL0      = 0x1F;               /*  Frequency synthesizer calibration                   */\r
+  IOCFG2      = 0x00;               /*  Radio Test Signal Configuration (P1_7)              */\r
+  IOCFG1      = 0x00;               /*  Radio Test Signal Configuration (P1_6)              */\r
+  IOCFG0      = 0x00;               /*  Radio Test Signal Configuration (P1_5)              */\r
+  TEST1       = 0x31;\r
+\r
+  // Read FSCAL3 register, set bits enabling charge pump calibration and write register again\r
+  FSCAL3_Register_u8 = FSCAL3 | 0x20;\r
+  FSCAL3 = FSCAL3_Register_u8;\r
+\r
+  // Set output power\r
+  PA_TABLE0 = RFTEST_OUTPUT_POWER; \r
+\r
+  // Start calibration manually\r
+  SIDLE();\r
+  SCAL();\r
+\r
+  // Wait until calibration completed\r
+  while(MARCSTATE != 0x01);\r
+  FSCAL3 &= ~0x30;  \r
+    \r
+  // Enter powerdown mode\r
+  SIDLE();\r
+}\r
+\r
+\r
+// *************************************************************************************************\r
+// RF TX/RX IRQ providing data handling\r
+// *************************************************************************************************\r
+void rftest_RfTxRxIsr(void)\r
+{\r
+  u8 pass, i;\r
+  u16 time, timeout;\r
+  \r
+  // First clear pointer to fifo\r
+  rftest_packet_ptr = 0;\r
+\r
+  // Read first byte\r
+  rftest_packet[rftest_packet_ptr++] = RFD;\r
+  \r
+  // Load timeout counter  \r
+  timeout = 400;\r
+\r
+  // Wait until all 10 bytes have been received\r
+  while ( (rftest_packet_ptr < RFTEST_PACKET_LENGTH)  && (timeout-- != 0) ) \r
+  {\r
+    if ((TCON & BIT1) == BIT1)\r
+    {\r
+      // Read next bytes\r
+      rftest_packet[rftest_packet_ptr++] = RFD;\r
+\r
+      // Clear IRQ flag\r
+      TCON &= ~BIT1;\r
+    }\r
+  }\r
+\r
+  // Indicate that RX is over\r
+  if (rftest_packet_ptr == RFTEST_PACKET_LENGTH) \r
+  {\r
+    // Radio off during decoding\r
+    SIDLE();\r
+    \r
+    // Store current 16-bit time\r
+    time  = T1CNTL;\r
+    time |= T1CNTH << 8;\r
+    time = (sTimer1.cycles*11453) + (u16)(((u32)time*32768)/187500);\r
+    \r
+    // Check if packet is valid\r
+    pass = 1;\r
+    for (i=1; i<RFTEST_PACKET_LENGTH; i++)\r
+    {\r
+      if (rftest_packet[i] != ref_packet[i]) pass = 0;\r
+    }\r
+    \r
+    // Continue if packet ok\r
+    if (pass)\r
+    {\r
+      rftest[rftest_count].valid        = 1;\r
+      rftest[rftest_count].time        = time;\r
+      rftest[rftest_count].packet_nb   = rftest_packet[0];\r
+      rftest[rftest_count].freqoffset  = FREQEST;\r
+      rftest_count++;\r
+    }\r
+  }\r
+}\r
+\r
+\r
+// *************************************************************************************************\r
+// RF TX/RX general IRQ providing status handling\r
+// *************************************************************************************************\r
+void rftest_RfIsr(void)\r
+{\r
+  u8 rfif_reg = RFIF;\r
+  \r
+  // Clear CPU int flag\r
+  S1CON &= ~0x03;\r
+  \r
+  // check status register\r
+  if ((rfif_reg & BIT7) == BIT7)\r
+  {\r
+    // TX underflow error\r
+    SIDLE();\r
+  }\r
+  else if ((rfif_reg & IRQ_RXOVF) == IRQ_RXOVF)\r
+  {\r
+    // RX overflow error\r
+    SIDLE();\r
+    while(MARCSTATE != 0x01);\r
+    rftest_packet_ptr = 0;\r
+  } \r
+\r
+  // Clear IRQ\r
+  RFIF = 0x00;  \r
+}\r
+\r
+\r
+// *************************************************************************************************\r
+// Continuous TX - used for spectrum analysis and high current check\r
+// *************************************************************************************************\r
+void start_continuous_tx(void)\r
+{\r
+  // Disable IRQ\r
+  INT_ENABLE(INUM_RFTXRX, INT_OFF);\r
+  INT_ENABLE(INUM_RF, INT_OFF);\r
+\r
+#ifdef TX_SIMPLE_TEST\r
+  CHANNR = 0;\r
+#else\r
+  // Send on far away channel\r
+  CHANNR = 0xFF;\r
+#endif\r
+  \r
+  // Max output power\r
+  PA_TABLE0 = RFTEST_OUTPUT_POWER_MAX;\r
+  \r
+  // Packet length is 1\r
+  PKTLEN = 1;\r
+  \r
+  // Write first byte to RFD register\r
+  RFD = 0x55;\r
+  \r
+  // Transmit\r
+  STX();  \r
+}\r
+\r
+\r
+\r
+// *************************************************************************************************\r
+// Exit continuous TX\r
+// *************************************************************************************************\r
+void stop_continuous_tx(void)\r
+{\r
+  SIDLE();\r
+}
\ No newline at end of file
diff --git a/chronos-ti/Software Projects/RF Access Point/IAR/rftest.h b/chronos-ti/Software Projects/RF Access Point/IAR/rftest.h
new file mode 100755 (executable)
index 0000000..bf94b36
--- /dev/null
@@ -0,0 +1,9 @@
+#define RFTEST_PW                       (0xABAB)\r
+\r
+extern void test_rf(void);\r
+extern void rftest_RfIsr(void);\r
+extern void rftest_RfTxRxIsr(void);\r
+extern void start_continuous_tx(void);\r
+extern void stop_continuous_tx(void);\r
+extern void rftest_radio_init(void);\r
+\r
diff --git a/chronos-ti/Software Projects/RF Access Point/IAR/settings/cc1111_usb_dongle.cspy.bat b/chronos-ti/Software Projects/RF Access Point/IAR/settings/cc1111_usb_dongle.cspy.bat
new file mode 100755 (executable)
index 0000000..9b7e1bc
--- /dev/null
@@ -0,0 +1,33 @@
+@REM This bat file has been generated by the IAR Embeddded Workbench\r
+@REM C-SPY interactive debugger,as an aid to preparing a command\r
+@REM line for running the cspybat command line utility with the\r
+@REM appropriate settings.\r
+@REM\r
+@REM After making some adjustments to this file, you can launch cspybat\r
+@REM by typing the name of this file followed by the name of the debug\r
+@REM file (usually an ubrof file). Note that this file is generated\r
+@REM every time a new debug session is initialized, so you may want to\r
+@REM move or rename the file before making changes.\r
+@REM\r
+@REM Note: some command line arguments cannot be properly generated\r
+@REM by this process. Specifically, the plugin which is responsible\r
+@REM for the Terminal I/O window (and other C runtime functionality)\r
+@REM comes in a special version for cspybat, and the name of that\r
+@REM plugin dll is not known when generating this file. It resides in\r
+@REM the $TOOLKIT_DIR$\bin folder and is usually called XXXbat.dll or\r
+@REM XXXlibsupportbat.dll, where XXX is the name of the corresponding\r
+@REM tool chain. Replace the '<libsupport_plugin>' parameter\r
+@REM below with the appropriate file name. Other plugins loaded by\r
+@REM C-SPY are usually not needed by, or will not work in, cspybat\r
+@REM but they are listed at the end of this file for reference.\r
+\r
+\r
+"C:\Program Files\IAR Systems\Embedded Workbench 5.4 Kickstart\common\bin\cspybat" "C:\Program Files\IAR Systems\Embedded Workbench 5.4 Kickstart\8051\bin\8051proc.dll" "C:\Program Files\IAR Systems\Embedded Workbench 5.4 Kickstart\8051\bin\8051emu_cc.dll"  %1 --plugin "C:\Program Files\IAR Systems\Embedded Workbench 5.4 Kickstart\8051\bin\<libsupport_plugin>" --backend -B "--proc_core" "plain" "--proc_code_model" "near" "--proc_nr_virtual_regs" "8" "--proc_pdata_bank_reg_addr" "0x93" "--proc_dptr_nr_of" "1" "--proc_data_model" "small" "-p" "C:\Program Files\IAR Systems\Embedded Workbench 5.4 Kickstart\8051\config\devices\_generic\io8052.ddf" "--proc_driver" "chipcon" "--erase_flash" "--verify_download" "use_crc16" "--reduce_speed" "--stack_overflow" "--number_of_banks" "4" \r
+\r
+\r
+@REM Loaded plugins:\r
+@REM    C:\Program Files\IAR Systems\Embedded Workbench 5.4 Kickstart\8051\bin\8051libsupport.dll\r
+@REM    C:\Program Files\IAR Systems\Embedded Workbench 5.4 Kickstart\common\plugins\CodeCoverage\CodeCoverage.dll\r
+@REM    C:\Program Files\IAR Systems\Embedded Workbench 5.4 Kickstart\common\plugins\Profiling\Profiling.dll\r
+@REM    C:\Program Files\IAR Systems\Embedded Workbench 5.4 Kickstart\common\plugins\stack\stack.dll\r
+@REM    C:\Program Files\IAR Systems\Embedded Workbench 5.4 Kickstart\common\plugins\SymList\SymList.dll\r
diff --git a/chronos-ti/Software Projects/RF Access Point/IAR/settings/cc1111_usb_dongle.dbgdt b/chronos-ti/Software Projects/RF Access Point/IAR/settings/cc1111_usb_dongle.dbgdt
new file mode 100755 (executable)
index 0000000..c27e0cb
--- /dev/null
@@ -0,0 +1,64 @@
+<?xml version="1.0" encoding="iso-8859-1"?>\r
+\r
+<Project>\r
+  <Desktop>\r
+    <Static>\r
+      <Debug-Log><PreferedWindows><Position>3</Position><ScreenPosX>0</ScreenPosX><ScreenPosY>0</ScreenPosY><Windows><Window><Factory>Find-in-Files</Factory></Window><Window><Factory>Watch</Factory></Window><Window><Factory>Breakpoints</Factory></Window><Window><Factory>Watch</Factory></Window><Window><Factory>Memory</Factory></Window><Window><Factory>Memory</Factory></Window><Window><Factory>Locals</Factory></Window><Window><Factory>Register</Factory></Window></Windows></PreferedWindows></Debug-Log>\r
+      <Build>\r
+        \r
+        \r
+        \r
+        \r
+      <ColumnWidth0>20</ColumnWidth0><ColumnWidth1>915</ColumnWidth1><ColumnWidth2>244</ColumnWidth2><ColumnWidth3>61</ColumnWidth3><PreferedWindows><Position>3</Position><ScreenPosX>0</ScreenPosX><ScreenPosY>0</ScreenPosY><Windows><Window><Factory>Debug-Log</Factory></Window><Window><Factory>Breakpoints</Factory></Window><Window><Factory>Watch</Factory></Window></Windows></PreferedWindows></Build>\r
+      <Workspace>\r
+        <ColumnWidths>\r
+          \r
+          \r
+          \r
+          \r
+        <Column0>136</Column0><Column1>27</Column1><Column2>27</Column2><Column3>27</Column3></ColumnWidths>\r
+      </Workspace>\r
+      <Disassembly>\r
+        \r
+        \r
+      <PreferedWindows><Position>2</Position><ScreenPosX>0</ScreenPosX><ScreenPosY>0</ScreenPosY><Windows/></PreferedWindows><MixedMode>1</MixedMode><CodeCovShow>0</CodeCovShow></Disassembly>\r
+      <Memory>\r
+        \r
+        \r
+      <PreferedWindows><Position>3</Position><ScreenPosX>0</ScreenPosX><ScreenPosY>0</ScreenPosY><Windows><Window><Factory>Debug-Log</Factory></Window><Window><Factory>Find-in-Files</Factory></Window><Window><Factory>Watch</Factory></Window><Window><Factory>Breakpoints</Factory></Window><Window><Factory>Watch</Factory></Window><Window><Factory>Memory</Factory></Window><Window><Factory>Locals</Factory></Window><Window><Factory>Register</Factory></Window></Windows></PreferedWindows><FindDirection>1</FindDirection><FindAsHex>0</FindAsHex></Memory>\r
+    <Watch><Format><struct_types/><watch_formats><Fmt><Key>{W}Watch-0:BRTX__ID_u32</Key><Value>3</Value></Fmt><Fmt><Key>{W}Watch-0:BRTX__SC_u8</Key><Value>4</Value></Fmt><Fmt><Key>{W}Watch-0:HeartRate_u8</Key><Value>3</Value></Fmt><Fmt><Key>{W}Watch-0:Offset_u16</Key><Value>4</Value></Fmt><Fmt><Key>{W}Watch-0:off</Key><ShowAs>4</ShowAs></Fmt><Fmt><Key>{W}Watch-0:rf_fifo_ptr</Key><Value>3</Value></Fmt><Fmt><Key>{W}Watch-0:rfif_reg</Key><Value>4</Value></Fmt><Fmt><Key>{W}Watch-1:BRTX__BasicPeriodTime_u16</Key><Value>4</Value></Fmt><Fmt><Key>{W}Watch-1:FirstPacketTime_u16</Key><Value>4</Value></Fmt><Fmt><Key>{W}Watch-1:HeartRate_u8</Key><Value>3</Value></Fmt><Fmt><Key>{W}Watch-1:stval</Key><Value>4</Value></Fmt><Fmt><Key>{W}Watch-1:stval1</Key><Value>4</Value></Fmt><Fmt><Key>{W}Watch-1:stval2</Key><Value>4</Value></Fmt><Fmt><Key>{W}Watch-1:sw_timer_cmp_en</Key><Value>3</Value></Fmt><Fmt><Key>{W}Watch-1:sw_timer_cmp_if</Key><Value>3</Value></Fmt><Fmt><Key>{W}Watch-1:t1_base_period_ptr</Key><Value>3</Value></Fmt><Fmt><Key>{W}Watch-1:temp</Key><Value>4</Value></Fmt><Fmt><Key>{W}Watch-2:FirstPacketTime_u16</Key><Value>4</Value></Fmt><Fmt><Key>{W}Watch-2:timediff</Key><Value>4</Value></Fmt><Fmt><Key>{W}Watch-3:BRTX__ID_u32</Key><Value>3</Value></Fmt><Fmt><Key>{W}Watch-3:simpliciti_flag</Key><Value>1</Value></Fmt><Fmt><Key>{W}Watch-3:test_addr</Key><Value>4</Value></Fmt><Fmt><Key>{W}Watch-3:test_byte</Key><Value>4</Value></Fmt><Fmt><Key>{W}Watch-3:test_result</Key><Value>4</Value></Fmt></watch_formats></Format><PreferedWindows><Position>3</Position><ScreenPosX>0</ScreenPosX><ScreenPosY>0</ScreenPosY><Windows><Window><Factory>Debug-Log</Factory></Window><Window><Factory>Find-in-Files</Factory></Window><Window><Factory>Watch</Factory></Window><Window><Factory>Breakpoints</Factory></Window><Window><Factory>Memory</Factory></Window><Window><Factory>Memory</Factory></Window><Window><Factory>Locals</Factory></Window><Window><Factory>Register</Factory></Window></Windows></PreferedWindows><Column0>149</Column0><Column1>280</Column1><Column2>100</Column2><Column3>100</Column3></Watch><QuickWatch><PreferedWindows><Position>2</Position><ScreenPosX>0</ScreenPosX><ScreenPosY>0</ScreenPosY><Windows/></PreferedWindows><Column0>100</Column0><Column1>100</Column1><Column2>100</Column2><Column3>100</Column3></QuickWatch><CallStack><PreferedWindows><Position>1</Position><ScreenPosX>0</ScreenPosX><ScreenPosY>0</ScreenPosY><Windows/></PreferedWindows><ViewArgs>1</ViewArgs></CallStack><STACK2><PreferedWindows><Position>1</Position><ScreenPosX>0</ScreenPosX><ScreenPosY>0</ScreenPosY><Windows/></PreferedWindows></STACK2><Register><PreferedWindows><Position>3</Position><ScreenPosX>0</ScreenPosX><ScreenPosY>0</ScreenPosY><Windows><Window><Factory>Debug-Log</Factory></Window><Window><Factory>Find-in-Files</Factory></Window><Window><Factory>Watch</Factory></Window><Window><Factory>Breakpoints</Factory></Window><Window><Factory>Watch</Factory></Window><Window><Factory>Memory</Factory></Window><Window><Factory>Memory</Factory></Window><Window><Factory>Locals</Factory></Window></Windows></PreferedWindows></Register><SymbolicMemory><PreferedWindows><Position>2</Position><ScreenPosX>0</ScreenPosX><ScreenPosY>0</ScreenPosY><Windows/></PreferedWindows><Location>88</Location><Data>88</Data><Variable>120</Variable><Value>60</Value><Type>75</Type></SymbolicMemory><Breakpoints><PreferedWindows><Position>3</Position><ScreenPosX>0</ScreenPosX><ScreenPosY>0</ScreenPosY><Windows><Window><Factory>Debug-Log</Factory></Window><Window><Factory>Find-in-Files</Factory></Window><Window><Factory>Watch</Factory></Window><Window><Factory>Watch</Factory></Window><Window><Factory>Memory</Factory></Window><Window><Factory>Memory</Factory></Window><Window><Factory>Locals</Factory></Window><Window><Factory>Register</Factory></Window></Windows></PreferedWindows></Breakpoints><Find-in-Files><PreferedWindows><Position>3</Position><ScreenPosX>0</ScreenPosX><ScreenPosY>0</ScreenPosY><Windows><Window><Factory>Debug-Log</Factory></Window><Window><Factory>Watch</Factory></Window><Window><Factory>Breakpoints</Factory></Window><Window><Factory>Watch</Factory></Window><Window><Factory>Memory</Factory></Window><Window><Factory>Memory</Factory></Window><Window><Factory>Locals</Factory></Window><Window><Factory>Register</Factory></Window></Windows></PreferedWindows><ColumnWidth0>440</ColumnWidth0><ColumnWidth1>62</ColumnWidth1><ColumnWidth2>754</ColumnWidth2></Find-in-Files><Locals><PreferedWindows><Position>3</Position><ScreenPosX>0</ScreenPosX><ScreenPosY>0</ScreenPosY><Windows><Window><Factory>Debug-Log</Factory></Window><Window><Factory>Find-in-Files</Factory></Window><Window><Factory>Watch</Factory></Window><Window><Factory>Breakpoints</Factory></Window><Window><Factory>Watch</Factory></Window><Window><Factory>Memory</Factory></Window><Window><Factory>Memory</Factory></Window><Window><Factory>Register</Factory></Window></Windows></PreferedWindows><Column0>100</Column0><Column1>151</Column1><Column2>100</Column2><Column3>100</Column3></Locals></Static>\r
+    <Windows>\r
+      \r
+      \r
+      \r
+      \r
+    <Wnd0>\r
+        <Tabs>\r
+          <Tab>\r
+            <Identity>TabID-1729-24911</Identity>\r
+            <TabName>Workspace</TabName>\r
+            <Factory>Workspace</Factory>\r
+            <Session>\r
+              \r
+            <NodeDict><ExpandedNode>cc1111_usb_dongle</ExpandedNode><ExpandedNode>cc1111_usb_dongle/Code</ExpandedNode><ExpandedNode>cc1111_usb_dongle/Lib</ExpandedNode><ExpandedNode>cc1111_usb_dongle/Output</ExpandedNode><ExpandedNode>cc1111_usb_dongle/SimpliciTI</ExpandedNode><ExpandedNode>cc1111_usb_dongle/Sync</ExpandedNode><ExpandedNode>cc1111_usb_dongle/USB</ExpandedNode></NodeDict></Session>\r
+          </Tab>\r
+        </Tabs>\r
+        \r
+      <SelectedTab>0</SelectedTab></Wnd0><Wnd2><Tabs><Tab><Identity>TabID-23814-2242</Identity><TabName>Disassembly</TabName><Factory>Disassembly</Factory><Session/></Tab><Tab><Identity>TabID-9365-112</Identity><TabName>Watch</TabName><Factory>Watch</Factory><Session><Expressions><Expression><Expression>test_result</Expression></Expression><Expression><Expression>rftest</Expression></Expression><Expression><Expression>TxBuffer</Expression></Expression><Expression><Expression>timeout_table</Expression></Expression></Expressions><TabId>3</TabId><Column0>149</Column0><Column1>280</Column1><Column2>100</Column2><Column3>100</Column3></Session></Tab><Tab><Identity>TabID-2046-249</Identity><TabName>Debug Log</TabName><Factory>Debug-Log</Factory><Session/></Tab><Tab><Identity>TabID-29587-347</Identity><TabName>Breakpoints</TabName><Factory>Breakpoints</Factory></Tab><Tab><Identity>TabID-5937-5089</Identity><TabName>Register</TabName><Factory>Register</Factory><Session><REG1>0</REG1><REG2>0</REG2><Group>20</Group><States>10</States><State0>CLKCON</State0><State1>PKTCTRL0</State1><State2>RFIF</State2><State3>RFIM</State3><State4>S1CON</State4><State5>T3CCTL0</State5><State6>T3CTL</State6><State7>T4CTL</State7><State8>TCON</State8><State9>TIMIF</State9></Session></Tab><Tab><Identity>TabID-19947-5850</Identity><TabName>Find in Files</TabName><Factory>Find-in-Files</Factory><Session/></Tab><Tab><Identity>TabID-17779-13451</Identity><TabName>Memory</TabName><Factory>Memory</Factory><Session><ZoneNumber>3</ZoneNumber><SelectionAnchor>30720</SelectionAnchor><SelectionEnd>30720</SelectionEnd><UnitsPerGroup>1</UnitsPerGroup><EndianMode>0</EndianMode><DataCovEnabled>0</DataCovEnabled><DataCovShown>0</DataCovShown><HScroll>0</HScroll><VScroll>1913</VScroll></Session></Tab><Tab><Identity>TabID-18852-8675</Identity><TabName>Locals</TabName><Factory>Locals</Factory><Session><Column0>100</Column0><Column1>151</Column1><Column2>100</Column2><Column3>100</Column3></Session></Tab></Tabs><SelectedTab>0</SelectedTab></Wnd2></Windows>\r
+    <Editor>\r
+      \r
+      \r
+      \r
+      \r
+    <Pane><Tab><Factory>TextEditor</Factory><Filename>C:\Dokumente und Einstellungen\anton\Eigene Dateien\Projekte\TI CC430 WDK\Software\RF Access Point 1_2\wbsl\ioCCxx10_bitdef.h</Filename><XPos>0</XPos><YPos>1241</YPos><SelStart>48199</SelStart><SelEnd>48199</SelEnd></Tab><Tab><Factory>TextEditor</Factory><Filename>C:\Dokumente und Einstellungen\anton\Eigene Dateien\Projekte\TI CC430 WDK\Software\RF Access Point 1_2\flash.c</Filename><XPos>0</XPos><YPos>100</YPos><SelStart>3154</SelStart><SelEnd>3154</SelEnd></Tab><Tab><Factory>TextEditor</Factory><Filename>C:\Dokumente und Einstellungen\anton\Eigene Dateien\Projekte\TI CC430 WDK\Software\RF Access Point 1_2\CC1111 - Access Point - ISM_EU - Full\List\ez430-chronos-AP-ISM_EU.map</Filename><XPos>0</XPos><YPos>6399</YPos><SelStart>363026</SelStart><SelEnd>363026</SelEnd></Tab><Tab><Factory>TextEditor</Factory><Filename>C:\Dokumente und Einstellungen\anton\Eigene Dateien\Projekte\TI CC430 WDK\Software\RF Access Point 1_2\CC1111 - Access Point - ISM_EU - Full\Exe\ez430-chronos-AP-ISM_EU.hex</Filename><XPos>0</XPos><YPos>1716</YPos><SelStart>0</SelStart><SelEnd>0</SelEnd></Tab><Tab><Factory>TextEditor</Factory><Filename>C:\Dokumente und Einstellungen\anton\Eigene Dateien\Projekte\TI CC430 WDK\Software\RF Access Point 1_2\bm-br1\bm.h</Filename><XPos>0</XPos><YPos>89</YPos><SelStart>4606</SelStart><SelEnd>4606</SelEnd></Tab><Tab><Factory>TextEditor</Factory><Filename>C:\Dokumente und Einstellungen\anton\Eigene Dateien\Projekte\TI CC430 WDK\Software\RF Access Point 1_2\bm-br1\project.h</Filename><XPos>0</XPos><YPos>70</YPos><SelStart>3688</SelStart><SelEnd>3688</SelEnd></Tab><Tab><Factory>TextEditor</Factory><Filename>C:\Dokumente und Einstellungen\anton\Eigene Dateien\Projekte\TI CC430 WDK\Software\RF Access Point 1_2\simpliciti\Components\bsp\boards\RFUSB\bsp_led_defs.h</Filename><XPos>0</XPos><YPos>46</YPos><SelStart>3504</SelStart><SelEnd>3504</SelEnd></Tab><Tab><Factory>TextEditor</Factory><Filename>C:\Dokumente und Einstellungen\anton\Eigene Dateien\Projekte\TI CC430 WDK\Software\RF Access Point 1_2\HAL\source\hal_board.h</Filename><XPos>0</XPos><YPos>55</YPos><SelStart>1834</SelStart><SelEnd>1834</SelEnd></Tab><Tab><Factory>TextEditor</Factory><Filename>C:\Dokumente und Einstellungen\anton\Eigene Dateien\Projekte\TI CC430 WDK\Software\RF Access Point 1_2\wbsl\wbsl.c</Filename><XPos>0</XPos><YPos>464</YPos><SelStart>18464</SelStart><SelEnd>18464</SelEnd></Tab><Tab><Factory>TextEditor</Factory><Filename>C:\Dokumente und Einstellungen\anton\Eigene Dateien\Projekte\TI CC430 WDK\Software\RF Access Point 1_2\BM_API.h</Filename><XPos>0</XPos><YPos>93</YPos><SelStart>4379</SelStart><SelEnd>4394</SelEnd></Tab><Tab><Factory>TextEditor</Factory><Filename>C:\Dokumente und Einstellungen\anton\Eigene Dateien\Projekte\TI CC430 WDK\Software\RF Access Point 1_2\usb\class_cdc\usb_uart.c</Filename><XPos>0</XPos><YPos>255</YPos><SelStart>6608</SelStart><SelEnd>6608</SelEnd></Tab><Tab><Factory>TextEditor</Factory><Filename>C:\Dokumente und Einstellungen\anton\Eigene Dateien\Projekte\TI CC430 WDK\Software\RF Access Point 1_2\wbsl\wbsl.h</Filename><XPos>0</XPos><YPos>125</YPos><SelStart>5485</SelStart><SelEnd>5507</SelEnd></Tab><Tab><Factory>TextEditor</Factory><Filename>C:\Dokumente und Einstellungen\anton\Eigene Dateien\Projekte\TI CC430 WDK\Software\RF Access Point 1_2\HAL\source\hal_int.c</Filename><XPos>0</XPos><YPos>25</YPos><SelStart>975</SelStart><SelEnd>986</SelEnd></Tab><Tab><Factory>TextEditor</Factory><Filename>C:\Dokumente und Einstellungen\anton\Eigene Dateien\Projekte\TI CC430 WDK\Software\RF Access Point 1_2\HAL\include\hal_int.h</Filename><XPos>0</XPos><YPos>32</YPos><SelStart>1428</SelStart><SelEnd>1428</SelEnd></Tab><Tab><Factory>TextEditor</Factory><Filename>C:\Dokumente und Einstellungen\anton\Eigene Dateien\Projekte\TI CC430 WDK\Software\RF Access Point 1_2\change_record.txt</Filename><XPos>0</XPos><YPos>0</YPos><SelStart>234</SelStart><SelEnd>234</SelEnd></Tab><Tab><Factory>TextEditor</Factory><Filename>C:\Dokumente und Einstellungen\anton\Eigene Dateien\Projekte\TI CC430 WDK\Software\RF Access Point 1_2\usb\library\ccxx11\usb_interrupt.c</Filename><XPos>0</XPos><YPos>66</YPos><SelStart>2386</SelStart><SelEnd>2386</SelEnd></Tab><Tab><Factory>TextEditor</Factory><Filename>C:\Dokumente und Einstellungen\anton\Eigene Dateien\Projekte\TI CC430 WDK\Software\RF Access Point 1_2\main.c</Filename><XPos>0</XPos><YPos>121</YPos><SelStart>4807</SelStart><SelEnd>4807</SelEnd></Tab><ActiveTab>16</ActiveTab></Pane><ActivePane>0</ActivePane><Sizes><Pane><X>1000000</X><Y>1000000</Y></Pane></Sizes><SplitMode>1</SplitMode></Editor>\r
+    <Positions>\r
+      \r
+      \r
+      \r
+      \r
+      \r
+    <Top><Row0><Sizes><Toolbar-012a9410><key>iaridepm.enu1</key></Toolbar-012a9410></Sizes></Row0><Row1><Sizes><Toolbar-047960d0><key>debuggergui.enu1</key></Toolbar-047960d0></Sizes></Row1></Top><Left><Row0><Sizes><Wnd0><Rect><Top>-2</Top><Left>-2</Left><Bottom>462</Bottom><Right>227</Right><x>-2</x><y>-2</y><xscreen>0</xscreen><yscreen>0</yscreen><sizeHorzCX>0</sizeHorzCX><sizeHorzCY>0</sizeHorzCY><sizeVertCX>178906</sizeVertCX><sizeVertCY>640884</sizeVertCY></Rect></Wnd0></Sizes></Row0></Left><Right><Row0><Sizes/></Row0></Right><Bottom><Row0><Sizes><Wnd2><Rect><Top>-2</Top><Left>-2</Left><Bottom>194</Bottom><Right>1282</Right><x>-2</x><y>-2</y><xscreen>1284</xscreen><yscreen>196</yscreen><sizeHorzCX>1003125</sizeHorzCX><sizeHorzCY>270718</sizeHorzCY><sizeVertCX>357031</sizeVertCX><sizeVertCY>908840</sizeVertCY></Rect></Wnd2></Sizes></Row0></Bottom><Float><Sizes/></Float></Positions>\r
+  </Desktop>\r
+</Project>\r
+\r
+\r
diff --git a/chronos-ti/Software Projects/RF Access Point/IAR/settings/cc1111_usb_dongle.dni b/chronos-ti/Software Projects/RF Access Point/IAR/settings/cc1111_usb_dongle.dni
new file mode 100755 (executable)
index 0000000..baef945
--- /dev/null
@@ -0,0 +1,58 @@
+[CodeCoverage]\r
+Enabled=_ 0\r
+[StackPlugin]\r
+Enabled=1\r
+OverflowWarningsEnabled=1\r
+WarningThreshold=90\r
+SpWarningsEnabled=1\r
+WarnHow=0\r
+UseTrigger=1\r
+TriggerName=main\r
+LimitSize=0\r
+ByteLimit=50\r
+[DisAssemblyWindow]\r
+NumStates=_ 1\r
+State 1=_ 1\r
+[Profiling]\r
+Enabled=0\r
+[BreakpointUsageDialog]\r
+Placement=_ 1702 373 2139 651\r
+[Interrupts]\r
+Enabled=1\r
+[MemoryMap]\r
+Enabled=0\r
+Base=0\r
+UseAuto=0\r
+TypeViolation=1\r
+UnspecRange=1\r
+ActionState=1\r
+[TraceHelper]\r
+Enabled=0\r
+ShowSource=1\r
+[TermIOLog]\r
+LoggingEnabled=_ 0\r
+LogFile=_ ""\r
+[DebugChecksum]\r
+Checksum=-1968684698\r
+[Log file]\r
+LoggingEnabled=_ 0\r
+LogFile=_ ""\r
+Category=_ 0\r
+[Breakpoints]\r
+Bp0=_ "STD_CODE" "{$PROJ_DIR$\rftest.c}.267.3@1" 0 0 0 0 "" 0 ""\r
+Bp1=_ "STD_CODE" "{$PROJ_DIR$\rftest.c}.160.3@1" 0 0 0 0 "" 0 ""\r
+Bp2=_ "STD_CODE" "{$PROJ_DIR$\rftest.c}.209.7@1" 0 0 0 0 "" 0 ""\r
+Bp3=_ "STD_CODE" "{$PROJ_DIR$\usb\class_cdc\usb_uart.c}.214.11@1" 0 0 0 0 "" 0 ""\r
+Bp4=_ "STD_CODE" "{$PROJ_DIR$\main.c}.379.31@1" 0 0 0 0 "" 0 ""\r
+Bp5=_ "STD_CODE" "{$PROJ_DIR$\main.c}.486.31@1" 0 0 0 0 "" 0 ""\r
+Bp6=_ "STD_CODE" "{$PROJ_DIR$\wbsl\wbsl.c}.579.7@1" 0 0 0 0 "" 0 ""\r
+Bp7=_ "STD_CODE" "{$PROJ_DIR$\wbsl\wbsl.c}.654.7@1" 0 0 0 0 "" 0 ""\r
+Bp8=_ "STD_CODE" "{$PROJ_DIR$\main.c}.573.37@1" 0 0 0 0 "" 0 ""\r
+Bp9=_ "STD_CODE" "{$PROJ_DIR$\wbsl\wbsl.c}.701.10@1" 0 0 0 0 "" 0 ""\r
+Count=10\r
+[ChipconEmu]\r
+Stop timers on halt=1\r
+Leave target running=1\r
+[Aliases]\r
+Count=0\r
+SuppressDialog=0\r
diff --git a/chronos-ti/Software Projects/RF Access Point/IAR/settings/cc1111_usb_dongle.wsdt b/chronos-ti/Software Projects/RF Access Point/IAR/settings/cc1111_usb_dongle.wsdt
new file mode 100755 (executable)
index 0000000..062b085
--- /dev/null
@@ -0,0 +1,56 @@
+<?xml version="1.0" encoding="iso-8859-1"?>\r
+\r
+<Workspace>\r
+  <ConfigDictionary>\r
+    \r
+  <CurrentConfigs><Project>cc1111_usb_dongle/868MHz - Limited IAR Kickstart (Europe)</Project></CurrentConfigs></ConfigDictionary>\r
+  <Desktop>\r
+    <Static>\r
+      <Workspace>\r
+        <ColumnWidths>\r
+          \r
+          \r
+          \r
+          \r
+        <Column0>343</Column0><Column1>12</Column1><Column2>27</Column2><Column3>1242140</Column3></ColumnWidths>\r
+      </Workspace>\r
+      <Build>\r
+        \r
+        \r
+        \r
+        \r
+      <PreferedWindows><Position>3</Position><ScreenPosX>0</ScreenPosX><ScreenPosY>0</ScreenPosY><Windows><Window><Factory>Find-in-Files</Factory></Window></Windows></PreferedWindows><ColumnWidth0>20</ColumnWidth0><ColumnWidth1>915</ColumnWidth1><ColumnWidth2>240</ColumnWidth2><ColumnWidth3>61</ColumnWidth3></Build>\r
+    <Debug-Log><PreferedWindows><Position>3</Position><ScreenPosX>0</ScreenPosX><ScreenPosY>0</ScreenPosY><Windows/></PreferedWindows><ColumnWidth0>19</ColumnWidth0><ColumnWidth1>264</ColumnWidth1></Debug-Log><TerminalIO/><Find-in-Files><PreferedWindows><Position>3</Position><ScreenPosX>0</ScreenPosX><ScreenPosY>0</ScreenPosY><Windows><Window><Factory>Build</Factory></Window></Windows></PreferedWindows><ColumnWidth0>440</ColumnWidth0><ColumnWidth1>62</ColumnWidth1><ColumnWidth2>754</ColumnWidth2></Find-in-Files></Static>\r
+    <Windows>\r
+      \r
+      \r
+    <Wnd1>\r
+        <Tabs>\r
+          <Tab>\r
+            <Identity>TabID-26546-27884</Identity>\r
+            <TabName>Workspace</TabName>\r
+            <Factory>Workspace</Factory>\r
+            <Session>\r
+              \r
+            <NodeDict><ExpandedNode>cc1111_usb_dongle</ExpandedNode><ExpandedNode>cc1111_usb_dongle/Output</ExpandedNode><ExpandedNode>cc1111_usb_dongle/USB</ExpandedNode><ExpandedNode>cc1111_usb_dongle/USB/class_cdc</ExpandedNode><ExpandedNode>cc1111_usb_dongle/USB/library</ExpandedNode></NodeDict></Session>\r
+          </Tab>\r
+        </Tabs>\r
+        \r
+      <SelectedTab>0</SelectedTab></Wnd1><Wnd2><Tabs><Tab><Identity>TabID-17759-11906</Identity><TabName>Build</TabName><Factory>Build</Factory><Session/></Tab><Tab><Identity>TabID-9414-11171</Identity><TabName>Find in Files</TabName><Factory>Find-in-Files</Factory><Session/></Tab></Tabs><SelectedTab>1</SelectedTab></Wnd2><Wnd5><Tabs><Tab><Identity>TabID-31469-3508</Identity><TabName>Debug Log</TabName><Factory>Debug-Log</Factory><Session/></Tab></Tabs><SelectedTab>0</SelectedTab></Wnd5></Windows>\r
+    <Editor>\r
+      \r
+      \r
+      \r
+      \r
+    <Pane><Tab><Factory>TextEditor</Factory><Filename>$WS_DIR$\usb\class_cdc\usb_firmware_library_config.c</Filename><XPos>0</XPos><YPos>6</YPos><SelStart>930</SelStart><SelEnd>930</SelEnd></Tab><Tab><Factory>TextEditor</Factory><Filename>$WS_DIR$\usb\library\usb_descriptor.h</Filename><XPos>0</XPos><YPos>130</YPos><SelStart>6198</SelStart><SelEnd>6205</SelEnd></Tab><Tab><Factory>TextEditor</Factory><Filename>$WS_DIR$\usb\library\usb_suspend.h</Filename><XPos>0</XPos><YPos>82</YPos><SelStart>5164</SelStart><SelEnd>5164</SelEnd></Tab><Tab><Factory>TextEditor</Factory><Filename>$WS_DIR$\usb\library\usb_framework.h</Filename><XPos>0</XPos><YPos>193</YPos><SelStart>10021</SelStart><SelEnd>10021</SelEnd></Tab><Tab><Factory>TextEditor</Factory><Filename>$WS_DIR$\868MHz - Limited IAR Kickstart (Europe)\List\usb_framework.lst</Filename><XPos>0</XPos><YPos>139</YPos><SelStart>11783</SelStart><SelEnd>11783</SelEnd></Tab><Tab><Factory>TextEditor</Factory><Filename>$WS_DIR$\868MHz - Limited IAR Kickstart (Europe)\List\usb_cdc_hooks.lst</Filename><XPos>0</XPos><YPos>207</YPos><SelStart>15031</SelStart><SelEnd>15031</SelEnd></Tab><ActiveTab>5</ActiveTab></Pane><ActivePane>0</ActivePane><Sizes><Pane><X>1000000</X><Y>1000000</Y></Pane></Sizes><SplitMode>1</SplitMode></Editor>\r
+    <Positions>\r
+      \r
+      \r
+      \r
+      \r
+      \r
+    <Top><Row0><Sizes><Toolbar-00aba6a0><key>iaridepm.enu1</key></Toolbar-00aba6a0></Sizes></Row0></Top><Left><Row0><Sizes><Wnd1><Rect><Top>-2</Top><Left>-2</Left><Bottom>489</Bottom><Right>418</Right><x>-2</x><y>-2</y><xscreen>-840785</xscreen><yscreen>-330817</yscreen><sizeHorzCX>-656863280</sizeHorzCX><sizeHorzCY>-345320458</sizeHorzCY><sizeVertCX>328125</sizeVertCX><sizeVertCY>512526</sizeVertCY></Rect></Wnd1></Sizes></Row0></Left><Right><Row0><Sizes/></Row0></Right><Bottom><Row0><Sizes><Wnd2><Rect><Top>-2</Top><Left>-2</Left><Bottom>227</Bottom><Right>1282</Right><x>-2</x><y>-2</y><xscreen>1284</xscreen><yscreen>229</yscreen><sizeHorzCX>1003125</sizeHorzCX><sizeHorzCY>239040</sizeHorzCY><sizeVertCX>96094</sizeVertCX><sizeVertCY>101253</sizeVertCY></Rect></Wnd2></Sizes></Row0><Row1><Sizes><Wnd5><Rect><Top>225</Top><Left>-2</Left><Bottom>425</Bottom><Right>1282</Right><x>-2</x><y>225</y><xscreen>1284</xscreen><yscreen>200</yscreen><sizeHorzCX>1003125</sizeHorzCX><sizeHorzCY>208768</sizeHorzCY><sizeVertCX>156250</sizeVertCX><sizeVertCY>208768</sizeVertCY></Rect></Wnd5></Sizes></Row1></Bottom><Float><Sizes/></Float></Positions>\r
+  </Desktop>\r
+</Workspace>\r
+\r
+\r
diff --git a/chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/Applications/app_remap_led.h b/chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/Applications/app_remap_led.h
new file mode 100755 (executable)
index 0000000..2e3e25b
--- /dev/null
@@ -0,0 +1,13 @@
+#ifdef BSP_BOARD_EXP461x\r
+\r
+  #undef BSP_TURN_ON_LED2\r
+  #undef BSP_TURN_OFF_LED2\r
+  #undef BSP_TOGGLE_LED2\r
+  #undef BSP_LED2_IS_ON\r
+\r
+  #define BSP_TURN_ON_LED2()      BSP_TURN_ON_LED3()\r
+  #define BSP_TURN_OFF_LED2()     BSP_TURN_OFF_LED3()\r
+  #define BSP_TOGGLE_LED2()       BSP_TOGGLE_LED3()\r
+  #define BSP_LED2_IS_ON()        BSP_LED3_IS_ON()\r
+\r
+#endif\r
diff --git a/chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/Applications/main_AP_BM.c b/chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/Applications/main_AP_BM.c
new file mode 100755 (executable)
index 0000000..398c51a
--- /dev/null
@@ -0,0 +1,247 @@
+/**********************************************************************************************\r
+  Copyright 2004-2007 Texas Instruments Incorporated. All rights reserved.\r
+\r
+  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+  the terms of a software license agreement between the user who downloaded the software,\r
+  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+  License. The License limits your use, and you acknowledge, that the Software may not be\r
+  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+  perform, display or sell this Software and/or its documentation for any purpose.\r
+\r
+  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+\r
+  Should you have any questions regarding your right to use this Software,\r
+  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+\r
+// *************************************************************************************************\r
+// Include section\r
+#include <string.h>\r
+#include "bsp.h"\r
+#include "mrfi.h"\r
+#include "bsp_leds.h"\r
+#include "bsp_buttons.h"\r
+#include "nwk_types.h"\r
+#include "nwk_api.h"\r
+#include "nwk_frame.h"\r
+#include "nwk.h"\r
+#include "app_remap_led.h"\r
+#include "simpliciti.h"\r
+\r
+\r
+// *************************************************************************************************\r
+// Defines section\r
+#define BIT0                   (0x0001)\r
+#define BIT1                   (0x0002)\r
+#define BIT2                   (0x0004)\r
+#define BIT3                   (0x0008)\r
+#define BIT4                   (0x0010)\r
+#define BIT5                   (0x0020)\r
+#define BIT6                   (0x0040)\r
+#define BIT7                   (0x0080)\r
+#define BIT8                   (0x0100)\r
+#define BIT9                   (0x0200)\r
+#define BITA                   (0x0400)\r
+#define BITB                   (0x0800)\r
+#define BITC                   (0x1000)\r
+#define BITD                   (0x2000)\r
+#define BITE                   (0x4000)\r
+#define BITF                   (0x8000)\r
+\r
+// *************************************************************************************************\r
+// Prototypes section\r
+\r
+/* callback handler */\r
+uint8_t sCB(linkID_t);\r
+\r
+\r
+// *************************************************************************************************\r
+// Extern section\r
+extern uint8_t sInit_done;\r
+\r
+\r
+// *************************************************************************************************\r
+// Global Variable section\r
+\r
+/* reserve space for the maximum possible peer Link IDs */\r
+static linkID_t linkID0;\r
+static uint8_t  sNumCurrentPeers;\r
+\r
+/* work loop semaphores */\r
+static volatile uint8_t sPeerFrameSem;\r
+static volatile uint8_t sJoinSem;\r
+\r
+volatile unsigned char simpliciti_flag;\r
+unsigned char simpliciti_data[SIMPLICITI_MAX_PAYLOAD_LENGTH];\r
+unsigned char ed_data[SIMPLICITI_MAX_PAYLOAD_LENGTH];\r
+\r
+// AP main routine\r
+void simpliciti_main(void)\r
+{\r
+  bspIState_t intState;\r
+  uint8_t j;\r
+  uint8_t len;\r
+  uint32_t led_toggle = 0;\r
+  uint8_t   pwr;\r
+\r
+  // Init variables  \r
+  simpliciti_flag = SIMPLICITI_STATUS_LINKING;\r
+\r
+  // Init SimpliciTI\r
+  SMPL_Init(sCB);\r
+  \r
+  // Set output power to +1.1dBm (868MHz) / +1.3dBm (915MHz)\r
+  pwr = IOCTL_LEVEL_2;\r
+  SMPL_Ioctl(IOCTL_OBJ_RADIO, IOCTL_ACT_RADIO_SETPWR, &pwr);\r
+  \r
+   // LED off\r
+  BSP_TURN_OFF_LED1();\r
+    \r
+  /* main work loop */\r
+  while (1)\r
+  {\r
+    // Wait for the Join semaphore to be set by the receipt of a Join frame from a\r
+    //device that supports an End Device.\r
+    if (sJoinSem && !sNumCurrentPeers)\r
+    {\r
+      /* listen for a new connection */\r
+      while (1)\r
+      {\r
+        if (SMPL_SUCCESS == SMPL_LinkListen(&linkID0))\r
+        {\r
+          // We have a connection\r
+          simpliciti_flag = SIMPLICITI_STATUS_LINKED;\r
+          BSP_TURN_ON_LED1();\r
+          break;\r
+        }\r
+        /* Implement fail-to-link policy here. otherwise, listen again. */\r
+      }\r
+\r
+      sNumCurrentPeers++;\r
+\r
+      BSP_ENTER_CRITICAL_SECTION(intState);\r
+      sJoinSem--;\r
+      BSP_EXIT_CRITICAL_SECTION(intState);\r
+    }\r
+\r
+    /* Have we received a frame on one of the ED connections?\r
+     * No critical section -- it doesn't really matter much if we miss a poll\r
+     */\r
+    if (sPeerFrameSem)\r
+    {\r
+      // Continuously try to receive end device packets\r
+      if (SMPL_SUCCESS == SMPL_Receive(linkID0, ed_data, &len))\r
+      {\r
+        // Acceleration / ppt data packets are 4 byte long\r
+        if (len == 4)\r
+        {\r
+          BSP_TOGGLE_LED1();\r
+          memcpy(simpliciti_data, ed_data, 4);\r
+          setFlag(simpliciti_flag, SIMPLICITI_TRIGGER_RECEIVED_DATA);\r
+        }        \r
+        // Sync packets are either R2R (2 byte) or data (19 byte) long\r
+        else if ((len == 2) || (len == 19))\r
+        {\r
+          // Indicate received packet\r
+          BSP_TOGGLE_LED1();\r
+\r
+          // Decode end device packet\r
+          switch (ed_data[0])\r
+          {\r
+              case SYNC_ED_TYPE_R2R: \r
+                                    // Send reply\r
+                                    if (getFlag(simpliciti_flag, SIMPLICITI_TRIGGER_SEND_CMD))\r
+                                    {\r
+                                      // Clear flag\r
+                                      clearFlag(simpliciti_flag, SIMPLICITI_TRIGGER_SEND_CMD);\r
+                                      // Command data was set by USB buffer previously\r
+                                      len = BM_SYNC_DATA_LENGTH;\r
+                                    }\r
+                                    else // No command currently available\r
+                                    {\r
+                                      simpliciti_data[0] = SYNC_AP_CMD_NOP;\r
+                                      simpliciti_data[1] = 0x55;\r
+                                      len = 2;\r
+                                    }\r
+                \r
+                                    // Send reply packet to end device\r
+                                    SMPL_Send(linkID0, simpliciti_data, len);\r
+                                    break;\r
+                                 \r
+            case SYNC_ED_TYPE_MEMORY: \r
+            case SYNC_ED_TYPE_STATUS:\r
+                                    // If buffer is empty, copy received end device data to intermediate buffer\r
+                                    if (!simpliciti_sync_buffer_status)\r
+                                    {\r
+                                      for (j=0; j<BM_SYNC_DATA_LENGTH; j++) simpliciti_data[j] = ed_data[j];\r
+                                      simpliciti_sync_buffer_status = 1;\r
+                                    }\r
+                                    // Set buffer status to full\r
+                                    break;\r
+\r
+          }\r
+        }\r
+      }\r
+    }\r
+    \r
+    // Exit function if SIMPLICITI_TRIGGER_STOP flag bit is set in USB driver    \r
+    if (getFlag(simpliciti_flag, SIMPLICITI_TRIGGER_STOP)) \r
+    {\r
+      // Immediately turn off RF interrupt\r
+      IEN2 &= ~BIT0;\r
+      RFIM = 0;\r
+      RFIF = 0;\r
+      // Clean up after SimpliciTI and enable restarting the stack\r
+      linkID0 = 0;\r
+      sNumCurrentPeers = 0;\r
+      sJoinSem = 0;\r
+      sPeerFrameSem = 0;\r
+      sInit_done = 0;\r
+      // LED off\r
+      BSP_TURN_OFF_LED1();\r
+      return;\r
+    }\r
+    \r
+    // Blink slowly to indicate that access point is on\r
+    if (!sNumCurrentPeers)\r
+    {\r
+      if (led_toggle++>150000)\r
+      {\r
+        BSP_TOGGLE_LED1();\r
+        led_toggle = 0;\r
+      }\r
+    }\r
+  }\r
+}\r
+\r
+\r
+\r
+/* Runs in ISR context. Reading the frame should be done in the */\r
+/* application thread not in the ISR thread. */\r
+uint8_t sCB(linkID_t lid)\r
+{\r
+  if (lid)\r
+  {\r
+    sPeerFrameSem++;\r
+  }\r
+  else\r
+  {\r
+    sJoinSem++;\r
+  }\r
+\r
+  /* leave frame to be read by application. */\r
+  return 0;\r
+}\r
diff --git a/chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/CC1111 - Access Point - 433MHz.r51 b/chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/CC1111 - Access Point - 433MHz.r51
new file mode 100755 (executable)
index 0000000..c92a493
Binary files /dev/null and b/chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/CC1111 - Access Point - 433MHz.r51 differ
diff --git a/chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/CC1111 - Access Point - 868MHz.r51 b/chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/CC1111 - Access Point - 868MHz.r51
new file mode 100755 (executable)
index 0000000..832c904
Binary files /dev/null and b/chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/CC1111 - Access Point - 868MHz.r51 differ
diff --git a/chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/CC1111 - Access Point - 915MHz.r51 b/chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/CC1111 - Access Point - 915MHz.r51
new file mode 100755 (executable)
index 0000000..931646b
Binary files /dev/null and b/chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/CC1111 - Access Point - 915MHz.r51 differ
diff --git a/chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/Components/bsp/boards/RFUSB/bsp_board.c b/chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/Components/bsp/boards/RFUSB/bsp_board.c
new file mode 100755 (executable)
index 0000000..3562133
--- /dev/null
@@ -0,0 +1,122 @@
+/**************************************************************************************************\r
+  Revised:        $Date: 2009-03-10 15:21:32 -0700 (Tue, 10 Mar 2009) $\r
+  Revision:       $Revision: 19366 $\r
+\r
+  Copyright 2007 Texas Instruments Incorporated.  All rights reserved.\r
+\r
+  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+  the terms of a software license agreement between the user who downloaded the software,\r
+  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+  License. The License limits your use, and you acknowledge, that the Software may not be\r
+  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+  perform, display or sell this Software and/or its documentation for any purpose.\r
+\r
+  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+\r
+  Should you have any questions regarding your right to use this Software,\r
+  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+/* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+ *   BSP (Board Support Package)\r
+ *   Target : Texas Instruments CC2430DB\r
+ *   Top-level board code file.\r
+ * =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+ */\r
+/* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+ *   BSP (Board Support Package)\r
+ *   Target : Texas Instruments CC2430DB\r
+ *   Top-level board code file.\r
+ * =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+ */\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                            Local Variables\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#if defined(SW_TIMER)\r
+static uint8_t sIterationsPerUsec = 0;\r
+#endif\r
+\r
+/**************************************************************************************************\r
+ * @fn          BSP_InitBoard\r
+ *\r
+ * @brief       Initialize the board.\r
+ *\r
+ * @param       none\r
+ *\r
+ * @return      none\r
+ **************************************************************************************************\r
+ */\r
+void BSP_InitBoard(void)\r
+{\r
+#if defined(SW_TIMER)\r
+#define MHZ_CLOCKS_PER_USEC      BSP_CLOCK_MHZ\r
+#define MHZ_CLOCKS_PER_ITERATION 35\r
+\r
+  sIterationsPerUsec = (uint8_t)(((MHZ_CLOCKS_PER_USEC)/(MHZ_CLOCKS_PER_ITERATION))+.5);\r
+\r
+  if (!sIterationsPerUsec) \r
+  {\r
+    sIterationsPerUsec = 1;\r
+  }\r
+#endif   /* SW_TIMER */\r
+}\r
+/**************************************************************************************************\r
+ * @fn          BSP_Delay\r
+ *\r
+ * @brief       Sleep for the requested amount of time.\r
+ *\r
+ * @param       # of microseconds to sleep.\r
+ *\r
+ * @return      none\r
+ **************************************************************************************************\r
+ */\r
+void BSP_Delay(uint16_t usec)\r
+#if !defined(SW_TIMER)\r
+{\r
+  uint8_t tickCount;\r
+\r
+  tickCount = (usec * BSP_TIMER_CLK_MHZ); /* Calculate the tick count. */\r
+\r
+  T3CTL &= ~(BV(4));                      /* Stop the timer. */\r
+  TIMIF &= ~(BV(0));                      /* Clear the interrupt flag. */\r
+  T3CTL |= BV(2);                         /* Reset the count value. */\r
+  T3CC0  = tickCount;                     /* Set the compare value. */\r
+  T3CTL  = (T3CTL & (~(0x03))) | 0x02;    /* Set modulo mode. */\r
+  T3CTL |= BV(4);                         /* Start the timer. */\r
+  while( !(TIMIF & BV(0)) );              /* Wait till interrupt flag is set. i.e. count is reached. */\r
+  T3CTL &= ~(BV(4));                      /* Stop the timer. */\r
+  TIMIF &= ~(BV(0));                      /* Clear the interrupt flag. */\r
+\r
+  return;\r
+}\r
+\r
+#else  /* !SW_TIMER */\r
+\r
+{\r
+  /* Declared 'volatile' in case User optimizes for speed. This will\r
+   * prevent the optimizer from eliminating the loop completely. But\r
+   * it also generates more code...\r
+   */\r
+  volatile uint16_t repeatCount = sIterationsPerUsec*usec;\r
+\r
+  while (repeatCount--) ;\r
+\r
+  return;\r
+}\r
+\r
+#endif  /* !SW_TIMER */\r
diff --git a/chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/Components/bsp/boards/RFUSB/bsp_board_defs.h b/chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/Components/bsp/boards/RFUSB/bsp_board_defs.h
new file mode 100755 (executable)
index 0000000..27e4664
--- /dev/null
@@ -0,0 +1,86 @@
+/**************************************************************************************************\r
+  Revised:        $Date: 2007-07-06 11:19:00 -0700 (Fri, 06 Jul 2007) $\r
+  Revision:       $Revision: 13579 $\r
+\r
+  Copyright 2007 Texas Instruments Incorporated.  All rights reserved.\r
+\r
+  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+  the terms of a software license agreement between the user who downloaded the software,\r
+  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+  License. The License limits your use, and you acknowledge, that the Software may not be\r
+  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+  perform, display or sell this Software and/or its documentation for any purpose.\r
+\r
+  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+\r
+  Should you have any questions regarding your right to use this Software,\r
+  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+/* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+ *   BSP (Board Support Package)\r
+ *   Target : CC1111DK_Dongle/CC2511DK_Dongle\r
+ *            "RF USB Dongle"\r
+ *   Board definition file.\r
+ * =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+ */\r
+\r
+#ifndef BSP_BOARD_DEFS_H\r
+#define BSP_BOARD_DEFS_H\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                     Board Unique Define\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#define BSP_BOARD_RFUSB\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                           Mcu\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#include "mcus/bsp_8051_defs.h"\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                          Clock\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+/* RFUSB Boards with CC2511/CC1111 have 48 MHz crystals. Fxosc = 48 MHz\r
+ * The reference frequency is half the oscillator freq. So Fref = 24 MHz.\r
+ * The CLKCON default setting sets the system clock to half of reference clock.\r
+ * Thus we have the system clock = 24/2 = 12 MHz.\r
+ */\r
+#define __bsp_CLOCK_MHZ__         12  /* MHz */\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                     Board Initialization\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#define BSP_INIT_BOARD()          BSP_InitBoard()\r
+#define BSP_BOARD_C               "bsp_board.c"\r
+\r
+#define BSP_TIMER_CLK_MHZ   (BSP_CLOCK_MHZ)            /* Timer is clocked at same freq */\r
+#define BSP_DELAY_MAX_USEC  (0xFF/BSP_TIMER_CLK_MHZ)   /* 8-bit Timer-3 */\r
+\r
+#define BSP_DELAY_USECS(x)    BSP_Delay(x)\r
+void BSP_Delay(uint16_t);\r
+void BSP_InitBoard(void);\r
+\r
+/**************************************************************************************************\r
+ */\r
+#endif\r
diff --git a/chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/Components/bsp/boards/RFUSB/bsp_button_defs.h b/chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/Components/bsp/boards/RFUSB/bsp_button_defs.h
new file mode 100755 (executable)
index 0000000..fd50aef
--- /dev/null
@@ -0,0 +1,86 @@
+/**************************************************************************************************\r
+  Revised:        $Date: 2007-07-06 11:19:00 -0700 (Fri, 06 Jul 2007) $\r
+  Revision:       $Revision: 13579 $\r
+\r
+  Copyright 2007 Texas Instruments Incorporated.  All rights reserved.\r
+\r
+  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+  the terms of a software license agreement between the user who downloaded the software,\r
+  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+  License. The License limits your use, and you acknowledge, that the Software may not be\r
+  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+  perform, display or sell this Software and/or its documentation for any purpose.\r
+\r
+  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+\r
+  Should you have any questions regarding your right to use this Software,\r
+  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+/* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+ *   BSP (Board Support Package)\r
+ *   Target : CC1111DK_Dongle/CC2511DK_Dongle\r
+ *            "RF USB Dongle"\r
+ *   Button definition file.\r
+ * =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+ */\r
+\r
+#ifndef BSP_BUTTON_DEFS_H\r
+#define BSP_BUTTON_DEFS_H\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                           Includes\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#include "bsp_board_defs.h"\r
+#include "bsp_macros.h"\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                      Button Configuration\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#define __bsp_NUM_BUTTONS__                   1\r
+#define __bsp_BUTTON_DEBOUNCE_WAIT__(expr)    st( int i; for(i=0; i<500; i++) { if (!(expr)) i = 0; } )\r
+\r
+\r
+/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+ *                 BUTTON #1\r
+ * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+ *   Schematic   :  S1\r
+ *   Description :  Push Button\r
+ *   Polarity    :  Active Low\r
+ *   GPIO        :  P1.2\r
+ * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+ */\r
+#define __bsp_BUTTON1_BIT__             2\r
+#define __bsp_BUTTON1_PORT__            P1\r
+#define __bsp_BUTTON1_IS_ACTIVE_LOW__   1\r
+\r
+/* note : by default P1.2 has an internal pull-up resistor enabled */\r
+\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                Include Generic Button Macros\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#include "code/bsp_generic_buttons.h"\r
+\r
+\r
+/**************************************************************************************************\r
+ */\r
+#endif\r
diff --git a/chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/Components/bsp/boards/RFUSB/bsp_driver_defs.h b/chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/Components/bsp/boards/RFUSB/bsp_driver_defs.h
new file mode 100755 (executable)
index 0000000..d3c58c9
--- /dev/null
@@ -0,0 +1,55 @@
+/**************************************************************************************************\r
+  Revised:        $Date: 2007-07-06 11:19:00 -0700 (Fri, 06 Jul 2007) $\r
+  Revision:       $Revision: 13579 $\r
+\r
+  Copyright 2007 Texas Instruments Incorporated.  All rights reserved.\r
+\r
+  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+  the terms of a software license agreement between the user who downloaded the software,\r
+  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+  License. The License limits your use, and you acknowledge, that the Software may not be\r
+  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+  perform, display or sell this Software and/or its documentation for any purpose.\r
+\r
+  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+\r
+  Should you have any questions regarding your right to use this Software,\r
+  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+/* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+ *   BSP (Board Support Package)\r
+ *   Target : CC1111DK_Dongle/CC2511DK_Dongle\r
+ *            "RF USB Dongle"\r
+ *   Driver definition file.\r
+ * =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+ */\r
+\r
+#ifndef BSP_DRIVER_DEFS_H\r
+#define BSP_DRIVER_DEFS_H\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                     Driver Initialization\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#define BSP_DRIVERS_C               "bsp_drivers.c"\r
+#define BSP_INIT_DRIVERS()          BSP_InitDrivers()\r
+void BSP_InitDrivers(void);\r
+\r
+\r
+/**************************************************************************************************\r
+ */\r
+#endif\r
diff --git a/chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/Components/bsp/boards/RFUSB/bsp_drivers.c b/chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/Components/bsp/boards/RFUSB/bsp_drivers.c
new file mode 100755 (executable)
index 0000000..d513d5c
--- /dev/null
@@ -0,0 +1,88 @@
+/**************************************************************************************************\r
+  Revised:        $Date: 2007-07-06 11:19:00 -0700 (Fri, 06 Jul 2007) $\r
+  Revision:       $Revision: 13579 $\r
+\r
+  Copyright 2007 Texas Instruments Incorporated.  All rights reserved.\r
+\r
+  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+  the terms of a software license agreement between the user who downloaded the software,\r
+  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+  License. The License limits your use, and you acknowledge, that the Software may not be\r
+  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+  perform, display or sell this Software and/or its documentation for any purpose.\r
+\r
+  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+\r
+  Should you have any questions regarding your right to use this Software,\r
+  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+/* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+ *   BSP (Board Support Package)\r
+ *   Target : CC1111DK_Dongle/CC2511DK_Dongle\r
+ *            "RF USB Dongle"\r
+ *   Top-level driver file.\r
+ * =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+ */\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                            Includes\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#include "bsp_driver_defs.h"\r
+#include "bsp_leds.h"\r
+#include "bsp_buttons.h"\r
+\r
+\r
+/**************************************************************************************************\r
+ * @fn          BSP_InitDrivers\r
+ *\r
+ * @brief       Initialize all enabled BSP drivers.\r
+ *\r
+ * @param       none\r
+ *\r
+ * @return      none\r
+ **************************************************************************************************\r
+ */\r
+void BSP_InitDrivers(void)\r
+{\r
+#if (!defined BSP_NO_LEDS)\r
+  BSP_InitLeds();\r
+#endif\r
+\r
+#if (!defined BSP_NO_BUTTONS)\r
+  BSP_InitButtons();\r
+#endif\r
+}\r
+\r
+\r
+/* ================================================================================================\r
+ *                                        C Code Includes\r
+ * ================================================================================================\r
+ */\r
+#ifndef BSP_NO_LEDS\r
+#include "drivers/code/bsp_leds.c"\r
+#endif\r
+\r
+#ifndef BSP_NO_BUTTONS\r
+#include "drivers/code/bsp_buttons.c"\r
+#endif\r
+\r
+\r
+/**************************************************************************************************\r
+*/\r
+\r
+\r
+\r
diff --git a/chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/Components/bsp/boards/RFUSB/bsp_external/mrfi_board_defs.h b/chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/Components/bsp/boards/RFUSB/bsp_external/mrfi_board_defs.h
new file mode 100755 (executable)
index 0000000..88080e5
--- /dev/null
@@ -0,0 +1,75 @@
+/**************************************************************************************************\r
+  Revised:        $Date: 2007-07-06 11:19:00 -0700 (Fri, 06 Jul 2007) $\r
+  Revision:       $Revision: 13579 $\r
+\r
+  Copyright 2007 Texas Instruments Incorporated.  All rights reserved.\r
+\r
+  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+  the terms of a software license agreement between the user who downloaded the software,\r
+  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+  License. The License limits your use, and you acknowledge, that the Software may not be\r
+  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+  perform, display or sell this Software and/or its documentation for any purpose.\r
+\r
+  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+\r
+  Should you have any questions regarding your right to use this Software,\r
+  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+/* ~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=\r
+ *   MRFI (Minimal RF Interface)\r
+ *   Board definition file.\r
+ *   Target : CC1111DK_Dongle/CC2511DK_Dongle\r
+ *            "RF USB Dongle"\r
+ *   Radios : CC2511, CC1111\r
+ * ~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=\r
+ */\r
+\r
+#ifndef MRFI_BOARD_DEFS_H\r
+#define MRFI_BOARD_DEFS_H\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                           Includes\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#include "bsp.h"\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                        Radio Selection\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#if (!defined MRFI_CC2511) && (!defined MRFI_CC1111)\r
+#error "ERROR: A compatible radio must be specified for the RF USB Dongle board."\r
+#endif\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                           Defines\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+\r
+/**************************************************************************************************\r
+ *                                  Compile Time Integrity Checks\r
+ **************************************************************************************************\r
+ */\r
+#ifndef BSP_BOARD_RFUSB\r
+#error "ERROR: Mismatch between specified board and MRFI configuration."\r
+#endif\r
+\r
+\r
+/**************************************************************************************************\r
+ */\r
+#endif\r
diff --git a/chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/Components/bsp/boards/RFUSB/bsp_led_defs.h b/chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/Components/bsp/boards/RFUSB/bsp_led_defs.h
new file mode 100755 (executable)
index 0000000..370d0a3
--- /dev/null
@@ -0,0 +1,88 @@
+/**************************************************************************************************\r
+  Revised:        $Date: 2007-07-06 11:19:00 -0700 (Fri, 06 Jul 2007) $\r
+  Revision:       $Revision: 13579 $\r
+\r
+  Copyright 2007 Texas Instruments Incorporated.  All rights reserved.\r
+\r
+  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+  the terms of a software license agreement between the user who downloaded the software,\r
+  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+  License. The License limits your use, and you acknowledge, that the Software may not be\r
+  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+  perform, display or sell this Software and/or its documentation for any purpose.\r
+\r
+  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+\r
+  Should you have any questions regarding your right to use this Software,\r
+  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+/* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+ *   BSP (Board Support Package)\r
+ *   Target : CC1111DK_Dongle/CC2511DK_Dongle\r
+ *            "RF USB Dongle"\r
+ *   LED definition file.\r
+ * =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+ */\r
+\r
+#ifndef BSP_LED_DEFS_H\r
+#define BSP_LED_DEFS_H\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                           Includes\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#include "bsp_board_defs.h"\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                      Configuration\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#define __bsp_NUM_LEDS__               1\r
+#define __bsp_LED_BLINK_LOOP_COUNT__   0x34000\r
+\r
+\r
+/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+ *                 LED #1\r
+ * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+ *   Schematic :  D2\r
+ *   Color     :  Green\r
+ *   Polarity  :  Active High\r
+ *   GPIO      :  P1.1\r
+ * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+ */\r
+// [BM] Need to switch USB pull-up line and LED output on BM-USBD1 vs. CC1111EM board\r
+#ifdef CC1111EM\r
+  #define __bsp_LED1_BIT__            1\r
+#else\r
+  #define __bsp_LED1_BIT__            0\r
+#endif\r
+#define __bsp_LED1_PORT__           P1\r
+#define __bsp_LED1_DDR__            P1DIR\r
+#define __bsp_LED1_IS_ACTIVE_LOW__  0\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                 Include Generic LED Macros\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#include "code/bsp_generic_leds.h"\r
+\r
+\r
+/**************************************************************************************************\r
+ */\r
+#endif\r
diff --git a/chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/Components/bsp/bsp.c b/chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/Components/bsp/bsp.c
new file mode 100755 (executable)
index 0000000..cee0b33
--- /dev/null
@@ -0,0 +1,101 @@
+/**************************************************************************************************\r
+  Revised:        $Date: 2007-07-06 11:19:00 -0700 (Fri, 06 Jul 2007) $\r
+  Revision:       $Revision: 13579 $\r
+\r
+  Copyright 2007 Texas Instruments Incorporated.  All rights reserved.\r
+\r
+  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+  the terms of a software license agreement between the user who downloaded the software,\r
+  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+  License. The License limits your use, and you acknowledge, that the Software may not be\r
+  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+  perform, display or sell this Software and/or its documentation for any purpose.\r
+\r
+  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+\r
+  Should you have any questions regarding your right to use this Software,\r
+  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+/* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+ *   BSP (Board Support Package)\r
+ *   Top-level BSP code file.\r
+ * =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+ */\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                            Includes\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#include "bsp.h"\r
+#include "bsp_driver_defs.h"\r
+\r
+\r
+/**************************************************************************************************\r
+ * @fn          BSP_Init\r
+ *\r
+ * @brief       Initialize the board and drivers.\r
+ *\r
+ * @param       none\r
+ *\r
+ * @return      none\r
+ **************************************************************************************************\r
+ */\r
+void BSP_Init(void)\r
+{\r
+  BSP_INIT_BOARD();\r
+  BSP_INIT_DRIVERS();\r
+\r
+  /*-------------------------------------------------------------\r
+   *  Run time integrity checks.  Perform only if asserts\r
+   *  are enabled.\r
+   */\r
+#ifdef BSP_ASSERTS_ARE_ON\r
+  /* verify endianess is correctly specified */\r
+  {\r
+    uint16_t test = 0x00AA; /* first storage byte of 'test' is non-zero for little endian */\r
+    BSP_ASSERT(!(*((uint8_t *)&test)) == !BSP_LITTLE_ENDIAN); /* endianess mismatch */\r
+  }\r
+#endif\r
+}\r
+\r
+\r
+/* ================================================================================================\r
+ *                                        C Code Includes\r
+ * ================================================================================================\r
+ */\r
+#ifdef BSP_BOARD_C\r
+#include BSP_BOARD_C\r
+#endif\r
+\r
+#ifdef BSP_DRIVERS_C\r
+#include BSP_DRIVERS_C\r
+#endif\r
+\r
+\r
+/* ************************************************************************************************\r
+ *                                   Compile Time Integrity Checks\r
+ * ************************************************************************************************\r
+ */\r
+BSP_STATIC_ASSERT( sizeof(  uint8_t ) == 1 );\r
+BSP_STATIC_ASSERT( sizeof(   int8_t ) == 1 );\r
+BSP_STATIC_ASSERT( sizeof( uint16_t ) == 2 );\r
+BSP_STATIC_ASSERT( sizeof(  int16_t ) == 2 );\r
+BSP_STATIC_ASSERT( sizeof( uint32_t ) == 4 );\r
+BSP_STATIC_ASSERT( sizeof(  int32_t ) == 4 );\r
+\r
+\r
+/**************************************************************************************************\r
+ */\r
diff --git a/chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/Components/bsp/bsp.h b/chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/Components/bsp/bsp.h
new file mode 100755 (executable)
index 0000000..8cff5a0
--- /dev/null
@@ -0,0 +1,183 @@
+/**************************************************************************************************\r
+  Revised:        $Date: 2007-07-06 11:19:00 -0700 (Fri, 06 Jul 2007) $\r
+  Revision:       $Revision: 13579 $\r
+\r
+  Copyright 2007 Texas Instruments Incorporated.  All rights reserved.\r
+\r
+  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+  the terms of a software license agreement between the user who downloaded the software,\r
+  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+  License. The License limits your use, and you acknowledge, that the Software may not be\r
+  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+  perform, display or sell this Software and/or its documentation for any purpose.\r
+\r
+  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+\r
+  Should you have any questions regarding your right to use this Software,\r
+  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+/* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+ *   BSP (Board Support Package)\r
+ *   Include file for core BSP services.\r
+ * =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+ */\r
+\r
+#ifndef BSP_H\r
+#define BSP_H\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                           Includes\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#include "bsp_board_defs.h"\r
+#include "bsp_macros.h"\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                          BSP Defines\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#define BSP\r
+#define BSP_VER       100  /* BSP version 1.00a */\r
+#define BSP_SUBVER    a\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                            Clock\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#define BSP_CLOCK_MHZ   __bsp_CLOCK_MHZ__\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                            Memory\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#ifndef __bsp_LITTLE_ENDIAN__\r
+#error ERROR: Endianess not defined\r
+#endif\r
+\r
+#define BSP_LITTLE_ENDIAN   __bsp_LITTLE_ENDIAN__\r
+\r
+#define CODE    __bsp_CODE_MEMSPACE__\r
+#define XDATA   __bsp_XDATA_MEMSPACE__\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                            Interrupts\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#define BSP_ISR_FUNCTION(func,vect)     __bsp_ISR_FUNCTION__(func,vect)\r
+\r
+#define BSP_ENABLE_INTERRUPTS()         __bsp_ENABLE_INTERRUPTS__()\r
+#define BSP_DISABLE_INTERRUPTS()        __bsp_DISABLE_INTERRUPTS__()\r
+#define BSP_INTERRUPTS_ARE_ENABLED()    __bsp_INTERRUPTS_ARE_ENABLED__()\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                         Critical Sections\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+typedef __bsp_ISTATE_T__  bspIState_t;\r
+\r
+#define BSP_ENTER_CRITICAL_SECTION(x)   st( x = __bsp_GET_ISTATE__(); __bsp_DISABLE_INTERRUPTS__(); )\r
+#define BSP_EXIT_CRITICAL_SECTION(x)    __bsp_RESTORE_ISTATE__(x)\r
+#define BSP_CRITICAL_STATEMENT(x)       st( bspIState_t s;                    \\r
+                                            BSP_ENTER_CRITICAL_SECTION(s);    \\r
+                                            x;                                \\r
+                                            BSP_EXIT_CRITICAL_SECTION(s); )\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                           Asserts\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+\r
+/*\r
+ *  BSP_ASSERT( expression ) - The given expression must evaluate as "true" or else the assert\r
+ *  handler is called.  From here, the call stack feature of the debugger can pinpoint where\r
+ * the problem occurred.\r
+ *\r
+ *  BSP_FORCE_ASSERT() - If asserts are in use, immediately calls the assert handler.\r
+ *\r
+ *  BSP_ASSERTS_ARE_ON - can use #ifdef to see if asserts are enabled\r
+ *\r
+ *  Asserts can be disabled for optimum performance and minimum code size (ideal for\r
+ *  finalized, debugged production code).\r
+ */\r
+\r
+#if (!defined BSP_NO_DEBUG)\r
+#ifndef BSP_ASSERT_HANDLER\r
+#define BSP_ASSERT_HANDLER()      st( __bsp_DISABLE_INTERRUPTS__();  while(1); )\r
+#endif\r
+#define BSP_ASSERT(expr)          st( if (!(expr)) BSP_ASSERT_HANDLER(); )\r
+#define BSP_FORCE_ASSERT()        BSP_ASSERT_HANDLER()\r
+#define BSP_ASSERTS_ARE_ON\r
+#else\r
+#define BSP_ASSERT(expr)          /* empty */\r
+#define BSP_FORCE_ASSERT()        /* empty */\r
+#endif\r
+\r
+/* static assert */\r
+#define BSP_STATIC_ASSERT(expr)   void bspDummyPrototype( char dummy[1/((expr)!=0)] )\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                           Prototypes\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+void BSP_Init(void);\r
+/**************************************************************************************************\r
+ */\r
+\r
+/****************************************************************************************\r
+ *                                 BEGIN ENDIAN SUPPORT\r
+ *\r
+ * Security encrypt/decrypt operates on unsigned long quantities. These must match on\r
+ * source and destination platforms. These macros enforce the standard conversions.\r
+ * Currently all platforms (CC2520/CC2x30 and MSP430) are little endian.\r
+ *\r
+ *******************   Network order for encryption is LITTLE ENDIAN   ******************\r
+ *\r
+ ****************************************************************************************/\r
+\r
+#if (BSP_LITTLE_ENDIAN != 0)\r
+#define   ntohs(x)    (x)\r
+#define   htons(x)    (x)\r
+\r
+#define   ntohl(x)    (x)\r
+#define   htonl(x)    (x)\r
+\r
+#else\r
+\r
+#define   ntohs(x)    (((x>>8) & 0xFF) | ((x & 0xFF)<<8))\r
+#define   htons(x)    (((x>>8) & 0xFF) | ((x & 0xFF)<<8))\r
+\r
+#define   ntohl(x)    ( ((x>>24) & 0xFF) | ((x>>8) & 0xFF00) | \\r
+                        ((x & 0xFF00)<<8) | ((x & 0xFF)<<24)   \\r
+                      )\r
+#define   htonl(x)    ( ((x>>24) & 0xFF) | ((x>>8) & 0xFF00) | \\r
+                        ((x & 0xFF00)<<8) | ((x & 0xFF)<<24)   \\r
+                      )\r
+\r
+#endif  /* (BSP_LITTLE_ENDIAN != 0) */\r
+\r
+/***************************************************************************************\r
+ *                                 END ENDIAN SUPPORT\r
+ ***************************************************************************************/\r
+\r
+\r
+\r
+#endif\r
diff --git a/chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/Components/bsp/bsp_macros.h b/chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/Components/bsp/bsp_macros.h
new file mode 100755 (executable)
index 0000000..ee99a19
--- /dev/null
@@ -0,0 +1,79 @@
+/**************************************************************************************************\r
+  Revised:        $Date: 2007-07-06 11:19:00 -0700 (Fri, 06 Jul 2007) $\r
+  Revision:       $Revision: 13579 $\r
+\r
+  Copyright 2007 Texas Instruments Incorporated.  All rights reserved.\r
+\r
+  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+  the terms of a software license agreement between the user who downloaded the software,\r
+  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+  License. The License limits your use, and you acknowledge, that the Software may not be\r
+  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+  perform, display or sell this Software and/or its documentation for any purpose.\r
+\r
+  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+\r
+  Should you have any questions regarding your right to use this Software,\r
+  contact Texas Instruments Incorporated at www.TI.com. \r
+**************************************************************************************************/\r
+\r
+/* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+ *   BSP (Board Support Package)\r
+ *   Include file for BSP utility macros.\r
+ * =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+ */\r
+\r
+#ifndef BSP_MACROS_H\r
+#define BSP_MACROS_H\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                          Macros\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+/* bit value */\r
+#ifndef BV\r
+#define BV(n)      (1 << (n))\r
+#endif\r
+\r
+/*\r
+ *  This macro is for use by other macros to form a fully valid C statement.\r
+ *  Without this, the if/else conditionals could show unexpected behavior.\r
+ *\r
+ *  For example, use...\r
+ *    #define SET_REGS()  st( ioreg1 = 0; ioreg2 = 0; )\r
+ *  instead of ...\r
+ *    #define SET_REGS()  { ioreg1 = 0; ioreg2 = 0; }\r
+ *  or\r
+ *    #define  SET_REGS()    ioreg1 = 0; ioreg2 = 0;\r
+ *  The last macro would not behave as expected in the if/else construct.\r
+ *  The second to last macro will cause a compiler error in certain uses\r
+ *  of if/else construct\r
+ *\r
+ *  It is not necessary, or recommended, to use this macro where there is\r
+ *  already a valid C statement.  For example, the following is redundant...\r
+ *    #define CALL_FUNC()   st(  func();  )\r
+ *  This should simply be...\r
+ *    #define CALL_FUNC()   func()\r
+ *\r
+ * (The while condition below evaluates false without generating a\r
+ *  constant-controlling-loop type of warning on most compilers.)\r
+ */\r
+#define st(x)      do { x } while (__LINE__ == -1)\r
+\r
+\r
+/**************************************************************************************************\r
+ */\r
+#endif\r
diff --git a/chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/Components/bsp/drivers/bsp_buttons.h b/chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/Components/bsp/drivers/bsp_buttons.h
new file mode 100755 (executable)
index 0000000..b73d615
--- /dev/null
@@ -0,0 +1,90 @@
+/**************************************************************************************************\r
+  Revised:        $Date: 2007-07-06 11:19:00 -0700 (Fri, 06 Jul 2007) $\r
+  Revision:       $Revision: 13579 $\r
+\r
+  Copyright 2007 Texas Instruments Incorporated. All rights reserved.\r
+\r
+  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+  the terms of a software license agreement between the user who downloaded the software,\r
+  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+  License. The License limits your use, and you acknowledge, that the Software may not be\r
+  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+  perform, display or sell this Software and/or its documentation for any purpose.\r
+\r
+  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+\r
+  Should you have any questions regarding your right to use this Software,\r
+  contact Texas Instruments Incorporated at www.TI.com. \r
+**************************************************************************************************/\r
+\r
+/* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+ *   BSP (Board Support Package)\r
+ *   Button driver include file.\r
+ * =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+ */\r
+\r
+#ifndef BSP_BUTTONS_H\r
+#define BSP_BUTTONS_H\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                           Includes\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#include "bsp_button_defs.h"\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                           Defines\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#define BSP_NUM_BUTTONS                   __bsp_NUM_BUTTONS__\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                            Macros\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#define BSP_BUTTON_DEBOUNCE_WAIT(expr)    __bsp_BUTTON_DEBOUNCE_WAIT__(expr)    \r
+\r
+#define BSP_BUTTON1()   __bsp_BUTTON1__()\r
+#define BSP_BUTTON2()   __bsp_BUTTON2__()\r
+#define BSP_BUTTON3()   __bsp_BUTTON3__()\r
+#define BSP_BUTTON4()   __bsp_BUTTON4__()\r
+#define BSP_BUTTON5()   __bsp_BUTTON5__()\r
+#define BSP_BUTTON6()   __bsp_BUTTON6__()\r
+#define BSP_BUTTON7()   __bsp_BUTTON7__()\r
+#define BSP_BUTTON8()   __bsp_BUTTON8__()\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                        Prototypes\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+void BSP_InitButtons(void);\r
+\r
+\r
+/* ************************************************************************************************\r
+ *                                   Compile Time Integrity Checks\r
+ * ************************************************************************************************\r
+ */\r
+#ifdef BSP_NO_BUTTONS\r
+#error "ERROR: The button driver is disabled.  This file should not be included."\r
+#endif\r
+\r
+\r
+/**************************************************************************************************\r
+ */\r
+#endif\r
diff --git a/chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/Components/bsp/drivers/bsp_leds.h b/chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/Components/bsp/drivers/bsp_leds.h
new file mode 100755 (executable)
index 0000000..b01338b
--- /dev/null
@@ -0,0 +1,133 @@
+/**************************************************************************************************\r
+  Revised:        $Date: 2007-07-06 11:19:00 -0700 (Fri, 06 Jul 2007) $\r
+  Revision:       $Revision: 13579 $\r
+\r
+  Copyright 2007 Texas Instruments Incorporated.  All rights reserved.\r
+\r
+  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+  the terms of a software license agreement between the user who downloaded the software,\r
+  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+  License. The License limits your use, and you acknowledge, that the Software may not be\r
+  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+  perform, display or sell this Software and/or its documentation for any purpose.\r
+\r
+  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+\r
+  Should you have any questions regarding your right to use this Software,\r
+  contact Texas Instruments Incorporated at www.TI.com. \r
+**************************************************************************************************/\r
+\r
+/* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+ *   BSP (Board Support Package)\r
+ *   LED driver include file.\r
+ * =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+ */\r
+\r
+#ifndef BSP_LEDS_H\r
+#define BSP_LEDS_H\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                           Includes\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#include "bsp_led_defs.h"\r
+#include "bsp_macros.h"\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                             Defines\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#define BSP_NUM_LEDS            __bsp_NUM_LEDS__\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                              Macros\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+\r
+/* blink delay loop */\r
+#define BSP_LED_BLINK_DELAY()   st( { volatile uint32_t i; \\r
+                                      for (i=0; i<__bsp_LED_BLINK_LOOP_COUNT__; i++) { }; } )\r
+\r
+/* LED1 */\r
+#define BSP_TURN_ON_LED1()      __bsp_LED1_TURN_ON__()\r
+#define BSP_TURN_OFF_LED1()     __bsp_LED1_TURN_OFF__()\r
+#define BSP_TOGGLE_LED1()       __bsp_LED1_TOGGLE__()\r
+#define BSP_LED1_IS_ON()        __bsp_LED1_IS_ON__()\r
+\r
+/* LED2 */\r
+#define BSP_TURN_ON_LED2()      __bsp_LED2_TURN_ON__()\r
+#define BSP_TURN_OFF_LED2()     __bsp_LED2_TURN_OFF__()\r
+#define BSP_TOGGLE_LED2()       __bsp_LED2_TOGGLE__()\r
+#define BSP_LED2_IS_ON()        __bsp_LED2_IS_ON__()\r
+\r
+/* LED3 */\r
+#define BSP_TURN_ON_LED3()      __bsp_LED3_TURN_ON__()\r
+#define BSP_TURN_OFF_LED3()     __bsp_LED3_TURN_OFF__()\r
+#define BSP_TOGGLE_LED3()       __bsp_LED3_TOGGLE__()\r
+#define BSP_LED3_IS_ON()        __bsp_LED3_IS_ON__()\r
+\r
+/* LED4 */\r
+#define BSP_TURN_ON_LED4()      __bsp_LED4_TURN_ON__()\r
+#define BSP_TURN_OFF_LED4()     __bsp_LED4_TURN_OFF__()\r
+#define BSP_TOGGLE_LED4()       __bsp_LED4_TOGGLE__()\r
+#define BSP_LED4_IS_ON()        __bsp_LED4_IS_ON__()\r
+\r
+/* LED5 */\r
+#define BSP_TURN_ON_LED5()      __bsp_LED5_TURN_ON__()\r
+#define BSP_TURN_OFF_LED5()     __bsp_LED5_TURN_OFF__()\r
+#define BSP_TOGGLE_LED5()       __bsp_LED5_TOGGLE__()\r
+#define BSP_LED5_IS_ON()        __bsp_LED5_IS_ON__()\r
+\r
+/* LED6 */\r
+#define BSP_TURN_ON_LED6()      __bsp_LED6_TURN_ON__()\r
+#define BSP_TURN_OFF_LED6()     __bsp_LED6_TURN_OFF__()\r
+#define BSP_TOGGLE_LED6()       __bsp_LED6_TOGGLE__()\r
+#define BSP_LED6_IS_ON()        __bsp_LED6_IS_ON__()\r
+\r
+/* LED7 */\r
+#define BSP_TURN_ON_LED7()      __bsp_LED7_TURN_ON__()\r
+#define BSP_TURN_OFF_LED7()     __bsp_LED7_TURN_OFF__()\r
+#define BSP_TOGGLE_LED7()       __bsp_LED7_TOGGLE__()\r
+#define BSP_LED7_IS_ON()        __bsp_LED7_IS_ON__()\r
+\r
+/* LED8 */\r
+#define BSP_TURN_ON_LED8()      __bsp_LED8_TURN_ON__()\r
+#define BSP_TURN_OFF_LED8()     __bsp_LED8_TURN_OFF__()\r
+#define BSP_TOGGLE_LED8()       __bsp_LED8_TOGGLE__()\r
+#define BSP_LED8_IS_ON()        __bsp_LED8_IS_ON__()\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                        Prototypes\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+void BSP_InitLeds(void);\r
+\r
+\r
+\r
+/* ************************************************************************************************\r
+ *                                   Compile Time Integrity Checks\r
+ * ************************************************************************************************\r
+ */\r
+#ifdef BSP_NO_LEDS\r
+#error "ERROR: The LED driver is disabled.  This file should not be included."\r
+#endif\r
+\r
+/**************************************************************************************************\r
+ */\r
+#endif\r
diff --git a/chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/Components/bsp/drivers/code/bsp_buttons.c b/chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/Components/bsp/drivers/code/bsp_buttons.c
new file mode 100755 (executable)
index 0000000..b8f2018
--- /dev/null
@@ -0,0 +1,97 @@
+/**************************************************************************************************\r
+  Revised:        $Date: 2007-07-06 11:19:00 -0700 (Fri, 06 Jul 2007) $\r
+  Revision:       $Revision: 13579 $\r
+\r
+  Copyright 2007 Texas Instruments Incorporated.  All rights reserved.\r
+\r
+  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+  the terms of a software license agreement between the user who downloaded the software,\r
+  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+  License. The License limits your use, and you acknowledge, that the Software may not be\r
+  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+  perform, display or sell this Software and/or its documentation for any purpose.\r
+\r
+  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+\r
+  Should you have any questions regarding your right to use this Software,\r
+  contact Texas Instruments Incorporated at www.TI.com. \r
+**************************************************************************************************/\r
+\r
+/* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+ *   BSP (Board Support Package)\r
+ *   Generic button driver code file.\r
+ * =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+ */\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                            Includes\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#include "bsp_buttons.h"\r
+#include "bsp_button_defs.h"\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                             Macros\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#define BSP_CONFIG_BUTTON1()    __bsp_BUTTON1_CONFIG__()\r
+#define BSP_CONFIG_BUTTON2()    __bsp_BUTTON2_CONFIG__()\r
+#define BSP_CONFIG_BUTTON3()    __bsp_BUTTON3_CONFIG__()\r
+#define BSP_CONFIG_BUTTON4()    __bsp_BUTTON4_CONFIG__()\r
+#define BSP_CONFIG_BUTTON5()    __bsp_BUTTON5_CONFIG__()\r
+#define BSP_CONFIG_BUTTON6()    __bsp_BUTTON6_CONFIG__()\r
+#define BSP_CONFIG_BUTTON7()    __bsp_BUTTON7_CONFIG__()\r
+#define BSP_CONFIG_BUTTON8()    __bsp_BUTTON8_CONFIG__()\r
+\r
+#ifdef __bsp_BUTTON_EXTENDED_CONFIG__\r
+#define BSP_BUTTON_EXTENDED_CONFIG()  __bsp_BUTTON_EXTENDED_CONFIG__()\r
+#else\r
+#define BSP_BUTTON_EXTENDED_CONFIG()\r
+#endif\r
+\r
+\r
+/**************************************************************************************************\r
+ * @fn          BSP_InitButtons\r
+ *\r
+ * @brief       Initialize button hardware and driver code.\r
+ *\r
+ * @param       none\r
+ *\r
+ * @return      none\r
+ **************************************************************************************************\r
+ */\r
+void BSP_InitButtons(void)\r
+{\r
+  /* configure LEDs */\r
+  BSP_CONFIG_BUTTON1();\r
+  BSP_CONFIG_BUTTON2();\r
+  BSP_CONFIG_BUTTON3();\r
+  BSP_CONFIG_BUTTON4();\r
+  BSP_CONFIG_BUTTON5();\r
+  BSP_CONFIG_BUTTON6();\r
+  BSP_CONFIG_BUTTON7();\r
+  BSP_CONFIG_BUTTON8();\r
+\r
+  /* peform extended configuration if needed */\r
+  BSP_BUTTON_EXTENDED_CONFIG();\r
+}\r
+\r
+\r
+/**************************************************************************************************\r
+*/\r
+\r
+   \r
+   \r
diff --git a/chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/Components/bsp/drivers/code/bsp_generic_buttons.h b/chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/Components/bsp/drivers/code/bsp_generic_buttons.h
new file mode 100755 (executable)
index 0000000..e9ae165
--- /dev/null
@@ -0,0 +1,203 @@
+/**************************************************************************************************\r
+  Revised:        $Date: 2007-07-06 11:19:00 -0700 (Fri, 06 Jul 2007) $\r
+  Revision:       $Revision: 13579 $\r
+\r
+  Copyright 2007 Texas Instruments Incorporated.  All rights reserved.\r
+\r
+  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+  the terms of a software license agreement between the user who downloaded the software,\r
+  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+  License. The License limits your use, and you acknowledge, that the Software may not be\r
+  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+  perform, display or sell this Software and/or its documentation for any purpose.\r
+\r
+  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+\r
+  Should you have any questions regarding your right to use this Software,\r
+  contact Texas Instruments Incorporated at www.TI.com. \r
+**************************************************************************************************/\r
+\r
+/* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+ *   BSP (Board Support Package)\r
+ *   Generic button macro include file.\r
+ * =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+ */\r
+\r
+#ifndef BSP_GENERIC_BUTTONS_H\r
+#define BSP_GENERIC_BUTTONS_H\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                           Includes\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#include "bsp_board_defs.h"\r
+#include "bsp_macros.h"\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                            Macros\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#define __bsp_BUTTON__(port,bit,low)    ((low) ? (!((port) & BV(bit))) : ((port) & BV(bit)) )\r
+\r
+\r
+/* ------------------------- populate BUTTON #1 macros ------------------------- */\r
+#define __bsp_NUM_BUTTON1_DEFINES__  ((defined __bsp_BUTTON1_PORT__)  + \\r
+                                      (defined __bsp_BUTTON1_BIT__)   + \\r
+                                      (defined __bsp_BUTTON1_IS_ACTIVE_LOW__))\r
+#if (__bsp_NUM_BUTTON1_DEFINES__ == 3)\r
+#define __bsp_BUTTON1__()           __bsp_BUTTON__( __bsp_BUTTON1_PORT__, __bsp_BUTTON1_BIT__, __bsp_BUTTON1_IS_ACTIVE_LOW__ )\r
+#define __bsp_BUTTON1_CONFIG__()    /* nothing required */\r
+#elif (__bsp_NUM_BUTTON1_DEFINES__ == 0)\r
+#define __bsp_BUTTON1__()           /* no button */   0\r
+#define __bsp_BUTTON1_CONFIG__()    /* no button */\r
+#else\r
+#error "ERROR: Incomplete number of macros for BUTTON1."\r
+#endif\r
+\r
+/* ------------------------- populate BUTTON #2 macros ------------------------- */\r
+#define __bsp_NUM_BUTTON2_DEFINES__  ((defined __bsp_BUTTON2_PORT__)  + \\r
+                                      (defined __bsp_BUTTON2_BIT__)   + \\r
+                                      (defined __bsp_BUTTON2_IS_ACTIVE_LOW__))\r
+#if (__bsp_NUM_BUTTON2_DEFINES__ == 3)\r
+#define __bsp_BUTTON2__()           __bsp_BUTTON__( __bsp_BUTTON2_PORT__, __bsp_BUTTON2_BIT__, __bsp_BUTTON2_IS_ACTIVE_LOW__ )\r
+#define __bsp_BUTTON2_CONFIG__()    /* nothing required */\r
+#elif (__bsp_NUM_BUTTON2_DEFINES__ == 0)\r
+#define __bsp_BUTTON2__()           /* no button */   0\r
+#define __bsp_BUTTON2_CONFIG__()    /* no button */\r
+#else\r
+#error "ERROR: Incomplete number of macros for BUTTON2."\r
+#endif\r
+\r
+/* ------------------------- populate BUTTON #3 macros ------------------------- */\r
+#define __bsp_NUM_BUTTON3_DEFINES__  ((defined __bsp_BUTTON3_PORT__)  + \\r
+                                      (defined __bsp_BUTTON3_BIT__)   + \\r
+                                      (defined __bsp_BUTTON3_IS_ACTIVE_LOW__))\r
+#if (__bsp_NUM_BUTTON3_DEFINES__ == 3)\r
+#define __bsp_BUTTON3__()           __bsp_BUTTON__( __bsp_BUTTON3_PORT__, __bsp_BUTTON3_BIT__, __bsp_BUTTON3_IS_ACTIVE_LOW__ )\r
+#define __bsp_BUTTON3_CONFIG__()    /* nothing required */\r
+#elif (__bsp_NUM_BUTTON3_DEFINES__ == 0)\r
+#define __bsp_BUTTON3__()           /* no button */   0\r
+#define __bsp_BUTTON3_CONFIG__()    /* no button */\r
+#else\r
+#error "ERROR: Incomplete number of macros for BUTTON3."\r
+#endif\r
+\r
+/* ------------------------- populate BUTTON #4 macros ------------------------- */\r
+#define __bsp_NUM_BUTTON4_DEFINES__  ((defined __bsp_BUTTON4_PORT__)  + \\r
+                                      (defined __bsp_BUTTON4_BIT__)   + \\r
+                                      (defined __bsp_BUTTON4_IS_ACTIVE_LOW__))\r
+#if (__bsp_NUM_BUTTON4_DEFINES__ == 3)\r
+#define __bsp_BUTTON4__()           __bsp_BUTTON__( __bsp_BUTTON4_PORT__, __bsp_BUTTON4_BIT__, __bsp_BUTTON4_IS_ACTIVE_LOW__ )\r
+#define __bsp_BUTTON4_CONFIG__()    /* nothing required */\r
+#elif (__bsp_NUM_BUTTON4_DEFINES__ == 0)\r
+#define __bsp_BUTTON4__()           /* no button */   0\r
+#define __bsp_BUTTON4_CONFIG__()    /* no button */\r
+#else\r
+#error "ERROR: Incomplete number of macros for BUTTON4."\r
+#endif\r
+\r
+/* ------------------------- populate BUTTON #5 macros ------------------------- */\r
+#define __bsp_NUM_BUTTON5_DEFINES__  ((defined __bsp_BUTTON5_PORT__)  + \\r
+                                      (defined __bsp_BUTTON5_BIT__)   + \\r
+                                      (defined __bsp_BUTTON5_IS_ACTIVE_LOW__))\r
+#if (__bsp_NUM_BUTTON5_DEFINES__ == 3)\r
+#define __bsp_BUTTON5__()           __bsp_BUTTON__( __bsp_BUTTON5_PORT__, __bsp_BUTTON5_BIT__, __bsp_BUTTON5_IS_ACTIVE_LOW__ )\r
+#define __bsp_BUTTON5_CONFIG__()    /* nothing required */\r
+#elif (__bsp_NUM_BUTTON5_DEFINES__ == 0)\r
+#define __bsp_BUTTON5__()           /* no button */   0\r
+#define __bsp_BUTTON5_CONFIG__()    /* no button */\r
+#else\r
+#error "ERROR: Incomplete number of macros for BUTTON5."\r
+#endif\r
+\r
+/* ------------------------- populate BUTTON #6 macros ------------------------- */\r
+#define __bsp_NUM_BUTTON6_DEFINES__  ((defined __bsp_BUTTON6_PORT__)  + \\r
+                                      (defined __bsp_BUTTON6_BIT__)   + \\r
+                                      (defined __bsp_BUTTON6_IS_ACTIVE_LOW__))\r
+#if (__bsp_NUM_BUTTON6_DEFINES__ == 3)\r
+#define __bsp_BUTTON6__()           __bsp_BUTTON__( __bsp_BUTTON6_PORT__, __bsp_BUTTON6_BIT__, __bsp_BUTTON6_IS_ACTIVE_LOW__ )\r
+#define __bsp_BUTTON6_CONFIG__()    /* nothing required */\r
+#elif (__bsp_NUM_BUTTON6_DEFINES__ == 0)\r
+#define __bsp_BUTTON6__()           /* no button */   0\r
+#define __bsp_BUTTON6_CONFIG__()    /* no button */\r
+#else\r
+#error "ERROR: Incomplete number of macros for BUTTON6."\r
+#endif\r
+\r
+/* ------------------------- populate BUTTON #7 macros ------------------------- */\r
+#define __bsp_NUM_BUTTON7_DEFINES__  ((defined __bsp_BUTTON7_PORT__)  + \\r
+                                      (defined __bsp_BUTTON7_BIT__)   + \\r
+                                      (defined __bsp_BUTTON7_IS_ACTIVE_LOW__))\r
+#if (__bsp_NUM_BUTTON7_DEFINES__ == 3)\r
+#define __bsp_BUTTON7__()           __bsp_BUTTON__( __bsp_BUTTON7_PORT__, __bsp_BUTTON7_BIT__, __bsp_BUTTON7_IS_ACTIVE_LOW__ )\r
+#define __bsp_BUTTON7_CONFIG__()    /* nothing required */\r
+#elif (__bsp_NUM_BUTTON7_DEFINES__ == 0)\r
+#define __bsp_BUTTON7__()           /* no button */   0\r
+#define __bsp_BUTTON7_CONFIG__()    /* no button */\r
+#else\r
+#error "ERROR: Incomplete number of macros for BUTTON7."\r
+#endif\r
+\r
+/* ------------------------- populate BUTTON #8 macros ------------------------- */\r
+#define __bsp_NUM_BUTTON8_DEFINES__  ((defined __bsp_BUTTON8_PORT__)  + \\r
+                                      (defined __bsp_BUTTON8_BIT__)   + \\r
+                                      (defined __bsp_BUTTON8_IS_ACTIVE_LOW__))\r
+#if (__bsp_NUM_BUTTON8_DEFINES__ == 3)\r
+#define __bsp_BUTTON8__()           __bsp_BUTTON__( __bsp_BUTTON8_PORT__, __bsp_BUTTON8_BIT__, __bsp_BUTTON8_IS_ACTIVE_LOW__ )\r
+#define __bsp_BUTTON8_CONFIG__()    /* nothing required */\r
+#elif (__bsp_NUM_BUTTON8_DEFINES__ == 0)\r
+#define __bsp_BUTTON8__()           /* no button */   0\r
+#define __bsp_BUTTON8_CONFIG__()    /* no button */\r
+#else\r
+#error "ERROR: Incomplete number of macros for BUTTON8."\r
+#endif\r
+\r
+\r
+/* ************************************************************************************************\r
+ *                                   Compile Time Integrity Checks\r
+ * ************************************************************************************************\r
+ */\r
+\r
+/* -------------------- number of buttons defined -------------------- */\r
+#ifndef __bsp_NUM_BUTTONS__\r
+#error "ERROR: Number of buttons is not specified."\r
+#else\r
+#if ((__bsp_NUM_BUTTONS__ > 8) || (__bsp_NUM_BUTTONS__ < 0))\r
+#error "ERROR: Unsupported number of buttons specified.  Maximum is eight."\r
+#endif\r
+#endif\r
+\r
+#if (((__bsp_NUM_BUTTON1_DEFINES__ != 0) + \\r
+      (__bsp_NUM_BUTTON2_DEFINES__ != 0) + \\r
+      (__bsp_NUM_BUTTON3_DEFINES__ != 0) + \\r
+      (__bsp_NUM_BUTTON4_DEFINES__ != 0) + \\r
+      (__bsp_NUM_BUTTON5_DEFINES__ != 0) + \\r
+      (__bsp_NUM_BUTTON6_DEFINES__ != 0) + \\r
+      (__bsp_NUM_BUTTON7_DEFINES__ != 0) + \\r
+      (__bsp_NUM_BUTTON8_DEFINES__ != 0)) != __bsp_NUM_BUTTONS__)\r
+#error "ERROR: Inconsistency between defined macros and specified number of buttons."\r
+#endif\r
+\r
+/* -------------------- debounce macro -------------------- */\r
+#ifndef __bsp_BUTTON_DEBOUNCE_WAIT__\r
+#error "ERROR: Debounce delay macro is missing."\r
+#endif\r
+\r
+\r
+/**************************************************************************************************\r
+ */\r
+#endif\r
diff --git a/chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/Components/bsp/drivers/code/bsp_generic_leds.h b/chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/Components/bsp/drivers/code/bsp_generic_leds.h
new file mode 100755 (executable)
index 0000000..6e1e42b
--- /dev/null
@@ -0,0 +1,278 @@
+/**************************************************************************************************\r
+  Revised:        $Date: 2007-07-06 11:19:00 -0700 (Fri, 06 Jul 2007) $\r
+  Revision:       $Revision: 13579 $\r
+\r
+  Copyright 2007 Texas Instruments Incorporated.  All rights reserved.\r
+\r
+  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+  the terms of a software license agreement between the user who downloaded the software,\r
+  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+  License. The License limits your use, and you acknowledge, that the Software may not be\r
+  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+  perform, display or sell this Software and/or its documentation for any purpose.\r
+\r
+  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+\r
+  Should you have any questions regarding your right to use this Software,\r
+  contact Texas Instruments Incorporated at www.TI.com. \r
+**************************************************************************************************/\r
+\r
+/* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+ *   BSP (Board Support Package)\r
+ *   Generic LED macro include file.\r
+ * =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+ */\r
+\r
+#ifndef BSP_GENERIC_LEDS_H\r
+#define BSP_GENERIC_LEDS_H\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                          Includes\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#include "bsp_macros.h"\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                           Macros\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+\r
+/*\r
+ *  Note : The conditionals in the following macros evaulate compile time constants.\r
+ *         Any compiler worth its salt will optimize these conditionals out for the\r
+ *         smallest possible code.\r
+ */\r
+\r
+#define __bsp_LED_TURN_ON__(bit,port,ddr,low)  \\r
+  st( if (low) { port &= ~BV(bit); } else { port |= BV(bit); } )\r
+\r
+#define __bsp_LED_TURN_OFF__(bit,port,ddr,low)  \\r
+  st( if (low) { port |= BV(bit); } else { port &= ~BV(bit); } )\r
+\r
+#define __bsp_LED_IS_ON__(bit,port,ddr,low)  \\r
+  ( (low) ? (!((port) & BV(bit))) : ((port) & BV(bit)) )\r
+\r
+#define __bsp_LED_TOGGLE__(bit,port,ddr,low)     st( port ^= BV(bit); )\r
+#define __bsp_LED_CONFIG__(bit,port,ddr,low)     st( ddr |= BV(bit); )\r
+\r
+\r
+\r
+/* ------------------------- populate LED1 macros ------------------------- */\r
+#define __bsp_NUM_LED1_DEFINES__  ((defined __bsp_LED1_BIT__)  + \\r
+                                   (defined __bsp_LED1_PORT__) + \\r
+                                   (defined __bsp_LED1_DDR__)  + \\r
+                                   (defined __bsp_LED1_IS_ACTIVE_LOW__))\r
+#if (__bsp_NUM_LED1_DEFINES__ == 4)\r
+#define __bsp_LED1_TURN_ON__()    __bsp_LED_TURN_ON__ ( __bsp_LED1_BIT__, __bsp_LED1_PORT__, __bsp_LED1_DDR__, __bsp_LED1_IS_ACTIVE_LOW__ )\r
+#define __bsp_LED1_TURN_OFF__()   __bsp_LED_TURN_OFF__( __bsp_LED1_BIT__, __bsp_LED1_PORT__, __bsp_LED1_DDR__, __bsp_LED1_IS_ACTIVE_LOW__ )\r
+#define __bsp_LED1_TOGGLE__()     __bsp_LED_TOGGLE__  ( __bsp_LED1_BIT__, __bsp_LED1_PORT__, __bsp_LED1_DDR__, __bsp_LED1_IS_ACTIVE_LOW__ )\r
+#define __bsp_LED1_IS_ON__()      __bsp_LED_IS_ON__   ( __bsp_LED1_BIT__, __bsp_LED1_PORT__, __bsp_LED1_DDR__, __bsp_LED1_IS_ACTIVE_LOW__ )\r
+#define __bsp_LED1_CONFIG__()     __bsp_LED_CONFIG__  ( __bsp_LED1_BIT__, __bsp_LED1_PORT__, __bsp_LED1_DDR__, __bsp_LED1_IS_ACTIVE_LOW__ )\r
+#elif (__bsp_NUM_LED1_DEFINES__ == 0)\r
+#define __bsp_LED1_TURN_ON__()    /* no LED */\r
+#define __bsp_LED1_TURN_OFF__()   /* no LED */\r
+#define __bsp_LED1_TOGGLE__()     /* no LED */\r
+#define __bsp_LED1_IS_ON__()      /* no LED */  0\r
+#define __bsp_LED1_CONFIG__()     /* no LED */\r
+#else\r
+#error "ERROR: Incomplete number of macros for LED1."\r
+#endif\r
+\r
+\r
+/* ------------------------- populate LED2 macros ------------------------- */\r
+#define __bsp_NUM_LED2_DEFINES__  ((defined __bsp_LED2_BIT__)  + \\r
+                                   (defined __bsp_LED2_PORT__) + \\r
+                                   (defined __bsp_LED2_DDR__)  + \\r
+                                   (defined __bsp_LED2_IS_ACTIVE_LOW__))\r
+#if (__bsp_NUM_LED2_DEFINES__ == 4)\r
+#define __bsp_LED2_TURN_ON__()    __bsp_LED_TURN_ON__ ( __bsp_LED2_BIT__, __bsp_LED2_PORT__, __bsp_LED2_DDR__, __bsp_LED2_IS_ACTIVE_LOW__ )\r
+#define __bsp_LED2_TURN_OFF__()   __bsp_LED_TURN_OFF__( __bsp_LED2_BIT__, __bsp_LED2_PORT__, __bsp_LED2_DDR__, __bsp_LED2_IS_ACTIVE_LOW__ )\r
+#define __bsp_LED2_TOGGLE__()     __bsp_LED_TOGGLE__  ( __bsp_LED2_BIT__, __bsp_LED2_PORT__, __bsp_LED2_DDR__, __bsp_LED2_IS_ACTIVE_LOW__ )\r
+#define __bsp_LED2_IS_ON__()      __bsp_LED_IS_ON__   ( __bsp_LED2_BIT__, __bsp_LED2_PORT__, __bsp_LED2_DDR__, __bsp_LED2_IS_ACTIVE_LOW__ )\r
+#define __bsp_LED2_CONFIG__()     __bsp_LED_CONFIG__  ( __bsp_LED2_BIT__, __bsp_LED2_PORT__, __bsp_LED2_DDR__, __bsp_LED2_IS_ACTIVE_LOW__ )\r
+#elif (__bsp_NUM_LED2_DEFINES__ == 0)\r
+#define __bsp_LED2_TURN_ON__()    /* no LED */\r
+#define __bsp_LED2_TURN_OFF__()   /* no LED */\r
+#define __bsp_LED2_TOGGLE__()     /* no LED */\r
+#define __bsp_LED2_IS_ON__()      /* no LED */  0\r
+#define __bsp_LED2_CONFIG__()     /* no LED */\r
+#else\r
+#error "ERROR: Incomplete number of macros for LED2."\r
+#endif\r
+\r
+\r
+/* ------------------------- populate LED3 macros ------------------------- */\r
+#define __bsp_NUM_LED3_DEFINES__  ((defined __bsp_LED3_BIT__)  + \\r
+                                   (defined __bsp_LED3_PORT__) + \\r
+                                   (defined __bsp_LED3_DDR__)  + \\r
+                                   (defined __bsp_LED3_IS_ACTIVE_LOW__))\r
+#if (__bsp_NUM_LED3_DEFINES__ == 4)\r
+#define __bsp_LED3_TURN_ON__()    __bsp_LED_TURN_ON__ ( __bsp_LED3_BIT__, __bsp_LED3_PORT__, __bsp_LED3_DDR__, __bsp_LED3_IS_ACTIVE_LOW__ )\r
+#define __bsp_LED3_TURN_OFF__()   __bsp_LED_TURN_OFF__( __bsp_LED3_BIT__, __bsp_LED3_PORT__, __bsp_LED3_DDR__, __bsp_LED3_IS_ACTIVE_LOW__ )\r
+#define __bsp_LED3_TOGGLE__()     __bsp_LED_TOGGLE__  ( __bsp_LED3_BIT__, __bsp_LED3_PORT__, __bsp_LED3_DDR__, __bsp_LED3_IS_ACTIVE_LOW__ )\r
+#define __bsp_LED3_IS_ON__()      __bsp_LED_IS_ON__   ( __bsp_LED3_BIT__, __bsp_LED3_PORT__, __bsp_LED3_DDR__, __bsp_LED3_IS_ACTIVE_LOW__ )\r
+#define __bsp_LED3_CONFIG__()     __bsp_LED_CONFIG__  ( __bsp_LED3_BIT__, __bsp_LED3_PORT__, __bsp_LED3_DDR__, __bsp_LED3_IS_ACTIVE_LOW__ )\r
+#elif (__bsp_NUM_LED3_DEFINES__ == 0)\r
+#define __bsp_LED3_TURN_ON__()    /* no LED */\r
+#define __bsp_LED3_TURN_OFF__()   /* no LED */\r
+#define __bsp_LED3_TOGGLE__()     /* no LED */\r
+#define __bsp_LED3_IS_ON__()      /* no LED */  0\r
+#define __bsp_LED3_CONFIG__()     /* no LED */\r
+#else\r
+#error "ERROR: Incomplete number of macros for LED3."\r
+#endif\r
+\r
+\r
+/* ------------------------- populate LED4 macros ------------------------- */\r
+#define __bsp_NUM_LED4_DEFINES__  ((defined __bsp_LED4_BIT__)  + \\r
+                                   (defined __bsp_LED4_PORT__) + \\r
+                                   (defined __bsp_LED4_DDR__)  + \\r
+                                   (defined __bsp_LED4_IS_ACTIVE_LOW__))\r
+#if (__bsp_NUM_LED4_DEFINES__ == 4)\r
+#define __bsp_LED4_TURN_ON__()    __bsp_LED_TURN_ON__ ( __bsp_LED4_BIT__, __bsp_LED4_PORT__, __bsp_LED4_DDR__, __bsp_LED4_IS_ACTIVE_LOW__ )\r
+#define __bsp_LED4_TURN_OFF__()   __bsp_LED_TURN_OFF__( __bsp_LED4_BIT__, __bsp_LED4_PORT__, __bsp_LED4_DDR__, __bsp_LED4_IS_ACTIVE_LOW__ )\r
+#define __bsp_LED4_TOGGLE__()     __bsp_LED_TOGGLE__  ( __bsp_LED4_BIT__, __bsp_LED4_PORT__, __bsp_LED4_DDR__, __bsp_LED4_IS_ACTIVE_LOW__ )\r
+#define __bsp_LED4_IS_ON__()      __bsp_LED_IS_ON__   ( __bsp_LED4_BIT__, __bsp_LED4_PORT__, __bsp_LED4_DDR__, __bsp_LED4_IS_ACTIVE_LOW__ )\r
+#define __bsp_LED4_CONFIG__()     __bsp_LED_CONFIG__  ( __bsp_LED4_BIT__, __bsp_LED4_PORT__, __bsp_LED4_DDR__, __bsp_LED4_IS_ACTIVE_LOW__ )\r
+#elif (__bsp_NUM_LED4_DEFINES__ == 0)\r
+#define __bsp_LED4_TURN_ON__()    /* no LED */\r
+#define __bsp_LED4_TURN_OFF__()   /* no LED */\r
+#define __bsp_LED4_TOGGLE__()     /* no LED */\r
+#define __bsp_LED4_IS_ON__()      /* no LED */  0\r
+#define __bsp_LED4_CONFIG__()     /* no LED */\r
+#else\r
+#error "ERROR: Incomplete number of macros for LED4."\r
+#endif\r
+\r
+/* ------------------------- populate LED5 macros ------------------------- */\r
+#define __bsp_NUM_LED5_DEFINES__  ((defined __bsp_LED5_BIT__)  + \\r
+                                   (defined __bsp_LED5_PORT__) + \\r
+                                   (defined __bsp_LED5_DDR__)  + \\r
+                                   (defined __bsp_LED5_IS_ACTIVE_LOW__))\r
+#if (__bsp_NUM_LED5_DEFINES__ == 4)\r
+#define __bsp_LED5_TURN_ON__()    __bsp_LED_TURN_ON__ ( __bsp_LED5_BIT__, __bsp_LED5_PORT__, __bsp_LED5_DDR__, __bsp_LED5_IS_ACTIVE_LOW__ )\r
+#define __bsp_LED5_TURN_OFF__()   __bsp_LED_TURN_OFF__( __bsp_LED5_BIT__, __bsp_LED5_PORT__, __bsp_LED5_DDR__, __bsp_LED5_IS_ACTIVE_LOW__ )\r
+#define __bsp_LED5_TOGGLE__()     __bsp_LED_TOGGLE__  ( __bsp_LED5_BIT__, __bsp_LED5_PORT__, __bsp_LED5_DDR__, __bsp_LED5_IS_ACTIVE_LOW__ )\r
+#define __bsp_LED5_IS_ON__()      __bsp_LED_IS_ON__   ( __bsp_LED5_BIT__, __bsp_LED5_PORT__, __bsp_LED5_DDR__, __bsp_LED5_IS_ACTIVE_LOW__ )\r
+#define __bsp_LED5_CONFIG__()     __bsp_LED_CONFIG__  ( __bsp_LED5_BIT__, __bsp_LED5_PORT__, __bsp_LED5_DDR__, __bsp_LED5_IS_ACTIVE_LOW__ )\r
+#elif (__bsp_NUM_LED5_DEFINES__ == 0)\r
+#define __bsp_LED5_TURN_ON__()    /* no LED */\r
+#define __bsp_LED5_TURN_OFF__()   /* no LED */\r
+#define __bsp_LED5_TOGGLE__()     /* no LED */\r
+#define __bsp_LED5_IS_ON__()      /* no LED */  0\r
+#define __bsp_LED5_CONFIG__()     /* no LED */\r
+#else\r
+#error "ERROR: Incomplete number of macros for LED5."\r
+#endif\r
+\r
+/* ------------------------- populate LED6 macros ------------------------- */\r
+#define __bsp_NUM_LED6_DEFINES__  ((defined __bsp_LED6_BIT__)  + \\r
+                                   (defined __bsp_LED6_PORT__) + \\r
+                                   (defined __bsp_LED6_DDR__)  + \\r
+                                   (defined __bsp_LED6_IS_ACTIVE_LOW__))\r
+#if (__bsp_NUM_LED6_DEFINES__ == 4)\r
+#define __bsp_LED6_TURN_ON__()    __bsp_LED_TURN_ON__ ( __bsp_LED6_BIT__, __bsp_LED6_PORT__, __bsp_LED6_DDR__, __bsp_LED6_IS_ACTIVE_LOW__ )\r
+#define __bsp_LED6_TURN_OFF__()   __bsp_LED_TURN_OFF__( __bsp_LED6_BIT__, __bsp_LED6_PORT__, __bsp_LED6_DDR__, __bsp_LED6_IS_ACTIVE_LOW__ )\r
+#define __bsp_LED6_TOGGLE__()     __bsp_LED_TOGGLE__  ( __bsp_LED6_BIT__, __bsp_LED6_PORT__, __bsp_LED6_DDR__, __bsp_LED6_IS_ACTIVE_LOW__ )\r
+#define __bsp_LED6_IS_ON__()      __bsp_LED_IS_ON__   ( __bsp_LED6_BIT__, __bsp_LED6_PORT__, __bsp_LED6_DDR__, __bsp_LED6_IS_ACTIVE_LOW__ )\r
+#define __bsp_LED6_CONFIG__()     __bsp_LED_CONFIG__  ( __bsp_LED6_BIT__, __bsp_LED6_PORT__, __bsp_LED6_DDR__, __bsp_LED6_IS_ACTIVE_LOW__ )\r
+#elif (__bsp_NUM_LED6_DEFINES__ == 0)\r
+#define __bsp_LED6_TURN_ON__()    /* no LED */\r
+#define __bsp_LED6_TURN_OFF__()   /* no LED */\r
+#define __bsp_LED6_TOGGLE__()     /* no LED */\r
+#define __bsp_LED6_IS_ON__()      /* no LED */  0\r
+#define __bsp_LED6_CONFIG__()     /* no LED */\r
+#else\r
+#error "ERROR: Incomplete number of macros for LED6."\r
+#endif\r
+\r
+/* ------------------------- populate LED7 macros ------------------------- */\r
+#define __bsp_NUM_LED7_DEFINES__  ((defined __bsp_LED7_BIT__)  + \\r
+                                   (defined __bsp_LED7_PORT__) + \\r
+                                   (defined __bsp_LED7_DDR__)  + \\r
+                                   (defined __bsp_LED7_IS_ACTIVE_LOW__))\r
+#if (__bsp_NUM_LED7_DEFINES__ == 4)\r
+#define __bsp_LED7_TURN_ON__()    __bsp_LED_TURN_ON__ ( __bsp_LED7_BIT__, __bsp_LED7_PORT__, __bsp_LED7_DDR__, __bsp_LED7_IS_ACTIVE_LOW__ )\r
+#define __bsp_LED7_TURN_OFF__()   __bsp_LED_TURN_OFF__( __bsp_LED7_BIT__, __bsp_LED7_PORT__, __bsp_LED7_DDR__, __bsp_LED7_IS_ACTIVE_LOW__ )\r
+#define __bsp_LED7_TOGGLE__()     __bsp_LED_TOGGLE__  ( __bsp_LED7_BIT__, __bsp_LED7_PORT__, __bsp_LED7_DDR__, __bsp_LED7_IS_ACTIVE_LOW__ )\r
+#define __bsp_LED7_IS_ON__()      __bsp_LED_IS_ON__   ( __bsp_LED7_BIT__, __bsp_LED7_PORT__, __bsp_LED7_DDR__, __bsp_LED7_IS_ACTIVE_LOW__ )\r
+#define __bsp_LED7_CONFIG__()     __bsp_LED_CONFIG__  ( __bsp_LED7_BIT__, __bsp_LED7_PORT__, __bsp_LED7_DDR__, __bsp_LED7_IS_ACTIVE_LOW__ )\r
+#elif (__bsp_NUM_LED7_DEFINES__ == 0)\r
+#define __bsp_LED7_TURN_ON__()    /* no LED */\r
+#define __bsp_LED7_TURN_OFF__()   /* no LED */\r
+#define __bsp_LED7_TOGGLE__()     /* no LED */\r
+#define __bsp_LED7_IS_ON__()      /* no LED */  0\r
+#define __bsp_LED7_CONFIG__()     /* no LED */\r
+#else\r
+#error "ERROR: Incomplete number of macros for LED7."\r
+#endif\r
+\r
+/* ------------------------- populate LED8 macros ------------------------- */\r
+#define __bsp_NUM_LED8_DEFINES__  ((defined __bsp_LED8_BIT__)  + \\r
+                                   (defined __bsp_LED8_PORT__) + \\r
+                                   (defined __bsp_LED8_DDR__)  + \\r
+                                   (defined __bsp_LED8_IS_ACTIVE_LOW__))\r
+#if (__bsp_NUM_LED8_DEFINES__ == 4)\r
+#define __bsp_LED8_TURN_ON__()    __bsp_LED_TURN_ON__ ( __bsp_LED8_BIT__, __bsp_LED8_PORT__, __bsp_LED8_DDR__, __bsp_LED8_IS_ACTIVE_LOW__ )\r
+#define __bsp_LED8_TURN_OFF__()   __bsp_LED_TURN_OFF__( __bsp_LED8_BIT__, __bsp_LED8_PORT__, __bsp_LED8_DDR__, __bsp_LED8_IS_ACTIVE_LOW__ )\r
+#define __bsp_LED8_TOGGLE__()     __bsp_LED_TOGGLE__  ( __bsp_LED8_BIT__, __bsp_LED8_PORT__, __bsp_LED8_DDR__, __bsp_LED8_IS_ACTIVE_LOW__ )\r
+#define __bsp_LED8_IS_ON__()      __bsp_LED_IS_ON__   ( __bsp_LED8_BIT__, __bsp_LED8_PORT__, __bsp_LED8_DDR__, __bsp_LED8_IS_ACTIVE_LOW__ )\r
+#define __bsp_LED8_CONFIG__()     __bsp_LED_CONFIG__  ( __bsp_LED8_BIT__, __bsp_LED8_PORT__, __bsp_LED8_DDR__, __bsp_LED8_IS_ACTIVE_LOW__ )\r
+#elif (__bsp_NUM_LED8_DEFINES__ == 0)\r
+#define __bsp_LED8_TURN_ON__()    /* no LED */\r
+#define __bsp_LED8_TURN_OFF__()   /* no LED */\r
+#define __bsp_LED8_TOGGLE__()     /* no LED */\r
+#define __bsp_LED8_IS_ON__()      /* no LED */  0\r
+#define __bsp_LED8_CONFIG__()     /* no LED */\r
+#else\r
+#error "ERROR: Incomplete number of macros for LED8."\r
+#endif\r
+\r
+\r
+/* ************************************************************************************************\r
+ *                                   Compile Time Integrity Checks\r
+ * ************************************************************************************************\r
+ */\r
+\r
+/* -------------------- number of LEDs defined -------------------- */\r
+#ifndef __bsp_NUM_LEDS__\r
+#error "ERROR: Number of LEDs is not specified."\r
+#else\r
+#if ((__bsp_NUM_LEDS__ > 8) || (__bsp_NUM_LEDS__ < 0))\r
+#error "ERROR: Unsupported number of LEDs specified.  Maximum is eight."\r
+#endif\r
+#endif\r
+\r
+#if (((__bsp_NUM_LED1_DEFINES__ != 0) + \\r
+      (__bsp_NUM_LED2_DEFINES__ != 0) + \\r
+      (__bsp_NUM_LED3_DEFINES__ != 0) + \\r
+      (__bsp_NUM_LED4_DEFINES__ != 0) + \\r
+      (__bsp_NUM_LED5_DEFINES__ != 0) + \\r
+      (__bsp_NUM_LED6_DEFINES__ != 0) + \\r
+      (__bsp_NUM_LED7_DEFINES__ != 0) + \\r
+      (__bsp_NUM_LED8_DEFINES__ != 0)) != __bsp_NUM_LEDS__)\r
+#error "ERROR: Inconsistency between defined macros and specified number of LEDs."\r
+#endif\r
+\r
+/* -------------------- blink delay loop count -------------------- */\r
+#ifndef __bsp_LED_BLINK_LOOP_COUNT__\r
+#error "ERROR: Blink delay count is missing."\r
+#endif\r
+\r
+/**************************************************************************************************\r
+ */\r
+#endif\r
diff --git a/chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/Components/bsp/drivers/code/bsp_leds.c b/chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/Components/bsp/drivers/code/bsp_leds.c
new file mode 100755 (executable)
index 0000000..4bc83e0
--- /dev/null
@@ -0,0 +1,107 @@
+/**************************************************************************************************\r
+  Revised:        $Date: 2007-07-06 11:19:00 -0700 (Fri, 06 Jul 2007) $\r
+  Revision:       $Revision: 13579 $\r
+\r
+  Copyright 2007 Texas Instruments Incorporated.  All rights reserved.\r
+\r
+  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+  the terms of a software license agreement between the user who downloaded the software,\r
+  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+  License. The License limits your use, and you acknowledge, that the Software may not be\r
+  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+  perform, display or sell this Software and/or its documentation for any purpose.\r
+\r
+  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+\r
+  Should you have any questions regarding your right to use this Software,\r
+  contact Texas Instruments Incorporated at www.TI.com. \r
+**************************************************************************************************/\r
+\r
+/* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+ *   BSP (Board Support Package)\r
+ *   Generic LED driver code file.\r
+ * =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+ */\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                            Includes\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#include "bsp_leds.h"\r
+#include "bsp_led_defs.h"\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                             Macros\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#define BSP_CONFIG_LED1()    __bsp_LED1_CONFIG__()\r
+#define BSP_CONFIG_LED2()    __bsp_LED2_CONFIG__()\r
+#define BSP_CONFIG_LED3()    __bsp_LED3_CONFIG__()\r
+#define BSP_CONFIG_LED4()    __bsp_LED4_CONFIG__()\r
+#define BSP_CONFIG_LED5()    __bsp_LED5_CONFIG__()\r
+#define BSP_CONFIG_LED6()    __bsp_LED6_CONFIG__()\r
+#define BSP_CONFIG_LED7()    __bsp_LED7_CONFIG__()\r
+#define BSP_CONFIG_LED8()    __bsp_LED8_CONFIG__()\r
+\r
+#ifdef __bsp_LED_EXTENDED_CONFIG__\r
+#define BSP_LED_EXTENDED_CONFIG()  __bsp_LED_EXTENDED_CONFIG__()\r
+#else\r
+#define BSP_LED_EXTENDED_CONFIG()\r
+#endif\r
+\r
+\r
+/**************************************************************************************************\r
+ * @fn          BSP_InitLeds\r
+ *\r
+ * @brief       Initialize LED hardware and driver.\r
+ *\r
+ * @param       none\r
+ *\r
+ * @return      none\r
+ **************************************************************************************************\r
+ */\r
+void BSP_InitLeds(void)\r
+{\r
+  /* configure LEDs */\r
+  BSP_CONFIG_LED1();\r
+  BSP_CONFIG_LED2();\r
+  BSP_CONFIG_LED3();\r
+  BSP_CONFIG_LED4();\r
+  BSP_CONFIG_LED5();\r
+  BSP_CONFIG_LED6();\r
+  BSP_CONFIG_LED7();\r
+  BSP_CONFIG_LED8();\r
+\r
+  /* peform extended configuration if needed */\r
+  BSP_LED_EXTENDED_CONFIG();\r
+\r
+  /* turn all LEDs off as power-up default */\r
+  BSP_TURN_OFF_LED1();\r
+  BSP_TURN_OFF_LED2();\r
+  BSP_TURN_OFF_LED3();\r
+  BSP_TURN_OFF_LED4();\r
+  BSP_TURN_OFF_LED5();\r
+  BSP_TURN_OFF_LED6();\r
+  BSP_TURN_OFF_LED7();\r
+  BSP_TURN_OFF_LED8();\r
+}\r
+\r
+\r
+/**************************************************************************************************\r
+*/\r
+\r
+   \r
+   \r
diff --git a/chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/Components/bsp/mcus/bsp_8051_defs.h b/chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/Components/bsp/mcus/bsp_8051_defs.h
new file mode 100755 (executable)
index 0000000..acc2638
--- /dev/null
@@ -0,0 +1,99 @@
+/**************************************************************************************************\r
+  Revised:        $Date: 2007-07-06 11:19:00 -0700 (Fri, 06 Jul 2007) $\r
+  Revision:       $Revision: 13579 $\r
+\r
+  Copyright 2007 Texas Instruments Incorporated.  All rights reserved.\r
+\r
+  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+  the terms of a software license agreement between the user who downloaded the software,\r
+  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+  License. The License limits your use, and you acknowledge, that the Software may not be\r
+  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+  perform, display or sell this Software and/or its documentation for any purpose.\r
+\r
+  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+\r
+  Should you have any questions regarding your right to use this Software,\r
+  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+/* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+ *   BSP (Board Support Package)\r
+ *   MCU : 8051\r
+ *   Microcontroller definition file.\r
+ * =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+ */\r
+\r
+#ifndef BSP_8051_DEFS_H\r
+#define BSP_8051_DEFS_H\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                          Defines\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#define BSP_MCU_8051\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                     Compiler Abstraction\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+\r
+/* ---------------------- IAR Compiler ---------------------- */\r
+#ifdef __IAR_SYSTEMS_ICC__\r
+#define BSP_COMPILER_IAR\r
+#ifndef MCU_H\r
+#error "ERROR:  The MCU include file must be specified.  Define MCU_H=<mcu_file.h> at the project level."\r
+#endif\r
+#include MCU_H\r
+#define __bsp_LITTLE_ENDIAN__   1\r
+#define __bsp_CODE_MEMSPACE__   __code\r
+#define __bsp_XDATA_MEMSPACE__  __xdata\r
+\r
+#define __bsp_QUOTED_PRAGMA__(x)    _Pragma(#x)\r
+#define __bsp_ISR_FUNCTION__(f,v)   __bsp_QUOTED_PRAGMA__(vector=v) __interrupt void f(void); \\r
+                                    __bsp_QUOTED_PRAGMA__(vector=v) __interrupt void f(void)\r
+\r
+/* ------------------ Unrecognized Compiler ------------------ */\r
+#else\r
+#error "ERROR: Unknown compiler."\r
+#endif\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                          Common\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+typedef   signed char     int8_t;\r
+typedef   signed short    int16_t;\r
+typedef   signed long     int32_t;\r
+\r
+typedef   unsigned char   uint8_t;\r
+typedef   unsigned short  uint16_t;\r
+typedef   unsigned long   uint32_t;\r
+\r
+#define __bsp_ENABLE_INTERRUPTS__()         st( EA = 1; )\r
+#define __bsp_DISABLE_INTERRUPTS__()        st( EA = 0; )\r
+#define __bsp_INTERRUPTS_ARE_ENABLED__()    EA\r
+\r
+#define __bsp_ISTATE_T__                    unsigned char\r
+#define __bsp_GET_ISTATE__()                EA\r
+#define __bsp_RESTORE_ISTATE__(x)           st( EA = x; )\r
+\r
+\r
+/**************************************************************************************************\r
+ */\r
+#endif\r
diff --git a/chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/Components/bsp/mcus/bsp_msp430_defs.h b/chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/Components/bsp/mcus/bsp_msp430_defs.h
new file mode 100755 (executable)
index 0000000..ad66e54
--- /dev/null
@@ -0,0 +1,140 @@
+/**************************************************************************************************\r
+  Filename:       bsp_msp430_defs.h\r
+  Revised:        $Date: 2009-10-11 18:52:46 -0700 (Sun, 11 Oct 2009) $\r
+  Revision:       $Revision: 20897 $\r
+\r
+  Copyright 2007-2009 Texas Instruments Incorporated.  All rights reserved.\r
+\r
+  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+  the terms of a software license agreement between the user who downloaded the software,\r
+  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+  License. The License limits your use, and you acknowledge, that the Software may not be\r
+  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+  perform, display or sell this Software and/or its documentation for any purpose.\r
+\r
+  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+\r
+  Should you have any questions regarding your right to use this Software,\r
+  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+/* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+ *   BSP (Board Support Package)\r
+ *   MCU : Texas Instruments MSP430 family\r
+ *   Microcontroller definition file.\r
+ * =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+ */\r
+\r
+#ifndef BSP_MSP430_DEFS_H\r
+#define BSP_MSP430_DEFS_H\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                          Defines\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#define BSP_MCU_MSP430\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                     Compiler Abstraction\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+\r
+/* ---------------------- IAR Compiler ---------------------- */\r
+#ifdef __IAR_SYSTEMS_ICC__\r
+#define BSP_COMPILER_IAR\r
+\r
+#if (__VER__ < 342)\r
+  #error "ERROR: This IAR compiler port requires at least revision v3.42A."\r
+/*\r
+ *  Compiler versions previous to v3.42A do not have the universal msp430.h include file.\r
+ *  To use an earlier version of the compiler, replace the above #error statement with\r
+ *  the appropriate, device specific #include statement.\r
+ */\r
+#endif\r
+\r
+/* Workaround for release v3.42A - the msp430.h file did not include support for some devices */\r
+#if ((__VER__ == 342) && (__SUBVERSION__ == 'A')) && \\r
+     (defined (__MSP430F1610__) || defined (__MSP430F1611__) || defined (__MSP430F1612__))\r
+#include <msp430x16x.h>\r
+#else\r
+#include <msp430.h>\r
+#endif\r
+\r
+#define __bsp_ISTATE_T__            istate_t\r
+#define __bsp_ISR_FUNCTION__(f,v)   __bsp_QUOTED_PRAGMA__(vector=v) __interrupt void f(void); \\r
+                                    __bsp_QUOTED_PRAGMA__(vector=v) __interrupt void f(void)\r
+\r
+/* Initialization call provided in IAR environment before standard C-startup */\r
+#include <intrinsics.h>\r
+#define BSP_EARLY_INIT(void) __intrinsic int __low_level_init(void)\r
+\r
+/* ---------------------- Code Composer ---------------------- */\r
+#elif (defined __TI_COMPILER_VERSION__) && (defined __MSP430__)\r
+#define BSP_COMPILER_CODE_COMPOSER\r
+\r
+/* At time of 1.1.0 release, CC430 support not in msp430.h */\r
+#if (__CC430F6137__)\r
+#include <cc430x613x.h>\r
+#else\r
+#include <msp430.h>\r
+#endif\r
+\r
+#define __bsp_ISTATE_T__            unsigned short\r
+#define __bsp_ISR_FUNCTION__(f,v)   __bsp_QUOTED_PRAGMA__(vector=v) __interrupt void f(void)\r
+\r
+/* Initialization call provided in CCE environment before standard C-startup */\r
+#define BSP_EARLY_INIT(void)  int _system_pre_init(void)\r
+       \r
+/* ------------------ Unrecognized Compiler ------------------ */\r
+#else\r
+#error "ERROR: Unknown compiler."\r
+#endif\r
+\r
+#if (defined BSP_COMPILER_IAR) || (defined BSP_COMPILER_CODE_COMPOSER)\r
+#include <intrinsics.h>\r
+#define __bsp_ENABLE_INTERRUPTS__()       __enable_interrupt()\r
+#define __bsp_DISABLE_INTERRUPTS__()      __disable_interrupt()\r
+#define __bsp_INTERRUPTS_ARE_ENABLED__()  (__get_SR_register() & GIE)\r
+\r
+#define __bsp_GET_ISTATE__()              __get_interrupt_state()\r
+#define __bsp_RESTORE_ISTATE__(x)         __set_interrupt_state(x)\r
+\r
+#define __bsp_QUOTED_PRAGMA__(x)          _Pragma(#x)\r
+\r
+#endif\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                          Common\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#define __bsp_LITTLE_ENDIAN__   1\r
+#define __bsp_CODE_MEMSPACE__   /* blank */\r
+#define __bsp_XDATA_MEMSPACE__  /* blank */\r
+\r
+typedef   signed char     int8_t;\r
+typedef   signed short    int16_t;\r
+typedef   signed long     int32_t;\r
+\r
+typedef   unsigned char   uint8_t;\r
+typedef   unsigned short  uint16_t;\r
+typedef   unsigned long   uint32_t;\r
+\r
+#ifndef NULL\r
+#define NULL 0\r
+#endif\r
+\r
+/**************************************************************************************************\r
+ */\r
+#endif\r
diff --git a/chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/Components/mrfi/mrfi.c b/chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/Components/mrfi/mrfi.c
new file mode 100755 (executable)
index 0000000..5b7337b
--- /dev/null
@@ -0,0 +1,87 @@
+/**************************************************************************************************\r
+  Revised:        $Date: 2007-07-06 11:19:00 -0700 (Fri, 06 Jul 2007) $\r
+  Revision:       $Revision: 13579 $\r
+\r
+  Copyright 2007 Texas Instruments Incorporated.  All rights reserved.\r
+\r
+  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+  the terms of a software license agreement between the user who downloaded the software,\r
+  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+  License. The License limits your use, and you acknowledge, that the Software may not be\r
+  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+  perform, display or sell this Software and/or its documentation for any purpose.\r
+\r
+  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+\r
+  Should you have any questions regarding your right to use this Software,\r
+  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+/* ~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=\r
+ *   MRFI (Minimal RF Interface)\r
+ *   Top-level code file.\r
+ * ~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=\r
+ */\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                          Includes\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#include "mrfi_defs.h"\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                       C Code Includes\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+\r
+/* ----- Radio Family 1 ----- */\r
+#if (defined MRFI_RADIO_FAMILY1)\r
+#include "radios/family1/mrfi_radio.c"\r
+#include "radios/family1/mrfi_spi.c"\r
+#include "radios/common/mrfi_f1f2.c"\r
+#include "bsp_external/mrfi_board.c"\r
+\r
+/* ----- Radio Family 2 ----- */\r
+#elif (defined MRFI_RADIO_FAMILY2)\r
+#include "radios/family2/mrfi_radio.c"\r
+#include "radios/common/mrfi_f1f2.c"\r
+\r
+/* ----- Radio Family 3 ----- */\r
+#elif (defined MRFI_RADIO_FAMILY3)\r
+#include "bsp_external/mrfi_board.c"\r
+#include "radios/family3/mrfi_spi.c"\r
+#include "radios/family3/mrfi_radio.c"\r
+\r
+/* ----- Radio Family 4 ----- */\r
+#elif (defined MRFI_RADIO_FAMILY4)\r
+#include "radios/family4/mrfi_radio.c"\r
+\r
+/* ----- Radio Family 5 ----- */\r
+#elif (defined MRFI_RADIO_FAMILY5)\r
+#include "radios/family5/mrfi_radio.c"\r
+#include "radios/family5/mrfi_radio_interface.c"\r
+\r
+/* ----- Radio Family 6 ----- */\r
+#elif (defined MRFI_RADIO_FAMILY6)\r
+#include "radios/family6/mrfi_radio.c"\r
+\r
+#else\r
+#error "ERROR: Radio family is not defined."\r
+#endif\r
+\r
+\r
+/**************************************************************************************************\r
+ */\r
diff --git a/chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/Components/mrfi/mrfi.h b/chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/Components/mrfi/mrfi.h
new file mode 100755 (executable)
index 0000000..ca49e02
--- /dev/null
@@ -0,0 +1,182 @@
+/**************************************************************************************************\r
+  Revised:        $Date: 2007-07-06 11:19:00 -0700 (Fri, 06 Jul 2007) $\r
+  Revision:       $Revision: 13579 $\r
+\r
+  Copyright 2007 Texas Instruments Incorporated.  All rights reserved.\r
+\r
+  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+  the terms of a software license agreement between the user who downloaded the software,\r
+  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+  License. The License limits your use, and you acknowledge, that the Software may not be\r
+  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+  perform, display or sell this Software and/or its documentation for any purpose.\r
+\r
+  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+\r
+  Should you have any questions regarding your right to use this Software,\r
+  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+/* ~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=\r
+ *   MRFI (Minimal RF Interface)\r
+ *   Include file for all MRFI services.\r
+ * ~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=\r
+ */\r
+\r
+#ifndef MRFI_H\r
+#define MRFI_H\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                          Includes\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#include "bsp.h"\r
+#include "mrfi_defs.h"\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                          Defines\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#define MRFI_NUM_LOGICAL_CHANS           __mrfi_NUM_LOGICAL_CHANS__\r
+\r
+#define MRFI_NUM_POWER_SETTINGS          __mrfi_NUM_POWER_SETTINGS__\r
+\r
+/* return values for MRFI_Transmit */\r
+#define MRFI_TX_RESULT_SUCCESS        0\r
+#define MRFI_TX_RESULT_FAILED         1\r
+\r
+/* transmit type parameter for MRFI_Transmit */\r
+#define MRFI_TX_TYPE_FORCED           0\r
+#define MRFI_TX_TYPE_CCA              1\r
+\r
+/* Network header size definition */\r
+/* *********************************  NOTE  ****************************************\r
+ * There is a dependency here that really shouldn't exist. A reimplementation\r
+ * is necessary to avoid it.\r
+ *\r
+ * MRFI allocates the frame buffer which means it needs to know at compile time\r
+ * how big the buffer is. This means in must know the NWK header size, the\r
+ * maximum NWK and User application payload sizes and whether Security is enabled.\r
+ * ********************************************************************************\r
+ */\r
+#ifndef SMPL_SECURE\r
+#define  NWK_HDR_SIZE   3\r
+#define  NWK_PAYLOAD    MAX_NWK_PAYLOAD\r
+#else\r
+#define  NWK_HDR_SIZE   6\r
+#define  NWK_PAYLOAD    (MAX_NWK_PAYLOAD+4)\r
+#endif\r
+\r
+/* if external code has defined a maximum payload, use that instead of default */\r
+#ifdef MAX_APP_PAYLOAD\r
+#ifndef MAX_NWK_PAYLOAD\r
+#error ERROR: MAX_NWK_PAYLOAD not defined\r
+#endif\r
+#if MAX_APP_PAYLOAD < NWK_PAYLOAD\r
+#define MAX_PAYLOAD  NWK_PAYLOAD\r
+#else\r
+#define MAX_PAYLOAD  MAX_APP_PAYLOAD\r
+#endif\r
+#define MRFI_MAX_PAYLOAD_SIZE  (MAX_PAYLOAD+NWK_HDR_SIZE) /* SimpliciTI payload size plus six byte overhead */\r
+#endif\r
+\r
+\r
+/* frame definitions */\r
+#define MRFI_ADDR_SIZE              __mrfi_ADDR_SIZE__\r
+#ifndef MRFI_MAX_PAYLOAD_SIZE\r
+#define MRFI_MAX_PAYLOAD_SIZE       __mrfi_MAX_PAYLOAD_SIZE__\r
+#endif\r
+#define MRFI_MAX_FRAME_SIZE         (MRFI_MAX_PAYLOAD_SIZE + __mrfi_FRAME_OVERHEAD_SIZE__)\r
+#define MRFI_RX_METRICS_SIZE        __mrfi_RX_METRICS_SIZE__\r
+#define MRFI_RX_METRICS_RSSI_OFS    __mrfi_RX_METRICS_RSSI_OFS__\r
+#define MRFI_RX_METRICS_CRC_LQI_OFS __mrfi_RX_METRICS_CRC_LQI_OFS__\r
+\r
+/* Radio States */\r
+#define MRFI_RADIO_STATE_UNKNOWN  0\r
+#define MRFI_RADIO_STATE_OFF      1\r
+#define MRFI_RADIO_STATE_IDLE     2\r
+#define MRFI_RADIO_STATE_RX       3\r
+\r
+/* Platform constant used to calculate worst-case for an application\r
+ * acknowledgment delay. Used in the NWK_REPLY_DELAY() macro.\r
+ *\r
+\r
+                                      processing time on peer\r
+                                      |   round trip\r
+                                      |   |      max number of replays\r
+                                      |   |      |             number of backoff opportunities\r
+                                      |   |      |             |         average number of backoffs\r
+                                      |   |      |             |         |                                    */\r
+#define   PLATFORM_FACTOR_CONSTANT   (2 + 2*(MAX_HOPS*(MRFI_CCA_RETRIES*(8*MRFI_BACKOFF_PERIOD_USECS)/1000)))\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                          Macros\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#define MRFI_GET_PAYLOAD_LEN(p)         __mrfi_GET_PAYLOAD_LEN__(p)\r
+#define MRFI_SET_PAYLOAD_LEN(p,x)       __mrfi_SET_PAYLOAD_LEN__(p,x)\r
+\r
+#define MRFI_P_DST_ADDR(p)              __mrfi_P_DST_ADDR__(p)\r
+#define MRFI_P_SRC_ADDR(p)              __mrfi_P_SRC_ADDR__(p)\r
+#define MRFI_P_PAYLOAD(p)               __mrfi_P_PAYLOAD__(p)\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                          Typdefs\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+typedef struct\r
+{\r
+  uint8_t frame[MRFI_MAX_FRAME_SIZE];\r
+  uint8_t rxMetrics[MRFI_RX_METRICS_SIZE];\r
+} mrfiPacket_t;\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                         Prototypes\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+void    MRFI_Init(void);\r
+uint8_t MRFI_Transmit(mrfiPacket_t *, uint8_t);\r
+void    MRFI_Receive(mrfiPacket_t *);\r
+void    MRFI_RxCompleteISR(void); /* populated by code using MRFI */\r
+uint8_t MRFI_GetRadioState(void);\r
+void    MRFI_RxOn(void);\r
+void    MRFI_RxIdle(void);\r
+int8_t  MRFI_Rssi(void);\r
+void    MRFI_SetLogicalChannel(uint8_t);\r
+uint8_t MRFI_SetRxAddrFilter(uint8_t *);\r
+void    MRFI_EnableRxAddrFilter(void);\r
+void    MRFI_DisableRxAddrFilter(void);\r
+void    MRFI_Sleep(void);\r
+void    MRFI_WakeUp(void);\r
+uint8_t MRFI_RandomByte(void);\r
+void    MRFI_DelayMs(uint16_t);\r
+void    MRFI_ReplyDelay(void);\r
+void    MRFI_PostKillSem(void);\r
+void    MRFI_SetRFPwr(uint8_t);\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                       Global Constants\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+extern const uint8_t mrfiBroadcastAddr[];\r
+\r
+\r
+/**************************************************************************************************\r
+ */\r
+#endif\r
diff --git a/chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/Components/mrfi/mrfi_defs.h b/chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/Components/mrfi/mrfi_defs.h
new file mode 100755 (executable)
index 0000000..2e1c546
--- /dev/null
@@ -0,0 +1,226 @@
+/**************************************************************************************************\r
+  Revised:        $Date: 2009-01-13 16:32:00 -0700 (Wed, 13 Jan 2009) $\r
+  Revision:       $Revision: 18768 $\r
+\r
+  Copyright 2007-2009 Texas Instruments Incorporated.  All rights reserved.\r
+\r
+  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+  the terms of a software license agreement between the user who downloaded the software,\r
+  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+  License. The License limits your use, and you acknowledge, that the Software may not be\r
+  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+  perform, display or sell this Software and/or its documentation for any purpose.\r
+\r
+  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+\r
+  Should you have any questions regarding your right to use this Software,\r
+  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+/* ~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=\r
+ *   MRFI (Minimal RF Interface)\r
+ *   Definition and abstraction for radio targets.\r
+ * ~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=\r
+ */\r
+#ifndef MRFI_DEFS_H\r
+#define MRFI_DEFS_H\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                          Includes\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#include "bsp.h"\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                       Common Defines\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#define MRFI_CCA_RETRIES        4\r
+\r
+#define MRFI_ASSERT(x)          BSP_ASSERT(x)\r
+#define MRFI_FORCE_ASSERT()     BSP_FORCE_ASSERT()\r
+#define MRFI_ASSERTS_ARE_ON     BSP_ASSERTS_ARE_ON\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                    Radio Family Assigment\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+\r
+/* ------ Radio Family 1 ------ */\r
+#if (defined MRFI_CC1100) /* Sub 1 GHz RF Transceiver */ || \\r
+    (defined MRFI_CC1101) /* Sub 1 GHz RF Transceiver */ || \\r
+    (defined MRFI_CC1100E_470)  /* Sub 1 GHz RF Transceiver (CC1100E Asia) */ || \\r
+    (defined MRFI_CC1100E_950)  /* Sub 1 GHz RF Transceiver (CC1100E Asia) */ || \\r
+    (defined MRFI_CC2500) /* 2.4 GHz RF Transceiver */\r
+#define MRFI_RADIO_FAMILY1\r
+\r
+/* ------ Radio Family 2 ------ */\r
+#elif (defined MRFI_CC1110) /* Sub 1 GHz SoC */                     || \\r
+      (defined MRFI_CC1111) /* Sub 1 GHz SoC with USB controller */ || \\r
+      (defined MRFI_CC2510) /* 2.4 GHz SoC */                       || \\r
+      (defined MRFI_CC2511) /* 2.4 GHz SoC with USB controller */\r
+#define MRFI_RADIO_FAMILY2\r
+\r
+/* ------ Radio Family 3 ------ */\r
+#elif (defined MRFI_CC2420) /* 2.4 GHz IEEE 802.15.4 RF Transceiver */ || \\r
+      (defined MRFI_CC2520) /* 2.4 GHz IEEE 802.15.4 RF Transceiver */\r
+\r
+#define MRFI_RADIO_FAMILY3\r
+\r
+/* ------ Radio Family 4 ------ */\r
+#elif (defined MRFI_CC2430) /* 2.4 GHz IEEE 802.15.4 SoC */ || \\r
+      (defined MRFI_CC2431) /* 2.4 GHz IEEE 802.15.4 SoC */\r
+#define MRFI_RADIO_FAMILY4\r
+\r
+/* ------ Radio Family 5 ------ */\r
+#elif (defined MRFI_CC430)  /* Sub 1 GHz MSP SoC */\r
+#define MRFI_RADIO_FAMILY5\r
+\r
+/* ------ Radio Family 6 ------ */\r
+#elif (defined MRFI_CC2530) /* 2.4 GHz IEEE 802.15.4 SoC */\r
+\r
+#define MRFI_RADIO_FAMILY6\r
+\r
+#else\r
+#error "ERROR: Unknown or missing radio selection."\r
+#endif\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                Radio Family 1 / Radio Family 2 / Radio Family 5\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#if (defined MRFI_RADIO_FAMILY1) || (defined MRFI_RADIO_FAMILY2) || (defined MRFI_RADIO_FAMILY5)\r
+\r
+#define __mrfi_LENGTH_FIELD_SIZE__      1\r
+#define __mrfi_ADDR_SIZE__              4\r
+#define __mrfi_MAX_PAYLOAD_SIZE__       20\r
+\r
+#define __mrfi_RX_METRICS_SIZE__        2\r
+#define __mrfi_RX_METRICS_RSSI_OFS__    0\r
+#define __mrfi_RX_METRICS_CRC_LQI_OFS__ 1\r
+#define __mrfi_RX_METRICS_CRC_OK_MASK__ 0x80\r
+#define __mrfi_RX_METRICS_LQI_MASK__    0x7F\r
+\r
+#define __mrfi_NUM_LOGICAL_CHANS__      4\r
+#define __mrfi_NUM_POWER_SETTINGS__     3\r
+\r
+#define __mrfi_BACKOFF_PERIOD_USECS__   250\r
+\r
+#define __mrfi_LENGTH_FIELD_OFS__       0\r
+#define __mrfi_DST_ADDR_OFS__           (__mrfi_LENGTH_FIELD_OFS__ + __mrfi_LENGTH_FIELD_SIZE__)\r
+#define __mrfi_SRC_ADDR_OFS__           (__mrfi_DST_ADDR_OFS__ + __mrfi_ADDR_SIZE__)\r
+#define __mrfi_PAYLOAD_OFS__            (__mrfi_SRC_ADDR_OFS__ + __mrfi_ADDR_SIZE__)\r
+\r
+#define __mrfi_HEADER_SIZE__            (2 * __mrfi_ADDR_SIZE__)\r
+#define __mrfi_FRAME_OVERHEAD_SIZE__    (__mrfi_LENGTH_FIELD_SIZE__ + __mrfi_HEADER_SIZE__)\r
+\r
+#define __mrfi_GET_PAYLOAD_LEN__(p)     ((p)->frame[__mrfi_LENGTH_FIELD_OFS__] - __mrfi_HEADER_SIZE__)\r
+#define __mrfi_SET_PAYLOAD_LEN__(p,x)   st( (p)->frame[__mrfi_LENGTH_FIELD_OFS__] = x + __mrfi_HEADER_SIZE__; )\r
+\r
+#endif\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                Radio Family 3 / Radio Family 4 / Radio Family 6\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#if (defined MRFI_RADIO_FAMILY3) || (defined MRFI_RADIO_FAMILY4) || (defined MRFI_RADIO_FAMILY6)\r
+\r
+#define __mrfi_LENGTH_FIELD_SIZE__      1\r
+#define __mrfi_FCF_SIZE__               2\r
+#define __mrfi_DSN_SIZE__               1\r
+#define __mrfi_ADDR_SIZE__              4\r
+#define __mrfi_MAX_PAYLOAD_SIZE__       20\r
+\r
+#define __mrfi_RX_METRICS_SIZE__        2\r
+#define __mrfi_RX_METRICS_RSSI_OFS__    0\r
+#define __mrfi_RX_METRICS_CRC_LQI_OFS__ 1\r
+#define __mrfi_RX_METRICS_CRC_OK_MASK__ 0x80\r
+#define __mrfi_RX_METRICS_LQI_MASK__    0x7F\r
+\r
+#define __mrfi_NUM_LOGICAL_CHANS__      4\r
+#define __mrfi_NUM_POWER_SETTINGS__     3\r
+\r
+#define __mrfi_BACKOFF_PERIOD_USECS__   250\r
+\r
+#define __mrfi_LENGTH_FIELD_OFS__       0\r
+#define __mrfi_FCF_OFS__                (__mrfi_LENGTH_FIELD_OFS__ +  __mrfi_LENGTH_FIELD_SIZE__)\r
+#define __mrfi_DSN_OFS__                (__mrfi_FCF_OFS__          +  __mrfi_FCF_SIZE__)\r
+#define __mrfi_DST_ADDR_OFS__           (__mrfi_DSN_OFS__          +  __mrfi_DSN_SIZE__)\r
+#define __mrfi_SRC_ADDR_OFS__           (__mrfi_DST_ADDR_OFS__     +  __mrfi_ADDR_SIZE__)\r
+#define __mrfi_PAYLOAD_OFS__            (__mrfi_SRC_ADDR_OFS__     +  __mrfi_ADDR_SIZE__)\r
+\r
+#define __mrfi_HEADER_SIZE__            ((2 * __mrfi_ADDR_SIZE__) + __mrfi_FCF_SIZE__ + __mrfi_DSN_SIZE__)\r
+#define __mrfi_FRAME_OVERHEAD_SIZE__    (__mrfi_LENGTH_FIELD_SIZE__ + __mrfi_HEADER_SIZE__)\r
+\r
+#define __mrfi_GET_PAYLOAD_LEN__(p)     ((p)->frame[__mrfi_LENGTH_FIELD_OFS__] - __mrfi_HEADER_SIZE__)\r
+#define __mrfi_SET_PAYLOAD_LEN__(p,x)   st( (p)->frame[__mrfi_LENGTH_FIELD_OFS__] = x + __mrfi_HEADER_SIZE__; )\r
+\r
+#endif\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                   Radio Family Commonality\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#define __mrfi_P_DST_ADDR__(p)          (&((p)->frame[__mrfi_DST_ADDR_OFS__]))\r
+#define __mrfi_P_SRC_ADDR__(p)          (&((p)->frame[__mrfi_SRC_ADDR_OFS__]))\r
+#define __mrfi_P_PAYLOAD__(p)           (&((p)->frame[__mrfi_PAYLOAD_OFS__]))\r
+\r
+\r
+/* ************************************************************************************************\r
+ *                                   Compile Time Integrity Checks\r
+ * ************************************************************************************************\r
+ */\r
+\r
+/* verify that only one supported radio is selected */\r
+#define MRFI_NUM_SUPPORTED_RADIOS_SELECTED   ((defined MRFI_CC1100) + \\r
+                                              (defined MRFI_CC1101) + \\r
+                                              (defined MRFI_CC1110) + \\r
+                                              (defined MRFI_CC1111) + \\r
+                                              (defined MRFI_CC1100E_470) + \\r
+                                              (defined MRFI_CC1100E_950) + \\r
+                                              (defined MRFI_CC2500) + \\r
+                                              (defined MRFI_CC2510) + \\r
+                                              (defined MRFI_CC2511) + \\r
+                                              (defined MRFI_CC2430) + \\r
+                                              (defined MRFI_CC2431) + \\r
+                                              (defined MRFI_CC2520) + \\r
+                                              (defined MRFI_CC430)  + \\r
+                                              (defined MRFI_CC2530))\r
+#if (MRFI_NUM_SUPPORTED_RADIOS_SELECTED == 0)\r
+#error "ERROR: A valid radio is not selected."\r
+#elif (MRFI_NUM_SUPPORTED_RADIOS_SELECTED > 1)\r
+#error "ERROR: More than one radio is selected."\r
+#endif\r
+\r
+/* verify that a radio family is selected */\r
+#if (!defined MRFI_RADIO_FAMILY1) && \\r
+    (!defined MRFI_RADIO_FAMILY2) && \\r
+    (!defined MRFI_RADIO_FAMILY3) && \\r
+    (!defined MRFI_RADIO_FAMILY4) && \\r
+    (!defined MRFI_RADIO_FAMILY5) && \\r
+    (!defined MRFI_RADIO_FAMILY6)\r
+#error "ERROR: A radio family has not been assigned."\r
+#endif\r
+\r
+\r
+/**************************************************************************************************\r
+ */\r
+#endif\r
diff --git a/chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/Components/mrfi/radios/common/mrfi_f1f2.c b/chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/Components/mrfi/radios/common/mrfi_f1f2.c
new file mode 100755 (executable)
index 0000000..5c8c30e
--- /dev/null
@@ -0,0 +1,491 @@
+/**************************************************************************************************\r
+  Revised:        $Date: 2007-07-06 11:19:00 -0700 (Fri, 06 Jul 2007) $\r
+  Revision:       $Revision: 13579 $\r
+\r
+  Copyright 2007 Texas Instruments Incorporated.  All rights reserved.\r
+\r
+  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+  the terms of a software license agreement between the user who downloaded the software,\r
+  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+  License. The License limits your use, and you acknowledge, that the Software may not be\r
+  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+  perform, display or sell this Software and/or its documentation for any purpose.\r
+\r
+  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS?  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+\r
+  Should you have any questions regarding your right to use this Software,\r
+  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+/* ~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=\r
+ *   MRFI (Minimal RF Interface)\r
+ *   Shared code between Radio Family 1 & Family 2\r
+ * ~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=\r
+ */\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                          Includes\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#include "mrfi.h"\r
+#include "mrfi_defs.h"\r
+#include "mrfi_f1f2.h"\r
+#include "bsp.h"\r
+#include "bsp_macros.h"\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                          Common\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+\r
+/* Packet automation control - base value is power up value whick has APPEND_STATUS enabled; no CRC autoflush */\r
+#define PKTCTRL1_BASE_VALUE         BV(2)\r
+#define PKTCTRL1_ADDR_FILTER_OFF    PKTCTRL1_BASE_VALUE\r
+#define PKTCTRL1_ADDR_FILTER_ON     (PKTCTRL1_BASE_VALUE | (BV(0)|BV(1)))\r
+\r
+#ifdef MRFI_ASSERTS_ARE_ON\r
+#define RX_FILTER_ADDR_INITIAL_VALUE  0xFF\r
+#endif\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                       Radio Abstraction\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+\r
+/* ----- Radio Family 1 ----- */\r
+#if (defined MRFI_RADIO_FAMILY1)\r
+#include "../family1/mrfi_spi.h"\r
+#define MRFI_WRITE_REGISTER(x,y)      mrfiSpiWriteReg( x, y )\r
+\r
+/* ----- Radio Family 2 ----- */\r
+#elif (defined MRFI_RADIO_FAMILY2)\r
+#define MRFI_WRITE_REGISTER(x,y)      st( x = y; )\r
+\r
+/* unknown or missing radio family */\r
+#else\r
+#error "ERROR: Expected radio family not specified.  Most likely a project issue."\r
+#endif\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                    Global Constants\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+const uint8_t mrfiBroadcastAddr[] = { 0xFF, 0xFF, 0xFF, 0xFF };\r
+\r
+/* verify number of table entries matches the corresponding #define */\r
+BSP_STATIC_ASSERT(MRFI_ADDR_SIZE == ((sizeof(mrfiBroadcastAddr)/sizeof(mrfiBroadcastAddr[0])) * sizeof(mrfiBroadcastAddr[0])));\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                    Local Constants\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+\r
+/*\r
+ *  Logical channel table - this table translates logical channel into\r
+ *  actual radio channel number.  Channel 0, the default channel, is\r
+ *  determined by the channel exported from SmartRF Studio.  The other\r
+ *  table entries are derived from that default.  Each derived channel is\r
+ *  masked with 0xFF to prevent generation of an illegal channel number.\r
+ *\r
+ *  This table is easily customized.  Just replace or add entries as needed.\r
+ *  If the number of entries changes, the corresponding #define must also\r
+ *  be adjusted.  It is located in mrfi_defs.h and is called __mrfi_NUM_LOGICAL_CHANS__.\r
+ *  The static assert below ensures that there is no mismatch.\r
+ */\r
+#if defined( MRFI_CC2500 ) || defined( MRFI_CC2510 ) || defined( MRFI_CC2511 )\r
+static const uint8_t mrfiLogicalChanTable[] =\r
+{\r
+  SMARTRF_SETTING_CHANNR,\r
+  103,\r
+  202,\r
+  212\r
+};\r
+#elif defined( MRFI_CC1100 ) || defined( MRFI_CC1101 ) || defined( MRFI_CC1110 ) || defined( MRFI_CC1111 )\r
+//static const uint8_t mrfiLogicalChanTable[] =\r
+//{\r
+//  SMARTRF_SETTING_CHANNR,\r
+//  50,\r
+//  80,\r
+//  110\r
+//};\r
+// [BM] Changed channel settings to comply with local regulations\r
+static const uint8_t mrfiLogicalChanTable[] =\r
+{\r
+#ifdef ISM_EU \r
+  0,\r
+#else\r
+  #ifdef ISM_US\r
+    20,  \r
+    #else\r
+      #ifdef ISM_LF\r
+        0,\r
+      #else \r
+        #error "Wrong ISM band specified (valid are ISM_LF, ISM_EU and ISM_US)"\r
+    #endif\r
+  #endif\r
+#endif\r
+  50,\r
+  80,\r
+  110\r
+};\r
+#elif defined(MRFI_CC1100E_470)\r
+static const uint8_t mrfiLogicalChanTable[] =\r
+{\r
+  SMARTRF_SETTING_CHANNR,\r
+  40,\r
+  60,\r
+  80\r
+};\r
+#elif defined(MRFI_CC1100E_950)\r
+static const uint8_t mrfiLogicalChanTable[] =\r
+{\r
+  SMARTRF_SETTING_CHANNR,\r
+  10,\r
+  15,\r
+  20\r
+};\r
+#else\r
+#error "ERROR: A valid radio is not specified."\r
+#endif\r
+\r
+/* verify number of table entries matches the corresponding #define */\r
+BSP_STATIC_ASSERT(__mrfi_NUM_LOGICAL_CHANS__ == ((sizeof(mrfiLogicalChanTable)/sizeof(mrfiLogicalChanTable[0])) * sizeof(mrfiLogicalChanTable[0])));\r
+\r
+/*\r
+ *  RF Power setting table - this table translates logical power value\r
+ *  to radio register setting.  The logical power value is used directly\r
+ *  as an index into the power setting table. The values in the table are\r
+ *  from low to high. The default settings set 3 values: -20 dBm, -10 dBm,\r
+ *  and 0 dBm. The default at startup is the highest value. Note that these\r
+ *  are approximate depending on the radio. Information is taken from the\r
+ *  data sheet.\r
+ *\r
+ *  This table is easily customized.  Just replace or add entries as needed.\r
+ *  If the number of entries changes, the corresponding #define must also\r
+ *  be adjusted.  It is located in mrfi_defs.h and is called __mrfi_NUM_POWER_SETTINGS__.\r
+ *  The static assert below ensures that there is no mismatch.\r
+ */\r
+#if defined( MRFI_CC2500 )\r
+static const uint8_t mrfiRFPowerTable[] =\r
+{\r
+  0x46,\r
+  0x97,\r
+  0xFE\r
+};\r
+\r
+#elif defined( MRFI_CC2510 ) || defined( MRFI_CC2511 )\r
+static const uint8_t mrfiRFPowerTable[] =\r
+{\r
+  0xC1,\r
+  0xCB,\r
+  0xFE\r
+};\r
+\r
+#elif defined( MRFI_CC1100 )\r
+static const uint8_t mrfiRFPowerTable[] =\r
+{\r
+  0x0D,\r
+  0x34,\r
+  0x8E\r
+};\r
+\r
+#elif defined( MRFI_CC1101 )\r
+static const uint8_t mrfiRFPowerTable[] =\r
+{\r
+  0x0F,\r
+  0x27,\r
+  0x50\r
+};\r
+\r
+#elif defined( MRFI_CC1110 ) || defined( MRFI_CC1111 )\r
+//static const uint8_t mrfiRFPowerTable[] =\r
+//{\r
+//  0x0E,\r
+//  0x27,\r
+//  0x50\r
+//};\r
+// [BM] Increase output power from -0.3dBm to +1.4dBm (433MHz) / +1.1dBm (868MHz) / +1.3dBm (915MHz) to compensate antenna loss  \r
+static const uint8_t mrfiRFPowerTable[] =\r
+{\r
+  0x0E,\r
+  0x27,\r
+#ifdef ISM_EU \r
+  0x8C,\r
+#else\r
+  #ifdef ISM_US\r
+    0x8B,  \r
+    #else\r
+      #ifdef ISM_LF\r
+         0x8D,\r
+      #else \r
+        #error "Wrong ISM band specified (valid are ISM_EU and ISM_US)"\r
+    #endif\r
+  #endif\r
+#endif\r
+};\r
+#elif defined(MRFI_CC1100E_470)\r
+static const uint8_t mrfiRFPowerTable[] =\r
+{\r
+ 0x0E,\r
+ 0x34,\r
+ 0x60\r
+};\r
+#elif defined(MRFI_CC1100E_950)\r
+static const uint8_t mrfiRFPowerTable[] =\r
+{\r
+  0x0E,\r
+  0x27,\r
+  0x8E\r
+};\r
+#endif\r
+\r
+/* verify number of table entries matches the corresponding #define */\r
+BSP_STATIC_ASSERT(__mrfi_NUM_POWER_SETTINGS__ == ((sizeof(mrfiRFPowerTable)/sizeof(mrfiRFPowerTable[0])) * sizeof(mrfiRFPowerTable[0])));\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                       Local Variables\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+static uint8_t mrfiRxFilterEnabled=0;\r
+static uint8_t mrfiRxFilterAddr[MRFI_ADDR_SIZE] = { RX_FILTER_ADDR_INITIAL_VALUE };\r
+\r
+\r
+/**************************************************************************************************\r
+ * @fn          MRFI_SetLogicalChannel\r
+ *\r
+ * @brief       Set logical channel.\r
+ *\r
+ * @param       chan - logical channel number\r
+ *\r
+ * @return      none\r
+ **************************************************************************************************\r
+ */\r
+void MRFI_SetLogicalChannel(uint8_t chan)\r
+{\r
+  /* logical channel is not valid? */\r
+  MRFI_ASSERT( chan < MRFI_NUM_LOGICAL_CHANS );\r
+\r
+  /* make sure radio is off before changing channels */\r
+  Mrfi_RxModeOff();\r
+\r
+  MRFI_WRITE_REGISTER( CHANNR, mrfiLogicalChanTable[chan] );\r
+\r
+  /* turn radio back on if it was on before channel change */\r
+  if(mrfiRadioState == MRFI_RADIO_STATE_RX)\r
+  {\r
+    Mrfi_RxModeOn();\r
+  }\r
+}\r
+\r
+/**************************************************************************************************\r
+ * @fn          MRFI_SetRFPwr\r
+ *\r
+ * @brief       Set RF Output power level.\r
+ *\r
+ * @param       idx - index into power table.\r
+ *\r
+ * @return      none\r
+ **************************************************************************************************\r
+ */\r
+void MRFI_SetRFPwr(uint8_t idx)\r
+{\r
+  /* is power level specified valid? */\r
+  MRFI_ASSERT( idx < MRFI_NUM_POWER_SETTINGS );\r
+\r
+  /* make sure radio is off before changing power levels */\r
+  Mrfi_RxModeOff();\r
+\r
+  MRFI_WRITE_REGISTER( PA_TABLE0, mrfiRFPowerTable[idx] );\r
+\r
+  /* turn radio back on if it was on before power level change */\r
+  if(mrfiRadioState == MRFI_RADIO_STATE_RX)\r
+  {\r
+    Mrfi_RxModeOn();\r
+  }\r
+}\r
+\r
+/**************************************************************************************************\r
+ * @fn          MRFI_SetRxAddrFilter\r
+ *\r
+ * @brief       Set the address used for filtering received packets.\r
+ *\r
+ * @param       pAddr - pointer to address to use for filtering\r
+ *\r
+ * @return      zero     : successfully set filter address\r
+ *              non-zero : illegal address\r
+ **************************************************************************************************\r
+ */\r
+uint8_t MRFI_SetRxAddrFilter(uint8_t * pAddr)\r
+{\r
+  /*\r
+   *  If first byte of filter address match fir byte of broadcast address,\r
+   *  there is a conflict with hardware filtering.\r
+   */\r
+  if (pAddr[0] == mrfiBroadcastAddr[0])\r
+  {\r
+    /* unable to set filter address */\r
+    return( 1 );\r
+  }\r
+\r
+  /*\r
+   *  Set the hardware address register.  The hardware address filtering only recognizes\r
+   *  a single byte but this does provide at least some automatic hardware filtering.\r
+   */\r
+  MRFI_WRITE_REGISTER( ADDR, pAddr[0] );\r
+\r
+  /* save a copy of the filter address */\r
+  {\r
+    uint8_t i;\r
+\r
+    for (i=0; i<MRFI_ADDR_SIZE; i++)\r
+    {\r
+      mrfiRxFilterAddr[i] = pAddr[i];\r
+    }\r
+  }\r
+\r
+  /* successfully set filter address */\r
+  return( 0 );\r
+}\r
+\r
+\r
+/**************************************************************************************************\r
+ * @fn          MRFI_EnableRxAddrFilter\r
+ *\r
+ * @brief       Enable received packet filtering.\r
+ *\r
+ * @param       none\r
+ *\r
+ * @return      none\r
+ **************************************************************************************************\r
+ */\r
+void MRFI_EnableRxAddrFilter(void)\r
+{\r
+  MRFI_ASSERT(mrfiRxFilterAddr[0] != mrfiBroadcastAddr[0]); /* filter address must be set before enabling filter */\r
+\r
+  /* set flag to indicate filtering is enabled */\r
+  mrfiRxFilterEnabled = 1;\r
+\r
+  /* enable hardware filtering on the radio */\r
+  MRFI_WRITE_REGISTER( PKTCTRL1, PKTCTRL1_ADDR_FILTER_ON );\r
+}\r
+\r
+\r
+/**************************************************************************************************\r
+ * @fn          MRFI_DisableRxAddrFilter\r
+ *\r
+ * @brief       Disable received packet filtering.\r
+ *\r
+ * @param       pAddr - pointer to address to test for filtering\r
+ *\r
+ * @return      none\r
+ **************************************************************************************************\r
+ */\r
+void MRFI_DisableRxAddrFilter(void)\r
+{\r
+  /* clear flag that indicates filtering is enabled */\r
+  mrfiRxFilterEnabled = 0;\r
+\r
+  /* disable hardware filtering on the radio */\r
+  MRFI_WRITE_REGISTER( PKTCTRL1, PKTCTRL1_ADDR_FILTER_OFF );\r
+}\r
+\r
+\r
+/**************************************************************************************************\r
+ * @fn          MRFI_RxAddrIsFiltered\r
+ *\r
+ * @brief       Determine if address is filtered.\r
+ *\r
+ * @param       none\r
+ *\r
+ * @return      zero     : address is not filtered\r
+ *              non-zero : address is filtered\r
+ **************************************************************************************************\r
+ */\r
+uint8_t MRFI_RxAddrIsFiltered(uint8_t * pAddr)\r
+{\r
+  uint8_t i;\r
+  uint8_t addrByte;\r
+  uint8_t filterAddrMatches;\r
+  uint8_t broadcastAddrMatches;\r
+\r
+  /* first check to see if filtering is even enabled */\r
+  if (!mrfiRxFilterEnabled)\r
+  {\r
+    /*\r
+     *  Filtering is not enabled, so by definition the address is\r
+     *  not filtered.  Return zero to indicate address is not filtered.\r
+     */\r
+    return( 0 );\r
+  }\r
+\r
+  /* clear address byte match counts */\r
+  filterAddrMatches    = 0;\r
+  broadcastAddrMatches = 0;\r
+\r
+  /* loop through address to see if there is a match to filter address of broadcast address */\r
+  for (i=0; i<MRFI_ADDR_SIZE; i++)\r
+  {\r
+    /* get byte from address to check */\r
+    addrByte = pAddr[i];\r
+\r
+    /* compare byte to filter address byte */\r
+    if (addrByte == mrfiRxFilterAddr[i])\r
+    {\r
+      filterAddrMatches++;\r
+    }\r
+    if (addrByte == mrfiBroadcastAddr[i])\r
+    {\r
+      broadcastAddrMatches++;\r
+    }\r
+  }\r
+\r
+  /*\r
+   *  If address is *not* filtered, either the "filter address match count" or\r
+   *  the "broadcast address match count" will equal the total number of bytes\r
+   *  in the address.\r
+   */\r
+  if ((broadcastAddrMatches == MRFI_ADDR_SIZE) || (filterAddrMatches == MRFI_ADDR_SIZE))\r
+  {\r
+    /* address *not* filtered, return zero */\r
+    return( 0 );\r
+  }\r
+  else\r
+  {\r
+    /* address filtered, return non-zero */\r
+    return( 1 );\r
+  }\r
+}\r
+\r
+\r
+/**************************************************************************************************\r
+ *                                  Compile Time Integrity Checks\r
+ **************************************************************************************************\r
+ */\r
+\r
+/*\r
+ *  These asserts happen if there is extraneous compiler padding of arrays.\r
+ *  Modify compiler settings for no padding, or, if that is not possible,\r
+ *  comment out the offending asserts.\r
+ */\r
+BSP_STATIC_ASSERT(sizeof(mrfiLogicalChanTable) == ((sizeof(mrfiLogicalChanTable)/sizeof(mrfiLogicalChanTable[0])) * sizeof(mrfiLogicalChanTable[0])));\r
+BSP_STATIC_ASSERT(sizeof(mrfiBroadcastAddr) == ((sizeof(mrfiBroadcastAddr)/sizeof(mrfiBroadcastAddr[0])) * sizeof(mrfiBroadcastAddr[0])));\r
+\r
+\r
+/**************************************************************************************************\r
+*/\r
diff --git a/chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/Components/mrfi/radios/common/mrfi_f1f2.h b/chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/Components/mrfi/radios/common/mrfi_f1f2.h
new file mode 100755 (executable)
index 0000000..7f84d49
--- /dev/null
@@ -0,0 +1,79 @@
+/**************************************************************************************************\r
+  Revised:        $Date: 2007-07-06 11:19:00 -0700 (Fri, 06 Jul 2007) $\r
+  Revision:       $Revision: 13579 $\r
+\r
+  Copyright 2007 Texas Instruments Incorporated.  All rights reserved.\r
+\r
+  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+  the terms of a software license agreement between the user who downloaded the software,\r
+  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+  License. The License limits your use, and you acknowledge, that the Software may not be\r
+  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+  perform, display or sell this Software and/or its documentation for any purpose.\r
+\r
+  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+\r
+  Should you have any questions regarding your right to use this Software,\r
+  contact Texas Instruments Incorporated at www.TI.com. \r
+**************************************************************************************************/\r
+\r
+/* ~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=\r
+ *   MRFI (Minimal RF Interface)\r
+ *   Include file for MRFI common code between\r
+ *   radio family 1 and radio family 2.\r
+ * ~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=\r
+ */\r
+\r
+#ifndef MRFI_COMMON_H\r
+#define MRFI_COMMON_H\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                       SmartRF Configuration\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#if (defined MRFI_CC1100)\r
+#include "smartrf/CC1100/smartrf_CC1100.h"\r
+#elif (defined MRFI_CC1101)\r
+#include "smartrf/CC1101/smartrf_CC1101.h"\r
+#elif (defined MRFI_CC2500)\r
+#include "smartrf/CC2500/smartrf_CC2500.h"\r
+#elif (defined MRFI_CC1110)\r
+#include "smartrf/CC1110/smartrf_CC1110.h"\r
+#elif (defined MRFI_CC1111)\r
+#include "smartrf/CC1111/smartrf_CC1111.h"\r
+#elif (defined MRFI_CC2510)\r
+#include "smartrf/CC2510/smartrf_CC2510.h"\r
+#elif (defined MRFI_CC2511)\r
+#include "smartrf/CC2511/smartrf_CC2511.h"\r
+#elif (defined MRFI_CC1100E_470)\r
+#include "smartrf/CC1100E/470/smartrf_CC1100E.h"\r
+#elif (defined MRFI_CC1100E_950)\r
+#include "smartrf/CC1100E/950/smartrf_CC1100E.h"\r
+#else\r
+#error "ERROR: A valid radio is not specified."\r
+#endif\r
+\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                         Prototypes\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+uint8_t MRFI_RxAddrIsFiltered(uint8_t * pAddr);\r
+\r
+\r
+/**************************************************************************************************\r
+ */\r
+#endif\r
diff --git a/chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/Components/mrfi/radios/family2/mrfi_radio.c b/chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/Components/mrfi/radios/family2/mrfi_radio.c
new file mode 100755 (executable)
index 0000000..0a7e4f2
--- /dev/null
@@ -0,0 +1,1330 @@
+/**************************************************************************************************\r
+  Revised:        $Date: 2007-07-06 11:19:00 -0700 (Fri, 06 Jul 2007) $\r
+  Revision:       $Revision: 13579 $\r
+\r
+  Copyright 2007-2008 Texas Instruments Incorporated.  All rights reserved.\r
+\r
+  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+  the terms of a software license agreement between the user who downloaded the software,\r
+  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+  License. The License limits your use, and you acknowledge, that the Software may not be\r
+  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+  perform, display or sell this Software and/or its documentation for any purpose.\r
+\r
+  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+\r
+  Should you have any questions regarding your right to use this Software,\r
+  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+/* ~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=\r
+ *   MRFI (Minimal RF Interface)\r
+ *   Radios: CC2510, CC2511, CC1110, CC1111\r
+ *   Primary code file for supported radios.\r
+ * ~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=\r
+ */\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                          Includes\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#include <string.h>\r
+#include "mrfi.h"\r
+#include "bsp.h"\r
+#include "bsp_macros.h"\r
+#include "mrfi_defs.h"\r
+#include "../common/mrfi_f1f2.h"\r
+#include "bsp_external/mrfi_board_defs.h"\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                          Defines\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#if (defined MRFI_CC2510) || (defined MRFI_CC2511)\r
+\r
+  #define MRFI_RSSI_OFFSET     71   /* for 250 kbsp. no units */\r
+\r
+ /* Worst case wait period in RX state before RSSI becomes valid.\r
+  * These numbers are from Design Note DN505 with added safety margin.\r
+  */\r
+  #define MRFI_RSSI_VALID_DELAY_US    1000\r
+\r
+#elif (defined MRFI_CC1110) || (defined MRFI_CC1111)\r
+\r
+  #define MRFI_RSSI_OFFSET     73   /* for 433MHz @ 250 kbsp. no units */\r
+\r
+  /* Worst case wait period in RX state before RSSI becomes valid.\r
+   * These numbers are from Design Note DN505 with added safety margin.\r
+   */\r
+  #define MRFI_RSSI_VALID_DELAY_US    1300\r
+\r
+#else\r
+  #error "ERROR: RSSI Offset value not defined for this radio.\r
+#endif\r
+\r
+\r
+#define MRFI_LENGTH_FIELD_OFS               __mrfi_LENGTH_FIELD_OFS__\r
+#define MRFI_LENGTH_FIELD_SIZE              __mrfi_LENGTH_FIELD_SIZE__\r
+#define MRFI_HEADER_SIZE                    __mrfi_HEADER_SIZE__\r
+#define MRFI_FRAME_BODY_OFS                 __mrfi_DST_ADDR_OFS__\r
+#define MRFI_BACKOFF_PERIOD_USECS           __mrfi_BACKOFF_PERIOD_USECS__\r
+\r
+#define MRFI_MIN_SMPL_FRAME_SIZE            (MRFI_HEADER_SIZE + NWK_HDR_SIZE)\r
+\r
+/* Max time we can be in a critical section within the delay function.\r
+ * This could be fine-tuned by observing the overhead is calling the bsp delay\r
+ * function. The overhead should be very small compared to this value.\r
+ * Note that the max value for this must be less than 19 usec with the\r
+ * default CLKCON.TICKSPD and CLKCON.CLOCKSPD settings and external 26 MHz\r
+ * crystal as a clock source (which we use). The CCxx11 USB uses a 48 MHz\r
+ * crystal to support USB divided down to 24 MHz for radio. This gives a\r
+ * maximum of 21 usec per chunk for these radios.\r
+ *\r
+ * Be careful of direct calls to Mrfi_DelayUsec().\r
+ */\r
+#define MRFI_MAX_DELAY_US 16 /* usec */\r
+\r
+\r
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\r
+ *    Radio Definitions\r
+ *   - - - - - - - - - -\r
+ */\r
+\r
+#if (defined MRFI_CC1110) || (defined MRFI_CC1111)\r
+#define MRFI_SETTING_PA_TABLE0    0x8E\r
+#define MRFI_RADIO_PARTNUM        0x01\r
+#define MRFI_RADIO_MIN_VERSION    3\r
+\r
+#elif (defined MRFI_CC2510) || (defined MRFI_CC2511)\r
+#define MRFI_SETTING_PA_TABLE0    0xFE\r
+#define MRFI_RADIO_PARTNUM        0x81\r
+#define MRFI_RADIO_MIN_VERSION    4\r
+\r
+#else\r
+#error "ERROR: Unspecified or unsupported radio."\r
+#endif\r
+\r
+/* bit of PARTNUM register that signifies chip has USB capability */\r
+#define MRFI_RADIO_PARTNUM_USB_BIT          0x10\r
+\r
+/* rx metrics definitions, known as appended "packet status bytes" in datasheet parlance */\r
+#define MRFI_RX_METRICS_CRC_OK_MASK         __mrfi_RX_METRICS_CRC_OK_MASK__\r
+#define MRFI_RX_METRICS_LQI_MASK            __mrfi_RX_METRICS_LQI_MASK__\r
+\r
+/* register RFST - command strobes */\r
+#define SFSTXON       0x00\r
+#define SCAL          0x01\r
+#define SRX           0x02\r
+#define STX           0x03\r
+#define SIDLE         0x04\r
+\r
+/* register MARCSTATE - state values */\r
+#define RXTX_SWITCH   0x15\r
+#define RX            0x0D\r
+#define IDLE          0x01\r
+\r
+/* register IEN2 - bit definitions */\r
+#define RFIE          BV(0)\r
+\r
+/* register S1CON - bit definitions */\r
+#define RFIF_1        BV(1)\r
+#define RFIF_0        BV(0)\r
+\r
+/* register DMAARM - bit definitions */\r
+#define ABORT         BV(7)\r
+\r
+/* register CLKCON - bit definitions */\r
+#define OSC           BV(6)\r
+\r
+/* register SLEEP - bit definitions */\r
+#define XOSC_STB      BV(6)\r
+#define OSC_PD        BV(2)\r
+\r
+/* register RFIF - bit definitions */\r
+#define IRQ_DONE      BV(4)\r
+#define IRQ_RXOVFL    BV(6)\r
+\r
+/* register RFIM - bit definitions */\r
+#define IM_DONE       BV(4)\r
+\r
+/* register PKTSTATUS - bit definitions */\r
+#define MRFI_PKTSTATUS_CCA   BV(4)\r
+#define MRFI_PKTSTATUS_CS    BV(6)\r
+\r
+/* random number generator */\r
+#define RCTRL_CLOCK_LFSR    BV(2)\r
+\r
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\r
+ *    Radio Register Settings\r
+ *   - - - - - - - - - - - - -\r
+ */\r
+\r
+/* Main Radio Control State Machine control configuration - Calibrate when going from IDLE to RX or TX. */\r
+#define MRFI_SETTING_MCSM0      0x14\r
+\r
+/* Main Radio Control State Machine control configuration - Go to RX state after RX\r
+ * and go to IDLE after TX.\r
+ */\r
+#define MRFI_SETTING_MCSM1      0x3C\r
+\r
+/*\r
+ *  Packet Length - Setting for maximum allowed packet length.\r
+ *  The PKTLEN setting does not include the length field but maximum frame size does.\r
+ *  Subtract length field size from maximum frame size to get value for PKTLEN.\r
+ */\r
+#define MRFI_SETTING_PKTLEN     (MRFI_MAX_FRAME_SIZE - MRFI_LENGTH_FIELD_SIZE)\r
+\r
+/* Packet automation control - Original value except WHITE_DATA is extracted from SmartRF setting. */\r
+#define MRFI_SETTING_PKTCTRL0   (0x05 | (SMARTRF_SETTING_PKTCTRL0 & BV(6)))\r
+\r
+/* Packet automation control - base value is power up value whick has APPEND_STATUS enabled */\r
+#define MRFI_SETTING_PKTCTRL1_BASE              BV(2)\r
+#define MRFI_SETTING_PKTCTRL1_ADDR_FILTER_OFF   MRFI_SETTING_PKTCTRL1_BASE\r
+#define MRFI_SETTING_PKTCTRL1_ADDR_FILTER_ON    (MRFI_SETTING_PKTCTRL1_BASE | (BV(1)|BV(0)))\r
+\r
+/* early versions of SmartRF Studio did not export this value */\r
+#ifndef SMARTRF_SETTING_FSCAL1\r
+#define SMARTRF_SETTING_FSCAL1  0x80\r
+#endif\r
+\r
+/* TEST0 Various Test Settings - the VCO_SEL_CAL_EN bit must be zero */\r
+#define MRFI_SETTING_TEST0      (SMARTRF_SETTING_TEST0 & ~(BV(1)))\r
+\r
+/* if SmartRF setting for PA_TABLE0 is supplied, use that instead of built-in default */\r
+#ifdef SMARTRF_SETTING_PA_TABLE0\r
+#undef MRFI_SETTING_PA_TABLE0\r
+#define MRFI_SETTING_PA_TABLE0   SMARTRF_SETTING_PA_TABLE0\r
+#endif\r
+\r
+\r
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\r
+ *    DMA Configuration Values\r
+ *   - - - - - - - - - - - - - -\r
+ */\r
+\r
+/* DMA channel number */\r
+#define MRFI_DMA_CHAN               0\r
+\r
+/* DMA configuration data structure size */\r
+#define RXTX_DMA_STRUCT_SIZE        8\r
+\r
+/* byte offset 4 (upper bits of LEN are never used so are always set to zero) */\r
+#define RXTX_DMA_VLEN_XFER_BYTES_PLUS_1       ((/*  VLEN = */( 1 ))<<5)\r
+#define RXTX_DMA_VLEN_XFER_BYTES_PLUS_3       ((/*  VLEN = */( 4 ))<<5)\r
+\r
+/* byte offset 5 */\r
+#define RXTX_DMA_LEN            (MRFI_MAX_FRAME_SIZE + MRFI_RX_METRICS_SIZE)\r
+\r
+/* byte offset 6 */\r
+#define RXTX_DMA_WORDSIZE       (/*  WORDSIZE = */(  0 )  << 7)\r
+#define RXTX_DMA_TMODE          (/*     TMODE = */(  0 )  << 5)\r
+#define RXTX_DMA_TRIG           (/*      TRIG = */( 19 )  << 0)\r
+\r
+/* byte offset 7 */\r
+#define RXTX_DMA_SRCINC_PLUS_1  (/*    SRCINC = */( 1 )  << 6)\r
+#define RXTX_DMA_SRCINC_NONE    (/*    SRCINC = */( 0 )  << 6)\r
+#define RXTX_DMA_DESTINC_PLUS_1 (/*   DESTINC = */( 1 )  << 4)\r
+#define RXTX_DMA_DESTINC_NONE   (/*   DESTINC = */( 0 )  << 4)\r
+#define RXTX_DMA_IRQMASK        (/*   IRQMASK = */( 0 )  << 3)\r
+#define RXTX_DMA_M8             (/*        M8 = */( 0 )  << 2)\r
+#define RXTX_DMA_PRIORITY       (/*  PRIORITY = */( 1 )  << 0)\r
+\r
+  /* The SW timer is calibrated by adjusting the call to the microsecond delay\r
+   * routine. This allows maximum calibration control with repects to the longer\r
+   * times requested by applicationsd and decouples internal from external calls\r
+   * to the microsecond routine which can be calibrated independently.\r
+   */\r
+#if defined(SW_TIMER)\r
+#define APP_USEC_VALUE    100\r
+#else\r
+#define APP_USEC_VALUE    500\r
+#endif\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                           Macros\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+#define HIGH_BYTE_OF_WORD(x)            ((uint8_t) (((uint16_t)(x)) >> 8))\r
+#define LOW_BYTE_OF_WORD(x)             ((uint8_t) (((uint16_t)(x)) & 0xFF))\r
+\r
+\r
+\r
+/* There is no bit in h/w to tell if RSSI in the register is valid or not.\r
+ * The hardware needs to be in RX state for a certain amount of time before\r
+ * a valid RSSI value is calculated and placed in the register. This min\r
+ * wait time is defined by MRFI_BOARD_RSSI_VALID_DELAY_US. We don't need to\r
+ * add such delay every time RSSI value is needed. If the Carier Sense signal\r
+ * is high or CCA signal is high, we know that the RSSI value must be valid.\r
+ * We use that knowledge to reduce our wait time. We break down the delay loop\r
+ * in multiple chunks and during each iteration, check for the CS and CCA\r
+ * signal. If either of these signals is high, we return immediately. Else,\r
+ * we wait for the max delay specified.\r
+ */\r
+#define MRFI_RSSI_VALID_WAIT()                                                \\r
+{                                                                             \\r
+  int16_t delay = MRFI_RSSI_VALID_DELAY_US;                                   \\r
+  do                                                                          \\r
+  {                                                                           \\r
+    if(PKTSTATUS & (MRFI_PKTSTATUS_CCA | MRFI_PKTSTATUS_CS))  \\r
+    {                                                                         \\r
+      break;                                                                  \\r
+    }                                                                         \\r
+    Mrfi_DelayUsec(64); /* sleep */                                           \\r
+    delay -= 64;                                                              \\r
+  }while(delay > 0);                                                          \\r
+}                                                                             \\r
+\r
+#define MRFI_STROBE_IDLE_AND_WAIT()  \\r
+{                                    \\r
+  RFST = SIDLE;                      \\r
+  while (MARCSTATE != IDLE) ;        \\r
+}\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                       Local Prototypes\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+static void   Mrfi_RxModeOn(void);\r
+static void   Mrfi_RxModeOff(void);\r
+static void   Mrfi_DelayUsec(uint16_t);\r
+static void   Mrfi_RandomBackoffDelay(void);\r
+static int8_t Mrfi_CalculateRssi(uint8_t);\r
+static void   Mrfi_DelayUsecSem(uint16_t);\r
+// [BM] Need this prototype declaration due to strict prototyping turned on\r
+void          MRFI_RfIsr(void);\r
+\r
+/* ------------------------------------------------------------------------------------------------\r
+ *                                       Local Variables\r
+ * ------------------------------------------------------------------------------------------------\r
+ */\r
+static uint8_t mrfiRadioState  = MRFI_RADIO_STATE_UNKNOWN;\r
+static mrfiPacket_t mrfiIncomingPacket;\r
+\r
+/* reply delay support */\r
+static volatile uint8_t  sKillSem = 0;\r
+static volatile uint8_t  sReplyDelayContext = 0;\r
+static          uint16_t sReplyDelayScalar = 0;\r
+static          uint16_t sBackoffHelper = 0;\r
+\r
+#if (MRFI_DMA_CHAN == 0)\r
+uint8_t XDATA mrfiDmaCfg[RXTX_DMA_STRUCT_SIZE];\r
+#define MRFI_DMA_CFG_ADDRESS   &mrfiDmaCfg[0]\r
+#endif\r
+\r
+// [BM] Frequency offset set during calibration\r
+extern uint8_t frequoffset;\r
+\r
+/**************************************************************************************************\r
+ * @fn          MRFI_Init\r
+ *\r
+ * @brief       Initialize MRFI.\r
+ *\r
+ * @param       none\r
+ *\r
+ * @return      none\r
+ **************************************************************************************************\r
+ */\r
+void MRFI_Init(void)\r
+{\r
+  /* ------------------------------------------------------------------\r
+   *    Run-time integrity checks\r
+   *   ---------------------------\r
+   */\r
+\r
+  memset(&mrfiIncomingPacket, 0x0, sizeof(mrfiIncomingPacket));\r
+  /* verify the correct radio is installed */\r
+  MRFI_ASSERT( (PARTNUM & ~MRFI_RADIO_PARTNUM_USB_BIT) == MRFI_RADIO_PARTNUM );\r
+  MRFI_ASSERT( VERSION >= MRFI_RADIO_MIN_VERSION );  /* obsolete radio version */\r
+\r
+\r
+  /* ------------------------------------------------------------------\r
+   *    Switch to high speed crystal oscillator.\r
+   *   ------------------------------------------\r
+   */\r
+\r
+  /* power up both oscillators - high speed crystal oscillator will power up,\r
+   * the RC oscillator will remain powered-up and selected.\r
+   */\r
+  SLEEP &= ~OSC_PD;\r
+\r
+  /* wait for high speed crystal to become stable */\r
+  while(!(SLEEP & XOSC_STB));\r
+\r
+  /* switch from RC oscillator to high speed crystal oscillator */\r
+  CLKCON &= ~OSC;\r
+\r
+  /* power down the oscillator not selected, i.e. the RC oscillator */\r
+  SLEEP |= OSC_PD;\r
+\r
+  /* ------------------------------------------------------------------\r
+   *    Variable Initialization\r
+   *   -------------------------\r
+   */\r
+\r
+\r
+  /* ------------------------------------------------------------------\r
+   *    DMA Initialization\r
+   *   --------------------\r
+   */\r
+#if (MRFI_DMA_CHAN == 0)\r
+  DMA0CFGH = HIGH_BYTE_OF_WORD( &mrfiDmaCfg[0] );\r
+  DMA0CFGL = LOW_BYTE_OF_WORD ( &mrfiDmaCfg[0] );\r
+#endif\r
+\r
+\r
+  /* ------------------------------------------------------------------\r
+   *    Configure radio\r
+   *   -----------------\r
+   */\r
+\r
+  /* internal radio register configuration */\r
+  MCSM1     = MRFI_SETTING_MCSM1;\r
+  MCSM0     = MRFI_SETTING_MCSM0;\r
+  PKTLEN    = MRFI_SETTING_PKTLEN;\r
+  PKTCTRL0  = MRFI_SETTING_PKTCTRL0;\r
+  PA_TABLE0 = MRFI_SETTING_PA_TABLE0;\r
+  TEST0     = MRFI_SETTING_TEST0;\r
+\r
+  /* imported SmartRF radio register configuration */\r
+  FSCTRL1  = SMARTRF_SETTING_FSCTRL1;\r
+  //FSCTRL0  = SMARTRF_SETTING_FSCTRL0;\r
+  // [BM] Fine-tune synthesizer with global calibration value  \r
+  FSCTRL0  = frequoffset;\r
+  FREQ2    = SMARTRF_SETTING_FREQ2;\r
+  FREQ1    = SMARTRF_SETTING_FREQ1;\r
+  FREQ0    = SMARTRF_SETTING_FREQ0;\r
+  MDMCFG4  = SMARTRF_SETTING_MDMCFG4;\r
+  MDMCFG3  = SMARTRF_SETTING_MDMCFG3;\r
+  MDMCFG2  = SMARTRF_SETTING_MDMCFG2;\r
+  MDMCFG1  = SMARTRF_SETTING_MDMCFG1;\r
+  MDMCFG0  = SMARTRF_SETTING_MDMCFG0;\r
+  DEVIATN  = SMARTRF_SETTING_DEVIATN;\r
+  FOCCFG   = SMARTRF_SETTING_FOCCFG;\r
+  BSCFG    = SMARTRF_SETTING_BSCFG;\r
+  AGCCTRL2 = SMARTRF_SETTING_AGCCTRL2;\r
+  AGCCTRL1 = SMARTRF_SETTING_AGCCTRL1;\r
+  AGCCTRL0 = SMARTRF_SETTING_AGCCTRL0;\r
+  FREND1   = SMARTRF_SETTING_FREND1;\r
+  FREND0   = SMARTRF_SETTING_FREND0;\r
+  FSCAL3   = SMARTRF_SETTING_FSCAL3;\r
+  FSCAL2   = SMARTRF_SETTING_FSCAL2;\r
+  FSCAL1   = SMARTRF_SETTING_FSCAL1;\r
+  FSCAL0   = SMARTRF_SETTING_FSCAL0;\r
+  TEST2    = SMARTRF_SETTING_TEST2;\r
+  TEST1    = SMARTRF_SETTING_TEST1;\r
+\r
+\r
+  /* Initial radio state is IDLE state */\r
+  mrfiRadioState = MRFI_RADIO_STATE_IDLE;\r
+\r
+  /* set default channel */\r
+  MRFI_SetLogicalChannel( 0 );\r
+\r
+  /* Seed for the Random Number Generator */\r
+  {\r
+    uint16_t rndSeed = 0x0;\r
+\r
+    /* Put radio in RX mode */\r
+    RFST = SRX;\r
+\r
+    /* Delay for valid RSSI. Otherwise same RSSI\r
+     * value could be read every time.\r
+     */\r
+    MRFI_RSSI_VALID_WAIT();\r
+\r
+    {\r
+      uint8_t i;\r
+      for(i=0; i<16; i++)\r
+      {\r
+        /* use most random bit of RSSI to populate the random seed */\r
+        rndSeed = (rndSeed << 1) | (RSSI & 0x01);\r
+      }\r
+    }\r
+\r
+    /* Force the seed to be non-zero by setting one bit, just in case... */\r
+    rndSeed |= 0x0080;\r
+\r
+    /* Need to write to RNDL twice to seed it */\r
+    RNDL = rndSeed & 0xFF;\r
+    RNDL = rndSeed >> 8;\r
+\r
+    /* Call RxModeOff() instead of an idle strobe.\r
+     * This will clean up any flags that were set while radio was in rx state.\r
+     */\r
+    Mrfi_RxModeOff();\r
+  }\r
+\r
+\r
+  /*****************************************************************************************\r
+   *                            Compute reply delay scalar\r
+   *\r
+   * Formula from data sheet for all the narrow band radios is:\r
+   *\r
+   *                (256 + DATAR_Mantissa) * 2^(DATAR_Exponent)\r
+   * DATA_RATE =    ------------------------------------------ * f(xosc)\r
+   *                                    2^28\r
+   *\r
+   * To try and keep some accuracy we change the exponent of the denominator\r
+   * to (28 - (exponent from the configuration register)) so we do a division\r
+   * by a smaller number. We find the power of 2 by shifting.\r
+   *\r
+   * The maximum delay needed depends on the MAX_APP_PAYLOAD parameter. Figure\r
+   * out how many bits that will be when overhead is included. Bits/bits-per-second\r
+   * is seconds to transmit (or receive) the maximum frame. We multiply this number\r
+   * by 1000 to find the time in milliseconds. We then additionally multiply by\r
+   * 10 so we can add 5 and divide by 10 later, thus rounding up to the number of\r
+   * milliseconds. This last won't matter for slow transmissions but for faster ones\r
+   * we want to err on the side of being conservative and making sure the radio is on\r
+   * to receive the reply. The semaphore monitor will shut it down. The delay adds in\r
+   * a platform fudge factor that includes processing time on peer plus lags in Rx and\r
+   * processing time on receiver's side. Also includes round trip delays from CCA\r
+   * retries. This portion is included in PLATFORM_FACTOR_CONSTANT defined in mrfi.h.\r
+   *\r
+   * Note: We assume a 26 MHz oscillator frequency for the non-USB target radios\r
+   *       and 24 MHz for the USB-target radios.\r
+   * ***************************************************************************************\r
+   */\r
+#if defined(MRFI_CC2510)  ||  defined(MRFI_CC1110)\r
+#define   MRFI_RADIO_OSC_FREQ         26000000\r
+#elif defined(MRFI_CC2511)  ||  defined(MRFI_CC1111)\r
+#define   MRFI_RADIO_OSC_FREQ         24000000\r
+#endif\r
+\r
+#define   PHY_PREAMBLE_SYNC_BYTES    8\r
+\r
+  {\r
+    uint32_t dataRate, bits;\r
+    uint16_t exponent, mantissa;\r
+\r
+    /* mantissa is in MDMCFG3 */\r
+    mantissa = 256 + SMARTRF_SETTING_MDMCFG3;\r
+\r
+    /* exponent is lower nibble of MDMCFG4. */\r
+    exponent = 28 - (SMARTRF_SETTING_MDMCFG4 & 0x0F);\r
+\r
+    /* we can now get data rate */\r
+    dataRate = mantissa * (MRFI_RADIO_OSC_FREQ>>exponent);\r
+\r
+    bits = ((uint32_t)((PHY_PREAMBLE_SYNC_BYTES + MRFI_MAX_FRAME_SIZE)*8))*10000;\r
+\r
+    /* processing on the peer + the Tx/Rx time plus more */\r
+    sReplyDelayScalar = PLATFORM_FACTOR_CONSTANT + (((bits/dataRate)+5)/10);\r
+\r
+    /* This helper value is used to scale the backoffs during CCA. At very\r
+     * low data rates we need to backoff longer to prevent continual sampling\r
+     * of valid frames which take longer to send at lower rates. Use the scalar\r
+     * we just calculated divided by 32. With the backoff algorithm backing\r
+     * off up to 16 periods this will result in waiting up to about 1/2 the total\r
+     * scalar value. For high data rates this does not contribute at all. Value\r
+     * is in microseconds.\r
+     */\r
+    sBackoffHelper = MRFI_BACKOFF_PERIOD_USECS + (sReplyDelayScalar>>5)*1000;\r
+  }\r
+\r
+  /* ------------------------------------------------------------------\r
+   *    Configure interrupts\r
+   *   ----------------------\r
+   */\r
+\r
+  /* enable general RF interrupts */\r
+  IEN2 |= RFIE;\r
+\r
+  /* enable global interrupts */\r
+  BSP_ENABLE_INTERRUPTS();\r
+}\r
+\r
+\r
+/**************************************************************************************************\r
+ * @fn          MRFI_Transmit\r
+ *\r
+ * @brief       Transmit a packet using CCA algorithm.\r
+ *\r
+ * @param       pPacket - pointer to packet to transmit\r
+ *\r
+ * @return      Return code indicates success or failure of transmit:\r
+ *                  MRFI_TX_RESULT_SUCCESS - transmit succeeded\r
+ *                  MRFI_TX_RESULT_FAILED  - transmit failed because CCA failed\r
+ **************************************************************************************************\r
+ */\r
+uint8_t MRFI_Transmit(mrfiPacket_t * pPacket, uint8_t txType)\r
+{\r
+  uint8_t ccaRetries;\r
+  uint8_t returnValue = MRFI_TX_RESULT_SUCCESS;\r
+\r
+  /* radio must be awake to transmit */\r
+  MRFI_ASSERT( mrfiRadioState != MRFI_RADIO_STATE_OFF );\r
+\r
+  /* Turn off reciever. We can ignore/drop incoming packets during transmit. */\r
+  Mrfi_RxModeOff();\r
+\r
+  /* configure DMA channel for transmit */\r
+  {\r
+    uint8_t XDATA * pCfg;\r
+\r
+    pCfg = MRFI_DMA_CFG_ADDRESS;\r
+    *pCfg++ = /* offset 0 : */  HIGH_BYTE_OF_WORD( &(pPacket->frame[0]) );  /* SRCADDRH */\r
+    *pCfg++ = /* offset 1 : */  LOW_BYTE_OF_WORD ( &(pPacket->frame[0]) );  /* SRCADDRL */\r
+    *pCfg++ = /* offset 2 : */  HIGH_BYTE_OF_WORD( &X_RFD );  /* DSTADDRH */\r
+    *pCfg++ = /* offset 3 : */  LOW_BYTE_OF_WORD ( &X_RFD );  /* DSTADDRL */\r
+    *pCfg++ = /* offset 4 : */  RXTX_DMA_VLEN_XFER_BYTES_PLUS_1;\r
+    *pCfg++ = /* offset 5 : */  RXTX_DMA_LEN;\r
+    *pCfg++ = /* offset 6 : */  RXTX_DMA_WORDSIZE | RXTX_DMA_TMODE | RXTX_DMA_TRIG;\r
+    *pCfg   = /* offset 7 : */  RXTX_DMA_SRCINC_PLUS_1 | RXTX_DMA_DESTINC_NONE |\r
+                                RXTX_DMA_IRQMASK | RXTX_DMA_M8 | RXTX_DMA_PRIORITY;\r
+  }\r
+\r
+  /* ------------------------------------------------------------------\r
+   *    Immediate transmit\r
+   *   ---------------------\r
+   */\r
+  if (txType == MRFI_TX_TYPE_FORCED)\r
+  {\r
+    /* ARM the DMA channel */\r
+    DMAARM |= BV( MRFI_DMA_CHAN );\r
+\r
+    /* Strobe TX */\r
+    RFST = STX;\r
+\r
+    /* wait for transmit to complete */\r
+    while (!(RFIF & IRQ_DONE));\r
+\r
+    /* Clear the interrupt flag */\r
+    RFIF &= ~IRQ_DONE;\r
+  }\r
+  else\r
+  {\r
+    /* ------------------------------------------------------------------\r
+     *    CCA transmit\r
+     *   ---------------\r
+     */\r
+\r
+    MRFI_ASSERT( txType == MRFI_TX_TYPE_CCA );\r
+\r
+    /* set number of CCA retries */\r
+    ccaRetries = MRFI_CCA_RETRIES;\r
+\r
+    /* ===============================================================================\r
+     *    CCA Loop\r
+     *  =============\r
+     */\r
+    while(1)\r
+    {\r
+      /* ARM the DMA channel */\r
+      DMAARM |= BV( MRFI_DMA_CHAN );\r
+\r
+      /* strobe to enter receive mode */\r
+      RFST = SRX;\r
+\r
+      /* Wait for radio to enter the RX mode */\r
+      while(MARCSTATE != RX);\r
+\r
+      /* wait for the rssi to be valid. */\r
+      MRFI_RSSI_VALID_WAIT();\r
+\r
+      /* Strobe TX-if-CCA */\r
+      RFST = STX;\r
+\r
+      if(MARCSTATE != RX) /* ck if exited rx state */\r
+      {\r
+        /* ------------------------------------------------------------------\r
+         *    Clear Channel Assessment passed.\r
+         * ----------------------------------\r
+         */\r
+\r
+        /* wait for transmit to complete */\r
+        while (!(RFIF & IRQ_DONE));\r
+\r
+        /* Clear the interrupt flag */\r
+        RFIF &= ~IRQ_DONE;\r
+\r
+        break;\r
+      }\r
+      else\r
+      {\r
+        /* ------------------------------------------------------------------\r
+         *    Clear Channel Assessment failed.\r
+         * ----------------------------------\r
+         */\r
+\r
+        /* Retry ? */\r
+        if (ccaRetries != 0)\r
+        {\r
+          /* turn off reciever to conserve power during backoff */\r
+          Mrfi_RxModeOff();\r
+\r
+          /* delay for a random number of backoffs */\r
+          Mrfi_RandomBackoffDelay();\r
+\r
+          /* decrement CCA retries before loop continues */\r
+          ccaRetries--;\r
+        }\r
+        else  /* No CCA retries are left, abort */\r
+        {\r
+          /* set return value for failed transmit and break */\r
+          returnValue = MRFI_TX_RESULT_FAILED;\r
+          break;\r
+        }\r
+      } /* CCA Failed */\r
+    } /* CCA loop */\r
+  }/* txType is CCA */\r
+\r
+\r
+  /* Done with TX. Clean up time... */\r
+\r
+  /* turn radio back off to put it in a known state */\r
+  Mrfi_RxModeOff();\r
+\r
+  /* If the radio was in RX state when transmit was attempted,\r
+   * put it back in RX state.\r
+   */\r
+  if(mrfiRadioState == MRFI_RADIO_STATE_RX)\r
+  {\r
+    Mrfi_RxModeOn();\r
+  }\r
+\r
+  return( returnValue );\r
+}\r
+\r
+\r
+/**************************************************************************************************\r
+ * @fn          MRFI_Receive\r
+ *\r
+ * @brief       Copies last packet received to the location specified.\r
+ *              This function is meant to be called after the ISR informs\r
+ *              higher level code that there is a newly received packet.\r
+ *\r
+ * @param       pPacket - pointer to location of where to copy received packet\r
+ *\r
+ * @return      none\r
+ **************************************************************************************************\r
+ */\r
+void MRFI_Receive(mrfiPacket_t * pPacket)\r
+{\r
+  *pPacket = mrfiIncomingPacket;\r
+}\r
+\r
+\r
+/**************************************************************************************************\r
+ * @fn          MRFI_RfIsr\r
+ *\r
+ * @brief       -\r
+ *\r
+ * @param       none\r
+ *\r
+ * @return      none\r
+ **************************************************************************************************\r
+ */\r
+// [BM] Function is called from application RF_VECTOR ISR  \r
+//BSP_ISR_FUNCTION( MRFI_RfIsr, RF_VECTOR )\r
+void MRFI_RfIsr(void)\r
+{\r
+  uint8_t frameLen;\r
+\r
+  /* We should receive this interrupt only in RX state\r
+   * Should never receive it if RX was turned On only for\r
+   * some internal mrfi processing like - during CCA.\r
+   * Otherwise something is terribly wrong.\r
+   */\r
+  MRFI_ASSERT( mrfiRadioState == MRFI_RADIO_STATE_RX );\r
+\r
+  /* Check for overflow */\r
+  if ((RFIF & IRQ_DONE) && (RFIF & IRQ_RXOVFL))\r
+  {\r
+    RFIF &= ~IRQ_DONE;\r
+    RFIF &= ~IRQ_RXOVFL;\r
+    S1CON &= ~(RFIF_1 | RFIF_0); /* Clear MCU interrupt flag */\r
+\r
+    /* Only way out of this is to go to IDLE state */\r
+    Mrfi_RxModeOff();\r
+\r
+    /* zero-out MRFI buffer to help NWK eliminate undetected rogue frames if they pass here */\r
+    memset(mrfiIncomingPacket.frame, 0x00, sizeof(mrfiIncomingPacket.frame));\r
+\r
+    /* OK to start again... */\r
+    Mrfi_RxModeOn();\r
+\r
+    return;\r
+  }\r
+\r
+  RFIF &= ~IRQ_DONE;           /* Clear the interrupt at the source */\r
+  S1CON &= ~(RFIF_1 | RFIF_0); /* Clear MCU interrupt flag */\r
+\r
+  /* ------------------------------------------------------------------\r
+   *    Copy RX Metrics into packet structure\r
+   *   ---------------------------------------\r
+   */\r
+  {\r
+    uint8_t offsetToRxMetrics = mrfiIncomingPacket.frame[MRFI_LENGTH_FIELD_OFS] + 1;\r
+    /* The metrics were DMA'd so they may reside on the frame buffer rather than the\r
+     * metrics buffer. Get them to the proper location.\r
+     */\r
+    memmove(mrfiIncomingPacket.rxMetrics,&mrfiIncomingPacket.frame[offsetToRxMetrics], sizeof(mrfiIncomingPacket.rxMetrics));\r
+  }\r
+\r
+\r
+  /* ------------------------------------------------------------------\r
+   *    CRC  and frame length check\r
+   *   ------------\r
+   */\r
+\r
+  frameLen = mrfiIncomingPacket.frame[MRFI_LENGTH_FIELD_OFS];\r
+  /* determine if CRC or length check failed */\r
+  if (!(mrfiIncomingPacket.rxMetrics[MRFI_RX_METRICS_CRC_LQI_OFS] & MRFI_RX_METRICS_CRC_OK_MASK) ||\r
+       ((frameLen + MRFI_LENGTH_FIELD_SIZE) > MRFI_MAX_FRAME_SIZE) ||\r
+       (frameLen < MRFI_MIN_SMPL_FRAME_SIZE)\r
+     )\r
+  {\r
+    /* CRC or length check failed - do nothing, skip to end */\r
+  }\r
+  else\r
+  {\r
+    /* CRC passed - continue processing */\r
+\r
+    /* ------------------------------------------------------------------\r
+     *    Filtering\r
+     *   -----------\r
+     */\r
+\r
+    /* if address is not filtered, receive is successful */\r
+    if (!MRFI_RxAddrIsFiltered(MRFI_P_DST_ADDR(&mrfiIncomingPacket)))\r
+    {\r
+      {\r
+        /* ------------------------------------------------------------------\r
+         *    Receive successful\r
+         *   --------------------\r
+         */\r
+\r
+        /* Convert the raw RSSI value and do offset compensation for this radio */\r
+        mrfiIncomingPacket.rxMetrics[MRFI_RX_METRICS_RSSI_OFS] =\r
+            Mrfi_CalculateRssi(mrfiIncomingPacket.rxMetrics[MRFI_RX_METRICS_RSSI_OFS]);\r
+\r
+        /* Remove the CRC valid bit from the LQI byte */\r
+        mrfiIncomingPacket.rxMetrics[MRFI_RX_METRICS_CRC_LQI_OFS] =\r
+          (mrfiIncomingPacket.rxMetrics[MRFI_RX_METRICS_CRC_LQI_OFS] & MRFI_RX_METRICS_LQI_MASK);\r
+\r
+\r
+        /* call external, higher level "receive complete" processing routine */\r
+        MRFI_RxCompleteISR();\r
+      }\r
+   }\r
+  }\r
+\r
+  /* zero-out MRFI buffer to help NWK eliminate undetected rogue frames if they pass here */\r
+  memset(mrfiIncomingPacket.frame, 0x00, sizeof(mrfiIncomingPacket.frame));\r
+\r
+  /* arm DMA channel for next receive */\r
+  DMAARM |= BV( MRFI_DMA_CHAN );\r
+}\r
+\r
+\r
+/**************************************************************************************************\r
+ * @fn          MRFI_Sleep\r
+ *\r
+ * @brief       Request radio go to sleep.\r
+ *\r
+ * @param       none\r
+ *\r
+ * @return      zero : if successfully went to sleep\r
+ *              non-zero : if sleep was not entered\r
+ **************************************************************************************************\r
+ */\r
+void MRFI_Sleep(void)\r
+{\r
+  /* If radio is not asleep, put it to sleep */\r
+  if(mrfiRadioState != MRFI_RADIO_STATE_OFF)\r
+  {\r
+    bspIState_t s;\r
+\r
+    /* critical section necessary for watertight testing and setting of state variables */\r
+    BSP_ENTER_CRITICAL_SECTION(s);\r
+\r
+   /* go to idle so radio is in a known state before sleeping */\r
+   MRFI_RxIdle();\r
+\r
+   /* There is no individual power control to the RF block on this radio.\r
+    * So putting it to Idle is the best we can do.\r
+    */\r
+\r
+    /* Our new state is OFF */\r
+    mrfiRadioState = MRFI_RADIO_STATE_OFF;\r
+\r
+   BSP_EXIT_CRITICAL_SECTION(s);\r
+  }\r
+}\r
+\r
+\r
+/**************************************************************************************************\r
+ * @fn          MRFI_WakeUp\r
+ *\r
+ * @brief       Wake up radio from sleep state.\r
+ *\r
+ * @param       none\r
+ *\r
+ * @return      none\r
+ **************************************************************************************************\r
+ */\r
+void MRFI_WakeUp(void)\r
+{\r
+  /* verify high speed crystal oscillator is selected, required for radio operation */\r
+  MRFI_ASSERT( !(CLKCON & OSC) );\r
+\r
+  /* if radio is already awake, just ignore wakeup request */\r
+  if(mrfiRadioState != MRFI_RADIO_STATE_OFF)\r
+  {\r
+    return;\r
+  }\r
+\r
+  /* restore radio registers that are reset during sleep */\r
+  FSCAL3 = SMARTRF_SETTING_FSCAL3;\r
+  FSCAL2 = SMARTRF_SETTING_FSCAL2;\r
+  FSCAL1 = SMARTRF_SETTING_FSCAL1;\r
+\r
+  /* enter idle mode */\r
+  mrfiRadioState = MRFI_RADIO_STATE_IDLE;\r
+  MRFI_STROBE_IDLE_AND_WAIT();\r
+}\r
+\r
+/**************************************************************************************************\r
+ * @fn          MRFI_RandomByte\r
+ *\r
+ * @brief       Returns a random byte\r
+ *\r
+ * @param       none\r
+ *\r
+ * @return      a random byte\r
+ **************************************************************************************************\r
+ */\r
+uint8_t MRFI_RandomByte(void)\r
+{\r
+  /* clock the random generator once to get a new random value */\r
+  ADCCON1 |= RCTRL_CLOCK_LFSR;\r
+\r
+  return RNDL;\r
+}\r
+\r
+\r
+\r
+/**************************************************************************************************\r
+ * @fn          Mrfi_RxModeOn\r
+ *\r
+ * @brief       Put radio into receive mode.\r
+ *\r
+ * @param       none\r
+ *\r
+ * @return      none\r
+ **************************************************************************************************\r
+ */\r
+static void Mrfi_RxModeOn(void)\r
+{\r
+  uint8_t XDATA * pCfg;\r
+\r
+  /* configure DMA channel for receive */\r
+  pCfg = MRFI_DMA_CFG_ADDRESS;\r
+  *pCfg++ = /* offset 0 : */  HIGH_BYTE_OF_WORD( &X_RFD );  /* SRCADDRH */\r
+  *pCfg++ = /* offset 1 : */  LOW_BYTE_OF_WORD ( &X_RFD );  /* SRCADDRL */\r
+  *pCfg++ = /* offset 2 : */  HIGH_BYTE_OF_WORD( &(mrfiIncomingPacket.frame[0]) );  /* DSTADDRH */\r
+  *pCfg++ = /* offset 3 : */  LOW_BYTE_OF_WORD ( &(mrfiIncomingPacket.frame[0]) );  /* DSTADDRL */\r
+  *pCfg++ = /* offset 4 : */  RXTX_DMA_VLEN_XFER_BYTES_PLUS_3;\r
+  *pCfg++ = /* offset 5 : */  RXTX_DMA_LEN;\r
+  *pCfg++ = /* offset 6 : */  RXTX_DMA_WORDSIZE | RXTX_DMA_TMODE | RXTX_DMA_TRIG;\r
+  *pCfg   = /* offset 7 : */  RXTX_DMA_SRCINC_NONE | RXTX_DMA_DESTINC_PLUS_1 |\r
+                              RXTX_DMA_IRQMASK | RXTX_DMA_M8 | RXTX_DMA_PRIORITY;\r
+\r
+  /* abort any DMA transfer that might be in progress */\r
+  DMAARM = ABORT | BV( MRFI_DMA_CHAN );\r
+\r
+  /* clean out buffer to help protect against spurious frames */\r
+  memset(mrfiIncomingPacket.frame, 0x00, sizeof(mrfiIncomingPacket.frame));\r
+\r
+  /* arm the dma channel for receive */\r
+  DMAARM |= BV( MRFI_DMA_CHAN );\r
+\r
+  /* Clear interrupts */\r
+  S1CON &= ~(RFIF_1 | RFIF_0); /* Clear MCU interrupt flag */\r
+  RFIF &= ~IRQ_DONE;           /* Clear the interrupt at the source */\r
+\r
+  /* send strobe to enter receive mode */\r
+  RFST = SRX;\r
+\r
+  /* enable "receive/transmit done" interrupts */\r
+  RFIM |= IM_DONE;\r
+}\r
+\r
+/**************************************************************************************************\r
+ * @fn          MRFI_RxOn\r
+ *\r
+ * @brief       Turn on the receiver.  No harm is done if this function is called when\r
+ *              receiver is already on.\r
+ *\r
+ * @param       none\r
+ *\r
+ * @return      none\r
+ **************************************************************************************************\r
+ */\r
+void MRFI_RxOn(void)\r
+{\r
+  /* radio must be awake before we can move it to RX state */\r
+  MRFI_ASSERT( mrfiRadioState != MRFI_RADIO_STATE_OFF );\r
+\r
+  /* Put the radio in RX state, if not already */\r
+  if(mrfiRadioState != MRFI_RADIO_STATE_RX)\r
+  {\r
+    mrfiRadioState = MRFI_RADIO_STATE_RX;\r
+    Mrfi_RxModeOn();\r
+  }\r
+}\r
+\r
+/**************************************************************************************************\r
+ * @fn          Mrfi_RxModeOff\r
+ *\r
+ * @brief       -\r
+ *\r
+ * @param       none\r
+ *\r
+ * @return      none\r
+ **************************************************************************************************\r
+ */\r
+static void Mrfi_RxModeOff(void)\r
+{\r
+  /*disable receive interrupts */\r
+  RFIM &= ~IM_DONE;\r
+\r
+  /* turn off radio */\r
+  MRFI_STROBE_IDLE_AND_WAIT();\r
+\r
+  /* Abort any ongoing DMA transfer */\r
+  DMAARM = ABORT | BV( MRFI_DMA_CHAN );\r
+\r
+  /* Clear any pending DMA interrupts */\r
+  DMAIRQ &= ~BV(MRFI_DMA_CHAN);\r
+\r
+  /* flush the receive FIFO of any residual data */\r
+  /* no need for flush. only 1 byte deep fifo. */\r
+\r
+  /* clear receive interrupt */\r
+  S1CON &= ~(RFIF_1 | RFIF_0); /* Clear MCU interrupt flag */\r
+  RFIF &= ~IRQ_DONE;           /* Clear the interrupt at the source */\r
+}\r
+\r
+\r
+/**************************************************************************************************\r
+ * @fn          MRFI_RxIdle\r
+ *\r
+ * @brief       Put radio in idle mode (receiver if off).  No harm is done this function is\r
+ *              called when radio is already idle.\r
+ *\r
+ * @param       none\r
+ *\r
+ * @return      none\r
+ **************************************************************************************************\r
+ */\r
+void MRFI_RxIdle(void)\r
+{\r
+  /* radio must be awake to move it to idle mode */\r
+  MRFI_ASSERT( mrfiRadioState != MRFI_RADIO_STATE_OFF );\r
+\r
+  /* if radio is on, turn it off */\r
+  if(mrfiRadioState == MRFI_RADIO_STATE_RX)\r
+  {\r
+    Mrfi_RxModeOff();\r
+    mrfiRadioState = MRFI_RADIO_STATE_IDLE;\r
+  }\r
+}\r
+\r
+/****************************************************************************************************\r
+ * @fn          Mrfi_DelayUsec\r
+ *\r
+ * @brief       Execute a delay loop using HW timer. The macro actually used to do the delay\r
+ *              is not thread-safe. This routine makes the delay execution thread-safe by breaking\r
+ *              up the requested delay into small chunks and executing each chunk as a critical\r
+ *              section. The chunk size is choosen to be the smallest value used by MRFI. The delay\r
+ *              is only approximate because of the overhead computations. It errs on the side of\r
+ *              being too long.\r
+ *\r
+ * input parameters\r
+ * @param   howLong - number of microseconds to delay\r
+ *\r
+ * @return      none\r
+ ****************************************************************************************************\r
+ */\r
+void Mrfi_DelayUsec(uint16_t howLong)\r
+{\r
+  bspIState_t s;\r
+  uint16_t count = howLong/MRFI_MAX_DELAY_US;\r
+\r
+  if (howLong)\r
+  {\r
+    do\r
+    {\r
+      BSP_ENTER_CRITICAL_SECTION(s);\r
+      BSP_DELAY_USECS(MRFI_MAX_DELAY_US);\r
+      BSP_EXIT_CRITICAL_SECTION(s);\r
+    } while (count--);\r
+  }\r
+\r
+  return;\r
+}\r
+\r
+/****************************************************************************************************\r
+ * @fn          Mrfi_DelayUsecSem\r
+ *\r
+ * @brief       Execute a delay loop using a HW timer. See comments for Mrfi_DelayUsec().\r
+ *              Delay specified number of microseconds checking semaphore for\r
+ *              early-out. Run in a separate thread when the reply delay is\r
+ *              invoked. Cleaner then trying to make MRFI_DelayUsec() thread-safe\r
+ *              and reentrant.\r
+ *\r
+ * input parameters\r
+ * @param   howLong - number of microseconds to delay\r
+ *\r
+ * @return      none\r
+ ****************************************************************************************************\r
+ */\r
+static void Mrfi_DelayUsecSem(uint16_t howLong)\r
+{\r
+  bspIState_t s;\r
+  uint16_t count = howLong/MRFI_MAX_DELAY_US;\r
+\r
+  if (howLong)\r
+  {\r
+    do\r
+    {\r
+      BSP_ENTER_CRITICAL_SECTION(s);\r
+      BSP_DELAY_USECS(MRFI_MAX_DELAY_US);\r
+      BSP_EXIT_CRITICAL_SECTION(s);\r
+      if (sKillSem)\r
+      {\r
+        break;\r
+      }\r
+    } while (count--);\r
+  }\r
+\r
+  return;\r
+}\r
+\r
+/**************************************************************************************************\r
+ * @fn          MRFI_DelayMs\r
+ *\r
+ * @brief       Delay the specified number of milliseconds.\r
+ *\r
+ * @param       milliseconds - delay time\r
+ *\r
+ * @return      none\r
+ **************************************************************************************************\r
+ */\r
+void MRFI_DelayMs(uint16_t milliseconds)\r
+{\r
+  while (milliseconds)\r
+  {\r
+    Mrfi_DelayUsec( APP_USEC_VALUE );\r
+    milliseconds--;\r
+  }\r
+}\r
+\r
+/**************************************************************************************************\r
+ * @fn          MRFI_ReplyDelay\r
+ *\r
+ * @brief       Delay number of milliseconds scaled by data rate. Check semaphore for\r
+ *              early-out. Run in a separate thread when the reply delay is\r
+ *              invoked. Cleaner then trying to make MRFI_DelayMs() thread-safe\r
+ *              and reentrant.\r
+ *\r
+ * @param       none\r
+ *\r
+ * @return      none\r
+ **************************************************************************************************\r
+ */\r
+void MRFI_ReplyDelay()\r
+{\r
+  bspIState_t s;\r
+  uint16_t    milliseconds = sReplyDelayScalar;\r
+\r
+  BSP_ENTER_CRITICAL_SECTION(s);\r
+  sReplyDelayContext = 1;\r
+  BSP_EXIT_CRITICAL_SECTION(s);\r
+\r
+  while (milliseconds)\r
+  {\r
+    Mrfi_DelayUsecSem( APP_USEC_VALUE );\r
+    if (sKillSem)\r
+    {\r
+      break;\r
+    }\r
+    milliseconds--;\r
+  }\r
+\r
+  BSP_ENTER_CRITICAL_SECTION(s);\r
+  sKillSem           = 0;\r
+  sReplyDelayContext = 0;\r
+  BSP_EXIT_CRITICAL_SECTION(s);\r
+}\r
+\r
+/**************************************************************************************************\r
+ * @fn          MRFI_PostKillSem\r
+ *\r
+ * @brief       Post to the loop-kill semaphore that will be checked by the iteration loops\r
+ *              that control the delay thread.\r
+ *\r
+ * @param       none\r
+ *\r
+ * @return      none\r
+ **************************************************************************************************\r
+ */\r
+void MRFI_PostKillSem(void)\r
+{\r
+\r
+  if (sReplyDelayContext)\r
+  {\r
+    sKillSem = 1;\r
+  }\r
+\r
+  return;\r
+}\r
+\r
+/**************************************************************************************************\r
+ * @fn          Mrfi_RandomBackoffDelay\r
+ *\r
+ * @brief       -\r
+ *\r
+ * @param       none\r
+ *\r
+ * @return      none\r
+ **************************************************************************************************\r
+ */\r
+static void Mrfi_RandomBackoffDelay(void)\r
+{\r
+  uint8_t backoffs;\r
+  uint8_t i;\r
+\r
+  /* calculate random value for backoffs - 1 to 16 */\r
+  backoffs = (MRFI_RandomByte() & 0x0F) + 1;\r
+\r
+  /* delay for randomly computed number of backoff periods */\r
+  for (i=0; i<backoffs; i++)\r
+  {\r
+    Mrfi_DelayUsec( sBackoffHelper );\r
+  }\r
+}\r
+\r
+/**************************************************************************************************\r
+ * @fn          MRFI_Rssi\r
+ *\r
+ * @brief       Returns "live" RSSI value\r
+ *\r
+ * @param       none\r
+ *\r
+ * @return      RSSI value in units of dBm.\r
+ **************************************************************************************************\r
+ */\r
+int8_t MRFI_Rssi(void)\r
+{\r
+  /* Radio must be in RX state to measure rssi. */\r
+  MRFI_ASSERT( mrfiRadioState == MRFI_RADIO_STATE_RX );\r
+\r
+  /* Wait for the RSSI to be valid:\r
+   * Just having the Radio ON is not enough to read\r
+   * the correct RSSI value. The Radio must in RX mode for\r
+   * a certain duration. This duration depends on\r
+   * the baud rate and the received signal strength itself.\r
+   */\r
+  MRFI_RSSI_VALID_WAIT();\r
+\r
+  /* Convert RSSI to decimal and do offset compensation. */\r
+  return( Mrfi_CalculateRssi(RSSI) );\r
+}\r
+\r
+/**************************************************************************************************\r
+ * @fn          Mrfi_CalculateRssi\r
+ *\r
+ * @brief       Does binary to decimal conversiont and offset compensation.\r
+ *\r
+ * @param       none\r
+ *\r
+ * @return      RSSI value in units of dBm.\r
+ **************************************************************************************************\r
+ */\r
+int8_t Mrfi_CalculateRssi(uint8_t rawValue)\r
+{\r
+  int16_t rssi;\r
+\r
+  /* The raw value is in 2's complement and in half db steps. Convert it to\r
+   * decimal taking into account the offset value.\r
+   */\r
+  if(rawValue >= 128)\r
+  {\r
+    rssi = (int16_t)(rawValue - 256)/2 - MRFI_RSSI_OFFSET;\r
+  }\r
+  else\r
+  {\r
+    rssi = (rawValue/2) - MRFI_RSSI_OFFSET;\r
+  }\r
+\r
+  /* Restrict this value to least value can be held in an 8 bit signed int */\r
+  if(rssi < -128)\r
+  {\r
+    rssi = -128;\r
+  }\r
+\r
+  return rssi;\r
+}\r
+\r
+/**************************************************************************************************\r
+ * @fn          MRFI_GetRadioState\r
+ *\r
+ * @brief       Returns the current radio state.\r
+ *\r
+ * @param       none\r
+ *\r
+ * @return      radio state - off/idle/rx\r
+ **************************************************************************************************\r
+ */\r
+uint8_t MRFI_GetRadioState(void)\r
+{\r
+  return mrfiRadioState;\r
+}\r
+\r
+\r
+/**************************************************************************************************\r
+ *                                  Compile Time Integrity Checks\r
+ **************************************************************************************************\r
+ */\r
+#if (MRFI_DMA_CHAN != 0)\r
+#error "ERROR: Code implementation requires use of DMA channel zero."\r
+/*  Using a channel other than zero is not difficult to implement.  The hardware\r
+ *  requires channels 1-4 to use a common configuration structure.  For this module\r
+ *  to use a channel other than zero, this data structure would need to be integrated\r
+ *  with the external code.  Hooks are provided to make this as easy as possible.\r
+ */\r
+#endif\r
+\r
+\r
+#define MRFI_RADIO_TX_FIFO_SIZE     64  /* from datasheet */\r
+\r
+/* verify largest possible packet fits within FIFO buffer */\r
+#if ((MRFI_MAX_FRAME_SIZE + MRFI_RX_METRICS_SIZE) > MRFI_RADIO_TX_FIFO_SIZE)\r
+#error "ERROR:  Maximum possible packet length exceeds FIFO buffer.  Decrease value of maximum application payload."\r
+#endif\r
+\r
+/* verify that the SmartRF file supplied is compatible */\r
+#if ((!defined SMARTRF_RADIO_CC2510) && \\r
+     (!defined SMARTRF_RADIO_CC2511) && \\r
+     (!defined SMARTRF_RADIO_CC1110) && \\r
+     (!defined SMARTRF_RADIO_CC1111))\r
+#error "ERROR:  The SmartRF export file is not compatible."\r
+#endif\r
+\r
+\r
+/**************************************************************************************************\r
+*/\r
diff --git a/chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/Components/mrfi/smartrf/CC1111/smartrf_CC1111.h b/chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/Components/mrfi/smartrf/CC1111/smartrf_CC1111.h
new file mode 100755 (executable)
index 0000000..310bb79
--- /dev/null
@@ -0,0 +1,126 @@
+/***************************************************************\r
+ *  SmartRF Studio(tm) Export\r
+ *\r
+ *  Radio register settings specifed with C-code\r
+ *  compatible #define statements.\r
+ *\r
+ ***************************************************************/\r
+\r
+// [BM] Modified radio settings for 433MHz, 868MHz, 915MHz \r
+\r
+#ifndef SMARTRF_CC1111_H\r
+#define SMARTRF_CC1111_H\r
+\r
+#define SMARTRF_RADIO_CC1111\r
+\r
+// ISM_EU configuration\r
+//\r
+// Chipcon\r
+// Product = CC1111\r
+// Chip version = D (VERSION = 0x03)\r
+// X-tal frequency = 24 MHz\r
+// RF output power = 0 dBm\r
+// RX filterbandwidth = 250.000000 kHz\r
+// Deviation = 32 kHz\r
+// Datarate = 76.721191 kBaud\r
+// Modulation = (1) GFSK\r
+// Manchester enable = (0) Manchester disabled\r
+// RF Frequency = 869.524658 MHz\r
+// Channel spacing = 199.951172 kHz\r
+// Channel number = 0\r
+// Optimization = -\r
+// Sync mode = (3) 30/32 sync word bits detected\r
+// Format of RX/TX data = (0) Normal mode\r
+// CRC operation = (1) CRC calculation in TX and CRC check in RX enabled\r
+// Forward Error Correction = (0) FEC disabled\r
+// Length configuration = (1) Variable packet length mode, packet length configured by the first received byte after sync word.\r
+// Packetlength = 255\r
+// Preamble count = (2)  4 bytes\r
+// Append status = 1\r
+// Address check = (0) No address check\r
+// Device address = 0\r
+\r
+// ISM_US configuration\r
+//\r
+// Chipcon\r
+// Product = CC1111\r
+// Chip version = D (VERSION = 0x03)\r
+// X-tal frequency = 24 MHz\r
+// RF output power = 0 dBm\r
+// RX filterbandwidth = 250.000000 kHz\r
+// Deviation = 32 kHz\r
+// Datarate = 76.721191 kBaud\r
+// Modulation = (1) GFSK\r
+// Manchester enable = (0) Manchester disabled\r
+// RF Frequency = 905.998901 MHz\r
+// Channel spacing = 199.951172 kHz\r
+// Channel number = 0\r
+// Optimization = -\r
+// Sync mode = (3) 30/32 sync word bits detected\r
+// Format of RX/TX data = (0) Normal mode\r
+// CRC operation = (1) CRC calculation in TX and CRC check in RX enabled\r
+// Forward Error Correction = (0) FEC disabled\r
+// Length configuration = (1) Variable packet length mode, packet length configured by the first received byte after sync word.\r
+// Packetlength = 255\r
+// Preamble count = (2)  4 bytes\r
+// Append status = 1\r
+// Address check = (0) No address check\r
+// Device address = 0\r
+\r
+#define SMARTRF_SETTING_FSCTRL1     0x09\r
+#define SMARTRF_SETTING_FSCTRL0     0x00\r
+#ifdef ISM_EU\r
+  #define SMARTRF_SETTING_FREQ2       0x24\r
+  #define SMARTRF_SETTING_FREQ1       0x3A\r
+  #define SMARTRF_SETTING_FREQ0       0xEE\r
+#else\r
+  #ifdef ISM_US  \r
+  // 902MHz (CHANNR=20 --> 906MHz)\r
+  #define SMARTRF_SETTING_FREQ2       0x25\r
+  #define SMARTRF_SETTING_FREQ1       0x95\r
+  #define SMARTRF_SETTING_FREQ0       0x55\r
+    // 912MHz (CHANNR=0)\r
+//    #define SMARTRF_SETTING_FREQ2       0x26\r
+//    #define SMARTRF_SETTING_FREQ1       0x00\r
+//    #define SMARTRF_SETTING_FREQ0       0x00\r
+  #else\r
+    #ifdef ISM_LF\r
+      // 433.30MHz\r
+      #define SMARTRF_SETTING_FREQ2       0x12\r
+      #define SMARTRF_SETTING_FREQ1       0x14\r
+      #define SMARTRF_SETTING_FREQ0       0x7A\r
+    #else\r
+      #error "Wrong ISM band specified (valid are ISM_LF, ISM_EU and ISM_US)"\r
+    #endif // ISM_LF\r
+  #endif // ISM_US\r
+#endif // ISM_EU\r
+#define SMARTRF_SETTING_MDMCFG4     0x6B\r
+#define SMARTRF_SETTING_MDMCFG3     0xA3\r
+#define SMARTRF_SETTING_MDMCFG2     0x13\r
+#define SMARTRF_SETTING_MDMCFG1     0x23\r
+#define SMARTRF_SETTING_MDMCFG0     0x11\r
+#define SMARTRF_SETTING_CHANNR      0x00\r
+#define SMARTRF_SETTING_DEVIATN     0x43\r
+#define SMARTRF_SETTING_FREND1      0xB6\r
+#define SMARTRF_SETTING_FREND0      0x10\r
+#define SMARTRF_SETTING_MCSM0       0x18\r
+#define SMARTRF_SETTING_FOCCFG      0x1D\r
+#define SMARTRF_SETTING_BSCFG       0x1C\r
+#define SMARTRF_SETTING_AGCCTRL2    0xC7\r
+#define SMARTRF_SETTING_AGCCTRL1    0x00\r
+#define SMARTRF_SETTING_AGCCTRL0    0xB0\r
+#define SMARTRF_SETTING_FSCAL3      0xEA\r
+#define SMARTRF_SETTING_FSCAL2      0x2A\r
+#define SMARTRF_SETTING_FSCAL1      0x00\r
+#define SMARTRF_SETTING_FSCAL0      0x1F\r
+#define SMARTRF_SETTING_TEST2       0x81\r
+#define SMARTRF_SETTING_TEST1       0x35\r
+#define SMARTRF_SETTING_TEST0       0x09\r
+#define SMARTRF_SETTING_PA_TABLE0   0x50\r
+#define SMARTRF_SETTING_PKTCTRL1    0x04\r
+#define SMARTRF_SETTING_PKTCTRL0    0x05\r
+#define SMARTRF_SETTING_ADDR        0x00\r
+#define SMARTRF_SETTING_PKTLEN      0xFF\r
+\r
+#endif // SMARTRF_CC1111_H\r
+\r
diff --git a/chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/Components/nwk/nwk.c b/chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/Components/nwk/nwk.c
new file mode 100755 (executable)
index 0000000..986ae46
--- /dev/null
@@ -0,0 +1,1069 @@
+/**************************************************************************************************\r
+  Filename:       nwk.c\r
+  Revised:        $Date: 2009-03-11 15:29:07 -0700 (Wed, 11 Mar 2009) $\r
+  Revision:       $Revision: 19382 $\r
+  Author          $Author: lfriedman $\r
+\r
+  Description:    This file supports the SimpliciTI network layer.\r
+\r
+  Copyright 2007-2009 Texas Instruments Incorporated. All rights reserved.\r
+\r
+  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+  the terms of a software license agreement between the user who downloaded the software,\r
+  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+  License. The License limits your use, and you acknowledge, that the Software may not be\r
+  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+  perform, display or sell this Software and/or its documentation for any purpose.\r
+\r
+  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+\r
+  Should you have any questions regarding your right to use this Software,\r
+  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+/******************************************************************************\r
+ * INCLUDES\r
+ */\r
+#include <string.h>\r
+#include "bsp.h"\r
+#include "mrfi.h"\r
+#include "nwk_types.h"\r
+#include "nwk_frame.h"\r
+#include "nwk.h"\r
+#include "nwk_app.h"\r
+#include "nwk_globals.h"\r
+#include "nwk_QMgmt.h"\r
+\r
+/******************************************************************************\r
+ * MACROS\r
+ */\r
+/************************* NETWORK MANIFEST CONSTANT SANITY CHECKS ****************************/\r
+#if !defined(ACCESS_POINT) && !defined(RANGE_EXTENDER) && !defined(END_DEVICE)\r
+#error ERROR: No SimpliciTI device type defined\r
+#endif\r
+\r
+#if defined(END_DEVICE) && !defined(RX_POLLS)\r
+#define RX_USER\r
+#endif\r
+\r
+#ifndef MAX_HOPS\r
+#define MAX_HOPS  3\r
+#elif MAX_HOPS > 4\r
+#error ERROR: MAX_HOPS must be 4 or fewer\r
+#endif\r
+\r
+#ifndef MAX_APP_PAYLOAD\r
+#error ERROR: MAX_APP_PAYLOAD must be defined\r
+#endif\r
+\r
+#if ( MAX_PAYLOAD < MAX_FREQ_APP_FRAME )\r
+#error ERROR: Application payload size too small for Frequency frame\r
+#endif\r
+\r
+#if ( MAX_PAYLOAD < MAX_JOIN_APP_FRAME )\r
+#error ERROR: Application payload size too small for Join frame\r
+#endif\r
+\r
+#if ( MAX_PAYLOAD < MAX_LINK_APP_FRAME )\r
+#error ERROR: Application payload size too small for Link frame\r
+#endif\r
+\r
+#if ( MAX_PAYLOAD < MAX_MGMT_APP_FRAME )\r
+#error ERROR: Application payload size too small for Management frame\r
+#endif\r
+\r
+#if ( MAX_PAYLOAD < MAX_SEC_APP_FRAME )\r
+#error ERROR: Application payload size too small for Security frame\r
+#endif\r
+\r
+#if ( MAX_PAYLOAD < MAX_PING_APP_FRAME )\r
+#error ERROR: Application payload size too small for Ping frame\r
+#endif\r
+\r
+#if NWK_FREQ_TBL_SIZE < 1\r
+#error ERROR: NWK_FREQ_TBL_SIZE must be > 0\r
+#endif\r
+\r
+/************************* END NETWORK MANIFEST CONSTANT SANITY CHECKS ************************/\r
+\r
+/******************************************************************************\r
+ * CONSTANTS AND DEFINES\r
+ */\r
+#define SYS_NUM_CONNECTIONS   (NUM_CONNECTIONS+1)\r
+\r
+/* Increment this if the persistentContext_t structure is changed. It will help\r
+ * detect the upgrade context: any saved values will have a version with a\r
+ * lower number.\r
+ */\r
+#define  CONNTABLEINFO_STRUCTURE_VERSION   1\r
+\r
+#define  SIZEOF_NV_OBJ   sizeof(sPersistInfo)\r
+\r
+/******************************************************************************\r
+ * TYPEDEFS\r
+ */\r
+/* This structure aggregates eveything necessary to save if we want to restore\r
+ * the connection information later.\r
+ */\r
+typedef struct\r
+{\r
+  const uint8_t    structureVersion; /* to dectect upgrades... */\r
+        uint8_t    numConnections;   /* count includes the UUD port/link ID */\r
+/* The next two are used to detect overlapping port assignments. When _sending_ a\r
+ * link frame the local port is assigned from the top down. When sending a _reply_\r
+ * the assignment is bottom up. Overlapping assignments are rejected. That said it\r
+ * is extremely unlikely that this will ever happen. If it does the test implemented\r
+ * here is overly cautious (it will reject assignments when it needn't). But we leave\r
+ * it that way on the assumption that it will never happen anyway.\r
+ */\r
+        uint8_t    curNextLinkPort;\r
+        uint8_t    curMaxReplyPort;\r
+        linkID_t   nextLinkID;\r
+#ifdef ACCESS_POINT\r
+        sfInfo_t   sSandFContext;\r
+#endif\r
+/* Connection table entries last... */\r
+        connInfo_t connStruct[SYS_NUM_CONNECTIONS];\r
+} persistentContext_t;\r
+\r
+/******************************************************************************\r
+ * LOCAL VARIABLES\r
+ */\r
+\r
+/* This will be overwritten if we restore the structure from NV for example.\r
+ * Note that restoring will not permit overwriting the version element as it\r
+ * is declared 'const'.\r
+ */\r
+static persistentContext_t sPersistInfo = {CONNTABLEINFO_STRUCTURE_VERSION};\r
+\r
+/******************************************************************************\r
+ * LOCAL FUNCTIONS\r
+ */\r
+static uint8_t map_lid2idx(linkID_t, uint8_t *);\r
+static void    initializeConnection(connInfo_t *);\r
+\r
+/******************************************************************************\r
+ * GLOBAL VARIABLES\r
+ */\r
+\r
+/******************************************************************************\r
+ * GLOBAL FUNCTIONS\r
+ */\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_nwkInit\r
+ *\r
+ * @brief       Initialize NWK conext.\r
+ *\r
+ * input parameters\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   Status of operation.\r
+ */\r
+smplStatus_t nwk_nwkInit(uint8_t (*f)(linkID_t))\r
+{\r
+  /* Truly ugly initialization because CCE won't initialize properly. Must\r
+   * skip first const element. Yuk.\r
+   */\r
+  memset((((uint8_t *)&sPersistInfo)+1), 0x0, (sizeof(sPersistInfo)-1));\r
+  /* OK. The zeroed elements are set. Now go back and do fixups...  */\r
+\r
+  sPersistInfo.numConnections   = SYS_NUM_CONNECTIONS;\r
+  sPersistInfo.curNextLinkPort  = SMPL_PORT_USER_MAX;\r
+  sPersistInfo.curMaxReplyPort  = PORT_BASE_NUMBER;\r
+  sPersistInfo.nextLinkID       = 1;\r
+\r
+  /* initialize globals */\r
+  nwk_globalsInit();\r
+\r
+  /* initialize frame processing */\r
+  nwk_frameInit(f);\r
+\r
+  /* initialize queue manager */\r
+  nwk_QInit();\r
+       \r
+  /* initialize each network application. */\r
+  nwk_freqInit();\r
+  nwk_pingInit();\r
+  nwk_joinInit(f);\r
+  nwk_mgmtInit();\r
+  nwk_linkInit();\r
+  nwk_securityInit();\r
+\r
+  /* set up the last connection as the broadcast port mapped to the broadcast Link ID */\r
+  if (CONNSTATE_FREE == sPersistInfo.connStruct[NUM_CONNECTIONS].connState)\r
+  {\r
+    sPersistInfo.connStruct[NUM_CONNECTIONS].connState   = CONNSTATE_CONNECTED;\r
+    sPersistInfo.connStruct[NUM_CONNECTIONS].hops2target = MAX_HOPS;\r
+    sPersistInfo.connStruct[NUM_CONNECTIONS].portRx      = SMPL_PORT_USER_BCAST;\r
+    sPersistInfo.connStruct[NUM_CONNECTIONS].portTx      = SMPL_PORT_USER_BCAST;\r
+    sPersistInfo.connStruct[NUM_CONNECTIONS].thisLinkID  = SMPL_LINKID_USER_UUD;\r
+    /* set peer address to broadcast so it is used when Application sends to the broadcast Link ID */\r
+    memcpy(sPersistInfo.connStruct[NUM_CONNECTIONS].peerAddr, nwk_getBCastAddress(), NET_ADDR_SIZE);\r
+  }\r
+\r
+  return SMPL_SUCCESS;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_getNextConnection\r
+ *\r
+ * @brief       Return the next free connection structure if on is available.\r
+ *\r
+ * input parameters\r
+ *\r
+ * output parameters\r
+ *      The returned structure has the Rx port number populated based on the\r
+ *      free strucure found. This is the port queried when the app wants to\r
+ *      do a receive.\r
+ *\r
+ * @return   pointer to the new connInfo_t structure. NULL if there is\r
+ *           no room in connection structure array.\r
+ */\r
+connInfo_t *nwk_getNextConnection()\r
+{\r
+  uint8_t  i;\r
+\r
+  for (i=0; i<SYS_NUM_CONNECTIONS; ++i)\r
+  {\r
+    if (sPersistInfo.connStruct[i].connState == CONNSTATE_CONNECTED)\r
+    {\r
+      continue;\r
+    }\r
+    break;\r
+  }\r
+\r
+  if (SYS_NUM_CONNECTIONS == i)\r
+  {\r
+    return (connInfo_t *)0;\r
+  }\r
+\r
+  initializeConnection(&sPersistInfo.connStruct[i]);\r
+\r
+  return &sPersistInfo.connStruct[i];\r
+}\r
+\r
+/************************************************************************************\r
+ * @fn          initializeConnection\r
+ *\r
+ * @brief       Initialize some elements of a Connection table entry.\r
+ *\r
+ * input parameters\r
+ * @param   pCInfo  - pointer to Connection Table entry to initialize. The file\r
+ *                    scope variable holding the next link ID value is also updated.\r
+ *\r
+ * output parameters\r
+ * @param   pCInfo  - certain elements are set to specific values.\r
+ *\r
+ *\r
+ * @return   void\r
+ */\r
+static void initializeConnection(connInfo_t *pCInfo)\r
+{\r
+  linkID_t *locLID = &sPersistInfo.nextLinkID;\r
+  uint8_t   tmp;\r
+\r
+    /* this element will be populated during the exchange with the peer. */\r
+  pCInfo->portTx = 0;\r
+\r
+  pCInfo->connState  =  CONNSTATE_CONNECTED;\r
+  pCInfo->thisLinkID = *locLID;\r
+\r
+  /* Generate the next Link ID. This isn't foolproof. If the count wraps\r
+   * we can end up with confusing duplicates. We can protect aginst using\r
+   * one that is already in use but we can't protect against a stale Link ID\r
+   * remembered by an application that doesn't know its connection has been\r
+   * torn down. The test for 0 will hopefully never be true (indicating a wrap).\r
+   */\r
+  (*locLID)++;\r
+\r
+  while (!*locLID || (*locLID == SMPL_LINKID_USER_UUD) || map_lid2idx(*locLID, &tmp))\r
+  {\r
+    (*locLID)++;\r
+  }\r
+\r
+  return;\r
+}\r
+\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_freeConnection\r
+ *\r
+ * @brief       Return the connection structure to the free pool. Currently\r
+ *              this routine is only called when a link freame is sent and\r
+ *              no reply is received so the freeing steps are pretty simple.\r
+ *              But eventually this will be more complex so this place-holder\r
+ *              is introduced.\r
+ *\r
+ * input parameters\r
+ * @param   pCInfo    - pointer to entry to be freed\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   None.\r
+ */\r
+void nwk_freeConnection(connInfo_t *pCInfo)\r
+{\r
+#if NUM_CONNECTIONS > 0\r
+  pCInfo->connState = CONNSTATE_FREE;\r
+#endif\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_getConnInfo\r
+ *\r
+ * @brief       Return the connection info structure to which the input Link ID maps.\r
+ *\r
+ * input parameters\r
+ * @param   port    - port for which mapping desired\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   pointer to connInfo_t structure found. NULL if no mapping\r
+ *           found or entry not valid.\r
+ */\r
+connInfo_t *nwk_getConnInfo(linkID_t linkID)\r
+{\r
+  uint8_t idx, rc;\r
+\r
+  rc = map_lid2idx(linkID, &idx);\r
+\r
+  return (rc && (CONNSTATE_CONNECTED == sPersistInfo.connStruct[idx].connState)) ? &sPersistInfo.connStruct[idx] : (connInfo_t *)0;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_isLinkDuplicate\r
+ *\r
+ * @brief       Help determine if the link has already been established.. Defense\r
+ *              against duplicate link frames. This file owns the data structure\r
+ *              so the comparison is done here.\r
+ *\r
+ * input parameters\r
+ * @param   addr       - pointer to address of linker in question\r
+ * @param   remotePort - remote port number provided by linker\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   Returns pointer to connection entry if the address and remote Port\r
+ *           match an existing entry, otherwise 0.\r
+ */\r
+connInfo_t *nwk_isLinkDuplicate(uint8_t *addr, uint8_t remotePort)\r
+{\r
+#if NUM_CONNECTIONS > 0\r
+  uint8_t       i;\r
+  connInfo_t   *ptr = sPersistInfo.connStruct;\r
+\r
+  for (i=0; i<NUM_CONNECTIONS; ++i,++ptr)\r
+  {\r
+    if (CONNSTATE_CONNECTED == ptr->connState)\r
+    {\r
+      if (!(memcmp(ptr->peerAddr, addr, NET_ADDR_SIZE)) &&\r
+          (ptr->portTx == remotePort))\r
+      {\r
+        return ptr;\r
+      }\r
+    }\r
+  }\r
+#endif\r
+\r
+  return (connInfo_t *)NULL;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_findAddressMatch\r
+ *\r
+ * @brief       Used to look for an address match in the Connection table.\r
+ *              Match is based on source address in frame.\r
+ *\r
+ * input parameters\r
+ * @param   frame    - pointer to frame in question\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   Returns non-zero if a match is found, otherwise 0.\r
+ */\r
+uint8_t nwk_findAddressMatch(mrfiPacket_t *frame)\r
+{\r
+#if NUM_CONNECTIONS > 0\r
+  uint8_t       i;\r
+  connInfo_t   *ptr = sPersistInfo.connStruct;\r
+\r
+  for (i=0; i<NUM_CONNECTIONS; ++i,++ptr)\r
+  {\r
+\r
+    if (CONNSTATE_CONNECTED == ptr->connState)\r
+    {\r
+      if (!(memcmp(ptr->peerAddr, MRFI_P_SRC_ADDR(frame), NET_ADDR_SIZE)))\r
+      {\r
+        return 1;\r
+      }\r
+    }\r
+  }\r
+#endif\r
+\r
+  return 0;\r
+}\r
+\r
+#ifdef ACCESS_POINT\r
+/******************************************************************************\r
+ * @fn          nwk_getSFInfoPtr\r
+ *\r
+ * @brief       Get pointer to store-and-forward information object kept in the\r
+ *              NV object aggregate.\r
+ *\r
+ * input parameters\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   Returns pointer to the store-nad-forward object.\r
+ */\r
+sfInfo_t *nwk_getSFInfoPtr(void)\r
+{\r
+  return &sPersistInfo.sSandFContext;\r
+}\r
+\r
+#if defined(AP_IS_DATA_HUB)\r
+/***************************************************************************************\r
+ * @fn          nwk_saveJoinedDevice\r
+ *\r
+ * @brief       Save the address of a joining device on the Connection Table expecting\r
+ *              a Link frame to follow. Only for when AP is a data hub. We want to\r
+ *              use the space already allocated for a connection able entry instead\r
+ *              of having redundant arrays for alread-joined devices in the data hub\r
+ *              case.\r
+ *\r
+ * input parameters\r
+ * @param   frame  - pointer to frame containing address or joining device.\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   Returns non-zero if this is a new device and it is saved. Returns\r
+ *           0 if device already there or there is no room in the Connection\r
+ *           Table.\r
+ */\r
+uint8_t nwk_saveJoinedDevice(mrfiPacket_t *frame)\r
+{\r
+  uint8_t     i;\r
+  connInfo_t *avail = 0;\r
+  connInfo_t *ptr   = sPersistInfo.connStruct;\r
+\r
+  for (i=0; i<NUM_CONNECTIONS; ++i, ++ptr)\r
+  {\r
+    if ((ptr->connState == CONNSTATE_CONNECTED) || (ptr->connState == CONNSTATE_JOINED))\r
+    {\r
+      if (!memcmp(ptr->peerAddr, MRFI_P_SRC_ADDR(frame), NET_ADDR_SIZE))\r
+      {\r
+        return 0;\r
+      }\r
+    }\r
+    else\r
+    {\r
+      avail = ptr;\r
+    }\r
+  }\r
+\r
+  if (!avail)\r
+  {\r
+    return 0;\r
+  }\r
+\r
+  avail->connState = CONNSTATE_JOINED;\r
+  memcpy(avail->peerAddr, MRFI_P_SRC_ADDR(frame), NET_ADDR_SIZE);\r
+\r
+  return 1;\r
+}\r
+\r
+/***********************************************************************************\r
+ * @fn          nwk_findAlreadyJoined\r
+ *\r
+ * @brief       Used when AP is a data hub to look for an address match in the\r
+ *              Connection table for a device that is already enterd in the joined\r
+ *              state. This means that the Connection Table resource is already\r
+ *              allocated so the link-listen doesn't have to do it again. Match is\r
+ *              based on source address in frame. Thsi shoudl only be called from\r
+ *              the Link-listen context during the link frame reply.\r
+ *\r
+ *              If found the Connection Table entry is initialized as if it were\r
+ *              found using the nwk_getNextConnection() method.\r
+ *\r
+ * input parameters\r
+ * @param   frame    - pointer to frame in question\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   Returns pointer to Connection Table entry if match is found, otherwise\r
+ *           0. This call will only fail if the Connection Table was full when the\r
+ *           device tried to join initially.\r
+ */\r
+connInfo_t *nwk_findAlreadyJoined(mrfiPacket_t *frame)\r
+{\r
+  uint8_t     i;\r
+  connInfo_t *ptr = sPersistInfo.connStruct;\r
+\r
+  for (i=0; i<NUM_CONNECTIONS; ++i,++ptr)\r
+  {\r
+    /* Look for an entry in the JOINED state */\r
+    if (CONNSTATE_JOINED == ptr->connState)\r
+    {\r
+      /* Is this it? */\r
+      if (!(memcmp(&ptr->peerAddr, MRFI_P_SRC_ADDR(frame), NET_ADDR_SIZE)))\r
+      {\r
+        /* Yes. Initilize tabel entry and return the pointer. */\r
+        initializeConnection(ptr);\r
+        return ptr;\r
+      }\r
+    }\r
+  }\r
+\r
+  /* Nothing found... */\r
+  return (connInfo_t *)NULL;\r
+}\r
+#endif  /* AP_IS_DATA_HUB */\r
+#endif  /* ACCESS_POINT */\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_checkConnInfo\r
+ *\r
+ * @brief       Do a sanity/validity check on the connection info\r
+ *\r
+ * input parameters\r
+ * @param   ptr     - pointer to a valid connection info structure to validate\r
+ * @param   which   - Tx or Rx port checked\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   Status of operation.\r
+ */\r
+smplStatus_t nwk_checkConnInfo(connInfo_t *ptr, uint8_t which)\r
+{\r
+  uint8_t  port;\r
+\r
+  /* make sure port isn't null and that the entry is active */\r
+  port = (CHK_RX == which) ? ptr->portRx : ptr->portTx;\r
+  if (!port || (CONNSTATE_FREE == ptr->connState))\r
+  {\r
+    return SMPL_BAD_PARAM;\r
+  }\r
+\r
+  /* validate port number */\r
+  if (port < PORT_BASE_NUMBER)\r
+  {\r
+    return SMPL_BAD_PARAM;\r
+  }\r
+\r
+  return SMPL_SUCCESS;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_isConnectionValid\r
+ *\r
+ * @brief       Do a sanity/validity check on the frame target address by\r
+ *              validating frame against connection info\r
+ *\r
+ * input parameters\r
+ * @param   frame   - pointer to frame in question\r
+ *\r
+ * output parameters\r
+ * @param   lid   - link ID of found connection\r
+ *\r
+ * @return   0 if connection specified in frame is not valid, otherwise non-zero.\r
+ */\r
+uint8_t nwk_isConnectionValid(mrfiPacket_t *frame, linkID_t *lid)\r
+{\r
+  uint8_t       i;\r
+  connInfo_t   *ptr  = sPersistInfo.connStruct;\r
+  uint8_t       port = GET_FROM_FRAME(MRFI_P_PAYLOAD(frame), F_PORT_OS);\r
+\r
+  for (i=0; i<SYS_NUM_CONNECTIONS; ++i,++ptr)\r
+  {\r
+    if (CONNSTATE_CONNECTED == ptr->connState)\r
+    {\r
+      /* check port first since we're done if the port is the user bcast port. */\r
+      if (port == ptr->portRx)\r
+      {\r
+        /* yep...ports match. */\r
+        if ((SMPL_PORT_USER_BCAST == port) || !(memcmp(ptr->peerAddr, MRFI_P_SRC_ADDR(frame), NET_ADDR_SIZE)))\r
+        {\r
+          uint8_t rc = 1;\r
+\r
+          /* we're done. */\r
+          *lid = ptr->thisLinkID;\r
+#ifdef APP_AUTO_ACK\r
+          /* can't ack the broadcast port... */\r
+          if (!(SMPL_PORT_USER_BCAST == port))\r
+          {\r
+            if (GET_FROM_FRAME(MRFI_P_PAYLOAD(frame), F_ACK_REQ))\r
+            {\r
+              /* Ack requested. Send ack now */\r
+              nwk_sendAckReply(frame, ptr->portTx);\r
+            }\r
+            else if (GET_FROM_FRAME(MRFI_P_PAYLOAD(frame), F_ACK_RPLY))\r
+            {\r
+              /* This is a reply. Signal that it was received by resetting the\r
+               * saved transaction ID in the connection object if they match. The\r
+               * main thread is polling this value. The setting here is in the\r
+               * Rx ISR thread.\r
+               */\r
+              if (ptr->ackTID == GET_FROM_FRAME(MRFI_P_PAYLOAD(frame), F_TRACTID_OS))\r
+              {\r
+                ptr->ackTID = 0;\r
+              }\r
+              /* This causes the frame to be dropped. All ack frames are\r
+               * dropped.\r
+               */\r
+              rc = 0;\r
+            }\r
+          }\r
+#endif  /* APP_AUTO_ACK */\r
+          /* Unconditionally kill the reply delay semaphore. This used to be done\r
+           * unconditionally in the calling routine.\r
+           */\r
+          MRFI_PostKillSem();\r
+          return rc;\r
+        }\r
+      }\r
+    }\r
+  }\r
+\r
+  /* no matches */\r
+  return 0;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_allocateLocalRxPort\r
+ *\r
+ * @brief       Allocate a local port on which to receive frames from a peer.\r
+ *\r
+ *              Allocation differs depending on whether the allocation is for\r
+ *              a link reply frame or a link frame. In the former case we\r
+ *              know the address of the peer so we can ensure allocating a\r
+ *              unique port number for that address. The same port number can be\r
+ *              used mulitple times for distinct peers. Allocations are done from\r
+ *              the bottom of the namespace upward.\r
+ *\r
+ *              If allocation is for a link frame we do not yet know the peer\r
+ *              address so we must ensure the port number is unique now.\r
+ *              Allocations are done from the top of the namespace downward.\r
+ *\r
+ *              The two allocation methods track the extreme values used in each\r
+ *              case to detect overlap, i.e., exhausted namespace. This can only\r
+ *              happen if the number of connections supported is greater than the\r
+ *              total namespace available.\r
+ *\r
+ * input parameters\r
+ * @param   which   - Sending a link frame or a link reply frame\r
+ * @param   newPtr  - pointer to connection info structure to be populated\r
+ *\r
+ * output parameters\r
+ * @param   newPtr->portRx  - element is populated with port number.\r
+ *\r
+ * @return   Non-zero if port number assigned. 0 if no port available.\r
+ */\r
+uint8_t nwk_allocateLocalRxPort(uint8_t which, connInfo_t *newPtr)\r
+{\r
+#if NUM_CONNECTIONS > 0\r
+  uint8_t     num, i;\r
+  uint8_t     marker[NUM_CONNECTIONS];\r
+  connInfo_t *ptr = sPersistInfo.connStruct;\r
+\r
+  memset(&marker, 0x0, sizeof(marker));\r
+\r
+  for (i=0; i<NUM_CONNECTIONS; ++i,++ptr)\r
+  {\r
+    /* Mark the port number as used unless it's a statically allocated port */\r
+    if ((ptr != newPtr) && (CONNSTATE_CONNECTED == ptr->connState) && (ptr->portRx <= SMPL_PORT_USER_MAX))\r
+    {\r
+      if (LINK_SEND == which)\r
+      {\r
+        if (ptr->portRx > sPersistInfo.curNextLinkPort)\r
+        {\r
+          marker[SMPL_PORT_USER_MAX - ptr->portRx] = 1;\r
+        }\r
+      }\r
+      else if (!memcmp(ptr->peerAddr, newPtr->peerAddr, NET_ADDR_SIZE))\r
+      {\r
+          marker[ptr->portRx - PORT_BASE_NUMBER] = 1;\r
+      }\r
+    }\r
+  }\r
+\r
+  num = 0;\r
+  for (i=0; i<NUM_CONNECTIONS; ++i)\r
+  {\r
+    if (!marker[i])\r
+    {\r
+      if (LINK_REPLY == which)\r
+      {\r
+        num = PORT_BASE_NUMBER + i;\r
+      }\r
+      else\r
+      {\r
+        num = SMPL_PORT_USER_MAX - i;\r
+      }\r
+      break;\r
+    }\r
+  }\r
+\r
+  if (LINK_REPLY == which)\r
+  {\r
+    /* if the number we have doesn't overlap the assignment of ports used\r
+     * for sending link frames, use it.\r
+     */\r
+    if (num <= sPersistInfo.curNextLinkPort)\r
+    {\r
+      if (num > sPersistInfo.curMaxReplyPort)\r
+      {\r
+        /* remember maximum port number used */\r
+        sPersistInfo.curMaxReplyPort = num;\r
+      }\r
+    }\r
+    else\r
+    {\r
+      /* the port number we need has already been used in the other context. It may or\r
+       * may not have been used for the same address but we don't bother to check...we\r
+       * just reject the asignment. This is the overly cautious part but is extermely\r
+       * unlikely to ever occur.\r
+       */\r
+      num = 0;\r
+    }\r
+  }\r
+  else\r
+  {\r
+    /* if the number we have doesn't overlap the assignment of ports used\r
+     * for sending link frame replies, use it.\r
+     */\r
+    if (num >= sPersistInfo.curMaxReplyPort)\r
+    {\r
+      if (num == sPersistInfo.curNextLinkPort)\r
+      {\r
+        sPersistInfo.curNextLinkPort--;\r
+      }\r
+    }\r
+    else\r
+    {\r
+      /* the port number we need has already been used in the other context. It may or\r
+       * may not have been used for the same address but we don't bother to check...we\r
+       * just reject the asignment. This is the overly cautious part but is extermely\r
+       * unlikely to ever occur.\r
+       */\r
+      num = 0;\r
+    }\r
+  }\r
+\r
+  newPtr->portRx = num;\r
+\r
+  return num;\r
+#else\r
+  return 0;\r
+#endif  /* NUM_CONNECTIONS > 0 */\r
+\r
+}\r
+\r
+/*******************************************************************************\r
+ * @fn          nwk_isValidReply\r
+ *\r
+ * @brief       Examine a frame to see if it is a valid reply when compared with\r
+ *              expected parameters.\r
+ *\r
+ * input parameters\r
+ * @param   frame      - pointer to frmae being examined\r
+ * @param   tid        - expected transaction ID in application payload\r
+ * @param   infoOffset - offset to payload information containing reply hint\r
+ * @param   tidOffset  - offset to transaction ID in payload\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   reply category:\r
+ *               SMPL_NOT_REPLY: not a reply\r
+ *               SMPL_MY_REPLY : a reply that matches input parameters\r
+ *               SMPL_A_REPLY  : a reply but does not match input parameters\r
+ */\r
+uint8_t nwk_isValidReply(mrfiPacket_t *frame, uint8_t tid, uint8_t infoOffset, uint8_t tidOffset)\r
+{\r
+  uint8_t rc = SMPL_NOT_REPLY;\r
+\r
+  if ((*(MRFI_P_PAYLOAD(frame)+F_APP_PAYLOAD_OS+infoOffset) & NWK_APP_REPLY_BIT))\r
+  {\r
+    if ((*(MRFI_P_PAYLOAD(frame)+F_APP_PAYLOAD_OS+tidOffset) == tid) &&\r
+        !memcmp(MRFI_P_DST_ADDR(frame), nwk_getMyAddress(), NET_ADDR_SIZE))\r
+    {\r
+      rc = SMPL_MY_REPLY;\r
+    }\r
+    else\r
+    {\r
+      rc = SMPL_A_REPLY;\r
+    }\r
+  }\r
+\r
+  return rc;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          map_lid2idx\r
+ *\r
+ * @brief       Map link ID to index into connection table.\r
+ *\r
+ * input parameters\r
+ * @param   lid   - Link ID to be matched\r
+ *\r
+ * output parameters\r
+ * @param   idx   - populated with index into connection table\r
+ *\r
+ * @return   Non-zero if Link ID found and output is valid else 0.\r
+ */\r
+static uint8_t map_lid2idx(linkID_t lid, uint8_t *idx)\r
+{\r
+  uint8_t     i;\r
+  connInfo_t *ptr = sPersistInfo.connStruct;\r
+\r
+  for (i=0; i<SYS_NUM_CONNECTIONS; ++i, ++ptr)\r
+  {\r
+    if ((CONNSTATE_CONNECTED == ptr->connState) && (ptr->thisLinkID == lid))\r
+    {\r
+      *idx = i;\r
+      return 1;\r
+    }\r
+  }\r
+\r
+  return 0;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_findPeer\r
+ *\r
+ * @brief       Find connection entry for a peer\r
+ *\r
+ * input parameters\r
+ * @param   peerAddr   - address of peer\r
+ * @param   peerPort   - port on which this device was sending to peer.\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   Pointer to matching connection table entry else 0.\r
+ */\r
+connInfo_t *nwk_findPeer(addr_t *peerAddr, uint8_t peerPort)\r
+{\r
+  uint8_t     i;\r
+  connInfo_t *ptr = sPersistInfo.connStruct;\r
+\r
+  for (i=0; i<SYS_NUM_CONNECTIONS; ++i, ++ptr)\r
+  {\r
+    if (CONNSTATE_CONNECTED == ptr->connState)\r
+    {\r
+      if (!memcmp(peerAddr, ptr->peerAddr, NET_ADDR_SIZE))\r
+      {\r
+        if (peerPort == ptr->portTx)\r
+        {\r
+          return ptr;\r
+        }\r
+      }\r
+    }\r
+  }\r
+\r
+  return (connInfo_t *)NULL;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_checkAppMsgTID\r
+ *\r
+ * @brief       Compare received TID to last-seen TID to decide whether the\r
+ *              received message is a duplicate or we missed some.\r
+ *\r
+ * input parameters\r
+ * @param   lastTID   - last-seen TID\r
+ * @param   appMsgTID - TID from current application payload.\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   Returns zero if message with supplied TID should be discarded.\r
+ *           Otherwise returns non-zero. In this case the message should be\r
+ *           processed. The last-seen TID should be updated with the current\r
+ *           application payload TID.\r
+ *\r
+ */\r
+uint8_t nwk_checkAppMsgTID(appPTid_t lastTID, appPTid_t appMsgTID)\r
+{\r
+  uint8_t rc = 0;\r
+\r
+  /* If the values are equal this is a duplicate. We're done. */\r
+  if (lastTID != appMsgTID)\r
+  {\r
+    /* Is the new TID bigger? */\r
+    if (appMsgTID > lastTID)\r
+    {\r
+      /* In this case the current payload is OK unless we've received a late\r
+       * (duplicate) message that occurred just before the TID wrapped. This is\r
+       * considered a duplicate and we should discard it.\r
+       */\r
+      if (!(DUP_TID_AFTER_WRAP(lastTID, appMsgTID)))\r
+      {\r
+        rc = 1;\r
+      }\r
+    }\r
+    else\r
+    {\r
+      /* New TID is smaller. Accept the payload if this is the wrap case or we missed\r
+       * the specific wrap frame but are still within the range in which we assume\r
+       * we missed it. Otherwise is a genuine late frame so we should ignore it.\r
+       */\r
+      if (CHECK_TID_WRAP(lastTID, appMsgTID))\r
+      {\r
+        rc = 1;\r
+      }\r
+    }\r
+  }\r
+\r
+  return rc;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_getNumObjectFromMsg\r
+ *\r
+ * @brief       Get a numeric object from a message buffer. Take care of\r
+ *              alignment and endianess issues.\r
+ *\r
+ * input parameters\r
+ * @param   src     - pointer to object location in message buffer\r
+ * @param   objSize - size of numeric object\r
+ *\r
+ * output parameters\r
+ * @param   dest - pointer to numeric type variable receiving the object\r
+ *                 contains aligned number in correct endian order on return.\r
+ *\r
+ * @return   void. There is no warning if there is no case for the supplied\r
+ *                 object size. A simple copy is then done. Alignment is\r
+ *                 guaranteed only for object size cases defined (and\r
+ *                 vacuously size 1).\r
+ *\r
+ */\r
+void nwk_getNumObjectFromMsg(void *src, void *dest, uint8_t objSize)\r
+{\r
+  /* Take care of alignment */\r
+  memmove(dest, src, objSize);\r
+\r
+  /* Take care of endianess */\r
+  switch(objSize)\r
+  {\r
+    case 2:\r
+      *((uint16_t *)dest) = ntohs(*((uint16_t *)dest));\r
+      break;\r
+\r
+    case 4:\r
+      *((uint32_t *)dest) = ntohl(*((uint32_t *)dest));\r
+      break;\r
+  }\r
+\r
+  return;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_putNumObjectIntoMsg\r
+ *\r
+ * @brief       Put a numeric object into a message buffer. Take care of\r
+ *              alignment and endianess issues.\r
+ *\r
+ * input parameters\r
+ * @param   src     - pointer to numeric type variable providing the object\r
+ * @param   objSize - size of numeric object. Fuction works for object size 1.\r
+ *\r
+ * output parameters\r
+ * @param   dest - pointer to object location in message buffer where the\r
+ *                 correct endian order representation will be placed.\r
+ *\r
+ * @return   void. There is no warning if there is no case for the supplied\r
+ *                 object size. A simple copy is then done.\r
+ *\r
+ */\r
+void nwk_putNumObjectIntoMsg(void *src, void *dest, uint8_t objSize)\r
+{\r
+\r
+  uint8_t *ptr;\r
+  uint16_t u16;\r
+  uint32_t u32;\r
+\r
+  /* Take care of endianess */\r
+  switch(objSize)\r
+  {\r
+    case 1:\r
+      ptr = (uint8_t *)src;\r
+      break;\r
+\r
+    case 2:\r
+      u16 = htons(*((uint16_t *)src));\r
+      ptr = (uint8_t *)&u16;\r
+      break;\r
+\r
+    case 4:\r
+      u32 = htonl(*((uint32_t *)src));\r
+      ptr = (uint8_t *)&u32;\r
+      break;\r
+\r
+    default:\r
+      ptr = (uint8_t *)src;\r
+      break;\r
+  }\r
+\r
+  /* Take care of alignment */\r
+  memmove(dest, ptr, objSize);\r
+\r
+  return;\r
+}\r
+/******************************************************************************\r
+ * @fn          nwk_NVObj\r
+ *\r
+ * @brief       GET and SET support for NV object (connection context).\r
+ *\r
+ * input parameters\r
+ * @param   action  - GET or SET\r
+ * @param   val     - (GET/SET) pointer to NV IOCTL object.\r
+ *                    (SET) NV length and version values to be used for sanity\r
+ *                    checks.\r
+ *\r
+ * output parameters\r
+ * @param   val     - (GET) Version number of NV object, size of NV object and\r
+ *                          pointer to the connection context memory.\r
+ *                  - (SET) Pointer to the connection context memory.\r
+ *\r
+ * @return   SMPL_SUCCESS\r
+ *           SMPL_BAD_PARAM   Object version or size do not conform on a SET call\r
+ *                            or illegal action specified.\r
+ */\r
+smplStatus_t nwk_NVObj(ioctlAction_t action, ioctlNVObj_t *val)\r
+{\r
+#ifdef NVOBJECT_SUPPORT\r
+  smplStatus_t rc = SMPL_SUCCESS;\r
+\r
+  if (IOCTL_ACT_GET == action)\r
+  {\r
+    /* Populate helper objects */\r
+    val->objLen     = SIZEOF_NV_OBJ;\r
+    val->objVersion = sPersistInfo.structureVersion;\r
+    /* Set pointer to connection context if address of pointer is not null */\r
+    if (val->objPtr)\r
+    {\r
+      *(val->objPtr) = (uint8_t *)&sPersistInfo;\r
+    }\r
+  }\r
+  else\r
+  {\r
+    rc = SMPL_BAD_PARAM;\r
+  }\r
+\r
+  return rc;\r
+#else  /* NVOBJECT_SUPPORT */\r
+  return SMPL_BAD_PARAM;\r
+#endif\r
+}\r
diff --git a/chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/Components/nwk/nwk.h b/chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/Components/nwk/nwk.h
new file mode 100755 (executable)
index 0000000..6009f38
--- /dev/null
@@ -0,0 +1,159 @@
+/**************************************************************************************************\r
+  Filename:       nwk.h\r
+  Revised:        $Date: 2008-12-01 11:58:33 -0800 (Mon, 01 Dec 2008) $\r
+  Revision:       $Revision: 18551 $\r
+  Author:         $Author: lfriedman $\r
+\r
+  Description:    This header file supports the SimpliciTI network layer.\r
+\r
+  Copyright 2004-2007 Texas Instruments Incorporated. All rights reserved.\r
+\r
+  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+  the terms of a software license agreement between the user who downloaded the software,\r
+  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+  License. The License limits your use, and you acknowledge, that the Software may not be\r
+  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+  perform, display or sell this Software and/or its documentation for any purpose.\r
+\r
+  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+\r
+  Should you have any questions regarding your right to use this Software,\r
+  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+#ifndef NWK_H\r
+#define NWK_H\r
+\r
+\r
+/* well known ports*/\r
+#define SMPL_PORT_PING          0x01\r
+#define SMPL_PORT_LINK          0x02\r
+#define SMPL_PORT_JOIN          0x03\r
+#define SMPL_PORT_SECURITY      0x04\r
+#define SMPL_PORT_FREQ          0x05\r
+#define SMPL_PORT_MGMT          0x06\r
+\r
+#define SMPL_PORT_NWK_BCAST     0x1F\r
+#define SMPL_PORT_USER_BCAST    0x3F\r
+\r
+/* Unconnected User Datagram Link ID */\r
+#define SMPL_LINKID_USER_UUD    ((linkID_t) ~0)\r
+\r
+#define PORT_BASE_NUMBER        0x20\r
+\r
+/* Reserve the top of the User port namespace below the broadcast\r
+ * address for static allocation.\r
+ */\r
+#define PORT_USER_STATIC_NUM    1\r
+#define SMPL_PORT_STATIC_MAX    0x3E\r
+#define SMPL_PORT_USER_MAX      (SMPL_PORT_STATIC_MAX - PORT_USER_STATIC_NUM)\r
+\r
+\r
+/* to check connection info sanity */\r
+#define CHK_RX   0\r
+#define CHK_TX   1\r
+\r
+/* return types for validating a reply frame */\r
+#define SMPL_MY_REPLY    0\r
+#define SMPL_A_REPLY     1\r
+#define SMPL_NOT_REPLY   2\r
+\r
+/* when allocating local Rx port it depends on whether the allocation\r
+ * is being done as a result of a link or a link reply\r
+ */\r
+#define LINK_SEND   1\r
+#define LINK_REPLY  2\r
+\r
+#define  CONNSTATE_FREE       (0x00)\r
+#define  CONNSTATE_JOINED     (0x01)\r
+#define  CONNSTATE_CONNECTED  (0x02)\r
+\r
+typedef struct\r
+{\r
+  volatile uint8_t     connState;\r
+           uint8_t     hops2target;\r
+#ifdef APP_AUTO_ACK\r
+  volatile uint8_t     ackTID;\r
+#endif\r
+           uint8_t     peerAddr[NET_ADDR_SIZE];\r
+           rxMetrics_t sigInfo;\r
+           uint8_t     portRx;\r
+           uint8_t     portTx;\r
+           linkID_t    thisLinkID;\r
+#ifdef SMPL_SECURE\r
+           uint32_t    connTxCTR;\r
+           uint32_t    connRxCTR;\r
+#endif\r
+} connInfo_t;\r
+\r
+/****************************************************************************************\r
+ *                         Application Payload TID support\r
+ *\r
+ * Sometimes the receiving application uses a payload TID to determine if either it\r
+ * missed frames (received TID > (last-seen TID+1)) or is seeing a duplicate (received\r
+ * TID <= last-seen TID). Typically the TID simply increments for each successive frame.\r
+ * But when the count wraps there is a problem. The received TID should always be one\r
+ * more than the last TID. If it's equal, it's a duplicate. If it's less it's late. If\r
+ * it's one more it's the one we expect. If it's more than 1 more then we missed frames.\r
+ * Simple increments work for the wrap arithmetically. If the received TID is 0 and the last\r
+ * seen ID is the biggest number in the world -- 0xFF... depending on type we can detect\r
+ * the wrap. But if the receiver misses the 0 TID value for any reason or the biggest\r
+ * number in the world TID is missed then susbequent testing for missed or duplicate\r
+ * frames can get confused. We resolve this by allowing some leeway in the wrap testing.\r
+ * this testing is assisted by the following macros. Setting TID_VALID_WINDOW to 0\r
+ * will enforce a no leniency policy. In this case you'd better not miss either the\r
+ * biggest number or the 0. The CHECK_TID_WRAP macro is only needed if the received\r
+ * TID is less than the last-seen TID. The DUP_TID_AFTER_WRAP macro is only needed if the\r
+ * received TID is greater than 1 more than the last-seen TID.\r
+ ***************************************************************************************/\r
+#define MAX_APT           ((appPTid_t)~0)    /* max value of application payload TID type */\r
+#define TID_VALID_WINDOW  2                  /* window around max and 0 */\r
+\r
+#define CHECK_TID_WRAP(lastTID, newTID)   ((lastTID >= (MAX_APT - TID_VALID_WINDOW)) &&  \\r
+                                           (newTID <= TID_VALID_WINDOW)                  \\r
+                                          )\r
+#define DUP_TID_AFTER_WRAP(lastTID, newTID)     ((newTID >= (MAX_APT - TID_VALID_WINDOW)) &&  \\r
+                                                 (lastTID <= TID_VALID_WINDOW)                  \\r
+                                                )\r
+\r
+/* prototypes */\r
+smplStatus_t  nwk_nwkInit(uint8_t (*)(linkID_t));\r
+connInfo_t   *nwk_getNextConnection(void);\r
+void          nwk_freeConnection(connInfo_t *);\r
+uint8_t       nwk_getNextClientPort(void);\r
+connInfo_t   *nwk_getConnInfo(linkID_t port);\r
+connInfo_t   *nwk_isLinkDuplicate(uint8_t *, uint8_t);\r
+uint8_t       nwk_findAddressMatch(mrfiPacket_t *);\r
+smplStatus_t  nwk_checkConnInfo(connInfo_t *, uint8_t);\r
+uint8_t       nwk_isConnectionValid(mrfiPacket_t *, linkID_t *);\r
+uint8_t       nwk_allocateLocalRxPort(uint8_t, connInfo_t *);\r
+uint8_t       nwk_isValidReply(mrfiPacket_t *, uint8_t, uint8_t, uint8_t);\r
+connInfo_t   *nwk_findPeer(addr_t *, uint8_t);\r
+smplStatus_t  nwk_NVObj(ioctlAction_t, ioctlNVObj_t *);\r
+\r
+\r
+uint8_t       nwk_checkAppMsgTID(appPTid_t, appPTid_t);\r
+void          nwk_getNumObjectFromMsg(void *, void *, uint8_t);\r
+void          nwk_putNumObjectIntoMsg(void *, void *, uint8_t);\r
+#ifdef ACCESS_POINT\r
+sfInfo_t     *nwk_getSFInfoPtr(void);\r
+#ifdef AP_IS_DATA_HUB\r
+uint8_t       nwk_saveJoinedDevice(mrfiPacket_t *);\r
+connInfo_t   *nwk_findAlreadyJoined(mrfiPacket_t *);\r
+#endif\r
+#endif\r
+\r
+\r
+#endif\r
diff --git a/chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/Components/nwk/nwk_QMgmt.c b/chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/Components/nwk/nwk_QMgmt.c
new file mode 100755 (executable)
index 0000000..4cb34ea
--- /dev/null
@@ -0,0 +1,417 @@
+/**************************************************************************************************\r
+  Filename:       nwk_QMgmt.c\r
+  Revised:        $Date: 2009-03-10 17:01:56 -0700 (Tue, 10 Mar 2009) $\r
+  Revision:       $Revision: 19372 $\r
+  Author:         $Author: lfriedman $\r
+\r
+  Description:    This file supports the SimpliciTI input and output frame queues\r
+\r
+  Copyright 2007-2008 Texas Instruments Incorporated. All rights reserved.\r
+\r
+  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+  the terms of a software license agreement between the user who downloaded the software,\r
+  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+  License. The License limits your use, and you acknowledge, that the Software may not be\r
+  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+  perform, display or sell this Software and/or its documentation for any purpose.\r
+\r
+  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+\r
+  Should you have any questions regarding your right to use this Software,\r
+  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+\r
+/******************************************************************************\r
+ * INCLUDES\r
+ */\r
+#include <intrinsics.h>\r
+#include <string.h>\r
+#include "bsp.h"\r
+#include "mrfi.h"\r
+#include "nwk_types.h"\r
+#include "nwk.h"\r
+#include "nwk_frame.h"\r
+#include "nwk_QMgmt.h"\r
+#include "nwk_mgmt.h"     /* need offsets for poll frames */\r
+\r
+/******************************************************************************\r
+ * MACROS\r
+ */\r
+\r
+/******************************************************************************\r
+ * CONSTANTS AND DEFINES\r
+ */\r
+\r
+/******************************************************************************\r
+ * TYPEDEFS\r
+ */\r
+\r
+/******************************************************************************\r
+ * LOCAL VARIABLES\r
+ */\r
+\r
+#if SIZE_INFRAME_Q > 0\r
+static frameInfo_t   sInFrameQ[SIZE_INFRAME_Q];\r
+#else\r
+static frameInfo_t  *sInFrameQ = NULL;\r
+#endif  /* SIZE_INFRAME_Q > 0 */\r
+\r
+static frameInfo_t   sOutFrameQ[SIZE_OUTFRAME_Q];\r
+\r
+/******************************************************************************\r
+ * LOCAL FUNCTIONS\r
+ */\r
+\r
+/******************************************************************************\r
+ * GLOBAL VARIABLES\r
+ */\r
+\r
+/******************************************************************************\r
+ * GLOBAL FUNCTIONS\r
+ */\r
+\r
+/******************************************************************************\r
+* @fn          nwk_QInit\r
+* \r
+* @brief     Initialize the input and output frame queues to hold no packets. \r
+* \r
+* input parameters\r
+* \r
+* output parameters\r
+* \r
+* @return   void\r
+*/\r
+void nwk_QInit(void)\r
+{\r
+#if SIZE_INFRAME_Q > 0\r
+  memset(sInFrameQ, 0, sizeof(sInFrameQ));\r
+#endif  // SIZE_INFRAME_Q > 0\r
+  memset(sOutFrameQ, 0, sizeof(sOutFrameQ));\r
+}\r
\r
+/******************************************************************************\r
+ * @fn          nwk_QfindSlot\r
+ *\r
+ * @brief       Finds a slot to use to retrieve the frame from the radio. It\r
+ *              uses a LRU cast-out scheme. It is possible that this routine\r
+ *              finds no slot. This can happen if the queue is of size 1 or 2\r
+ *              and the Rx interrupt occurs during a retrieval call from an\r
+ *              application. There are meta-states for frames as the application\r
+ *              looks for the oldest frame on the port being requested.\r
+ *\r
+ *              This routine is running in interrupt context.\r
+ *\r
+ * input parameters\r
+ * @param   which   - INQ or OUTQ to search\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return      Pointer to oldest available frame in the queue\r
+ */\r
+frameInfo_t *nwk_QfindSlot(uint8_t which)\r
+{\r
+  frameInfo_t *pFI, *oldest= 0, *newFI = 0;\r
+  uint8_t        i, num, newOrder = 0, orderTest;\r
+\r
+  if (INQ == which)\r
+  {\r
+    pFI  = sInFrameQ;\r
+    num  = SIZE_INFRAME_Q;\r
+  }\r
+  else\r
+  {\r
+    pFI  = sOutFrameQ;\r
+    num  = SIZE_OUTFRAME_Q;\r
+  }\r
+\r
+  orderTest = num + 1;\r
+\r
+  for (i=0; i<num; ++i, ++pFI)\r
+  {\r
+    /* if frame is available it's a candidate. */\r
+    if (pFI->fi_usage != FI_AVAILABLE)\r
+    {\r
+      if (INQ == which)  /* TODO: do cast-out for Tx as well */\r
+      {\r
+\r
+        /* need to know the number of occupied slots so we know the age value\r
+         * for the unoccupied slot (if there is one).\r
+         */\r
+        newOrder++;\r
+\r
+        /* make sure nwk_retrieveFrame() is not processing this frame */\r
+        if (FI_INUSE_TRANSITION == pFI->fi_usage)\r
+        {\r
+          continue;\r
+        }\r
+        /* is this frame older than any we've seen? */\r
+        if (orderTest > pFI->orderStamp)\r
+        {\r
+          /* yes. */\r
+          oldest    = pFI;\r
+          orderTest = pFI->orderStamp;\r
+        }\r
+      }\r
+    }\r
+    else\r
+    {\r
+      if (OUTQ == which)  /* TODO: do cast-out for Tx as well */\r
+      {\r
+        return pFI;\r
+      }\r
+      newFI = pFI;\r
+    }\r
+  }\r
+\r
+  /* did we find anything? */\r
+  if (!newFI)\r
+  {\r
+    /* queue was full. cast-out happens here...unless... */\r
+    if (!oldest)\r
+    {\r
+      /* This can happen if the queue is only of size 1 or 2 and all\r
+       * the frames are in transition when the Rx interrupt occurs.\r
+       */\r
+      return (frameInfo_t *)0;\r
+    }\r
+    newFI = oldest;\r
+    nwk_QadjustOrder(which, newFI->orderStamp);\r
+    newFI->orderStamp = i;\r
+  }\r
+  else\r
+  {\r
+    /* mark the available slot. */\r
+    newFI->orderStamp = ++newOrder;\r
+  }\r
+\r
+  return newFI;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_QadjustOrder\r
+ *\r
+ * @brief       Adjusts the age of everyone in the queue newer than the frame\r
+ *              being removed.\r
+ *\r
+ * input parameters\r
+ * @param   which   - INQ or OUTQ to adjust\r
+ * @param   stamp   - value of frame being removed\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return      void\r
+ */\r
+void nwk_QadjustOrder(uint8_t which, uint8_t stamp)\r
+{\r
+  frameInfo_t *pFI;\r
+  uint8_t      i, num;\r
+  bspIState_t  intState;\r
+\r
+  if (INQ == which)\r
+  {\r
+    pFI  = sInFrameQ;\r
+    num  = SIZE_INFRAME_Q;\r
+  }\r
+  else\r
+  {\r
+/*    pFI  = sOutFrameQ; */\r
+/*    num  = SIZE_OUTFRAME_Q; */\r
+    return;\r
+  }\r
+\r
+  BSP_ENTER_CRITICAL_SECTION(intState);\r
+\r
+  for (i=0; i<num; ++i, ++pFI)\r
+  {\r
+    if ((pFI->fi_usage != FI_AVAILABLE) && (pFI->orderStamp > stamp))\r
+    {\r
+      pFI->orderStamp--;\r
+    }\r
+  }\r
+\r
+  BSP_EXIT_CRITICAL_SECTION(intState);\r
+\r
+  return;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_QfindOldest\r
+ *\r
+ * @brief       Look through frame queue and find the oldest available frame\r
+ *              in the context in question. Supports connection-based (user),\r
+ *              non-connection based (NWK applications), and the special case\r
+ *              of store-and-forward.\r
+ *\r
+ * input parameters\r
+ * @param   which      - INQ or OUTQ to adjust\r
+ * @param   rcvContext - context information for finding the oldest\r
+ * @param   usage      - normal usage or store-and-forward usage\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return      Pointer to frame that is the oldsest on the requested port, or\r
+ *              0 if there are none.\r
+ */\r
+frameInfo_t *nwk_QfindOldest(uint8_t which, rcvContext_t *rcv, uint8_t fi_usage)\r
+{\r
+  uint8_t      i, oldest, num, port;\r
+  uint8_t      uType, addr12Compare;\r
+  bspIState_t  intState;\r
+  frameInfo_t *fPtr = 0, *wPtr;\r
+  connInfo_t  *pCInfo = 0;\r
+  uint8_t     *pAddr1, *pAddr2, *pAddr3 = 0;\r
+\r
+  if (INQ == which)\r
+  {\r
+    wPtr   = sInFrameQ;\r
+    num    = SIZE_INFRAME_Q;\r
+    oldest = SIZE_INFRAME_Q+1;\r
+  }\r
+  else\r
+  {\r
+/*    pFI  = sOutFrameQ; */\r
+/*    num  = SIZE_OUTFRAME_Q; */\r
+    return 0;\r
+  }\r
+\r
+  if (RCV_APP_LID == rcv->type)\r
+  {\r
+    pCInfo = nwk_getConnInfo(rcv->t.lid);\r
+    if (!pCInfo)\r
+    {\r
+      return (frameInfo_t *)0;\r
+    }\r
+    port   = pCInfo->portRx;\r
+    pAddr2 = pCInfo->peerAddr;\r
+  }\r
+  else if (RCV_NWK_PORT == rcv->type)\r
+  {\r
+    port = rcv->t.port;\r
+  }\r
+#ifdef ACCESS_POINT\r
+  else if (RCV_RAW_POLL_FRAME == rcv->type)\r
+  {\r
+    port   = *(MRFI_P_PAYLOAD(rcv->t.pkt)+F_APP_PAYLOAD_OS+M_POLL_PORT_OS);\r
+    pAddr2 = MRFI_P_SRC_ADDR(rcv->t.pkt);\r
+    pAddr3 = MRFI_P_PAYLOAD(rcv->t.pkt)+F_APP_PAYLOAD_OS+M_POLL_ADDR_OS;\r
+  }\r
+#endif\r
+  else\r
+  {\r
+    return (frameInfo_t *)0;\r
+  }\r
+\r
+  uType = (USAGE_NORMAL == fi_usage) ? FI_INUSE_UNTIL_DEL : FI_INUSE_UNTIL_FWD;\r
+\r
+  for (i=0; i<num; ++i, ++wPtr)\r
+  {\r
+\r
+    BSP_ENTER_CRITICAL_SECTION(intState);   /* protect the frame states */\r
+\r
+    /* only check entries in use and waiting for this port */\r
+    if (uType == wPtr->fi_usage)\r
+    {\r
+      wPtr->fi_usage = FI_INUSE_TRANSITION;\r
+\r
+      BSP_EXIT_CRITICAL_SECTION(intState);  /* release hold */\r
+      /* message sent to this device? */\r
+      if (GET_FROM_FRAME(MRFI_P_PAYLOAD(&wPtr->mrfiPkt), F_PORT_OS) == port)\r
+      {\r
+        /* Port matches. If the port of interest is a NWK applicaiton we're a\r
+         * match...the NWK applications are not connection-based. If it is a\r
+         * NWK application we need to check the source address for disambiguation.\r
+         * Also need to check source address if it's a raw frame lookup (S&F frame)\r
+         */\r
+        if (RCV_APP_LID == rcv->type)\r
+        {\r
+          if (SMPL_PORT_USER_BCAST == port)\r
+          {\r
+            /* guarantee a match... */\r
+            pAddr1 = pCInfo->peerAddr;\r
+          }\r
+          else\r
+          {\r
+            pAddr1 = MRFI_P_SRC_ADDR(&wPtr->mrfiPkt);\r
+          }\r
+        }\r
+#ifdef ACCESS_POINT\r
+        else if (RCV_RAW_POLL_FRAME == rcv->type)\r
+        {\r
+          pAddr1 = MRFI_P_DST_ADDR(&wPtr->mrfiPkt);\r
+        }\r
+#endif\r
+\r
+        addr12Compare = memcmp(pAddr1, pAddr2, NET_ADDR_SIZE);\r
+        if (  (RCV_NWK_PORT == rcv->type) ||\r
+              (!pAddr3 && !addr12Compare) ||\r
+              (pAddr3 && !memcmp(pAddr3, MRFI_P_SRC_ADDR(&wPtr->mrfiPkt), NET_ADDR_SIZE))\r
+           )\r
+        {\r
+          if (wPtr->orderStamp < oldest)\r
+          {\r
+            if (fPtr)\r
+            {\r
+              /* restore previous oldest one */\r
+              fPtr->fi_usage = uType;\r
+            }\r
+            oldest = wPtr->orderStamp;\r
+            fPtr   = wPtr;\r
+            continue;\r
+          }\r
+          else\r
+          {\r
+            /* not oldest. restore state */\r
+            wPtr->fi_usage = uType;\r
+          }\r
+        }\r
+        else\r
+        {\r
+          /* not a match. restore state */\r
+          wPtr->fi_usage = uType;\r
+        }\r
+      }\r
+      else\r
+      {\r
+        /* wrong port. restore state */\r
+        wPtr->fi_usage = uType;\r
+      }\r
+    }\r
+    else\r
+    {\r
+      BSP_EXIT_CRITICAL_SECTION(intState);\r
+    }\r
+  }\r
+\r
+  return fPtr;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_getQ\r
+ *\r
+ * @brief       Get location of teh specified frame queue.\r
+ *\r
+ * input parameters\r
+ * @param   which   - INQ or OUTQ to get\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return      Pointer to frame queue\r
+ */\r
+frameInfo_t *nwk_getQ(uint8_t which)\r
+{\r
+  return (INQ == which) ? sInFrameQ : sOutFrameQ;\r
+}\r
+\r
diff --git a/chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/Components/nwk/nwk_QMgmt.h b/chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/Components/nwk/nwk_QMgmt.h
new file mode 100755 (executable)
index 0000000..aa5535b
--- /dev/null
@@ -0,0 +1,53 @@
+/**************************************************************************************************\r
+  Filename:       nwk_QMgmt.h\r
+  Revised:        $Date: 2009-01-17 15:14:16 -0800 (Sat, 17 Jan 2009) $\r
+  Revision:       $Revision: 18788 $\r
+  Author:         $Author: rlord $\r
+\r
+  Description:    This header file supports the SimpliciTI input and output frame queues.\r
+\r
+  Copyright 2007-2009 Texas Instruments Incorporated. All rights reserved.\r
+\r
+  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+  the terms of a software license agreement between the user who downloaded the software,\r
+  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+  License. The License limits your use, and you acknowledge, that the Software may not be\r
+  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+  perform, display or sell this Software and/or its documentation for any purpose.\r
+\r
+  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+\r
+  Should you have any questions regarding your right to use this Software,\r
+  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+#ifndef NWK_QMGMT_H\r
+#define NWK_QMGMT_H\r
+\r
+\r
+#define  INQ   1\r
+#define  OUTQ  2\r
+\r
+#define  USAGE_NORMAL  1\r
+#define  USAGE_FWD     2\r
+\r
+/* prototypes */\r
+void              nwk_QInit(void);\r
+frameInfo_t *nwk_QfindSlot(uint8_t);\r
+void              nwk_QadjustOrder(uint8_t, uint8_t);\r
+frameInfo_t *nwk_QfindOldest(uint8_t, rcvContext_t *, uint8_t);\r
+frameInfo_t *nwk_getQ(uint8_t);\r
+\r
+#endif  /* NWK_QMGMT_H */\r
diff --git a/chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/Components/nwk/nwk_api.c b/chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/Components/nwk/nwk_api.c
new file mode 100755 (executable)
index 0000000..2139b2c
--- /dev/null
@@ -0,0 +1,858 @@
+/**************************************************************************************************\r
+  Filename:       nwk_api.c\r
+  Revised:        $Date: 2009-01-28 18:27:38 -0800 (Wed, 28 Jan 2009) $\r
+  Revision:       $Revision: 18875 $\r
+  Author:         $Author: lfriedman $\r
+\r
+  Description:    This file supports the SimpliciTI appliction layer API.\r
+\r
+  Copyright 2007-2009 Texas Instruments Incorporated. All rights reserved.\r
+\r
+  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+  the terms of a software license agreement between the user who downloaded the software,\r
+  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+  License. The License limits your use, and you acknowledge, that the Software may not be\r
+  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+  perform, display or sell this Software and/or its documentation for any purpose.\r
+\r
+  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+\r
+  Should you have any questions regarding your right to use this Software,\r
+  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+/******************************************************************************\r
+ * INCLUDES\r
+ */\r
+\r
+#include <string.h>\r
+#include "bsp.h"\r
+#include "mrfi.h"\r
+#include "nwk_types.h"\r
+#include "nwk_api.h"\r
+#include "nwk_frame.h"\r
+#include "nwk.h"\r
+#include "nwk_app.h"\r
+#include "mrfi.h"\r
+#include "nwk_globals.h"\r
+#include "nwk_freq.h"\r
+\r
+/******************************************************************************\r
+ * MACROS\r
+ */\r
+\r
+/******************************************************************************\r
+ * CONSTANTS AND DEFINES\r
+ */\r
+\r
+/* These defines are in support an application listening for a link frame to\r
+ * terminate after some amount of time. The intention is that this guard be\r
+ * the exception. The intention of the SimpliciTI design is that the\r
+ * temporal contiguity between the listen and the reception of the link frame\r
+ * from the peer be very tight. The SMPL_LinkListen() should be termninated\r
+ * by the reception of the link frame. But in case it does not receive the frame\r
+ * the support below allows intervention by the application.\r
+ */\r
+\r
+/* The intention is for user to modify just the following single value */\r
+#define LINKLISTEN_MILLISECONDS_2_WAIT    (5000)\r
+\r
+#define LINKLISTEN_POLL_PERIOD_MS         (10)\r
+#define LINKLISTEN_POLL_COUNT             ( (LINKLISTEN_MILLISECONDS_2_WAIT) / (LINKLISTEN_POLL_PERIOD_MS) )\r
+\r
+/******************************************************************************\r
+ * TYPEDEFS\r
+ */\r
+\r
+/******************************************************************************\r
+ * LOCAL VARIABLES\r
+ */\r
+// [BM] Workaround to enable stack restarting\r
+//static uint8_t sInit_done = 0;\r
+uint8_t sInit_done = 0;\r
+\r
+/******************************************************************************\r
+ * LOCAL FUNCTIONS\r
+ */\r
+static uint8_t ioctlPreInitAccessIsOK(ioctlObject_t);\r
+\r
+/******************************************************************************\r
+ * GLOBAL VARIABLES\r
+ */\r
+\r
+/******************************************************************************\r
+ * GLOBAL FUNCTIONS\r
+ */\r
+\r
+/***********************************************************************************\r
+ * @fn          SMPL_Init\r
+ *\r
+ * @brief       Initialize the SimpliciTI stack.\r
+ *\r
+ * input parameters\r
+ * @param   f  - Pointer to call back function. Function called by NWK when\r
+ *               user application frame received. The callback is done in the\r
+ *               ISR thread. Argument is Link ID associated with frame. Function\r
+ *               returns 0 if frame is to be kept by NWK, otherwise 1. Frame\r
+ *               should be kept if application will do a SMPL_Receive() in the\r
+ *               user thread (recommended). Pointer may be NULL.\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   Status of operation:\r
+ *             SMPL_SUCCESS\r
+ *             SMPL_NO_JOIN     No Join reply. AP possibly not yet up.\r
+ *             SMPL_NO_CHANNEL  Only if Frequency Agility enabled. Channel scan\r
+ *                              failed. AP possibly not yet up.\r
+ */\r
+smplStatus_t SMPL_Init(uint8_t (*f)(linkID_t))\r
+{\r
+  smplStatus_t rc;\r
+\r
+  if (!sInit_done)\r
+  {\r
+    /* set up radio. */\r
+    MRFI_Init();\r
+\r
+    /* initialize network */\r
+    if ((rc=nwk_nwkInit(f)) != SMPL_SUCCESS)\r
+    {\r
+      return rc;\r
+    }\r
+\r
+    MRFI_WakeUp();\r
+#if defined( FREQUENCY_AGILITY )\r
+    {\r
+      freqEntry_t chan;\r
+\r
+      chan.logicalChan = 0;\r
+      /* ok to set default channel explicitly now that MRFI initialized. */\r
+      nwk_setChannel(&chan);\r
+    }\r
+#endif\r
+    /* don't turn Rx on if we're an end device that isn't always on. */\r
+#if !defined( END_DEVICE )\r
+    MRFI_RxOn();\r
+#endif\r
+\r
+#if defined( END_DEVICE )\r
+    /* All except End Devices are in promiscuous mode */\r
+    MRFI_SetRxAddrFilter((uint8_t *)nwk_getMyAddress());\r
+    MRFI_EnableRxAddrFilter();\r
+#endif\r
+  }\r
+  sInit_done = 1;\r
+\r
+  /* Join. if no AP or Join fails that status is returned. */\r
+  rc = nwk_join();\r
+\r
+  return rc;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          SMPL_LinkListen\r
+ *\r
+ * @brief       Listen for a link frame from a 'client' device.\r
+ *\r
+ * input parameters\r
+ *\r
+ * output parameters\r
+ * @param   linkID     - pointer to Link ID to be used by application to\r
+ *                       read and write to the linked peer.\r
+ *\r
+ * @return   status of operation.\r
+ *             SMPL_SUCCESS\r
+ *             SMPL_TIMEOUT  No link frame received during listen interval.\r
+*                            Interval set in #defines above. linkID not valid.\r
+ *\r
+ */\r
+\r
+smplStatus_t SMPL_LinkListen(linkID_t *linkID)\r
+{\r
+  uint8_t  radioState = MRFI_GetRadioState();\r
+  uint16_t i;\r
+  linkID_t locLinkID;\r
+\r
+  /* Set the context. We want to reject any link frames received if\r
+   * we're not listening. For example if we're an AP we are in\r
+   * promiscuous mode and we'll see any broadcast link frames.\r
+   */\r
+  nwk_setListenContext(LINK_LISTEN_ON);\r
+\r
+  NWK_CHECK_FOR_SETRX(radioState);\r
+\r
+  for (i=0; i<LINKLISTEN_POLL_COUNT; ++i)\r
+  {\r
+    /* check the semaphore. local port is assigned when the reply is sent. */\r
+    if ((locLinkID=nwk_getLocalLinkID()))\r
+    {\r
+      break;\r
+    }\r
+    NWK_DELAY(LINKLISTEN_POLL_PERIOD_MS);\r
+  }\r
+\r
+  NWK_CHECK_FOR_RESTORE_STATE(radioState);\r
+\r
+  /* If the listen is terminated without hearing a message and setting a\r
+   * link ID the listen context must be explicitly turned off.\r
+   */\r
+  if (!(locLinkID))\r
+  {\r
+    nwk_setListenContext(LINK_LISTEN_OFF);\r
+    return SMPL_TIMEOUT;\r
+  }\r
+\r
+  *linkID = locLinkID;\r
+\r
+  return SMPL_SUCCESS;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          SMPL_Send\r
+ *\r
+ * @brief       Send a message to a peer application. Old API kept for\r
+ *              backward compatibility. Calls the new SMPL_SendOpt() with\r
+ *              no options.\r
+ *\r
+ * input parameters\r
+ * @param   lid     - Link ID (port) from application\r
+ * @param   msg     - pointer to message from app to be sent\r
+ * @param   len     - length of enclosed message\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   Status of operation. On a filaure the frame buffer is discarded\r
+ *           and the Send call must be redone by the app.\r
+ *             SMPL_SUCCESS\r
+ *             SMPL_BAD_PARAM    No valid Connection Table entry for Link ID\r
+ *                               Data in Connection Table entry bad\r
+ *                               No message or message too long\r
+ *             SMPL_NOMEM        No room in output frame queue\r
+ *             SMPL_TX_CCA_FAIL  CCA failure.\r
+ */\r
+smplStatus_t SMPL_Send(linkID_t lid, uint8_t *msg, uint8_t len)\r
+{\r
+  return SMPL_SendOpt(lid, msg, len, SMPL_TXOPTION_NONE);\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          SMPL_SendOpt\r
+ *\r
+ * @brief       Send a message to a peer application.\r
+ *\r
+ * input parameters\r
+ * @param   lid     - Link ID (port) from application\r
+ * @param   msg     - pointer to message from app to be sent\r
+ * @param   len     - length of enclosed message\r
+ * @param   options - Transmit options (bit map)\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   Status of operation. On a filaure the frame buffer is discarded\r
+ *           and the Send call must be redone by the app.\r
+ *             SMPL_SUCCESS\r
+ *             SMPL_BAD_PARAM    No valid Connection Table entry for Link ID\r
+ *                               Data in Connection Table entry bad\r
+ *                               No message or message too long\r
+ *             SMPL_NOMEM        No room in output frame queue\r
+ *             SMPL_TX_CCA_FAIL  CCA failure.\r
+ *             SMPL_NO_ACK       If application auto acknowledgement enabled\r
+ *                               and no acknowledgement is received\r
+ */\r
+smplStatus_t SMPL_SendOpt(linkID_t lid, uint8_t *msg, uint8_t len, txOpt_t options)\r
+{\r
+  frameInfo_t  *pFrameInfo;\r
+  connInfo_t   *pCInfo     = nwk_getConnInfo(lid);\r
+  smplStatus_t  rc         = SMPL_BAD_PARAM;\r
+  uint8_t       radioState = MRFI_GetRadioState();\r
+  uint8_t       ackreq     = 0;\r
+#if defined(ACCESS_POINT)\r
+  uint8_t  loc;\r
+#endif\r
+\r
+  /* we have the connection info for this Link ID. make sure it is valid. */\r
+   if (!pCInfo || ((rc=nwk_checkConnInfo(pCInfo, CHK_TX)) != SMPL_SUCCESS))\r
+  {\r
+    return rc;\r
+  }\r
+\r
+  /* parameter sanity check... */\r
+  if (!msg || (len > MAX_APP_PAYLOAD))\r
+  {\r
+    return rc;\r
+  }\r
+\r
+  /* Build an outgoing message frame destined for the port from the\r
+   * connection info using the destination address also from the\r
+   * connection info.\r
+   */\r
+  if (SMPL_TXOPTION_NONE == options)\r
+  {\r
+    pFrameInfo = nwk_buildFrame(pCInfo->portTx, msg, len, pCInfo->hops2target);\r
+  }\r
+#if defined(APP_AUTO_ACK)\r
+  else if (options & SMPL_TXOPTION_ACKREQ)\r
+  {\r
+    if (SMPL_LINKID_USER_UUD != lid)\r
+    {\r
+      pFrameInfo = nwk_buildAckReqFrame(pCInfo->portTx, msg, len, pCInfo->hops2target, &pCInfo->ackTID);\r
+      ackreq     = 1;\r
+    }\r
+    else\r
+    {\r
+      /* can't request an ack on the UUD link ID */\r
+      return SMPL_BAD_PARAM;\r
+    }\r
+  }\r
+#endif  /* APP_AUTO_ACK */\r
+  else\r
+  {\r
+    return SMPL_BAD_PARAM;\r
+  }\r
+\r
+  if (!pFrameInfo)\r
+  {\r
+    return SMPL_NOMEM;\r
+  }\r
+  memcpy(MRFI_P_DST_ADDR(&pFrameInfo->mrfiPkt), pCInfo->peerAddr, NET_ADDR_SIZE);\r
+\r
+#if defined(SMPL_SECURE)\r
+  {\r
+    uint32_t *pUL = 0;\r
+\r
+    if (pCInfo->thisLinkID != SMPL_LINKID_USER_UUD)\r
+    {\r
+      pUL = &pCInfo->connTxCTR;\r
+    }\r
+    nwk_setSecureFrame(&pFrameInfo->mrfiPkt, len, pUL);\r
+  }\r
+#endif  /* SMPL_SECURE */\r
+\r
+#if defined(ACCESS_POINT)\r
+  /* If we are an AP trying to send to a polling device, don't do it.\r
+   * See if the target is a store-and-forward client.\r
+   */\r
+  if (nwk_isSandFClient(MRFI_P_DST_ADDR(&pFrameInfo->mrfiPkt), &loc))\r
+  {\r
+     pFrameInfo->fi_usage = FI_INUSE_UNTIL_FWD;\r
+     return SMPL_SUCCESS;\r
+  }\r
+  else\r
+#endif  /* ACCESS_POINT */\r
+  {\r
+    rc = nwk_sendFrame(pFrameInfo, MRFI_TX_TYPE_CCA);\r
+  }\r
+\r
+#if !defined(APP_AUTO_ACK)\r
+  /* save a little code space with this #if */\r
+  (void) ackreq;    /* keep compiler happy */\r
+  return rc;\r
+#else\r
+  /* we're done if the send failed or no ack requested. */\r
+  if (SMPL_SUCCESS != rc || !ackreq)\r
+  {\r
+    return rc;\r
+  }\r
+\r
+  NWK_CHECK_FOR_SETRX(radioState);\r
+  NWK_REPLY_DELAY();\r
+  NWK_CHECK_FOR_RESTORE_STATE(radioState);\r
+\r
+  {\r
+    bspIState_t intState;\r
+\r
+    /* If the saved TID hasn't been reset then we never got the ack. */\r
+    BSP_ENTER_CRITICAL_SECTION(intState);\r
+    if (pCInfo->ackTID)\r
+    {\r
+      pCInfo->ackTID = 0;\r
+      rc = SMPL_NO_ACK;\r
+    }\r
+    BSP_EXIT_CRITICAL_SECTION(intState);\r
+  }\r
+\r
+  return rc;\r
+#endif  /* APP_AUTO_ACK */\r
+}\r
+\r
+/**************************************************************************************\r
+ * @fn          SMPL_Receive\r
+ *\r
+ * @brief       Receive a message from a peer application.\r
+ *\r
+ * input parameters\r
+ * @param   lid     - Link ID (port) from application\r
+ *\r
+ *\r
+ * output parameters\r
+ * @param   msg     - pointer to where received message should be copied.\r
+ *                    buffer should be of size == MAX_APP_PAYLOAD\r
+ * @param   len     - pointer to receive length of received message\r
+ *\r
+ * @return    Status of operation.\r
+ *            Caller should not use the value returned in 'len' to decide\r
+ *            whether there is a frame or not. It could be useful to the\r
+ *            Caller to distinguish between no frame and a frame with no data.\r
+ *            For example, in the polling case a frame with no application payload\r
+ *            is the way the AP conveys that there are no frames waiting.\r
+ *\r
+ *              SMPL_SUCCESS\r
+ *\r
+ *              SMPL_BAD_PARAM  No valid Connection Table entry for Link ID\r
+ *                              Data in Connection Table entry bad\r
+ *              SMPL_NO_FRAME   No frame received.\r
+ *              SMPL_NO_PAYLOAD Frame received with no payload (not necessarily\r
+ *                              an error and could be deduced by application\r
+ *                              because the returned length will be 0)\r
+ *\r
+ *            Polling device only:\r
+ *\r
+ *              SMPL_TIMEOUT        No response from Access Point\r
+ *              SMPL_NO_AP_ADDRESS  Access Point address unknown\r
+ *              SMPL_TX_CCA_FAIL    Could not send poll frame\r
+ *              SMPL_NOMEM          No memory in output frame queue\r
+ *              SMPL_NO_CHANNEL     Frequency Agility enabled and could not find channel\r
+ */\r
+smplStatus_t SMPL_Receive(linkID_t lid, uint8_t *msg, uint8_t *len)\r
+{\r
+  connInfo_t  *pCInfo = nwk_getConnInfo(lid);\r
+  smplStatus_t rc = SMPL_BAD_PARAM;\r
+  rcvContext_t rcv;\r
+\r
+  if (!pCInfo || ((rc=nwk_checkConnInfo(pCInfo, CHK_RX)) != SMPL_SUCCESS))\r
+  {\r
+    return rc;\r
+  }\r
+\r
+  rcv.type  = RCV_APP_LID;\r
+  rcv.t.lid = lid;\r
+\r
+#if defined(RX_POLLS)\r
+  {\r
+    uint8_t numChans  = 1;\r
+#if defined(FREQUENCY_AGILITY)\r
+    freqEntry_t chans[NWK_FREQ_TBL_SIZE];\r
+    uint8_t     scannedB4 = 0;\r
+#endif\r
+\r
+    do\r
+    {\r
+      uint8_t radioState = MRFI_GetRadioState();\r
+\r
+      /* I'm polling. Do the poll to stimulate the sending of a frame. If the\r
+       * frame has application length of 0 it means there were no frames.  If\r
+       * no reply is received infer that the channel is changed. We then need\r
+       * to scan and then retry the poll on each channel returned.\r
+       */\r
+      if (SMPL_SUCCESS != (rc=nwk_poll(pCInfo->portRx, pCInfo->peerAddr)))\r
+      {\r
+        /* for some reason couldn't send the poll out. */\r
+        return rc;\r
+      }\r
+\r
+      /* do this before code block below which may reset it. */\r
+      numChans--;\r
+\r
+      /* Wait until there's a frame. if the len is 0 then return SMPL_NO_FRAME\r
+       * to the caller. In the poll case the AP always sends something.\r
+       */\r
+      NWK_CHECK_FOR_SETRX(radioState);\r
+      NWK_REPLY_DELAY();\r
+      NWK_CHECK_FOR_RESTORE_STATE(radioState);\r
+\r
+      /* TODO: deal with pending */\r
+      rc = nwk_retrieveFrame(&rcv, msg, len, 0, 0);\r
+\r
+#if defined(FREQUENCY_AGILITY)\r
+      if (SMPL_SUCCESS == rc)\r
+      {\r
+        /* we received something... */\r
+        return (*len) ? SMPL_SUCCESS : SMPL_NO_PAYLOAD;\r
+      }\r
+\r
+      /* No reply. scan for other channel(s) if we haven't already. Then set\r
+       * one and try again.\r
+       */\r
+      if (!scannedB4)\r
+      {\r
+        numChans  = nwk_scanForChannels(chans);\r
+        scannedB4 = 1;\r
+      }\r
+      if (numChans)\r
+      {\r
+        nwk_setChannel(&chans[numChans-1]);\r
+      }\r
+#else /*  FREQUENCY_AGILITY */\r
+      return (*len) ? rc : ((SMPL_SUCCESS == rc) ? SMPL_NO_PAYLOAD : SMPL_TIMEOUT);\r
+#endif\r
+    } while (numChans);\r
+  }\r
+\r
+#if defined(FREQUENCY_AGILITY)\r
+  return SMPL_NO_CHANNEL;\r
+#endif\r
+\r
+#else  /* RX_POLLS */\r
+  return nwk_retrieveFrame(&rcv, msg, len, 0, 0);\r
+#endif  /* RX_POLLS */\r
+}\r
+\r
+\r
+/******************************************************************************\r
+ * @fn          SMPL_Link\r
+ *\r
+ * @brief       Link to a peer.\r
+ *\r
+ * input parameters\r
+ *\r
+ * output parameters\r
+ * @param   lid     - pointer to where we should write the link ID to which the\r
+ *                    application will read and write.\r
+ *\r
+ * @return   Status of operation.\r
+ *             SMPL_SUCCESS\r
+ *             SMPL_NOMEM         No room to allocate local Rx port, no more\r
+ *                                room in Connection Table, or no room in\r
+ *                                output frame queue.\r
+ *             SMPL_NO_LINK       No reply frame during wait window.\r
+ *             SMPL_TX_CCA_FAIL   Could not send Link frame.\r
+ */\r
+smplStatus_t SMPL_Link(linkID_t *lid)\r
+{\r
+  return nwk_link(lid);\r
+}\r
+\r
+#if defined(EXTENDED_API)\r
+/**************************************************************************************\r
+ * @fn          SMPL_Unlink\r
+ *\r
+ * @brief       Tear down connection to a peer.\r
+ *\r
+ * input parameters\r
+ * @param   lid     - Link ID whose connection is to be terminated.\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   Status of operation. The Connection Table entry for the Link ID\r
+ *           is always freed successfuly. The returned status value is the\r
+ *           status of the _peer's_ connection tear-down as a result of the\r
+ *           message sent here.\r
+ *           SMPL_SUCCESS         Local and remote connection destroyed.\r
+ *           SMPL_BAD_PARAM       No local connection table entry for this Link ID\r
+ *           SMPL_TIMEOUT         No reply from peer.\r
+ *           SMPL_NO_PEER_UNLINK  Peer did not have a Connection Table entry for me.\r
+ */\r
+smplStatus_t SMPL_Unlink(linkID_t lid)\r
+{\r
+  return nwk_unlink(lid);\r
+}\r
+\r
+/**************************************************************************************\r
+ * @fn          SMPL_Ping\r
+ *\r
+ * @brief       Ping a peer. Synchronous call. Although a link ID is used it is the\r
+ *              NWK Ping application that is pinged, not the peer of this Link ID. The\r
+ *              peer is not expected to be the responder to the frame sent from here.\r
+ *              This API is a proxy for a real ping since the application doesn't\r
+ *              have direct access to SimpliciTI device addresses. Kind of hokey but a\r
+ *              useful keep-alive mechanism without having to support it with\r
+ *              user application service.\r
+ *\r
+ * input parameters\r
+ * @param   lid  - The link ID whose peer device address is used to direct the NWK Ping\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   Status of operation.\r
+ */\r
+smplStatus_t SMPL_Ping(linkID_t lid)\r
+{\r
+  return nwk_ping(lid);\r
+}\r
+\r
+/**************************************************************************************\r
+ * @fn          SMPL_Commission\r
+ *\r
+ * @brief       Commission a connection.\r
+ *\r
+ * input parameters\r
+ * @param   peerAddr  - Pointer to address of the peer for this connection\r
+ * @param    locPort  - Port on which to listen for messages from the peer\r
+ * @param    rmtPort  - Port on which to send messages to the peer.\r
+ * @param        lid  - Pointer to Link ID object. If content of location is\r
+ *                      non-zero on input the value is placed in the Connection\r
+ *                      object.\r
+ *\r
+ * output parameters\r
+ * @param        lid  - Pointer to Link ID object. If content of location is zero\r
+ *                      on input the value in the Connection object is stored there.\r
+ *\r
+ * @return   SMPL_SUCCESS\r
+ *           SMPL_NOMEM     - No room left in Connection table.\r
+ *           SMPL_BAD_PARAM - A pointer to a Link object was not supplied.\r
+ */\r
+smplStatus_t SMPL_Commission(addr_t *peerAddr, uint8_t locPort, uint8_t rmtPort, linkID_t *lid)\r
+{\r
+  connInfo_t   *pCInfo = nwk_getNextConnection();\r
+  smplStatus_t  rc     = SMPL_BAD_PARAM;\r
+\r
+  do {\r
+    if (pCInfo)\r
+    {\r
+      /* sanity checks... */\r
+\r
+      /* Check port info. */\r
+      if ((locPort > SMPL_PORT_STATIC_MAX) || (locPort < (SMPL_PORT_STATIC_MAX - PORT_USER_STATIC_NUM + 1)))\r
+      {\r
+        continue;\r
+      }\r
+\r
+      if ((rmtPort > SMPL_PORT_STATIC_MAX) || (rmtPort < (SMPL_PORT_STATIC_MAX - PORT_USER_STATIC_NUM + 1)))\r
+      {\r
+        continue;\r
+      }\r
+\r
+      /* Must supply a pointer to the Link ID object */\r
+      if (!lid)\r
+      {\r
+        /* No Link ID pointer supplied */\r
+        continue;\r
+      }\r
+\r
+      /* we're sane */\r
+\r
+      /* Use the value generated at connection object assign time. */\r
+      *lid = pCInfo->thisLinkID;\r
+\r
+      /* store peer's address */\r
+      memcpy(pCInfo->peerAddr, peerAddr, NET_ADDR_SIZE);\r
+\r
+      /* store port info */\r
+      pCInfo->portRx = locPort;\r
+      pCInfo->portTx = rmtPort;\r
+\r
+      pCInfo->hops2target = MAX_HOPS;\r
+\r
+      rc = SMPL_SUCCESS;\r
+    }\r
+    else\r
+    {\r
+      /* No room in Connection table */\r
+      rc = SMPL_NOMEM;\r
+    }\r
+  } while (0);\r
+\r
+  if ((SMPL_SUCCESS != rc) && pCInfo)\r
+  {\r
+    nwk_freeConnection(pCInfo);\r
+  }\r
+\r
+  return rc;\r
+}\r
+#endif   /* EXTENDED_API */\r
+\r
+/******************************************************************************\r
+ * @fn          SMPL_Ioctl\r
+ *\r
+ * @brief       This routine supplies the SimpliciTI IOCTL support.\r
+ *\r
+ * input parameters\r
+ * @param   object   - The IOCTL target object\r
+ * @param   action   - The IOCTL target action on the object\r
+ * @param   val      - pointer to value. exact forn depends on object type.\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   Status of action. Value depends on object, action, and result.\r
+ *\r
+ *           SMPL_BAD_PARAM is returned if this API is called before\r
+ *                          initialization and the object is not one of\r
+ *                          the valid exceptions.\r
+ */\r
+smplStatus_t SMPL_Ioctl(ioctlObject_t object, ioctlAction_t action, void *val)\r
+{\r
+  smplStatus_t rc;\r
+\r
+  /* if init hasn't occurred see if access is still valid */\r
+  if (!sInit_done && !ioctlPreInitAccessIsOK(object))\r
+  {\r
+    return SMPL_BAD_PARAM;\r
+  }\r
+\r
+  switch (object)\r
+  {\r
+#if defined(EXTENDED_API)\r
+    case IOCTL_OBJ_TOKEN:\r
+      {\r
+        ioctlToken_t *t = (ioctlToken_t *)val;\r
+\r
+        rc = SMPL_SUCCESS;\r
+        if (TT_LINK == t->tokenType)\r
+        {\r
+          if (IOCTL_ACT_SET == action)\r
+          {\r
+            nwk_setLinkToken(t->token.linkToken);\r
+          }\r
+          else if (IOCTL_ACT_GET == action)\r
+          {\r
+            nwk_getLinkToken(&t->token.linkToken);\r
+          }\r
+          else\r
+          {\r
+            rc = SMPL_BAD_PARAM;\r
+          }\r
+        }\r
+        else if (TT_JOIN == t->tokenType)\r
+        {\r
+          if (IOCTL_ACT_SET == action)\r
+          {\r
+            nwk_setJoinToken(t->token.joinToken);\r
+          }\r
+          else if (IOCTL_ACT_GET == action)\r
+          {\r
+            nwk_getJoinToken(&t->token.joinToken);\r
+          }\r
+          else\r
+          {\r
+            rc = SMPL_BAD_PARAM;\r
+          }\r
+        }\r
+        else\r
+        {\r
+          rc = SMPL_BAD_PARAM;\r
+        }\r
+      }\r
+      break;\r
+\r
+    case IOCTL_OBJ_NVOBJ:\r
+      rc = nwk_NVObj(action, (ioctlNVObj_t *)val);\r
+      break;\r
+#endif  /* EXTENDED_API */\r
+\r
+    case IOCTL_OBJ_CONNOBJ:\r
+      rc = nwk_connectionControl(action, val);\r
+      break;\r
+\r
+    case IOCTL_OBJ_ADDR:\r
+      if ((IOCTL_ACT_GET == action) || (IOCTL_ACT_SET == action))\r
+      {\r
+        rc = nwk_deviceAddress(action, (addr_t *)val);\r
+      }\r
+      else\r
+      {\r
+        rc = SMPL_BAD_PARAM;\r
+      }\r
+      break;\r
+\r
+    case IOCTL_OBJ_RAW_IO:\r
+      if (IOCTL_ACT_WRITE == action)\r
+      {\r
+        rc = nwk_rawSend((ioctlRawSend_t *)val);\r
+      }\r
+      else if (IOCTL_ACT_READ == action)\r
+      {\r
+        rc = nwk_rawReceive((ioctlRawReceive_t *)val);\r
+      }\r
+      else\r
+      {\r
+        rc = SMPL_BAD_PARAM;\r
+      }\r
+      break;\r
+\r
+    case IOCTL_OBJ_RADIO:\r
+      rc = nwk_radioControl(action, val);\r
+      break;\r
+\r
+#if defined(ACCESS_POINT)\r
+    case IOCTL_OBJ_AP_JOIN:\r
+      rc = nwk_joinContext(action);\r
+      break;\r
+#endif\r
+#if defined(FREQUENCY_AGILITY)\r
+    case IOCTL_OBJ_FREQ:\r
+      rc = nwk_freqControl(action, val);\r
+      break;\r
+#endif\r
+    case IOCTL_OBJ_FWVER:\r
+      if (IOCTL_ACT_GET == action)\r
+      {\r
+        memcpy(val, nwk_getFWVersion(), SMPL_FWVERSION_SIZE);\r
+        rc = SMPL_SUCCESS;\r
+      }\r
+      else\r
+      {\r
+        rc = SMPL_BAD_PARAM;\r
+      }\r
+      break;\r
+\r
+    case IOCTL_OBJ_PROTOVER:\r
+      if (IOCTL_ACT_GET == action)\r
+      {\r
+        *((uint8_t *)val) = nwk_getProtocolVersion();\r
+        rc = SMPL_SUCCESS;\r
+      }\r
+      else\r
+      {\r
+        rc = SMPL_BAD_PARAM;\r
+      }\r
+      break;\r
+\r
+    default:\r
+      rc = SMPL_BAD_PARAM;\r
+      break;\r
+  }\r
+\r
+  return rc;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          ioctlPreInitAccessIsOK\r
+ *\r
+ * @brief       Is the request legal yet? Most requests are not legal before\r
+ *              SMPL_Init().\r
+ *\r
+ * input parameters\r
+ * @param   object   - The IOCTL target object\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   Returns non-zero if request should be honored for further\r
+ *           processing, otherwise returns 0. This function does not\r
+ *           determine of the object-action pair are valid. It only knows\r
+ *           about exceptions, i.e., those that are valid before the\r
+ *           SMPL_Init() call.\r
+ *\r
+ */\r
+static uint8_t ioctlPreInitAccessIsOK(ioctlObject_t object)\r
+{\r
+  uint8_t rc;\r
+\r
+  /* Currently the only legal pre-init accesses are the address and\r
+   * the token objects.\r
+   */\r
+  switch (object)\r
+  {\r
+    case IOCTL_OBJ_ADDR:\r
+    case IOCTL_OBJ_TOKEN:\r
+      rc = 1;   /* legal */\r
+      break;\r
+\r
+    default:\r
+      rc = 0;   /* not legal when init not done */\r
+      break;\r
+  }\r
+\r
+  return rc;\r
+}\r
diff --git a/chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/Components/nwk/nwk_api.h b/chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/Components/nwk/nwk_api.h
new file mode 100755 (executable)
index 0000000..07ccf85
--- /dev/null
@@ -0,0 +1,56 @@
+/**************************************************************************************************\r
+  Filename:       nwk_api.h\r
+  Revised:        $Date: 2008-11-24 12:09:31 -0800 (Mon, 24 Nov 2008) $\r
+  Revision:       $Revision: 18508 $\r
+  Author:         $Author: lfriedman $\r
+\r
+  Description:    This header file supports the SimpliciTI appliction layer API.\r
+\r
+  Copyright 2004-2007 Texas Instruments Incorporated. All rights reserved.\r
+\r
+  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+  the terms of a software license agreement between the user who downloaded the software,\r
+  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+  License. The License limits your use, and you acknowledge, that the Software may not be\r
+  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+  perform, display or sell this Software and/or its documentation for any purpose.\r
+\r
+  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+\r
+  Should you have any questions regarding your right to use this Software,\r
+  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+#ifndef NWK_API_H\r
+#define NWK_API_H\r
+\r
+/* Tx options (bit map) */\r
+#define  SMPL_TXOPTION_NONE       ((txOpt_t)0x00)\r
+#define  SMPL_TXOPTION_ACKREQ     ((txOpt_t)0x01)\r
+\r
+smplStatus_t SMPL_Init(uint8_t (*)(linkID_t));\r
+smplStatus_t SMPL_Link(linkID_t *);\r
+smplStatus_t SMPL_LinkListen(linkID_t *);\r
+smplStatus_t SMPL_Send(linkID_t lid, uint8_t *msg, uint8_t len);\r
+smplStatus_t SMPL_SendOpt(linkID_t lid, uint8_t *msg, uint8_t len, txOpt_t);\r
+smplStatus_t SMPL_Receive(linkID_t lid, uint8_t *msg, uint8_t *len);\r
+smplStatus_t SMPL_Ioctl(ioctlObject_t, ioctlAction_t, void *);\r
+#ifdef EXTENDED_API\r
+smplStatus_t SMPL_Ping(linkID_t);\r
+smplStatus_t SMPL_Unlink(linkID_t);\r
+smplStatus_t SMPL_Commission(addr_t *, uint8_t, uint8_t, linkID_t *);\r
+#endif  /* EXTENDED_API */\r
+\r
+#endif\r
diff --git a/chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/Components/nwk/nwk_app.h b/chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/Components/nwk/nwk_app.h
new file mode 100755 (executable)
index 0000000..45883b4
--- /dev/null
@@ -0,0 +1,53 @@
+\r
+/**************************************************************************************************\r
+  Filename:       nwk_app.h\r
+  Revised:        $Date: 2007-07-10 11:21:35 -0700 (Tue, 10 Jul 2007) $\r
+  Revision:       $Revision: 14865 $\r
+  Author:         $Author: lfriedman $\r
+\r
+  Description:    This header file is for convenience and includes the headers for all the\r
+                  network applications.\r
+\r
+  Copyright 2004-2007 Texas Instruments Incorporated. All rights reserved.\r
+\r
+  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+  the terms of a software license agreement between the user who downloaded the software,\r
+  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+  License. The License limits your use, and you acknowledge, that the Software may not be\r
+  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+  perform, display or sell this Software and/or its documentation for any purpose.\r
+\r
+  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+\r
+  Should you have any questions regarding your right to use this Software,\r
+  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+\r
+\r
+\r
+#ifndef NWK_APP_H\r
+#define NWK_APP_H\r
+\r
+#include "nwk_freq.h"\r
+#include "nwk_ping.h"\r
+#include "nwk_link.h"\r
+#include "nwk_mgmt.h"\r
+#include "nwk_join.h"\r
+#include "nwk_security.h"\r
+#include "nwk_ioctl.h"\r
+\r
+#endif\r
+\r
diff --git a/chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/Components/nwk/nwk_frame.c b/chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/Components/nwk/nwk_frame.c
new file mode 100755 (executable)
index 0000000..4279b25
--- /dev/null
@@ -0,0 +1,948 @@
+/**************************************************************************************************\r
+  Filename:       nwk_frame.c\r
+  Revised:        $Date: 2009-03-10 16:21:40 -0700 (Tue, 10 Mar 2009) $\r
+  Revision:       $Revision: 19368 $\r
+  Author          $Author: lfriedman $\r
+\r
+  Description:    This file supports the SimpliciTI frame handling functions.\r
+\r
+  Copyright 2007-2009 Texas Instruments Incorporated. All rights reserved.\r
+\r
+  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+  the terms of a software license agreement between the user who downloaded the software,\r
+  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+  License. The License limits your use, and you acknowledge, that the Software may not be\r
+  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+  perform, display or sell this Software and/or its documentation for any purpose.\r
+\r
+  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+\r
+  Should you have any questions regarding your right to use this Software,\r
+  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+\r
+/******************************************************************************\r
+ * INCLUDES\r
+ */\r
+\r
+#include <string.h>\r
+#include "bsp.h"\r
+#include "mrfi.h"\r
+#include "nwk_types.h"\r
+#include "nwk_frame.h"\r
+#include "nwk.h"\r
+#include "nwk_app.h"\r
+#include "nwk_QMgmt.h"\r
+#include "nwk_globals.h"\r
+#include "nwk_mgmt.h"\r
+#include "nwk_security.h"\r
+\r
+/******************************************************************************\r
+ * MACROS\r
+ */\r
+\r
+/******************************************************************************\r
+ * CONSTANTS AND DEFINES\r
+ */\r
+\r
+/******************************************************************************\r
+ * TYPEDEFS\r
+ */\r
+\r
+/******************************************************************************\r
+ * LOCAL VARIABLES\r
+ */\r
+\r
+#if SIZE_INFRAME_Q > 0\r
+/* array of function pointers to handle NWK application frames */\r
+static  fhStatus_t (* const func[])(mrfiPacket_t *) = { nwk_processPing,\r
+                                                        nwk_processLink,\r
+                                                        nwk_processJoin,\r
+                                                        nwk_processSecurity,\r
+                                                        nwk_processFreq,\r
+                                                        nwk_processMgmt\r
+                                                      };\r
+#endif  /* SIZE_INFRAME_Q > 0 */\r
+\r
+static uint8_t sTRACTID = 0;\r
+\r
+static addr_t const *sMyAddr = NULL;\r
+\r
+static uint8_t  sMyRxType = 0, sMyTxType = 0;\r
+\r
+#if !defined(RX_POLLS)\r
+static uint8_t  (*spCallback)(linkID_t) = NULL;\r
+#endif\r
+\r
+/******************************************************************************\r
+ * LOCAL FUNCTIONS\r
+ */\r
+\r
+#if SIZE_INFRAME_Q > 0\r
+/* local helper functions for Rx devices */\r
+static void  dispatchFrame(frameInfo_t *);\r
+#if !defined(END_DEVICE)\r
+#if defined(ACCESS_POINT)\r
+/* only Access Points need to worry about duplicate S&F frames */\r
+uint8_t  isDupSandFFrame(mrfiPacket_t *);\r
+#endif /* ACCESS_POINT */\r
+#endif  /* !END_DEVICE */\r
+#endif  /* SIZE_INFRAME_Q > 0 */\r
+\r
+/******************************************************************************\r
+ * GLOBAL VARIABLES\r
+ */\r
+\r
+/******************************************************************************\r
+ * GLOBAL FUNCTIONS\r
+ */\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_frameInit\r
+ *\r
+ * @brief       Initialize network context.\r
+ *\r
+ * input parameters\r
+ *       pF - Pointer to callback function. If none intended should be NULL.\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return    void\r
+ */\r
+\r
+void nwk_frameInit(uint8_t (*pF)(linkID_t))\r
+{\r
+\r
+/****** Fill static values for the DEVICEINFO byte that will go in each frame ******/\r
+  /* Rx type when frame originates from this device. Set in nwk_buildFrame() */\r
+  /* Tx type when frame sent from this device. Set in nwk_sendframe() */\r
+#if !defined(END_DEVICE)\r
+    sMyRxType = F_RX_TYPE_USER_CTL;\r
+  #if defined(ACCESS_POINT)\r
+    sMyTxType = F_TX_DEVICE_AP;\r
+  #else\r
+    sMyTxType = F_TX_DEVICE_RE;\r
+  #endif\r
+#else\r
+    sMyTxType = F_TX_DEVICE_ED;\r
+  #if defined(RX_POLLS)\r
+    sMyRxType = F_RX_TYPE_POLLS;\r
+  #endif\r
+  #if defined(RX_USER)\r
+    sMyRxType = F_RX_TYPE_USER_CTL;\r
+  #endif\r
+#endif\r
+/****** DONE fill static values for the DEVICEINFO byte that will go in each frame ******/\r
+\r
+#if !defined(RX_POLLS)\r
+  spCallback = pF;\r
+#else\r
+  (void) pF;\r
+#endif\r
+\r
+  sMyAddr = nwk_getMyAddress();\r
+\r
+  while (!(sTRACTID=MRFI_RandomByte())) ;\r
+\r
+  return;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_buildFrame\r
+ *\r
+ * @brief       Builds an output frame for the port and message enclosed.\r
+ *              This routine prepends the frame header and populates the\r
+ *              frame in the output queue.\r
+ *\r
+ * input parameters\r
+ * @param   port    - port from application\r
+ * @param   msg     - pointer to message from app to be sent\r
+ * @param   len     - length of enclosed message\r
+ * @param   hops    - number of hops allowed. this is less than MAX_HOPS\r
+ *                    whenever the frame is being sent to the AP. this is to\r
+ *                    help mitigate the (short) broadcast storms\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   pointer to frameInfo_t structure created. NULL if there is\r
+ *           no room in output queue.\r
+ */\r
+frameInfo_t *nwk_buildFrame(uint8_t port, uint8_t *msg, uint8_t len, uint8_t hops)\r
+{\r
+  frameInfo_t  *fInfoPtr;\r
+\r
+  if (!(fInfoPtr=nwk_QfindSlot(OUTQ)))\r
+  {\r
+    return (frameInfo_t *)NULL;\r
+  }\r
+\r
+  MRFI_SET_PAYLOAD_LEN(&fInfoPtr->mrfiPkt, len+F_APP_PAYLOAD_OS);\r
+\r
+  PUT_INTO_FRAME(MRFI_P_PAYLOAD(&fInfoPtr->mrfiPkt), F_ENCRYPT_OS, 0);\r
+  PUT_INTO_FRAME(MRFI_P_PAYLOAD(&fInfoPtr->mrfiPkt), F_PORT_OS, port);\r
+  PUT_INTO_FRAME(MRFI_P_PAYLOAD(&fInfoPtr->mrfiPkt), F_TRACTID_OS, sTRACTID);\r
+  while (!(++sTRACTID)) ;  /* transaction ID can't be 0 */\r
+  PUT_INTO_FRAME(MRFI_P_PAYLOAD(&fInfoPtr->mrfiPkt), F_RX_TYPE, sMyRxType);\r
+  PUT_INTO_FRAME(MRFI_P_PAYLOAD(&fInfoPtr->mrfiPkt), F_HOP_COUNT, hops);\r
+\r
+  /* reset ack-relevant bits */\r
+  PUT_INTO_FRAME(MRFI_P_PAYLOAD(&fInfoPtr->mrfiPkt), F_ACK_REQ, 0);\r
+  PUT_INTO_FRAME(MRFI_P_PAYLOAD(&fInfoPtr->mrfiPkt), F_ACK_RPLY, 0);\r
+\r
+  /* reset forwarding bit */\r
+  PUT_INTO_FRAME(MRFI_P_PAYLOAD(&fInfoPtr->mrfiPkt), F_FWD_FRAME, 0);\r
+\r
+  memcpy(MRFI_P_PAYLOAD(&fInfoPtr->mrfiPkt)+F_APP_PAYLOAD_OS, msg, len);\r
+  memcpy(MRFI_P_SRC_ADDR(&fInfoPtr->mrfiPkt), sMyAddr, NET_ADDR_SIZE);\r
+\r
+  return fInfoPtr;\r
+}\r
+\r
+#if defined(APP_AUTO_ACK)\r
+/******************************************************************************\r
+ * @fn          nwk_buildAckReqFrame\r
+ *\r
+ * @brief       Builds an output frame for the port and message enclosed.\r
+ *              This routine prepends the frame header and populates the\r
+ *              frame in the output queue. The frame is set to request that\r
+ *              an ack frame be sent by the peer.\r
+ *\r
+ * input parameters\r
+ * @param   port    - port from application\r
+ * @param   msg     - pointer to message from app to be sent\r
+ * @param   len     - length of enclosed message\r
+ * @param   hops    - number of hops allowed. this is less than MAX_HOPS\r
+ *                    whenever the frame is being sent to the AP. this is to\r
+ *                    help mitigate the (short) broadcast storms\r
+ * @param   tid     - Transaction ID to insert in NWK header used to match\r
+ *                    the ack reply.\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   pointer to frameInfo_t structure created. NULL if there is\r
+ *           no room in output queue.\r
+ */\r
+frameInfo_t *nwk_buildAckReqFrame(uint8_t port, uint8_t *msg, uint8_t len, uint8_t hops, volatile uint8_t *tid)\r
+{\r
+  frameInfo_t *fInfoPtr;\r
+\r
+  /* Build a normal frame first. */\r
+  if (!(fInfoPtr=nwk_buildFrame(port, msg, len, hops)))\r
+  {\r
+    return (frameInfo_t *)NULL;\r
+  }\r
+\r
+  /* save TID  */\r
+  *tid = GET_FROM_FRAME(MRFI_P_PAYLOAD(&fInfoPtr->mrfiPkt), F_TRACTID_OS);\r
+  /* Set REQ_ACK bit */\r
+  PUT_INTO_FRAME(MRFI_P_PAYLOAD(&fInfoPtr->mrfiPkt), F_ACK_REQ, F_ACK_REQ_TYPE);\r
+\r
+  return fInfoPtr;\r
+}\r
+#endif  /* APP_AUTO_ACK */\r
+\r
+#if SIZE_INFRAME_Q > 0\r
+/******************************************************************************\r
+ * @fn          MRFI_RxCompleteISR\r
+ *\r
+ * @brief       Here on Rx interrupt from radio. Process received frame from the\r
+ *              radio Rx FIFO.\r
+ *\r
+ * input parameters\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return      void\r
+ */\r
+void MRFI_RxCompleteISR()\r
+{\r
+  frameInfo_t  *fInfoPtr;\r
+\r
+  /* room for more? */\r
+  if (fInfoPtr=nwk_QfindSlot(INQ))\r
+  {\r
+    MRFI_Receive(&fInfoPtr->mrfiPkt);\r
+\r
+    dispatchFrame(fInfoPtr);\r
+  }\r
+\r
+  return;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_retrieveFrame\r
+ *\r
+ * @brief       Retrieve frame from Rx frame queue. Invoked by application-level\r
+ *              code either app through SMPL_Receive() or IOCTL through raw Rx. This\r
+ *              should run in a user thread, not an ISR thread.\r
+ *\r
+ * input parameters\r
+ * @param    port    - port on which to get a frame\r
+ *\r
+ * output parameters\r
+ * @param    msg     - pointer to where app payload should be copied. Buffer\r
+ *                     allocated should be == MAX_APP_PAYLOAD.\r
+ *\r
+ * @param    len      - pointer to where payload length should be stored. Caller\r
+ *                      can check for non-zero when polling the port. initialized\r
+ *                      to 0 even if no frame is retrieved.\r
+ * @param    srcAddr  - if non-NULL, a pointer to where to copy the source address\r
+ *                      of the retrieved message.\r
+ * @param    hopCount - if non-NULL, a pointer to where to copy the hop count\r
+                        of the retrieved message.\r
+ *\r
+ * @return    SMPL_SUCCESS\r
+ *            SMPL_NO_FRAME  - no frame found for specified destination\r
+ *            SMPL_BAD_PARAM - no valid connection info for the Link ID\r
+ *\r
+ */\r
+smplStatus_t nwk_retrieveFrame(rcvContext_t *rcv, uint8_t *msg, uint8_t *len, addr_t *srcAddr, uint8_t *hopCount)\r
+{\r
+  frameInfo_t *fPtr;\r
+  uint8_t      done;\r
+\r
+  do {\r
+    /* look for a frame on requested port. */\r
+    *len = 0;\r
+    done = 1;\r
+\r
+    fPtr = nwk_QfindOldest(INQ, rcv, USAGE_NORMAL);\r
+    if (fPtr)\r
+    {\r
+      connInfo_t  *pCInfo = 0;\r
+\r
+      if (RCV_APP_LID == rcv->type)\r
+      {\r
+        pCInfo = nwk_getConnInfo(rcv->t.lid);\r
+        if (!pCInfo)\r
+        {\r
+          return SMPL_BAD_PARAM;\r
+        }\r
+#if defined(SMPL_SECURE)\r
+        /* decrypt here...we have all the context we need. */\r
+        {\r
+          uint32_t  ctr  = pCInfo->connRxCTR;\r
+          uint32_t *pctr = &ctr;\r
+          uint8_t   len  = MRFI_GET_PAYLOAD_LEN(&fPtr->mrfiPkt) - F_SEC_CTR_OS;\r
+\r
+          if (pCInfo->thisLinkID == SMPL_LINKID_USER_UUD)\r
+          {\r
+            pctr = NULL;\r
+          }\r
+#if defined(RX_POLLS)\r
+          else if ((F_APP_PAYLOAD_OS - F_SEC_CTR_OS) == len)\r
+          {\r
+            /* This was an empty poll reply frame generated by the AP.\r
+             * It uses the single-byte CTR value like network applications.\r
+             * We do not want to use the application layer counter in this case.\r
+             */\r
+            pctr = NULL;\r
+          }\r
+#endif\r
+          if (nwk_getSecureFrame(&fPtr->mrfiPkt, len, pctr))\r
+          {\r
+            if (pctr)\r
+            {\r
+              /* Update connection's counter. */\r
+              pCInfo->connRxCTR = ctr;\r
+            }\r
+          }\r
+          else\r
+          {\r
+            /* Frame bogus. Check for another frame. */\r
+            done = 0;\r
+            continue;\r
+          }\r
+        }\r
+#endif  /* SMPL_SECURE */\r
+      }\r
+\r
+      /* it's on the requested port. */\r
+      *len = MRFI_GET_PAYLOAD_LEN(&fPtr->mrfiPkt) - F_APP_PAYLOAD_OS;\r
+      memcpy(msg, MRFI_P_PAYLOAD(&fPtr->mrfiPkt)+F_APP_PAYLOAD_OS, *len);\r
+      /* save signal info */\r
+      if (pCInfo)\r
+      {\r
+        /* Save Rx metrics... */\r
+        pCInfo->sigInfo.rssi = fPtr->mrfiPkt.rxMetrics[MRFI_RX_METRICS_RSSI_OFS];\r
+        pCInfo->sigInfo.lqi  = fPtr->mrfiPkt.rxMetrics[MRFI_RX_METRICS_CRC_LQI_OFS];\r
+      }\r
+      if (srcAddr)\r
+      {\r
+        /* copy source address if requested */\r
+        memcpy(srcAddr, MRFI_P_SRC_ADDR(&fPtr->mrfiPkt), NET_ADDR_SIZE);\r
+      }\r
+      if (hopCount)\r
+      {\r
+        /* copy hop count if requested */\r
+        *hopCount = GET_FROM_FRAME(MRFI_P_PAYLOAD(&fPtr->mrfiPkt), F_HOP_COUNT);\r
+      }\r
+      /* input frame no longer needed. free it. */\r
+      nwk_QadjustOrder(INQ, fPtr->orderStamp);\r
+\r
+      fPtr->fi_usage = FI_AVAILABLE;\r
+      return SMPL_SUCCESS;\r
+    }\r
+  } while (!done);\r
+\r
+  return SMPL_NO_FRAME;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          dispatchFrame\r
+ *\r
+ * @brief       Received frame looks OK so far. Dispatch to either NWK app by\r
+ *              invoking the handler or the user's app by simply leaving the\r
+ *              frame in the queue and letting the app poll the port.\r
+ *\r
+ * input parameters\r
+ * @param   fiPtr    - frameInfo_t pointer to received frame\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   void\r
+ */\r
+static void dispatchFrame(frameInfo_t *fiPtr)\r
+{\r
+  uint8_t     port       = GET_FROM_FRAME(MRFI_P_PAYLOAD(&fiPtr->mrfiPkt), F_PORT_OS);\r
+  uint8_t     nwkAppSize = sizeof(func)/sizeof(func[0]);\r
+  fhStatus_t  rc;\r
+  linkID_t    lid;\r
+#if defined(ACCESS_POINT)\r
+  uint8_t loc;\r
+#endif\r
+#if !defined(END_DEVICE)\r
+  uint8_t isForMe;\r
+#endif\r
+\r
+  /* be sure it's not an echo... */\r
+  if (!memcmp(MRFI_P_SRC_ADDR(&fiPtr->mrfiPkt), sMyAddr, NET_ADDR_SIZE))\r
+  {\r
+    fiPtr->fi_usage = FI_AVAILABLE;\r
+    return;\r
+  }\r
+\r
+  /* Make sure encyrption bit conforms to our security support context. */\r
+#if defined(SMPL_SECURE)\r
+  if (!(GET_FROM_FRAME(MRFI_P_PAYLOAD(&fiPtr->mrfiPkt), F_ENCRYPT_OS)))\r
+  {\r
+    /* Encyrption bit is not on when when it should be */\r
+    fiPtr->fi_usage = FI_AVAILABLE;\r
+    return;\r
+  }\r
+#else\r
+  if (GET_FROM_FRAME(MRFI_P_PAYLOAD(&fiPtr->mrfiPkt), F_ENCRYPT_OS))\r
+  {\r
+    /* Encyrption bit is on when when it should not be */\r
+    fiPtr->fi_usage = FI_AVAILABLE;\r
+    return;\r
+  }\r
+#endif  /* SMPL_SECURE */\r
+\r
+  /* If it's a network application port dispatch to service routine. Dispose\r
+   * of frame depending on return code.\r
+   */\r
+  if (port && (port <= nwkAppSize))\r
+  {\r
+#if defined(SMPL_SECURE)\r
+    /* Non-connection-based frame. We can decode here if it was encrypted */\r
+    if (!nwk_getSecureFrame(&fiPtr->mrfiPkt, MRFI_GET_PAYLOAD_LEN(&fiPtr->mrfiPkt) - F_SEC_CTR_OS, 0))\r
+    {\r
+      fiPtr->fi_usage = FI_AVAILABLE;\r
+      return;\r
+    }\r
+#endif\r
+    rc = func[port-1](&fiPtr->mrfiPkt);\r
+    if (FHS_KEEP == rc)\r
+    {\r
+      fiPtr->fi_usage = FI_INUSE_UNTIL_DEL;\r
+    }\r
+#if !defined(END_DEVICE)\r
+    else if (FHS_REPLAY == rc)\r
+    {\r
+      /* an AP or an RE could be relaying a NWK application frame... */\r
+      nwk_replayFrame(fiPtr);\r
+    }\r
+#endif\r
+    else  /* rc == FHS_RELEASE (default...) */\r
+    {\r
+      fiPtr->fi_usage = FI_AVAILABLE;\r
+    }\r
+    return;\r
+  }\r
+  /* sanity check */\r
+  else if ((port != SMPL_PORT_USER_BCAST) && ((port < PORT_BASE_NUMBER) || (port > SMPL_PORT_STATIC_MAX)))\r
+  {\r
+    /* bogus port. drop frame */\r
+    fiPtr->fi_usage = FI_AVAILABLE;\r
+    return;\r
+  }\r
+\r
+  /* At this point we know the target is a user app. If this is an end device\r
+   * and we got this far save the frame and we're done. If we're an AP there\r
+   * are 3 cases: it's for us, it's for s store-and-forward client, or we need\r
+   * to replay the frame. If we're and RE and the frame didn't come from an RE\r
+   * and it's not for us, replay the frame.\r
+   */\r
+\r
+#if defined(END_DEVICE)\r
+  /* If we're s polling end device we only accept application frames from\r
+   * the AP. This prevents duplicate reception if we happen to be on when\r
+   * a linked peer sends.\r
+   */\r
+#if defined(RX_POLLS)\r
+  if (F_TX_DEVICE_ED != GET_FROM_FRAME(MRFI_P_PAYLOAD(&fiPtr->mrfiPkt), F_TX_DEVICE))\r
+  {\r
+    if (nwk_isConnectionValid(&fiPtr->mrfiPkt, &lid))\r
+    {\r
+      fiPtr->fi_usage = FI_INUSE_UNTIL_DEL;\r
+    }\r
+    else\r
+    {\r
+      fiPtr->fi_usage = FI_AVAILABLE;\r
+    }\r
+  }\r
+  else\r
+  {\r
+    fiPtr->fi_usage = FI_AVAILABLE;\r
+  }\r
+#else\r
+  /* it's destined for a user app. */\r
+  if (nwk_isConnectionValid(&fiPtr->mrfiPkt, &lid))\r
+  {\r
+    fiPtr->fi_usage = FI_INUSE_UNTIL_DEL;\r
+    if (spCallback && spCallback(lid))\r
+    {\r
+      fiPtr->fi_usage = FI_AVAILABLE;\r
+      return;\r
+    }\r
+  }\r
+  else\r
+  {\r
+    fiPtr->fi_usage = FI_AVAILABLE;\r
+  }\r
+#endif  /* RX_POLLS */\r
+\r
+#else   /* END_DEVICE */\r
+\r
+  /* We have an issue if the frame is broadcast to the UUD port. The AP (or RE) must\r
+   * handle this frame as if it were the target in case there is an application\r
+   * running that is listening on that port. But if it's a broadcast it must also be\r
+   * replayed. It isn't enough just to test for the UUD port because it could be a\r
+   * directed frame to another device. We must check explicitly for broadcast\r
+   * destination address.\r
+   */\r
+  isForMe = !memcmp(sMyAddr, MRFI_P_DST_ADDR(&fiPtr->mrfiPkt), NET_ADDR_SIZE);\r
+  if (isForMe || ((port == SMPL_PORT_USER_BCAST) && !memcmp(nwk_getBCastAddress(), MRFI_P_DST_ADDR(&fiPtr->mrfiPkt), NET_ADDR_SIZE)))\r
+  {\r
+    /* The folllowing test will succeed for the UUD port regardless of the\r
+     * source address.\r
+     */\r
+    if (nwk_isConnectionValid(&fiPtr->mrfiPkt, &lid))\r
+    {\r
+      /* If this is for the UUD port and we are here then the device is either\r
+       * an AP or an RE. In either case it must replay the UUD port frame if the\r
+       * frame is not "for me". But it also must handle it since it could have a\r
+       * UUD-listening application. Do the reply first and let the subsequent code\r
+       * correctly set the frame usage state. Note that the routine return can be\r
+       * from this code block. If not it will drop through to the bottom without\r
+       * doing a replay.\r
+       */\r
+      /* Do I need to replay it? */\r
+      if (!isForMe)\r
+      {\r
+        /* must be a broadcast for the UUD port */\r
+        nwk_replayFrame(fiPtr);\r
+      }\r
+      /* OK. Now I handle it... */\r
+      fiPtr->fi_usage = FI_INUSE_UNTIL_DEL;\r
+      if (spCallback && spCallback(lid))\r
+      {\r
+        fiPtr->fi_usage = FI_AVAILABLE;\r
+        return;\r
+      }\r
+    }\r
+    else\r
+    {\r
+      fiPtr->fi_usage = FI_AVAILABLE;\r
+    }\r
+  }\r
+#if defined( ACCESS_POINT )\r
+  /* Check to see if we need to save this for a S and F client. Otherwise,\r
+   * if it's not for us, get rid of it.\r
+   */\r
+  else if (nwk_isSandFClient(MRFI_P_DST_ADDR(&fiPtr->mrfiPkt), &loc))\r
+  {\r
+    /* Don't bother if it is a duplicate frame or if it's a forwarded frame\r
+     * echoed back from an RE.\r
+     */\r
+    if (!isDupSandFFrame(&fiPtr->mrfiPkt) &&\r
+        !(GET_FROM_FRAME(MRFI_P_PAYLOAD(&fiPtr->mrfiPkt), F_FWD_FRAME))\r
+       )\r
+    {\r
+#if defined(APP_AUTO_ACK)\r
+      /* Make sure ack request bit is off. Sender will have gone away. */\r
+      PUT_INTO_FRAME(MRFI_P_PAYLOAD(&fiPtr->mrfiPkt), F_ACK_REQ, 0);\r
+#endif\r
+      fiPtr->fi_usage = FI_INUSE_UNTIL_FWD;\r
+    }\r
+    else\r
+    {\r
+      fiPtr->fi_usage = FI_AVAILABLE;\r
+    }\r
+  }\r
+  else if (GET_FROM_FRAME(MRFI_P_PAYLOAD(&fiPtr->mrfiPkt), F_TX_DEVICE) == F_TX_DEVICE_AP)\r
+  {\r
+    /* I'm an AP and this frame came from an AP. Don't replay. */\r
+    fiPtr->fi_usage = FI_AVAILABLE;\r
+  }\r
+#elif defined( RANGE_EXTENDER )\r
+  else if (GET_FROM_FRAME(MRFI_P_PAYLOAD(&fiPtr->mrfiPkt), F_TX_DEVICE) == F_TX_DEVICE_RE)\r
+  {\r
+    /* I'm an RE and this frame came from an RE. Don't replay. */\r
+    fiPtr->fi_usage = FI_AVAILABLE;\r
+  }\r
+#endif\r
+  else\r
+  {\r
+    /* It's not for me and I'm either an AP or I'm an RE and the frame\r
+     * didn't come from an RE. Replay the frame.\r
+     */\r
+    nwk_replayFrame(fiPtr);\r
+  }\r
+#endif  /* !END_DEVICE */\r
+  return;\r
+}\r
+#endif   /* SIZE_INFRAME_Q > 0 */\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_sendFrame\r
+ *\r
+ * @brief       Send a frame by copying it to the radio Tx FIFO.\r
+ *\r
+ * input parameters\r
+ * @param   pFrameInfo   - pointer to frame to be sent\r
+ * @param   txOption     - do CCA or force frame out.\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return    SMPL_SUCCESS\r
+ *            SMPL_TX_CCA_FAIL Tx failed because of CCA failure.\r
+ *                             Tx FIFO flushed in this case.\r
+ */\r
+smplStatus_t nwk_sendFrame(frameInfo_t *pFrameInfo, uint8_t txOption)\r
+{\r
+  smplStatus_t rc;\r
+\r
+  /* set the type of device sending the frame in the header */\r
+  PUT_INTO_FRAME(MRFI_P_PAYLOAD(&pFrameInfo->mrfiPkt), F_TX_DEVICE, sMyTxType);\r
+\r
+  if (MRFI_TX_RESULT_SUCCESS == MRFI_Transmit(&pFrameInfo->mrfiPkt, txOption))\r
+  {\r
+    rc = SMPL_SUCCESS;\r
+  }\r
+  else\r
+  {\r
+    /* Tx failed -- probably CCA. free up frame buffer. We do not have NWK\r
+     * level retries. Let application do it.\r
+     */\r
+    rc = SMPL_TX_CCA_FAIL;\r
+  }\r
+\r
+  /* TX is done. free up the frame buffer */\r
+  pFrameInfo->fi_usage = FI_AVAILABLE;\r
+\r
+  return rc;\r
+}\r
+\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_getMyRxType\r
+ *\r
+ * @brief       Get my Rx type. Used to help populate the hops count in the\r
+ *              frame header to try and limit the broadcast storm. Info is\r
+ *              exchanged when linking.\r
+ *\r
+ * input parameters\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return      The address LSB.\r
+ */\r
+uint8_t nwk_getMyRxType(void)\r
+{\r
+  return sMyRxType;\r
+}\r
+\r
+#if defined(APP_AUTO_ACK)\r
+/******************************************************************************\r
+ * @fn          nwk_sendAckReply\r
+ *\r
+ * @brief       Send an acknowledgement reply frame.\r
+ *\r
+ * input parameters\r
+ * @param   frame   - pointer to frame with ack request.\r
+ * @param   port    - port on whcih reply expected.\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return      void\r
+ */\r
+void nwk_sendAckReply(mrfiPacket_t *frame, uint8_t port)\r
+{\r
+  mrfiPacket_t dFrame;\r
+  uint8_t      tid = GET_FROM_FRAME(MRFI_P_PAYLOAD(frame), F_TRACTID_OS);\r
+\r
+  /* set the type of device sending the frame in the header */\r
+  PUT_INTO_FRAME(MRFI_P_PAYLOAD(&dFrame), F_TX_DEVICE, sMyTxType);\r
+\r
+  /* set the listen type of device sending the frame in the header. */\r
+  PUT_INTO_FRAME(MRFI_P_PAYLOAD(&dFrame), F_RX_TYPE, sMyRxType);\r
+\r
+  /* destination address from received frame */\r
+  memcpy(MRFI_P_DST_ADDR(&dFrame), MRFI_P_SRC_ADDR(frame), NET_ADDR_SIZE);\r
+\r
+  /* source address */\r
+  memcpy(MRFI_P_SRC_ADDR(&dFrame), sMyAddr, NET_ADDR_SIZE);\r
+\r
+  /* port is the source the Tx port from the connection object */\r
+  PUT_INTO_FRAME(MRFI_P_PAYLOAD(&dFrame), F_PORT_OS, port);\r
+\r
+  /* frame length... */\r
+  MRFI_SET_PAYLOAD_LEN(&dFrame,F_APP_PAYLOAD_OS);\r
+\r
+  /* transaction ID taken from source frame */\r
+  PUT_INTO_FRAME(MRFI_P_PAYLOAD(&dFrame), F_TRACTID_OS, tid);\r
+\r
+  /* hop count... */\r
+  PUT_INTO_FRAME(MRFI_P_PAYLOAD(&dFrame), F_HOP_COUNT, MAX_HOPS);\r
+\r
+  /* set ACK field */\r
+  PUT_INTO_FRAME(MRFI_P_PAYLOAD(&dFrame), F_ACK_RPLY, F_ACK_RPLY_TYPE);\r
+  PUT_INTO_FRAME(MRFI_P_PAYLOAD(&dFrame), F_ACK_REQ, 0);\r
+\r
+   /* This is not a forwarded frame */\r
+  PUT_INTO_FRAME(MRFI_P_PAYLOAD(&dFrame), F_FWD_FRAME, 0);\r
+\r
+  /* Encryption state */\r
+#if !defined(SMPL_SECURE)\r
+  PUT_INTO_FRAME(MRFI_P_PAYLOAD(&dFrame), F_ENCRYPT_OS, 0);\r
+#else\r
+  PUT_INTO_FRAME(MRFI_P_PAYLOAD(&dFrame), F_ENCRYPT_OS, F_ENCRYPT_OS_MSK);\r
+  nwk_setSecureFrame(&dFrame, 0, 0);\r
+#endif\r
+\r
+  MRFI_Transmit(&dFrame, MRFI_TX_TYPE_FORCED);\r
+\r
+  return;\r
+}\r
+#endif /* APP_AUTO_ACK */\r
+\r
+#if !defined(END_DEVICE)\r
+/******************************************************************************\r
+ * @fn          nwk_replayFrame\r
+ *\r
+ * @brief       Deal with hop count on a Range Extender or Access Point replay.\r
+ *              Queue entry usage always left as available when done.\r
+ *\r
+ * input parameters\r
+ * @param   pFrameInfo   - pointer to frame information structure\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return      void\r
+ */\r
+void nwk_replayFrame(frameInfo_t *pFrameInfo)\r
+{\r
+  uint8_t  hops = GET_FROM_FRAME(MRFI_P_PAYLOAD(&pFrameInfo->mrfiPkt), F_HOP_COUNT);\r
+\r
+  /* if hops are zero, drop frame. othewise send it. */\r
+  if (hops--)\r
+  {\r
+    PUT_INTO_FRAME(MRFI_P_PAYLOAD(&pFrameInfo->mrfiPkt),F_HOP_COUNT,hops);\r
+    /* Don't care if the Tx fails because of TO. Either someone else\r
+     * will retransmit or the application itself will recover.\r
+     */\r
+#if defined(SMPL_SECURE)\r
+    /* If the frame was targeted to a NWK port it was decrypted on spec in\r
+     * the 'dispatchFrame()' method. It must be re-encypted in this case.\r
+     */\r
+    if (GET_FROM_FRAME(MRFI_P_PAYLOAD(&pFrameInfo->mrfiPkt), F_PORT_OS) <= SMPL_PORT_NWK_BCAST)\r
+    {\r
+      nwk_setSecureFrame(&pFrameInfo->mrfiPkt, MRFI_GET_PAYLOAD_LEN(&pFrameInfo->mrfiPkt)-F_APP_PAYLOAD_OS, 0);\r
+    }\r
+#endif\r
+    MRFI_DelayMs(1);\r
+    nwk_sendFrame(pFrameInfo, MRFI_TX_TYPE_CCA);\r
+  }\r
+  else\r
+  {\r
+    pFrameInfo->fi_usage = FI_AVAILABLE;\r
+  }\r
+  return;\r
+}\r
+\r
+#if defined(ACCESS_POINT)\r
+/******************************************************************************\r
+ * @fn          nwk_getSandFFrame\r
+ *\r
+ * @brief       Get any frame waiting for the client on the port supplied in\r
+ *              the frame payload.\r
+ *              TODO: support returning NWK application frames always. the\r
+ *              port requested in the call should be an user application port.\r
+ *              NWK app ports will never be in the called frame.\r
+ *              TODO: deal with broadcast NWK frames from AP.\r
+ *\r
+ * input parameters\r
+ * @param   frame   - pointer to frame in question\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return      pointer to frame if there is one, otherwise 0.\r
+ */\r
+frameInfo_t *nwk_getSandFFrame(mrfiPacket_t *frame, uint8_t osPort)\r
+{\r
+  uint8_t        i, port = *(MRFI_P_PAYLOAD(frame)+F_APP_PAYLOAD_OS+osPort);\r
+  frameInfo_t *fiPtr;\r
+  rcvContext_t rcv;\r
+\r
+  rcv.type  = RCV_RAW_POLL_FRAME;\r
+  rcv.t.pkt = frame;\r
+  /* check the input queue for messages sent by others. */\r
+  if (fiPtr=nwk_QfindOldest(INQ, &rcv, USAGE_FWD))\r
+  {\r
+    return fiPtr;\r
+  }\r
+\r
+  /* Check the output queue to see if we ourselves need to send anything.\r
+   * TODO: use the cast-out scheme for output queue so this routine finds\r
+   * the oldest in either queue.\r
+   */\r
+  fiPtr = nwk_getQ(OUTQ);\r
+  for (i=0; i<SIZE_OUTFRAME_Q; ++i, fiPtr++)\r
+  {\r
+    if (FI_INUSE_UNTIL_FWD == fiPtr->fi_usage)\r
+    {\r
+      if (!memcmp(MRFI_P_DST_ADDR(&fiPtr->mrfiPkt), MRFI_P_SRC_ADDR(frame), NET_ADDR_SIZE))\r
+      {\r
+        if (GET_FROM_FRAME(MRFI_P_PAYLOAD(&fiPtr->mrfiPkt), F_PORT_OS) == port)\r
+        {\r
+          return fiPtr;\r
+        }\r
+      }\r
+    }\r
+  }\r
+  return 0;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_SendEmptyPollRspFrame\r
+ *\r
+ * @brief       There are no frames waiting for the requester on the specified\r
+ *              port. Send a frame back to that port with no payload.\r
+ *\r
+ * input parameters\r
+ * @param   frame   - pointer to frame in question\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return      void\r
+ */\r
+void nwk_SendEmptyPollRspFrame(mrfiPacket_t *frame)\r
+{\r
+  mrfiPacket_t dFrame;\r
+  uint8_t      port = *(MRFI_P_PAYLOAD(frame)+F_APP_PAYLOAD_OS+M_POLL_PORT_OS);\r
+\r
+  /* set the type of device sending the frame in the header. we know it's an AP */\r
+  PUT_INTO_FRAME(MRFI_P_PAYLOAD(&dFrame), F_TX_DEVICE, F_TX_DEVICE_AP);\r
+  /* set the listen type of device sending the frame in the header. we know it's\r
+   * an AP is is probably always on...but use the static variable anyway.\r
+   */\r
+  PUT_INTO_FRAME(MRFI_P_PAYLOAD(&dFrame), F_RX_TYPE, sMyRxType);\r
+  /* destination address from received frame (polling device) */\r
+  memcpy(MRFI_P_DST_ADDR(&dFrame), MRFI_P_SRC_ADDR(frame), NET_ADDR_SIZE);\r
+  /* source address */\r
+  memcpy(MRFI_P_SRC_ADDR(&dFrame), MRFI_P_PAYLOAD(frame)+F_APP_PAYLOAD_OS+M_POLL_ADDR_OS, NET_ADDR_SIZE);\r
+  /* port is the port requested */\r
+  PUT_INTO_FRAME(MRFI_P_PAYLOAD(&dFrame), F_PORT_OS, port);\r
+  /* frame length... */\r
+  MRFI_SET_PAYLOAD_LEN(&dFrame,F_APP_PAYLOAD_OS);\r
+  /* transaction ID... */\r
+  PUT_INTO_FRAME(MRFI_P_PAYLOAD(&dFrame), F_TRACTID_OS, sTRACTID);\r
+  sTRACTID++;\r
+  /* hop count... */\r
+  PUT_INTO_FRAME(MRFI_P_PAYLOAD(&dFrame), F_HOP_COUNT, MAX_HOPS_FROM_AP);\r
+\r
+  /* Ack fields */\r
+  PUT_INTO_FRAME(MRFI_P_PAYLOAD(&dFrame), F_ACK_RPLY, 0);\r
+  PUT_INTO_FRAME(MRFI_P_PAYLOAD(&dFrame), F_ACK_REQ, 0);\r
+\r
+  /* This is logically a forwarded frame */\r
+  PUT_INTO_FRAME(MRFI_P_PAYLOAD(&dFrame), F_FWD_FRAME, F_FRAME_FWD_TYPE);\r
+\r
+  /* Encryption state */\r
+#if !defined(SMPL_SECURE)\r
+  PUT_INTO_FRAME(MRFI_P_PAYLOAD(&dFrame), F_ENCRYPT_OS, 0);\r
+#else\r
+  PUT_INTO_FRAME(MRFI_P_PAYLOAD(&dFrame), F_ENCRYPT_OS, F_ENCRYPT_OS_MSK);\r
+  nwk_setSecureFrame(&dFrame, 0, 0);\r
+#endif\r
+\r
+  MRFI_Transmit(&dFrame, MRFI_TX_TYPE_FORCED);\r
+\r
+  return;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          isDupSandFFrame\r
+ *\r
+ * @brief       Have we already stored this frame on behalf of a client?\r
+ *\r
+ * input parameters\r
+ * @param   frame   - pointer to frame in question\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return      Returns 1 if the frame is a duplicate, otherwise 0.\r
+ */\r
+uint8_t  isDupSandFFrame(mrfiPacket_t *frame)\r
+{\r
+  uint8_t      i, plLen = MRFI_GET_PAYLOAD_LEN(frame);\r
+  frameInfo_t *fiPtr;\r
+\r
+  /* check the input queue for duplicate S&F frame. */\r
+  fiPtr = nwk_getQ(INQ);\r
+  for (i=0; i<SIZE_INFRAME_Q; ++i, fiPtr++)\r
+  {\r
+    if (FI_INUSE_UNTIL_FWD == fiPtr->fi_usage)\r
+    {\r
+      /* compare everything except the DEVICE INFO byte. */\r
+      if (MRFI_GET_PAYLOAD_LEN(&fiPtr->mrfiPkt) == plLen                                   &&\r
+          !memcmp(MRFI_P_DST_ADDR(&fiPtr->mrfiPkt), MRFI_P_DST_ADDR(frame), NET_ADDR_SIZE) &&\r
+          !memcmp(MRFI_P_SRC_ADDR(&fiPtr->mrfiPkt), MRFI_P_SRC_ADDR(frame), NET_ADDR_SIZE) &&\r
+          !memcmp(MRFI_P_PAYLOAD(&fiPtr->mrfiPkt), MRFI_P_PAYLOAD(frame), 1)               &&\r
+          !memcmp(MRFI_P_PAYLOAD(&fiPtr->mrfiPkt)+F_TRACTID_OS, MRFI_P_PAYLOAD(frame)+F_TRACTID_OS, plLen-F_TRACTID_OS)\r
+          )\r
+      {\r
+        return 1;\r
+      }\r
+    }\r
+  }\r
+  return 0;\r
+}\r
+#endif  /* ACCESS_POINT */\r
+\r
+#endif  /* !END_DEVICE */\r
diff --git a/chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/Components/nwk/nwk_frame.h b/chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/Components/nwk/nwk_frame.h
new file mode 100755 (executable)
index 0000000..6c616f8
--- /dev/null
@@ -0,0 +1,151 @@
+/**************************************************************************************************\r
+  Filename:       nwk_frame.h\r
+  Revised:        $Date: 2008-12-23 13:49:41 -0800 (Tue, 23 Dec 2008) $\r
+  Revision:       $Revision: 18651 $\r
+  Author:         $Author: lfriedman $\r
+\r
+  Description:    This header file supports the SimpliciTI frame handling functions.\r
+\r
+  Copyright 2004-2007 Texas Instruments Incorporated. All rights reserved.\r
+\r
+  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+  the terms of a software license agreement between the user who downloaded the software,\r
+  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+  License. The License limits your use, and you acknowledge, that the Software may not be\r
+  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+  perform, display or sell this Software and/or its documentation for any purpose.\r
+\r
+  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+\r
+  Should you have any questions regarding your right to use this Software,\r
+  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+\r
+#ifndef NWK_FRAME_H\r
+#define NWK_FRAME_H\r
+\r
+/* Frame field defines and masks. Mask name must be field name with '_MSK' appended\r
+ * so the GET and PUT macros work correctly -- they use token pasting. Offset values\r
+ * are with respect to the MRFI payload and not the entire frame.\r
+ */\r
+#define F_PORT_OS         0\r
+#define F_PORT_OS_MSK     (0x3F)\r
+#define F_ENCRYPT_OS      0\r
+#define F_ENCRYPT_OS_MSK  (0x40)\r
+#define F_FWD_FRAME       0\r
+#define F_FWD_FRAME_MSK   (0x80)\r
+#define F_RX_TYPE         1\r
+#define F_RX_TYPE_MSK     (0x40)\r
+#define F_ACK_REQ         1\r
+#define F_ACK_REQ_MSK     (0x80)\r
+#define F_ACK_RPLY        1\r
+#define F_ACK_RPLY_MSK    (0x08)\r
+#define F_TX_DEVICE       1\r
+#define F_TX_DEVICE_MSK   (0x30)\r
+#define F_HOP_COUNT       1\r
+#define F_HOP_COUNT_MSK   (0x07)\r
+#define F_TRACTID_OS      2\r
+#define F_TRACTID_OS_MSK  (0xFF)\r
+#define SMPL_NWK_HDR_SIZE 3\r
+\r
+#ifdef SMPL_SECURE\r
+\r
+#define F_SECURE_OS       3\r
+\r
+#define F_SEC_CTR_OS      3       /* counter hint */\r
+#define F_SEC_CTR_OS_MSK  (0xFF)\r
+#define F_SEC_ICHK_OS     4       /* Message integrity check */\r
+#define F_SEC_ICHK_OS_MSK (0xFF)\r
+#define F_SEC_MAC_OS      5       /* Message authentication code */\r
+#define F_SEC_MAC_OS_MSK  (0xFF)\r
+\r
+#else\r
+\r
+#define F_SECURE_OS       0\r
+\r
+#endif  /* SMPL_SECURE */\r
+\r
+#define F_APP_PAYLOAD_OS  (SMPL_NWK_HDR_SIZE+F_SECURE_OS)\r
+\r
+/* sub field details. they are in the correct bit locations (already shifted) */\r
+#define F_RX_TYPE_USER_CTL       0x00    /* does not poll... */\r
+#define F_RX_TYPE_POLLS          0x40    /* polls for held messages */\r
+\r
+#define F_ACK_REQ_TYPE           0x80\r
+#define F_ACK_RPLY_TYPE          0x08\r
+#define F_FRAME_FWD_TYPE         0x80\r
+#define F_FRAME_ENCRYPT_TYPE     0x40\r
+\r
+/* device type fields */\r
+#define F_TX_DEVICE_ED           0x00    /* End Device */\r
+#define F_TX_DEVICE_RE           0x10    /* Range Extender */\r
+#define F_TX_DEVICE_AP           0x20    /* Access Point */\r
+\r
+/* macro to get a field from a frame buffer */\r
+#define GET_FROM_FRAME(b,f)  ((b)[f] & (f##_MSK))\r
+\r
+/* Macro to put a value 'v' into a frame buffer 'b'. 'v' value must already be shifted\r
+ * if necessary. 'b' is a byte array\r
+ */\r
+#define PUT_INTO_FRAME(b,f,v)  do {(b)[f] = ((b)[f] & ~(f##_MSK)) | (v); } while(0)\r
+\r
+\r
+/*       ****   frame information objects\r
+ * info kept on each frame object\r
+ */\r
+#define   FI_AVAILABLE         0   /* entry available for use */\r
+#define   FI_INUSE_UNTIL_DEL   1   /* in use. will be explicitly reclaimed */\r
+#define   FI_INUSE_UNTIL_TX    2   /* in use. will be reclaimed after Tx */\r
+#define   FI_INUSE_UNTIL_FWD   3   /* in use until forwarded by AP */\r
+#define   FI_INUSE_TRANSITION  4   /* being retrieved. do not delete in Rx ISR thread. */\r
+\r
+typedef struct\r
+{\r
+  uint8_t   rssi;\r
+  uint8_t   lqi;\r
+} sigInfo_t;\r
+\r
+typedef struct\r
+{\r
+  volatile uint8_t      fi_usage;\r
+           uint8_t      orderStamp;\r
+           mrfiPacket_t mrfiPkt;\r
+} frameInfo_t;\r
+\r
+\r
+/* prototypes */\r
+frameInfo_t  *nwk_buildFrame(uint8_t, uint8_t *msg, uint8_t len, uint8_t hops);\r
+#ifdef APP_AUTO_ACK\r
+frameInfo_t  *nwk_buildAckReqFrame(uint8_t, uint8_t *, uint8_t, uint8_t, volatile uint8_t *);\r
+#endif\r
+void          nwk_receiveFrame(void);\r
+void          nwk_frameInit(uint8_t (*)(linkID_t));\r
+smplStatus_t  nwk_retrieveFrame(rcvContext_t *, uint8_t *, uint8_t *, addr_t *, uint8_t *);\r
+smplStatus_t  nwk_sendFrame(frameInfo_t *, uint8_t txOption);\r
+frameInfo_t  *nwk_getSandFFrame(mrfiPacket_t *, uint8_t);\r
+uint8_t       nwk_getMyRxType(void);\r
+void          nwk_SendEmptyPollRspFrame(mrfiPacket_t *);\r
+#ifdef APP_AUTO_ACK\r
+void          nwk_sendAckReply(mrfiPacket_t *, uint8_t);\r
+#endif\r
+\r
+#ifndef END_DEVICE\r
+/* only APs and REs repeat frames */\r
+void  nwk_replayFrame(frameInfo_t *);\r
+#endif\r
+\r
+\r
+#endif\r
diff --git a/chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/Components/nwk/nwk_globals.c b/chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/Components/nwk/nwk_globals.c
new file mode 100755 (executable)
index 0000000..121b5e3
--- /dev/null
@@ -0,0 +1,258 @@
+/**************************************************************************************************\r
+  Filename:       nwk_globals.c\r
+  Revised:        $Date: 2009-10-27 20:48:11 -0700 (Tue, 27 Oct 2009) $\r
+  Revision:       $Revision: 20995 $\r
+\r
+  Description:    This file manages global NWK data.\r
+\r
+  Copyright 2007-2009 Texas Instruments Incorporated. All rights reserved.\r
+\r
+  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+  the terms of a software license agreement between the user who downloaded the software,\r
+  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+  License. The License limits your use, and you acknowledge, that the Software may not be\r
+  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+  perform, display or sell this Software and/or its documentation for any purpose.\r
+\r
+  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+\r
+  Should you have any questions regarding your right to use this Software,\r
+  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+\r
+/******************************************************************************\r
+ * INCLUDES\r
+ */\r
+#include <string.h>\r
+#include "bsp.h"\r
+#include "mrfi.h"\r
+#include "nwk_types.h"\r
+#include "nwk_globals.h"\r
+\r
+/******************************************************************************\r
+ * MACROS\r
+ */\r
+\r
+/******************************************************************************\r
+ * CONSTANTS AND DEFINES\r
+ */\r
+\r
+/******************************************************************************\r
+ * TYPEDEFS\r
+ */\r
+\r
+/******************************************************************************\r
+ * LOCAL VARIABLES\r
+ */\r
+static const addr_t   sMyROMAddress = THIS_DEVICE_ADDRESS;\r
+static addr_t         sAPAddress;\r
+static addr_t         sMyRAMAddress;\r
+static uint8_t        sRAMAddressIsSet = 0;\r
+\r
+/* Version number set as a 4 byte quantity. Each byte is a revision number\r
+ * in the form w.x.y.z. The subfields are each limited to values 0x0-0xFF.\r
+ */\r
+static const smplVersionInfo_t sVersionInfo = {\r
+                                                0x02,  /* protocol version */\r
+                                                0x01,  /* major revision number */\r
+                                                0x01,  /* minor revision number */\r
+                                                0x01,  /* maintenance release number */\r
+                                                0x00   /* special release */\r
+                                               };\r
+\r
+/******************************************************************************\r
+ * LOCAL FUNCTIONS\r
+ */\r
+\r
+/******************************************************************************\r
+ * GLOBAL VARIABLES\r
+ */\r
+\r
+/******************************************************************************\r
+ * GLOBAL FUNCTIONS\r
+ */\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_globalsInit\r
+ *\r
+ * @brief       Initialization of global symbols\r
+ *\r
+ * input parameters\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   void\r
+ */\r
+void nwk_globalsInit(void)\r
+{\r
+\r
+  memset(&sAPAddress, 0x00, sizeof(addr_t));\r
+\r
+  /* populate RAM address from ROM default if it hasn't laready been set\r
+   * using the IOCTL interface.\r
+   */\r
+  if (!sRAMAddressIsSet)\r
+  {\r
+    memcpy(&sMyRAMAddress, &sMyROMAddress, sizeof(addr_t));\r
+    sRAMAddressIsSet = 1;  /* RAM address is now valid */\r
+  }\r
+\r
+  return;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_getMyAddress\r
+ *\r
+ * @brief       Return a pointer to my address. It comes either from ROM as\r
+ *              set in the configuration file or it was set using the IOCTL\r
+ *              interface -- probably from random bytes.\r
+ *\r
+ * input parameters\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   pointer to a constant address type object.\r
+ */\r
+addr_t const *nwk_getMyAddress(void)\r
+{\r
+  /* This call supports returning a valid pointer before either the\r
+   * initialization or external setting of the address. But caller needs\r
+   * to be careful -- if this routine is called immediately it will return\r
+   * the ROM address. If the application then sets the address using the\r
+   * IOCTL before doing the SMPL_Init() the original pointer is no longer\r
+   * valid as it points to the wrong address.\r
+   */\r
+  return sRAMAddressIsSet ? &sMyRAMAddress : &sMyROMAddress;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_getFWVersion\r
+ *\r
+ * @brief       Return a pointer to the current firmware version string.\r
+ *\r
+ * input parameters\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   pointer to a constant uint16_t object.\r
+ */\r
+uint8_t const *nwk_getFWVersion()\r
+{\r
+  return sVersionInfo.fwVerString;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_getProtocolVersion\r
+ *\r
+ * @brief       Return the current protocol version.\r
+ *\r
+ * input parameters\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   Protocol version.\r
+ */\r
+uint8_t nwk_getProtocolVersion(void)\r
+{\r
+  return sVersionInfo.protocolVersion;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_setMyAddress\r
+ *\r
+ * @brief       Set my address object if it hasn't already been set. This call\r
+ *              is referenced by the IOCTL support used to change the device\r
+ *              address. It is effective only if the address has not already\r
+ *              been set.\r
+ *\r
+ * input parameters\r
+ *\r
+ * @param   addr  - pointer to the address object to be used to set my address.\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   Returns non-zero if request is respected, otherwise returns 0.\r
+ */\r
+uint8_t nwk_setMyAddress(addr_t *addr)\r
+{\r
+  uint8_t rc = 0;\r
+\r
+  if (!sRAMAddressIsSet)\r
+  {\r
+    memcpy(&sMyRAMAddress, addr, sizeof(addr_t));\r
+    sRAMAddressIsSet = 1;  /* RAM address is now valid */\r
+    rc = 1;\r
+  }\r
+\r
+  return rc;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_setAPAddress\r
+ *\r
+ * @brief       Set the AP's address. Called after the AP address is gleaned\r
+ *              from the Join reply.\r
+ *\r
+ * input parameters\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   void\r
+ */\r
+void nwk_setAPAddress(addr_t *addr)\r
+{\r
+\r
+  memcpy((void *)&sAPAddress, (void *)addr, NET_ADDR_SIZE);\r
+\r
+  return;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_getAPAddress\r
+ *\r
+ * @brief       Get the AP's address.\r
+ *\r
+ * input parameters\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   Pointer to a constant address object or null if the address has not\r
+ *           yet been set.\r
+ */\r
+addr_t const *nwk_getAPAddress(void)\r
+{\r
+  addr_t addr;\r
+\r
+  memset(&addr, 0x0, sizeof(addr));\r
+\r
+  return !memcmp(&sAPAddress, &addr, NET_ADDR_SIZE) ? 0 : &sAPAddress;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_getBCastAddress\r
+ *\r
+ * @brief       Get the network broadcast address.\r
+ *\r
+ * input parameters\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   Pointer to a constant address object.\r
+ */\r
+addr_t const *nwk_getBCastAddress(void)\r
+{\r
+  return (addr_t const *)mrfiBroadcastAddr;\r
+}\r
diff --git a/chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/Components/nwk/nwk_globals.h b/chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/Components/nwk/nwk_globals.h
new file mode 100755 (executable)
index 0000000..728c2ab
--- /dev/null
@@ -0,0 +1,51 @@
+/**************************************************************************************************\r
+  Filename:       nwk_globals.h\r
+  Revised:        $Date: 2008-07-30 11:22:21 -0700 (Wed, 30 Jul 2008) $\r
+  Revision:       $Revision: 17655 $\r
+  Author:         $Author: lfriedman $\r
+\r
+  Description:    This header file supports the management of NWK global symbols.\r
+\r
+  Copyright 2004-2007 Texas Instruments Incorporated. All rights reserved.\r
+\r
+  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+  the terms of a software license agreement between the user who downloaded the software,\r
+  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+  License. The License limits your use, and you acknowledge, that the Software may not be\r
+  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+  perform, display or sell this Software and/or its documentation for any purpose.\r
+\r
+  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+\r
+  Should you have any questions regarding your right to use this Software,\r
+  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+#ifndef NWK_GLOBALS_H\r
+#define NWK_GLOBALS_H\r
+\r
+\r
+/* Prototypes */\r
+void           nwk_globalsInit(void);\r
+addr_t const  *nwk_getMyAddress(void);\r
+uint8_t        nwk_setMyAddress(addr_t *addr);\r
+void           nwk_setAPAddress(addr_t *addr);\r
+addr_t const  *nwk_getAPAddress(void);\r
+addr_t const  *nwk_getBCastAddress(void);\r
+uint8_t const *nwk_getFWVersion(void);\r
+uint8_t        nwk_getProtocolVersion(void);\r
+\r
+\r
+#endif\r
diff --git a/chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/Components/nwk/nwk_types.h b/chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/Components/nwk/nwk_types.h
new file mode 100755 (executable)
index 0000000..bb277ba
--- /dev/null
@@ -0,0 +1,344 @@
+/**************************************************************************************************\r
+  Filename:       nwk_types.h\r
+  Revised:        $Date: 2009-01-13 11:31:14 -0800 (Tue, 13 Jan 2009) $\r
+  Revision:       $Revision: 18744 $\r
+  Author:         $Author: lfriedman $\r
+\r
+  Description:    This header file defines the SimpliciTI typedefs.\r
+\r
+  Copyright 2004-2007 Texas Instruments Incorporated. All rights reserved.\r
+\r
+  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+  the terms of a software license agreement between the user who downloaded the software,\r
+  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+  License. The License limits your use, and you acknowledge, that the Software may not be\r
+  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+  perform, display or sell this Software and/or its documentation for any purpose.\r
+\r
+  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+\r
+  Should you have any questions regarding your right to use this Software,\r
+  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+#ifndef NWK_TYPES_H\r
+#define NWK_TYPES_H\r
+\r
+#define NWK_TX_RETRY_COUNT    10\r
+#define NWK_RX_RETRY_COUNT    10\r
+\r
+#define NWK_APP_REPLY_BIT  (0x80)\r
+\r
+#define NET_ADDR_SIZE      MRFI_ADDR_SIZE   /* size of address in bytes */\r
+\r
+#ifdef  FREQUENCY_AGILITY\r
+#define NWK_FREQ_TBL_SIZE  MRFI_NUM_LOGICAL_CHANS\r
+#else\r
+#define NWK_FREQ_TBL_SIZE  1\r
+#endif\r
+\r
+typedef struct\r
+{\r
+  uint8_t  addr[NET_ADDR_SIZE];\r
+} addr_t;\r
+\r
+typedef uint8_t linkID_t;\r
+typedef uint8_t ccRadioStatus_t;\r
+\r
+\r
+/*      ***********************************************\r
+ *                   Begin IOCTL Support\r
+ *      ***********************************************\r
+ */\r
+enum ioctlObject  {\r
+  IOCTL_OBJ_FREQ,\r
+  IOCTL_OBJ_CRYPTKEY,\r
+  IOCTL_OBJ_RAW_IO,\r
+  IOCTL_OBJ_RADIO,\r
+  IOCTL_OBJ_AP_JOIN,\r
+  IOCTL_OBJ_ADDR,\r
+  IOCTL_OBJ_CONNOBJ,\r
+  IOCTL_OBJ_FWVER,\r
+  IOCTL_OBJ_PROTOVER,\r
+  IOCTL_OBJ_NVOBJ,\r
+  IOCTL_OBJ_TOKEN\r
+};\r
+\r
+enum ioctlAction  {\r
+  IOCTL_ACT_SET,\r
+  IOCTL_ACT_GET,\r
+  IOCTL_ACT_READ,\r
+  IOCTL_ACT_WRITE,\r
+  IOCTL_ACT_RADIO_SLEEP,\r
+  IOCTL_ACT_RADIO_AWAKE,\r
+  IOCTL_ACT_RADIO_SIGINFO,\r
+  IOCTL_ACT_RADIO_RSSI,\r
+  IOCTL_ACT_RADIO_RXON,\r
+  IOCTL_ACT_RADIO_RXIDLE,\r
+  IOCTL_ACT_RADIO_SETPWR,\r
+  IOCTL_ACT_ON,\r
+  IOCTL_ACT_OFF,\r
+  IOCTL_ACT_SCAN,\r
+  IOCTL_ACT_DELETE\r
+};\r
+\r
+typedef enum ioctlObject   ioctlObject_t;\r
+typedef enum ioctlAction   ioctlAction_t;\r
+\r
+enum ioctlLevel\r
+{\r
+  IOCTL_LEVEL_0,\r
+  IOCTL_LEVEL_1,\r
+  IOCTL_LEVEL_2\r
+};\r
+\r
+typedef enum ioctlLevel ioctlLevel_t;\r
+\r
+typedef struct\r
+{\r
+  addr_t   *addr;\r
+  uint8_t  *msg;\r
+  uint8_t   len;\r
+  uint8_t   port;\r
+} ioctlRawSend_t;\r
+\r
+typedef struct\r
+{\r
+  addr_t  *addr;\r
+  uint8_t *msg;\r
+  uint8_t  len;\r
+  uint8_t  port;\r
+  uint8_t  hopCount;\r
+} ioctlRawReceive_t;\r
+\r
+/*\r
+ * Signal information support\r
+ */\r
+typedef int8_t rssi_t;\r
+\r
+typedef struct\r
+{\r
+  rssi_t  rssi;\r
+  uint8_t lqi;\r
+} rxMetrics_t;\r
+\r
+typedef struct\r
+{\r
+  linkID_t     lid;        /* input: Link ID for which signal info desired */\r
+  rxMetrics_t  sigInfo;\r
+} ioctlRadioSiginfo_t;\r
+\r
+\r
+/*                      *** Begin SET/GET token support ***                */\r
+enum tokenType\r
+{\r
+  TT_LINK,      /* Token Type is Link */\r
+  TT_JOIN       /* Token Type is Join */\r
+};\r
+\r
+typedef enum tokenType tokenType_t;\r
+\r
+/* Create a union. If either token ever changes type it will make things easier. */\r
+typedef union\r
+{\r
+  uint32_t linkToken;\r
+  uint32_t joinToken;\r
+} token_t;\r
+\r
+typedef struct\r
+{\r
+  tokenType_t  tokenType;\r
+  token_t      token;\r
+} ioctlToken_t;\r
+/*                      *** End SET/GET token support ***                */\r
+\r
+\r
+/*\r
+ * Frequency Agility support\r
+ */\r
+typedef struct\r
+{\r
+  uint8_t logicalChan;\r
+} freqEntry_t;\r
+\r
+typedef struct\r
+{\r
+  uint8_t      numChan;\r
+  freqEntry_t *freq;\r
+} ioctlScanChan_t;\r
+\r
+/* Security typedefs to make things easier if they change types */\r
+typedef uint8_t  secMAC_t;\r
+typedef uint8_t  secFCS_t;\r
+\r
+/***************************************************************************************\r
+ *                                 ** NV Object support **\r
+ *\r
+ * The following object supports saving and restoring the information\r
+ * necessary to save and restore a device connection context.\r
+ *\r
+ * On a GET interface populates the IOCTL object with the version and length (in bytes)\r
+ * of the current static connection iformation area. In addition it populates the address\r
+ * pointed to by 'objPtr' with the base address of the connection context. At this point\r
+ * the caller can either copy to or from the address. Note that this is a dangerous\r
+ * interface, as the caller is provided with direct access to the connection context.\r
+ *\r
+ * When restoring the connection context some sanity checks are possible. If the\r
+ * version or length elements of the saved context do not match those of the current\r
+ * static object the static object should not be populated. If this sanity fails the\r
+ * caller is not provided with the pointer to the conneciton ocntext.\r
+ *\r
+ * This interface is fairly simple and it is possible to get the address of the\r
+ * connection context to do a restore by simply doing a GET call. This avoids the\r
+ * sanity checks. However, this is not recommended because there may be other side\r
+ * effects of doing a SET that are necessary when restoring a context and are done\r
+ * only when the proper option is used to restore the connection context.\r
+ *\r
+ *************************************************************************************/\r
+typedef struct\r
+{\r
+  uint8_t    objVersion;\r
+  uint16_t   objLen;\r
+  uint8_t  **objPtr;\r
+} ioctlNVObj_t;\r
+\r
+/*      ***********************************************\r
+ *                    End IOCTL Support\r
+ *      ***********************************************\r
+ */\r
+\r
+enum smplStatus  {\r
+  SMPL_SUCCESS,\r
+  SMPL_TIMEOUT,\r
+  SMPL_BAD_PARAM,\r
+  SMPL_NOMEM,\r
+  SMPL_NO_FRAME,\r
+  SMPL_NO_LINK,\r
+  SMPL_NO_JOIN,\r
+  SMPL_NO_CHANNEL,\r
+  SMPL_NO_PEER_UNLINK,\r
+  SMPL_TX_CCA_FAIL,\r
+  SMPL_NO_PAYLOAD,\r
+  SMPL_NO_AP_ADDRESS,\r
+  SMPL_NO_ACK\r
+};\r
+\r
+typedef enum smplStatus    smplStatus_t;\r
+\r
+/* NWK application frame handling status codes */\r
+enum fhStatus\r
+{\r
+  FHS_RELEASE,   /* handled in interrupt thread */\r
+  FHS_KEEP,      /* handled by background application */\r
+  FHS_REPLAY     /* non-ED case: NWK frame not for me that should be replayed */\r
+};\r
+\r
+typedef enum fhStatus   fhStatus_t;\r
+\r
+/********    BEGIN: Object support for parameter context in queue management *********/\r
+enum rcvType\r
+{\r
+  RCV_NWK_PORT,\r
+  RCV_APP_LID,\r
+  RCV_RAW_POLL_FRAME\r
+};\r
+\r
+typedef enum rcvType rcvType_t;\r
+\r
+/* Tx options type */\r
+typedef  uint16_t   txOpt_t;\r
+\r
+typedef struct\r
+{\r
+  rcvType_t   type;\r
+  union\r
+  {\r
+    linkID_t      lid;\r
+    uint8_t       port;\r
+    mrfiPacket_t *pkt;\r
+  } t;\r
+} rcvContext_t;\r
+/********    END: Object support for parameter context in queue management *********/\r
+\r
+#define SMPL_FWVERSION_SIZE  4\r
+\r
+typedef struct\r
+{\r
+  uint8_t  protocolVersion;\r
+  uint8_t  fwVerString[SMPL_FWVERSION_SIZE];\r
+} smplVersionInfo_t;\r
+\r
+/* The following typedef is used to standardize the application Transaction ID field.\r
+ * This field can be used for detection of out-of-order application payloads if this\r
+ * is an issue. There is no real reason to use more than a byte for this support. But\r
+ * if this typedef is anything other than uint8_t be sure to attend to alignment and\r
+ * endian issues.\r
+ */\r
+typedef uint8_t  appPTid_t;\r
+\r
+#ifdef ACCESS_POINT\r
+/* Store-and-forward client info object */\r
+typedef struct\r
+{\r
+  addr_t    clientAddr;\r
+  appPTid_t lastTID;\r
+} sfClientInfo_t;\r
+\r
+typedef struct\r
+{\r
+  uint8_t        curNumSFClients;\r
+  sfClientInfo_t sfClients[NUM_STORE_AND_FWD_CLIENTS];\r
+} sfInfo_t;\r
+#endif\r
+\r
+/****************************************************************************************\r
+ *                           SOME USEFUL MACROS\r
+ ****************************************************************************************/\r
+\r
+/* Delay loop support. Requires mrfi.h */\r
+#define NWK_DELAY(spin)   MRFI_DelayMs(spin)\r
+#define NWK_REPLY_DELAY() MRFI_ReplyDelay();\r
+\r
+/* Network applications may need to remember radio state because the user\r
+ * application may choose to turn Rx off. These macros help get and restore\r
+ * the radio Rx state. The macros should be in the same code block at the same level.\r
+ * The argument 's' is the 'current' radio state and should be set in the code block\r
+ * with a call to MRFI_GetRadioState() _before_ using the macros.\r
+ *\r
+ * Used extensively by NWK but user applications may use them as well. But it is\r
+ * much more liekly that an application will know the radio state since it likely\r
+ * will have set it with IOCTL calls. Requires mrfi.h.\r
+ */\r
+#define NWK_CHECK_FOR_SETRX(s)  if (MRFI_RADIO_STATE_RX != s)    \\r
+                                {                                \\r
+                                  if (MRFI_RADIO_STATE_OFF == s) \\r
+                                  {                              \\r
+                                    MRFI_WakeUp();               \\r
+                                  }                              \\r
+                                  MRFI_RxOn();                   \\r
+                                }\r
+\r
+#define NWK_CHECK_FOR_RESTORE_STATE(s) if (MRFI_RADIO_STATE_RX != s)    \\r
+                                       {                                \\r
+                                         if (MRFI_RADIO_STATE_OFF == s) \\r
+                                         {                              \\r
+                                           MRFI_Sleep();                \\r
+                                         }                              \\r
+                                         else                           \\r
+                                         {                              \\r
+                                           MRFI_RxIdle();               \\r
+                                         }                              \\r
+                                       }\r
+#endif\r
diff --git a/chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/Components/nwk_applications/nwk_freq.c b/chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/Components/nwk_applications/nwk_freq.c
new file mode 100755 (executable)
index 0000000..2a93c39
--- /dev/null
@@ -0,0 +1,619 @@
+/**************************************************************************************************\r
+  Filename:       nwk_freq.c\r
+  Revised:        $Date: 2008-12-10 13:50:46 -0800 (Wed, 10 Dec 2008) $\r
+  Revision:       $Revision: 18594 $\r
+  Author:         $Author: lfriedman $\r
+\r
+  Description:    This file supports the SimpliciTI Freq network application.\r
+\r
+  Copyright 2007-2009 Texas Instruments Incorporated. All rights reserved.\r
+\r
+  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+  the terms of a software license agreement between the user who downloaded the software,\r
+  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+  License. The License limits your use, and you acknowledge, that the Software may not be\r
+  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+  perform, display or sell this Software and/or its documentation for any purpose.\r
+\r
+  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+\r
+  Should you have any questions regarding your right to use this Software,\r
+  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+/******************************************************************************\r
+ * INCLUDES\r
+ */\r
+\r
+#include <string.h>\r
+#include "bsp.h"\r
+#include "mrfi.h"\r
+#include "nwk_types.h"\r
+#include "nwk.h"\r
+#include "nwk_frame.h"\r
+#include "nwk_freq.h"\r
+#include "nwk_globals.h"\r
+#include "nwk_api.h"\r
+#include "nwk_security.h"\r
+\r
+#if defined( FREQUENCY_AGILITY )\r
+/******************************************************************************\r
+ * MACROS\r
+ */\r
+\r
+/******************************************************************************\r
+ * CONSTANTS AND DEFINES\r
+ */\r
+\r
+/******************************************************************************\r
+ * TYPEDEFS\r
+ */\r
+\r
+/******************************************************************************\r
+ * LOCAL VARIABLES\r
+ */\r
+static freqEntry_t      sCurLogicalChan;\r
+static volatile uint8_t sTid = 0;\r
+\r
+/******************************************************************************\r
+ * LOCAL FUNCTIONS\r
+ */\r
+\r
+static fhStatus_t handle_freq_cmd(mrfiPacket_t *);\r
+static fhStatus_t send_ping_reply(mrfiPacket_t *);\r
+#ifndef ACCESS_POINT\r
+static uint8_t change_channel_cmd_is_valid(mrfiPacket_t *);\r
+#endif\r
+#ifdef RANGE_EXTENDER\r
+/* REs must replay frame before changing channels */\r
+static void       replayFirst(mrfiPacket_t *);\r
+#endif\r
+#ifdef ACCESS_POINT\r
+/* only the AP can broadcast this command */\r
+static void broadcast_channel_change(uint8_t);\r
+#else\r
+/* APs do not process this frame */\r
+static void change_channel_cmd(mrfiPacket_t *);\r
+#endif\r
+\r
+/******************************************************************************\r
+ * GLOBAL VARIABLES\r
+ */\r
+\r
+/******************************************************************************\r
+ * GLOBAL FUNCTIONS\r
+ */\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_freqInit\r
+ *\r
+ * @brief       Initialize NWK Frequency application.\r
+ *\r
+ * @return   none.\r
+ */\r
+void nwk_freqInit(void)\r
+{\r
+\r
+  memset(&sCurLogicalChan, 0x0, sizeof(sCurLogicalChan));\r
+\r
+  /* pick a random value to start the transaction ID for this app. */\r
+  sTid = MRFI_RandomByte();\r
+\r
+  return;\r
+}\r
+\r
+/***************************************************************************\r
+ * @fn          nwk_setChannel\r
+ *\r
+ * @brief       Set requested logical channel.  Accessed by application\r
+ *              through IOCTL interface\r
+ *\r
+ * input parameters\r
+ * @param   chan     - pointer to channel object of requested channel\r
+ *\r
+ * @return   status of operation:\r
+ *             SMPL_SUCCESS    if channel set\r
+ *             SMPL_BAD_PARAM  if requested channel is out of range\r
+ */\r
+smplStatus_t nwk_setChannel(freqEntry_t *chan)\r
+{\r
+  smplStatus_t rc = SMPL_BAD_PARAM;\r
+\r
+  if (chan->logicalChan < NWK_FREQ_TBL_SIZE)\r
+  {\r
+    MRFI_SetLogicalChannel(chan->logicalChan);\r
+    sCurLogicalChan = *chan;\r
+    rc = SMPL_SUCCESS;\r
+  }\r
+  return rc;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_getChannel\r
+ *\r
+ * @brief       Get current logical channel. Accessed by application through\r
+ *              IOCTL interface\r
+ *\r
+ * input parameters\r
+ * @param   chan     - pointer to channel object of requested channel\r
+ *\r
+ * output parameters\r
+ * @param   chan     - populated channel object\r
+ *\r
+ * @return   none.\r
+ */\r
+void nwk_getChannel(freqEntry_t *chan)\r
+{\r
+  *chan = sCurLogicalChan;\r
+\r
+  return;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          handle_freq_cmd\r
+ *\r
+ * @brief       Handle a Frequency application command.\r
+ *\r
+ * input parameters\r
+ * @param   frame     - pointer to frame with command context\r
+ *\r
+ * @return   Return FHS_RELEASE if caller should release frame otherwise\r
+ *           return FHS_REPLAY.\r
+ */\r
+static fhStatus_t handle_freq_cmd(mrfiPacket_t *frame)\r
+{\r
+  fhStatus_t rc = FHS_RELEASE;\r
+\r
+  switch (*(MRFI_P_PAYLOAD(frame)+F_APP_PAYLOAD_OS))\r
+  {\r
+    case FREQ_REQ_PING:\r
+      rc = send_ping_reply(frame);\r
+      break;\r
+\r
+#ifndef ACCESS_POINT\r
+    case FREQ_REQ_MOVE:\r
+#ifdef RANGE_EXTENDER\r
+      replayFirst(frame);\r
+#endif\r
+      /* Make sure the change channel Freq command came from\r
+       * a valid source before obeying.\r
+       */\r
+      if (change_channel_cmd_is_valid(frame))\r
+      {\r
+        change_channel_cmd(frame);\r
+      }\r
+      break;\r
+#endif\r
+\r
+#ifdef ACCESS_POINT\r
+    case FREQ_REQ_REQ_MOVE:\r
+      break;\r
+#endif\r
+    default:\r
+      break;\r
+  }\r
+\r
+  return rc;\r
+}\r
+\r
+#ifndef ACCESS_POINT\r
+/******************************************************************************\r
+ * @fn          change_channel_cmd_is_valid\r
+ *\r
+ * @brief       Check validity of a change channel command frame.\r
+ *\r
+ * input parameters\r
+ * @param   frame  - pointer to frame with command context\r
+ *\r
+ * @return   Returns non-zero if command is valid, otherwise returns 0.\r
+ *           Command is valid if either:\r
+ *             - frame is directed\r
+ *             - frame is from an AP and we know about that AP\r
+ *\r
+ *           It is possible that either we don't know about an AP or that\r
+ *           we do but this frame comes from another AP in range.\r
+ */\r
+static uint8_t change_channel_cmd_is_valid(mrfiPacket_t *frame)\r
+{\r
+  uint8_t rc = 0;\r
+  addr_t const *apAddr;\r
+\r
+  /* If this was a directed frame obey the command. */\r
+  if (!memcmp(MRFI_P_DST_ADDR(frame), nwk_getMyAddress(), NET_ADDR_SIZE))\r
+  {\r
+    rc = 1;\r
+  }\r
+  else\r
+  {\r
+    /* Do we know about an AP? If not assume frame bogus. */\r
+    apAddr = nwk_getAPAddress();\r
+    if (apAddr)\r
+    {\r
+      /* Yes, we know about an AP. Is that who sent it? */\r
+      if (!memcmp(apAddr, MRFI_P_SRC_ADDR(frame), NET_ADDR_SIZE))\r
+      {\r
+        /* OK. We obey. */\r
+        rc = 1;\r
+      }\r
+    }\r
+  }\r
+\r
+  return rc;\r
+}\r
+#endif   /* !ACCESS_POINT */\r
+\r
+#ifdef RANGE_EXTENDER\r
+/******************************************************************************\r
+ * @fn          replayFirst\r
+ *\r
+ * @brief       Range Extenders must replay the change-channel boradcast\r
+ *              frame before actually changing its own channel.\r
+ *\r
+ * input parameters\r
+ * @param   frame     - pointer to frame with command context\r
+ *\r
+ * @return   void\r
+ */\r
+\r
+/* This routine takes care of some awkwardness. From the dispatch thread all\r
+ * we have is a pointer to the mrfiPacket_t element in the frame buffer into\r
+ * which the frame was retrieved. But to call the replay routine we need the\r
+ * entire frame information structure frameInfo_t. This routine regenerates\r
+ * the frame information structure pointer and then calls the replay routine.\r
+ *\r
+ * This approach requires that the disptach thread guarantee that it will\r
+ * always pass a pointer to the mrfiPacket_t structure in the frame\r
+ * information structure and not a copy of the mrfipacket_t element. It is\r
+ * either the approach here or change all the NWK application dispatch routine\r
+ * argument types. This latter has the downside of interfering with any\r
+ * user-implemented NWK applications. It also needlessly complicates the argument\r
+ * handling: except for this instance all any routine needs is the mrfiPacket_t\r
+ * pointer.\r
+ */\r
+static void replayFirst(mrfiPacket_t *frame)\r
+{\r
+  frameInfo_t *fiptr;\r
+  uint16_t     offset = (uint16_t)&(((frameInfo_t *)0)->mrfiPkt);\r
+\r
+  fiptr = (frameInfo_t *)(((uint8_t *)frame) - ((uint8_t *)offset));\r
+\r
+  nwk_replayFrame(fiptr);\r
+\r
+  return;\r
+}\r
+#endif  /* RANGE_EXTENDER */\r
+\r
+#ifndef ACCESS_POINT\r
+/********************************************************************************\r
+ * @fn          change_channel_cmd\r
+ *\r
+ * @brief       Change to channel specified in received frame. Polling devices\r
+ *              might be awake when the broadcast occurs but we want the channel\r
+ *              change recovery to occur in a disciplined manner using the\r
+ *              polling code. Also, with certain Test sceanrios in which a\r
+ *              sleeping device is emulated we want to emulate 'missing' the\r
+ *              broadcast change-channel command.\r
+ *\r
+ * input parameters\r
+ * @param   frame     - pointer to frame containing target logical channel.\r
+ *\r
+ * @return   none.\r
+ */\r
+static void change_channel_cmd(mrfiPacket_t *frame)\r
+{\r
+#if !defined( RX_POLLS )\r
+  freqEntry_t chan;\r
+\r
+  chan.logicalChan = *(MRFI_P_PAYLOAD(frame)+F_APP_PAYLOAD_OS+F_CHAN_OS);\r
+\r
+  nwk_setChannel(&chan);\r
+#endif\r
+  return;\r
+}\r
+#endif  /* !ACCESS_POINT */\r
+\r
+/******************************************************************************\r
+ * @fn          send_ping_reply\r
+ *\r
+ * @brief       Send Frequency application ping reply.\r
+ *\r
+ * input parameters\r
+ * @param   frame     - pointer to frame from pinger.\r
+ *\r
+ * @return   FHS_RELEASE unless this isn't an Access Point. In this case for\r
+ *           flow to et this far it is a Range Extender, so replay the frame\r
+ *           by returning FHW_REPLAY\r
+ */\r
+static fhStatus_t send_ping_reply(mrfiPacket_t *frame)\r
+{\r
+#ifdef ACCESS_POINT\r
+  uint8_t      msg[FREQ_REQ_PING_FRAME_SIZE];\r
+  frameInfo_t *pOutFrame;\r
+\r
+  /* original request with reply bit on */\r
+  msg[FB_APP_INFO_OS] = *(MRFI_P_PAYLOAD(frame)+F_APP_PAYLOAD_OS) | NWK_APP_REPLY_BIT;\r
+  msg[FB_TID_OS]      = *(MRFI_P_PAYLOAD(frame)+F_APP_PAYLOAD_OS+FB_TID_OS);\r
+\r
+  if (pOutFrame = nwk_buildFrame(SMPL_PORT_FREQ, msg, sizeof(msg), MAX_HOPS_FROM_AP))\r
+  {\r
+    /* destination address is the source address of the received frame. */\r
+    memcpy(MRFI_P_DST_ADDR(&pOutFrame->mrfiPkt), MRFI_P_SRC_ADDR(frame), NET_ADDR_SIZE);\r
+    /* must use transaction ID of source frame */\r
+    PUT_INTO_FRAME(MRFI_P_PAYLOAD(&pOutFrame->mrfiPkt), F_TRACTID_OS, (GET_FROM_FRAME(MRFI_P_PAYLOAD(frame), F_TRACTID_OS)));\r
+#ifdef SMPL_SECURE\r
+    nwk_setSecureFrame(&pOutFrame->mrfiPkt, sizeof(msg), 0);\r
+#endif  /* SMPL_SECURE */\r
+    nwk_sendFrame(pOutFrame, MRFI_TX_TYPE_FORCED);\r
+  }\r
+\r
+  return FHS_RELEASE;\r
+#else\r
+  return FHS_REPLAY;\r
+#endif  /* ACCESS_POINT */\r
+}\r
+\r
+/****************************************************************************************\r
+ * @fn          nwk_processFreq\r
+ *\r
+ * @brief       Process a Frequency application frame.\r
+ *\r
+ * input parameters\r
+ * @param   frame     - pointer to frame\r
+ *\r
+ * @return   Disposition for frame: either release (FHS_RELEASE) or replay (FHS_REPLAY).\r
+ */\r
+fhStatus_t nwk_processFreq(mrfiPacket_t *frame)\r
+{\r
+  fhStatus_t rc = FHS_RELEASE;\r
+  uint8_t    replyType;\r
+\r
+  /* Make sure this is a reply and see if we sent this. Validate the\r
+   * packet for reception by client app.\r
+   */\r
+  if (SMPL_MY_REPLY == (replyType=nwk_isValidReply(frame, sTid, FB_APP_INFO_OS, FB_TID_OS)))\r
+  {\r
+    /* It's a match and it's a reply. Validate the received packet by\r
+     * returning a 1 so it can be received by the client app.\r
+     */\r
+    MRFI_PostKillSem();\r
+    rc = FHS_KEEP;\r
+  }\r
+#if !defined( END_DEVICE )\r
+  else if (SMPL_A_REPLY == replyType)\r
+  {\r
+    /* no match. if i'm not an ED this is a reply that should be passed on. */\r
+    rc = FHS_REPLAY;\r
+  }\r
+#endif  /* !END_DEVICE */\r
+  else if (SMPL_NOT_REPLY == replyType)\r
+  {\r
+    rc = handle_freq_cmd(frame);\r
+  }\r
+\r
+  return rc;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_scanForChannels\r
+ *\r
+ * @brief       Scan for channels by sending a ping frame on each channel in the\r
+ *              channel table and listen for a reply.\r
+ *\r
+ * input parameters\r
+ * @param  channels    - pointer to area to receive list of channels from which\r
+ *                       ping replies were received.\r
+ *\r
+ * output parameters\r
+ * @param   channels   - populated list of channels.\r
+ *\r
+ * @return   statuis of operation..\r
+ */\r
+uint8_t nwk_scanForChannels(freqEntry_t *channels)\r
+{\r
+  uint8_t      msg[FREQ_REQ_PING_FRAME_SIZE], i, num=0, notBcast = 1;\r
+  addr_t      *apAddr, retAddr;\r
+  uint8_t      radioState = MRFI_GetRadioState();\r
+  freqEntry_t  chan;\r
+  freqEntry_t  curChan;\r
+\r
+  union\r
+  {\r
+    ioctlRawSend_t    send;\r
+    ioctlRawReceive_t recv;\r
+  } ioctl_info;\r
+\r
+  nwk_getChannel(&curChan);\r
+\r
+  /* send to AP. If we don't know AP address, broadcast. */\r
+  apAddr = (addr_t *)nwk_getAPAddress();\r
+  if (!apAddr)\r
+  {\r
+    apAddr = (addr_t *)nwk_getBCastAddress();\r
+    notBcast = 0;\r
+  }\r
+\r
+  for (i=0; i<NWK_FREQ_TBL_SIZE; ++i)\r
+  {\r
+    chan.logicalChan = i;\r
+\r
+    nwk_setChannel(&chan);\r
+\r
+    ioctl_info.send.addr = apAddr;\r
+    ioctl_info.send.msg  = msg;\r
+    ioctl_info.send.len  = sizeof(msg);\r
+    ioctl_info.send.port = SMPL_PORT_FREQ;\r
+\r
+    msg[FB_APP_INFO_OS] = FREQ_REQ_PING;\r
+    msg[FB_TID_OS]      = sTid;\r
+\r
+    SMPL_Ioctl(IOCTL_OBJ_RAW_IO, IOCTL_ACT_WRITE, &ioctl_info.send);\r
+\r
+    ioctl_info.recv.port = SMPL_PORT_FREQ;\r
+    ioctl_info.recv.msg  = msg;\r
+    ioctl_info.recv.addr = &retAddr;\r
+\r
+    NWK_CHECK_FOR_SETRX(radioState);\r
+    NWK_REPLY_DELAY();\r
+    NWK_CHECK_FOR_RESTORE_STATE(radioState);\r
+\r
+    if (SMPL_SUCCESS == SMPL_Ioctl(IOCTL_OBJ_RAW_IO, IOCTL_ACT_READ, &ioctl_info.recv))\r
+    {\r
+      /* Once we know the Access Point we're related to we only accept\r
+       * ping replies from that one.\r
+       */\r
+      if (!notBcast || (notBcast && !memcmp(&retAddr, apAddr, NET_ADDR_SIZE)))\r
+      {\r
+        channels[num++].logicalChan = i;\r
+      }\r
+    }\r
+\r
+    sTid++;\r
+    if (num && notBcast)\r
+    {\r
+      /* we're done...only one possible channel if we know the AP address. */\r
+      break;\r
+    }\r
+    /* TODO: process encryption stuff */\r
+  }\r
+\r
+  /* reset original channel */\r
+  nwk_setChannel(&curChan);\r
+\r
+  return num;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_freqControl\r
+ *\r
+ * @brief       Handle application requests received through IOCTL interface.\r
+ *\r
+ * input parameters\r
+ * @param   action  - requested action\r
+ * @param   val     - pointer to parameters required/returned for action\r
+ *\r
+ * output parameters\r
+ * @param   val   - populated values if action was a retrieval action.\r
+ *\r
+ * @return   status of operation.\r
+ */\r
+smplStatus_t nwk_freqControl(ioctlAction_t action, void *val)\r
+{\r
+  smplStatus_t rc;\r
+\r
+  switch (action)\r
+  {\r
+    case IOCTL_ACT_SET:\r
+#ifdef ACCESS_POINT\r
+      broadcast_channel_change(((freqEntry_t *)val)->logicalChan);\r
+#endif  /* ACCESS_POINT */\r
+      rc = nwk_setChannel((freqEntry_t *)val);\r
+      break;\r
+\r
+    case IOCTL_ACT_GET:\r
+      nwk_getChannel((freqEntry_t *)val);\r
+      rc = SMPL_SUCCESS;\r
+      break;\r
+\r
+    case IOCTL_ACT_SCAN:\r
+      {\r
+        ioctlScanChan_t *sc = (ioctlScanChan_t *)val;\r
+\r
+        sc->numChan = nwk_scanForChannels(sc->freq);\r
+        rc = SMPL_SUCCESS;\r
+      }\r
+      break;\r
+\r
+    default:\r
+      rc = SMPL_BAD_PARAM;\r
+      break;\r
+  }\r
+\r
+  return rc;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          broadcast_channel_change\r
+ *\r
+* @brief       For Access Point only: broadcast a channel change frame.\r
+ *\r
+ * input parameters\r
+ * @param   idx  -  index into channel table of new (logical) channel\r
+ *\r
+ * @return   none.\r
+ */\r
+#ifdef ACCESS_POINT\r
+#define CC_REDUNDANCY      1   /* Change-channel redundancy count */\r
+static void broadcast_channel_change(uint8_t idx)\r
+{\r
+  ioctlRawSend_t send;\r
+  uint8_t        msg[FREQ_REQ_MOVE_FRAME_SIZE];\r
+  uint8_t        repeat = CC_REDUNDANCY;\r
+\r
+  if (idx >= NWK_FREQ_TBL_SIZE)\r
+  {\r
+    return;\r
+  }\r
+\r
+  msg[FB_APP_INFO_OS] = FREQ_REQ_MOVE;\r
+  msg[F_CHAN_OS]      = idx;\r
+\r
+  send.addr = (addr_t *)nwk_getBCastAddress();\r
+  send.msg  = msg;\r
+  send.len  = sizeof(msg);\r
+  send.port = SMPL_PORT_FREQ;\r
+\r
+  SMPL_Ioctl(IOCTL_OBJ_RAW_IO, IOCTL_ACT_WRITE, &send);\r
+  /* Redundancy addresses the fact that an RE (or any always-listening\r
+   * device) might miss the command\r
+   */\r
+  while (repeat--)\r
+  {\r
+    NWK_DELAY(250);\r
+    SMPL_Ioctl(IOCTL_OBJ_RAW_IO, IOCTL_ACT_WRITE, &send);\r
+  }\r
+}\r
+#endif  /* ACCESS_POINT */\r
+\r
+#else  /* FREQUENCY_AGILITY */\r
+\r
+/**********************************************************************************\r
+ * @fn          nwk_freqInit\r
+ *\r
+ * @brief       Initialize NWK Frequency application. Stub when Frequency Agility\r
+ *              not supported.\r
+ *\r
+ * @return   none.\r
+ */\r
+void nwk_freqInit(void)\r
+{\r
+  return;\r
+}\r
+\r
+/****************************************************************************************\r
+ * @fn          nwk_processFreq\r
+ *\r
+ * @brief       Process a Frequency application frame. Stub when Frequency Agility\r
+ *              not supported.\r
+ *\r
+ * input parameters\r
+ * @param   frame     - pointer to frame\r
+ *\r
+ * @return   Disposition for frame: either release (FHS_RELEASE) or replay (FHS_REPLAY).\r
+ */\r
+fhStatus_t nwk_processFreq(mrfiPacket_t *frame)\r
+{\r
+  return FHS_RELEASE;\r
+}\r
+\r
+#endif  /* FREQUENCY_AGILITY */\r
diff --git a/chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/Components/nwk_applications/nwk_freq.h b/chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/Components/nwk_applications/nwk_freq.h
new file mode 100755 (executable)
index 0000000..4cc5f11
--- /dev/null
@@ -0,0 +1,72 @@
+/**************************************************************************************************\r
+  Filename:       nwk_freq.h\r
+  Revised:        $Date: 2008-05-06 16:48:33 -0700 (Tue, 06 May 2008) $\r
+  Revision:       $Revision: 17025 $\r
+  Author:         $Author: lfriedman $\r
+\r
+  Description:    This header file supports the SimpliciTI Freq network application.\r
+\r
+  Copyright 2004-2007 Texas Instruments Incorporated. All rights reserved.\r
+\r
+  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+  the terms of a software license agreement between the user who downloaded the software,\r
+  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+  License. The License limits your use, and you acknowledge, that the Software may not be\r
+  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+  perform, display or sell this Software and/or its documentation for any purpose.\r
+\r
+  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+\r
+  Should you have any questions regarding your right to use this Software,\r
+  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+#ifndef NWK_FREQ_H\r
+#define NWK_FREQ_H\r
+\r
+/* application payload offsets */\r
+/*    both */\r
+#define FB_APP_INFO_OS     0\r
+#define FB_TID_OS          1\r
+\r
+/* Logical channel number for MOVE request. Frame brodcast so no TID\r
+ * is used. Channel number can occupy the TID location. Same offset\r
+ * used for channel change request. No reply to that frame. \r
+ */\r
+#define F_CHAN_OS          1\r
+\r
+/* MGMT frame application requests */\r
+#define  FREQ_REQ_MOVE        0x01\r
+#define  FREQ_REQ_PING        0x02\r
+#define  FREQ_REQ_REQ_MOVE    0x03\r
+\r
+/* change the following as protocol developed */\r
+#define MAX_FREQ_APP_FRAME    2\r
+\r
+/* set the out frame sizes */\r
+#define  FREQ_REQ_MOVE_FRAME_SIZE   2\r
+#define  FREQ_REQ_PING_FRAME_SIZE   2\r
+\r
+/* prototypes */\r
+void         nwk_freqInit(void);\r
+fhStatus_t   nwk_processFreq(mrfiPacket_t *);\r
+#if defined( FREQUENCY_AGILITY )\r
+smplStatus_t nwk_setChannel(freqEntry_t *);\r
+void         nwk_getChannel(freqEntry_t *);\r
+uint8_t      nwk_scanForChannels(freqEntry_t *);\r
+smplStatus_t nwk_freqControl(ioctlAction_t, void *);\r
+#endif\r
+\r
+#endif\r
diff --git a/chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/Components/nwk_applications/nwk_ioctl.c b/chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/Components/nwk_applications/nwk_ioctl.c
new file mode 100755 (executable)
index 0000000..0dcd14a
--- /dev/null
@@ -0,0 +1,349 @@
+\r
+/**************************************************************************************************\r
+  Filename:       nwk_ioctl.c\r
+  Revised:        $Date: 2009-01-13 11:31:14 -0800 (Tue, 13 Jan 2009) $\r
+  Revision:       $Revision: 18744 $\r
+  Author:         $Author: lfriedman $\r
+\r
+  Description:    This file supports the SimpliciTI IOCTL implmentation. This interface\r
+                  gives applications access to the "driver" network level functions\r
+                  when necessary.\r
+\r
+  Copyright 2004-2007 Texas Instruments Incorporated. All rights reserved.\r
+\r
+  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+  the terms of a software license agreement between the user who downloaded the software,\r
+  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+  License. The License limits your use, and you acknowledge, that the Software may not be\r
+  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+  perform, display or sell this Software and/or its documentation for any purpose.\r
+\r
+  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+\r
+  Should you have any questions regarding your right to use this Software,\r
+  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+\r
+/******************************************************************************\r
+ * INCLUDES\r
+ */\r
+#include <string.h>\r
+#include "bsp.h"\r
+#include "mrfi.h"\r
+#include "nwk_types.h"\r
+#include "nwk_frame.h"\r
+#include "nwk.h"\r
+#include "nwk_ioctl.h"\r
+#include "nwk_globals.h"\r
+#include "nwk_security.h"\r
+#ifdef ACCESS_POINT\r
+#include "nwk_join.h"\r
+#endif\r
+\r
+/******************************************************************************\r
+ * MACROS\r
+ */\r
+\r
+/******************************************************************************\r
+ * CONSTANTS AND DEFINES\r
+ */\r
+\r
+/******************************************************************************\r
+ * TYPEDEFS\r
+ */\r
+\r
+/******************************************************************************\r
+ * LOCAL VARIABLES\r
+ */\r
+\r
+/******************************************************************************\r
+ * LOCAL FUNCTIONS\r
+ */\r
+\r
+/******************************************************************************\r
+ * GLOBAL VARIABLES\r
+ */\r
+\r
+/******************************************************************************\r
+ * GLOBAL FUNCTIONS\r
+ */\r
+\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_rawSend\r
+ *\r
+ * @brief       Builds an outut frame based on information provided by the\r
+ *              caller. This function allows a raw transmission to the target\r
+ *              if the network address is known. this function is used a lot\r
+ *              to support NWK applications.\r
+ *\r
+ * input parameters\r
+ * @param   info    - pointer to strcuture containing info on how to build\r
+ *                    the outgoing frame.\r
+ * output parameters\r
+ *\r
+ * @return         SMPL_SUCCESS\r
+ *                 SMPL_NOMEM       - no room in output frame queue\r
+ *                 SMPL_TX_CCA_FAIL - CCA failure\r
+ */\r
+smplStatus_t nwk_rawSend(ioctlRawSend_t *info)\r
+{\r
+  frameInfo_t *pOutFrame;\r
+  uint8_t      hops;\r
+\r
+  /* If we know frame is going to or from the AP then we can reduce the hop\r
+   * count.\r
+   */\r
+  switch (info->port)\r
+  {\r
+    case SMPL_PORT_JOIN:\r
+    case SMPL_PORT_FREQ:\r
+    case SMPL_PORT_MGMT:\r
+      hops = MAX_HOPS_FROM_AP;\r
+      break;\r
+\r
+    default:\r
+      hops = MAX_HOPS;\r
+      break;\r
+  }\r
+\r
+  if (pOutFrame = nwk_buildFrame(info->port, info->msg, info->len, hops))\r
+  {\r
+    memcpy(MRFI_P_DST_ADDR(&pOutFrame->mrfiPkt), info->addr, NET_ADDR_SIZE);\r
+#ifdef SMPL_SECURE\r
+    nwk_setSecureFrame(&pOutFrame->mrfiPkt, info->len, 0);\r
+#endif  /* SMPL_SECURE */\r
+    return nwk_sendFrame(pOutFrame, MRFI_TX_TYPE_CCA);\r
+  }\r
+  return SMPL_NOMEM;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_rawReceive\r
+ *\r
+ * @brief       Retriievs specified from from the input frame queue. Additional\r
+ *              information such as source address and hop count may also be\r
+ *              retrieved\r
+ *\r
+ * input parameters\r
+ * @param   info    - pointer to structure containing info on what to retrieve\r
+ *\r
+ * output parameters - actually populated by nwk_retrieveFrame()\r
+ *      info->msg      - application payload copied here\r
+ *      info->len      - length of received application payload\r
+ *      info->addr     - if non-NULL points to memory to be populated with\r
+ *                       source address of retrieved frame.\r
+ *      info->hopCount - if non-NULL points to memory to be populated with\r
+ *                       hop count of retrieved frame.\r
+ *\r
+ * @return   Status of operation.\r
+ */\r
+smplStatus_t nwk_rawReceive(ioctlRawReceive_t *info)\r
+{\r
+  rcvContext_t rcv;\r
+\r
+  rcv.type   = RCV_NWK_PORT;\r
+  rcv.t.port = info->port;\r
+\r
+  return nwk_retrieveFrame(&rcv, info->msg, &info->len, info->addr, &info->hopCount);\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_radioControl\r
+ *\r
+ * @brief       Handle radio control functions.\r
+ *\r
+ * input parameters\r
+ * @param   action   - radio operation to perform. currently suppoerted:\r
+ *                         sleep/unsleep\r
+ * output parameters\r
+ *\r
+ * @return   Status of operation.\r
+ */\r
+smplStatus_t nwk_radioControl(ioctlAction_t action, void *val)\r
+{\r
+  smplStatus_t rc = SMPL_SUCCESS;\r
+\r
+  if (IOCTL_ACT_RADIO_SLEEP == action)\r
+  {\r
+    /* go to sleep mode. */\r
+    MRFI_RxIdle();\r
+    MRFI_Sleep();\r
+  }\r
+  else if (IOCTL_ACT_RADIO_AWAKE == action)\r
+  {\r
+    MRFI_WakeUp();\r
+\r
+#if !defined( END_DEVICE )\r
+    MRFI_RxOn();\r
+#endif\r
+\r
+  }\r
+  else if (IOCTL_ACT_RADIO_SIGINFO == action)\r
+  {\r
+    ioctlRadioSiginfo_t *pSigInfo = (ioctlRadioSiginfo_t *)val;\r
+    connInfo_t          *pCInfo   = nwk_getConnInfo(pSigInfo->lid);\r
+\r
+    if (!pCInfo)\r
+    {\r
+      return SMPL_BAD_PARAM;\r
+    }\r
+    memcpy(&pSigInfo->sigInfo, &pCInfo->sigInfo, sizeof(pCInfo->sigInfo));\r
+  }\r
+  else if (IOCTL_ACT_RADIO_RSSI == action)\r
+  {\r
+    *((rssi_t *)val) = MRFI_Rssi();\r
+  }\r
+  else if (IOCTL_ACT_RADIO_RXON == action)\r
+  {\r
+    MRFI_RxOn();\r
+  }\r
+  else if (IOCTL_ACT_RADIO_RXIDLE == action)\r
+  {\r
+    MRFI_RxIdle();\r
+  }\r
+#ifdef EXTENDED_API\r
+  else if (IOCTL_ACT_RADIO_SETPWR == action)\r
+  {\r
+    uint8_t idx;\r
+\r
+    switch (*(ioctlLevel_t *)val)\r
+    {\r
+      case IOCTL_LEVEL_2:\r
+        idx = 2;\r
+        break;\r
+\r
+      case IOCTL_LEVEL_1:\r
+        idx = 1;\r
+        break;\r
+\r
+      case IOCTL_LEVEL_0:\r
+        idx = 0;\r
+        break;\r
+\r
+      default:\r
+        return SMPL_BAD_PARAM;\r
+    }\r
+    MRFI_SetRFPwr(idx);\r
+    return SMPL_SUCCESS;\r
+  }\r
+#endif  /* EXTENDED_API */\r
+  else\r
+  {\r
+    rc = SMPL_BAD_PARAM;\r
+  }\r
+  return rc;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_joinContext\r
+ *\r
+ * @brief       For Access Points we need a way to support changing the Join\r
+ *              context. This will allow arbitration bewteen potentially nearby\r
+ *              Access Points when a new device is joining.\r
+ *\r
+ * input parameters\r
+ * @param   action  - Join context is either on or off.\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   Status of operation. Currently always succeeds.\r
+ */\r
+#ifdef ACCESS_POINT\r
+smplStatus_t nwk_joinContext(ioctlAction_t action)\r
+{\r
+  nwk_setJoinContext((IOCTL_ACT_ON == action) ? JOIN_CONTEXT_ON : JOIN_CONTEXT_OFF);\r
+\r
+  return SMPL_SUCCESS;\r
+}\r
+#endif\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_deviceAddress\r
+ *\r
+ * @brief       Set or Get this device address. The Set must be done before\r
+ *              SMPL_Init() for it to take effect. The Get is always legal but\r
+ *              the value could be invalid if it is called before a valid set\r
+ *              call is made.\r
+ *\r
+ * input parameters\r
+ * @param   action  - Gte or Set\r
+ * @param   addr    - pointer to address object containing value on Set\r
+ *\r
+ * output parameters\r
+ * @param   addr    - pointer to address object to receive value on Get.\r
+ *\r
+ * @return   SMPL_SUCCESS\r
+ *           SMPL_BAD_PARAM  Action request illegal or a Set request\r
+ *                           was not respected.\r
+ */\r
+smplStatus_t nwk_deviceAddress(ioctlAction_t action, addr_t *addr)\r
+{\r
+  smplStatus_t rc = SMPL_BAD_PARAM;\r
+\r
+  if (IOCTL_ACT_GET == action)\r
+  {\r
+    memcpy(addr, nwk_getMyAddress(), sizeof(addr_t));\r
+    rc = SMPL_SUCCESS;\r
+  }\r
+  else if (IOCTL_ACT_SET == action)\r
+  {\r
+    if (nwk_setMyAddress(addr))\r
+    {\r
+      rc = SMPL_SUCCESS;\r
+    }\r
+  }\r
+\r
+  return rc;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_connectionControl\r
+ *\r
+ * @brief       Access to connection table. Currently supports only deleting\r
+ *              a connection from the table.\r
+ *\r
+ * input parameters\r
+ * @param   action  - Connection control action (only delete is curently valid).\r
+ * @param   val     - pointer to Link ID of connection on which to operate.\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   SMPL_SUCCESS\r
+ *           SMPL_BAD_PARAM  Action is not delete\r
+ *                           Link ID is the UUD Link ID\r
+ *                           No connection table info for Link ID\r
+ */\r
+smplStatus_t nwk_connectionControl(ioctlAction_t action, void *val)\r
+{\r
+  connInfo_t *pCInfo;\r
+  linkID_t    lid = *((linkID_t *)val);\r
+\r
+  if (IOCTL_ACT_DELETE != action)\r
+  {\r
+    return SMPL_BAD_PARAM;\r
+  }\r
+\r
+  if ((SMPL_LINKID_USER_UUD == lid) ||\r
+      (!(pCInfo=nwk_getConnInfo(lid))))\r
+  {\r
+    return SMPL_BAD_PARAM;\r
+  }\r
+\r
+  nwk_freeConnection(pCInfo);\r
+\r
+  return SMPL_SUCCESS;\r
+}\r
diff --git a/chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/Components/nwk_applications/nwk_ioctl.h b/chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/Components/nwk_applications/nwk_ioctl.h
new file mode 100755 (executable)
index 0000000..fa5b961
--- /dev/null
@@ -0,0 +1,53 @@
+/**************************************************************************************************\r
+  Filename:       nwk_ioctl.h\r
+  Revised:        $Date: 2008-04-29 15:47:05 -0700 (Tue, 29 Apr 2008) $\r
+  Revision:       $Revision: 16972 $\r
+  Author:         $Author: lfriedman $\r
+\r
+  Description:    This header file supports the SimpliciTI IOCTL implmentation. This interface\r
+                  gives applications access to the "driver" network level functions\r
+                  when necessary.\r
+\r
+  Copyright 2004-2007 Texas Instruments Incorporated. All rights reserved.\r
+\r
+  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+  the terms of a software license agreement between the user who downloaded the software,\r
+  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+  License. The License limits your use, and you acknowledge, that the Software may not be\r
+  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+  perform, display or sell this Software and/or its documentation for any purpose.\r
+\r
+  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+\r
+  Should you have any questions regarding your right to use this Software,\r
+  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+\r
+\r
+#ifndef NWK_IOCTL_H\r
+#define NWK_IOCTL_H\r
+\r
+/* prototypes */\r
+smplStatus_t nwk_rawSend(ioctlRawSend_t *);\r
+smplStatus_t nwk_rawReceive(ioctlRawReceive_t *);\r
+smplStatus_t nwk_radioControl(ioctlAction_t, void *);\r
+smplStatus_t nwk_deviceAddress(ioctlAction_t, addr_t *);\r
+smplStatus_t nwk_connectionControl(ioctlAction_t, void *);\r
+#ifdef ACCESS_POINT\r
+smplStatus_t nwk_joinContext(ioctlAction_t);\r
+#endif\r
+\r
+#endif\r
diff --git a/chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/Components/nwk_applications/nwk_join.c b/chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/Components/nwk_applications/nwk_join.c
new file mode 100755 (executable)
index 0000000..b96325f
--- /dev/null
@@ -0,0 +1,583 @@
+/**************************************************************************************************\r
+  Filename:       nwk_join.c\r
+  Revised:        $Date: 2009-01-06 15:45:54 -0800 (Tue, 06 Jan 2009) $\r
+  Revision:       $Revision: 18697 $\r
+\r
+  Description:    This file supports the SimpliciTI Join network application.\r
+\r
+  Copyright 2007-2009 Texas Instruments Incorporated. All rights reserved.\r
+\r
+  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+  the terms of a software license agreement between the user who downloaded the software,\r
+  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+  License. The License limits your use, and you acknowledge, that the Software may not be\r
+  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+  perform, display or sell this Software and/or its documentation for any purpose.\r
+\r
+  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+\r
+  Should you have any questions regarding your right to use this Software,\r
+  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+\r
+/******************************************************************************\r
+ * INCLUDES\r
+ */\r
+#include <string.h>\r
+#include "bsp.h"\r
+#include "mrfi.h"\r
+#include "nwk_types.h"\r
+#include "nwk_api.h"\r
+#include "nwk_frame.h"\r
+#include "nwk.h"\r
+#include "nwk_link.h"\r
+#include "nwk_join.h"\r
+#include "nwk_globals.h"\r
+#include "nwk_freq.h"\r
+#include "nwk_security.h"\r
+#include "nwk_mgmt.h"\r
+\r
+/******************************************************************************\r
+ * MACROS\r
+ */\r
+\r
+/******************************************************************************\r
+ * CONSTANTS AND DEFINES\r
+ */\r
+\r
+/******************************************************************************\r
+ * TYPEDEFS\r
+ */\r
+\r
+/******************************************************************************\r
+ * LOCAL VARIABLES\r
+ */\r
+\r
+static          uint32_t sJoinToken = 0;\r
+static          uint8_t (*spCallback)(linkID_t) = NULL;\r
+static volatile uint8_t  sTid = 0;\r
+\r
+#ifdef ACCESS_POINT\r
+static sfInfo_t *spSandFContext = NULL;\r
+static uint8_t   sJoinOK = 0;\r
+#endif /* ACCESS_POINT */\r
+\r
+/******************************************************************************\r
+ * LOCAL FUNCTIONS\r
+ */\r
+#ifdef ACCESS_POINT\r
+static void     smpl_send_join_reply(mrfiPacket_t *frame);\r
+static uint32_t generateLinkToken(void);\r
+static void     handleJoinRequest(mrfiPacket_t *);\r
+#endif  /*  ACCESS_POINT */\r
+\r
+/******************************************************************************\r
+ * GLOBAL VARIABLES\r
+ */\r
+\r
+/******************************************************************************\r
+ * GLOBAL FUNCTIONS\r
+ */\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_joinInit\r
+ *\r
+ * @brief       Initialize Join application.\r
+ *\r
+ * input parameters\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   void\r
+ */\r
+void nwk_joinInit(uint8_t (*pf)(linkID_t))\r
+{\r
+  if (!sJoinToken) \r
+  {\r
+    sJoinToken = DEFAULT_JOIN_TOKEN;\r
+  }\r
+  \r
+  spCallback = pf;\r
+  (void) spCallback;  /* keep compiler happy if we don't use this */\r
+\r
+  sTid = MRFI_RandomByte() ;\r
+\r
+#ifdef ACCESS_POINT\r
+  /* set link token to something other than deafult if desired */\r
+  nwk_setLinkToken(generateLinkToken());\r
+#if defined(STARTUP_JOINCONTEXT_ON)\r
+  sJoinOK = 1;\r
+#elif defined(STARTUP_JOINCONTEXT_OFF)\r
+  sJoinOK = 0;\r
+#else\r
+#error ERROR: Must define either STARTUP_JOINCONTEXT_ON or STARTUP_JOINCONTEXT_OFF\r
+#endif\r
+  spSandFContext = nwk_getSFInfoPtr();\r
+#endif\r
+\r
+  return;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_setJoinToken\r
+ *\r
+ * @brief       Sets the join token.\r
+ *\r
+ * input parameters\r
+ * @param   token   - join token to be used on this network.\r
+ *\r
+ * output parameters\r
+ *         no room in output queue.\r
+ *\r
+ * @return   void\r
+ */\r
+void nwk_setJoinToken(uint32_t token)\r
+{\r
+  /* only set if the supplied token is non-zero. */\r
+  if (token)\r
+  {\r
+    sJoinToken = token;\r
+  }\r
+\r
+  return;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_getJoinToken\r
+ *\r
+ * @brief       Gets the current join token.\r
+ *\r
+ * input parameters\r
+ *\r
+ * output parameters\r
+ * @param   pToken   - pointer to the returned value.\r
+ *\r
+ * @return   Current link token\r
+ */\r
+void nwk_getJoinToken(uint32_t *pToken)\r
+{\r
+  /* only set if the supplied token is non-zero. */\r
+  if (pToken)\r
+  {\r
+    *pToken = sJoinToken;\r
+  }\r
+\r
+  return;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          generateLinkToken\r
+ *\r
+ * @brief       Generate the link token to be used for the network controlled\r
+ *              by this Access Point.\r
+ *\r
+ * input parameters\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   void\r
+ */\r
+#ifdef ACCESS_POINT\r
+static uint32_t generateLinkToken(void)\r
+{\r
+  return 0xDEADBEEF;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          smpl_send_join_reply\r
+ *\r
+ * @brief       Send the Join reply. Include the Link token. If the device is\r
+ *              a polling sleeper put it into the list of store-and-forward\r
+ *              clients.\r
+ *\r
+ * input parameters\r
+ * @param   frame     - join frame for which a reply is needed...maybe\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   void\r
+ */\r
+static void smpl_send_join_reply(mrfiPacket_t *frame)\r
+{\r
+  frameInfo_t *pOutFrame;\r
+  uint8_t      msg[JOIN_REPLY_FRAME_SIZE];\r
+\r
+  /* Is this a legacy frame? If so continue. Otherwise check verion.*/\r
+  if ((MRFI_GET_PAYLOAD_LEN(frame) - F_APP_PAYLOAD_OS) > JOIN_LEGACY_MSG_LENGTH)\r
+  {\r
+    /* see if protocol version is correct... */\r
+    if (*(MRFI_P_PAYLOAD(frame)+F_APP_PAYLOAD_OS+J_PROTOCOL_VERSION_OS) != nwk_getProtocolVersion())\r
+    {\r
+      /* Accommodation of protocol version differences can be noted or accomplished here.\r
+       * Otherwise, no match and the board goes back\r
+       */\r
+      return;\r
+    }\r
+  }\r
+\r
+\r
+  /* see if join token is correct */\r
+  {\r
+    uint32_t jt;\r
+\r
+    nwk_getNumObjectFromMsg(MRFI_P_PAYLOAD(frame)+F_APP_PAYLOAD_OS+J_JOIN_TOKEN_OS, &jt, sizeof(jt));\r
+    if (jt != sJoinToken)\r
+    {\r
+      return;\r
+    }\r
+  }\r
+\r
+  /* send reply with tid, the link token, and the encryption context */\r
+  {\r
+    uint32_t linkToken;\r
+\r
+    nwk_getLinkToken(&linkToken);\r
+    nwk_putNumObjectIntoMsg((void *)&linkToken, msg+JR_LINK_TOKEN_OS, sizeof(linkToken));\r
+  }\r
+  msg[JR_CRYPTKEY_SIZE_OS] = SEC_CRYPT_KEY_SIZE;\r
+  msg[JB_REQ_OS]           = JOIN_REQ_JOIN | NWK_APP_REPLY_BIT;\r
+  /* sender's tid... */\r
+  msg[JB_TID_OS]           = *(MRFI_P_PAYLOAD(frame)+F_APP_PAYLOAD_OS+JB_TID_OS);\r
+\r
+  if (pOutFrame = nwk_buildFrame(SMPL_PORT_JOIN, msg, sizeof(msg), MAX_HOPS_FROM_AP))\r
+  {\r
+    /* destination address is the source adddress of the received frame. */\r
+    memcpy(MRFI_P_DST_ADDR(&pOutFrame->mrfiPkt), MRFI_P_SRC_ADDR(frame), NET_ADDR_SIZE);\r
+\r
+#ifdef AP_IS_DATA_HUB\r
+    /* if source device supports ED objects save source address to detect duplicate joins */\r
+    if (*(MRFI_P_PAYLOAD(frame)+F_APP_PAYLOAD_OS+J_NUMCONN_OS))\r
+    {\r
+      if (nwk_saveJoinedDevice(frame) && spCallback)\r
+      {\r
+        spCallback(0);\r
+      }\r
+    }\r
+#endif\r
+  }\r
+  else\r
+  {\r
+    /* oops -- no room left for Tx frame. Don't send reply. */\r
+    return;\r
+  }\r
+\r
+  /* If this device polls we need to provide store-and-forward support */\r
+  if (GET_FROM_FRAME(MRFI_P_PAYLOAD(frame),F_RX_TYPE) == F_RX_TYPE_POLLS)\r
+  {\r
+    uint8_t loc;\r
+\r
+    /* Check duplicate status */\r
+    if (!nwk_isSandFClient(MRFI_P_SRC_ADDR(frame), &loc))\r
+    {\r
+      uint8_t        *pNumc   = &spSandFContext->curNumSFClients;\r
+      sfClientInfo_t *pClient = &spSandFContext->sfClients[*pNumc];\r
+\r
+      /* It's not a duplicate. Save it if there's room */\r
+      if (*pNumc < NUM_STORE_AND_FWD_CLIENTS)\r
+      {\r
+        memcpy(pClient->clientAddr.addr, MRFI_P_SRC_ADDR(frame), NET_ADDR_SIZE);\r
+        *pNumc = *pNumc + 1;\r
+      }\r
+      else\r
+      {\r
+        /* No room left. Just return and don't send reply. */\r
+        return;\r
+      }\r
+    }\r
+    else\r
+    {\r
+      /* We get here if it's a duplicate. We drop through and send reply.\r
+       * Reset the S&F marker in the Management application -- we should\r
+       * assume that the Client reset so the TID will be random. If this is\r
+       * simply a duplicate frame it causes no harm.\r
+       */\r
+      nwk_resetSFMarker(loc);\r
+    }\r
+  }\r
+\r
+#ifdef SMPL_SECURE\r
+    nwk_setSecureFrame(&pOutFrame->mrfiPkt, sizeof(msg), 0);\r
+#endif  /* SMPL_SECURE */\r
+\r
+  /* It's not S&F or it is but we're OK to send reply. */\r
+  nwk_sendFrame(pOutFrame, MRFI_TX_TYPE_FORCED);\r
+\r
+  return;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_join\r
+ *\r
+ * @brief       Stub Join function for Access Points.\r
+ *\r
+ * input parameters\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   Always returns SMPL_SUCCESS.\r
+ */\r
+smplStatus_t nwk_join(void)\r
+{\r
+  return SMPL_SUCCESS;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_isSandFClient\r
+ *\r
+ * @brief       Helper function to see if the destination of a frame we have is\r
+ *              one of AP's store-and-forward clients.\r
+ *\r
+ * input parameters\r
+ * @param   fPtr     - pointer to address in frame in question\r
+ *\r
+ * output parameters\r
+ * @param   entLoc   - pointer to receive entry location in array of clients.\r
+ *\r
+ * @return   Returns client info structure pointer if the destination is a\r
+ *           store-and-forward client, else 0.\r
+ */\r
+sfClientInfo_t *nwk_isSandFClient(uint8_t *pAddr, uint8_t *entLoc)\r
+{\r
+  uint8_t i;\r
+  sfClientInfo_t *pSFClient = spSandFContext->sfClients;\r
+\r
+  for (i=0; i<spSandFContext->curNumSFClients; ++i, ++pSFClient)\r
+  {\r
+    if (!memcmp(&pSFClient->clientAddr.addr, pAddr, NET_ADDR_SIZE))\r
+    {\r
+      *entLoc = i;\r
+      return pSFClient;\r
+    }\r
+  }\r
+\r
+  return 0;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_setJoinContext\r
+ *\r
+ * @brief       Helper function to set Join context for Access Point. This will\r
+ *              allow arbitration bewteen potentially nearby Access Points when\r
+ *              a new device is joining.\r
+ *\r
+ * input parameters\r
+ * @param   which   - Join context is either off or on\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   void\r
+ */\r
+void nwk_setJoinContext(uint8_t which)\r
+{\r
+  sJoinOK = (JOIN_CONTEXT_ON == which) ? 1 : 0;\r
+\r
+  return;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          handleJoinRequest\r
+ *\r
+ * @brief       Dispatches handler for specfic join request\r
+ *\r
+ * input parameters\r
+ *\r
+ * @param   frame - Join frame received\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   void\r
+ */\r
+static void handleJoinRequest(mrfiPacket_t *frame)\r
+{\r
+  if (JOIN_LEGACY_MSG_LENGTH == (MRFI_GET_PAYLOAD_LEN(frame) - F_APP_PAYLOAD_OS))\r
+  {\r
+    /* Legacy frame. Spoof a join request */\r
+    *(MRFI_P_PAYLOAD(frame)+F_APP_PAYLOAD_OS) = JOIN_REQ_JOIN;\r
+  }\r
+\r
+  switch (*(MRFI_P_PAYLOAD(frame)+F_APP_PAYLOAD_OS))\r
+  {\r
+    case JOIN_REQ_JOIN:\r
+      smpl_send_join_reply(frame);\r
+      break;\r
+\r
+    default:\r
+      break;\r
+  }\r
+\r
+  return;\r
+}\r
+\r
+#else  /* ACCESS_POINT */\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_join\r
+ *\r
+ * @brief       Join functioanlity for non-AP devices. Send the Join token\r
+ *              and wait for the reply.\r
+ *\r
+ * input parameters\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   Status of operation.\r
+ */\r
+smplStatus_t nwk_join(void)\r
+{\r
+  uint8_t      msg[JOIN_FRAME_SIZE];\r
+  uint32_t     linkToken;\r
+  addr_t       apAddr;\r
+  uint8_t      radioState = MRFI_GetRadioState();\r
+  smplStatus_t rc = SMPL_NO_JOIN;\r
+  union\r
+  {\r
+    ioctlRawSend_t    send;\r
+    ioctlRawReceive_t recv;\r
+  } ioctl_info;\r
+\r
+#if defined( FREQUENCY_AGILITY )\r
+  uint8_t  i, numChan;\r
+  freqEntry_t channels[NWK_FREQ_TBL_SIZE];\r
+\r
+  if (!(numChan=nwk_scanForChannels(channels)))\r
+  {\r
+    return SMPL_NO_CHANNEL;\r
+  }\r
+\r
+  for (i=0; i<numChan; ++i)\r
+  {\r
+    nwk_setChannel(&channels[i]);\r
+#else\r
+  {\r
+#endif\r
+\r
+    ioctl_info.send.addr = (addr_t *)nwk_getBCastAddress();\r
+    ioctl_info.send.msg  = msg;\r
+    ioctl_info.send.len  = sizeof(msg);\r
+    ioctl_info.send.port = SMPL_PORT_JOIN;\r
+\r
+    /* Put join token in */\r
+    nwk_putNumObjectIntoMsg((void *)&sJoinToken, msg+J_JOIN_TOKEN_OS, sizeof(sJoinToken));\r
+    /* set app info byte */\r
+    msg[JB_REQ_OS] = JOIN_REQ_JOIN;\r
+    msg[JB_TID_OS] = sTid;\r
+    /* Set number of connections supported. Used only by AP if it is\r
+     * a data hub.\r
+     */\r
+    msg[J_NUMCONN_OS] = NUM_CONNECTIONS;\r
+    /* protocol version number */\r
+    msg[J_PROTOCOL_VERSION_OS] = nwk_getProtocolVersion();\r
+\r
+    SMPL_Ioctl(IOCTL_OBJ_RAW_IO, IOCTL_ACT_WRITE, &ioctl_info.send);\r
+\r
+    ioctl_info.recv.port = SMPL_PORT_JOIN;\r
+    ioctl_info.recv.msg  = msg;\r
+    ioctl_info.recv.addr = &apAddr;    /* save AP address from reply */\r
+\r
+    NWK_CHECK_FOR_SETRX(radioState);\r
+    NWK_REPLY_DELAY();\r
+    NWK_CHECK_FOR_RESTORE_STATE(radioState);\r
+\r
+    if (SMPL_SUCCESS == SMPL_Ioctl(IOCTL_OBJ_RAW_IO, IOCTL_ACT_READ, &ioctl_info.recv))\r
+    {\r
+      uint8_t firstByte = msg[JB_REQ_OS] & (~NWK_APP_REPLY_BIT);\r
+\r
+      /* Sanity check for correct reply frame. Older version\r
+       * has the length instead of the request as the first byte.\r
+       */\r
+      if ((firstByte == JOIN_REQ_JOIN) ||\r
+          (firstByte == JOIN_REPLY_LEGACY_MSG_LENGTH)\r
+         )\r
+      {\r
+        /* join reply returns link token */\r
+        memcpy(&linkToken, msg+JR_LINK_TOKEN_OS, sizeof(linkToken));\r
+\r
+        nwk_setLinkToken(linkToken);\r
+        /* save AP address */\r
+        nwk_setAPAddress(&apAddr);\r
+        sTid++;   /* guard against duplicates */\r
+        rc = SMPL_SUCCESS;\r
+#if defined( FREQUENCY_AGILITY )\r
+        break;\r
+#endif\r
+      }\r
+    }\r
+    /* TODO: process encryption stuff */\r
+  }\r
+\r
+  return rc;\r
+\r
+}\r
+\r
+#endif /* ACCESS_POINT */\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_processJoin\r
+ *\r
+ * @brief       Processes a Join frame. If this is a reply let it go to the\r
+ *              application. Otherwise generate and send the reply.\r
+ *\r
+ * input parameters\r
+ * @param   frame     - Pointer to Join frame\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   Keep frame for application, release frame, or replay frame.\r
+ */\r
+fhStatus_t nwk_processJoin(mrfiPacket_t *frame)\r
+{\r
+  fhStatus_t rc = FHS_RELEASE;\r
+  uint8_t    replyType;\r
+\r
+  /* Make sure this is a reply and see if we sent this. Validate the\r
+   * packet for reception by client app.\r
+   */\r
+  if (SMPL_MY_REPLY == (replyType=nwk_isValidReply(frame, sTid, JB_REQ_OS, JB_TID_OS)))\r
+  {\r
+    /* It's a match and it's a reply. Validate the received packet by\r
+     * returning a 1 so it can be received by the client app.\r
+     */\r
+    MRFI_PostKillSem();\r
+    rc = FHS_KEEP;\r
+  }\r
+#if defined(ACCESS_POINT)\r
+  else if (SMPL_A_REPLY == replyType)\r
+  {\r
+    /* No match. If I'm not an ED this is a reply that should be passed on. */\r
+    rc = FHS_REPLAY;\r
+  }\r
+  else\r
+  {\r
+    /* Send reply if we're an Access Point otherwise ignore the frame. */\r
+    if ((SMPL_NOT_REPLY == replyType) && sJoinOK)\r
+    {\r
+      handleJoinRequest(frame);\r
+    }\r
+  }\r
+#elif defined(RANGE_EXTENDER)\r
+  else\r
+  {\r
+    /* Either a reply that has to be replayed or a request that\r
+     * also must be replayed.\r
+     */\r
+    rc = FHS_REPLAY;\r
+  }\r
+#endif /* not END_DEVICE */\r
+\r
+  (void) replyType;  /* keep compiler happy */\r
+\r
+  return rc;\r
+}\r
diff --git a/chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/Components/nwk_applications/nwk_join.h b/chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/Components/nwk_applications/nwk_join.h
new file mode 100755 (executable)
index 0000000..69ccc36
--- /dev/null
@@ -0,0 +1,91 @@
+/**************************************************************************************************\r
+  Filename:       nwk_join.h\r
+  Revised:        $Date: 2009-01-06 12:26:02 -0800 (Tue, 06 Jan 2009) $\r
+  Revision:       $Revision: 18693 $\r
+  Author:         $Author: lfriedman $\r
+\r
+  Description:    This header file supports the SimpliciTI Join network application.\r
+\r
+  Copyright 2004-2007 Texas Instruments Incorporated. All rights reserved.\r
+\r
+  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+  the terms of a software license agreement between the user who downloaded the software,\r
+  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+  License. The License limits your use, and you acknowledge, that the Software may not be\r
+  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+  perform, display or sell this Software and/or its documentation for any purpose.\r
+\r
+  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+\r
+  Should you have any questions regarding your right to use this Software,\r
+  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+\r
+#ifndef NWK_JOIN_H\r
+#define NWK_JOIN_H\r
+\r
+#define JOIN_CONTEXT_ON  (0x01)\r
+#define JOIN_CONTEXT_OFF (0x02)\r
+\r
+/* Macros needed for protocol backward compatibility */\r
+#define JOIN_LEGACY_MSG_LENGTH        7\r
+#define JOIN_REPLY_LEGACY_MSG_LENGTH  6\r
+\r
+/* place holder... */\r
+#define SEC_CRYPT_KEY_SIZE  0\r
+\r
+/* application payload offsets */\r
+/*    both */\r
+#define JB_REQ_OS                0\r
+#define JB_TID_OS                1\r
+/*    join frame */\r
+#define J_JOIN_TOKEN_OS          2\r
+#define J_NUMCONN_OS             6\r
+#define J_PROTOCOL_VERSION_OS    7\r
+/*    join reply frame */\r
+#define JR_LINK_TOKEN_OS         2\r
+#define JR_CRYPTKEY_SIZE_OS      6\r
+#define JR_CRYPTKEY_OS           7\r
+\r
+/* change the following as protocol developed */\r
+#define MAX_JOIN_APP_FRAME    (JR_CRYPTKEY_OS + SEC_CRYPT_KEY_SIZE)\r
+\r
+/* set out frame size */\r
+#define JOIN_FRAME_SIZE         8\r
+#define JOIN_REPLY_FRAME_SIZE   MAX_JOIN_APP_FRAME\r
+\r
+/* join requests\r
+ * NOTE: If aditional command codes are required do _not_ use the\r
+ *       value JOIN_REPLY_LEGACY_MSG_LENGTH. This numeral is used\r
+ *       to guarantee that legacy Join frames (from before release\r
+ *       1.0.6) work correctly. Don't ask.\r
+ */\r
+#define JOIN_REQ_JOIN       1\r
+\r
+/* prototypes */\r
+void            nwk_joinInit(uint8_t (*)(linkID_t));\r
+smplStatus_t    nwk_join(void);\r
+fhStatus_t      nwk_processJoin(mrfiPacket_t *);\r
+void            nwk_getJoinToken(uint32_t *);\r
+void            nwk_setJoinContext(uint8_t);\r
+void            nwk_setJoinToken(uint32_t);\r
+void            nwk_getJoinToken(uint32_t *);\r
+#ifdef ACCESS_POINT\r
+sfClientInfo_t *nwk_isSandFClient(uint8_t *, uint8_t *);\r
+#endif\r
+\r
+#endif\r
+\r
diff --git a/chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/Components/nwk_applications/nwk_link.c b/chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/Components/nwk_applications/nwk_link.c
new file mode 100755 (executable)
index 0000000..c7e2a19
--- /dev/null
@@ -0,0 +1,853 @@
+/**************************************************************************************************\r
+  Filename:       nwk_link.c\r
+  Revised:        $Date: 2008-12-23 13:54:27 -0800 (Tue, 23 Dec 2008) $\r
+  Revision:       $Revision: 18652 $\r
+  Author:         $Author: lfriedman $\r
+\r
+  Description:    This file supports the SimpliciTI Link network application.\r
+\r
+  Copyright 2007-2008 Texas Instruments Incorporated. All rights reserved.\r
+\r
+  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+  the terms of a software license agreement between the user who downloaded the software,\r
+  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+  License. The License limits your use, and you acknowledge, that the Software may not be\r
+  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+  perform, display or sell this Software and/or its documentation for any purpose.\r
+\r
+  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+\r
+  Should you have any questions regarding your right to use this Software,\r
+  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+\r
+/******************************************************************************\r
+ * INCLUDES\r
+ */\r
+\r
+#include <string.h>\r
+#include "bsp.h"\r
+#include "mrfi.h"\r
+#include "nwk_types.h"\r
+#include "nwk_api.h"\r
+#include "nwk_frame.h"\r
+#include "nwk.h"\r
+#include "nwk_link.h"\r
+#include "nwk_globals.h"\r
+#include "nwk_security.h"\r
+\r
+/******************************************************************************\r
+ * MACROS\r
+ */\r
+\r
+/******************************************************************************\r
+ * CONSTANTS AND DEFINES\r
+ */\r
+\r
+/******************************************************************************\r
+ * TYPEDEFS\r
+ */\r
+\r
+/******************************************************************************\r
+ * LOCAL VARIABLES\r
+ */\r
+static uint32_t          sLinkToken = 0;\r
+static volatile uint8_t  sListenActive = 0;\r
+#if NUM_CONNECTIONS > 0\r
+static volatile linkID_t sServiceLinkID[NUM_CONNECTIONS];\r
+#endif\r
+static volatile uint8_t  sNumLinkers = 0;\r
+static volatile uint8_t  sTid = 0;\r
+\r
+/******************************************************************************\r
+ * LOCAL FUNCTIONS\r
+ */\r
+\r
+#define  SENT_REPLY       1\r
+#define  SENT_NO_REPLY    2\r
+static uint8_t    smpl_send_link_reply(mrfiPacket_t *);\r
+static fhStatus_t handleLinkRequest(mrfiPacket_t *);\r
+#if defined(EXTENDED_API)\r
+static void       smpl_send_unlink_reply(mrfiPacket_t *);\r
+#endif\r
+\r
+\r
+/******************************************************************************\r
+ * GLOBAL VARIABLES\r
+ */\r
+\r
+/******************************************************************************\r
+ * GLOBAL FUNCTIONS\r
+ */\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_linkInit\r
+ *\r
+ * @brief       Initialize link app. Set link token to the default.\r
+ *\r
+ * input parameters\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   void\r
+ */\r
+void nwk_linkInit(void)\r
+{\r
+  if (!sLinkToken)\r
+  {\r
+    /* if the link token has not been set externally by the time we get here\r
+     * (such as by the ioctl token-setting interface) assign the default\r
+     */\r
+    sLinkToken = DEFAULT_LINK_TOKEN;\r
+  }\r
+\r
+  /* set a non-zero TID. */\r
+  while (!(sTid = MRFI_RandomByte()))  ;\r
+\r
+#if NUM_CONNECTIONS > 0\r
+  memset((void *)&sServiceLinkID, 0x0, sizeof(sServiceLinkID));\r
+#endif\r
+\r
+  return;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_setLinkToken\r
+ *\r
+ * @brief       Sets the link token received in a Join reply.\r
+ *\r
+ * input parameters\r
+ * @param   token   - Link token to be used on this network to link to any peer.\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   void\r
+ */\r
+void nwk_setLinkToken(uint32_t token)\r
+{\r
+  /* only set if the supplied token is non-zero. */\r
+  if (token)\r
+  {\r
+    sLinkToken = token;\r
+  }\r
+\r
+  return;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_getLinkToken\r
+ *\r
+ * @brief       Gets the current link token.\r
+ *\r
+ * input parameters\r
+ *\r
+ * output parameters\r
+ * @param   pToken   - pointer to the returned value.\r
+ *\r
+ * @return   Current link token\r
+ */\r
+void nwk_getLinkToken(uint32_t *pToken)\r
+{\r
+  /* only set if the supplied token is non-zero. */\r
+  if (pToken)\r
+  {\r
+    *pToken = sLinkToken;\r
+  }\r
+\r
+  return;\r
+}\r
+\r
+#if defined(EXTENDED_API)\r
+/******************************************************************************\r
+ * @fn          nwk_unlink\r
+ *\r
+ * @brief       Called from the application level to tear down a link.\r
+ *\r
+ * input parameters\r
+ *\r
+ * output parameters\r
+ * @param   lid     - Link ID assigned for this link\r
+ *\r
+ * @return   Status of the operation.\r
+ *           SMPL_SUCCESS\r
+ *           SMPL_BAD_PARAM       No connection table entry for this Link ID;\r
+ *                                SMPL_LINKID_USER_UUD not valid since it is not\r
+ *                                connection-based.\r
+ *           SMPL_TIMEOUT         No reply from peer.\r
+ *           SMPL_NO_PEER_UNLINK  Peer did not have a Connection Table entry for me.\r
+ */\r
+smplStatus_t nwk_unlink(linkID_t lid)\r
+{\r
+  uint8_t      msg[UNLINK_FRAME_SIZE];\r
+  connInfo_t  *pCInfo = nwk_getConnInfo(lid);\r
+  smplStatus_t rc     = SMPL_SUCCESS;\r
+  addr_t       addr;\r
+  union\r
+  {\r
+    ioctlRawSend_t    send;\r
+    ioctlRawReceive_t recv;\r
+  } ioctl_info;\r
+\r
+  /* is there connection info? */\r
+   if (!pCInfo || (lid == SMPL_LINKID_USER_UUD))\r
+  {\r
+    return SMPL_BAD_PARAM;\r
+  }\r
+\r
+  /* set request byte */\r
+  msg[LB_REQ_OS] = LINK_REQ_UNLINK;\r
+\r
+  /* set the transaction ID. this allows target to figure out duplicates */\r
+  msg[LB_TID_OS] = sTid;\r
+\r
+  /* remote port to be sent in message to help match connection */\r
+  msg[UL_RMT_PORT_OS] = pCInfo->portRx;\r
+\r
+  /* setup for ioctl raw I/O */\r
+  memcpy(addr.addr, pCInfo->peerAddr, NET_ADDR_SIZE);\r
+  ioctl_info.send.addr = &addr;\r
+  ioctl_info.send.msg  = msg;\r
+  ioctl_info.send.len  = sizeof(msg);\r
+  ioctl_info.send.port = SMPL_PORT_LINK;\r
+\r
+  SMPL_Ioctl(IOCTL_OBJ_RAW_IO, IOCTL_ACT_WRITE, &ioctl_info.send);\r
+\r
+  {\r
+    uint8_t spin       = NWK_RX_RETRY_COUNT;\r
+    uint8_t radioState = MRFI_GetRadioState();\r
+\r
+    ioctl_info.recv.port = SMPL_PORT_LINK;\r
+    ioctl_info.recv.msg  = msg;\r
+    ioctl_info.recv.addr = (addr_t *)0;\r
+\r
+    do\r
+    {\r
+      NWK_CHECK_FOR_SETRX(radioState);\r
+      NWK_REPLY_DELAY();\r
+      NWK_CHECK_FOR_RESTORE_STATE(radioState);\r
+\r
+      if (SMPL_SUCCESS == SMPL_Ioctl(IOCTL_OBJ_RAW_IO, IOCTL_ACT_READ, &ioctl_info.recv))\r
+      {\r
+        if ((msg[LB_REQ_OS] & (~NWK_APP_REPLY_BIT)) == LINK_REQ_UNLINK)\r
+        {\r
+          rc = (smplStatus_t)msg[ULR_RESULT_OS];\r
+          break;\r
+        }\r
+      }\r
+      if (!spin)\r
+      {\r
+        rc = SMPL_TIMEOUT;\r
+        break;\r
+      }\r
+      --spin;\r
+    } while (1);\r
+\r
+   /* it's ok to unconditionally invalidate connection object */\r
+    nwk_freeConnection(pCInfo);\r
+  }\r
+  return rc;\r
+}\r
+#endif  /* EXTENDED_API */\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_link\r
+ *\r
+ * @brief       Called from the application level to accomplish the link\r
+ *\r
+ * input parameters\r
+ *\r
+ * output parameters\r
+ * @param   lid     - pointer to Link ID (port) assigned for this link\r
+ *\r
+ * @return   Status of the operation.\r
+ */\r
+smplStatus_t nwk_link(linkID_t *lid)\r
+{\r
+  uint8_t       msg[LINK_FRAME_SIZE];\r
+  connInfo_t   *pCInfo = nwk_getNextConnection();\r
+  smplStatus_t  rc;\r
+\r
+  if (pCInfo)\r
+  {\r
+    addr_t              addr;\r
+    union\r
+    {\r
+      ioctlRawSend_t    send;\r
+      ioctlRawReceive_t recv;\r
+    } ioctl_info;\r
+\r
+    if (!nwk_allocateLocalRxPort(LINK_SEND, pCInfo))\r
+    {\r
+      nwk_freeConnection(pCInfo);\r
+      return SMPL_NOMEM;\r
+    }\r
+\r
+    memcpy(addr.addr, nwk_getBCastAddress(), NET_ADDR_SIZE);\r
+    ioctl_info.send.addr = &addr;\r
+    ioctl_info.send.msg  = msg;\r
+    ioctl_info.send.len  = sizeof(msg);\r
+    ioctl_info.send.port = SMPL_PORT_LINK;\r
+\r
+    /* Put link token in */\r
+    nwk_putNumObjectIntoMsg((void *)&sLinkToken, msg+L_LINK_TOKEN_OS, sizeof(sLinkToken));\r
+\r
+    /* set port to which the remote device should send */\r
+    msg[L_RMT_PORT_OS] = pCInfo->portRx;\r
+\r
+    /* set the transaction ID. this allows target to figure out duplicates */\r
+    msg[LB_TID_OS] = sTid;\r
+\r
+    /* set my Rx type */\r
+    msg[L_MY_RXTYPE_OS] = nwk_getMyRxType();\r
+\r
+    /* set request byte */\r
+    msg[LB_REQ_OS] = LINK_REQ_LINK;\r
+\r
+    /* protocol version number */\r
+    msg[L_PROTOCOL_VERSION_OS] = nwk_getProtocolVersion();\r
+\r
+#if defined(SMPL_SECURE)\r
+    pCInfo->connTxCTR = MRFI_RandomByte()                   | \\r
+                        ((uint32_t)(MRFI_RandomByte())<<8)  | \\r
+                        ((uint32_t)(MRFI_RandomByte())<<16) | \\r
+                        ((uint32_t)(MRFI_RandomByte())<<24);\r
+\r
+    nwk_putNumObjectIntoMsg((void *)&pCInfo->connTxCTR, (void *)&msg[L_CTR_OS], 4);\r
+#endif\r
+\r
+\r
+    if (SMPL_SUCCESS != (rc=SMPL_Ioctl(IOCTL_OBJ_RAW_IO, IOCTL_ACT_WRITE, &ioctl_info.send)))\r
+    {\r
+      return rc;\r
+    }\r
+\r
+    {\r
+      uint8_t radioState = MRFI_GetRadioState();\r
+\r
+      ioctl_info.recv.port = SMPL_PORT_LINK;\r
+      ioctl_info.recv.msg  = msg;\r
+      ioctl_info.recv.addr = (addr_t *)pCInfo->peerAddr;\r
+\r
+      NWK_CHECK_FOR_SETRX(radioState);\r
+      NWK_REPLY_DELAY();\r
+      NWK_CHECK_FOR_RESTORE_STATE(radioState);\r
+\r
+      if (SMPL_SUCCESS == SMPL_Ioctl(IOCTL_OBJ_RAW_IO, IOCTL_ACT_READ, &ioctl_info.recv))\r
+      {\r
+        uint8_t firstByte = msg[LB_REQ_OS] & (~NWK_APP_REPLY_BIT);\r
+\r
+        /* Sanity check for correct reply frame. Older version\r
+         * has the length instead of the request as the first byte.\r
+         */\r
+        if ((firstByte != LINK_REQ_LINK) &&\r
+            (firstByte != LINK_REPLY_LEGACY_MSG_LENGTH)\r
+           )\r
+        {\r
+          /* invalidate connection object */\r
+          nwk_freeConnection(pCInfo);\r
+          return SMPL_NO_LINK;\r
+\r
+        }\r
+      }\r
+      else\r
+      {\r
+        /* no successful receive */\r
+        nwk_freeConnection(pCInfo);\r
+        return SMPL_TIMEOUT;\r
+      }\r
+\r
+      pCInfo->connState = CONNSTATE_CONNECTED;\r
+      pCInfo->portTx    = msg[LR_RMT_PORT_OS];    /* link reply returns remote port */\r
+      *lid              = pCInfo->thisLinkID;     /* return our local port number */\r
+\r
+      /* Set hop count. If it's a polling device set the count to the\r
+       * distance to the AP. Otherwise, set it to the max less the remaining\r
+       * which will be the path taken for this frame. It will be no worse\r
+       * then tha max and probably will be better.\r
+       */\r
+      if (F_RX_TYPE_POLLS == msg[LR_MY_RXTYPE_OS])\r
+      {\r
+        pCInfo->hops2target = MAX_HOPS_FROM_AP;\r
+      }\r
+      else\r
+      {\r
+        /* Can't really use this trick because the device could move. If the\r
+         * devices are all static this may work unless the initial reception\r
+         * was marginal.\r
+         */\r
+#if defined(DEVICE_DOES_NOT_MOVE)\r
+        pCInfo->hops2target = MAX_HOPS - ioctl_info.recv.hopCount;\r
+#else\r
+        pCInfo->hops2target = MAX_HOPS;\r
+#endif\r
+      }\r
+\r
+#if defined(SMPL_SECURE)\r
+      nwk_getNumObjectFromMsg((void *)&msg[LR_CTR_OS], (void *)&pCInfo->connRxCTR, 4);\r
+#endif\r
+    }\r
+\r
+    /* guard against duplicates... */\r
+    ++sTid;\r
+    if (!sTid)\r
+    {\r
+      sTid = 1;\r
+    }\r
+    return SMPL_SUCCESS;\r
+  }\r
+\r
+  return SMPL_NOMEM;\r
+}\r
+\r
+#if defined(EXTENDED_API)\r
+/******************************************************************************\r
+ * @fn          smpl_send_unlink_reply\r
+ *\r
+ * @brief       Send the unlink reply to the device trying to unlink\r
+ *\r
+ * input parameters\r
+ * @param   frame   - frame received from linker\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   void\r
+ */\r
+static void smpl_send_unlink_reply(mrfiPacket_t *frame)\r
+{\r
+  connInfo_t  *pCInfo;\r
+  frameInfo_t *pOutFrame;\r
+  uint8_t      msg[UNLINK_REPLY_FRAME_SIZE];\r
+  smplStatus_t rc = SMPL_NO_PEER_UNLINK;\r
+\r
+  /* match the remote port and source address with a connection table entry */\r
+  if (pCInfo = nwk_findPeer((addr_t *)MRFI_P_SRC_ADDR(frame), *(MRFI_P_PAYLOAD(frame)+F_APP_PAYLOAD_OS+UL_RMT_PORT_OS)))\r
+  {\r
+    /* Note we unconditionally free the connection resources */\r
+    nwk_freeConnection(pCInfo);\r
+    rc = SMPL_SUCCESS;\r
+  }\r
+\r
+  /* set reply bit */\r
+  msg[LB_REQ_OS] = LINK_REQ_UNLINK | NWK_APP_REPLY_BIT;\r
+\r
+  /* sender's TID */\r
+  msg[LB_TID_OS] = *(MRFI_P_PAYLOAD(frame)+F_APP_PAYLOAD_OS+LB_TID_OS);\r
+\r
+  /* result of freeing local connection */\r
+  msg[ULR_RESULT_OS] = rc;\r
+\r
+  if (pOutFrame = nwk_buildFrame(SMPL_PORT_LINK, msg, sizeof(msg), MAX_HOPS))\r
+  {\r
+    /* destination address is the source adddress of the received frame. */\r
+    memcpy(MRFI_P_DST_ADDR(&pOutFrame->mrfiPkt), MRFI_P_SRC_ADDR(frame), NET_ADDR_SIZE);\r
+#if defined(SMPL_SECURE)\r
+    nwk_setSecureFrame(&pOutFrame->mrfiPkt, sizeof(msg), 0);\r
+#endif  /* SMPL_SECURE */\r
+    nwk_sendFrame(pOutFrame, MRFI_TX_TYPE_FORCED);\r
+  }\r
+}\r
+#endif  /* EXTENDED_API */\r
+\r
+/******************************************************************************\r
+ * @fn          smpl_send_link_reply\r
+ *\r
+ * @brief       Send the link reply to the device trying to link. This routine\r
+ *              will handle duplicates.\r
+ *\r
+ * input parameters\r
+ * @param   frame   - frame received from linker\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   Returns SENT_REPLY if reply sent, else SENT_NO_REPLY.\r
+ *           The return value is used as this routine unwinds to know\r
+ *           whether to replay the frame. An RE or AP can host an ED\r
+ *           object in which case it might send a reply (possibly from\r
+ *           a duplicate frame). If we do reply we do not want to replay.\r
+ */\r
+static uint8_t smpl_send_link_reply(mrfiPacket_t *frame)\r
+{\r
+#if NUM_CONNECTIONS > 0\r
+  frameInfo_t *pOutFrame;\r
+  connInfo_t  *pCInfo;\r
+  uint8_t      remotePort;\r
+  uint8_t      msg[LINK_REPLY_FRAME_SIZE];\r
+\r
+  /* Is this a legacy frame? If so continue. Otherwise check version.*/\r
+  if ((MRFI_GET_PAYLOAD_LEN(frame) - F_APP_PAYLOAD_OS) > LINK_LEGACY_MSG_LENGTH)\r
+  {\r
+    /* see if protocol version is correct... */\r
+    if (*(MRFI_P_PAYLOAD(frame)+F_APP_PAYLOAD_OS+L_PROTOCOL_VERSION_OS) != nwk_getProtocolVersion())\r
+    {\r
+      /* Accommodation of protocol version differences can be noted or accomplished here.\r
+       * This field was also checked in the join transaction but it is checked again here\r
+       * because that check may not have occurred if thre is no AP in this topology.\r
+       * Otherwise, no match and the board goes back\r
+       */\r
+      return SENT_NO_REPLY;\r
+    }\r
+  }\r
+\r
+  /* see if token is correct */\r
+  {\r
+    uint32_t lt;\r
+\r
+    nwk_getNumObjectFromMsg(MRFI_P_PAYLOAD(frame)+F_APP_PAYLOAD_OS+L_LINK_TOKEN_OS, &lt, sizeof(lt));\r
+    if (lt != sLinkToken)\r
+    {\r
+      return SENT_NO_REPLY;\r
+    }\r
+  }\r
+\r
+  /* if we get here the token matched. */\r
+\r
+  /* is this a duplicate request? */\r
+  remotePort = *(MRFI_P_PAYLOAD(frame)+F_APP_PAYLOAD_OS+L_RMT_PORT_OS);\r
+  if (pCInfo=nwk_isLinkDuplicate(MRFI_P_SRC_ADDR(frame), remotePort))\r
+  {\r
+    /* resend reply */\r
+    msg[LB_REQ_OS] = LINK_REQ_LINK | NWK_APP_REPLY_BIT;\r
+\r
+    /* sender's TID */\r
+    msg[LB_TID_OS] = *(MRFI_P_PAYLOAD(frame)+F_APP_PAYLOAD_OS+LB_TID_OS);\r
+\r
+    /* Send reply with the local port number so the remote device knows where to\r
+     * send packets.\r
+     */\r
+    msg[LR_RMT_PORT_OS] = pCInfo->portRx;\r
+\r
+    /* put my Rx type in there. used to know how to set hops when sending back. */\r
+    msg[LR_MY_RXTYPE_OS] = nwk_getMyRxType();\r
+#if defined(SMPL_SECURE)\r
+    /* Set the Tx counter value for peer's Rx counter object */\r
+    nwk_putNumObjectIntoMsg((void *)&pCInfo->connTxCTR, (void *)&msg[LR_CTR_OS], 4);\r
+    /* We also need to save the newly generated Rx counter value. */\r
+    nwk_getNumObjectFromMsg((void *)(MRFI_P_PAYLOAD(frame)+F_APP_PAYLOAD_OS+L_CTR_OS), (void *)&pCInfo->connRxCTR, 4);\r
+#endif\r
+    if (pOutFrame = nwk_buildFrame(SMPL_PORT_LINK, msg, sizeof(msg), MAX_HOPS-(GET_FROM_FRAME(MRFI_P_PAYLOAD(frame),F_HOP_COUNT))))\r
+    {\r
+      /* destination address is the source adddress of the received frame. */\r
+      memcpy(MRFI_P_DST_ADDR(&pOutFrame->mrfiPkt), MRFI_P_SRC_ADDR(frame), NET_ADDR_SIZE);\r
+#if defined(SMPL_SECURE)\r
+      nwk_setSecureFrame(&pOutFrame->mrfiPkt, sizeof(msg), 0);\r
+#endif  /* SMPL_SECURE */\r
+      nwk_sendFrame(pOutFrame, MRFI_TX_TYPE_FORCED);\r
+    }\r
+    return SENT_REPLY;\r
+  }\r
+\r
+  if (!sListenActive)\r
+  {\r
+    /* We've checked for duplicate and resent reply. In that case we weren't listening\r
+     * so just go back`.\r
+     */\r
+    return SENT_NO_REPLY;\r
+  }\r
+\r
+  /* room to link? */\r
+#if defined(AP_IS_DATA_HUB)\r
+  pCInfo = nwk_findAlreadyJoined(frame);\r
+\r
+  if (!pCInfo)\r
+#endif\r
+  {\r
+    pCInfo = nwk_getNextConnection();\r
+  }\r
+\r
+  if (pCInfo)\r
+  {\r
+    /* yes there's room and it's not a dup. address. */\r
+    memcpy(&pCInfo->peerAddr, MRFI_P_SRC_ADDR(frame), NET_ADDR_SIZE);\r
+\r
+    if (!nwk_allocateLocalRxPort(LINK_REPLY, pCInfo))\r
+    {\r
+      nwk_freeConnection(pCInfo);\r
+      /* we're done with the packet */\r
+      return SENT_REPLY;\r
+    }\r
+\r
+    /* The local Rx port is the one returned in the connection structure. The\r
+     * caller is waiting on this to be set. The code here is running in an ISR\r
+     * thread so the caller will see this change after RETI.\r
+     */\r
+    if (NUM_CONNECTIONS == sNumLinkers)\r
+    {\r
+      /* Something is wrong -- no room to stack Link request */\r
+      nwk_freeConnection(pCInfo);\r
+      /* we're done with the packet */\r
+      return SENT_REPLY;\r
+    }\r
+    sServiceLinkID[sNumLinkers++] = pCInfo->thisLinkID;\r
+\r
+    /* save the remote Tx port */\r
+    pCInfo->portTx = remotePort;\r
+\r
+    /* connection is valid... */\r
+    pCInfo->connState = CONNSTATE_CONNECTED;\r
+\r
+    /* Set hop count. If it's a polling device set the count to the\r
+     * distance to the AP. otherwise, set it to the max less the remaining\r
+     * which will be the path taken for this frame. It will be no worse\r
+     * then tha max and probably will be better.\r
+     */\r
+    if (F_RX_TYPE_POLLS == *(MRFI_P_PAYLOAD(frame)+F_APP_PAYLOAD_OS+L_MY_RXTYPE_OS))\r
+    {\r
+      /* It polls. so. we'll be sending to the AP which will store the\r
+       * frame. The AP is only MAX_HOPS_FROM_AP hops away from us.\r
+       */\r
+      pCInfo->hops2target = MAX_HOPS_FROM_AP;\r
+    }\r
+    else\r
+    {\r
+      /* Can't really use this trick because the device could move. If the\r
+       * devices are all static this may work unless the initial reception\r
+       * was marginal.\r
+       */\r
+#if defined(DEVICE_DOES_NOT_MOVE)\r
+      pCInfo->hops2target = MAX_HOPS - GET_FROM_FRAME(MRFI_P_PAYLOAD(frame), F_HOP_COUNT);\r
+#else\r
+      pCInfo->hops2target = MAX_HOPS;\r
+#endif\r
+    }\r
+    /* Send reply with the local port number so the remote device knows where to\r
+     * send packets.\r
+     */\r
+    msg[LR_RMT_PORT_OS]  = pCInfo->portRx;\r
+\r
+    /* put my Rx type in there. used to know how to set hops when sending back. */\r
+    msg[LR_MY_RXTYPE_OS] = nwk_getMyRxType();\r
+\r
+    msg[LB_REQ_OS] = LINK_REQ_LINK | NWK_APP_REPLY_BIT;\r
+\r
+    /* sender's TID */\r
+    msg[LB_TID_OS] = *(MRFI_P_PAYLOAD(frame)+F_APP_PAYLOAD_OS+LB_TID_OS);\r
+#if defined(SMPL_SECURE)\r
+    nwk_getNumObjectFromMsg((void *)(MRFI_P_PAYLOAD(frame)+F_APP_PAYLOAD_OS+L_CTR_OS), (void *)&pCInfo->connRxCTR, 4);\r
+    pCInfo->connTxCTR = MRFI_RandomByte()                   | \\r
+                        ((uint32_t)(MRFI_RandomByte())<<8)  | \\r
+                        ((uint32_t)(MRFI_RandomByte())<<16) | \\r
+                        ((uint32_t)(MRFI_RandomByte())<<24);\r
+\r
+    nwk_putNumObjectIntoMsg((void *)&pCInfo->connTxCTR, (void *)&msg[LR_CTR_OS], 4);\r
+#endif\r
+    if (pOutFrame = nwk_buildFrame(SMPL_PORT_LINK, msg, sizeof(msg), MAX_HOPS-(GET_FROM_FRAME(MRFI_P_PAYLOAD(frame),F_HOP_COUNT))))\r
+    {\r
+      /* destination address is the source adddress of the received frame. */\r
+      memcpy(MRFI_P_DST_ADDR(&pOutFrame->mrfiPkt), MRFI_P_SRC_ADDR(frame), NET_ADDR_SIZE);\r
+#if defined(SMPL_SECURE)\r
+      nwk_setSecureFrame(&pOutFrame->mrfiPkt, sizeof(msg), 0);\r
+#endif\r
+      if (SMPL_SUCCESS != nwk_sendFrame(pOutFrame, MRFI_TX_TYPE_FORCED))\r
+      {\r
+        /* better release the connection structure */\r
+        nwk_freeConnection(pCInfo);\r
+      }\r
+    }\r
+    else\r
+    {\r
+      /* better release the connection structure */\r
+      nwk_freeConnection(pCInfo);\r
+    }\r
+  }\r
+  /* we're done with the packet */\r
+  return SENT_REPLY;\r
+#else\r
+  return SENT_NO_REPLY;\r
+#endif  /* NUM_CONNECTIONS */\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_processLink\r
+ *\r
+ * @brief       Process Link frame. Just save the frame for the Link app if it\r
+ *              a reply. If it isn't a reply, send the reply in this thread.\r
+ *\r
+ * input parameters\r
+ * @param   frame   - pointer to frame to be processed\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   Keep frame for application, release frame, or replay frame..\r
+ */\r
+fhStatus_t nwk_processLink(mrfiPacket_t *frame)\r
+{\r
+  fhStatus_t   rc;\r
+  uint8_t      replyType;\r
+\r
+  /* If we sent this then this is the reply. Validate the\r
+   * packet for reception by client app. If we didn't send\r
+   * it then we are the target. send the reply.\r
+   */\r
+  if (SMPL_MY_REPLY == (replyType=nwk_isValidReply(frame, sTid, LB_REQ_OS, LB_TID_OS)))\r
+  {\r
+    /* It's a match and it's a reply. Validate the received packet by\r
+     * returning a 1 so it can be received by the client app.\r
+     */\r
+    MRFI_PostKillSem();\r
+    rc = FHS_KEEP;\r
+  }\r
+#if !defined( END_DEVICE )\r
+  else if (SMPL_A_REPLY == replyType)\r
+  {\r
+    /* no match. if i'm not an ED this is a reply that should be passed on. */\r
+    rc = FHS_REPLAY;\r
+  }\r
+#endif  /* !END_DEVICE */\r
+  else\r
+  {\r
+    /* No, we didn't send it. Process request assuming it's\r
+     * intended for us.\r
+     */\r
+    rc = handleLinkRequest(frame);\r
+  }\r
+\r
+  (void) replyType;  /* keep compiler happy when ED built... */\r
+\r
+  return rc;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_getLocalLinkID\r
+ *\r
+ * @brief       This routine checks to see if a service port has been assigned\r
+ *              as a result of a link reply frame being received. It is the means\r
+ *              by which the user thread knows that the waiting is over for the\r
+ *              link listen. the value is set in an interrupt thread.\r
+ *\r
+ * input parameters\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   Local port assigned when the link reply was received.\r
+ */\r
+linkID_t nwk_getLocalLinkID(void)\r
+{\r
+  linkID_t    lid = 0;\r
+#if NUM_CONNECTIONS > 0\r
+  uint8_t     i;\r
+  bspIState_t intState;\r
+\r
+\r
+  BSP_ENTER_CRITICAL_SECTION(intState);\r
+  if (sNumLinkers)\r
+  {\r
+    sNumLinkers--;\r
+    BSP_EXIT_CRITICAL_SECTION(intState);\r
+\r
+    nwk_setListenContext(LINK_LISTEN_OFF);\r
+    lid = sServiceLinkID[0];\r
+    /* If more than one Link frame has been processed without an intervening\r
+     * Listen assume that there will be another Link Listen call that will\r
+     * poll for completion which has already occurred. Age any existing entries.\r
+     * This code was added to deal with the possibility of mulitple EDs being\r
+     * activated simultaneously in the AP-as-data-hub example. This opens a\r
+     * window of opportunity for a "typical" scenario to get hosed. But for\r
+     * a "typical" scenario to get hosed a number of improbable events have to\r
+     * occur. These are deemed far less likely than the multiple-ED-activation\r
+     * scenario in the AP-as-dat-hub case.\r
+     */\r
+    for (i=0; i<sNumLinkers; ++i)\r
+    {\r
+      sServiceLinkID[i] = sServiceLinkID[i+1];\r
+    }\r
+  }\r
+  else\r
+  {\r
+    BSP_EXIT_CRITICAL_SECTION(intState);\r
+  }\r
+#endif  /* NUM_CONNECTIONS */\r
+\r
+  return lid;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_setListenContext\r
+ *\r
+ * @brief       Sets the context when a LinkListen is executed. This prevents\r
+ *              processing other link frames from being confused with the real\r
+ *              one. Without this semaphore other broadcast link messages\r
+ *              could wait int the input queue and accidently be processed if\r
+ *              a listen is done later.\r
+ *\r
+ * input parameters\r
+ *\r
+ * @param   context - listen on or off\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   void\r
+ */\r
+void nwk_setListenContext(uint8_t context)\r
+{\r
+  sListenActive = (context == LINK_LISTEN_ON) ? 1 : 0;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          handleLinkRequest\r
+ *\r
+ * @brief       Dispatches handler for specfic link request\r
+ *\r
+ * input parameters\r
+ *\r
+ * @param   frame - Link frame received\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   void\r
+ */\r
+static fhStatus_t handleLinkRequest(mrfiPacket_t *frame)\r
+{\r
+  fhStatus_t rc = FHS_RELEASE;\r
+  uint8_t    isReplySent;\r
+\r
+  if (LINK_LEGACY_MSG_LENGTH == (MRFI_GET_PAYLOAD_LEN(frame) - F_APP_PAYLOAD_OS))\r
+  {\r
+    /* Legacy frame. Spoof a link request */\r
+    *(MRFI_P_PAYLOAD(frame)+F_APP_PAYLOAD_OS) = LINK_REQ_LINK;\r
+  }\r
+\r
+  switch (*(MRFI_P_PAYLOAD(frame)+F_APP_PAYLOAD_OS))\r
+  {\r
+    case LINK_REQ_LINK:\r
+      isReplySent = smpl_send_link_reply(frame);\r
+#if !defined(END_DEVICE)\r
+      /* If I am an AP or RE and not listening I need to replay frame.\r
+       * The exception is if I am an AP or RE hosting an End Device\r
+       * object and I just sent a reply frame to a duplicate link frame\r
+       * for which I was not listening. In this case don't replay.\r
+       */\r
+      if (!sListenActive && (SENT_REPLY != isReplySent))\r
+      {\r
+        rc = FHS_REPLAY;\r
+      }\r
+#endif   /* !END_DEVICE */\r
+      break;\r
+\r
+#if defined(EXTENDED_API)\r
+    case LINK_REQ_UNLINK:\r
+      smpl_send_unlink_reply(frame);\r
+      break;\r
+#endif\r
+\r
+    default:\r
+      break;\r
+  }\r
+\r
+  /* keep compiler happy if I'm compiled as an End Device */\r
+  (void) isReplySent;\r
+\r
+  return rc;\r
+}\r
diff --git a/chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/Components/nwk_applications/nwk_link.h b/chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/Components/nwk_applications/nwk_link.h
new file mode 100755 (executable)
index 0000000..6abc1e2
--- /dev/null
@@ -0,0 +1,106 @@
+/**************************************************************************************************\r
+  Filename:       nwk_link.h\r
+  Revised:        $Date: 2008-12-10 16:52:14 -0800 (Wed, 10 Dec 2008) $\r
+  Revision:       $Revision: 18596 $\r
+  Author:         $Author: lfriedman $\r
+\r
+  Description:    This header file supports the SimpliciTI Join network application.\r
+\r
+  Copyright 2004-2007 Texas Instruments Incorporated. All rights reserved.\r
+\r
+  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+  the terms of a software license agreement between the user who downloaded the software,\r
+  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+  License. The License limits your use, and you acknowledge, that the Software may not be\r
+  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+  perform, display or sell this Software and/or its documentation for any purpose.\r
+\r
+  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+\r
+  Should you have any questions regarding your right to use this Software,\r
+  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+#ifndef NWK_LINK_H\r
+#define NWK_LINK_H\r
+\r
+/* Macros needed for protocol backward compatibility */\r
+#define LINK_LEGACY_MSG_LENGTH       8\r
+#define LINK_REPLY_LEGACY_MSG_LENGTH 3\r
+\r
+\r
+#define LINK_LISTEN_ON   0\r
+#define LINK_LISTEN_OFF  1\r
+\r
+/* application payload offsets */\r
+/*    both */\r
+#define LB_REQ_OS         0\r
+#define LB_TID_OS         1\r
+\r
+/*    link frame */\r
+#define L_LINK_TOKEN_OS        2\r
+#define L_RMT_PORT_OS          6\r
+#define L_MY_RXTYPE_OS         7\r
+#define L_PROTOCOL_VERSION_OS  8\r
+#define L_CTR_OS               9\r
+/*    link reply frame */\r
+#define LR_RMT_PORT_OS         2\r
+#define LR_MY_RXTYPE_OS        3\r
+#define LR_CTR_OS              4\r
+\r
+/*    unlink frame */\r
+#define UL_RMT_PORT_OS        2\r
+/*    unlink reply frame */\r
+#define ULR_RESULT_OS         2\r
+\r
+/* change the following as protocol developed */\r
+#ifndef SMPL_SECURE\r
+#define MAX_LINK_APP_FRAME      9\r
+#else\r
+#define MAX_LINK_APP_FRAME      13\r
+#endif\r
+\r
+/* frame sizes */\r
+#ifndef SMPL_SECURE\r
+#define LINK_FRAME_SIZE         9\r
+#define LINK_REPLY_FRAME_SIZE   4\r
+#else\r
+#define LINK_FRAME_SIZE         13\r
+#define LINK_REPLY_FRAME_SIZE   8\r
+#endif\r
+#define UNLINK_FRAME_SIZE       3\r
+#define UNLINK_REPLY_FRAME_SIZE 3\r
+\r
+/* link requests\r
+ * NOTE: If aditional command codes are required do _not_ use the\r
+ *       value LINK_REPLY_LEGACY_MSG_LENGTH. This numeral is used\r
+ *       to guarantee that legacy Link frames (from before release\r
+ *       1.0.6) work correctly. Don't ask.\r
+ */\r
+\r
+#define LINK_REQ_LINK       1\r
+#define LINK_REQ_UNLINK     2\r
+\r
+/* prototypes */\r
+fhStatus_t   nwk_processLink(mrfiPacket_t *);\r
+linkID_t     nwk_getLocalLinkID(void);\r
+void         nwk_linkInit(void);\r
+smplStatus_t nwk_link(linkID_t *);\r
+smplStatus_t nwk_unlink(linkID_t);\r
+void         nwk_setLinkToken(uint32_t);\r
+void         nwk_getLinkToken(uint32_t *);\r
+void         nwk_setListenContext(uint8_t);\r
+\r
+#endif\r
diff --git a/chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/Components/nwk_applications/nwk_mgmt.c b/chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/Components/nwk_applications/nwk_mgmt.c
new file mode 100755 (executable)
index 0000000..ec2eb0e
--- /dev/null
@@ -0,0 +1,349 @@
+/**************************************************************************************************\r
+  Filename:       nwk_mgmt.c\r
+  Revised:        $Date: 2009-01-06 15:45:54 -0800 (Tue, 06 Jan 2009) $\r
+  Revision:       $Revision: 18697 $\r
+  Author:         $Author: lfriedman $\r
+\r
+  Description:    This file supports the SimpliciTI Mgmt network application.\r
+\r
+  Copyright 2007-2009 Texas Instruments Incorporated. All rights reserved.\r
+\r
+  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+  the terms of a software license agreement between the user who downloaded the software,\r
+  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+  License. The License limits your use, and you acknowledge, that the Software may not be\r
+  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+  perform, display or sell this Software and/or its documentation for any purpose.\r
+\r
+  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+\r
+  Should you have any questions regarding your right to use this Software,\r
+  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+\r
+/******************************************************************************\r
+ * INCLUDES\r
+ */\r
+#include <string.h>\r
+#include "bsp.h"\r
+#include "mrfi.h"\r
+#include "nwk_types.h"\r
+#include "nwk_api.h"\r
+#include "nwk_frame.h"\r
+#include "nwk.h"\r
+#include "nwk_mgmt.h"\r
+#include "nwk_join.h"\r
+#include "nwk_globals.h"\r
+#include "nwk_QMgmt.h"\r
+\r
+/******************************************************************************\r
+ * MACROS\r
+ */\r
+\r
+/******************************************************************************\r
+ * CONSTANTS AND DEFINES\r
+ */\r
+\r
+/******************************************************************************\r
+ * TYPEDEFS\r
+ */\r
+\r
+/******************************************************************************\r
+ * LOCAL VARIABLES\r
+ */\r
+#ifndef ACCESS_POINT\r
+static addr_t const *sAPAddr = NULL;\r
+#else\r
+static uint8_t sSFMarker[NUM_STORE_AND_FWD_CLIENTS] = {0};\r
+#endif\r
+\r
+static volatile uint8_t sTid = 0;\r
+\r
+/******************************************************************************\r
+ * LOCAL FUNCTIONS\r
+ */\r
+static void  smpl_send_mgmt_reply(mrfiPacket_t *);\r
+#ifdef ACCESS_POINT\r
+static void  send_poll_reply(mrfiPacket_t *);\r
+#endif\r
+\r
+/******************************************************************************\r
+ * GLOBAL VARIABLES\r
+ */\r
+\r
+/******************************************************************************\r
+ * GLOBAL FUNCTIONS\r
+ */\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_mgmtInit\r
+ *\r
+ * @brief       Initialize Management functions.\r
+ *\r
+ * input parameters\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   void\r
+ */\r
+\r
+void nwk_mgmtInit(void)\r
+{\r
+  sTid = MRFI_RandomByte();\r
+\r
+#ifdef ACCESS_POINT\r
+  memset(&sSFMarker, 0x0, sizeof(sSFMarker));\r
+#endif\r
+\r
+  return;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_processMgmt\r
+ *\r
+ * @brief       Process Management frame. Just save the frame for the Management\r
+ *              app it it is a reply. If it isn't a reply, send the reply in this\r
+ *              thread.\r
+ *\r
+ * input parameters\r
+ * @param   frame   - pointer to frame to be processed\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   Keep frame for application, release frame, or replay frame.\r
+ */\r
+fhStatus_t nwk_processMgmt(mrfiPacket_t *frame)\r
+{\r
+  fhStatus_t   rc;\r
+  uint8_t      replyType;\r
+\r
+  /* If we sent this then this is the reply. Validate the\r
+   * packet for reception by client app. If we didn't send\r
+   * it then we are the target. send the reply.\r
+   */\r
+  if (SMPL_MY_REPLY == (replyType=nwk_isValidReply(frame, sTid, MB_APP_INFO_OS, MB_TID_OS)))\r
+  {\r
+    /* It's a match and it's a reply. Validate the received packet by\r
+     * returning a 1 so it can be received by the client app.\r
+     */\r
+    MRFI_PostKillSem();\r
+    rc = FHS_KEEP;\r
+  }\r
+#if !defined( END_DEVICE )\r
+  else if (SMPL_A_REPLY == replyType)\r
+  {\r
+    /* no match. if i'm not an ED this is a reply that should be passed on. */\r
+    rc = FHS_REPLAY;\r
+  }\r
+#endif  /* !END_DEVICE */\r
+  else\r
+  {\r
+    /* no, we didn't send it. send reply if it's intended for us */\r
+    if (!memcmp(MRFI_P_DST_ADDR(frame), nwk_getMyAddress(), NET_ADDR_SIZE))\r
+    {\r
+      smpl_send_mgmt_reply(frame);\r
+\r
+      /* we're done with the frame. */\r
+      rc = FHS_RELEASE;\r
+    }\r
+    else\r
+    {\r
+      rc = FHS_REPLAY;\r
+    }\r
+  }\r
+\r
+  (void) replyType;  /* keep compiler happy */\r
+\r
+  return rc;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          smpl_send_mgmt_reply\r
+ *\r
+ * @brief       Send appropriate reply to Management frame.\r
+ *\r
+ * input parameters\r
+ * @param  frame  - Pointer to frame for which reply required.\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   void\r
+ */\r
+static void smpl_send_mgmt_reply(mrfiPacket_t *frame)\r
+{\r
+#ifdef ACCESS_POINT\r
+  /* what kind of management frame is this? */\r
+  switch (*(MRFI_P_PAYLOAD(frame)+F_APP_PAYLOAD_OS+MB_APP_INFO_OS))\r
+  {\r
+    case MGMT_REQ_POLL:\r
+      send_poll_reply(frame);\r
+      break;\r
+\r
+    default:\r
+      break;\r
+  }\r
+#endif  /* ACCESS_POINT */\r
+  return;\r
+}\r
+\r
+\r
+#ifdef ACCESS_POINT\r
+/******************************************************************************\r
+ * @fn          send_poll_reply\r
+ *\r
+ * @brief       Send reply to polling frame.\r
+ *\r
+ * input parameters\r
+ * @param  frame  - Pointer to frame for which reply required.\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   void\r
+ */\r
+static void send_poll_reply(mrfiPacket_t *frame)\r
+{\r
+  uint8_t         msgtid = *(MRFI_P_PAYLOAD(frame)+F_APP_PAYLOAD_OS+MB_TID_OS);\r
+  frameInfo_t    *pOutFrame;\r
+  sfClientInfo_t *pClientInfo;\r
+  uint8_t         loc;\r
+\r
+  /* Make sure this guy is really a client. We can tell from the source address. */\r
+  if (!(pClientInfo=nwk_isSandFClient(MRFI_P_SRC_ADDR(frame), &loc)))\r
+  {\r
+    /* TODO: maybe send an error frame? */\r
+    return;\r
+  }\r
+\r
+  /* If we have to resync the TID then do it based on the first\r
+   * poll frame we see\r
+  */\r
+  if (!sSFMarker[loc])\r
+  {\r
+    /* If the marker flag is null then it has been initialized, i.e.,\r
+     * there has been a reset. In this case infer that we need to update\r
+     * a (probably) stale last TID. The test will always be true the first\r
+     * time through after a client is established even when an NV restore\r
+     * did not take place but this does no harm.\r
+     */\r
+    pClientInfo->lastTID = msgtid;\r
+    sSFMarker[loc]       = 1;\r
+  }\r
+  /* If we've seen this poll frame before ignore it. Otherwise we\r
+   * may send a stored frame when we shouldn't.\r
+   */\r
+  else if (nwk_checkAppMsgTID(pClientInfo->lastTID, msgtid))\r
+  {\r
+    pClientInfo->lastTID = msgtid;\r
+  }\r
+  else\r
+  {\r
+    return;\r
+  }\r
+\r
+  if (pOutFrame = nwk_getSandFFrame(frame, M_POLL_PORT_OS))\r
+  {\r
+    /* We need to adjust the order in the queue in this case. Currently\r
+     * we know it is in the input queue and that this adjustment is safe\r
+     * because we're in an ISR thread. This is a fragile fix, though, and\r
+     * should be revisited when time permits.\r
+     */\r
+    nwk_QadjustOrder(INQ, pOutFrame->orderStamp);\r
+\r
+    /* reset hop count... */\r
+    PUT_INTO_FRAME(MRFI_P_PAYLOAD(&pOutFrame->mrfiPkt), F_HOP_COUNT, MAX_HOPS_FROM_AP);\r
+    /* It's gonna be a forwarded frame. */\r
+    PUT_INTO_FRAME(MRFI_P_PAYLOAD(&pOutFrame->mrfiPkt), F_FWD_FRAME, 0x80);\r
+\r
+    nwk_sendFrame(pOutFrame, MRFI_TX_TYPE_FORCED);\r
+  }\r
+  else\r
+  {\r
+    nwk_SendEmptyPollRspFrame(frame);\r
+  }\r
+\r
+  return;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_resetSFMarker\r
+ *\r
+ * @brief       Reset S&F cklient marker so the TIDs resync.\r
+ *\r
+ * input parameters\r
+ * @param  idx  - index of the client that should be reset.\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   void\r
+ */\r
+void nwk_resetSFMarker(uint8_t idx)\r
+{\r
+  sSFMarker[idx] = 0;\r
+\r
+  return;\r
+}\r
+\r
+#else  /* ACCESS_POINT */\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_poll\r
+ *\r
+ * @brief       Poll S&F server for any waiting frames.\r
+ *\r
+ * input parameters\r
+ * @param  port  - Port on peer.\r
+ * @param  addr  - SimpliciTI address of peer.\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   SMPL_SUCCESS\r
+ *           SMPL_NO_AP_ADDRESS - We don't know Access Point's address\r
+ *           SMPL_NOMEM         - no room in output frame queue\r
+ *           SMPL_TX_CCA_FAIL   - CCA failure\r
+ */\r
+smplStatus_t nwk_poll(uint8_t port, uint8_t *addr)\r
+{\r
+  uint8_t        msg[MGMT_POLL_FRAME_SIZE];\r
+  ioctlRawSend_t send;\r
+\r
+  msg[MB_APP_INFO_OS] = MGMT_REQ_POLL;\r
+  msg[MB_TID_OS]      = sTid;\r
+  msg[M_POLL_PORT_OS] = port;\r
+  memcpy(msg+M_POLL_ADDR_OS, addr, NET_ADDR_SIZE);\r
+\r
+  /* it's OK to increment the TID here because the reply will not be\r
+   * matched based on this number. The reply to the poll comes back\r
+   * to the client port, not the Management port.\r
+   */\r
+  sTid++;\r
+\r
+  if (!sAPAddr)\r
+  {\r
+    sAPAddr = nwk_getAPAddress();\r
+    if (!sAPAddr)\r
+    {\r
+      return SMPL_NO_AP_ADDRESS;\r
+    }\r
+  }\r
+  send.addr = (addr_t *)sAPAddr;\r
+  send.msg  = msg;\r
+  send.len  = sizeof(msg);\r
+  send.port = SMPL_PORT_MGMT;\r
+\r
+  return SMPL_Ioctl(IOCTL_OBJ_RAW_IO, IOCTL_ACT_WRITE, &send);\r
+}\r
+\r
+#endif /* ACCESS_POINT */\r
diff --git a/chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/Components/nwk_applications/nwk_mgmt.h b/chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/Components/nwk_applications/nwk_mgmt.h
new file mode 100755 (executable)
index 0000000..d913abb
--- /dev/null
@@ -0,0 +1,67 @@
+/**************************************************************************************************\r
+  Filename:       nwk_mgmt.h\r
+  Revised:        $Date: 2009-01-06 15:45:54 -0800 (Tue, 06 Jan 2009) $\r
+  Revision:       $Revision: 18697 $\r
+  Author:         $Author: lfriedman $\r
+\r
+  Description:    This header file supports the SimpliciTI Mgmt network application.\r
+\r
+  Copyright 2004-2007 Texas Instruments Incorporated. All rights reserved.\r
+\r
+  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+  the terms of a software license agreement between the user who downloaded the software,\r
+  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+  License. The License limits your use, and you acknowledge, that the Software may not be\r
+  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+  perform, display or sell this Software and/or its documentation for any purpose.\r
+\r
+  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+\r
+  Should you have any questions regarding your right to use this Software,\r
+  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+\r
+#ifndef NWK_MGMT_H\r
+#define NWK_MGMT_H\r
+\r
+/* MGMT frame application requests */\r
+#define  MGMT_REQ_POLL        0x01\r
+\r
+/* change the following as protocol developed */\r
+#define MAX_MGMT_APP_FRAME    7\r
+\r
+/* application payload offsets */\r
+/*    both */\r
+#define MB_APP_INFO_OS           0\r
+#define MB_TID_OS                1\r
+\r
+/*    Poll frame */\r
+#define M_POLL_PORT_OS          2\r
+#define M_POLL_ADDR_OS          3\r
+\r
+/* change the following as protocol developed */\r
+#define MAX_MGMT_APP_FRAME    7\r
+\r
+/* frame sizes */\r
+#define MGMT_POLL_FRAME_SIZE  7\r
+\r
+/* prototypes */\r
+void         nwk_mgmtInit(void);\r
+fhStatus_t   nwk_processMgmt(mrfiPacket_t *);\r
+smplStatus_t nwk_poll(uint8_t, uint8_t *);\r
+void         nwk_resetSFMarker(uint8_t);\r
+\r
+#endif\r
diff --git a/chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/Components/nwk_applications/nwk_ping.c b/chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/Components/nwk_applications/nwk_ping.c
new file mode 100755 (executable)
index 0000000..2e55a48
--- /dev/null
@@ -0,0 +1,314 @@
+/**************************************************************************************************\r
+  Filename:       nwk_ping.c\r
+  Revised:        $Date: 2009-01-18 16:01:08 -0800 (Sun, 18 Jan 2009) $\r
+  Revision:       $Revision: 18796 $\r
+  Author:         $Author: lfriedman $\r
+\r
+  Description:    This file supports the SimpliciTI Ping network application.\r
+\r
+  Copyright 2007-2009 Texas Instruments Incorporated. All rights reserved.\r
+\r
+  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+  the terms of a software license agreement between the user who downloaded the software,\r
+  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+  License. The License limits your use, and you acknowledge, that the Software may not be\r
+  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+  perform, display or sell this Software and/or its documentation for any purpose.\r
+\r
+  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+\r
+  Should you have any questions regarding your right to use this Software,\r
+  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+\r
+/******************************************************************************\r
+ * INCLUDES\r
+ */\r
+#include <string.h>\r
+#include "bsp.h"\r
+#include "mrfi.h"\r
+#include "nwk_types.h"\r
+#include "nwk_frame.h"\r
+#include "nwk.h"\r
+#include "nwk_ping.h"\r
+#include "nwk_globals.h"\r
+#include "nwk_api.h"\r
+#include "nwk_freq.h"\r
+#include "nwk_security.h"\r
+\r
+/******************************************************************************\r
+ * MACROS\r
+ */\r
+\r
+/******************************************************************************\r
+ * CONSTANTS AND DEFINES\r
+ */\r
+\r
+/******************************************************************************\r
+ * TYPEDEFS\r
+ */\r
+\r
+/******************************************************************************\r
+ * LOCAL VARIABLES\r
+ */\r
+\r
+static volatile uint8_t sTid = 0;\r
+\r
+/******************************************************************************\r
+ * LOCAL FUNCTIONS\r
+ */\r
+static void smpl_send_ping_reply(mrfiPacket_t *);\r
+static void handlePingRequest(mrfiPacket_t *);\r
+\r
+/******************************************************************************\r
+ * GLOBAL VARIABLES\r
+ */\r
+\r
+/******************************************************************************\r
+ * GLOBAL FUNCTIONS\r
+ */\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_pingInit\r
+ *\r
+ * @brief       Initialize Ping application.\r
+ *\r
+ * input parameters\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   void\r
+ */\r
+void nwk_pingInit(void)\r
+{\r
+  sTid = MRFI_RandomByte();\r
+\r
+  return;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_ping\r
+ *\r
+ * @brief       Called from the application level to ping a peer. A small\r
+ *              payload is sent that includes a tid to detect correct reply.\r
+ *              Caller does not supply payload.\r
+ *\r
+ * input parameters\r
+ * @param   lid     - Link ID representing peer to ping\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   SMPL_SUCCESS   valid reply received\r
+ *           SMPL_TIMEOUT   no valid reply received\r
+ *           SMPL_NO_CHANNEL  no channels returned on a scan\r
+ */\r
+smplStatus_t nwk_ping(linkID_t lid)\r
+{\r
+  connInfo_t  *pCInfo   = nwk_getConnInfo(lid);\r
+  smplStatus_t rc       = SMPL_BAD_PARAM;\r
+  uint8_t      done     = 0;\r
+  uint8_t      repeatIt = 2;\r
+  uint8_t      msg[MAX_PING_APP_FRAME];\r
+  uint8_t      radioState = MRFI_GetRadioState();\r
+  union\r
+  {\r
+    ioctlRawSend_t    send;\r
+    ioctlRawReceive_t recv;\r
+  } ioctl_info;\r
+\r
+  if (!pCInfo || (SMPL_LINKID_USER_UUD == lid))\r
+  {\r
+    /* either link ID bogus or tried to ping the unconnected user datagram link ID. */\r
+    return rc;\r
+  }\r
+\r
+  do\r
+  {\r
+#if defined(FREQUENCY_AGILITY) && !defined(ACCESS_POINT)\r
+    uint8_t     i, numChan;\r
+    freqEntry_t channels[NWK_FREQ_TBL_SIZE];\r
+\r
+    if (repeatIt == 2)\r
+    {\r
+      /* If FA enabled, first time through set up so that the 'for'\r
+       * loop checks the current channel. This saves time (no scan)\r
+       * and is very likely to succeed. Populate the proper strucure.\r
+       */\r
+      SMPL_Ioctl(IOCTL_OBJ_FREQ, IOCTL_ACT_GET, channels);\r
+      numChan = 1;\r
+    }\r
+    else\r
+    {\r
+      /* If we get here we must scan for the channel we're now on */\r
+      if (!(numChan=nwk_scanForChannels(channels)))\r
+      {\r
+        return SMPL_NO_CHANNEL;\r
+      }\r
+    }\r
+    /* Either we scan next time through or we're done */\r
+    repeatIt--;\r
+\r
+    /* this loop Pings on each channel (probably only 1) looking\r
+     * for peer.\r
+     */\r
+    for (i=0; i<numChan && !done; ++i)\r
+    {\r
+      nwk_setChannel(&channels[i]);\r
+#else\r
+    {\r
+      repeatIt = 0;\r
+#endif  /* defined(FREQUENCY_AGILITY) && !defined(ACCESS_POINT) */\r
+\r
+      ioctl_info.send.addr = (addr_t *)pCInfo->peerAddr;\r
+      ioctl_info.send.msg  = msg;\r
+      ioctl_info.send.len  = sizeof(msg);\r
+      ioctl_info.send.port = SMPL_PORT_PING;\r
+\r
+      /* fill in msg */\r
+      msg[PB_REQ_OS] = PING_REQ_PING;\r
+      msg[PB_TID_OS] = sTid;\r
+\r
+      SMPL_Ioctl(IOCTL_OBJ_RAW_IO, IOCTL_ACT_WRITE, &ioctl_info.send);\r
+\r
+      ioctl_info.recv.port = SMPL_PORT_PING;\r
+      ioctl_info.recv.msg  = msg;\r
+      ioctl_info.recv.addr = 0;\r
+\r
+      NWK_CHECK_FOR_SETRX(radioState);\r
+      NWK_REPLY_DELAY();\r
+      NWK_CHECK_FOR_RESTORE_STATE(radioState);\r
+\r
+      if (SMPL_SUCCESS == SMPL_Ioctl(IOCTL_OBJ_RAW_IO, IOCTL_ACT_READ, &ioctl_info.recv))\r
+      {\r
+        repeatIt = 0;\r
+        done     = 1;\r
+        sTid++;   /* guard against duplicates */\r
+      }\r
+    }\r
+  } while (repeatIt);\r
+\r
+  return done ? SMPL_SUCCESS : SMPL_TIMEOUT;\r
+\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          smpl_send_ping_reply\r
+ *\r
+ * @brief       Send a reply to a ping request.\r
+ *\r
+ * input parameters\r
+ * @param   frame     - pointer to frame containing request\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   void\r
+ */\r
+static void smpl_send_ping_reply(mrfiPacket_t *frame)\r
+{\r
+  frameInfo_t *pOutFrame;\r
+\r
+  /* Build the reply frame. The application payload is the one included in the\r
+   * received frame payload.\r
+   */\r
+  if (pOutFrame = nwk_buildFrame(SMPL_PORT_PING, MRFI_P_PAYLOAD(frame)+F_APP_PAYLOAD_OS, MRFI_GET_PAYLOAD_LEN(frame)-F_APP_PAYLOAD_OS, MAX_HOPS))\r
+  {\r
+    /* destination address is the source adddress of the received frame. */\r
+    memcpy(MRFI_P_DST_ADDR(&pOutFrame->mrfiPkt), MRFI_P_SRC_ADDR(frame), NET_ADDR_SIZE);\r
+\r
+    /* turn on the reply bit in the application payload */\r
+    *(MRFI_P_PAYLOAD(&pOutFrame->mrfiPkt)+F_APP_PAYLOAD_OS+PB_REQ_OS) |= NWK_APP_REPLY_BIT;\r
+#ifdef SMPL_SECURE\r
+    nwk_setSecureFrame(&pOutFrame->mrfiPkt, MRFI_GET_PAYLOAD_LEN(frame)-F_APP_PAYLOAD_OS, 0);\r
+#endif  /* SMPL_SECURE */\r
+    nwk_sendFrame(pOutFrame, MRFI_TX_TYPE_FORCED);\r
+  }\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_processPing\r
+ *\r
+ * @brief       Ping network application frame handler.\r
+ *\r
+ * input parameters\r
+ * @param   frame   - pointer to frame in question\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return    Keep frame for application, release frame, or replay frame.\r
+ */\r
+fhStatus_t nwk_processPing(mrfiPacket_t *frame)\r
+{\r
+  fhStatus_t   rc;\r
+  uint8_t      replyType;\r
+\r
+  /* If we sent this then this is the reply. Validate the\r
+   * packet for reception by client app. If we didn't send\r
+   * it then we are the target. Send the reply.\r
+   */\r
+  replyType = nwk_isValidReply(frame, sTid, PB_REQ_OS, PB_TID_OS);\r
+  if (SMPL_MY_REPLY == replyType)\r
+  {\r
+    /* It's a match and it's a reply. Validate the received packet by\r
+     * returning a 1 so it can be received by the client app.\r
+     */\r
+    MRFI_PostKillSem();\r
+    rc = FHS_KEEP;\r
+  }\r
+#if !defined( END_DEVICE )\r
+  else if (SMPL_A_REPLY == replyType)\r
+  {\r
+    /* no match. If I'm not an ED this is a reply that should be passed on. */\r
+    rc = FHS_REPLAY;\r
+  }\r
+#endif  /* !END_DEVICE */\r
+  else\r
+  {\r
+    /* No, we didn't send it. Send reply assuming it's a Ping intended for us. */\r
+    handlePingRequest(frame);\r
+\r
+    rc = FHS_RELEASE;\r
+  }\r
+\r
+  return rc;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          handlePingRequest\r
+ *\r
+ * @brief       Dispatches handler for specfic Ping request\r
+ *\r
+ * input parameters\r
+ *\r
+ * @param   frame - Ping frame received\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return   void\r
+ */\r
+static void handlePingRequest(mrfiPacket_t *frame)\r
+{\r
+  switch (*(MRFI_P_PAYLOAD(frame)+F_APP_PAYLOAD_OS))\r
+  {\r
+    case PING_REQ_PING:\r
+      smpl_send_ping_reply(frame);\r
+      break;\r
+\r
+    default:\r
+      break;\r
+  }\r
+\r
+  return;\r
+}\r
diff --git a/chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/Components/nwk_applications/nwk_ping.h b/chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/Components/nwk_applications/nwk_ping.h
new file mode 100755 (executable)
index 0000000..c7dd3be
--- /dev/null
@@ -0,0 +1,58 @@
+/**************************************************************************************************\r
+  Filename:       nwk_ping.h\r
+  Revised:        $Date: 2008-05-14 14:22:31 -0700 (Wed, 14 May 2008) $\r
+  Revision:       $Revision: 17075 $\r
+  Author:         $Author: lfriedman $\r
+\r
+  Description:    This file supports the SimpliciTI Ping network application.\r
+\r
+  Copyright 2004-2007 Texas Instruments Incorporated. All rights reserved.\r
+\r
+  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+  the terms of a software license agreement between the user who downloaded the software,\r
+  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+  License. The License limits your use, and you acknowledge, that the Software may not be\r
+  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+  perform, display or sell this Software and/or its documentation for any purpose.\r
+\r
+  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+\r
+  Should you have any questions regarding your right to use this Software,\r
+  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+\r
+#ifndef NWK_PING_H\r
+#define NWK_PING_H\r
+\r
+/* change the following as protocol developed */\r
+#define MAX_PING_APP_FRAME    2\r
+\r
+/* application payload offsets */\r
+/*    both */\r
+#define PB_REQ_OS     0\r
+#define PB_TID_OS     1\r
+\r
+\r
+/* ping requests */\r
+#define PING_REQ_PING       1\r
+\r
+/* prototypes */\r
+fhStatus_t   nwk_processPing(mrfiPacket_t *);\r
+void         nwk_pingInit(void);\r
+smplStatus_t nwk_ping(linkID_t);\r
+\r
+\r
+#endif\r
diff --git a/chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/Components/nwk_applications/nwk_security.c b/chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/Components/nwk_applications/nwk_security.c
new file mode 100755 (executable)
index 0000000..5ee4acc
--- /dev/null
@@ -0,0 +1,549 @@
+/**************************************************************************************************\r
+  Filename:       nwk_security.c\r
+  Revised:        $Date: 2009-01-20 14:05:46 -0800 (Tue, 20 Jan 2009) $\r
+  Revision:       $Revision: 18816 $\r
+  Author:         $Author: lfriedman $\r
+\r
+  Description:    This file supports the SimpliciTI Security network application.\r
+\r
+  Copyright 2008-2009 Texas Instruments Incorporated. All rights reserved.\r
+\r
+  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+  the terms of a software license agreement between the user who downloaded the software,\r
+  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+  License. The License limits your use, and you acknowledge, that the Software may not be\r
+  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+  perform, display or sell this Software and/or its documentation for any purpose.\r
+\r
+  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+\r
+  Should you have any questions regarding your right to use this Software,\r
+  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+/******************************************************************************\r
+ * INCLUDES\r
+ */\r
+\r
+#include <string.h>     /* needed for NULL */\r
+#include "mrfi.h"\r
+#include "nwk_types.h"\r
+#include "nwk_security.h"\r
+#include "nwk_frame.h"\r
+#include "nwk.h"\r
+\r
+#ifdef SMPL_SECURE\r
+\r
+/*                   *** GENERAL SECURITY OUTLINE ***\r
+ *\r
+ * We are using XTEA (eXtended Tiny Encryption Algorithm) with a fixed\r
+ * number of rounds (32). We have removed the parameters from the API\r
+ * we harvested from the public domain.\r
+ *\r
+ * We are using a CTR-like mode. We use the 64-bit block cipher function of the\r
+ * XTEA code to encipher a concatenation of the 32-bit initialization vector and\r
+ * a 32-bit counter that increments each block. We encrypt using a fixed 128-bit\r
+ * key. The resulting 64-bit output is XOR'ed with the message. If the message is\r
+ * longer than 64 bits we encipher the next block (incrementing the counter) and\r
+ * continue until the message is exhausted. If the last cipher block is longer\r
+ * than the message we simply discard the remaining cipher block.\r
+ */\r
+\r
+\r
+/******************************************************************************\r
+ * MACROS\r
+ */\r
+\r
+/******************************************************************************\r
+ * CONSTANTS AND DEFINES\r
+ */\r
+\r
+/* The counter can be off by quite a bit because the number of cipher\r
+ * blocks can easily be more than 1 per frame. Value limited to a\r
+ * maximum of 255.\r
+ */\r
+#define CTR_WINDOW  255\r
+\r
+#if (CTR_WINDOW > 255) || (CTR_WINDOW < 0)\r
+#error ERROR: 0 <= CTR_WINDOW < 256\r
+#endif\r
+\r
+/* Number of rounds for XTEA algorithm. A parameter in the public domain code\r
+ * but we fix it here at 32.\r
+ */\r
+#define NUM_ROUNDS  32\r
+\r
+/* Key and cipher block size constants */\r
+#define SMPL_KEYSIZE_BYTES    16\r
+#define SMPL_KEYSIZE_LONGS     4\r
+\r
+/******************************************************************************\r
+ * TYPEDEFS\r
+ */\r
+/* Union used to access key as both a string and as unsigned longs */\r
+typedef union\r
+{\r
+  uint8_t  keyS[SMPL_KEYSIZE_BYTES];\r
+  uint32_t keyL[SMPL_KEYSIZE_LONGS];\r
+} key_t;\r
+\r
+\r
+/******************************************************************************\r
+ * LOCAL VARIABLES\r
+ */\r
+/* 32-bit Initialization vector */\r
+static uint32_t const sIV = 0x87654321;\r
+\r
+/* 128-bit (16 byte) key. Initialized as string but fetched and used in XTEA\r
+ * encryption as 4 unsigned longs. Endianess could count if the peers are on\r
+ * two different MCUs. Endianess is rectified in initialization code.\r
+ *\r
+ * Initialization _MUST_ be done as a string (or character array). Though it\r
+ * won't matter how the initialization is done if both peers are the same\r
+ * endianness, good prectice will initialize these as a string (or character\r
+ * array) so that the endianess reconciliation works properly for all cases.\r
+ */\r
+static key_t sKey = {"SimpliciTI's Key"};\r
+\r
+/* Constant set as an authentication code. Note that since it is a\r
+ * fixed value as opposed to a hash of the message it does not provide\r
+ * an integrity check. It will only differentiate two message encryptions\r
+ * with the same LSB but different MSB components. Thus it helps guard\r
+ * against replays.\r
+ */\r
+static secMAC_t const sMAC = 0xA5;\r
+\r
+/* This is the 64-bit cipher block target. It is this 64-bit block that\r
+ * is XOR'ed with the actual message to be encrypted.\r
+ */\r
+static uint32_t sMsg[2] = {0, 0};\r
+\r
+/******************************************************************************\r
+ * LOCAL FUNCTIONS\r
+ */\r
+static secFCS_t calcFCS(uint8_t *, uint8_t);\r
+static void     msg_encipher(uint8_t *, uint8_t, uint32_t *);\r
+static void     msg_decipher(uint8_t *, uint8_t, uint32_t *);\r
+static void     xtea_encipher(void);\r
+\r
+#endif  /* SMPL_SECURE */\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_securityInit\r
+ *\r
+ * @brief       Initialize Security network application.\r
+ *\r
+ * input parameters\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return      void\r
+ */\r
+void nwk_securityInit(void)\r
+{\r
+#ifdef SMPL_SECURE\r
+  uint8_t  i;\r
+\r
+  /* The key is set as a string. But the XTEA routines operate on 32-bit\r
+   * unsigned longs. Endianess should be taken into account and we do that\r
+   * here by treating the key as being an array of unsigned longs in\r
+   * network order.\r
+   */\r
+  for (i=0; i<sizeof(sKey.keyL)/sizeof(uint32_t); ++i)\r
+  {\r
+    sKey.keyL[i] = ntohl(sKey.keyL[i]);\r
+  }\r
+\r
+#endif  /* SMPL_SECURE */\r
+  return;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_processSecurity\r
+ *\r
+ * @brief       Security network application frame handler.\r
+ *\r
+ * input parameters\r
+ * @param   frame   - pointer to frame in question\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return    Keep frame for application, release frame, or replay frame.\r
+ */\r
+fhStatus_t nwk_processSecurity(mrfiPacket_t *frame)\r
+{\r
+  return FHS_RELEASE;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          msg_encipher\r
+ *\r
+ * @brief       Encipher a message using the XTEA algorithm and the modified\r
+ *              CTR mode method.\r
+ *\r
+ * input parameters\r
+ * @param   msg      - pointer to message to encipher\r
+ * @param   len      - length of message\r
+ * @param   cntStart - pointer to the counter used in the cipher block.\r
+ *\r
+ * output parameters\r
+ * @param   cntStart - counter is updated during encryption.\r
+ *\r
+ * @return      void\r
+ */\r
+#ifdef SMPL_SECURE\r
+static void msg_encipher(uint8_t *msg, uint8_t len, uint32_t *cntStart)\r
+{\r
+  uint8_t  i, idx, done;\r
+  uint8_t *mptr = (uint8_t *)&sMsg[0];\r
+  uint32_t ctr;\r
+\r
+  if ((NULL == msg) || !len)\r
+  {\r
+    return;\r
+  }\r
+\r
+  /* set local counter from input */\r
+  ctr = *cntStart;\r
+\r
+  idx  = 0;\r
+  done = 0;\r
+  do\r
+  {\r
+    /* Set block to be enciphered. 1st 32 bits are the IV. The second\r
+     * 32 bits are the current CTR value.\r
+     */\r
+    sMsg[0] = sIV;\r
+    sMsg[1] = ctr;\r
+    /* encrypt */\r
+    xtea_encipher();\r
+    /* increment counter for next time. */\r
+    ctr++;\r
+    /* XOR ciphered block with message to be sent. Only operate\r
+     * up to and including the last message byte which may not\r
+     * be on a cipher block boundary (64 bits == 8 bytes).\r
+     */\r
+    for (i=0; i<sizeof(sMsg) && idx<len; ++i, ++idx)\r
+    {\r
+      msg[idx] ^= mptr[i];\r
+    }\r
+\r
+    if (idx >= len)\r
+    {\r
+      /* we're done */\r
+      done = 1;\r
+    }\r
+  } while (!done);\r
+\r
+  /* return counter value start for next time */\r
+  *cntStart = ctr;\r
+\r
+  return;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          msg_decipher\r
+ *\r
+ * @brief       Decipher a message using the XTEA algorithm and the modified\r
+ *              CTR mode method.\r
+ *\r
+ * input parameters\r
+ * @param   msg      - pointer to message to decipher\r
+ * @param   len      - length of message\r
+ * @param   cntStart - pointer to the counter used in the cipher block.\r
+ *\r
+ * output parameters\r
+ * @param   cntStart - counter is updated during decryption.\r
+ *\r
+ * @return      void\r
+ */\r
+static void msg_decipher(uint8_t *msg, uint8_t len, uint32_t *cntStart)\r
+{\r
+  msg_encipher(msg, len, cntStart);\r
+\r
+  return;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          xtea_encipher\r
+ *\r
+ * @brief       XTEA encipher algorithm. Calling arguments removed from public\r
+ *              domain code and static-scope values used instead.\r
+ *\r
+ * input parameters\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return      void\r
+ */\r
+void xtea_encipher(void)\r
+{\r
+  uint32_t v0=sMsg[0], v1=sMsg[1];\r
+  uint16_t i;\r
+  uint32_t sum=0, delta=0x9E3779B9;\r
+\r
+  for(i=0; i<NUM_ROUNDS; i++)\r
+  {\r
+    v0  += (((v1 << 4) ^ (v1 >> 5)) + v1) ^ (sum + sKey.keyL[sum & 3]);\r
+    sum += delta;\r
+    v1  += (((v0 << 4) ^ (v0 >> 5)) + v0) ^ (sum + sKey.keyL[(sum>>11) & 3]);\r
+  }\r
+\r
+  sMsg[0]=v0;\r
+  sMsg[1]=v1;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_setSecureFrame\r
+ *\r
+ * @brief       Called from NWK to secure a frame.\r
+ *\r
+ * input parameters\r
+ * @param   frame   - pointer to frame to secure\r
+ * @param   msglen  - length of message\r
+ * @param   ctr     - pointer to the counter used in the cipher block. This will\r
+ *                    be NULL if a network application is sending a frame. Since\r
+ *                    these are not connection-based there is no counter sync\r
+ *                    issue but we still need a counter value. A random value\r
+ *                    is used.\r
+ *\r
+ * output parameters\r
+ * @param   cntStart - counter is updated during encryption.\r
+ *\r
+ * @return      void\r
+ */\r
+void nwk_setSecureFrame(mrfiPacket_t *frame, uint8_t msglen, uint32_t *ctr)\r
+{\r
+  uint32_t locCnt;\r
+\r
+  /* If an encrypted frame is to be sent to a non-connection based port use a\r
+   * random number as the lsb counter value. In this case only the lsb is used\r
+   * for a counter value during decryption. Not as secure but there are still\r
+   * the 32 bits in the IV.\r
+   */\r
+  locCnt = ctr ? *ctr : MRFI_RandomByte();\r
+\r
+  /* place counter value into frame */\r
+  PUT_INTO_FRAME(MRFI_P_PAYLOAD(frame), F_SEC_CTR_OS, (uint8_t)(locCnt & 0xFF));\r
+\r
+  /* Put MAC value in */\r
+  nwk_putNumObjectIntoMsg((void *)&sMAC, (void *)(MRFI_P_PAYLOAD(frame)+F_SEC_MAC_OS), sizeof(secMAC_t));\r
+\r
+  /* Put FCS value in */\r
+  {\r
+    secFCS_t fcs = calcFCS(MRFI_P_PAYLOAD(frame)+F_SEC_MAC_OS, msglen+sizeof(secMAC_t));\r
+\r
+    nwk_putNumObjectIntoMsg((void *)&fcs, (void *)(MRFI_P_PAYLOAD(frame)+F_SEC_ICHK_OS), sizeof(secFCS_t));\r
+  }\r
+\r
+  /* Encrypt frame */\r
+  msg_encipher(MRFI_P_PAYLOAD(frame)+F_SEC_ICHK_OS, msglen+sizeof(secMAC_t)+sizeof(secFCS_t), &locCnt);\r
+\r
+  /* Set the Encryption bit */\r
+  PUT_INTO_FRAME(MRFI_P_PAYLOAD(frame), F_ENCRYPT_OS, F_ENCRYPT_OS_MSK);\r
+\r
+  /* Update the counter if it was a "real" counter. */\r
+  if (ctr)\r
+  {\r
+    *ctr = locCnt;\r
+  }\r
+\r
+  return;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          calcFCS\r
+ *\r
+ * @brief       Calculate the frame check sequence. Currently it's just a\r
+ *              cumulative XOR of each byte starting with the MAC byte. The\r
+ *              FCS is placed in front of the MAC after the counter hint and is\r
+ *              included in the encryption.\r
+ *\r
+ * input parameters\r
+ * @param   msg      - pointer to message\r
+ * @param   len      - length of message\r
+ *\r
+ * output parameters\r
+ *\r
+ * @return      Returns the FCS using the typedef.\r
+ */\r
+static secFCS_t calcFCS(uint8_t *msg, uint8_t len)\r
+{\r
+  uint8_t  i;\r
+  secFCS_t result = 0;\r
+\r
+  for (i=0; i<len; ++i)\r
+  {\r
+    result ^= *(msg+i);\r
+  }\r
+\r
+  return result;\r
+}\r
+\r
+/******************************************************************************\r
+ * @fn          nwk_getSecureFrame\r
+ *\r
+ * @brief       Called from NWK to get a secure a frame and decrypt.\r
+ *\r
+ * input parameters\r
+ * @param   frame    - pointer to frame containing encrypted message\r
+ * @param   msglen   - length of message\r
+ * @param   ctr      - pointer to the counter used in the cipher block. This will\r
+ *                     be NULL if a network applicaiton is getting a frame. Since\r
+ *                     these are not connection-nbased there is no counter sync\r
+ *                     issue but we still need a counter value.\r
+ *\r
+ * output parameters\r
+ * @param   cntStart - counter is updated during decryption. If decryption fails\r
+ *                     this value is not changed.\r
+ *\r
+ * @return      Returns non-zero if frame decryption is valid, otherwise returns 0.\r
+ */\r
+uint8_t nwk_getSecureFrame(mrfiPacket_t *frame, uint8_t msglen, uint32_t *ctr)\r
+{\r
+  uint8_t  rc = 1;\r
+  uint8_t  done = 0;\r
+  uint8_t  cntHint = GET_FROM_FRAME(MRFI_P_PAYLOAD(frame), F_SEC_CTR_OS);\r
+  uint32_t locCnt, frameCnt;\r
+\r
+  /* Construct proposed CTR values */\r
+\r
+  /* Just like encryption, we may be talking to a non-connection based\r
+   * peer in which case the counter value is represented by the lsb byte\r
+   * conveyed in the frame.\r
+   */\r
+  locCnt = ctr ? *ctr : cntHint;\r
+\r
+  frameCnt = (locCnt & 0xFFFFFF00) + cntHint;\r
+\r
+  do\r
+  {\r
+    /* See if counters match */\r
+    if (locCnt == frameCnt)\r
+    {\r
+      /* When the counters appear to match is the only time we actually decipher\r
+       * the message. It is the only time we can do so since out-of-sync lsb counter\r
+       * values guarantees that something is wrong somewhere. Decryption is successful\r
+       * only if the MAC and FCS values match. The message is left as-is after the\r
+       * decipher attempt. Either it appears valid or is doesn't and is discarded.\r
+       * There is no recovery attempt if the counters match but the MAC or FCS do\r
+       * not. It is considered a rogue message.\r
+       */\r
+      msg_decipher(MRFI_P_PAYLOAD(frame)+F_SEC_ICHK_OS, msglen-1, &locCnt);\r
+\r
+      /* Get MAC and make sure it matches. A failure can occur if a replayed frame happens\r
+       * to have the correct counter sync value but was encoded with the wrong complete\r
+       * counter value. Otherwise the MAC values must match when the counter values are equal.\r
+       */\r
+      {\r
+        secMAC_t mac;\r
+\r
+        nwk_getNumObjectFromMsg((void *)(MRFI_P_PAYLOAD(frame)+F_SEC_MAC_OS), (void *)&mac, sizeof(secMAC_t));\r
+        if (mac != sMAC)\r
+        {\r
+          rc = 0;\r
+        }\r
+      }\r
+\r
+      /* FCS check... */\r
+      {\r
+        secFCS_t fcs;\r
+\r
+        nwk_getNumObjectFromMsg((void *)(MRFI_P_PAYLOAD(frame)+F_SEC_ICHK_OS), (void *)&fcs, sizeof(secFCS_t));\r
+        if (fcs != calcFCS(MRFI_P_PAYLOAD(frame)+F_SEC_MAC_OS, msglen-1-sizeof(secMAC_t)))\r
+        {\r
+          rc = 0;\r
+        }\r
+      }\r
+\r
+      /* we're done. */\r
+      done = 1;\r
+    }\r
+    else\r
+    {\r
+      /* Uh oh. Counters don't match. Try and resync. We need to distinguish among\r
+       * missed frames, duplicates and rogues plus account for counter wrap.\r
+       */\r
+      if (frameCnt > locCnt)\r
+      {\r
+        /* frameCnt is bigger. Second part of test below takes care of\r
+         * the unlikely case of a complete counter wrap (msb's all 0) in\r
+         * which case the test will incorrectly fail when the count is\r
+         * actually within the (wrapped) window. #ifdef'ed to avoid compiler\r
+         * warning in case user sets CNT_WINDOW to 0 (pointless comparison of\r
+         * unsigned value).\r
+         */\r
+        if (((frameCnt-CTR_WINDOW) <= locCnt)\r
+#if CTR_WINDOW > 0\r
+            || (frameCnt < CTR_WINDOW)\r
+#endif\r
+           )\r
+        {\r
+          /* Value within window. We probably missed something. Adjust and decipher.\r
+           * If locCnt is less because it wrapped and frameCnt didn't it means that\r
+           * it's a duplicate or late frame. In that case the following will lead to\r
+           * a decryption that fails sanity checks which is OK because the frame will\r
+           * be correctly rejected.\r
+           */\r
+          locCnt = frameCnt;\r
+        }\r
+        else\r
+        {\r
+          /* It's either a rogue or a really old duplicate packet. In either case\r
+           * we dismiss the frame.\r
+           */\r
+          rc   = 0;\r
+          done = 1;\r
+        }\r
+      }\r
+      else\r
+      {\r
+        /* locCnt is bigger. The only way the frame can be valid is if the\r
+         * counter wrapped causing frameCnt to appear to be smaller. Wrap the\r
+         * counter and decrypt. If the frame isn't valid, i.e., it's late,\r
+         * a duplicate, or a rogue, the decryption will fail sanity checks and\r
+         * the frame will be correctly rejected. The following arithmetic works\r
+         * correctly without a special test for the complete counter wrap case.\r
+         */\r
+        frameCnt += 0x100;   /* wrap the hint-based counter */\r
+        if (((frameCnt-CTR_WINDOW) <= locCnt))\r
+        {\r
+          /* An lsb wrap but still within window. We probably missed something.\r
+           * Adjust (with wrap) and decrypt.\r
+           */\r
+          locCnt = frameCnt;\r
+        }\r
+        else\r
+        {\r
+          /* rogue frame */\r
+          rc   = 0;\r
+          done = 1;\r
+        }\r
+      }\r
+    }\r
+  } while (!done);\r
+\r
+  if (ctr && rc)\r
+  {\r
+    /* Only update the counter if the count was a "real" one and the\r
+     * decryption succeeded.\r
+     */\r
+    *ctr = locCnt;\r
+  }\r
+\r
+  return rc;\r
+}\r
+\r
+#endif  /* SMPL_SECURE */\r
diff --git a/chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/Components/nwk_applications/nwk_security.h b/chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/Components/nwk_applications/nwk_security.h
new file mode 100755 (executable)
index 0000000..212ce8f
--- /dev/null
@@ -0,0 +1,48 @@
+/**************************************************************************************************\r
+  Filename:       nwk_security.h\r
+  Revised:        $Date: 2009-01-09 15:02:17 -0800 (Fri, 09 Jan 2009) $\r
+  Revision:       $Revision: 18728 $\r
+  Author:         $Author: lfriedman $\r
+\r
+  Description:    This file supports the SimpliciTI Security network application.\r
+\r
+  Copyright 2004-2007 Texas Instruments Incorporated. All rights reserved.\r
+\r
+  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+  the terms of a software license agreement between the user who downloaded the software,\r
+  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+  License. The License limits your use, and you acknowledge, that the Software may not be\r
+  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+  perform, display or sell this Software and/or its documentation for any purpose.\r
+\r
+  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+\r
+  Should you have any questions regarding your right to use this Software,\r
+  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+\r
+#ifndef NWK_SECURITY_H\r
+#define NWK_SECURITY_H\r
+\r
+/* change the following as Security application is developed */\r
+#define MAX_SEC_APP_FRAME    0\r
+\r
+/* prototypes  */\r
+void       nwk_securityInit(void);\r
+fhStatus_t nwk_processSecurity(mrfiPacket_t *);\r
+void       nwk_setSecureFrame(mrfiPacket_t *, uint8_t, uint32_t *);\r
+uint8_t    nwk_getSecureFrame(mrfiPacket_t *, uint8_t, uint32_t *);\r
+#endif\r
diff --git a/chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/Configuration/Access Point/smpl_config.dat b/chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/Configuration/Access Point/smpl_config.dat
new file mode 100755 (executable)
index 0000000..46375bd
--- /dev/null
@@ -0,0 +1,93 @@
+/**************************************************************************************************\r
+  Filename:       smpl_config.dat\r
+  Revised:        $Date: 2007-11-28 13:46:49 -0800 (Wed, 28 Nov 2007) $\r
+  Revision:       $Revision: 15977 $\r
+  Author:         $Author: lfriedman $\r
+\r
+  Description:    This file supports the SimpliciTI Customer Configuration for Access Points.\r
+\r
+  Copyright 2004-2007 Texas Instruments Incorporated. All rights reserved.\r
+\r
+  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+  the terms of a software license agreement between the user who downloaded the software,\r
+  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+  License. The License limits your use, and you acknowledge, that the Software may not be\r
+  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+  perform, display or sell this Software and/or its documentation for any purpose.\r
+\r
+  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+\r
+  Should you have any questions regarding your right to use this Software,\r
+  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+\r
+/* Number of connections supported. Each connection supports bi-directional\r
+ * communication.  Access Points and Range Extenders can set this to 0 if they\r
+ * do not host End Device objects.\r
+ */\r
+/*-DNUM_CONNECTIONS=8*/\r
+/* [BM] RF access point is limited to 1 end device */\r
+-DNUM_CONNECTIONS=1\r
+\r
+/*  ***  Size of low level queues for sent and received frames. Affects RAM usage  ***  */\r
+\r
+/* AP needs larger input frame queue if it is supporting store-and-forward\r
+ * clients because the forwarded messages are held here.\r
+ */\r
+-DSIZE_INFRAME_Q=6\r
+\r
+/* The output frame queue can be small since Tx is done synchronously. Actually\r
+ * 1 is probably enough. If an Access Point device is also hosting an End Device \r
+ * that sends to a sleeping peer the output queue should be larger -- the waiting \r
+ * frames in this case are held here. In that case the output frame queue should \r
+ * be bigger. \r
+ */\r
+-DSIZE_OUTFRAME_Q=2\r
+\r
+/* This device's address. The first byte is used as a filter on the CC1100/CC2500\r
+ * radios so THE FIRST BYTE MUST NOT BE either 0x00 or 0xFF. Also, for these radios\r
+ * on End Devices the first byte should be the least significant byte so the filtering\r
+ * is maximally effective. Otherwise the frame has to be processed by the MCU before it\r
+ * is recognized as not intended for the device. APs and REs run in promiscuous mode so\r
+ * the filtering is not done. This macro intializes a static const array of unsigned\r
+ * characters of length NET_ADDR_SIZE (found in nwk_types.h). The quotes (") are\r
+ * necessary below unless the spaces are removed.\r
+ */\r
+/*-DTHIS_DEVICE_ADDRESS="{0x78, 0x56, 0x34, 0x12}"*/\r
+/* [BM] Use a slightly different device address */\r
+-DTHIS_DEVICE_ADDRESS="{0x78, 0x56, 0x34, 0x10}"\r
+\r
+/* device type */\r
+-DACCESS_POINT\r
+\r
+/* In the spcial case in which the AP is a data hub, the AP will automaically\r
+ * listen for a link each time a new device joins the network. This is a special\r
+ * case scenario in which all End Device peers are the AP and every ED links\r
+ * to the AP. In this scenario the ED must automatically try and link after the\r
+ * Join reply.\r
+ */\r
+-DAP_IS_DATA_HUB\r
+\r
+/* Store and forward support: number of clients */\r
+/*-DNUM_STORE_AND_FWD_CLIENTS=3*/\r
+/* [BM] Support just 1 client */\r
+-DNUM_STORE_AND_FWD_CLIENTS=3\r
+\r
+-DSTARTUP_JOINCONTEXT_ON\r
+\r
+\r
+\r
+\r
diff --git a/chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/Configuration/smpl_nwk_config.dat b/chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/Configuration/smpl_nwk_config.dat
new file mode 100755 (executable)
index 0000000..9f64bc1
--- /dev/null
@@ -0,0 +1,79 @@
+/**************************************************************************************************\r
+  Filename:       smpl_nwk_config.dat\r
+  Revised:        $Date: 2009-02-07 14:21:07 -0700 (Sat, 07 Feb 2009) $\r
+  Revision:       $Revision: 19010 $\r
+  Author:         $Author: lfriedman $\r
+\r
+  Description:    This file supports the SimpliciTI Customer Configuration for overall network.\r
+\r
+  Copyright 2007-2009 Texas Instruments Incorporated. All rights reserved.\r
+\r
+  IMPORTANT: Your use of this Software is limited to those specific rights granted under\r
+  the terms of a software license agreement between the user who downloaded the software,\r
+  his/her employer (which must be your employer) and Texas Instruments Incorporated (the\r
+  "License"). You may not use this Software unless you agree to abide by the terms of the\r
+  License. The License limits your use, and you acknowledge, that the Software may not be\r
+  modified, copied or distributed unless embedded on a Texas Instruments microcontroller\r
+  or used solely and exclusively in conjunction with a Texas Instruments radio frequency\r
+  transceiver, which is integrated into your product. Other than for the foregoing purpose,\r
+  you may not use, reproduce, copy, prepare derivative works of, modify, distribute,\r
+  perform, display or sell this Software and/or its documentation for any purpose.\r
+\r
+  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED \93AS IS\94\r
+  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY\r
+  WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.\r
+  IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE\r
+  THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY\r
+  INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST\r
+  DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY\r
+  THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+\r
+  Should you have any questions regarding your right to use this Software,\r
+  contact Texas Instruments Incorporated at www.TI.com.\r
+**************************************************************************************************/\r
+\r
+\r
+/* max hop count */\r
+-DMAX_HOPS=3\r
+\r
+/* max hops away from and AP. Keeps hop count and therefore replay\r
+ * storms down for sending to and from polling End Devices. Also used\r
+ * when joining since the EDs can't be more than 1 hop away.\r
+ */\r
+-DMAX_HOPS_FROM_AP=1\r
+\r
+/* Maximum size of Network application payload. Do not change unless\r
+ * protocol changes are reflected in different maximum network\r
+ * application payload size.\r
+ */\r
+-DMAX_NWK_PAYLOAD=9\r
+\r
+/* Maximum size of application payload */\r
+/*-DMAX_APP_PAYLOAD=10*/\r
+/* [BM] Increase max payload size for sync application */\r
+-DMAX_APP_PAYLOAD=19\r
+\r
+/* default Link token */\r
+-DDEFAULT_LINK_TOKEN=0x01020304\r
+\r
+/* default Join token */\r
+-DDEFAULT_JOIN_TOKEN=0x05060708\r
+\r
+/* define Frequency Agility as active for this build */\r
+/*-DFREQUENCY_AGILITY*/\r
+\r
+/* Remove 'x' corruption to enable application autoacknowledge support. Requires extended API as well */\r
+-DAPP_AUTO_ACK\r
+\r
+/* Remove 'x' corruption to enable Extended API */\r
+-DEXTENDED_API\r
+\r
+/* Remove 'x' corruption to enable security. */\r
+-DxSMPL_SECURE\r
+\r
+/* Remove 'x' corruption to enable NV object support. */\r
+-DxNVOBJECT_SUPPORT\r
+\r
+/* Remove 'x' corruption to enable software timer. */\r
+-DxSW_TIMER\r
diff --git a/chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/simpliciti.h b/chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/simpliciti.h
new file mode 100755 (executable)
index 0000000..25c1e6b
--- /dev/null
@@ -0,0 +1,92 @@
+// *************************************************************************************************\r
+//\r
+//     Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/ \r
+//      \r
+//      \r
+//       Redistribution and use in source and binary forms, with or without \r
+//       modification, are permitted provided that the following conditions \r
+//       are met:\r
+//     \r
+//         Redistributions of source code must retain the above copyright \r
+//         notice, this list of conditions and the following disclaimer.\r
+//      \r
+//         Redistributions in binary form must reproduce the above copyright\r
+//         notice, this list of conditions and the following disclaimer in the \r
+//         documentation and/or other materials provided with the   \r
+//         distribution.\r
+//      \r
+//         Neither the name of Texas Instruments Incorporated nor the names of\r
+//         its contributors may be used to endorse or promote products derived\r
+//         from this software without specific prior written permission.\r
+//     \r
+//       THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \r
+//       "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT \r
+//       LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//       A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT \r
+//       OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, \r
+//       SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT \r
+//       LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//       DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//       THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT \r
+//       (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE \r
+//       OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+// Generic defines and variables\r
+\r
+// Macros\r
+#define getFlag(val, flag)                         ((val&flag)==flag)\r
+#define setFlag(val, flag)                         (val|=flag)\r
+#define clearFlag(val, flag)                       (val&=(~flag))\r
+#define toggleFlag(val, flag)                      (val^=flag)\r
+\r
+// Entry point into SimpliciTI library\r
+extern void simpliciti_main(void);\r
+\r
+// Maximum data length\r
+#define SIMPLICITI_MAX_PAYLOAD_LENGTH              (32u)\r
+\r
+// Data to send / receive \r
+extern unsigned char simpliciti_data[SIMPLICITI_MAX_PAYLOAD_LENGTH];\r
+\r
+// 1 = send one or more reply packets, 0 = no need to reply\r
+extern unsigned char simpliciti_reply;\r
+\r
+// Radio frequency offset taken from calibration memory\r
+// Compensates crystal deviation from 26MHz nominal value\r
+extern unsigned char rf_frequoffset;\r
+\r
+// Flag for status information and external control through USB driver\r
+extern volatile unsigned char simpliciti_flag;\r
+#define SIMPLICITI_STATUS_LINKING                  (BIT0)      \r
+#define SIMPLICITI_STATUS_LINKED                   (BIT1)\r
+#define SIMPLICITI_STATUS_ERROR                            (BIT2)\r
+#define SIMPLICITI_TRIGGER_SEND_DATA               (BIT3)\r
+#define SIMPLICITI_TRIGGER_RECEIVED_DATA           (BIT4)\r
+#define SIMPLICITI_TRIGGER_STOP                            (BIT5)\r
+#define SIMPLICITI_TRIGGER_SEND_CMD                 (BIT6)\r
+\r
+\r
+// ---------------------------------------------------------------\r
+// SimpliciTI Sync\r
+\r
+// 1 = data in buffer, 0 = buffer empty\r
+extern unsigned char simpliciti_sync_buffer_status;\r
+\r
+#define BM_SYNC_DATA_LENGTH                         (19u)\r
+\r
+// Device data  (0)TYPE   (1) - (31) DATA \r
+#define SYNC_ED_TYPE_R2R                            (1u)\r
+#define SYNC_ED_TYPE_MEMORY                         (2u)\r
+#define SYNC_ED_TYPE_STATUS                         (3u)\r
+\r
+// Host data    (0)CMD    (1) - (31) DATA \r
+#define SYNC_AP_CMD_NOP                             (1u)\r
+#define SYNC_AP_CMD_GET_STATUS                     (2u)\r
+#define SYNC_AP_CMD_SET_WATCH                       (3u)\r
+#define SYNC_AP_CMD_GET_MEMORY_BLOCKS_MODE_1               (4u)\r
+#define SYNC_AP_CMD_GET_MEMORY_BLOCKS_MODE_2               (5u)\r
+#define SYNC_AP_CMD_ERASE_MEMORY                    (6u)\r
+#define SYNC_AP_CMD_EXIT                           (7u)\r
+\r
+\r
diff --git a/chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/simpliciti_readme.txt b/chronos-ti/Software Projects/RF Access Point/IAR/simpliciti/simpliciti_readme.txt
new file mode 100755 (executable)
index 0000000..f9f8b05
--- /dev/null
@@ -0,0 +1,36 @@
+Some notes about the SimpliciTI configuration used in this project\r
+\r
+- The source code is based on the SimpliciTI 1.1.1 release.\r
+\r
+- A full SimpliciTI installation contains configurations for many targets and device types. To avoid confusion,\r
+  only the configuration (Access Point) and target files (RFUSB) required for the eZ430-Chronos have been used.\r
+\r
+- All source code files have been copied into the project physically. Symbolic links have been replaced with\r
+  the real source code file. \r
+  \r
+- Due to the indirect inclusion scheme of hardware-dependent source code, some source code files have been\r
+  excluded from build. However, they will be included through higher level source code.  \r
+\r
+- Some modifications where required to the original source code. All these changes have been marked with [BM].\r
+\r
+       mrfi_f1f2.c             Changed channel assignment (mrfiLogicalChanTable) for three ISM bands\r
+                               Changed power output settings (mrfiRFPowerTable) for three ISM bands\r
+\r
+       mrfi_radio.c/MRFI_Init(void)    Added frequency offset correction to use calibrated frequency offset\r
+                                       when starting RF communication\r
+                                                                                       \r
+       mrfi_radio.c/MRFI_RfIsr(void)   Changed radio ISR to normal function, since we have a shared radio ISR\r
+\r
+       nwk_api.c                       Made variable sInit_done globally available to allow SimpliciTI to shutdown \r
+                                       and restart multiple times\r
+\r
+\r
+- If you (for whatever reason) want to upgrade to a newer version of SimpliciTI, please bear in mind that\r
+\r
+       a) the access point SimpliciTI version is 1.1.1 (and cannot be updated)\r
+\r
+       b) the workarounds used here to enable SimpliciTI to shutdown and restart multiple times might not necessarily\r
+          work when used with later revisions\r
+                  \r
+          \r
+       
\ No newline at end of file
diff --git a/chronos-ti/Software Projects/RF Access Point/IAR/timer1.c b/chronos-ti/Software Projects/RF Access Point/IAR/timer1.c
new file mode 100755 (executable)
index 0000000..399fca1
--- /dev/null
@@ -0,0 +1,202 @@
+// *************************************************************************************************\r
+//\r
+//     Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/ \r
+//      \r
+//      \r
+//       Redistribution and use in source and binary forms, with or without \r
+//       modification, are permitted provided that the following conditions \r
+//       are met:\r
+//     \r
+//         Redistributions of source code must retain the above copyright \r
+//         notice, this list of conditions and the following disclaimer.\r
+//      \r
+//         Redistributions in binary form must reproduce the above copyright\r
+//         notice, this list of conditions and the following disclaimer in the \r
+//         documentation and/or other materials provided with the   \r
+//         distribution.\r
+//      \r
+//         Neither the name of Texas Instruments Incorporated nor the names of\r
+//         its contributors may be used to endorse or promote products derived\r
+//         from this software without specific prior written permission.\r
+//     \r
+//       THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \r
+//       "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT \r
+//       LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//       A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT \r
+//       OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, \r
+//       SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT \r
+//       LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//       DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//       THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT \r
+//       (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE \r
+//       OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+// Timer1 driver\r
+// *************************************************************************************************\r
+\r
+\r
+// *************************************************************************************************\r
+// Include section\r
+#include "timer1.h"\r
+\r
+\r
+// *************************************************************************************************\r
+// Defines section\r
+#define ACLK_SPEED_HZ         32768u\r
+#define TCLK_SPEED_HZ         187500u\r
+#define ACLK_PER_FULL_CYCLE   11453u // (32768*65536/187500=11453,25) - round up for later correction\r
+\r
+\r
+// *************************************************************************************************\r
+// Global Variable section\r
+struct timer1 sTimer1;\r
+\r
+\r
+\r
+// *************************************************************************************************\r
+// Implementation\r
+\r
+void reset_timer1(void)\r
+{\r
+  sTimer1.enable = 0;\r
+  sTimer1.iflag = 0;\r
+  sTimer1.aclk = 0;\r
+  sTimer1.nb_full_cycles = 0;\r
+  sTimer1.last_cycle_count = 0;\r
+  sTimer1.usb_service_disable = 0;\r
+  sTimer1.cycles = 0;\r
+}\r
+\r
+\r
+\r
+u8 set_timer1_cycles(void)\r
+{\r
+  int t1cc0;\r
+  char repeat = 0;\r
+\r
+  if (sTimer1.nb_full_cycles > 0)\r
+  {\r
+    // Disable IM during timer set\r
+    T1CCTL0 &= ~BIT6;\r
+  \r
+    // Set compare value to 0xFFFF (wait 1 full cycle)\r
+    SET_WORD(T1CC0H, T1CC0L, 0xFFFF);\r
+    // Make sure compare value is written correctly\r
+    GET_WORD(T1CC0H, T1CC0L, t1cc0);\r
+    while (t1cc0 != 0xFFFF) \r
+    {\r
+      SET_WORD(T1CC0H, T1CC0L, 0xFFFF);\r
+      GET_WORD(T1CC0H, T1CC0L, t1cc0);\r
+      if (repeat++ > 10) break;\r
+    }\r
+    // Decrease full cycle count\r
+    sTimer1.nb_full_cycles--;\r
+    \r
+    // Clear Timer 1 Channel 0-2 + overflow interrupt flag\r
+    T1CTL &= ~0xF0;\r
+    // Enable IM after timer set\r
+    T1CCTL0 |= BIT6;\r
+  }\r
+  else if (sTimer1.last_cycle_count > 5) //1) // Skip last 5 TCLK (~ 1 ACLK) - too close for IRQ\r
+  {\r
+    // Disable IM during timer set\r
+    T1CCTL0 &= ~BIT6;\r
+\r
+    // Set compare value to last period lenght - 1\r
+    SET_WORD(T1CC0H, T1CC0L, sTimer1.last_cycle_count-1);\r
+    // Make sure compare value is written correctly\r
+    GET_WORD(T1CC0H, T1CC0L, t1cc0);\r
+    while (t1cc0 != sTimer1.last_cycle_count-1) \r
+    {\r
+      SET_WORD(T1CC0H, T1CC0L, sTimer1.last_cycle_count-1);\r
+      GET_WORD(T1CC0H, T1CC0L, t1cc0);\r
+      if (repeat++ > 10) break;\r
+    }\r
+    // Clear last cycle count - next IRQ calls s/w handler\r
+    sTimer1.last_cycle_count = 0;\r
+\r
+    // Suspend USB service via Timer4 until TX is over\r
+    sTimer1.usb_service_disable = 1;\r
+    \r
+    // Clear Timer 1 Channel 0-2 + overflow interrupt flag\r
+    T1CTL &= ~0xF0;\r
+    // Enable IM after timer set\r
+    T1CCTL0 |= BIT6;\r
+  }  \r
+  else return (0); // no cycles could be set\r
+  \r
+  return (1); // cycles successfully set\r
+  \r
+}\r
+\r
+\r
+// Set up Timer1 in compare mode to emulate 32kHz timer\r
+void set_timer1(u16 aclk)\r
+{\r
+  //u32 total_ticks;\r
+  \r
+  // Disable IM during timer set\r
+  T1CCTL0 &= ~BIT6;\r
+  \r
+  // Disable s/w timer int\r
+  sTimer1.enable = 0;\r
+  \r
+  // Calculate number of full cycles  \r
+  sTimer1.nb_full_cycles = 0;\r
+  while(aclk >= ACLK_PER_FULL_CYCLE)\r
+  {\r
+    aclk -= ACLK_PER_FULL_CYCLE;\r
+    sTimer1.nb_full_cycles++;\r
+  }\r
+\r
+  // remainder is last timer period\r
+  sTimer1.last_cycle_count = (aclk * TCLK_SPEED_HZ) / ACLK_SPEED_HZ;\r
+\r
+  // Set Timer1 registers\r
+  set_timer1_cycles();\r
+  \r
+  // Clear Timer 1 Channel 0-2 + overflow interrupt flag\r
+  T1CTL &= ~0xF0;\r
+  // Enable IM after timer set\r
+  T1CCTL0 |= BIT6;\r
+\r
+  // Enable s/w timer int\r
+  sTimer1.enable = 1;\r
+}\r
+\r
+\r
+void set_timer1_abs(u16 aclk)\r
+{\r
+  u16 timediff;\r
+  \r
+  // Calculate time distance between last compare time and next compare time\r
+  if (aclk > sTimer1.aclk) \r
+    timediff = aclk - sTimer1.aclk;\r
+  else if (aclk == sTimer1.aclk) \r
+    timediff = 0xFFFF;\r
+  else\r
+    timediff = (65536 - sTimer1.aclk) + aclk;\r
+\r
+  // Keep current value for next delta calculation  \r
+  sTimer1.aclk = aclk;\r
+\r
+  // Set timer1 relative to current time  \r
+  set_timer1(timediff);\r
+}\r
+\r
+\r
+void enable_timer1_irq(void)\r
+{\r
+  sTimer1.enable = 1;\r
+}\r
+\r
+void disable_timer1_irq(void)\r
+{\r
+  sTimer1.enable = 0;\r
+}\r
+\r
+void clear_timer1_irq(void)\r
+{\r
+  sTimer1.iflag = 0;\r
+}\r
diff --git a/chronos-ti/Software Projects/RF Access Point/IAR/timer1.h b/chronos-ti/Software Projects/RF Access Point/IAR/timer1.h
new file mode 100755 (executable)
index 0000000..2ad6bbd
--- /dev/null
@@ -0,0 +1,21 @@
+#include "project.h"\r
+\r
+extern void reset_timer1(void);\r
+extern u8 set_timer1_cycles(void);\r
+extern void set_timer1(u16 aclk);\r
+extern void set_timer1_abs(u16 aclk);\r
+extern void enable_timer1_irq(void);\r
+extern void disable_timer1_irq(void);\r
+extern void clear_timer1_irq(void);\r
+\r
+struct timer1\r
+{\r
+  u8            enable;\r
+  u8            iflag;\r
+  u16           aclk;\r
+  u8            nb_full_cycles;  // 0xFFFF\r
+  u16           last_cycle_count;  // 0x????\r
+  u8            usb_service_disable;\r
+  u8            cycles;\r
+};\r
+extern struct timer1 sTimer1;
\ No newline at end of file
diff --git a/chronos-ti/Software Projects/RF Access Point/IAR/usb/class_cdc/usb_cdc.h b/chronos-ti/Software Projects/RF Access Point/IAR/usb/class_cdc/usb_cdc.h
new file mode 100755 (executable)
index 0000000..e6dee54
--- /dev/null
@@ -0,0 +1,118 @@
+/***********************************************************************************\r
+\r
+    Filename:     usb_cdc.h\r
+\r
+    Description:  USB CDC definitions.\r
+\r
+***********************************************************************************/\r
+\r
+#ifndef USB_CDC_H\r
+#define USB_CDC_H\r
+\r
+/* Device Class Code */\r
+#define CDC_DEVICE                  0x02\r
+\r
+/* Communication Interface Class Code */\r
+#define COMM_INTF                   0x02\r
+\r
+/* Communication Interface Class SubClass Codes */\r
+#define ABSTRACT_CONTROL_MODEL      0x02\r
+\r
+/* Communication Interface Class Control Protocol Codes */\r
+#define V25TER                      0x01    // Common AT commands ("Hayes(TM)")\r
+\r
+\r
+/* Data Interface Class Codes */\r
+#define DATA_INTF                   0x0A\r
+\r
+/* Data Interface Class Protocol Codes */\r
+#define NO_PROTOCOL                 0x00    // No class specific protocol required\r
+\r
+\r
+/* Communication Feature Selector Codes */\r
+#define ABSTRACT_STATE              0x01\r
+#define COUNTRY_SETTING             0x02\r
+\r
+/* Functional Descriptors */\r
+/* Type Values for the bDescType Field */\r
+#define CS_INTERFACE                0x24\r
+#define CS_ENDPOINT                 0x25\r
+\r
+/* bDescSubType in Functional Descriptors */\r
+#define DSC_FN_HEADER               0x00\r
+#define DSC_FN_CALL_MGT             0x01\r
+#define DSC_FN_ACM                  0x02    // ACM - Abstract Control Management\r
+#define DSC_FN_DLM                  0x03    // DLM - Direct Line Managment\r
+#define DSC_FN_TELEPHONE_RINGER     0x04\r
+#define DSC_FN_RPT_CAPABILITIES     0x05\r
+#define DSC_FN_UNION                0x06\r
+#define DSC_FN_COUNTRY_SELECTION    0x07\r
+#define DSC_FN_TEL_OP_MODES         0x08\r
+#define DSC_FN_USB_TERMINAL         0x09\r
+/* more.... see Table 25 in USB CDC Specification 1.1 */\r
+\r
+\r
+#define CDC_COMM_INTF_ID            0x00\r
+#define CDC_DATA_INTF_ID            0x01\r
+\r
+\r
+\r
+// CLASS REQUESTS\r
+#define CDC_SEND_ENCAPSULATED_COMMAND      0x00\r
+#define CDC_GET_ENCAPSULATED_RESPONSE      0x01\r
+#define CDC_SET_COMM_FEATURE               0x02     //optional\r
+#define CDC_GET_COMM_FEATURE               0x03     //optional\r
+#define CDC_CLEAR_COMM_FEATURE             0x04     //optional\r
+#define CDC_SET_LINE_CODING                0x20     //optional\r
+#define CDC_GET_LINE_CODING                0x21     //optional\r
+#define CDC_SET_CONTROL_LINE_STATE         0x22     //optional\r
+#define CDC_SEND_BREAK                     0x23     //optional\r
+\r
+\r
+\r
+#define CDC_CHAR_FORMAT_1_STOP_BIT     0\r
+#define CDC_CHAR_FORMAT_1_5_STOP_BIT   1\r
+#define CDC_CHAR_FORMAT_2_STOP_BIT     2\r
+\r
+#define CDC_PARITY_TYPE_NONE           0\r
+#define CDC_PARITY_TYPE_ODD            1\r
+#define CDC_PARITY_TYPE_EVEN           2\r
+#define CDC_PARITY_TYPE_MARK           3\r
+#define CDC_PARITY_TYPE_SPACE          4\r
+\r
+/*\r
++------------------------------------------------------------------------------\r
+|  Copyright 2004-2009 Texas Instruments Incorporated. All rights reserved.\r
+|\r
+|  IMPORTANT: Your use of this Software is limited to those specific rights\r
+|  granted under the terms of a software license agreement between the user who\r
+|  downloaded the software, his/her employer (which must be your employer) and\r
+|  Texas Instruments Incorporated (the "License"). You may not use this Software\r
+|  unless you agree to abide by the terms of the License. The License limits\r
+|  your use, and you acknowledge, that the Software may not be modified, copied\r
+|  or distributed unless embedded on a Texas Instruments microcontroller or used\r
+|  solely and exclusively in conjunction with a Texas Instruments radio\r
+|  frequency transceiver, which is integrated into your product. Other than for\r
+|  the foregoing purpose, you may not use, reproduce, copy, prepare derivative\r
+|  works of, modify, distribute, perform, display or sell this Software and/or\r
+|  its documentation for any purpose.\r
+|\r
+|  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE\r
+|  PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED,\r
+|  INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE,\r
+|  NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL\r
+|  TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+|  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER\r
+|  LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING\r
+|  BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR\r
+|  CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT OF\r
+|  SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES\r
+|  (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+|\r
+|  Should you have any questions regarding your right to use this Software,\r
+|  contact Texas Instruments Incorporated at www.TI.com.\r
+|\r
++------------------------------------------------------------------------------\r
+*/\r
+\r
+#endif\r
diff --git a/chronos-ti/Software Projects/RF Access Point/IAR/usb/class_cdc/usb_cdc_descriptor.s51 b/chronos-ti/Software Projects/RF Access Point/IAR/usb/class_cdc/usb_cdc_descriptor.s51
new file mode 100755 (executable)
index 0000000..090d1af
--- /dev/null
@@ -0,0 +1,303 @@
+/***********************************************************************************\r
+\r
+    Filename:     usb_cdc_descriptor.s51\r
+\r
+    Description:  Descriptor for USB CDC class.\r
+\r
+***********************************************************************************/\r
+/*\r
++------------------------------------------------------------------------------\r
+|The default USB descriptor defines a minimum configuration, with no endpoints\r
+|apart from EP0. The application can define 3 IN and OUT endpoints, and override\r
+|the configuration and interface descriptor (only one of each).\r
+|The device and string descriptors are locked.\r
++------------------------------------------------------------------------------*/\r
+\r
+\r
+#define ASM_FILE\r
+#include "..\library\usb_descriptor.h"\r
+#include "usb_cdc.h"\r
+\r
+                MODULE  usb_descriptor\r
+\r
+                RSEG    RCODE\r
+\r
+                PUBLIC usbDescStart;\r
+                PUBLIC usbDescEnd;\r
+                PUBLIC usbDescLut;\r
+                PUBLIC usbDescLutEnd;\r
+                PUBLIC usbDblbufLut;\r
+                PUBLIC usbDblbufLutEnd;\r
+\r
+;;-------------------------------------------------------------------------------------------------------\r
+;; USB descriptors\r
+usbDescStart:\r
+deviceDesc:     ; Device descriptor\r
+                DB deviceDescEnd - deviceDesc\r
+                DB DESC_TYPE_DEVICE ; bDescriptorType\r
+                DB 10H, 01H         ; bcdUSB\r
+                DB CDC_DEVICE       ; bDeviceClass\r
+                DB 00H              ; bDeviceSubClass\r
+                DB 00H              ; bDeviceProtocol\r
+                DB EP0_PACKET_SIZE\r
+                DB 51H, 04H         ; idVendor Texas Instruments\r
+                #if (chip==2531)\r
+                DB 0A8H, 16H        ; idProduct CC2531\r
+                #elif (chip==2511)\r
+                DB 0A4H, 16H        ; idProduct CC2511\r
+                #else\r
+                DB 0A6H, 16H        ; idProduct CC1111\r
+                #endif\r
+                DB 09H, 00H         ; bcdDevice\r
+                DB 01H              ; iManufacturer\r
+                DB 02H              ; iProduct\r
+                DB 03H              ; iSerialNumber\r
+                DB 01H              ; bNumConfigurations\r
+deviceDescEnd:\r
+\r
+config1LengthStart:\r
+configDesc:     ; Configuration descriptor\r
+                DB configDescEnd - configDesc\r
+                DB DESC_TYPE_CONFIG ; bDescriptorType\r
+                DB config1LengthEnd - config1LengthStart, 00H\r
+                DB 02H              ; NumInterfaces\r
+                DB 01H              ; bConfigurationValue\r
+                DB 00H              ; iConfiguration\r
+                DB 80H              ; bmAttributes\r
+                DB 25               ; MaxPower\r
+configDescEnd:\r
+\r
+\r
+;\r
+;               INTERFACE 0\r
+;\r
+\r
+\r
+interface0Desc: ; Interface descriptor\r
+                DB interface0DescEnd - interface0Desc\r
+                DB DESC_TYPE_INTERFACE    ; bDescriptorType\r
+                DB 00H                    ; bInterfaceNumber\r
+                DB 00H                    ; bAlternateSetting\r
+                DB 01H                    ; bNumEndpoints\r
+                DB COMM_INTF              ; bInterfaceClass\r
+                DB ABSTRACT_CONTROL_MODEL ; bInterfaceSubClass\r
+                DB V25TER                 ; bInterfaceProcotol\r
+                DB 00H                    ; iInterface\r
+interface0DescEnd:\r
+\r
+;; CDC Class-Specific Descriptors\r
+\r
+headerFunctionalDesc: ; Header Functional Descriptor\r
+                DB headerFunctionalDescEnd - headerFunctionalDesc\r
+                DB CS_INTERFACE\r
+                DB DSC_FN_HEADER\r
+                DB 10H, 01H\r
+headerFunctionalDescEnd:\r
+\r
+\r
+absCtrlManFuncDesc: ; Abstract Control Management Functional Descriptor\r
+                DB absCtrlManFuncDescEnd - absCtrlManFuncDesc\r
+                DB CS_INTERFACE\r
+                DB DSC_FN_ACM\r
+                DB 02H   ;set the supported class requests\r
+absCtrlManFuncDescEnd:\r
+\r
+unionFunctionalDesc: ; Union Functional Descriptor\r
+                DB unionFunctionalDescEnd - unionFunctionalDesc\r
+                DB CS_INTERFACE\r
+                DB DSC_FN_UNION\r
+                DB CDC_COMM_INTF_ID\r
+                DB CDC_DATA_INTF_ID\r
+unionFunctionalDescEnd:\r
+\r
+\r
+callMngFuncDesc: ; Call Management Functional Descriptor\r
+                DB callMngFuncDescEnd - callMngFuncDesc\r
+                DB CS_INTERFACE\r
+                DB DSC_FN_CALL_MGT\r
+                DB 00H\r
+                DB CDC_DATA_INTF_ID\r
+callMngFuncDescEnd:\r
+\r
+\r
+\r
+endpoint0Desc:  ; Endpoint descriptor (EP2 IN)\r
+                DB endpoint0DescEnd - endpoint0Desc\r
+                DB DESC_TYPE_ENDPOINT     ; bDescriptorType\r
+                DB 82H                    ; bEndpointAddress\r
+                DB EP_ATTR_INT            ; bmAttributes\r
+                DB 40H, 00H               ; wMaxPacketSize\r
+                DB 40H                    ; bInterval\r
+endpoint0DescEnd:\r
+\r
+;\r
+;               INTERFACE 1\r
+;\r
+\r
+interface1Desc: ; Interface descriptor\r
+                DB interface1DescEnd - interface1Desc\r
+                DB DESC_TYPE_INTERFACE    ; Interface descriptor type\r
+                DB 01H                    ; Interface Number\r
+                DB 00H                    ; Alternate Setting Number\r
+                DB 02H                    ; Number of endpoints in this intf\r
+                DB DATA_INTF              ; Class code\r
+                DB 00H                    ; Subclass code\r
+                DB NO_PROTOCOL            ; Protocol code\r
+                DB 00H                    ; Interface string index\r
+interface1DescEnd:\r
+\r
+\r
+endpoint1Desc:  ; Endpoint descriptor (EP4 OUT)\r
+                DB endpoint1DescEnd - endpoint1Desc\r
+                DB DESC_TYPE_ENDPOINT     ; bDescriptorType\r
+                DB 84H                    ; bEndpointAddress\r
+                DB EP_ATTR_BULK           ; bmAttributes\r
+                DB 40H, 00H               ; wMaxPacketSize\r
+                DB 01H                    ; bInterval\r
+endpoint1DescEnd:\r
+\r
+endpoint2Desc:  ; Endpoint descriptor (EP4 IN)\r
+                DB endpoint2DescEnd - endpoint2Desc\r
+                DB DESC_TYPE_ENDPOINT     ; bDescriptorType\r
+                DB 04H                    ; bEndpointAddress\r
+                DB EP_ATTR_BULK           ; bmAttributes\r
+                DB 40H, 00H               ; wMaxPacketSize\r
+                DB 01H                    ; bInterval\r
+endpoint2DescEnd:\r
+config1LengthEnd:\r
+;;-------------------------------------------------------------------------------------------------------\r
+\r
+\r
+;;-------------------------------------------------------------------------------------------------------\r
+;; String descriptors\r
+string0Desc:    ; Language ID\r
+                DB string0DescEnd - string0Desc\r
+                DB DESC_TYPE_STRING       ; bDescriptorType\r
+                DB 09H                    ; US-EN\r
+                DB 04H\r
+string0DescEnd:\r
+\r
+string1Desc:    ; Manufacturer\r
+                DB string1DescEnd - string1Desc\r
+                DB DESC_TYPE_STRING       ; bDescriptorType\r
+                DB 'T', 0\r
+                DB 'e', 0\r
+                DB 'x', 0\r
+                DB 'a', 0\r
+                DB 's', 0\r
+                DB ' ', 0\r
+                DB 'I', 0\r
+                DB 'n', 0\r
+                DB 's', 0\r
+                DB 't', 0\r
+                DB 'r', 0\r
+                DB 'u', 0\r
+                DB 'm', 0\r
+                DB 'e', 0\r
+                DB 'n', 0\r
+                DB 't', 0\r
+                DB 's', 0\r
+\r
+string1DescEnd:\r
+\r
+string2Desc:    ; Product\r
+                DB string2DescEnd - string2Desc\r
+                DB DESC_TYPE_STRING       ; bDescriptorType\r
+                DB 'C', 0\r
+                DB 'C', 0\r
+\r
+                #if (chip==2531)\r
+                DB '2', 0\r
+                DB '5', 0\r
+                DB '3', 0\r
+                DB '1', 0\r
+                #elif (chip==2511)\r
+                DB '2', 0\r
+                DB '5', 0\r
+                DB '1', 0\r
+                DB '1', 0\r
+                #else\r
+                DB '1', 0\r
+                DB '1', 0\r
+                DB '1', 0\r
+                DB '1', 0\r
+                #endif\r
+\r
+                DB ' ', 0\r
+                DB 'U', 0\r
+                DB 'S', 0\r
+                DB 'B', 0\r
+                DB ' ', 0\r
+                DB 'C', 0\r
+                DB 'D', 0\r
+                DB 'C', 0\r
+string2DescEnd:\r
+\r
+string3Desc:    ; Serial number\r
+                DB string3DescEnd - string3Desc\r
+                DB DESC_TYPE_STRING       ; bDescriptorType\r
+                DB '0', 0\r
+                DB '0', 0\r
+                DB '1', 0\r
+string3DescEnd:\r
+\r
+usbDescEnd:\r
+;;-------------------------------------------------------------------------------------------------------\r
+\r
+\r
+;;-------------------------------------------------------------------------------------------------------\r
+;; Look-up table for descriptors that are not returned through requests for DSC_DEVICE, DSC_CONFIG or\r
+;; DSC_STRING (e.g. HID report descriptors)\r
+usbDescLut:\r
+usbDescLutEnd:\r
+;;-------------------------------------------------------------------------------------------------------\r
+\r
+\r
+;;-------------------------------------------------------------------------------------------------------\r
+;; Look-up table for double buffer settings (one set of bit masks for each defined interface)\r
+usbDblbufLut:  DW interface0Desc   ; pInterface\r
+                DB 00H              ; inMask\r
+                DB 00H              ; outMask\r
+                DW interface1Desc   ; pInterface\r
+                DB 00H              ; inMask\r
+                DB 00H              ; outMask\r
+usbDblbufLutEnd:\r
+;;-------------------------------------------------------------------------------------------------------\r
+\r
+\r
+                END;\r
+\r
+\r
+/*\r
++------------------------------------------------------------------------------\r
+|  Copyright 2004-2007 Texas Instruments Incorporated. All rights reserved.\r
+|\r
+|  IMPORTANT: Your use of this Software is limited to those specific rights\r
+|  granted under the terms of a software license agreement between the user who\r
+|  downloaded the software, his/her employer (which must be your employer) and\r
+|  Texas Instruments Incorporated (the "License"). You may not use this Software\r
+|  unless you agree to abide by the terms of the License. The License limits\r
+|  your use, and you acknowledge, that the Software may not be modified, copied\r
+|  or distributed unless embedded on a Texas Instruments microcontroller or used\r
+|  solely and exclusively in conjunction with a Texas Instruments radio\r
+|  frequency transceiver, which is integrated into your product. Other than for\r
+|  the foregoing purpose, you may not use, reproduce, copy, prepare derivative\r
+|  works of, modify, distribute, perform, display or sell this Software and/or\r
+|  its documentation for any purpose.\r
+|\r
+|  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE\r
+|  PROVIDED \93AS IS\94 WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED,\r
+|  INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE,\r
+|  NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL\r
+|  TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+|  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER\r
+|  LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING\r
+|  BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR\r
+|  CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT OF\r
+|  SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES\r
+|  (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+|\r
+|  Should you have any questions regarding your right to use this Software,\r
+|  contact Texas Instruments Incorporated at www.TI.com.\r
+|\r
+*/\r
diff --git a/chronos-ti/Software Projects/RF Access Point/IAR/usb/class_cdc/usb_cdc_hooks.c b/chronos-ti/Software Projects/RF Access Point/IAR/usb/class_cdc/usb_cdc_hooks.c
new file mode 100755 (executable)
index 0000000..1821443
--- /dev/null
@@ -0,0 +1,162 @@
+/***********************************************************************************\r
+\r
+    Filename: usb_cdc_hooks.c\r
+\r
+    Contains the necessary hook functions for various USB request processing\r
+    that is featured from the USB firmware library. Some\r
+    functions are empty.\r
+\r
+***********************************************************************************/\r
+\r
+\r
+/**********************************************************************************\r
+ * INCLUDES\r
+ */\r
+\r
+#include "usb_firmware_library_headers.h"\r
+#include "usb_cdc.h"\r
+#include "usb_uart.h"\r
+//#include "hal_led.h"\r
+\r
+/* Global data */\r
+\r
+extern CDC_LINE_CODING_STRUCTURE currentLineCoding;\r
+extern uint16 cdcRTS;\r
+\r
+\r
+// *********************************************************************************\r
+// All Hooks and functions required by the USB library.\r
+// *********************************************************************************\r
+\r
+// **************** Process USB class requests with OUT data phase *****************\r
+void usbcrHookProcessOut(void)\r
+{\r
+   // Process USB class requests with OUT data phase, or stall endpoint 0 when unsupported\r
+   if (usbSetupHeader.request == CDC_SET_CONTROL_LINE_STATE) {\r
+       // Control line state from host\r
+      if(usbfwData.ep0Status == EP_IDLE)\r
+      {\r
+         cdcRTS= usbSetupHeader.value;\r
+      /*   if (cdcRTS)\r
+             halLedSet(2);\r
+         else\r
+             halLedClear(2);*/\r
+\r
+         usbfwData.ep0Status = EP_RX;\r
+      }\r
+\r
+\r
+   } else if(usbSetupHeader.request == CDC_SET_LINE_CODING) {\r
+\r
+      if(usbfwData.ep0Status == EP_IDLE)\r
+      {\r
+         usbSetupData.pBuffer = (uint8 __xdata *) &currentLineCoding;\r
+         usbfwData.ep0Status = EP_RX;\r
+      }\r
+      else if(usbfwData.ep0Status == EP_RX) { }\r
+   }\r
+   // Unknown request?\r
+   else {\r
+      usbfwData.ep0Status = EP_STALL;\r
+   }\r
+}\r
+\r
+// **************** Process USB class requests with IN data phase ******************\r
+void usbcrHookProcessIn(void)\r
+{\r
+   // Process USB class requests with IN data phase, or stall endpoint 0 when unsupported\r
+   if (usbSetupHeader.request == CDC_GET_LINE_CODING) {\r
+      // First the endpoint status is EP_IDLE...\r
+      if (usbfwData.ep0Status == EP_IDLE) {\r
+         usbSetupData.pBuffer = (uint8 __xdata *) &currentLineCoding;\r
+         usbSetupData.bytesLeft = 7;\r
+         usbfwData.ep0Status = EP_TX;\r
+         // Then the endpoint status is EP_TX (remember: we did that here when setting up the buffer)\r
+      } else if (usbfwData.ep0Status == EP_TX) {\r
+         // usbfwData.ep0Status is automatically reset to EP_IDLE when returning to usbfwSetupHandler()\r
+      }\r
+   } else {\r
+      usbfwData.ep0Status = EP_STALL;\r
+   }\r
+}\r
+\r
+// ********************************  Unsupported USB hooks *************************\r
+void usbvrHookProcessOut(void) {usbfwData.ep0Status = EP_STALL; }\r
+void usbvrHookProcessIn(void) {usbfwData.ep0Status = EP_STALL; }\r
+\r
+// ************************  unsupported/unhandled standard requests ***************\r
+void usbsrHookSetDescriptor(void) { usbfwData.ep0Status = EP_STALL; }\r
+void usbsrHookSynchFrame(void) { usbfwData.ep0Status = EP_STALL; }\r
+void usbsrHookClearFeature(void) { usbfwData.ep0Status = EP_STALL; }\r
+void usbsrHookSetFeature(void) { usbfwData.ep0Status = EP_STALL; }\r
+void usbsrHookModifyGetStatus(uint8 recipient, uint8 index, uint16 __xdata *pStatus) { }\r
+\r
+\r
+// ************************ USB standard request event processing ******************\r
+void usbsrHookProcessEvent(uint8 event, uint8 index)\r
+{\r
+   // Process relevant events, one at a time.\r
+   switch (event) {\r
+   case USBSR_EVENT_CONFIGURATION_CHANGING : //(the device configuration is about to change)\r
+      break;\r
+   case USBSR_EVENT_CONFIGURATION_CHANGED :// (the device configuration has changed)\r
+      break;\r
+   case USBSR_EVENT_INTERFACE_CHANGING ://(the alternate setting of the given interface is about to change)\r
+      break;\r
+   case USBSR_EVENT_INTERFACE_CHANGED : //(the alternate setting of the given interface has changed)\r
+      break;\r
+   case USBSR_EVENT_REMOTE_WAKEUP_ENABLED ://(remote wakeup has been enabled by the host)\r
+      break;\r
+   case USBSR_EVENT_REMOTE_WAKEUP_DISABLED ://(remote wakeup has been disabled by the host)\r
+      break;\r
+   case USBSR_EVENT_EPIN_STALL_CLEARED ://(the given IN endpoint's stall condition has been cleared the host)\r
+      break;\r
+   case USBSR_EVENT_EPIN_STALL_SET ://(the given IN endpoint has been stalled by the host)\r
+      break;\r
+   case USBSR_EVENT_EPOUT_STALL_CLEARED ://(the given OUT endpoint's stall condition has been cleared the host)\r
+      break;\r
+   case USBSR_EVENT_EPOUT_STALL_SET ://(the given OUT endpoint has been stalled by the PC)\r
+      break;\r
+   }\r
+}\r
+\r
+// ************************ USB interrupt event processing *************************\r
+void usbirqHookProcessEvents(void)\r
+{\r
+    // Handle events that require immediate processing here\r
+}\r
+\r
+/*\r
++------------------------------------------------------------------------------\r
+|  Copyright 2004-2007 Texas Instruments Incorporated. All rights reserved.\r
+|\r
+|  IMPORTANT: Your use of this Software is limited to those specific rights\r
+|  granted under the terms of a software license agreement between the user who\r
+|  downloaded the software, his/her employer (which must be your employer) and\r
+|  Texas Instruments Incorporated (the "License"). You may not use this Software\r
+|  unless you agree to abide by the terms of the License. The License limits\r
+|  your use, and you acknowledge, that the Software may not be modified, copied\r
+|  or distributed unless embedded on a Texas Instruments microcontroller or used\r
+|  solely and exclusively in conjunction with a Texas Instruments radio\r
+|  frequency transceiver, which is integrated into your product. Other than for\r
+|  the foregoing purpose, you may not use, reproduce, copy, prepare derivative\r
+|  works of, modify, distribute, perform, display or sell this Software and/or\r
+|  its documentation for any purpose.\r
+|\r
+|  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE\r
+|  PROVIDED \93AS IS\94 WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED,\r
+|  INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE,\r
+|  NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL\r
+|  TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+|  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER\r
+|  LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING\r
+|  BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR\r
+|  CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT OF\r
+|  SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES\r
+|  (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+|\r
+|  Should you have any questions regarding your right to use this Software,\r
+|  contact Texas Instruments Incorporated at www.TI.com.\r
+|\r
++------------------------------------------------------------------------------\r
+*/\r
diff --git a/chronos-ti/Software Projects/RF Access Point/IAR/usb/class_cdc/usb_firmware_library_config.c b/chronos-ti/Software Projects/RF Access Point/IAR/usb/class_cdc/usb_firmware_library_config.c
new file mode 100755 (executable)
index 0000000..5b4614f
--- /dev/null
@@ -0,0 +1,68 @@
+/***********************************************************************************\r
+\r
+    Filename:     usb_firmware_library_config.c\r
+\r
+    Description:  USB library configuration.\r
+\r
+***********************************************************************************/\r
+\r
+/// \addtogroup module_usb_firmware_library_config\r
+/// @{\r
+#define USBFIRMWARELIBRARYCONFIG_C ///< Modifies the behavior of "EXTERN" in usb_interrupt.h\r
+#include "usb_firmware_library_headers.h"\r
+\r
+//-----------------------------------------------------------------------------\r
+// READ THIS!!\r
+//\r
+// This file configures the USB Firmware Library.\r
+// To use the library, make a copy of this file, rename it to "usb_firmware_library_config.c", and\r
+// put it in the project catalog. Then edit the code below as needed:\r
+//-----------------------------------------------------------------------------\r
+\r
+// Declaration of global USB descriptor pointers\r
+USB_DESCRIPTOR_MARKER usbDescriptorMarker= {\r
+    (uint8 __code *)&usbDescStart,\r
+    (uint8 __code *)&usbDescEnd,\r
+    (DESC_LUT_INFO __code *) &usbDescLut,\r
+    (DESC_LUT_INFO __code *) &usbDescLutEnd,\r
+    (DBLBUF_LUT_INFO __code *) &usbDblbufLut,\r
+    (DBLBUF_LUT_INFO __code *) &usbDblbufLutEnd\r
+};\r
+\r
+/// @}\r
+\r
+\r
+/*\r
++------------------------------------------------------------------------------\r
+|  Copyright 2004-2007 Texas Instruments Incorporated. All rights reserved.\r
+|\r
+|  IMPORTANT: Your use of this Software is limited to those specific rights\r
+|  granted under the terms of a software license agreement between the user who\r
+|  downloaded the software, his/her employer (which must be your employer) and\r
+|  Texas Instruments Incorporated (the "License"). You may not use this Software\r
+|  unless you agree to abide by the terms of the License. The License limits\r
+|  your use, and you acknowledge, that the Software may not be modified, copied\r
+|  or distributed unless embedded on a Texas Instruments microcontroller or used\r
+|  solely and exclusively in conjunction with a Texas Instruments radio\r
+|  frequency transceiver, which is integrated into your product. Other than for\r
+|  the foregoing purpose, you may not use, reproduce, copy, prepare derivative\r
+|  works of, modify, distribute, perform, display or sell this Software and/or\r
+|  its documentation for any purpose.\r
+|\r
+|  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE\r
+|  PROVIDED \93AS IS\94 WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED,\r
+|  INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE,\r
+|  NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL\r
+|  TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+|  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER\r
+|  LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING\r
+|  BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR\r
+|  CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT OF\r
+|  SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES\r
+|  (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+|\r
+|  Should you have any questions regarding your right to use this Software,\r
+|  contact Texas Instruments Incorporated at www.TI.com.\r
+|\r
++------------------------------------------------------------------------------\r
+*/\r
diff --git a/chronos-ti/Software Projects/RF Access Point/IAR/usb/class_cdc/usb_firmware_library_config.h b/chronos-ti/Software Projects/RF Access Point/IAR/usb/class_cdc/usb_firmware_library_config.h
new file mode 100755 (executable)
index 0000000..8b9b92c
--- /dev/null
@@ -0,0 +1,64 @@
+/***********************************************************************************\r
+\r
+    Filename:     usb_firmware_library_config.h\r
+\r
+    Description:  USB library configuration.\r
+\r
+***********************************************************************************/\r
+#ifndef USBFIRMWARELIBRARYCONFIG_H              // Don't modify\r
+#define USBFIRMWARELIBRARYCONFIG_H              // Don't modify\r
+\r
+//-----------------------------------------------------------------------------\r
+// READ THIS!!\r
+//\r
+// This file configures the USB Firmware Library.\r
+// To use the library, make a copy of this file, rename it to "usb_firmware_library_config.h", and\r
+// put it in the project catalog. Then edit the definitions below:\r
+//-----------------------------------------------------------------------------\r
+// Includes\r
+\r
+\r
+//-----------------------------------------------------------------------------\r
+// Defines\r
+\r
+// Enter the maximum number of interfaces that are used in the configurations (used to calculate the size\r
+// of the table that stores the currently selected alternate setting for each interface)\r
+#define USB_SETUP_MAX_NUMBER_OF_INTERFACES          5\r
+\r
+\r
+#endif //#ifndef USBFIRMWARELIBRARYCONFIG_H\r
+/*\r
++------------------------------------------------------------------------------\r
+|  Copyright 2004-2007 Texas Instruments Incorporated. All rights reserved.\r
+|\r
+|  IMPORTANT: Your use of this Software is limited to those specific rights\r
+|  granted under the terms of a software license agreement between the user who\r
+|  downloaded the software, his/her employer (which must be your employer) and\r
+|  Texas Instruments Incorporated (the "License"). You may not use this Software\r
+|  unless you agree to abide by the terms of the License. The License limits\r
+|  your use, and you acknowledge, that the Software may not be modified, copied\r
+|  or distributed unless embedded on a Texas Instruments microcontroller or used\r
+|  solely and exclusively in conjunction with a Texas Instruments radio\r
+|  frequency transceiver, which is integrated into your product. Other than for\r
+|  the foregoing purpose, you may not use, reproduce, copy, prepare derivative\r
+|  works of, modify, distribute, perform, display or sell this Software and/or\r
+|  its documentation for any purpose.\r
+|\r
+|  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE\r
+|  PROVIDED \93AS IS\94 WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED,\r
+|  INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE,\r
+|  NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL\r
+|  TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+|  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER\r
+|  LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING\r
+|  BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR\r
+|  CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT OF\r
+|  SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES\r
+|  (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+|\r
+|  Should you have any questions regarding your right to use this Software,\r
+|  contact Texas Instruments Incorporated at www.TI.com.\r
+|\r
++------------------------------------------------------------------------------\r
+*/\r
+\r
diff --git a/chronos-ti/Software Projects/RF Access Point/IAR/usb/class_cdc/usb_firmware_library_headers.h b/chronos-ti/Software Projects/RF Access Point/IAR/usb/class_cdc/usb_firmware_library_headers.h
new file mode 100755 (executable)
index 0000000..5d2d80a
--- /dev/null
@@ -0,0 +1,64 @@
+/***********************************************************************************\r
+\r
+    Filename:     usb_firmware_library_headers.h\r
+\r
+    Description:  Common inclusion of all USB library headers.\r
+\r
+***********************************************************************************/\r
+\r
+#ifndef USB_FIRMWARE_LIBRARY_HEADERS_H\r
+#define USB_FIRMWARE_LIBRARY_HEADERS_H\r
+\r
+\r
+// This file includes all of the USB Library header files.\r
+// When using the library, include this file only.\r
+\r
+// Also make a copy of usb_firmware_library_config_template.c and usb_firmware_library_config_template.h\r
+// and add it to your project as usb_firmware_library_config.c and\r
+// usb_firmware_library_config.h. The definitions in these files should be adapted to your project.\r
+\r
+#include "usb_firmware_library_config.h"\r
+#include "usb_descriptor.h"\r
+#include "usb_descriptor_parser.h"\r
+#include "usb_interrupt.h"\r
+#include "usb_framework.h"\r
+#include "usb_reg.h"\r
+#include "usb_standard_requests.h"\r
+#include "usb_suspend.h"\r
+\r
+/*\r
++------------------------------------------------------------------------------\r
+|  Copyright 2004-2007 Texas Instruments Incorporated. All rights reserved.\r
+|\r
+|  IMPORTANT: Your use of this Software is limited to those specific rights\r
+|  granted under the terms of a software license agreement between the user who\r
+|  downloaded the software, his/her employer (which must be your employer) and\r
+|  Texas Instruments Incorporated (the "License"). You may not use this Software\r
+|  unless you agree to abide by the terms of the License. The License limits\r
+|  your use, and you acknowledge, that the Software may not be modified, copied\r
+|  or distributed unless embedded on a Texas Instruments microcontroller or used\r
+|  solely and exclusively in conjunction with a Texas Instruments radio\r
+|  frequency transceiver, which is integrated into your product. Other than for\r
+|  the foregoing purpose, you may not use, reproduce, copy, prepare derivative\r
+|  works of, modify, distribute, perform, display or sell this Software and/or\r
+|  its documentation for any purpose.\r
+|\r
+|  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE\r
+|  PROVIDED \93AS IS\94 WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED,\r
+|  INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE,\r
+|  NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL\r
+|  TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+|  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER\r
+|  LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING\r
+|  BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR\r
+|  CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT OF\r
+|  SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES\r
+|  (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+|\r
+|  Should you have any questions regarding your right to use this Software,\r
+|  contact Texas Instruments Incorporated at www.TI.com.\r
+|\r
++------------------------------------------------------------------------------\r
+*/\r
+#endif //USB_FIRMWARE_LIBRARY_HEADERS_H\r
+\r
diff --git a/chronos-ti/Software Projects/RF Access Point/IAR/usb/class_cdc/usb_uart.c b/chronos-ti/Software Projects/RF Access Point/IAR/usb/class_cdc/usb_uart.c
new file mode 100755 (executable)
index 0000000..9623e7b
--- /dev/null
@@ -0,0 +1,362 @@
+/***********************************************************************************\r
+\r
+    Filename:     usb_uart.h\r
+\r
+    Description:  USB Virtual UART implementation.\r
+\r
+***********************************************************************************/\r
+\r
+\r
+/***********************************************************************************\r
+ * INCLUDES\r
+ */\r
+#include "hal_types.h"\r
+#include "hal_board.h"\r
+#include "hal_int.h"\r
+#include "hal_led.h"\r
+\r
+#include "usb_cdc.h"\r
+#include "usb_firmware_library_config.h"\r
+#include "usb_firmware_library_headers.h"\r
+\r
+#include "usb_uart.h"\r
+//#include "util_buffer.h"\r
+\r
+\r
+/***********************************************************************************\r
+ * MACROS and DEFINITIONS\r
+ */\r
+\r
+#define HAL_LED_DEBUG\r
+\r
+\r
+\r
+\r
+/***********************************************************************************\r
+ * EXTERNAL VARIABLES\r
+ */\r
+\r
+/* Ring buffers defined in hal_uart.c */\r
+\r
+//extern ringBuf_t rbRxBuf;\r
+//extern ringBuf_t rbTxBuf;\r
+\r
+\r
+/***********************************************************************************\r
+ * GLOBAL VARIABLES\r
+ */\r
+CDC_LINE_CODING_STRUCTURE __xdata currentLineCoding;\r
+uint16 cdcRTS;              // Request-To-Send modem control line\r
+uint8  cdcCTS;              // Clear-To-Send   modem control line\r
+\r
+unsigned char message_length = USB_MAX_MESSAGE_LENGTH;\r
+unsigned char usb_buffer[USB_MAX_MESSAGE_LENGTH+2];\r
+char          usb_bufferIndex = 0;\r
+unsigned char usb_newdata = 0;\r
+unsigned char usb_sendack = 0;\r
+\r
+\r
+/***********************************************************************************\r
+ * LOCAL DATA\r
+ */\r
+//static uint8 __xdata buffer[USB_MAX_PACKET_SIZE];\r
+static uint8 oldEndpoint;\r
+\r
+\r
+/***********************************************************************************\r
+ * LOCAL FUNCTIONS\r
+ */\r
+static void usbEventProcess(void);\r
+static void usbOutProcess(void);\r
+static void usbInProcess(void);\r
+\r
+\r
+/******************************************************************************\r
+ * FUNCTIONS\r
+ */\r
+extern void usb_decode(void);\r
+\r
+\r
+/***********************************************************************************\r
+* @fn           usbUartInit\r
+*\r
+* @brief        USB UART init function.\r
+*               - Set initial line decoding to 8/NONE/1.\r
+*               - Initialise the USB Firmware Library and the USB controller.\r
+*\r
+* @param        none\r
+*\r
+* @return       none\r
+*/\r
+void usbUartInit(uint32 baudrate)\r
+{\r
+    usb_bufferIndex = 0;\r
+    usb_newdata = 0;\r
+    usb_sendack = 0;\r
+  \r
+    // Set default line coding.\r
+    currentLineCoding.dteRate = baudrate;\r
+    currentLineCoding.charFormat = CDC_CHAR_FORMAT_1_STOP_BIT;\r
+    currentLineCoding.parityType = CDC_PARITY_TYPE_NONE;\r
+    currentLineCoding.dataBits = 8;\r
+\r
+    // Initialise hardware flow control\r
+    cdcRTS= 0;      // TRUE when DCE connected\r
+    cdcCTS= 1;      // Indicate CTS to DCE (here handled internally as CDC does\r
+                    // not directly support CTC).\r
+\r
+    // Init USB library\r
+    usbfwInit();\r
+\r
+    // Initialize the USB interrupt handler with bit mask containing all processed USBIRQ events\r
+    usbirqInit(0xFFFF);\r
+\r
+    // Enable pullup on D+\r
+    HAL_USB_PULLUP_ENABLE();\r
+\r
+    // Enable global interrupts\r
+    halIntOn();\r
+}\r
+\r
+\r
+\r
+/***********************************************************************************\r
+* @fn           usbUartProcess\r
+*\r
+* @brief        The USB UART main task function. Must be called from the\r
+*               applications main loop.\r
+*\r
+* @param        none\r
+*\r
+* @return       none\r
+*/\r
+void usbUartProcess(void)\r
+{\r
+    // Process USB events\r
+    usbEventProcess();\r
+\r
+    if (cdcCTS) {\r
+\r
+        // Process USB OUT data (USB -> RF)\r
+        usbOutProcess();\r
+\r
+        // Process USB IN data (RF -> USB)\r
+        usbInProcess();\r
+    }\r
+}\r
+\r
+\r
+\r
+/***********************************************************************************\r
+* @fn           usbEventProcess\r
+*\r
+* @brief        Handle the USB events which are not directly related to the UART.\r
+*\r
+* @param        none\r
+*\r
+* @return       none\r
+*/\r
+static void usbEventProcess(void)\r
+{\r
+    // Handle reset signaling on the bus\r
+    if (USBIRQ_GET_EVENT_MASK() & USBIRQ_EVENT_RESET) {\r
+        USBIRQ_CLEAR_EVENTS(USBIRQ_EVENT_RESET);\r
+        usbfwResetHandler();\r
+    }\r
+\r
+    // Handle packets on EP0\r
+    if (USBIRQ_GET_EVENT_MASK() & USBIRQ_EVENT_SETUP) {\r
+        USBIRQ_CLEAR_EVENTS(USBIRQ_EVENT_SETUP);\r
+        usbfwSetupHandler();\r
+    }\r
+\r
+    // Handle USB suspend\r
+    if (USBIRQ_GET_EVENT_MASK() & USBIRQ_EVENT_SUSPEND) {\r
+\r
+        // Clear USB suspend interrupt\r
+        USBIRQ_CLEAR_EVENTS(USBIRQ_EVENT_SUSPEND);\r
+\r
+        // Take the chip into PM1 until a USB resume is deteceted.\r
+        usbsuspEnter();\r
+\r
+        // Running again; first clear RESUME interrupt\r
+        USBIRQ_CLEAR_EVENTS(USBIRQ_EVENT_RESUME);\r
+    }\r
+}\r
+\r
+\r
+\r
+/***********************************************************************************\r
+* @fn           usbInProcess\r
+*\r
+* @brief        Handle traffic flow from RF to USB.\r
+*\r
+* @param        none\r
+*\r
+* @return       none\r
+*/\r
+static void usbInProcess(void)\r
+{\r
+    //uint8 length;\r
+\r
+    // USB ready to accept new IN packet\r
+    halIntOff();\r
+\r
+    oldEndpoint = USBFW_GET_SELECTED_ENDPOINT();\r
+    USBFW_SELECT_ENDPOINT(4);\r
+\r
+    // The IN endpoint is ready to accept data\r
+    if ( USBFW_IN_ENDPOINT_DISARMED() )\r
+    {\r
+        if (usb_sendack)\r
+        {\r
+          // modify and return received packet\r
+          usbfwWriteFifo(&USBF4, usb_buffer[2], &usb_buffer[0]);\r
+          usb_sendack = 0;\r
+          \r
+          // Flag USB IN buffer as not ready (disarming EP4)\r
+          USBFW_SELECT_ENDPOINT(4);\r
+          USBFW_ARM_IN_ENDPOINT();   // Send data to the host\r
+        }\r
+          \r
+/*        // Number of bytes present in RF buffer\r
+        length= bufNumBytes(&rbTxBuf);\r
+\r
+        if (length>0) {\r
+\r
+            // Limit the size\r
+            if (length > USB_MAX_PACKET_SIZE)\r
+            {\r
+                length = USB_MAX_PACKET_SIZE;\r
+            }\r
+\r
+            // Read from UART TX buffer\r
+            bufGet(&rbTxBuf,buffer,length);\r
+\r
+            // Write to USB FIFO\r
+            usbfwWriteFifo(&USBF4, length, buffer);\r
+\r
+            // Flag USB IN buffer as not ready (disarming EP4)\r
+            USBFW_SELECT_ENDPOINT(4);\r
+            USBFW_ARM_IN_ENDPOINT();   // Send data to the host\r
+\r
+        }*/\r
+    }\r
+\r
+    USBFW_SELECT_ENDPOINT(oldEndpoint);\r
+    halIntOn();\r
+\r
+}\r
+\r
+\r
+/***********************************************************************************\r
+* @fn           usbOutProcess\r
+*\r
+* @brief        Handle traffic flow from USB to RF.\r
+*\r
+* @param        none\r
+*\r
+* @return       none\r
+*/\r
+static void usbOutProcess(void)\r
+{\r
+    uint8 length, /*nToSend,*/ packetlength=0;\r
+\r
+    // If new packet is ready in USB FIFO\r
+    halIntOff();\r
+\r
+    oldEndpoint = USBFW_GET_SELECTED_ENDPOINT();\r
+    USBFW_SELECT_ENDPOINT(4);\r
+\r
+\r
+    if (USBFW_OUT_ENDPOINT_DISARMED() ) {\r
+\r
+        // Get length of USB packet, this operation must not be interrupted.\r
+        length = USBFW_GET_OUT_ENDPOINT_COUNT_LOW();\r
+        length+= USBFW_GET_OUT_ENDPOINT_COUNT_HIGH() >> 8;\r
+        \r
+        // Avoid overflow\r
+        message_length = USB_MAX_MESSAGE_LENGTH; \r
+        if (usb_bufferIndex + length > USB_MAX_MESSAGE_LENGTH) usb_bufferIndex=0;\r
+        \r
+        // Copy received bytes from FIFO to buffer\r
+        usbfwReadFifo(&USBF4, length, &usb_buffer[usb_bufferIndex]);\r
+        \r
+        // Increase buffer index\r
+        usb_bufferIndex += length;\r
+        \r
+        // If entire USB packet is read from buffer\r
+        USBFW_SELECT_ENDPOINT(4);\r
+        USBFW_ARM_OUT_ENDPOINT();\r
+\r
+        // get packet lenght from byte #2 of received packet\r
+        if ((usb_bufferIndex >= 2) && (packetlength == 0)) packetlength = usb_buffer[2];\r
+        if ((usb_bufferIndex > packetlength-1) && (packetlength >= USB_MIN_MESSAGE_LENGTH)) \r
+        { \r
+           //extract data from packet\r
+           usb_decode();\r
+           usb_bufferIndex = 0; \r
+         }     \r
+        \r
+        /*\r
+        // Calculate number of bytes available in RF buffer; and the number\r
+        // of bytes we may transfer in this operation.\r
+        nToSend= MIN(BUF_SIZE - bufNumBytes(&rbRxBuf), length);\r
+\r
+        // Space available in UART RX buffer ?\r
+        if (nToSend>0)\r
+        {\r
+            // Read from USB FIFO\r
+            usbfwReadFifo(&USBF4, nToSend, buffer);\r
+\r
+            // Write to radio TX buffer\r
+            bufPut(&rbRxBuf,buffer,nToSend);\r
+\r
+            // If entire USB packet is read from buffer\r
+            if (length == nToSend)\r
+            {\r
+                USBFW_SELECT_ENDPOINT(4);\r
+                USBFW_ARM_OUT_ENDPOINT();\r
+            }\r
+\r
+        }*/\r
+    }\r
+\r
+    USBFW_SELECT_ENDPOINT(oldEndpoint);\r
+    halIntOn();\r
+}\r
+/*\r
++------------------------------------------------------------------------------\r
+|  Copyright 2004-2009 Texas Instruments Incorporated. All rights reserved.\r
+|\r
+|  IMPORTANT: Your use of this Software is limited to those specific rights\r
+|  granted under the terms of a software license agreement between the user who\r
+|  downloaded the software, his/her employer (which must be your employer) and\r
+|  Texas Instruments Incorporated (the "License"). You may not use this Software\r
+|  unless you agree to abide by the terms of the License. The License limits\r
+|  your use, and you acknowledge, that the Software may not be modified, copied\r
+|  or distributed unless embedded on a Texas Instruments microcontroller or used\r
+|  solely and exclusively in conjunction with a Texas Instruments radio\r
+|  frequency transceiver, which is integrated into your product. Other than for\r
+|  the foregoing purpose, you may not use, reproduce, copy, prepare derivative\r
+|  works of, modify, distribute, perform, display or sell this Software and/or\r
+|  its documentation for any purpose.\r
+|\r
+|  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE\r
+|  PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED,\r
+|  INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE,\r
+|  NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL\r
+|  TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+|  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER\r
+|  LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING\r
+|  BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR\r
+|  CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT OF\r
+|  SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES\r
+|  (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+|\r
+|  Should you have any questions regarding your right to use this Software,\r
+|  contact Texas Instruments Incorporated at www.TI.com.\r
+|\r
++------------------------------------------------------------------------------\r
+*/\r
+\r
diff --git a/chronos-ti/Software Projects/RF Access Point/IAR/usb/class_cdc/usb_uart.h b/chronos-ti/Software Projects/RF Access Point/IAR/usb/class_cdc/usb_uart.h
new file mode 100755 (executable)
index 0000000..6e7a310
--- /dev/null
@@ -0,0 +1,47 @@
+/***********************************************************************************\r
+\r
+    Filename:     usb_uart.h\r
+\r
+    Description:  USB Virtual UART interface.\r
+\r
+***********************************************************************************/\r
+\r
+\r
+#ifndef USB_UART_H\r
+#define USB_UART_H\r
+\r
+#ifdef __cplusplus\r
+extern "C" {\r
+#endif\r
+\r
+#define USB_MAX_PACKET_SIZE             64  // As set in USB endpoint descriptor\r
+#define UART_SET_RTS_LIMIT              200\r
+#define UART_RELEASE_RTS_LIMIT          100\r
+\r
+#define UART_FLOW_CTRL_STOP             1\r
+#define UART_FLOW_CTRL_GO               0\r
+\r
+#define UART_TX_BUFFER_EMPTY            0x01\r
+#define UART_TX_STOPED_BY_FLOW_CTRL     0x02\r
+\r
+#define USB_MIN_MESSAGE_LENGTH        (3u)\r
+#define USB_MAX_MESSAGE_LENGTH        (32u)\r
+\r
+typedef struct {\r
+   uint32 dteRate;\r
+   uint8 charFormat;\r
+   uint8 parityType;\r
+   uint8 dataBits;\r
+} __xdata CDC_LINE_CODING_STRUCTURE;\r
+\r
+\r
+void usbUartInit(uint32 baudrate);\r
+void usbUartProcess(void);\r
+\r
+\r
+#ifdef __cplusplus\r
+}\r
+#endif\r
+\r
+\r
+#endif\r
diff --git a/chronos-ti/Software Projects/RF Access Point/IAR/usb/library/ccxx11/usb_interrupt.c b/chronos-ti/Software Projects/RF Access Point/IAR/usb/library/ccxx11/usb_interrupt.c
new file mode 100755 (executable)
index 0000000..666899c
--- /dev/null
@@ -0,0 +1,163 @@
+/***********************************************************************************\r
+\r
+    Filename:     usb_interrupt.c\r
+\r
+    Description:  USB library interrupt initialisation and ISR.\r
+\r
+***********************************************************************************/\r
+\r
+/// \addtogroup module_usb_interrupt\r
+/// @{\r
+#define USBINTERRUPT_C ///< Modifies the behavior of "EXTERN" in usb_interrupt.h\r
+#include "usb_firmware_library_headers.h"\r
+#include "hal_board.h"\r
+#include "clock.h"\r
+\r
+\r
+/** \brief Initializes the \ref module_usb_interrupt module\r
+ *\r
+ * This function should be called after the \ref module_usb_framework module has been initialized.\r
+ * Use interrupt group priority control (refer to the CC2511/CC1111 datasheet) to adjust the priority of the\r
+ * USB interrupt relative to other interrupts.\r
+ *\r
+ * \param[in]       irqMask\r
+ *     A bit mask containing USBIRQ_EVENT bits for all events that shall be reported\r
+ */\r
+void usbirqInit(uint16 irqMask)\r
+{\r
+   // Initialize variables\r
+   usbirqData.eventMask = 0x0000;\r
+   usbirqData.inSuspend = FALSE;\r
+   usbirqData.irqMask = irqMask;\r
+\r
+   // Select IRQ flags to handle\r
+   USBCIE = irqMask;\r
+   USBIIE = irqMask >> 4;\r
+   USBOIE = (irqMask >> 9) & 0x3E;\r
+\r
+   // Configure P0 for rising edge detection on P0[7:4], but keep the interrupt disabled until it is\r
+   // needed.\r
+   PICTL |= 0x10;\r
+   HAL_USB_RESUME_INT_CLEAR();\r
+   HAL_USB_INT_CLEAR();\r
+   HAL_USB_INT_ENABLE();\r
+\r
+} // usbirqInit\r
+\r
+\r
+\r
+\r
+/** \brief USB interrupt handler\r
+ *\r
+ * Clears the P2 interrupt flag and converts all USB interrupt flags into events.\r
+ * The interrupt also lets \ref usbsuspEnter() break from the suspend loop.\r
+ */\r
+#pragma vector=P2INT_VECTOR\r
+__interrupt void usbirqHandler(void)\r
+{\r
+   uint8 usbcif;\r
+\r
+   // First make sure that the crystal oscillator is stable\r
+   while (!IS_XOSC_STABLE());\r
+\r
+   // Special handling for reset interrupts\r
+   usbcif = USBCIF;\r
+   if (usbcif & USBCIF_RSTIF) {\r
+\r
+       // All interrupts (except suspend) are by default enabled by hardware, so\r
+       // re-initialize the enable bits to avoid unwanted interrupts\r
+       USBCIE = usbirqData.irqMask;\r
+       USBIIE = usbirqData.irqMask >> 4;\r
+       USBOIE = (usbirqData.irqMask >> 9) & 0x3E;\r
+\r
+       // Enable suspend mode when suspend signaling is detected on the bus\r
+       USBPOW |= USBPOW_SUSPEND_EN;\r
+   }\r
+\r
+   // Record events (keeping existing)\r
+   usbirqData.eventMask |= (uint16) usbcif;\r
+   usbirqData.eventMask |= (uint16) USBIIF << 4;\r
+   usbirqData.eventMask |= (uint16) USBOIF << 9;\r
+\r
+   // If we get a suspend event, we should always enter suspend mode. We must,\r
+   // however be sure that we exit the suspend loop upon resume or reset\r
+   // signaling.\r
+   if (usbcif & USBCIF_SUSPENDIF) {\r
+      usbirqData.inSuspend = TRUE;\r
+   }\r
+   if (usbcif & (USBCIF_RSTIF | USBCIF_RESUMEIF)) {\r
+      usbirqData.inSuspend = FALSE;\r
+   }\r
+\r
+   // Hand them over to the application\r
+   usbirqHookProcessEvents();\r
+\r
+   // Clear the P2 interrupt flag\r
+   HAL_USB_INT_CLEAR();\r
+\r
+} // usbirqHandler\r
+\r
+\r
+\r
+\r
+/** \\brief USB resume interrupt handler\r
+ *\r
+ * This routine clears the USB resume interrupt flag, and makes sure that MCU does not return to power\r
+ * mode 1 again until the the suspend loop has been exited.\r
+ */\r
+#pragma vector = P0INT_VECTOR\r
+__interrupt void usbirqResumeHandler(void)\r
+{\r
+   uint8 flags;\r
+\r
+   // First make sure that the crystal oscillator is stable\r
+   while (!IS_XOSC_STABLE());\r
+\r
+   // Clear and disable the interrupt flag\r
+   flags = P0IFG;\r
+   if (flags & 0x80) {\r
+      // We have a USB_RESUME interrupt (which could also be a USB reset)\r
+      HAL_USB_RESUME_INT_DISABLE();\r
+      usbsuspStopPm1();\r
+   }\r
+\r
+   HAL_USB_RESUME_INT_CLEAR();\r
+\r
+} // usbResumeHandler\r
+\r
+/// @}\r
+\r
+/*\r
++------------------------------------------------------------------------------\r
+|  Copyright 2004-2007 Texas Instruments Incorporated. All rights reserved.\r
+|\r
+|  IMPORTANT: Your use of this Software is limited to those specific rights\r
+|  granted under the terms of a software license agreement between the user who\r
+|  downloaded the software, his/her employer (which must be your employer) and\r
+|  Texas Instruments Incorporated (the "License"). You may not use this Software\r
+|  unless you agree to abide by the terms of the License. The License limits\r
+|  your use, and you acknowledge, that the Software may not be modified, copied\r
+|  or distributed unless embedded on a Texas Instruments microcontroller or used\r
+|  solely and exclusively in conjunction with a Texas Instruments radio\r
+|  frequency transceiver, which is integrated into your product. Other than for\r
+|  the foregoing purpose, you may not use, reproduce, copy, prepare derivative\r
+|  works of, modify, distribute, perform, display or sell this Software and/or\r
+|  its documentation for any purpose.\r
+|\r
+|  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE\r
+|  PROVIDED \93AS IS\94 WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED,\r
+|  INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE,\r
+|  NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL\r
+|  TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+|  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER\r
+|  LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING\r
+|  BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR\r
+|  CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT OF\r
+|  SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES\r
+|  (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+|\r
+|  Should you have any questions regarding your right to use this Software,\r
+|  contact Texas Instruments Incorporated at www.TI.com.\r
+|\r
++------------------------------------------------------------------------------\r
+*/\r
diff --git a/chronos-ti/Software Projects/RF Access Point/IAR/usb/library/ccxx11/usb_suspend.c b/chronos-ti/Software Projects/RF Access Point/IAR/usb/library/ccxx11/usb_suspend.c
new file mode 100755 (executable)
index 0000000..23dae90
--- /dev/null
@@ -0,0 +1,182 @@
+/***********************************************************************************\r
+\r
+    Filename:     usb_framework.c\r
+\r
+    Description:  USB library common functionality.\r
+\r
+***********************************************************************************/\r
+\r
+/// \addtogroup module_usb_suspend\r
+/// @{\r
+#include "usb_firmware_library_headers.h"\r
+#include "hal_int.h"\r
+#include "hal_mcu.h"\r
+#include "hal_board.h"\r
+\r
+static __xdata uint8 usbsuspEnterXdata[14];\r
+static __xdata VFPTR pUsbsuspEnterXdata = NULL;\r
+\r
+__xdata VFPTR pFnSuspendEnterHook=  NULL;\r
+__xdata VFPTR pFnSuspendExitHook=   NULL;\r
+\r
+\r
+\r
+/** \brief Puts the chip into power mode 1 during USB suspend.\r
+ *\r
+ * This function must be called from main (i.e. not from interrupt context) upon the reception of a\r
+ * \ref USBIRQ_EVENT_SUSPEND event. To comply with the USB specification, this must happen within 10 ms\r
+ * after the event occurs. The chip will stay in power mode 1 until a USB resume or USB reset is detected\r
+ * on the USB bus, or remote wakeup is used. During this period, the MCU can only run code from\r
+ * interrupt context.\r
+ */\r
+void usbsuspEnter(void)\r
+{\r
+   if (pFnSuspendEnterHook!=NULL)\r
+       pFnSuspendEnterHook();\r
+\r
+   // SLEEP &= ~0x03;     / ANL SLEEP, #0xFC\r
+   usbsuspEnterXdata[0] = 0x53;\r
+   usbsuspEnterXdata[1] = 0xBE;\r
+   usbsuspEnterXdata[2] = 0xFC;\r
+\r
+   // SLEEP |= 0x01;      / ORL SLEEP, #0x01\r
+   usbsuspEnterXdata[3] = 0x43;\r
+   usbsuspEnterXdata[4] = 0xBE;\r
+   usbsuspEnterXdata[5] = 0x01;\r
+\r
+   // PCON = 0x01;        / MOV PCON, #0x01\r
+   usbsuspEnterXdata[6] = 0x75;\r
+   usbsuspEnterXdata[7] = 0x87;\r
+   usbsuspEnterXdata[8] = 0x01;\r
+\r
+   // The CPU will be halted here while suspended (in PM1).\r
+\r
+   // while (inSuspend);  / MOV A, inSuspend\r
+   usbsuspEnterXdata[9] = 0xE5;\r
+   usbsuspEnterXdata[10] = (uint8) ((__data uint8 *) &usbirqData.inSuspend);\r
+\r
+   // ... Restart ...     / JNZ -12\r
+   usbsuspEnterXdata[11] = 0x70;\r
+   usbsuspEnterXdata[12] = 0xF3;\r
+\r
+   // return;             / RET\r
+   usbsuspEnterXdata[13] = 0x22;\r
+\r
+   // Enable the resume and reset detection interrupt\r
+   HAL_USB_RESUME_INT_CLEAR();\r
+   HAL_USB_RESUME_INT_ENABLE();\r
+\r
+   // Call the suspend loop routine from XDATA\r
+   // The routine is in XDATA so that usbsuspExit() wipe out the power-down instruction in the loop (by\r
+   // replacing "MOV PCON, #0x01" with three NOP instructions).\r
+   pUsbsuspEnterXdata = (VFPTR) ((uint16) usbsuspEnterXdata);\r
+   pUsbsuspEnterXdata();\r
+\r
+   if (pFnSuspendExitHook!=NULL)\r
+       pFnSuspendExitHook();\r
+\r
+} // usbsuspEnter\r
+\r
+\r
+\r
+\r
+/** \brief Attempts USB remote wakeup.\r
+ *\r
+ * This function can be called from interrupt context while the USB device is suspend mode. If the device\r
+ * is privileged to do so (see \c usbfwData.remoteWakeup and the \ref USBSR_EVENT_REMOTE_WAKEUP_ENABLED\r
+ * and \ref USBSR_EVENT_REMOTE_WAKEUP_DISABLED events), remote wakeup will be performed. Note that this\r
+ * function will block for 10 ms while the resume signal is set on the bus. Note: This function can only\r
+ * be called when the 48 MHz XOSC is stable.\r
+ *\r
+ * \return\r
+ *     \c TRUE if the remote wakeup was performed (the privilege had been granted), otherwise \c FALSE\r
+ *     (the device is still in suspend mode).\r
+ */\r
+uint8 usbsuspDoRemoteWakeup(void)\r
+{\r
+\r
+   // Make sure that it's OK\r
+   if (!usbfwData.remoteWakeup) return FALSE;\r
+\r
+   halIntOff();\r
+\r
+   // Make sure that the suspend loop does not power down the chip again\r
+   usbsuspStopPm1();\r
+   usbirqData.inSuspend = FALSE;\r
+\r
+   // Perform remote wakeup by holding the USB resume signal for 10 ms\r
+   USBPOW |= 0x04;\r
+   halMcuWaitMs(10); // ms\r
+   USBPOW &= ~0x04;\r
+\r
+   // Clear and disable the interrupt flag\r
+   HAL_USB_RESUME_INT_DISABLE();\r
+   HAL_USB_RESUME_INT_CLEAR();\r
+\r
+   halIntOn();\r
+\r
+   return TRUE;\r
+\r
+} // usbsuspDoRemoteWakeup\r
+\r
+\r
+\r
+\r
+/** \brief Internal function, do not call from application..\r
+ *\r
+ * This internal function is called by the P0 "USB resume and reset" detection interrupt, and by\r
+ * \ref usbsuspDoRemoteWakeup() to prevent \ref usbsuspEnter() from putting the device back in power\r
+ * mode 1. \ref usbsuspEnter() will, however, not break out of the suspend loop until the resume event\r
+ * has been received.\r
+ */\r
+void usbsuspStopPm1(void)\r
+{\r
+\r
+   // Disable the "ORL SLEEP, #0x01" instruction to make sure we avoid having\r
+   // SLEEP.MODE != 0 after MCU has resumed to active mode. Otherwise all port\r
+   // and sleep timer interrupts will be blocked.\r
+   usbsuspEnterXdata[5] = 0x00; // Change it to: "ORL SLEEP, #0x00" (no effect)\r
+\r
+   // Remove the "MOV PCON, #0x01" instruction (which puts MCU into power mode 1) from the suspend\r
+   // loop\r
+   usbsuspEnterXdata[6] = 0x00; // NOP\r
+   usbsuspEnterXdata[7] = 0x00; // NOP\r
+   usbsuspEnterXdata[8] = 0x00; // NOP\r
+\r
+} // usbsuspStopPm1\r
+\r
+//@}\r
+/*\r
++------------------------------------------------------------------------------\r
+|  Copyright 2004-2007 Texas Instruments Incorporated. All rights reserved.\r
+|\r
+|  IMPORTANT: Your use of this Software is limited to those specific rights\r
+|  granted under the terms of a software license agreement between the user who\r
+|  downloaded the software, his/her employer (which must be your employer) and\r
+|  Texas Instruments Incorporated (the "License"). You may not use this Software\r
+|  unless you agree to abide by the terms of the License. The License limits\r
+|  your use, and you acknowledge, that the Software may not be modified, copied\r
+|  or distributed unless embedded on a Texas Instruments microcontroller or used\r
+|  solely and exclusively in conjunction with a Texas Instruments radio\r
+|  frequency transceiver, which is integrated into your product. Other than for\r
+|  the foregoing purpose, you may not use, reproduce, copy, prepare derivative\r
+|  works of, modify, distribute, perform, display or sell this Software and/or\r
+|  its documentation for any purpose.\r
+|\r
+|  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE\r
+|  PROVIDED \93AS IS\94 WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED,\r
+|  INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE,\r
+|  NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL\r
+|  TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+|  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER\r
+|  LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING\r
+|  BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR\r
+|  CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT OF\r
+|  SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES\r
+|  (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+|\r
+|  Should you have any questions regarding your right to use this Software,\r
+|  contact Texas Instruments Incorporated at www.TI.com.\r
+|\r
++------------------------------------------------------------------------------\r
+*/\r
diff --git a/chronos-ti/Software Projects/RF Access Point/IAR/usb/library/usb_descriptor.h b/chronos-ti/Software Projects/RF Access Point/IAR/usb/library/usb_descriptor.h
new file mode 100755 (executable)
index 0000000..122f0e1
--- /dev/null
@@ -0,0 +1,199 @@
+/***********************************************************************************\r
+\r
+    Filename:     usb_descriptor.h\r
+\r
+    Description:  Interface to USB descriptors.\r
+\r
+***********************************************************************************/\r
+#ifndef USBDESCRIPTOR_H\r
+#define USBDESCRIPTOR_H\r
+\r
+\r
+#ifndef ASM_FILE\r
+#include "usb_framework_structs.h"\r
+#endif\r
+\r
+/** \addtogroup module_usb_descriptor  USB Descriptor\r
+ * \brief This module contains contains USB descriptor definitions, and guidelines on how to write\r
+ * descriptor sets that work with the USB library.\r
+ *\r
+ * Information on the specific USB descriptor types is available in the USB 2.0 specification and\r
+ * in device class documentation. Examples of complete descriptor sets can be found in the Chipcon USB\r
+ * application examples.\r
+ *\r
+ * \section section_usbdsc_standard Standard Descriptors\r
+ * The library requires the USB descriptor set to be organized as follows:\r
+ * - Device descriptor (\ref USB_DEVICE_DESCRIPTOR)\r
+ *     - Configuration descriptor (\ref USB_CONFIGURATION_DESCRIPTOR)\r
+ *         - Interface descriptor (\ref USB_INTERFACE_DESCRIPTOR)\r
+ *             - Endpoint descriptor (\ref USB_ENDPOINT_DESCRIPTOR)\r
+ *             - More endpoint descriptors\r
+ *         - More interface descriptors\r
+ *     - More configuration descriptors\r
+ * - String descriptor (\ref USB_STRING_DESCRIPTOR)\r
+ * - More string descriptors\r
+ *\r
+ * Different USB device classes, such as "HID" and "Audio", may add other standard format descriptor\r
+ * types to the hierarchy, and even extend the existing types. This is also supported by the library.\r
+ *\r
+ * Refer to the \ref module_usb_descriptor_parser module for information on\r
+ * \li Where in memory the descriptor set can be placed\r
+ * \li How to set the required markers (symbols), \ref usbDescStart and \ref usbDescEnd.\r
+ *\r
+ * \section section_usbdsc_other Other Descriptors\r
+ * Differently formatted descriptors are not supported by the parsing mechanism, and are instead located\r
+ * through a \ref DESC_LUT_INFO look-up table. Each entry in the \ref usbDescLut table contains the\r
+ * index and value parameters for relevant \ref GET_DESCRIPTOR requests, and the locations and lengths\r
+ * of the corresponding descriptors:\r
+ * \code\r
+ *                 ; Make the symbols public\r
+ *                 PUBLIC usbDescLut;\r
+ *                 PUBLIC usbDescLutEnd;\r
+ *\r
+ *                 ...\r
+ *\r
+ * usbDescLut:     DB HID_REPORT,  00H                         ; value (MSB, LSB)\r
+ *                 DB 00H,         00H                         ; index (MSB, LSB)\r
+ *                 DW hidReportDesc0Start                      ; pDescStart\r
+ *                 DW hidReportDesc0End - hidReportDesc0Start  ; length\r
+ *\r
+ *                 DB HID_REPORT,  01H                         ; value (MSB, LSB)\r
+ *                 DB 00H,         00H                         ; index (MSB, LSB)\r
+ *                 DW hidReportDesc1Start                      ; pDescStart\r
+ *                 DW hidReportDesc1End - hidReportDesc1Start  ; length\r
+ * usbDescLutEnd:\r
+ * \endcode\r
+ *\r
+ * An additional look-up table is needed configure endpoint double-buffering. The table must contain one\r
+ * \ref DBLBUF_LUT_INFO entry for each interface descriptor with non-zero \c bNumEndpoints:\r
+ * \code\r
+ *                 ; Make the symbol public\r
+ *                 PUBLIC usbDblbufLut;\r
+ *\r
+ *                 ...\r
+ *\r
+ * usbDblbufLut:   DW interface0Desc  ; pInterface\r
+ *                 DB 02H             ; inMask   (example: EP1 IN is double-buffered)\r
+ *                 DB 00H             ; outMask  (example: No double-buffered OUT endpoints)\r
+ *\r
+ *                 DW interface1Desc  ; pInterface\r
+ *                 DB 10H             ; inMask   (example: EP4 IN is double-buffered)\r
+ *                 DB 08H             ; outMask  (example: EP3 OUT is double-buffered)\r
+ * \endcode\r
+ * @{\r
+ */\r
+\r
+\r
+#ifdef EXTERN\r
+   #undef EXTERN\r
+#endif\r
+#ifdef USBDESCRIPTORPARSER_C\r
+   #define EXTERN ///< Definition used only for usb_descriptor_parser.c\r
+#else\r
+   #define EXTERN extern ///< Definition used in other source files to declare external\r
+#endif\r
+\r
+\r
+//-------------------------------------------------------------------------------------------------------\r
+/// \name Sizes\r
+//@{\r
+#define EP0_PACKET_SIZE          32  ///< The maximum data packet size for endpoint 0\r
+//@}\r
+\r
+/// \name Standard Descriptor Types\r
+//@{\r
+#define DESC_TYPE_DEVICE       0x01  ///< Device\r
+#define DESC_TYPE_CONFIG       0x02  ///< Configuration\r
+#define DESC_TYPE_STRING       0x03  ///< String\r
+#define DESC_TYPE_INTERFACE    0x04  ///< Interface\r
+#define DESC_TYPE_ENDPOINT     0x05  ///< Endpoint\r
+//@}\r
+\r
+/// \name HID Class Descriptor Types\r
+//@{\r
+#define DESC_TYPE_HID          0x21  ///< HID descriptor (included in the interface descriptor)\r
+#define DESC_TYPE_HIDREPORT    0x22  ///< Report descriptor (referenced in \ref usbDescLut)\r
+//@}\r
+\r
+/// \name Endpoint Types\r
+//@{\r
+#define EP_ATTR_CTRL           0x00  ///< Control (endpoint 0 only)\r
+#define EP_ATTR_ISO            0x01  ///< Isochronous (not acknowledged)\r
+#define EP_ATTR_BULK           0x02  ///< Bulk\r
+#define EP_ATTR_INT            0x03  ///< Interrupt (guaranteed polling interval)\r
+#define EP_ATTR_TYPE_BM        0x03  ///< Endpoint type bitmask\r
+//@}\r
+//-------------------------------------------------------------------------------------------------------\r
+\r
+\r
+#ifndef ASM_FILE\r
+\r
+//-------------------------------------------------------------------------------------------------------\r
+/// \name USB Descriptor Marker\r
+//@{\r
+/// USB descriptor markers which the USB Firmware Library imports from the application\r
+typedef struct {\r
+    uint8 __code* const pUsbDescStart;           ///< USB descriptor start pointer\r
+    uint8 __code* const pUsbDescEnd;             ///< USB descriptor end pointer\r
+    DESC_LUT_INFO __code* const pUsbDescLut;     ///< Start of USB desc look-up table pointer\r
+    DESC_LUT_INFO __code* const pUsbDescLutEnd;  ///< End of USB desc look-up table pointer\r
+    DBLBUF_LUT_INFO __code* const pUsbDblbufLut; ///< Start of double-buffering look-up table pointer\r
+    DBLBUF_LUT_INFO __code* const pUsbDblbufLutEnd; ///< End of double-buffering look-up table pointer\r
+} USB_DESCRIPTOR_MARKER;\r
+\r
+extern USB_DESCRIPTOR_MARKER __xdata usbDescriptorMarker; ///< USB descriptor marker\r
+\r
+//-------------------------------------------------------------------------------------------------------\r
+\r
+// Import marker symbols for the USB descriptor to use (from <app>_usb_descriptor.s51)\r
+// They need to be defined here or in application FW\r
+// The source file <app>_usb_descriptor.s51 need to use these names, or update\r
+// the names used here with the ones used in <app>_usb_descriptor.s51.\r
+extern void __code* usbDescStart;       ///< Pointer to start of (standard) USB descriptor\r
+extern void __code* usbDescEnd;         ///< Pointer to end of (standard) USB descriptor\r
+extern void __code* usbDescLut;         ///< Pointer to start of lookup table for non-standard USB descriptors\r
+extern void __code* usbDescLutEnd;      ///< Pointer to end of lookup table for non-standard USB descriptors\r
+extern void __code* usbDblbufLut;       ///< Pointer to start of lookup table for endpoints' double-buffer settings\r
+extern void __code* usbDblbufLutEnd;    ///< Pointer to end of lookup table for endpoints' double-buffer settings\r
+//@}\r
+\r
+\r
+#endif // ASM_FILE\r
+//@}\r
+\r
+/*\r
++------------------------------------------------------------------------------\r
+|  Copyright 2004-2009 Texas Instruments Incorporated. All rights reserved.\r
+|\r
+|  IMPORTANT: Your use of this Software is limited to those specific rights\r
+|  granted under the terms of a software license agreement between the user who\r
+|  downloaded the software, his/her employer (which must be your employer) and\r
+|  Texas Instruments Incorporated (the "License"). You may not use this Software\r
+|  unless you agree to abide by the terms of the License. The License limits\r
+|  your use, and you acknowledge, that the Software may not be modified, copied\r
+|  or distributed unless embedded on a Texas Instruments microcontroller or used\r
+|  solely and exclusively in conjunction with a Texas Instruments radio\r
+|  frequency transceiver, which is integrated into your product. Other than for\r
+|  the foregoing purpose, you may not use, reproduce, copy, prepare derivative\r
+|  works of, modify, distribute, perform, display or sell this Software and/or\r
+|  its documentation for any purpose.\r
+|\r
+|  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE\r
+|  PROVIDED \93AS IS\94 WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED,\r
+|  INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE,\r
+|  NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL\r
+|  TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+|  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER\r
+|  LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING\r
+|  BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR\r
+|  CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT OF\r
+|  SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES\r
+|  (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+|\r
+|  Should you have any questions regarding your right to use this Software,\r
+|  contact Texas Instruments Incorporated at www.TI.com.\r
+|\r
++------------------------------------------------------------------------------\r
+*/\r
+\r
+#endif\r
diff --git a/chronos-ti/Software Projects/RF Access Point/IAR/usb/library/usb_descriptor_parser.c b/chronos-ti/Software Projects/RF Access Point/IAR/usb/library/usb_descriptor_parser.c
new file mode 100755 (executable)
index 0000000..45cb6b3
--- /dev/null
@@ -0,0 +1,242 @@
+/***********************************************************************************\r
+\r
+    Filename:     usb_descriptor_parser.c\r
+\r
+    Description:  Parser for USB descriptor structures.\r
+\r
+***********************************************************************************/\r
+\r
+/// \addtogroup module_usb_descriptor_parser\r
+/// @{\r
+#define USBDESCRIPTORPARSER_C ///< Modifies the behavior of "EXTERN" in usb_descriptor_parser.h\r
+#include "usb_firmware_library_headers.h"\r
+\r
+//-------------------------------------------------------------------------------------------------------\r
+// USBDP internal module data\r
+static USBDP_DATA __xdata usbdpData; ///< USBDP internal module data\r
+\r
+\r
+/** \brief     Initializes a search\r
+*\r
+* This function must be called before each new search to reset \ref USBDP_DATA.pDesc.\r
+*/\r
+void usbdpInit(void)\r
+{\r
+   usbdpData.pDesc = (const uint8 __code *) usbDescriptorMarker.pUsbDescStart;\r
+} // usbdpInit\r
+\r
+\r
+\r
+\r
+/** \brief     Locates the descriptor of the wanted type\r
+*\r
+* This function parses through the USB descriptors until:\r
+* \li It hits one with <tt>bDescriptorType = wantedType</tt>, in which case it returns a pointer to\r
+*     that descriptor, and exits. \ref USBDP_DATA.pDesc will then point to the next descriptor.\r
+* \li It hits one with <tt>bDescriptorType = haltAtType</tt>, in which case it returns a NULL-pointer,\r
+*     and exits. \ref USBDP_DATA.pDesc will then point to that descriptor.\r
+* \li \ref USBDP_DATA.pDesc = \ref usbDescEnd, in which case it returns a NULL-pointer, and exits.\r
+*     \ref USBDP_DATA.pDesc will continue to point to \ref usbDescEnd.\r
+*\r
+* \note To begin a search with this function, \ref usbdpInit should be called first. It should not be\r
+*       called when continuing a search - for instance after a call to \ref usbdpGetConfigurationDesc().\r
+*\r
+* \param[in]       wantedType\r
+*     The wanted descriptor type (e.g. \ref DESC_TYPE_CONFIG)\r
+* \param[in]       haltAtType\r
+*     The parser halts when it reaches this descriptor type, unless \c haltAtType is \c 0 (which in any\r
+*     case is an invalid \c bDescriptorType value).\r
+*\r
+* \return\r
+*     A pointer to the wanted descriptor type, or \c NULL if it was not found.\r
+*/\r
+void __code* usbdpFindNext(uint8 wantedType, uint8 haltAtType)\r
+{\r
+   void __code *pResult;\r
+   pResult = NULL;\r
+\r
+   // As long as we haven't reached the end...\r
+   while (usbdpData.pDesc != (void __code *) usbDescriptorMarker.pUsbDescEnd) {\r
+\r
+      // If we have a match on wantedType...\r
+      if (usbdpData.pDesc[DESC_TYPE_IDX] == wantedType) {\r
+         pResult = (void __code*) usbdpData.pDesc;\r
+         usbdpData.pDesc += usbdpData.pDesc[DESC_LENGTH_IDX];\r
+         break;\r
+\r
+      // If we have a match on haltAtType...\r
+      } else if (usbdpData.pDesc[DESC_TYPE_IDX] == haltAtType) {\r
+         if (haltAtType) break;\r
+      }\r
+\r
+      // Move on to the next descriptor\r
+      usbdpData.pDesc += usbdpData.pDesc[DESC_LENGTH_IDX];\r
+   }\r
+\r
+   return pResult;\r
+} // usbdpFindNext\r
+\r
+\r
+\r
+\r
+/** \brief     Locates the (one and only) device descriptor\r
+*\r
+* \note It is not necessary to call \ref usbdpInit() before this function.\r
+*\r
+* \return\r
+*     A pointer to the \ref USB_DEVICE_DESCRIPTOR, or \c NULL if it was not found.\r
+*/\r
+USB_DEVICE_DESCRIPTOR __code* usbdpGetDeviceDesc(void)\r
+{\r
+   usbdpInit();\r
+   return usbdpFindNext(DESC_TYPE_DEVICE, 0);\r
+} // usbdpGetDeviceDesc\r
+\r
+\r
+\r
+\r
+/** \brief     Locates a configuration descriptor\r
+*\r
+* The search will either look for a descriptor with a specific\r
+* \ref USB_CONFIGURATION_DESCRIPTOR.bConfigurationValue, or simply take the n'th descriptor (by "index")\r
+*\r
+* \note It is not necessary to call \ref usbdpInit() before this function.\r
+*\r
+* \param[in]       cfgValue\r
+*     The configuration value to search for (\ref USB_CONFIGURATION_DESCRIPTOR.bConfigurationValue), or\r
+*     0 to find descriptor by index\r
+* \param[in]       cfgIndex\r
+*     A zero-based index for the configuration descriptor to find.\r
+*     This value is ignored unless \c cfgValue is 0.\r
+*\r
+* \return\r
+*     A pointer to the \ref USB_DEVICE_DESCRIPTOR, or \c NULL if it was not found.\r
+*/\r
+USB_CONFIGURATION_DESCRIPTOR __code* usbdpGetConfigurationDesc(uint8 cfgValue, uint8 cfgIndex)\r
+{\r
+   USB_CONFIGURATION_DESCRIPTOR __code *pConfigurationDesc;\r
+   usbdpInit();\r
+\r
+   // As long as there are more configuration descriptors...\r
+   while (pConfigurationDesc = usbdpFindNext(DESC_TYPE_CONFIG, 0)) {\r
+\r
+      // Search by value?\r
+      if (cfgValue) {\r
+         if (cfgValue == pConfigurationDesc->bConfigurationValue) break;\r
+\r
+      // Search by index? (search cfgIndex+1 times)\r
+      } else if (!cfgIndex--) {\r
+         break;\r
+      }\r
+   }\r
+\r
+   return pConfigurationDesc;\r
+} // usbdpGetConfigurationDesc\r
+\r
+\r
+\r
+\r
+/** \brief     Locates an interface descriptor\r
+*\r
+* The function will first go to the configuration descriptor that matches the supplied configuration\r
+* value, and then locate the interface descriptor that matches the given interface number and alternate\r
+* setting.\r
+*\r
+* \note It is not necessary to call \ref usbdpInit() before this function.\r
+*\r
+* \param[in]       cfgValue\r
+*     The configuration value (\ref USB_CONFIGURATION_DESCRIPTOR.bConfigurationValue)\r
+* \param[in]       intNumber\r
+*     The interface number (\ref USB_INTERFACE_DESCRIPTOR.bInterfaceNumber)\r
+* \param[in]       altSetting\r
+*     The alternate setting (\ref USB_INTERFACE_DESCRIPTOR.bAlternateSetting)\r
+*\r
+* \return\r
+*     A pointer to the \ref USB_INTERFACE_DESCRIPTOR, or \c NULL if it was not found.\r
+*/\r
+USB_INTERFACE_DESCRIPTOR __code* usbdpGetInterfaceDesc(uint8 cfgValue, uint8 intNumber, uint8 altSetting)\r
+{\r
+   USB_INTERFACE_DESCRIPTOR __code *pInterfaceDesc;\r
+\r
+   // First get to the correct configuration\r
+   usbdpGetConfigurationDesc(cfgValue, 0);\r
+\r
+   // Then find a match on the interface\r
+   while (pInterfaceDesc = usbdpFindNext(DESC_TYPE_INTERFACE, DESC_TYPE_CONFIG)) {\r
+      if ((pInterfaceDesc->bInterfaceNumber == intNumber) && (pInterfaceDesc->bAlternateSetting == altSetting)) {\r
+         break;\r
+      }\r
+   }\r
+\r
+   return pInterfaceDesc;\r
+} // usbdpGetInterfaceDesc\r
+\r
+\r
+\r
+\r
+/** \brief     Locates a string descriptor\r
+*\r
+* \note It is not necessary to call \ref usbdpInit() before this function.\r
+*\r
+* \param[in]       strIndex\r
+*     A zero-based index that matches the "iXxxxxxxxxx" string indexes in the other descriptors\r
+*\r
+* \return\r
+*     A pointer to the \ref USB_INTERFACE_DESCRIPTOR, or \c NULL if it was not found.\r
+*/\r
+USB_STRING_DESCRIPTOR __code* usbdpGetStringDesc(uint8 strIndex)\r
+{\r
+   USB_STRING_DESCRIPTOR __code *pStringDesc;\r
+   usbdpInit();\r
+\r
+#ifdef MS_EXT_C_ID\r
+    if (strIndex == 0xEE){\r
+        // Find the Microsoft OS String Descriptor\r
+        do{\r
+            pStringDesc = usbdpFindNext(DESC_TYPE_STRING, 0);\r
+        }while (pStringDesc != NULL && pStringDesc->bLength != 18);\r
+    } else\r
+#endif\r
+    {\r
+        // Search strIndex+1 times\r
+        do {\r
+            pStringDesc = usbdpFindNext(DESC_TYPE_STRING, 0);\r
+        } while (strIndex--);\r
+    }\r
+   return pStringDesc;\r
+} // usbdpGetStringDesc\r
+/// @}\r
+/*\r
++------------------------------------------------------------------------------\r
+|  Copyright 2004-2007 Texas Instruments Incorporated. All rights reserved.\r
+|\r
+|  IMPORTANT: Your use of this Software is limited to those specific rights\r
+|  granted under the terms of a software license agreement between the user who\r
+|  downloaded the software, his/her employer (which must be your employer) and\r
+|  Texas Instruments Incorporated (the "License"). You may not use this Software\r
+|  unless you agree to abide by the terms of the License. The License limits\r
+|  your use, and you acknowledge, that the Software may not be modified, copied\r
+|  or distributed unless embedded on a Texas Instruments microcontroller or used\r
+|  solely and exclusively in conjunction with a Texas Instruments radio\r
+|  frequency transceiver, which is integrated into your product. Other than for\r
+|  the foregoing purpose, you may not use, reproduce, copy, prepare derivative\r
+|  works of, modify, distribute, perform, display or sell this Software and/or\r
+|  its documentation for any purpose.\r
+|\r
+|  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE\r
+|  PROVIDED \93AS IS\94 WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED,\r
+|  INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE,\r
+|  NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL\r
+|  TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+|  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER\r
+|  LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING\r
+|  BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR\r
+|  CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT OF\r
+|  SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES\r
+|  (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+|\r
+|  Should you have any questions regarding your right to use this Software,\r
+|  contact Texas Instruments Incorporated at www.TI.com.\r
+|\r
++------------------------------------------------------------------------------\r
+*/\r
diff --git a/chronos-ti/Software Projects/RF Access Point/IAR/usb/library/usb_descriptor_parser.h b/chronos-ti/Software Projects/RF Access Point/IAR/usb/library/usb_descriptor_parser.h
new file mode 100755 (executable)
index 0000000..9cad6fb
--- /dev/null
@@ -0,0 +1,129 @@
+/***********************************************************************************\r
+\r
+    Filename:     usb_descriptor_parser.h\r
+\r
+    Description:  Parser for USB descriptor structures.\r
+\r
+***********************************************************************************/\r
+\r
+#ifndef USBDESCRIPTORPARSER_H\r
+#define USBDESCRIPTORPARSER_H\r
+/** \addtogroup module_usb_descriptor_parser  USB Descriptor Parser (usbdp)\r
+ * \brief This module contains internally used functions for locating USB descriptors.\r
+ *\r
+ * The parsing mechanism supports all standard descriptors, i.e. DEVICE, CONFIGURATION, INTERFACE,\r
+ * ENDPOINT and STRING, but also other types that use the standard descriptor format:\r
+ * \code\r
+ * typedef struct {\r
+ *    uint8 bLength;                // Size of this descriptor (in bytes)\r
+ *    uint8 bDescriptorType;        // Descriptor type\r
+ *    ...\r
+ * } USB_XXXXXXXX_DESCRIPTOR;\r
+ * \endcode\r
+ *\r
+ * \section section_usbdp_requirements Requirements\r
+ * The standard-formatted descriptors must be placed back-to-back in either XDATA or CODE memory.\r
+ * In the current version of the library, the USB descriptors are assumed to reside in CODE.\r
+ * Two markers (XDATA or CODE memory pointers), \ref usbDescStart and \ref usbDescEnd, define where\r
+ * the first descriptor begins and where the last descriptor ends, respectively\r
+ * (so that <tt>usbDescStart - usbDescEnd</tt> equals the total length of the descriptors).\r
+ *\r
+ * The markers can be dynamic, provided that they are not changed while the descriptor parser is in use.\r
+ * However, in most cases the USB descriptor set will be static, hence the markers are also static.\r
+ * The following example shows how static markers are declared and made public in 8051 assembler:\r
+ * \code\r
+ *                 ; Make the symbols public\r
+ *                 PUBLIC usbDescStart;\r
+ *                 PUBLIC usbDescEnd;\r
+ *\r
+ *                 ...\r
+ *\r
+ * usbDescStart:\r
+ * deviceDesc:     ; Device descriptor (the first descriptor)\r
+ *                 DB deviceDescEnd - deviceDesc\r
+ *                 DB DESC_TYPE_DEVICE  ; bDescriptorType\r
+ *                 DB 10H, 01H          ; bcdUSB\r
+ *                 DB 00H               ; bDeviceClass\r
+ *                 DB 00H               ; bDeviceSubClass\r
+ *\r
+ *                 ...\r
+ *\r
+ * string3Desc:    ; String descriptor: Serial number (the last descriptor)\r
+ *                 DB string3DescEnd - string3Desc;\r
+ *                 DB DESC_TYPE_STRING  ; bDescriptorType\r
+ *                 DB '1', 0;\r
+ *                 DB '2', 0;\r
+ *                 DB '3', 0;\r
+ * string3DescEnd:\r
+ * usbDescEnd:\r
+ * \endcode\r
+ * @{\r
+ */\r
+\r
+#include "usb_descriptor.h"\r
+\r
+\r
+//-------------------------------------------------------------------------------------------------------\r
+\r
+\r
+//-------------------------------------------------------------------------------------------------------\r
+/// \name Indexes Into USB Descriptors\r
+//@{\r
+#define DESC_LENGTH_IDX             0 ///< Index of the bLength field (all descriptors)\r
+#define DESC_TYPE_IDX               1 ///< Index of the bDescriptorType field (all descriptors)\r
+#define DESC_CONFIG_LENGTH_LSB_IDX  2 ///< Index of LOUINT8(USB_CONFIGURATION_DESCRIPTOR.wTotalLength)\r
+#define DESC_CONFIG_LENGTH_MSB_IDX  3 ///< Index of HIUINT8(USB_CONFIGURATION_DESCRIPTOR.wTotalLength)\r
+//@}\r
+//-------------------------------------------------------------------------------------------------------\r
+\r
+\r
+//-------------------------------------------------------------------------------------------------------\r
+// Function prototypes\r
+void usbdpInit(void);\r
+void __code *usbdpFindNext(uint8 wantedType, uint8 haltAtType);\r
+\r
+USB_DEVICE_DESCRIPTOR __code* usbdpGetDeviceDesc(void);\r
+USB_CONFIGURATION_DESCRIPTOR __code* usbdpGetConfigurationDesc(uint8 cfgValue, uint8 cfgIndex);\r
+USB_INTERFACE_DESCRIPTOR __code* usbdpGetInterfaceDesc(uint8 cfgValue, uint8 intNumber, uint8 altSetting);\r
+USB_STRING_DESCRIPTOR __code* usbdpGetStringDesc(uint8 strIndex);\r
+//-------------------------------------------------------------------------------------------------------\r
+\r
+\r
+//@}\r
+\r
+/*\r
++------------------------------------------------------------------------------\r
+|  Copyright 2004-2007 Texas Instruments Incorporated. All rights reserved.\r
+|\r
+|  IMPORTANT: Your use of this Software is limited to those specific rights\r
+|  granted under the terms of a software license agreement between the user who\r
+|  downloaded the software, his/her employer (which must be your employer) and\r
+|  Texas Instruments Incorporated (the "License"). You may not use this Software\r
+|  unless you agree to abide by the terms of the License. The License limits\r
+|  your use, and you acknowledge, that the Software may not be modified, copied\r
+|  or distributed unless embedded on a Texas Instruments microcontroller or used\r
+|  solely and exclusively in conjunction with a Texas Instruments radio\r
+|  frequency transceiver, which is integrated into your product. Other than for\r
+|  the foregoing purpose, you may not use, reproduce, copy, prepare derivative\r
+|  works of, modify, distribute, perform, display or sell this Software and/or\r
+|  its documentation for any purpose.\r
+|\r
+|  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE\r
+|  PROVIDED \93AS IS\94 WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED,\r
+|  INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE,\r
+|  NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL\r
+|  TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+|  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER\r
+|  LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING\r
+|  BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR\r
+|  CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT OF\r
+|  SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES\r
+|  (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+|\r
+|  Should you have any questions regarding your right to use this Software,\r
+|  contact Texas Instruments Incorporated at www.TI.com.\r
+|\r
++------------------------------------------------------------------------------\r
+*/\r
+\r
+#endif\r
diff --git a/chronos-ti/Software Projects/RF Access Point/IAR/usb/library/usb_framework.c b/chronos-ti/Software Projects/RF Access Point/IAR/usb/library/usb_framework.c
new file mode 100755 (executable)
index 0000000..d9fe76d
--- /dev/null
@@ -0,0 +1,333 @@
+/***********************************************************************************\r
+\r
+    Filename:     usb_framework.c\r
+\r
+    Description:  USB library common functionality.\r
+\r
+***********************************************************************************/\r
+\r
+/// \addtogroup module_usb_framework\r
+/// @{\r
+#define USBFRAMEWORK_C ///< Modifies the behavior of "EXTERN" in usb_framework.h\r
+#include "usb_firmware_library_headers.h"\r
+#include "hal_int.h"\r
+#include "hal_board.h"\r
+\r
+// Function pointer used by usbfwSetupHandler()\r
+static VFPTR __data ProcessFunc;\r
+\r
+/** \brief Initializes the USB framework\r
+ *\r
+ * This function should be called when the microcontroller is ready to accept USB traffic. It enables the\r
+ * USB peripheral unit and enables the pull-up resistor on the D+ line. Endpoint status, current\r
+ * configuration value, etc. are initialized and evenetually re-initialized in the\r
+ * \ref usbfwResetHandler() function.\r
+ */\r
+void usbfwInit(void)\r
+{\r
+    // Set default values\r
+    usbfwData.selfPowered = (usbdpGetConfigurationDesc(1, 0)->bmAttributes & 0x40) ? TRUE : FALSE;\r
+    usbfwData.remoteWakeup = FALSE;\r
+\r
+    HAL_USB_ENABLE();\r
+\r
+    // Enable Resume Interrupt\r
+    HAL_USB_RESUME_INT_ENABLE();\r
+\r
+} // usbfwInit\r
+\r
+\r
+\r
+\r
+/** \brief Handles USB reset signalling\r
+ *\r
+ * This function should be called, either from the USB interrupt or the main loop, when the \c USBCIF.RST\r
+ * flag has been set. Keep in mind that all bits in \c USBCIF register are cleared when the register is\r
+ * read. The function puts the device into the default state (not yet addressed), and puts all endpoints\r
+ * (except EP0) into the \ref EP_HALT state\r
+ */\r
+void usbfwResetHandler(void)\r
+{\r
+\r
+   // Reset the USB state\r
+   usbfwData.usbState = DEV_DEFAULT;\r
+   usbfwData.configurationValue = 0;\r
+\r
+   // Reset all endpoints\r
+   usbfwData.ep0Status = EP_IDLE;\r
+   usbfwSetAllEpStatus(EP_HALT);\r
+\r
+   // Reset last function pointer\r
+   ProcessFunc = NULL;\r
+\r
+} // usbfwResetHandler\r
+\r
+\r
+\r
+\r
+/** \brief USB Setup Handler\r
+ *\r
+ * This function should be called either from the USB interrupt or the main loop when the \c USBIIF.EP0IF\r
+ * flag has been set. Keep in mind that all bits in \c USBIIF register are cleared when the register is\r
+ * read. A detailed description of the framework is found in the \ref section_setup_handler_usage\r
+ * section.\r
+ *\r
+ * \note The USB header data is always little-endian, so if a big-endian compiler is used (such as Keil\r
+ * C51), the 16-bit values in the \ref usbSetupHeader must be flipped before they are used.\r
+ */\r
+void usbfwSetupHandler(void)\r
+{\r
+   uint8 controlReg;\r
+   uint8 bytesNow;\r
+   uint8 oldEndpoint;\r
+\r
+   // Save the old index setting, then select endpoint 0 and fetch the control register\r
+   oldEndpoint = USBFW_GET_SELECTED_ENDPOINT();\r
+   USBFW_SELECT_ENDPOINT(0);\r
+   controlReg = USBCS0;\r
+\r
+   // The last transfer was ended prematurely by a new SETUP packet\r
+   if (controlReg & USBCS0_SETUP_END) {\r
+      USBCS0 = USBCS0_CLR_SETUP_END;\r
+      usbfwData.ep0Status = EP_CANCEL;\r
+      if (ProcessFunc) ProcessFunc();\r
+      usbfwData.ep0Status = EP_IDLE;\r
+   }\r
+\r
+   // A STALL handshake was transmitted to the PC\r
+   if (controlReg & USBCS0_SENT_STALL) {\r
+      USBCS0 = 0x00;\r
+      usbfwData.ep0Status = EP_IDLE;\r
+   }\r
+\r
+   // Receive OUT packets\r
+   if (usbfwData.ep0Status == EP_RX) {\r
+\r
+      // Read FIFO\r
+      bytesNow = USBCNT0;\r
+      usbfwReadFifo(&USBF0, bytesNow, usbSetupData.pBuffer);\r
+      usbSetupData.bytesLeft -= bytesNow;\r
+      usbSetupData.pBuffer += bytesNow;\r
+\r
+      // Arm the endpoint\r
+      USBCS0 = usbSetupData.bytesLeft ? USBCS0_CLR_OUTPKT_RDY : (USBCS0_CLR_OUTPKT_RDY | USBCS0_DATA_END);\r
+\r
+      // Make a call to the appropriate request handler when done\r
+      if (usbSetupData.bytesLeft == 0) {\r
+         if (ProcessFunc) ProcessFunc();\r
+         usbfwData.ep0Status = EP_IDLE;\r
+      }\r
+\r
+      // Return here since nothing more will happen until the next interrupt\r
+      USBFW_SELECT_ENDPOINT(oldEndpoint);\r
+      return;\r
+\r
+   // Let the application handle the reception\r
+   } else if (usbfwData.ep0Status == EP_MANUAL_RX) {\r
+      ProcessFunc();\r
+   }\r
+\r
+   // Receive SETUP header\r
+   if (usbfwData.ep0Status == EP_IDLE) {\r
+      if (controlReg & USBCS0_OUTPKT_RDY) {\r
+         usbfwReadFifo(&USBF0, 8, (uint8 __xdata *) &usbSetupHeader);\r
+\r
+         // Handle control transfers individually\r
+         ProcessFunc = NULL;\r
+         switch (usbSetupHeader.requestType & (RT_MASK_TYPE | RT_MASK_DIR)) {\r
+\r
+            // Standard requests with data from the host (OUT)\r
+         case RT_STD_OUT:\r
+            switch (usbSetupHeader.request) {\r
+            case SET_ADDRESS:       usbsrSetAddress(); break;\r
+            case SET_FEATURE:       usbsrSetFeature(); break;\r
+            case CLEAR_FEATURE:     usbsrClearFeature(); break;\r
+            case SET_CONFIGURATION: usbsrSetConfiguration(); break;\r
+            case SET_INTERFACE:     usbsrSetInterface(); break;\r
+            case SET_DESCRIPTOR:    /*usbsrHookSetDescriptor(); break; - unsupported */\r
+            default:                usbfwData.ep0Status = EP_STALL; break;\r
+            }\r
+            break;\r
+\r
+            // Standard requests with data to the host (IN)\r
+         case RT_STD_IN:\r
+            switch (usbSetupHeader.request) {\r
+            case GET_STATUS:        usbsrGetStatus(); break;\r
+            case GET_DESCRIPTOR:    usbsrGetDescriptor(); break;\r
+            case GET_CONFIGURATION: usbsrGetConfiguration(); break;\r
+            case GET_INTERFACE:     usbsrGetInterface(); break;\r
+            case SYNCH_FRAME:       /*usbsrHookSynchFrame(); break; - unsupported */\r
+            default:                usbfwData.ep0Status = EP_STALL; break;\r
+            }\r
+            break;\r
+\r
+            // Vendor requests\r
+         case RT_VEND_OUT:\r
+            ProcessFunc = usbvrHookProcessOut; usbvrHookProcessOut();\r
+            break;\r
+         case RT_VEND_IN:\r
+            ProcessFunc = usbvrHookProcessIn; usbvrHookProcessIn();\r
+            break;\r
+\r
+            // Class requests\r
+         case RT_CLASS_OUT:\r
+            ProcessFunc = usbcrHookProcessOut; usbcrHookProcessOut();\r
+            break;\r
+         case RT_CLASS_IN:\r
+            ProcessFunc = usbcrHookProcessIn; usbcrHookProcessIn();\r
+            break;\r
+\r
+            // Unrecognized request: Stall the endpoint\r
+         default:\r
+            usbfwData.ep0Status = EP_STALL;\r
+            break;\r
+         }\r
+\r
+         // Arm/stall the endpoint\r
+         USBCS0 = (usbfwData.ep0Status == EP_STALL) ? (USBCS0_CLR_OUTPKT_RDY | USBCS0_SEND_STALL) : USBCS0_CLR_OUTPKT_RDY;\r
+      }\r
+   }\r
+\r
+   // Transmit IN packets\r
+   if (usbfwData.ep0Status == EP_TX) {\r
+      controlReg = USBCS0_INPKT_RDY;\r
+\r
+      // The last frame should contain 0 to (EP0_PACKET_SIZE - 1) bytes\r
+      if (usbSetupData.bytesLeft < EP0_PACKET_SIZE) {\r
+         bytesNow = usbSetupData.bytesLeft;\r
+         controlReg |= USBCS0_DATA_END;\r
+\r
+         // All other packets should have the maximum length\r
+      } else {\r
+         bytesNow = EP0_PACKET_SIZE;\r
+      }\r
+\r
+      // Load the FIFO and move the pointer\r
+      usbfwWriteFifo(&USBF0, bytesNow, usbSetupData.pBuffer);\r
+      usbSetupData.pBuffer += bytesNow;\r
+      usbSetupData.bytesLeft -= bytesNow;\r
+\r
+      // Arm the FIFO (even for a zero-length packet)\r
+      USBCS0 = controlReg;\r
+\r
+      // Make a call to the appropriate request handler when done\r
+      if (bytesNow < EP0_PACKET_SIZE) {\r
+         if (ProcessFunc) ProcessFunc();\r
+         usbfwData.ep0Status = EP_IDLE;\r
+      }\r
+\r
+   // Let the application handle the transmission\r
+   } else if (usbfwData.ep0Status == EP_MANUAL_TX) {\r
+      ProcessFunc();\r
+   }\r
+\r
+   // Restore the old index setting\r
+   USBFW_SELECT_ENDPOINT(oldEndpoint);\r
+\r
+} // usbfwSetupHandler\r
+\r
+\r
+\r
+\r
+/** \brief Changes the state of endpoint 1-5 IN/OUT\r
+ *\r
+ * This is an internal function used by the library.\r
+ *\r
+ * \param[in]       status\r
+ *     The new status for each endpoint\r
+ */\r
+void usbfwSetAllEpStatus(EP_STATUS status)\r
+{\r
+   uint8 n;\r
+   for (n = 0; n < sizeof(usbfwData.pEpInStatus); n++)\r
+       usbfwData.pEpInStatus[n] = status;\r
+   for (n = 0; n < sizeof(usbfwData.pEpOutStatus); n++)\r
+       usbfwData.pEpOutStatus[n] = status;\r
+} // usbfwSetAllEpStatus\r
+\r
+\r
+\r
+\r
+/** \brief Reads from the selected OUT endpoint FIFO, without using DMA\r
+ *\r
+ * The FIFO must be re-armed after reading it empty (using the \ref USBFW_ARM_OUT_ENDPOINT() macro). This\r
+ * is not necessary when flushing the FIFO.\r
+ *\r
+ * \param[in]       *pFifo\r
+ *     Pointer to the FIFO (\c &USBFx)\r
+ * \param[in]       count\r
+ *     The number of bytes to read\r
+ * \param[in]       *pData\r
+ *     A pointer to the storage location for the read data (in any memory space)\r
+ */\r
+void usbfwReadFifo(uint8 volatile __xdata *pFifo, uint8 count, void __generic *pData)\r
+{\r
+   uint8 __generic *pTemp = pData;\r
+   if (count) {\r
+      do {\r
+         *(pTemp++) = *pFifo;\r
+      } while (--count);\r
+   }\r
+} // usbfwReadFifo\r
+\r
+\r
+\r
+\r
+/** \brief Writes to the selected IN endpoint FIFO, without using DMA\r
+ *\r
+ * Note that the FIFO must be armed in order to be transmitted (using the \ref USBFW_ARM_IN_ENDPOINT()\r
+ * macro).\r
+ *\r
+ * \param[in]       *pFifo\r
+ *     Pointer to the FIFO (\c &USBFx)\r
+ * \param[in]       count\r
+ *     The number of bytes to write\r
+ * \param[in]       *pData\r
+ *     A pointer to the data to be written (from any memory space)\r
+ */\r
+void usbfwWriteFifo(uint8 volatile __xdata *pFifo, uint8 count, void __generic *pData)\r
+{\r
+   uint8 __generic *pTemp = pData;\r
+   if (count) {\r
+      do {\r
+         *pFifo = *(pTemp++);\r
+      } while (--count);\r
+   }\r
+} // usbfwWriteFifo\r
+\r
+\r
+/// @}\r
+/*\r
++------------------------------------------------------------------------------\r
+|  Copyright 2004-2007 Texas Instruments Incorporated. All rights reserved.\r
+|\r
+|  IMPORTANT: Your use of this Software is limited to those specific rights\r
+|  granted under the terms of a software license agreement between the user who\r
+|  downloaded the software, his/her employer (which must be your employer) and\r
+|  Texas Instruments Incorporated (the "License"). You may not use this Software\r
+|  unless you agree to abide by the terms of the License. The License limits\r
+|  your use, and you acknowledge, that the Software may not be modified, copied\r
+|  or distributed unless embedded on a Texas Instruments microcontroller or used\r
+|  solely and exclusively in conjunction with a Texas Instruments radio\r
+|  frequency transceiver, which is integrated into your product. Other than for\r
+|  the foregoing purpose, you may not use, reproduce, copy, prepare derivative\r
+|  works of, modify, distribute, perform, display or sell this Software and/or\r
+|  its documentation for any purpose.\r
+|\r
+|  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE\r
+|  PROVIDED \93AS IS\94 WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED,\r
+|  INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE,\r
+|  NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL\r
+|  TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+|  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER\r
+|  LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING\r
+|  BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR\r
+|  CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT OF\r
+|  SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES\r
+|  (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+|\r
+|  Should you have any questions regarding your right to use this Software,\r
+|  contact Texas Instruments Incorporated at www.TI.com.\r
+|\r
++------------------------------------------------------------------------------\r
+*/\r
diff --git a/chronos-ti/Software Projects/RF Access Point/IAR/usb/library/usb_framework.h b/chronos-ti/Software Projects/RF Access Point/IAR/usb/library/usb_framework.h
new file mode 100755 (executable)
index 0000000..ba7311a
--- /dev/null
@@ -0,0 +1,383 @@
+/***********************************************************************************\r
+\r
+    Filename:     usb_framework.h\r
+\r
+    Description:  USB library common functionality.\r
+\r
+***********************************************************************************/\r
+\r
+#ifndef USBFRAMEWORK_H\r
+#define USBFRAMEWORK_H\r
+/** \addtogroup module_usb_framework USB Framework (usbfw)\r
+ * \brief This module contains USB status information, functions for initialization, USB device reset\r
+ * handling, and most importantly, the framework for transfers on endpoint 0, FIFO access, and endpoint\r
+ * control.\r
+ *\r
+ * \section section_init Framework Initialization\r
+ * The framework and the USB peripheral unit can be initialized once the crystal oscillator (48 MHz for\r
+ * CC1111/CC2511, 32 MHz for CC2531) is running. This is done by \ref usbfwInit(), which:\r
+ * \li Initializes framework variables\r
+ * \li Enables the USB peripheral unit by setting the \c SLEEP.USB_EN bit\r
+ * \li Enables the pull-up resistor via a GPIO pin\r
+ *\r
+ * When completing the last step, the host will be recognize the USB device, and start the enumeration\r
+ * process. To reply to the shortly incoming standard requests, the call to \ref usbfwInit() must be\r
+ * followed immediately by USB Interrupt \ref section_usbirq_initialization.\r
+ *\r
+ * \section section_endpoint_0_transfers Endpoint 0 Transfers\r
+ * The USB interface uses endpoint 0 to perform setup requests of the standard, vendor and class types.\r
+ * Such transfers consist of three phases:\r
+ * - A setup phase, where an 8-byte \ref USB_SETUP_HEADER is transferred to the device.\r
+ * - An IN/OUT data phase, if the length field of the \ref USB_SETUP_HEADER structure is non-zero.\r
+ * - A handshake phase, where the application can stall the endpoint to indicate error conditions.\r
+ *\r
+ * The setup handler, \ref usbfwSetupHandler(), takes care of the low-level parts of these transfers,\r
+ * including the IN/OUT buffering during the data phase (when there is one). The transfers fall into two\r
+ * categories:\r
+ * - Most standard requests are processed internally, with little or no intervention form the user\r
+ *   application. This is done by the \ref module_usb_standard_requests module.\r
+ * - Vendor and class requests are application specific and must always be processed by the application.\r
+ *   Whenever such a request is received, the following hooks will be called between the phases:\r
+ *     - \ref usbcrHookProcessOut(): Class requests with OUT data phase\r
+ *     - \ref usbcrHookProcessIn(): Class requests with IN data phase\r
+ *     - \ref usbvrHookProcessOut(): Vendor requests with OUT data phase\r
+ *     - \ref usbvrHookProcessIn(): Vendor requests with IN data phase\r
+ *\r
+ * \section section_setup_handler_usage Setup Handler Usage\r
+ * This section describes what is required to make the vendor and class request hooks work. This\r
+ * information also applies to the standard requests that needs application processing\r
+ * (\ref usbsrHookSetDescriptor(), \ref usbsrHookSynchFrame(), and some cases of\r
+ * \ref usbsrHookSetFeature() and \ref usbsrHookClearFeature()).\r
+ *\r
+ * The transactions are made using a clean and efficient interface, consisting of two data structures and\r
+ * the endpoint 0 status byte:\r
+ * - The endpoint status is initially \ref EP_IDLE, which basically means that the setup handler is ready\r
+ *   for a new setup phase (a new request). Upon an incoming request, the processing hook is called, and\r
+ *   the \ref usbSetupHeader structure contains the 8 bytes received during the setup phase. At this\r
+ *   point there are four different outcomes:\r
+ *     - If the request is unknown or contains errors, the endpoint should be stalled. This is done by\r
+ *       setting the endpoint status to \ref EP_STALL.\r
+ *     - If there is no data phase (the length field is zero), the endpoint status should just remain in\r
+ *       it's current state, \ref EP_IDLE.\r
+ *     - If the request has an IN data phase, the \ref usbSetupData structure must be prepared. This\r
+ *       includes setting a pointer to where IN data should be taken from, and the number of bytes to be\r
+ *       transferred (usually the same number as indicated by the length field, but it can also be a\r
+ *       lower number). The endpoint state is then changed to \ref EP_TX.\r
+ *     - If the request has an OUT data phase, the \ref usbSetupData structure must be prepared. This\r
+ *       includes setting a pointer to where OUT data should be stored, and the number of bytes to be\r
+ *       transferred (always the same number as indicated by the length field). The endpoint state is\r
+ *       then changed to \ref EP_RX.\r
+ * - When the data phase is complete, the processing hook function will be called a second time to notify\r
+ *   the application. Under normal conditions the endpoint status will be either \ref EP_TX or \ref EP_RX,\r
+ *   and does not need to be changed any further (as this is done automatically upon return). If the\r
+ *   endpoint status is \ref EP_CANCEL, it means that the USB host cancelled the setup transfer.\r
+ *\r
+ * The following code examples illustrate practical usage (more code is available in the application\r
+ * example projects):\r
+ *\r
+ * \par Example 1: Endpoint 0 Requests With OUT Data phase\r
+ *\r
+ * \code\r
+ * uint8 pLcdBuffer[358];\r
+ *\r
+ * void usbvrHookProcessOut(void) {\r
+ *\r
+ *    // When this vendor request is received, we should either update a part of pLcdBuffer[] or leave\r
+ *    // it as it is, and then refresh the LCD display. The index field of the setup header contains the\r
+ *    // index of the first character to be updated, and the length field how many characters to update.\r
+ *    if (usbSetupHeader.request == VR_LCD_UPDATE) {\r
+ *\r
+ *       // First the endpoint status is EP_IDLE... (we have just received the Setup packet)\r
+ *       if (usbfwData.ep0Status == EP_IDLE) {\r
+ *\r
+ *          // There is no new data -> Just refresh the display\r
+ *          if (usbSetupHeader.length == 0) {\r
+ *             lcdRefresh();\r
+ *             // There is no change to the endpoint status in this case\r
+ *\r
+ *          // The PC wants to send data that will be stored outside pLcdBuffer -> stall the endpoint!\r
+ *          } else if ((usbSetupHeader.length > sizeof(pLcdBuffer) ||\r
+ *                     (usbSetupHeader.index >= sizeof(pLcdBuffer) ||\r
+ *                     ((usbSetupHeader.index + usbSetupHeader.length) > sizeof(pLcdBuffer)) {\r
+ *             usbfwData.ep0Status = EP_STALL;\r
+ *\r
+ *          // Prepare for OUT data phase, setup the data buffer to receive the LCD data\r
+ *          } else {\r
+ *             usbSetupData.pBuffer = &pLcdBuffer[usbSetupHeader.index];\r
+ *             usbSetupData.bytesLeft = usbSetupHeader.length;\r
+ *             usbfwData.ep0Status = EP_RX;\r
+ *          }\r
+ *\r
+ *       // Then the endpoint status is EP_RX (remember: we did that here when setting up the buffer)\r
+ *       } else if (usbfwData.ep0Status == EP_RX) {\r
+ *          // usbfwSetupHandler() has now updated pLcdBuffer, so all we need to do is refresh the LCD\r
+ *          lcdRefresh();\r
+ *          // usbfwData.ep0Status is automatically reset to EP_IDLE when returning to usbfwSetupHandler()\r
+ *       }\r
+ *\r
+ *    // Unknown vendor request?\r
+ *    } else {\r
+ *       usbfwData.ep0Status = EP_STALL;\r
+ *    }\r
+ * }\r
+ * \endcode\r
+ *\r
+ * \par Example 2: Endpoint 0 Requests With IN Data phase\r
+ *\r
+ * \code\r
+ * uint8 keyBufferPos;\r
+ * BOOL blockKeyboard;\r
+ * char pKeyBuffer[150];\r
+ *\r
+ * void usbvrProcessIn(void) {\r
+ *\r
+ *    // When this vendor request is received, we should send all registered key-strokes, and reset the\r
+ *    // position counter. New keystrokes are blocked during the transfer to avoid overwriting the buffer\r
+ *    // before it has been sent to the host.\r
+ *    if (usbSetupHeader.request == VR_GET_KEYS) {\r
+ *\r
+ *       // First the endpoint status is EP_IDLE...\r
+ *       if (usbfwData.ep0Status == EP_IDLE) {\r
+ *\r
+ *          // Make sure that we do not send more than the PC asked for\r
+ *          if (usbSetupHeader.length < keyBufferPos) {\r
+ *             usbfwData.ep0Status = EP_STALL;\r
+ *\r
+ *          // Otherwise...\r
+ *          } else {\r
+ *             // Block for new keystrokes\r
+ *             blockKeyboard = TRUE;\r
+ *\r
+ *             // Setup the buffer\r
+ *             usbSetupData.pBuffer = pKeyBuffer;\r
+ *             usbSetupData.bytesLeft = keyBufferPos;\r
+ *             usbfwData.ep0Status = EP_TX;\r
+ *\r
+ *             // Reset the position counter\r
+ *             keyBufferPos = 0;\r
+ *          }\r
+ *\r
+ *       // Then the endpoint status is EP_TX (remember: we did that here when setting up the buffer)\r
+ *       } else if (usbfwData.ep0Status == EP_TX) {\r
+ *\r
+ *          // pKeyBuffer has now been sent to the host, so new keystrokes can safely be registered\r
+ *          blockKeyboard = FALSE;\r
+ *\r
+ *          // usbfwData.ep0Status is automatically reset to EP_IDLE when returning to usbfwSetupHandler()\r
+ *       }\r
+ *\r
+ *    // Unknown request?\r
+ *    } else {\r
+ *       usbfwData.ep0Status = EP_STALL;\r
+ *    }\r
+ * }\r
+ * \endcode\r
+ *\r
+ * If automated data transfer is not desired, the application should set \c usbfwData.ep0Status to\r
+ * either \ref EP_MANUAL_RX or \ref EP_MANUAL_TX instead of \ref EP_RX or \ref EP_TX, respectively. Until\r
+ * the transfer is completed, the processing hook function (e.g. \ref usbvrHookProcessIn()) will be called\r
+ * at every endpoint 0 interrupt.\r
+ * @{\r
+ */\r
+#include "hal_defs.h"\r
+#include "usb_framework_structs.h"\r
+\r
+#ifdef EXTERN\r
+   #undef EXTERN\r
+#endif\r
+#ifdef USBFRAMEWORK_C\r
+   #define EXTERN ///< Definition used only for usb_framework.c\r
+#else\r
+   #define EXTERN extern ///< Definition used in other source files to declare external\r
+#endif\r
+\r
+\r
+//-------------------------------------------------------------------------------------------------------\r
+/// \name Module Data\r
+//@{\r
+EXTERN USBFW_DATA __xdata usbfwData; ///< USBFW internal module data\r
+\r
+//@}\r
+//-------------------------------------------------------------------------------------------------------\r
+\r
+\r
+/// \name Setup Handler Data\r
+//@{\r
+EXTERN USB_SETUP_DATA __xdata usbSetupData; ///< Setup handler data phase configuration\r
+EXTERN USB_SETUP_HEADER __xdata usbSetupHeader; ///< Setup header\r
+//@}\r
+//-------------------------------------------------------------------------------------------------------\r
+\r
+\r
+//-------------------------------------------------------------------------------------------------------\r
+/// \name Request Type Fields\r
+//@{\r
+\r
+// Field masks\r
+#define RT_MASK_DIR       0x80  ///< Request direction bit mask\r
+#define RT_MASK_TYPE      0x60  ///< Request type bit mask\r
+#define RT_MASK_RECIP     0x1F  ///< Request recipient bit mask\r
+\r
+// Direction field\r
+#define RT_DIR_IN         0x80  ///< IN Request\r
+#define RT_DIR_OUT        0x00  ///< OUT Request\r
+\r
+// Type field\r
+#define RT_TYPE_STD       0x00  ///< Standard Request\r
+#define RT_TYPE_CLASS     0x20  ///< Class Request\r
+#define RT_TYPE_VEND      0x40  ///< Vendor Request\r
+\r
+// Recipient field\r
+#define RT_RECIP_DEV      0x00  ///< Device Request\r
+#define RT_RECIP_IF       0x01  ///< Interface Request\r
+#define RT_RECIP_EP       0x02  ///< Endpoint Request\r
+#define RT_RECIP_OTHER    0x03  ///< Other Request\r
+\r
+// Type + direction\r
+#define RT_STD_OUT        (RT_TYPE_STD | RT_DIR_OUT)    ///< Standard request, direction is OUT\r
+#define RT_STD_IN         (RT_TYPE_STD | RT_DIR_IN)     ///< Standard request, direction is IN\r
+#define RT_VEND_OUT       (RT_TYPE_VEND | RT_DIR_OUT)   ///< Vendor request, direction is OUT\r
+#define RT_VEND_IN        (RT_TYPE_VEND | RT_DIR_IN)    ///< Vendor request, direction is IN\r
+#define RT_CLASS_OUT      (RT_TYPE_CLASS | RT_DIR_OUT)  ///< Class request, direction is OUT\r
+#define RT_CLASS_IN       (RT_TYPE_CLASS | RT_DIR_IN)   ///< Class request, direction is IN\r
+\r
+// Direction + recepient\r
+#define RT_OUT_DEVICE     (RT_DIR_OUT | RT_RECIP_DEV)   ///< Request made to device, direction is OUT\r
+#define RT_IN_DEVICE      (RT_DIR_IN | RT_RECIP_DEV)    ///< Request made to device, direction is IN\r
+#define RT_OUT_INTERFACE  (RT_DIR_OUT | RT_RECIP_IF)    ///< Request made to interface, direction is OUT\r
+#define RT_IN_INTERFACE   (RT_DIR_IN | RT_RECIP_IF)     ///< Request made to interface, direction is IN\r
+#define RT_OUT_ENDPOINT   (RT_DIR_OUT | RT_RECIP_EP)    ///< Request made to endpoint, direction is OUT\r
+#define RT_IN_ENDPOINT    (RT_DIR_IN | RT_RECIP_EP)     ///< Request made to endpoint, direction is IN\r
+//@}\r
+//-------------------------------------------------------------------------------------------------------\r
+\r
+\r
+//-------------------------------------------------------------------------------------------------------\r
+/// \name Vendor and Class Request Hooks\r
+/// Unused hooks must stall endpoint 0.\r
+//@{\r
+\r
+/// Hook which is called upon reception of a class request with OUT data phase\r
+void usbcrHookProcessOut(void);\r
+/// Hook which is called upon reception of a class request with IN data phase\r
+void usbcrHookProcessIn(void);\r
+/// Hook which is called upon reception of a vendor request with OUT data phase\r
+void usbvrHookProcessOut(void);\r
+/// Hook which is called upon reception of a vendor request with IN data phase\r
+void usbvrHookProcessIn(void);\r
+\r
+//@}\r
+//-------------------------------------------------------------------------------------------------------\r
+\r
+\r
+//-------------------------------------------------------------------------------------------------------\r
+/// \name Endpoint Access Macros\r
+/// Note that the endpoint control registers are indexed, meaning that an endpoint must be selected\r
+/// before the control operations listed below can be used. Interrupts using any of these macros, must\r
+/// save the current selection and restore it upon return.\r
+//@{\r
+\r
+/// Selects which IN/OUT endpoint (by index 0 to 5) to operate on\r
+#define USBFW_SELECT_ENDPOINT(n)            (USBINDEX = (n))\r
+/// Gets the currently selected IN/OUT endpoint\r
+#define USBFW_GET_SELECTED_ENDPOINT()       (USBINDEX)\r
+\r
+/// Stalls the selected IN endpoint\r
+#define USBFW_STALL_IN_ENDPOINT() st (\\r
+    USBCSIL = USBCSIL_SEND_STALL; \\r
+    usbfwData.pEpInStatus[USBINDEX - 1] = EP_HALT; )\r
+\r
+/// Returns the stall condition for the selected IN endpoint\r
+#define USBFW_IN_ENDPOINT_STALLED()         (USBCSIL & USBCSIL_SEND_STALL)\r
+/// Flushes the FIFO for the selected IN endpoint (flush twice when using double-buffering)\r
+#define USBFW_FLUSH_IN_ENDPOINT() st (\\r
+    USBCSIL = USBCSIL_FLUSH_PACKET; \\r
+    while (USBCSIL & USBCSIL_FLUSH_PACKET); )\r
+\r
+/// Arms the selected IN endpoint, so that contents of the endpoint FIFO can be sent to the host\r
+#define USBFW_ARM_IN_ENDPOINT()             (USBCSIL = USBCSIL_INPKT_RDY)\r
+/// Is the selected IN endpoint disarmed?\r
+#define USBFW_IN_ENDPOINT_DISARMED()        !(USBCSIL & USBCSIL_INPKT_RDY)\r
+/// Is the FIFO for the selected IN endpoint empty?\r
+#define USBFW_IN_ENDPOINT_FIFO_EMPTY()      !(USBCSIL & USBCSIL_PKT_PRESENT)\r
+\r
+/// Stalls the selected OUT endpoint\r
+#define USBFW_STALL_OUT_ENDPOINT() st ( \\r
+    USBCSOL = USBCSOL_SEND_STALL; \\r
+    usbfwData.pEpOutStatus[USBINDEX - 1] = EP_HALT; \\r
+}\r
+\r
+/// Returns the stall condition for the selected OUT endpoint\r
+#define USBFW_OUT_ENDPOINT_STALLED()        (USBCSOL & USBCSOL_SEND_STALL)\r
+/// Flushes the FIFO for the selected OUT endpoint (flush twice when using double-buffering)\r
+#define USBFW_FLUSH_OUT_ENDPOINT() st(\\r
+    USBCSOL = USBCSOL_FLUSH_PACKET; \\r
+    while (USBCSOL & USBCSOL_FLUSH_PACKET); )\r
+\r
+/// Arms the selected OUT endpoint, so that the FIFO can receive data from the host\r
+#define USBFW_ARM_OUT_ENDPOINT()            (USBCSOL = 0)\r
+/// Is the selected OUT endpoint disarmed? If so, there is data waiting in the FIFO\r
+#define USBFW_OUT_ENDPOINT_DISARMED()       (USBCSOL & USBCSOL_OUTPKT_RDY)\r
+/// Returns the number of bytes currently in the FIFO of the selected OUT endpoint, low byte\r
+#define USBFW_GET_OUT_ENDPOINT_COUNT_LOW()  (USBCNTL)\r
+/// Returns the number of bytes currently in the FIFO of the selected OUT endpoint, high byte\r
+#define USBFW_GET_OUT_ENDPOINT_COUNT_HIGH() (USBCNTH)\r
+\r
+//@}\r
+//-------------------------------------------------------------------------------------------------------\r
+\r
+// Little endian\r
+#define LOBYTEPTR(w)  ( (uint8 __generic *)(&(w)) + 1 )\r
+// Big endian\r
+//#define LOBYTEPTR(w)  ( (uint8 __generic *)&(w) )\r
+\r
+\r
+\r
+//-------------------------------------------------------------------------------------------------------\r
+// Function prototypes\r
+void usbfwInit(void);\r
+void usbfwResetHandler(void);\r
+void usbfwSetupHandler(void);\r
+void usbfwSetAllEpStatus(EP_STATUS status);\r
+void usbfwWriteFifo(uint8 volatile __xdata *pFifo, uint8 count, void __generic *pData);\r
+void usbfwReadFifo(uint8 volatile __xdata *pFifo, uint8 count, void __generic *pData);\r
+//-------------------------------------------------------------------------------------------------------\r
+\r
+//@}\r
+\r
+/*\r
++------------------------------------------------------------------------------\r
+|  Copyright 2004-2007 Texas Instruments Incorporated. All rights reserved.\r
+|\r
+|  IMPORTANT: Your use of this Software is limited to those specific rights\r
+|  granted under the terms of a software license agreement between the user who\r
+|  downloaded the software, his/her employer (which must be your employer) and\r
+|  Texas Instruments Incorporated (the "License"). You may not use this Software\r
+|  unless you agree to abide by the terms of the License. The License limits\r
+|  your use, and you acknowledge, that the Software may not be modified, copied\r
+|  or distributed unless embedded on a Texas Instruments microcontroller or used\r
+|  solely and exclusively in conjunction with a Texas Instruments radio\r
+|  frequency transceiver, which is integrated into your product. Other than for\r
+|  the foregoing purpose, you may not use, reproduce, copy, prepare derivative\r
+|  works of, modify, distribute, perform, display or sell this Software and/or\r
+|  its documentation for any purpose.\r
+|\r
+|  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE\r
+|  PROVIDED \93AS IS\94 WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED,\r
+|  INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE,\r
+|  NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL\r
+|  TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+|  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER\r
+|  LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING\r
+|  BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR\r
+|  CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT OF\r
+|  SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES\r
+|  (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+|\r
+|  Should you have any questions regarding your right to use this Software,\r
+|  contact Texas Instruments Incorporated at www.TI.com.\r
+|\r
++------------------------------------------------------------------------------\r
+*/\r
+\r
+#endif\r
diff --git a/chronos-ti/Software Projects/RF Access Point/IAR/usb/library/usb_framework_structs.h b/chronos-ti/Software Projects/RF Access Point/IAR/usb/library/usb_framework_structs.h
new file mode 100755 (executable)
index 0000000..4300637
--- /dev/null
@@ -0,0 +1,233 @@
+/***********************************************************************************\r
+\r
+    Filename:     usb_framework_structs.h\r
+\r
+    Description:  USB library common data structures.\r
+\r
+***********************************************************************************/\r
+\r
+#ifndef USBFRAMEWORKSTRUCTS_H\r
+#define USBFRAMEWORKSTRUCTS_H\r
+/** \addtogroup module_usb_framework USB Framework (usbfw)\r
+ * \brief This module contains USB status and descriptor structs\r
+ *\r
+ *\r
+ * @{\r
+ */\r
+#include "hal_types.h"\r
+#include "usb_firmware_library_config.h"\r
+\r
+#ifdef EXTERN\r
+   #undef EXTERN\r
+#endif\r
+#ifdef USBFRAMEWORK_C\r
+   #define EXTERN ///< Definition used only for usb_framework.c\r
+#else\r
+   #define EXTERN extern ///< Definition used in other source files to declare external\r
+#endif\r
+\r
+\r
+//-------------------------------------------------------------------------------------------------------\r
+/// \name Module Data\r
+//@{\r
+\r
+/// Endpoint status (used with USB_INFO.ep0Status / pEpInStatus[] / pEpOutStatus[])\r
+typedef enum {\r
+    EP_IDLE      = 0x00,  ///< The endpoint is idle, or a setup token has been received\r
+    EP_TX        = 0x01,  ///< Setup IN data is transmitted automatically by the framework\r
+    EP_RX        = 0x02,  ///< Setup OUT data is received automatically by the framework\r
+    EP_HALT      = 0x03,  ///< The endpoint is halted (returns stalls to the host)\r
+    EP_STALL     = 0x04,  ///< Send procedural stall in the next status phase\r
+    EP_MANUAL_TX = 0x05,  ///< Setup IN data is transmitted manually by the user application\r
+    EP_MANUAL_RX = 0x06,  ///< Setup OUT data is received manually by the user application\r
+    EP_CANCEL    = 0x07   ///< The current transfer was cancelled by the host\r
+} EP_STATUS;\r
+\r
+/// Device state (used with USB_INFO.usbState)\r
+typedef enum {\r
+   DEV_ATTACHED   = 0x00,  ///< Device attached (invisible state)\r
+   DEV_POWERED    = 0x01,  ///< Device powered (invisible state)\r
+   DEV_DEFAULT    = 0x02,  ///< Default state (the \c USBADDR register is 0)\r
+   DEV_ADDRESS    = 0x03,  ///< Addressed state (the \c USBADDR register has been set)\r
+   DEV_CONFIGURED = 0x04,  ///< Configured state (\c usbfwData.configurationValue != 0)\r
+   DEV_SUSPENDED  = 0x05   ///< Suspended state (never set)\r
+} USB_STATE;\r
+\r
+/// USBFW internal module data\r
+typedef struct {\r
+    USB_STATE usbState;                                           ///< USB device state\r
+    uint8 configurationValue;                                     ///< Current configuration value\r
+    uint8 pAlternateSetting[USB_SETUP_MAX_NUMBER_OF_INTERFACES];  ///< Current alternate settings\r
+    EP_STATUS ep0Status;                                          ///< Endpoint 0 status\r
+    EP_STATUS pEpInStatus[5];                                     ///< Endpoint 1-5 IN status\r
+    EP_STATUS pEpOutStatus[5];                                    ///< Endpoint 1-5 OUT status\r
+    uint8 remoteWakeup;                                           ///< Remote wakeup allowed\r
+    uint8 selfPowered;                                            ///< Is currently self-powered?\r
+} USBFW_DATA;\r
+\r
+//-------------------------------------------------------------------------------------------------------\r
+/// Setup header (contains the 8 bytes received during the setup phase)\r
+typedef struct {\r
+    uint8 requestType;  ///< Request type (direction, type and recipient, see the \c RT_ definitions)\r
+    uint8 request;      ///< Request ID\r
+    uint16 value;       ///< Value field\r
+    uint16 index;       ///< Index field\r
+    uint16 length;      ///< Length of data phase\r
+} USB_SETUP_HEADER;\r
+\r
+/// Setup handler data phase configuration\r
+typedef struct {\r
+    uint8 __generic *pBuffer;  ///< Pointer to where IN/OUT data should be taken from/received\r
+    uint16 bytesLeft;         ///< The number of bytes to transfer\r
+} USB_SETUP_DATA;\r
+\r
+\r
+//@}\r
+//-------------------------------------------------------------------------------------------------------\r
+\r
+// From usb_descriptor.h\r
+/** \addtogroup module_usb_descriptor  USB Descriptor*/\r
+//-------------------------------------------------------------------------------------------------------\r
+/// USB device descriptor\r
+typedef struct {\r
+    uint8 bLength;             ///< Size of this descriptor (in bytes)\r
+    uint8 bDescriptorType;     ///< Descriptor type = \ref DESC_TYPE_DEVICE\r
+    uint16 bcdUSB;             ///< USB specification release number (in BCD, e.g. 0110 for USB 1.1)\r
+    uint8 bDeviceClass;        ///< Device class code\r
+    uint8 bDeviceSubClass;     ///< Device subclass code       \r
+    uint8 bDeviceProtocol;     ///< Device protocol code\r
+    uint8 bMaxPacketSize0;     ///< Maximum packet size for EP0\r
+    uint16 idVendor;           ///< Vendor ID\r
+    uint16 idProduct;          ///< Product ID\r
+    uint16 bcdDevice;          ///< Device release number (in BCD)\r
+    uint8 iManufacturer;       ///< Index of the string descriptor for manufacturer\r
+    uint8 iProduct;            ///< Index of the string descriptor for product\r
+    uint8 iSerialNumber;       ///< Index of the string descriptor for serial number\r
+    uint8 bNumConfigurations;  ///< Number of possible configurations\r
+} USB_DEVICE_DESCRIPTOR;\r
+\r
+/// USB configuration descriptor\r
+typedef struct {\r
+    uint8 bLength;             ///< Size of this descriptor (in bytes)\r
+    uint8 bDescriptorType;     ///< Descriptor type = \ref DESC_TYPE_CONFIG\r
+    uint16 wTotalLength;       ///< Total length of data for this configuration\r
+    uint8 bNumInterfaces;      ///< Number of interfaces supported by this configuration (one-based index)\r
+    uint8 bConfigurationValue; ///< Designator value for this configuration\r
+    uint8 iConfiguration;      ///< Index of the string descriptor for this configuration\r
+    uint8 bmAttributes;        ///< Configuration characteristics\r
+    uint8 bMaxPower;           ///< Maximum power consumption in this configuration (bMaxPower * 2 mA)\r
+} USB_CONFIGURATION_DESCRIPTOR;\r
+\r
+/// USB interface descriptor\r
+typedef struct {\r
+    uint8 bLength;             ///< Size of this descriptor (in bytes)\r
+    uint8 bDescriptorType;     ///< Descriptor type = \ref DESC_TYPE_INTERFACE\r
+    uint8 bInterfaceNumber;    ///< Number of *this* interface (zero-based index)\r
+    uint8 bAlternateSetting;   ///< Alternate setting index for this descriptor (zero-based index)\r
+    uint8 bNumEndpoints;       ///< Number of endpoints for this interface (excl. EP0)\r
+    uint8 bInterfaceClass;     ///< Interface class code\r
+    uint8 bInterfaceSubClass;  ///< Interface subclass code\r
+    uint8 bInterfaceProtocol;  ///< Interface protocol code\r
+    uint8 iInterface;          ///< Index of the string descriptor for this interface\r
+} USB_INTERFACE_DESCRIPTOR;\r
+\r
+/// USB endpoint descriptor\r
+typedef struct {\r
+    uint8 bLength;             ///< Size of this descriptor (in bytes)\r
+    uint8 bDescriptorType;     ///< Descriptor type = \ref DESC_TYPE_ENDPOINT\r
+    uint8 bEndpointAddress;    ///< Endpoint address (direction[7] + number[3:0])\r
+    uint8 bmAttributes;        ///< Endpoint attributes (ISO / BULK / INT)\r
+    uint16 wMaxPacketSize;      ///< Maximum endpoint packet size\r
+    uint8 bInterval;           ///< \ref EP_ATTR_INT : Polling interval (in ms)\r
+} USB_ENDPOINT_DESCRIPTOR;\r
+\r
+/// USB string descriptor\r
+typedef struct {\r
+    uint8 bLength;             ///< Size of this descriptor (in bytes)\r
+    uint8 bDescriptorType;     ///< Descriptor type = \ref DESC_TYPE_STRING\r
+    uint16 pString[1];         ///< Unicode string\r
+} USB_STRING_DESCRIPTOR;\r
+\r
+/// USB HID descriptor\r
+typedef struct {\r
+    uint8 bLength;               ///< Size of this descriptor (in bytes)\r
+    uint8 bDescriptorType;       ///< HID descriptor type\r
+    uint16 bscHID;               ///< HID specification release number (in BCD)\r
+    uint8 bCountryCode;          ///< Hardware target country\r
+    uint8 bNumDescriptors;       ///< Number of HID class descriptors to follow\r
+    uint8 bRDescriptorType;      ///< Report descriptor type\r
+    uint16 wDescriptorLength;    ///< Total length of the associated report descriptor\r
+} USB_HID_DESCRIPTOR;\r
+//-------------------------------------------------------------------------------------------------------\r
+\r
+\r
+//-------------------------------------------------------------------------------------------------------\r
+/// Look-up table entry for non-standard descriptor types (used with \ref usbsrGetDescriptor)\r
+typedef struct {\r
+    uint8 valueMsb;            ///< LSB of the \ref USB_SETUP_HEADER.value request parameter\r
+    uint8 valueLsb;            ///< MSB of the \ref USB_SETUP_HEADER.value request parameter\r
+    uint8 indexMsb;            ///< LSB of the \ref USB_SETUP_HEADER.index request parameter\r
+    uint8 indexLsb;            ///< MSB of the \ref USB_SETUP_HEADER.index request parameter\r
+    uint8 __code *pDescStart;  ///< A pointer to the descriptor to be returned for the given index/value\r
+    uint16 length;            ///< The length of the returned descriptor\r
+} DESC_LUT_INFO;\r
+\r
+/// Look-up table for double-buffer settings\r
+typedef struct {\r
+    USB_INTERFACE_DESCRIPTOR __code *pInterface; ///< Pointer to an interface descriptor\r
+    uint8 inMask;                                 ///< Bitmask for IN endpoints (bit x maps to EPx IN)\r
+    uint8 outMask;                                ///< Bitmask for OUT endpoints (bit x maps to EPx OUT)\r
+} DBLBUF_LUT_INFO;\r
+\r
+// From usb_interrupt.h\r
+//-------------------------------------------------------------------------------------------------------\r
+/// USBIRQ internal module data\r
+typedef struct {\r
+    uint16 eventMask; ///< Bit mask containing all pending events (see the \c USBIRQ_EVENT definitions)\r
+    uint8 inSuspend; ///< Is currently in suspend?\r
+    uint16 irqMask;   ///< USB interrupts to be enabled\r
+} USBIRQ_DATA;\r
+\r
+//-------------------------------------------------------------------------------------------------------\r
+/// USBDP internal module data\r
+typedef struct {\r
+    const uint8 __code *pDesc; ///< Pointer to the current descriptor\r
+} USBDP_DATA;\r
+//@}\r
+\r
+/*\r
++------------------------------------------------------------------------------\r
+|  Copyright 2004-2007 Texas Instruments Incorporated. All rights reserved.\r
+|\r
+|  IMPORTANT: Your use of this Software is limited to those specific rights\r
+|  granted under the terms of a software license agreement between the user who\r
+|  downloaded the software, his/her employer (which must be your employer) and\r
+|  Texas Instruments Incorporated (the "License"). You may not use this Software\r
+|  unless you agree to abide by the terms of the License. The License limits\r
+|  your use, and you acknowledge, that the Software may not be modified, copied\r
+|  or distributed unless embedded on a Texas Instruments microcontroller or used\r
+|  solely and exclusively in conjunction with a Texas Instruments radio\r
+|  frequency transceiver, which is integrated into your product. Other than for\r
+|  the foregoing purpose, you may not use, reproduce, copy, prepare derivative\r
+|  works of, modify, distribute, perform, display or sell this Software and/or\r
+|  its documentation for any purpose.\r
+|\r
+|  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE\r
+|  PROVIDED \93AS IS\94 WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED,\r
+|  INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE,\r
+|  NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL\r
+|  TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+|  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER\r
+|  LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING\r
+|  BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR\r
+|  CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT OF\r
+|  SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES\r
+|  (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+|\r
+|  Should you have any questions regarding your right to use this Software,\r
+|  contact Texas Instruments Incorporated at www.TI.com.\r
+|\r
++------------------------------------------------------------------------------\r
+*/\r
+\r
+#endif\r
diff --git a/chronos-ti/Software Projects/RF Access Point/IAR/usb/library/usb_interrupt.h b/chronos-ti/Software Projects/RF Access Point/IAR/usb/library/usb_interrupt.h
new file mode 100755 (executable)
index 0000000..feffcba
--- /dev/null
@@ -0,0 +1,209 @@
+/***********************************************************************************\r
+\r
+    Filename:     usb_interrupt.h\r
+\r
+    Description:  USB library interrupt initialisation and ISR.\r
+\r
+***********************************************************************************/\r
+\r
+#ifndef USBINTERRUPT_H\r
+#define USBINTERRUPT_H\r
+/** \addtogroup module_usb_interrupt  USB Interrupt (usbirq)\r
+ * \brief This module contains the USB interrupt handler, which converts USB interrupts to USBIRQ events.\r
+ *\r
+ * This module contains two interrupt service routines:\r
+ * \li P0 ISR\r
+ * \li P2 ISR\r
+ * Both these are used by the USB part of the MCU. Hence it is recommended to only use P1 for\r
+ * interrupts from any peripherals connected to the MCU. Unless running low on GPIO pins, one should\r
+ * generally avoid using the P0 and P2 pins at all.\r
+ *\r
+ * The MCU contains three interrupt flag registers, USBCIE, USBIIE and USBOIE, which are all cleared\r
+ * upon read access. The \ref module_usb_interrupt module encapsulates the USB interrupts, and saves the\r
+ * three flag registers in a single 16-bit word. By doing that it becomes possible to process\r
+ * high-priority events in the interrupt context, and low-priority events in the main loop.\r
+ *\r
+ * \section section_usbirq_initialization Initialization\r
+ * After initializing the \ref module_usb_framework module, \c main() must call \ref usbirqInit(). The\r
+ * \c irqMask parameter of this function shall contain all \c USBIRQ_EVENT bits that will be handled\r
+ * either in the interrupt or in \c main(). Note, however, that the event reporting may not always be\r
+ * necessary. For instance, there is usually no reason to enable \c USBIRQ_EVENT_EPxIN or\r
+ * \c USBIRQ_EVENT_EPxOUT events when handling low-priority transfers in the \c main() loop. In these\r
+ * cases it is simpler and more efficient to check the arming condition of the endpoint in question.\r
+ *\r
+ * The following example enables the setup and reset events (which must always be enabled!), and turns on\r
+ * global interrupts:\r
+ * \code\r
+ * void main(void) {\r
+ *\r
+ *    ... Initialize the crystal oscillator and USB framework first ...\r
+ *\r
+ *    // Initialize the USB Interrupt module\r
+ *    usbirqInit(USBIRQ_EVENT_RESET | USBIRQ_EVENT_SUSPEND | USBIRQ_EVENT_RESUME | USBIRQ_EVENT_SETUP);\r
+ *\r
+ *    // Turn on interrupts\r
+ *    INT_GLOBAL_ENABLE();\r
+ *\r
+ *    // Main loop\r
+ *    while (1) {\r
+ *       ...\r
+ *    }\r
+ * \endcode\r
+ *\r
+ * \section section_usbirq_event_processing Event Processing\r
+ * Regardless of whether the interrupt event is processed in the interrupt or in the main loop, the code\r
+ * piece for doing it is the same (this example illustrates the processing of \ref USBIRQ_EVENT_RESET\r
+ * events):\r
+ * \code\r
+ * // Let the framework handle reset events :)\r
+ * if (USBIRQ_GET_EVENT_MASK() & USBIRQ_EVENT_RESET) {\r
+ *    USBIRQ_CLEAR_EVENTS(USBIRQ_EVENT_RESET);\r
+ *    usbfwResetHandler();\r
+ * }\r
+ * \endcode\r
+ *\r
+ * \section Hooks\r
+ * The following hook is called from the USB interrupt, and allows for event processing in the interrupt\r
+ * context:\r
+ * \code\r
+ * void usbirqHookProcessEvents(void) {\r
+ *    // Process high-priority events here, or simply return if there are none\r
+ * }\r
+ * \endcode\r
+ * @{\r
+ */\r
+\r
+\r
+#ifdef EXTERN\r
+   #undef EXTERN\r
+#endif\r
+#ifdef USBINTERRUPT_C\r
+   #define EXTERN ///< Definition used only for usb_interrupt.c to declare variable\r
+#else\r
+   #define EXTERN extern ///< Definition used in other source files to declare external\r
+#endif\r
+\r
+\r
+//-------------------------------------------------------------------------------------------------------\r
+/// USBIRQ internal module data\r
+/*typedef struct {\r
+    uint16 eventMask; ///< Bit mask containing all pending events (see the \c USBIRQ_EVENT definitions)\r
+    BOOL inSuspend; ///< Is currently in suspend?\r
+    uint16 irqMask;   ///< USB interrupts to be enabled\r
+} USBIRQ_DATA;*/\r
+#ifdef USBIRQ_DATA_ADDR\r
+    EXTERN __no_init __data USBIRQ_DATA usbirqData @ USBIRQ_DATA_ADDR; ///< USBIRQ internal module data at fixed address\r
+#else\r
+    EXTERN USBIRQ_DATA __data usbirqData; ///< USBIRQ internal module data\r
+#endif\r
+//-------------------------------------------------------------------------------------------------------\r
+\r
+\r
+//-------------------------------------------------------------------------------------------------------\r
+/// \name USB Interrupt Events\r
+//@{\r
+\r
+/// Suspend signaling detected on the USB bus\r
+/// Note that the chip should not enter PM1 while still in the interrupt routine (inside the usbirqHookProcessEvents() function )\r
+#define USBIRQ_EVENT_SUSPEND         0x0001\r
+/// Resume signaling detected on the USB bus\r
+#define USBIRQ_EVENT_RESUME          0x0002\r
+/// Reset signaling detected on the USB bus (call \ref usbfwResetHandler() for processing)\r
+#define USBIRQ_EVENT_RESET           0x0004\r
+/// Start of frame token received (synthesized by hardware when the next SOF token is expected, so that missing or corrupted tokens have no effect)\r
+#define USBIRQ_EVENT_START_OF_FRAME  0x0008\r
+/// Endpoint 0 IN/OUT setup/data transfer complete / stall sent / premature completion (call \ref usbfwSetupHandler() for processing)\r
+#define USBIRQ_EVENT_SETUP           0x0010\r
+/// Endpoint 1 IN data successfully transmitted to host (FIFO disarmed) / FIFO flushed / stall sent\r
+#define USBIRQ_EVENT_EP1IN           0x0020\r
+/// Endpoint 2 IN data successfully transmitted to host (FIFO disarmed) / FIFO flushed / stall sent\r
+#define USBIRQ_EVENT_EP2IN           0x0040\r
+/// Endpoint 3 IN data successfully transmitted to host (FIFO disarmed) / FIFO flushed / stall sent\r
+#define USBIRQ_EVENT_EP3IN           0x0080\r
+/// Endpoint 4 IN data successfully transmitted to host (FIFO disarmed) / FIFO flushed / stall sent\r
+#define USBIRQ_EVENT_EP4IN           0x0100\r
+/// Endpoint 5 IN data successfully transmitted to host (FIFO disarmed) / FIFO flushed / stall sent\r
+#define USBIRQ_EVENT_EP5IN           0x0200\r
+/// Endpoint 1 OUT data received from host (FIFO disarmed) / stall sent\r
+#define USBIRQ_EVENT_EP1OUT          0x0400\r
+/// Endpoint 2 OUT data received from host (FIFO disarmed) / stall sent\r
+#define USBIRQ_EVENT_EP2OUT          0x0800\r
+/// Endpoint 3 OUT data received from host (FIFO disarmed) / stall sent\r
+#define USBIRQ_EVENT_EP3OUT          0x1000\r
+/// Endpoint 4 OUT data received from host (FIFO disarmed) / stall sent\r
+#define USBIRQ_EVENT_EP4OUT          0x2000\r
+/// Endpoint 5 OUT data received from host (FIFO disarmed) / stall sent\r
+#define USBIRQ_EVENT_EP5OUT          0x4000\r
+//@}\r
+//-------------------------------------------------------------------------------------------------------\r
+\r
+\r
+//-------------------------------------------------------------------------------------------------------\r
+/// \name Interrupt Mask Access Macros\r
+//@{\r
+\r
+/// Clears one or more events (use one or more \c USBIRQ_EVENT bits OR'ed together)\r
+#define USBIRQ_CLEAR_EVENTS(mask)    (usbirqData.eventMask &= ~(mask))\r
+/// Get the bit mask containing all pending events\r
+#define USBIRQ_GET_EVENT_MASK()      (usbirqData.eventMask)\r
+//@}\r
+//-------------------------------------------------------------------------------------------------------\r
+\r
+\r
+//-------------------------------------------------------------------------------------------------------\r
+/// \name Interrupt Event Hooks\r
+//@{\r
+\r
+/// Called upon all USB interrupts for high-priority event processing\r
+void usbirqHookProcessEvents(void);\r
+\r
+//@}\r
+//-------------------------------------------------------------------------------------------------------\r
+\r
+\r
+//-------------------------------------------------------------------------------------------------------\r
+// Function prototypes\r
+void usbirqInit(uint16 irqMask);\r
+__near_func __interrupt void usbirqHandler(void);\r
+__near_func __interrupt void usbirqResumeHandler(void);\r
+//-------------------------------------------------------------------------------------------------------\r
+\r
+\r
+//@}\r
+\r
+/*\r
++------------------------------------------------------------------------------\r
+|  Copyright 2004-2007 Texas Instruments Incorporated. All rights reserved.\r
+|\r
+|  IMPORTANT: Your use of this Software is limited to those specific rights\r
+|  granted under the terms of a software license agreement between the user who\r
+|  downloaded the software, his/her employer (which must be your employer) and\r
+|  Texas Instruments Incorporated (the "License"). You may not use this Software\r
+|  unless you agree to abide by the terms of the License. The License limits\r
+|  your use, and you acknowledge, that the Software may not be modified, copied\r
+|  or distributed unless embedded on a Texas Instruments microcontroller or used\r
+|  solely and exclusively in conjunction with a Texas Instruments radio\r
+|  frequency transceiver, which is integrated into your product. Other than for\r
+|  the foregoing purpose, you may not use, reproduce, copy, prepare derivative\r
+|  works of, modify, distribute, perform, display or sell this Software and/or\r
+|  its documentation for any purpose.\r
+|\r
+|  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE\r
+|  PROVIDED \93AS IS\94 WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED,\r
+|  INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE,\r
+|  NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL\r
+|  TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+|  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER\r
+|  LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING\r
+|  BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR\r
+|  CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT OF\r
+|  SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES\r
+|  (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+|\r
+|  Should you have any questions regarding your right to use this Software,\r
+|  contact Texas Instruments Incorporated at www.TI.com.\r
+|\r
++------------------------------------------------------------------------------\r
+*/\r
+\r
+#endif\r
diff --git a/chronos-ti/Software Projects/RF Access Point/IAR/usb/library/usb_reg.h b/chronos-ti/Software Projects/RF Access Point/IAR/usb/library/usb_reg.h
new file mode 100755 (executable)
index 0000000..b3e544e
--- /dev/null
@@ -0,0 +1,153 @@
+/***********************************************************************************\r
+\r
+    Filename:     usb_reg.h\r
+\r
+    Description:  Register bit defintions for CCxx11 and CC2531.\r
+\r
+***********************************************************************************/\r
+\r
+#ifndef USBREG_H\r
+#define USBREG_H\r
+\r
+\r
+// USBADDR\r
+#define USBADDR_UPDATE              0x80\r
+#define USBADDR_USBADDR             0x7F\r
+\r
+// USBPOW\r
+#define USBPOW_ISO_WAIT_SOF         0x80\r
+#define USBPOW_RST                  0x08\r
+#define USBPOW_RESUME               0x04\r
+#define USBPOW_SUSPEND              0x02\r
+#define USBPOW_SUSPEND_EN           0x01\r
+\r
+// USBIIF\r
+#define USBIIF_INEP5IF              0x20\r
+#define USBIIF_INEP4IF              0x10\r
+#define USBIIF_INEP3IF              0x08\r
+#define USBIIF_INEP2IF              0x04\r
+#define USBIIF_INEP1IF              0x02\r
+#define USBIIF_EP0IF                0x01\r
+\r
+// USBOIF\r
+#define USBOIF_OUTEP5IF             0x20\r
+#define USBOIF_OUTEP4IF             0x10\r
+#define USBOIF_OUTEP3IF             0x08\r
+#define USBOIF_OUTEP2IF             0x04\r
+#define USBOIF_OUTEP1IF             0x02\r
+\r
+// USBCIF\r
+#define USBCIF_SOFIF                0x08\r
+#define USBCIF_RSTIF                0x04\r
+#define USBCIF_RESUMEIF             0x02\r
+#define USBCIF_SUSPENDIF            0x01\r
+\r
+// USBIIE\r
+#define USBIIE_INEP5IE              0x20\r
+#define USBIIE_INEP4IE              0x10\r
+#define USBIIE_INEP3IE              0x08\r
+#define USBIIE_INEP2IE              0x04\r
+#define USBIIE_INEP1IE              0x02\r
+#define USBIIE_EP0IE                0x01\r
+\r
+// USBOIE\r
+#define USBOIE_OUTEP5IE             0x20\r
+#define USBOIE_OUTEP4IE             0x10\r
+#define USBOIE_OUTEP3IE             0x08\r
+#define USBOIE_OUTEP2IE             0x04\r
+#define USBOIE_OUTEP1IE             0x02\r
+\r
+// USBCIE\r
+#define USBCIE_SOFIE                 0x08\r
+#define USBCIE_RSTIE                 0x04\r
+#define USBCIE_RESUMEIE              0x02\r
+#define USBCIE_SUSPENDIE             0x01\r
+\r
+// USBCS0\r
+#define USBCS0_CLR_SETUP_END         0x80\r
+#define USBCS0_CLR_OUTPKT_RDY        0x40\r
+#define USBCS0_SEND_STALL            0x20\r
+#define USBCS0_SETUP_END             0x10\r
+#define USBCS0_DATA_END              0x08\r
+#define USBCS0_SENT_STALL            0x04\r
+#define USBCS0_INPKT_RDY             0x02\r
+#define USBCS0_OUTPKT_RDY            0x01\r
+\r
+// USBCSIL\r
+#define USBCSIL_CLR_DATA_TOG         0x40\r
+#define USBCSIL_SENT_STALL           0x20\r
+#define USBCSIL_SEND_STALL           0x10\r
+#define USBCSIL_FLUSH_PACKET         0x08\r
+#define USBCSIL_UNDERRUN             0x04\r
+#define USBCSIL_PKT_PRESENT          0x02\r
+#define USBCSIL_INPKT_RDY            0x01\r
+\r
+// USBCSIH\r
+#define USBCSIH_AUTOSET              0x80\r
+#define USBCSIH_ISO                  0x40\r
+#define USBCSIH_FORCE_DATA_TOG       0x08\r
+#define USBCSIH_IN_DBL_BUF           0x01\r
+\r
+// USBCSOL\r
+#define USBCSOL_CLR_DATA_TOG         0x80\r
+#define USBCSOL_SENT_STALL           0x40\r
+#define USBCSOL_SEND_STALL           0x20\r
+#define USBCSOL_FLUSH_PACKET         0x10\r
+#define USBCSOL_DATA_ERROR           0x08\r
+#define USBCSOL_OVERRUN              0x04\r
+#define USBCSOL_FIFO_FULL            0x02\r
+#define USBCSOL_OUTPKT_RDY           0x01\r
+\r
+// USBCSOH\r
+#define USBCSOH_AUTOCLEAR            0x80\r
+#define USBCSOH_ISO                  0x40\r
+#define USBCSOH_OUT_DBL_BUF          0x01\r
+\r
+#define SLEEP_USB_EN                 0x80\r
+\r
+#if (chip==2531)\r
+\r
+// USBCTRL\r
+#define USBCTRL_PLL_LOCKED           0x80\r
+#define USBCTRL_PLL_EN               0x02\r
+#define USBCTRL_USB_EN               0x01\r
+\r
+#define P2IFG_DPIF                   0x20\r
+\r
+#endif\r
+\r
+/*\r
++------------------------------------------------------------------------------\r
+|  Copyright 2004-2007 Texas Instruments Incorporated. All rights reserved.\r
+|\r
+|  IMPORTANT: Your use of this Software is limited to those specific rights\r
+|  granted under the terms of a software license agreement between the user who\r
+|  downloaded the software, his/her employer (which must be your employer) and\r
+|  Texas Instruments Incorporated (the "License"). You may not use this Software\r
+|  unless you agree to abide by the terms of the License. The License limits\r
+|  your use, and you acknowledge, that the Software may not be modified, copied\r
+|  or distributed unless embedded on a Texas Instruments microcontroller or used\r
+|  solely and exclusively in conjunction with a Texas Instruments radio\r
+|  frequency transceiver, which is integrated into your product. Other than for\r
+|  the foregoing purpose, you may not use, reproduce, copy, prepare derivative\r
+|  works of, modify, distribute, perform, display or sell this Software and/or\r
+|  its documentation for any purpose.\r
+|\r
+|  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE\r
+|  PROVIDED \93AS IS\94 WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED,\r
+|  INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE,\r
+|  NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL\r
+|  TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+|  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER\r
+|  LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING\r
+|  BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR\r
+|  CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT OF\r
+|  SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES\r
+|  (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+|\r
+|  Should you have any questions regarding your right to use this Software,\r
+|  contact Texas Instruments Incorporated at www.TI.com.\r
+|\r
++------------------------------------------------------------------------------\r
+*/\r
+#endif\r
diff --git a/chronos-ti/Software Projects/RF Access Point/IAR/usb/library/usb_standard_requests.c b/chronos-ti/Software Projects/RF Access Point/IAR/usb/library/usb_standard_requests.c
new file mode 100755 (executable)
index 0000000..9f8669d
--- /dev/null
@@ -0,0 +1,659 @@
+/***********************************************************************************\r
+\r
+    Filename:     usb_standard_request.c\r
+\r
+    Description:  Handle USB standard requests.\r
+\r
+***********************************************************************************/\r
+\r
+/// \addtogroup module_usb_standard_requests\r
+/// @{\r
+#include "usb_firmware_library_headers.h"\r
+#include "hal_types.h"\r
+#include "hal_board.h"\r
+\r
+\r
+\r
+/** \brief Processes the \ref GET_STATUS request (returns status for the specified recipient)\r
+ *\r
+ * The recipient bits in \ref USB_SETUP_HEADER.requestType specify the desired recipient. This is either the\r
+ * (one and only) device, a specific interface, or a specific endpoint. Some of the status bits can be\r
+ * changed with the SET_FEATURE and CLEAR_FEATURE requests.\r
+ *\r
+ * <b>Parameters</b>:\r
+ * - VALUE: Always 0\r
+ * - INDEX: Depends upon the recipient:\r
+ *     - DEVICE: Always 0\r
+ *     - INTERFACE: Interface number\r
+ *     - ENDPOINT: Endpoint address\r
+ * - LENGTH: Always 2\r
+ *\r
+ * <b>Data (IN)</b>:\r
+ * Depends upon the recipient (the bit field illustrations are MSB first, LSB last):\r
+ * - DEVICE: <tt>00000000.000000RS</tt>, where R(1) = DEVICE_REMOTE_WAKEUP and S(0) = SELF_POWERED\r
+ * - INTERFACE: <tt>00000000.00000000</tt> (all bits are reserved)\r
+ * - ENDPOINT: <tt>00000000.0000000H</tt>, where H(0) = ENDPOINT_HALT\r
+ */\r
+void usbsrGetStatus(void)\r
+{\r
+   uint8 endpoint;\r
+   static uint16 __xdata status;\r
+\r
+   // Common sanity check\r
+   if (usbSetupHeader.value || HI_UINT16(usbSetupHeader.index) || (usbSetupHeader.length != 2)) {\r
+      usbfwData.ep0Status = EP_STALL;\r
+\r
+   // Return status for device, interface, or endpoint\r
+   } else {\r
+      switch (usbSetupHeader.requestType) {\r
+\r
+         // Device status:\r
+         //     Bit 0: Self powered\r
+         //     Bit 1: Remote wake-up allowed\r
+      case RT_IN_DEVICE:\r
+\r
+         // Sanity check\r
+         if (LO_UINT16(usbSetupHeader.index)) {\r
+            usbfwData.ep0Status = EP_STALL;\r
+\r
+         // Get the bit values from the USBFW_DATA struct\r
+         } else {\r
+\r
+            // Self powered?\r
+            status = usbfwData.selfPowered ? 0x0001 : 0x0000;\r
+\r
+            // Remote wakeup?\r
+            if (usbfwData.remoteWakeup) status |= 0x0002;\r
+         }\r
+         break;\r
+\r
+         // Interface status:\r
+         //     All bits are reserved\r
+      case RT_IN_INTERFACE:\r
+\r
+         // Sanity check\r
+         if (usbfwData.usbState != DEV_CONFIGURED) {\r
+            usbfwData.ep0Status = EP_STALL;\r
+         } else {\r
+            status = 0x0000;\r
+         }\r
+         break;\r
+\r
+         // Endpoint status:\r
+         //     Bit 0: Endpoint halted\r
+      case RT_IN_ENDPOINT:\r
+         endpoint = LO_UINT16(usbSetupHeader.index) & 0x7F;\r
+\r
+         // Sanity check\r
+         if ((usbfwData.usbState != DEV_CONFIGURED) || (endpoint > 5)) {\r
+            usbfwData.ep0Status = EP_STALL;\r
+\r
+         // Translate endpoint address to status index and return the status\r
+         } else {\r
+\r
+            // IN\r
+            if (LO_UINT16(usbSetupHeader.index) & 0x80) {\r
+               status = (usbfwData.pEpInStatus[endpoint - 1] == EP_HALT) ? 0x0001 : 0x0000;\r
+\r
+            // OUT\r
+            } else {\r
+               status = (usbfwData.pEpOutStatus[endpoint - 1] == EP_HALT) ? 0x0001 : 0x0000;\r
+            }\r
+         }\r
+         break;\r
+\r
+      default:\r
+         usbfwData.ep0Status = EP_STALL;\r
+         break;\r
+      }\r
+\r
+      if (usbfwData.ep0Status != EP_STALL) {\r
+         // Send it\r
+         usbSetupData.pBuffer = (uint8 __generic *)&status;\r
+         usbSetupData.bytesLeft = 2;\r
+         usbfwData.ep0Status = EP_TX;\r
+      }\r
+   }\r
+} // usbsrGetStatus\r
+\r
+\r
+\r
+\r
+/** \brief Internal function used for the very similar \ref SET_FEATURE and \ref CLEAR_FEATURE requests\r
+ *\r
+ * This function either sets or clears the specified feature on the specified recipient.\r
+ *\r
+ * \param[in]       set\r
+ *     When TRUE, the feature is set. When FALSE, the feature is cleared.\r
+ *\r
+ * \return\r
+ *     TRUE if the selected feature is supported by the USB library. FALSE to indicate that\r
+ *     \ref usbsrHookClearFeature() or \ref usbsrHookSetFeature() must be called.\r
+ */\r
+static uint8 ChangeFeature(uint8 set)\r
+{\r
+   uint8 endpoint;\r
+\r
+   // Sanity check\r
+   if (usbSetupHeader.length || (usbfwData.usbState != DEV_CONFIGURED) && (usbSetupHeader.index != 0)) {\r
+      usbfwData.ep0Status = EP_STALL;\r
+\r
+      // Handle based on recipient\r
+   } else {\r
+      switch (usbSetupHeader.requestType & RT_MASK_RECIP) {\r
+\r
+      // Device\r
+      case RT_RECIP_DEV:\r
+\r
+         // Sanity check\r
+         if (LO_UINT16(usbSetupHeader.value) != DEVICE_REMOTE_WAKEUP) {\r
+            return FALSE;\r
+         } else {\r
+            usbfwData.remoteWakeup = set;\r
+            usbsrHookProcessEvent(set ? USBSR_EVENT_REMOTE_WAKEUP_ENABLED : USBSR_EVENT_REMOTE_WAKEUP_DISABLED, 0);\r
+         }\r
+         break;\r
+\r
+      // Endpoint\r
+      case RT_RECIP_IF:\r
+         return FALSE;\r
+\r
+      // Endpoint\r
+      case RT_RECIP_EP:\r
+         endpoint = LO_UINT16(usbSetupHeader.index) & 0x7F;\r
+\r
+         // Sanity check\r
+         if (LO_UINT16(usbSetupHeader.value) != ENDPOINT_HALT) {\r
+            return FALSE;\r
+         } else if (endpoint > 5) {\r
+            usbfwData.ep0Status = EP_STALL;\r
+         } else {\r
+            USBFW_SELECT_ENDPOINT(endpoint);\r
+\r
+            // IN\r
+            if (LO_UINT16(usbSetupHeader.index) & 0x80) {\r
+               USBCSIL = set ? USBCSIL_SEND_STALL : USBCSIL_CLR_DATA_TOG;\r
+               usbfwData.pEpInStatus[endpoint - 1] = set ? EP_HALT : EP_IDLE;\r
+               usbsrHookProcessEvent(set ? USBSR_EVENT_EPIN_STALL_SET : USBSR_EVENT_EPIN_STALL_CLEARED, endpoint);\r
+\r
+            // OUT\r
+            } else {\r
+               USBCSOL = set ? USBCSOL_SEND_STALL : USBCSOL_CLR_DATA_TOG;\r
+               usbfwData.pEpOutStatus[endpoint - 1] = set ? EP_HALT : EP_IDLE;\r
+               usbsrHookProcessEvent(set ? USBSR_EVENT_EPOUT_STALL_SET : USBSR_EVENT_EPOUT_STALL_CLEARED, endpoint);\r
+            }\r
+            USBFW_SELECT_ENDPOINT(0);\r
+         }\r
+         break;\r
+\r
+      default:\r
+         usbfwData.ep0Status = EP_STALL;\r
+         break;\r
+      }\r
+   }\r
+   return TRUE;\r
+} // ChangeFeature\r
+\r
+\r
+\r
+\r
+/** \brief Processes the \ref CLEAR_FEATURE request (clears or disables a specific feature)\r
+ *\r
+ * The feature selector value must be appropriate to the recipient.\r
+ *\r
+ * <b>Parameters</b>:\r
+ * - VALUE: Feature selector:\r
+ *     - \c DEVICE_REMOTE_WAKEUP(1): Enable remote wakeup\r
+ *     - \c ENDPOINT_HALT(0): Clear the halt feature for the specified endpoint (not endpoint 0!)\r
+ * - INDEX: Depends upon the recipient:\r
+ *     - DEVICE: Always 0\r
+ *     - INTERFACE: Interface number\r
+ *     - ENDPOINT: Endpoint address\r
+ * - LENGTH: Always 0\r
+ */\r
+void usbsrClearFeature()\r
+{\r
+   if (!ChangeFeature(FALSE)) {\r
+      usbsrHookClearFeature();\r
+   }\r
+} // usbsrClearFeature\r
+\r
+\r
+\r
+\r
+/** \brief Processes the \ref SET_FEATURE request (sets or enables a specific feature)\r
+ *\r
+ * The feature selector value must be appropriate to the recipient.\r
+ *\r
+ * <b>Parameters</b>:\r
+ * - VALUE: Feature selector:\r
+ *     - \c DEVICE_REMOTE_WAKEUP(1): Enable remote wakeup\r
+ *     - \c ENDPOINT_HALT(0): Set the halt feature for the specified endpoint (not endpoint 0!)\r
+ * - INDEX: Depends upon the recipient:\r
+ *     - DEVICE: Always 0\r
+ *     - INTERFACE: Interface number\r
+ *     - ENDPOINT: Endpoint address\r
+ * - LENGTH: Always 0\r
+ */\r
+void usbsrSetFeature(void)\r
+{\r
+   if (!ChangeFeature(TRUE)) {\r
+      usbsrHookSetFeature();\r
+   }\r
+} // usbsrSetFeature\r
+\r
+\r
+\r
+\r
+/** \brief Processes the \ref SET_ADDRESS request (sets the device address for all future device\r
+ * accesses)\r
+ *\r
+ * If the value is between 1 and 127 and the device is in the default state, it will enter the address\r
+ * state. If it already is in the address state, it starts to use the newly-specified address.\r
+ *\r
+ * If the value is 0 and the device is in the address state, it will enter the default state. If it\r
+ * already is in the default state, nothing happens.\r
+ *\r
+ * <b>Parameters</b>:\r
+ * - VALUE: The device address (0-127)\r
+ * - INDEX: Always 0\r
+ * - LENGTH: Always 0\r
+ */\r
+void usbsrSetAddress(void)\r
+{\r
+\r
+   // Sanity check\r
+   if (usbSetupHeader.index || usbSetupHeader.length || HI_UINT16(usbSetupHeader.value) || (LO_UINT16(usbSetupHeader.value) & 0x80)) {\r
+      usbfwData.ep0Status = EP_STALL;\r
+\r
+   // Update the device address\r
+   } else {\r
+      USBADDR = LO_UINT16(usbSetupHeader.value);\r
+      if (LO_UINT16(usbSetupHeader.value) != 0) {\r
+         if (usbfwData.usbState == DEV_DEFAULT) usbfwData.usbState = DEV_ADDRESS;\r
+      } else {\r
+         if (usbfwData.usbState == DEV_ADDRESS) usbfwData.usbState = DEV_DEFAULT;\r
+      }\r
+   }\r
+\r
+} // usbsrSetAddress\r
+\r
+\r
+\r
+\r
+/** \brief Processes the \ref GET_DESCRIPTOR request (returns the specified USB descriptor)\r
+ *\r
+ * The \ref module_usb_descriptor_parser module is used to locate device, configuration and string\r
+ * descriptors. Note that configuration descriptors also include interface, endpoint and other\r
+ * "similar" descriptor types (e.g. HID descriptor), with the total descriptor length specified by\r
+ * the \ref USB_CONFIGURATION_DESCRIPTOR.wTotalLength field.\r
+ *\r
+ * Other descriptor types that are not returned with the configuration descriptor, must be defined in\r
+ * the usbDescriptorMarker.pUsbDescLut lookup-table. This table specifies the values of the VALUE and INDEX fields, and\r
+ * gives a pointer to the descriptor along with it's length.\r
+ *\r
+ * <b>Parameters</b>:\r
+ * - VALUE.MSB: Descriptor type\r
+ * - VALUE.LSB: Descriptor index\r
+ * - INDEX: 0, or language ID for string descriptors (currently not supported)\r
+ * - LENGTH: Descriptor length (either the requested number of bytes, or the length of the descriptor,\r
+ *           whichever is the smallest)\r
+ *\r
+ * <b>Data (IN)</b>:\r
+ * The descriptor(s)\r
+ */\r
+void usbsrGetDescriptor(void)\r
+{\r
+   uint8 n;\r
+\r
+   // Which descriptor?\r
+   switch (HI_UINT16(usbSetupHeader.value)) {\r
+\r
+   // Device descriptor\r
+   case DESC_TYPE_DEVICE:\r
+      usbSetupData.pBuffer = (uint8 __code*) usbdpGetDeviceDesc();\r
+      usbSetupData.bytesLeft = usbSetupData.pBuffer[DESC_LENGTH_IDX];\r
+      break;\r
+\r
+   // Configuration descriptor\r
+   case DESC_TYPE_CONFIG:\r
+      usbSetupData.pBuffer = (uint8 __code*) usbdpGetConfigurationDesc(0, LO_UINT16(usbSetupHeader.value));\r
+      usbSetupData.bytesLeft = usbSetupData.pBuffer[DESC_CONFIG_LENGTH_LSB_IDX] +\r
+                               usbSetupData.pBuffer[DESC_CONFIG_LENGTH_MSB_IDX] * 256;\r
+      break;\r
+\r
+   // String descriptor\r
+   case DESC_TYPE_STRING:\r
+      // TODO: Implement language ID\r
+      usbSetupData.pBuffer = (uint8 __code*) usbdpGetStringDesc(LO_UINT16(usbSetupHeader.value));\r
+      usbSetupData.bytesLeft = usbSetupData.pBuffer[DESC_LENGTH_IDX];\r
+      break;\r
+\r
+   // Other descriptor type\r
+   default:\r
+      // Perform a table search (on index and value)\r
+      usbSetupData.pBuffer = NULL;\r
+      for (n = 0; n < ((uint16)usbDescriptorMarker.pUsbDescLutEnd - (uint16)usbDescriptorMarker.pUsbDescLut) / sizeof(DESC_LUT_INFO); n++) {\r
+         if ((usbDescriptorMarker.pUsbDescLut[n].valueMsb == HI_UINT16(usbSetupHeader.value))\r
+             && (usbDescriptorMarker.pUsbDescLut[n].valueLsb == LO_UINT16(usbSetupHeader.value))\r
+             && (usbDescriptorMarker.pUsbDescLut[n].indexMsb == HI_UINT16(usbSetupHeader.index))\r
+             && (usbDescriptorMarker.pUsbDescLut[n].indexLsb == LO_UINT16(usbSetupHeader.index)) )\r
+         {\r
+            usbSetupData.pBuffer = usbDescriptorMarker.pUsbDescLut[n].pDescStart;\r
+            usbSetupData.bytesLeft = usbDescriptorMarker.pUsbDescLut[n].length;\r
+         }\r
+      }\r
+   }\r
+\r
+   // Stall EP0 if no descriptor was found\r
+   if (usbSetupData.pBuffer == NULL) usbfwData.ep0Status = EP_STALL;\r
+\r
+   if (usbfwData.ep0Status != EP_STALL) {\r
+\r
+      // Limit the returned descriptor size (the PC wants to know about sizes before\r
+      // polling the complete descriptors)\r
+      if (usbSetupData.bytesLeft > usbSetupHeader.length) {\r
+         usbSetupData.bytesLeft = usbSetupHeader.length;\r
+      }\r
+\r
+      usbfwData.ep0Status = EP_TX;\r
+   }\r
+\r
+} // usbsrGetDescriptor\r
+\r
+\r
+\r
+/** \brief Internally used function that configures all endpoints for the specified interface\r
+ *\r
+ * The new endpoint setup overwrites the old, without any warning. Unused endpoints keep their current\r
+ * setup. The user is responsible for ensuring that no endpoint buffers overwrite each other, and that\r
+ * interfaces do not cause conflicts. The pUsbDblbufLutInfo table must contain an entry for each\r
+ * interface descriptor to define endpoint double-buffering.\r
+ *\r
+ * \param[in]       *pInterface\r
+ *     A pointer to the interface descriptor\r
+ */\r
+static void ConfigureEndpoints(USB_INTERFACE_DESCRIPTOR __code *pInterface)\r
+{\r
+   uint8 n;\r
+   uint16 maxpRegValue;\r
+   uint8 csRegValue;\r
+   uint8 endpoint;\r
+   USB_ENDPOINT_DESCRIPTOR __code *pEndpoint;\r
+   DBLBUF_LUT_INFO __code *pUsbDblbufLutInfo;\r
+\r
+   // Locate the double buffer settings\r
+   if (pInterface->bNumEndpoints) {\r
+       pUsbDblbufLutInfo = (DBLBUF_LUT_INFO __code*) usbDescriptorMarker.pUsbDblbufLut;\r
+       while (pUsbDblbufLutInfo->pInterface != pInterface) {\r
+          pUsbDblbufLutInfo++;\r
+       }\r
+   }\r
+\r
+   // For each endpoint in this interface\r
+   for (n = 0; n < pInterface->bNumEndpoints; n++) {\r
+      if (pEndpoint = usbdpFindNext(DESC_TYPE_ENDPOINT, 0)) {\r
+\r
+         // Get the endpoint index\r
+         endpoint = pEndpoint->bEndpointAddress & 0x0F;\r
+         USBFW_SELECT_ENDPOINT(endpoint);\r
+\r
+         csRegValue = 0x00;\r
+         maxpRegValue = (pEndpoint->wMaxPacketSize + 7) >> 3;\r
+\r
+         // For IN endpoints...\r
+         if (pEndpoint->bEndpointAddress & 0x80) {\r
+\r
+            // Clear data toggle, and flush twice (due to double buffering)\r
+            USBCSIL = USBCSIL_CLR_DATA_TOG | USBCSIL_FLUSH_PACKET;\r
+            USBCSIL = USBCSIL_FLUSH_PACKET;\r
+\r
+            // USBCSIH\r
+            if ((pEndpoint->bmAttributes & EP_ATTR_TYPE_BM) == EP_ATTR_ISO) csRegValue |= USBCSIH_ISO;  // ISO flag\r
+            if (pUsbDblbufLutInfo->inMask & (1 << endpoint)) csRegValue |= USBCSIH_IN_DBL_BUF;          // Double buffering\r
+            USBCSIH = csRegValue;\r
+\r
+            // Max transfer size\r
+            USBMAXI = maxpRegValue;\r
+\r
+            // Endpoint status\r
+            usbfwData.pEpInStatus[endpoint - 1] = EP_IDLE;\r
+\r
+         // For OUT endpoints...\r
+         } else {\r
+\r
+            // Clear data toggle, and flush twice (due to double buffering)\r
+            USBCSOL = USBCSOL_CLR_DATA_TOG | USBCSOL_FLUSH_PACKET;\r
+            USBCSOL = USBCSOL_FLUSH_PACKET;\r
+\r
+            // USBCSOH\r
+            if ((pEndpoint->bmAttributes & EP_ATTR_TYPE_BM) == EP_ATTR_ISO) csRegValue |= USBCSOH_ISO;  // ISO flag\r
+            if (pUsbDblbufLutInfo->outMask & (1 << endpoint)) csRegValue |= USBCSOH_OUT_DBL_BUF;        // Double buffering\r
+            USBCSOH = csRegValue;\r
+\r
+            // Max transfer size\r
+            USBMAXO = maxpRegValue;\r
+\r
+            // Endpoint status\r
+            usbfwData.pEpOutStatus[endpoint - 1] = EP_IDLE;\r
+         }\r
+         USBFW_SELECT_ENDPOINT(0);\r
+      }\r
+   }\r
+} // ConfigureEndpoints\r
+\r
+\r
+\r
+\r
+/** \brief Processes the \ref GET_CONFIGURATION request (returns the current device configuration value)\r
+ *\r
+ * If the returned value is 0, the device is not configured (not in the configured state)\r
+ *\r
+ * <b>Parameters</b>:\r
+ * - VALUE: Always 0\r
+ * - INDEX: Always 0\r
+ * - LENGTH: Always 1\r
+ *\r
+ * <b>Data (IN)</b>:\r
+ * The non-zero \ref USB_CONFIGURATION_DESCRIPTOR.bConfigurationValue of the currently selected\r
+ * configuration.\r
+ */\r
+void usbsrGetConfiguration(void)\r
+{\r
+\r
+   // Sanity check\r
+   if (usbSetupHeader.value || usbSetupHeader.index || (usbSetupHeader.length != 1)) {\r
+      usbfwData.ep0Status = EP_STALL;\r
+\r
+   // Return the current configuration\r
+   } else {\r
+      usbSetupData.pBuffer = &usbfwData.configurationValue;\r
+      usbSetupData.bytesLeft = 1;\r
+      usbfwData.ep0Status = EP_TX;\r
+   }\r
+\r
+} // usbsrGetConfiguration\r
+\r
+\r
+\r
+\r
+/** \brief Processes the \ref SET_CONFIGURATION request (sets the device configuration)\r
+ *\r
+ * The configuration value must either be 0, in which case the device enters the address state, or it\r
+ * must match a configuration value from one of the USB configuration descriptors. If there is a match,\r
+ * the device enters the configured state.\r
+ *\r
+ * This request resets all interfaces to alternate setting 0, and uses the \c ConfigureEndpoints()\r
+ * function to automatically setup all endpoint registers.\r
+ *\r
+ * <b>Parameters</b>:\r
+ * - VALUE: The configuration value (0-255)\r
+ * - INDEX: Always 0\r
+ * - LENGTH: Always 0\r
+ */\r
+void usbsrSetConfiguration(void)\r
+{\r
+   uint8 n;\r
+   USB_CONFIGURATION_DESCRIPTOR __code *pConfiguration;\r
+   USB_INTERFACE_DESCRIPTOR __code *pInterface;\r
+\r
+   // Sanity check\r
+   if ((usbfwData.usbState == DEV_DEFAULT) || usbSetupHeader.index || usbSetupHeader.length || HI_UINT16(usbSetupHeader.value)) {\r
+      usbfwData.ep0Status = EP_STALL;\r
+\r
+   // Default endpoint setup\r
+   } else {\r
+      usbsrHookProcessEvent(USBSR_EVENT_CONFIGURATION_CHANGING, 0);\r
+\r
+      // Configure relevant endpoints\r
+      if (LO_UINT16(usbSetupHeader.value)) {\r
+\r
+         // Find the correct configuration descriptor...\r
+         pConfiguration = usbdpGetConfigurationDesc(LO_UINT16(usbSetupHeader.value), 0);\r
+\r
+         // If it exists...\r
+         if (pConfiguration) {\r
+            usbfwData.usbState = DEV_CONFIGURED;\r
+            usbfwData.configurationValue = LO_UINT16(usbSetupHeader.value);\r
+\r
+            // For each interface...\r
+            for (n = 0; n < pConfiguration->bNumInterfaces; n++) {\r
+               usbfwData.pAlternateSetting[n] = 0x00;\r
+\r
+               // Look only for alternate setting 0\r
+               do {\r
+                  pInterface = usbdpFindNext(DESC_TYPE_INTERFACE, 0);\r
+               } while (pInterface->bAlternateSetting != usbfwData.pAlternateSetting[n]);\r
+\r
+               // Configure all endpoints in this interface\r
+               ConfigureEndpoints(pInterface);\r
+            }\r
+\r
+         // If not, then stall the endpoint\r
+         } else {\r
+            usbfwData.ep0Status = EP_STALL;\r
+         }\r
+\r
+      // Unconfigure endpoints\r
+      } else {\r
+         usbfwData.configurationValue = LO_UINT16(usbSetupHeader.value);\r
+         usbfwData.usbState = DEV_ADDRESS;\r
+         usbfwSetAllEpStatus(EP_HALT);\r
+      }\r
+      usbsrHookProcessEvent(USBSR_EVENT_CONFIGURATION_CHANGED, 0);\r
+   }\r
+\r
+} // usbsrSetConfiguration\r
+\r
+\r
+\r
+\r
+/** \brief Processes the \ref GET_INTERFACE request (returns the selected alternate setting for the\r
+ * specified interface)\r
+ *\r
+ * Some USB devices have configurations with mutually exclusive interface settings. This request allows\r
+ * the host to determine the currently selected alternate setting.\r
+ *\r
+ * <b>Parameters</b>:\r
+ * - VALUE: Always 0\r
+ * - INDEX: Interface number\r
+ * - LENGTH: Always 1\r
+ *\r
+ * <b>Data (IN)</b>:\r
+ * The alternate setting for the selected interface\r
+ */\r
+void usbsrGetInterface(void)\r
+{\r
+\r
+   // Sanity check\r
+   if ((usbfwData.usbState != DEV_CONFIGURED) || (usbSetupHeader.requestType != RT_IN_INTERFACE) || usbSetupHeader.value || (usbSetupHeader.length != 1)) {\r
+      usbfwData.ep0Status = EP_STALL;\r
+\r
+   // Return the current alternate setting\r
+   } else {\r
+      usbSetupData.pBuffer = &usbfwData.pAlternateSetting[usbSetupHeader.index];\r
+      usbSetupData.bytesLeft = 1;\r
+      usbfwData.ep0Status = EP_TX;\r
+   }\r
+\r
+} // usbsrGetInterface\r
+\r
+\r
+\r
+\r
+/** \brief Processes the \ref SET_INTERFACE request (selects an alternate setting for the specified\r
+ * interface)\r
+ *\r
+ * Some USB devices have configurations with mutually exclusive interface settings. This request allows\r
+ * the host to select the desired alternate setting.\r
+ *\r
+ * This function uses the \c ConfigureEndpoints() to automatically setup the relevant endpoint\r
+ * registers.\r
+ *\r
+ * <b>Parameters</b>:\r
+ * - VALUE: Alternate setting\r
+ * - INDEX: Interface number\r
+ * - LENGTH: Always 0\r
+ */\r
+void usbsrSetInterface(void)\r
+{\r
+   USB_INTERFACE_DESCRIPTOR __code *pInterface;\r
+\r
+   // Sanity check\r
+   if ((usbfwData.usbState != DEV_CONFIGURED) || (usbSetupHeader.requestType != RT_OUT_INTERFACE) || usbSetupHeader.length) {\r
+      usbfwData.ep0Status = EP_STALL;\r
+\r
+   // Verify that the desired alternate setting is available, and then make the switch\r
+   } else {\r
+      if (pInterface = usbdpGetInterfaceDesc(usbfwData.configurationValue, usbSetupHeader.index, usbSetupHeader.value)) {\r
+         usbsrHookProcessEvent(USBSR_EVENT_INTERFACE_CHANGING, usbSetupHeader.index);\r
+         usbfwData.pAlternateSetting[usbSetupHeader.index] = usbSetupHeader.value;\r
+\r
+         // Configure all endpoints in this interface\r
+         ConfigureEndpoints(pInterface);\r
+         usbsrHookProcessEvent(USBSR_EVENT_INTERFACE_CHANGED, usbSetupHeader.index);\r
+\r
+      // This interface does not exist\r
+      } else {\r
+         usbfwData.ep0Status = EP_STALL;\r
+      }\r
+   }\r
+\r
+} // usbsrSetInterface\r
+\r
+//@}\r
+\r
+/*\r
++------------------------------------------------------------------------------\r
+|  Copyright 2004-2007 Texas Instruments Incorporated. All rights reserved.\r
+|\r
+|  IMPORTANT: Your use of this Software is limited to those specific rights\r
+|  granted under the terms of a software license agreement between the user who\r
+|  downloaded the software, his/her employer (which must be your employer) and\r
+|  Texas Instruments Incorporated (the "License"). You may not use this Software\r
+|  unless you agree to abide by the terms of the License. The License limits\r
+|  your use, and you acknowledge, that the Software may not be modified, copied\r
+|  or distributed unless embedded on a Texas Instruments microcontroller or used\r
+|  solely and exclusively in conjunction with a Texas Instruments radio\r
+|  frequency transceiver, which is integrated into your product. Other than for\r
+|  the foregoing purpose, you may not use, reproduce, copy, prepare derivative\r
+|  works of, modify, distribute, perform, display or sell this Software and/or\r
+|  its documentation for any purpose.\r
+|\r
+|  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE\r
+|  PROVIDED \93AS IS\94 WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED,\r
+|  INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE,\r
+|  NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL\r
+|  TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+|  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER\r
+|  LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING\r
+|  BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR\r
+|  CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT OF\r
+|  SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES\r
+|  (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+|\r
+|  Should you have any questions regarding your right to use this Software,\r
+|  contact Texas Instruments Incorporated at www.TI.com.\r
+|\r
++------------------------------------------------------------------------------\r
+*/\r
diff --git a/chronos-ti/Software Projects/RF Access Point/IAR/usb/library/usb_standard_requests.h b/chronos-ti/Software Projects/RF Access Point/IAR/usb/library/usb_standard_requests.h
new file mode 100755 (executable)
index 0000000..783e167
--- /dev/null
@@ -0,0 +1,201 @@
+/***********************************************************************************\r
+\r
+    Filename:     usb_standard_request.h\r
+\r
+    Description:  Handle USB standard requests.\r
+\r
+***********************************************************************************/\r
+\r
+#ifndef USBSTANDARDREQUESTS_H\r
+#define USBSTANDARDREQUESTS_H\r
+/** \addtogroup module_usb_standard_requests  USB Standard Requests (usbsr)\r
+ * \brief This module contains automated functions for processing USB standard requests\r
+ *\r
+ * The processing functions are based on the \ref module_usb_framework, and access to the user-provided\r
+ * USB descriptors through the \ref module_usb_descriptor_parser. All device classes and descriptor\r
+ * combinations are supported, with no need to write or modify any source code. However, as described\r
+ * below, some standard request must be fully or partially implemented by the user.\r
+ *\r
+ * \section section_usbsr_hooks Hooks\r
+ * Standard requests that are not supported by the USB library or that refer to non-standard features,\r
+ * are forwarded to the application via function hooks. This includes:\r
+ * \li All \ref SET_DESCRIPTOR requests (see \ref usbsrHookSetDescriptor())\r
+ * \li All \ref SYNCH_FRAME requests (see \ref usbsrHookSynchFrame())\r
+ * \li \ref CLEAR_FEATURE requests that refer to unknown features (see \ref usbsrHookClearFeature())\r
+ * \li \ref SET_FEATURE requests that refer to unknown features (see \ref usbsrHookSetFeature())\r
+ *\r
+ * These hooks must always be provided, however if the application does not either support the requests,\r
+ * it should just stall endpoint 0. The processing uses the same mechanisms as for class and vendor\r
+ * requests (refer to the \ref module_usb_framework module for detailed description and examples).\r
+ *\r
+ * When the \ref GET_STATUS request is received, the \ref usbsrHookModifyGetStatus() hook is always\r
+ * called, so that additional status bits may be added.\r
+ *\r
+ * To have any practical purpose, "OUT data phase" standard requests need to notify the application of\r
+ * certain events. This is done by passing the event via yet another function hook,\r
+ * \ref usbsrHookProcessEvent(uint8 event, uint8 index). For events related to interfaces and endpoints,\r
+ * the \c index parameter refers to an interface number or the least significant nibble of the endpoint\r
+ * address. The following events can be generated:\r
+ * \li \ref USBSR_EVENT_CONFIGURATION_CHANGING (the device configuration is about to change)\r
+ * \li \ref USBSR_EVENT_CONFIGURATION_CHANGED (the device configuration has changed)\r
+ * \li \ref USBSR_EVENT_INTERFACE_CHANGING (the alternate setting of the given interface is about to\r
+ *     change)\r
+ * \li \ref USBSR_EVENT_INTERFACE_CHANGED (the alternate setting of the given interface has changed)\r
+ * \li \ref USBSR_EVENT_REMOTE_WAKEUP_ENABLED (remote wakeup has been enabled by the host)\r
+ * \li \ref USBSR_EVENT_REMOTE_WAKEUP_DISABLED (remote wakeup has been disabled by the host)\r
+ * \li \ref USBSR_EVENT_EPIN_STALL_CLEARED (the given IN endpoint's stall condition has been cleared the\r
+ *     host)\r
+ * \li \ref USBSR_EVENT_EPIN_STALL_SET (the given IN endpoint has been stalled by the host)\r
+ * \li \ref USBSR_EVENT_EPOUT_STALL_CLEARED (the given OUT endpoint's stall condition has been cleared\r
+ *     the host)\r
+ * \li \ref USBSR_EVENT_EPOUT_STALL_SET (the given OUT endpoint has been stalled by the PC)\r
+ * @{\r
+ */\r
+\r
+\r
+//-------------------------------------------------------------------------------------------------------\r
+/// \name Standard Request Codes\r
+//@{\r
+\r
+/// Standard request that returns status for the specified recipient\r
+#define GET_STATUS           0x00\r
+/// Standard request that clears or disables a specific feature\r
+#define CLEAR_FEATURE        0x01\r
+/// Standard request that sets or enables a specific feature\r
+#define SET_FEATURE          0x03\r
+/// Standard request that sets the device address for all future device accesses\r
+#define SET_ADDRESS          0x05\r
+/// Standard request that returns the specified USB descriptor\r
+#define GET_DESCRIPTOR       0x06\r
+/// Standard request that may be used to update exitsting descriptors or new descriptors may be added\r
+#define SET_DESCRIPTOR       0x07\r
+/// Standard request that returns the current device configuration value\r
+#define GET_CONFIGURATION    0x08\r
+/// Standard request that sets the device configuration\r
+#define SET_CONFIGURATION    0x09\r
+/// Standard request that returns the selected alternate setting for the specified interface\r
+#define GET_INTERFACE        0x0A\r
+/// Standard request that selects an alternate setting for the specified interface\r
+#define SET_INTERFACE        0x0B\r
+/// Standard request that is used to set and then report an endpoint's synchronization frame\r
+#define SYNCH_FRAME          0x0C\r
+//@}\r
+//-------------------------------------------------------------------------------------------------------\r
+\r
+\r
+//-------------------------------------------------------------------------------------------------------\r
+/// \name Features Indexes\r
+//@{\r
+\r
+/// Endpoint feature: Halt\r
+#define ENDPOINT_HALT        0x00\r
+/// Device feature: Remote wakeup\r
+#define DEVICE_REMOTE_WAKEUP 0x01\r
+//@}\r
+//-------------------------------------------------------------------------------------------------------\r
+\r
+\r
+//-------------------------------------------------------------------------------------------------------\r
+/// \name Event Types\r
+//@{\r
+\r
+/// The device configuration is about to change\r
+#define USBSR_EVENT_CONFIGURATION_CHANGING  0x01\r
+/// The device configuration has changed\r
+#define USBSR_EVENT_CONFIGURATION_CHANGED   0x02\r
+/// The alternate setting of the given interface about to change (index = "interface index")\r
+#define USBSR_EVENT_INTERFACE_CHANGING      0x03\r
+/// The alternate setting of the given interface has changed (index = "interface index")\r
+#define USBSR_EVENT_INTERFACE_CHANGED       0x04\r
+/// Remote wakeup has been enabled by the host\r
+#define USBSR_EVENT_REMOTE_WAKEUP_ENABLED   0x05\r
+/// Remote wakeup has been disabled by the host\r
+#define USBSR_EVENT_REMOTE_WAKEUP_DISABLED  0x06\r
+/// The given IN endpoint has been unstalled by the PC (index = "endpoint address" & 0x0F)\r
+#define USBSR_EVENT_EPIN_STALL_CLEARED      0x07 /* Endpoint index */\r
+/// The given IN endpoint has been stalled by the PC (index = "endpoint address" & 0x0F)\r
+#define USBSR_EVENT_EPIN_STALL_SET          0x08 /* Endpoint index */\r
+/// The given OUT endpoint has been unstalled by the PC (index = "endpoint address" & 0x0F)\r
+#define USBSR_EVENT_EPOUT_STALL_CLEARED     0x09 /* Endpoint index */\r
+/// The given OUT endpoint has been stalled by the PC (index = "endpoint address" & 0x0F)\r
+#define USBSR_EVENT_EPOUT_STALL_SET         0x0A /* Endpoint index */\r
+//@}\r
+//-------------------------------------------------------------------------------------------------------\r
+\r
+\r
+//-------------------------------------------------------------------------------------------------------\r
+/// \name Standard Request Hooks\r
+//@{\r
+/// Refer to the \ref section_setup_handler_usage section for a description on how to process standard\r
+/// requests.\r
+\r
+/// Hook which is called upon reception of a \ref SET_DESCRIPTOR request\r
+void usbsrHookSetDescriptor(void);\r
+/// Hook which is called upon reception of a \ref SYNCH_FRAME request (unsupported).\r
+void usbsrHookSynchFrame(void);\r
+/// Hook which is called when a \ref CLEAR_FEATURE request refers to a an unsupported featureted.\r
+void usbsrHookClearFeature(void);\r
+/// Hook which is called when a \ref SET_FEATURE request refers to a an unsupported feature.\r
+void usbsrHookSetFeature(void);\r
+/// Hook for modifying a \ref GET_STATUS request before the status value is returned to the PC.\r
+void usbsrHookModifyGetStatus(uint8 recipient, uint8 index, uint16 __xdata *pStatus);\r
+/// Hook which is called upon a standard request generated event (unsupported).\r
+void usbsrHookProcessEvent(uint8 event, uint8 index);\r
+//@}\r
+//-------------------------------------------------------------------------------------------------------\r
+\r
+\r
+//-------------------------------------------------------------------------------------------------------\r
+/// \name Handled Standard Requests\r
+//@{\r
+void usbsrGetStatus(void);\r
+void usbsrClearFeature(void);\r
+void usbsrSetFeature(void);\r
+void usbsrSetAddress(void);\r
+void usbsrGetDescriptor(void);\r
+void usbsrGetConfiguration(void);\r
+void usbsrSetConfiguration(void);\r
+void usbsrGetInterface(void);\r
+void usbsrSetInterface(void);\r
+//@}\r
+//-------------------------------------------------------------------------------------------------------\r
+\r
+\r
+//@}\r
+\r
+/*\r
++------------------------------------------------------------------------------\r
+|  Copyright 2004-2007 Texas Instruments Incorporated. All rights reserved.\r
+|\r
+|  IMPORTANT: Your use of this Software is limited to those specific rights\r
+|  granted under the terms of a software license agreement between the user who\r
+|  downloaded the software, his/her employer (which must be your employer) and\r
+|  Texas Instruments Incorporated (the "License"). You may not use this Software\r
+|  unless you agree to abide by the terms of the License. The License limits\r
+|  your use, and you acknowledge, that the Software may not be modified, copied\r
+|  or distributed unless embedded on a Texas Instruments microcontroller or used\r
+|  solely and exclusively in conjunction with a Texas Instruments radio\r
+|  frequency transceiver, which is integrated into your product. Other than for\r
+|  the foregoing purpose, you may not use, reproduce, copy, prepare derivative\r
+|  works of, modify, distribute, perform, display or sell this Software and/or\r
+|  its documentation for any purpose.\r
+|\r
+|  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE\r
+|  PROVIDED \93AS IS\94 WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED,\r
+|  INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE,\r
+|  NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL\r
+|  TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+|  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER\r
+|  LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING\r
+|  BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR\r
+|  CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT OF\r
+|  SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES\r
+|  (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+|\r
+|  Should you have any questions regarding your right to use this Software,\r
+|  contact Texas Instruments Incorporated at www.TI.com.\r
+|\r
++------------------------------------------------------------------------------\r
+*/\r
+\r
+#endif\r
diff --git a/chronos-ti/Software Projects/RF Access Point/IAR/usb/library/usb_suspend.h b/chronos-ti/Software Projects/RF Access Point/IAR/usb/library/usb_suspend.h
new file mode 100755 (executable)
index 0000000..9fa4bb5
--- /dev/null
@@ -0,0 +1,142 @@
+/***********************************************************************************\r
+\r
+    Filename:     usb_suspend.h\r
+\r
+    Description:  Handle the USB suspend state.\r
+\r
+***********************************************************************************/\r
+\r
+#ifndef USBSUSPEND_H\r
+#define USBSUSPEND_H\r
+/** \addtogroup module_usb_suspend USB Suspend (usbsusp)\r
+ * \brief This module contains the functionality for USB suspend, USB resume and USB remote wakeup.\r
+ *\r
+ * All USB devices must support the suspended state to fully comply with the USB specification. Special\r
+ * care must be taken to implement this functionality correctly, so follow the instructions below\r
+ * carefully. Refer to the USB specification for detailed information on current consumption in suspend\r
+ * mode (how power consumption shall be measured, averaging, peak value etc.).\r
+ *\r
+ * \section usb_suspend_resume USB Suspend and Resume\r
+ * If there is no activity on the USB bus for a period longer than 3 ms, the MCU will generate a\r
+ * \ref USBIRQ_EVENT_SUSPEND event. The USB device must then enter suspend mode within 10 ms, where it\r
+ * draws no more than:\r
+ * \li 500 uA for low-power devices or high-power devices operating at lower-power\r
+ * \li 2.5 mA for high-power devices with remote wake-up enabled\r
+ *\r
+ * The library supports the USB suspend and resume functionality through a simple interface:\r
+ * \li Make sure that the 48 MHz XOSC is never turned off anywhere in the application.\r
+ * \li In the call to \ref usbirqInit(), add \ref USBIRQ_EVENT_SUSPEND and \ref USBIRQ_EVENT_RESUME\r
+ *     (optional) to the interrupt mask.\r
+ * \li Do NOT process \ref USBIRQ_EVENT_SUSPEND in \ref usbirqHookProcessEvents() or in any other\r
+ *     interrupt service routine. This may (or in most cases will) prevent the USB device from getting\r
+ *     out of suspend mode.\r
+ *\r
+ * \li In the main loop, add the code shown below. Make sure that this code is visited at least every\r
+ *     10 ms. If the worst-case path through the main loop uses more than 10 ms, the code block can be\r
+ *     inserted in multiple places in the loop until the requirement is met.\r
+ * \code\r
+ * // Process USB suspend events\r
+ * if (USBIRQ_GET_EVENT_MASK() & USBIRQ_EVENT_SUSPEND) {\r
+ *\r
+ *    // Clear the suspend event\r
+ *    USBIRQ_CLEAR_EVENTS(USBIRQ_EVENT_SUSPEND);\r
+ *\r
+ *    ... Do what needs to be done before entering power mode 1 here (e.g. turn off the radio, configure\r
+ *        I/O to minimize power consumption, start the sleep timer etc.) ...\r
+ *\r
+ *    // This function call will take the USB device into power mode 1. It will not return until resume\r
+ *    // signaling has been detected on the bus, or the remote wake-up function has been used. Other\r
+ *    // interrupts (for instance from I/O ports or the sleep timer) can be used during this period. When\r
+ *    // returning from these interrupts, the \ref usbsuspEnter() function (running here) will put the\r
+ *    // MCU back into power mode 1.\r
+ *    usbsuspEnter();\r
+ *\r
+ *    // At this point the event handler is up and running again. Clear the resume event.\r
+ *    USBIRQ_CLEAR_EVENTS(USBIRQ_EVENT_RESUME);\r
+ *\r
+ *    ... If a USBIRQ_EVENT_RESET event will affect the code that follows (before the event is processed\r
+ *        elsewhere), then make sure to handle it here also ...\r
+ *\r
+ *    ... Do what needs to be done to wake up from suspend mode (e.g. turn on the radio, reactivate I/O\r
+ *        and peripherals, turn off the sleep timer ...\r
+ * }\r
+ * \endcode\r
+ *\r
+ * \li All interrupts that run during suspension mode must start with the following code:\r
+ * \code\r
+ * while (!XOSC_STABLE);\r
+ * \endcode\r
+ *\r
+ * \section usb_remote_wakeup USB Remote Wakeup:\r
+ * Remote wakeup should be used when the USB device desires to initiate the resume process and wake up\r
+ * the host. In a radio application this may happen when a particular radio packet is received, for\r
+ * instance from a wireless keyboard or mouse.\r
+ *\r
+ * USB remote wakeup can only be performed if the host has given the device the privilege to do so. The\r
+ * privilege to perform remote wakeup is requested by setting bit 5 in the \c bmAttributes field in\r
+ * the \ref USB_CONFIGURATION_DESCRIPTOR. The host will then grant or recall the privilege through a\r
+ * SET_FEATURE request, which is communicated through a \ref USBSR_EVENT_REMOTE_WAKEUP_ENABLED or\r
+ * \ref USBSR_EVENT_REMOTE_WAKEUP_DISABLED event, respectively.\r
+ *\r
+ * The USB library handles the remote wakeup sequence automatically. Do the following to incorporate it\r
+ * into the application:\r
+ * \li Implement suspend and resume as described above.\r
+ * \li In the USB descriptor, set bit 5 in bmAttributes in the configuration descriptor.\r
+ * \li While the USB MCU is in USB suspend mode, remote wakeup can be performed from interrupt context\r
+ *     (e.g. the sleep timer interrupt) by calling \ref usbsuspDoRemoteWakeup(). This function will\r
+ *     return TRUE if successful or FALSE if remote wakeup is not permitted (by the host).\r
+ * @{\r
+ */\r
+#include "usb_firmware_library_headers.h"\r
+\r
+\r
+//-------------------------------------------------------------------------------------------------------\r
+// Suspend enter/exit hooks\r
+extern __xdata VFPTR pFnSuspendEnterHook;\r
+extern __xdata VFPTR pFnSuspendExitHook;\r
+\r
+//-------------------------------------------------------------------------------------------------------\r
+// Function prototypes\r
+void usbsuspEnter(void);\r
+uint8 usbsuspDoRemoteWakeup(void);\r
+void usbsuspStopPm1(void);\r
+//-------------------------------------------------------------------------------------------------------\r
+\r
+//@}\r
+\r
+/*\r
++------------------------------------------------------------------------------\r
+|  Copyright 2004-2007 Texas Instruments Incorporated. All rights reserved.\r
+|\r
+|  IMPORTANT: Your use of this Software is limited to those specific rights\r
+|  granted under the terms of a software license agreement between the user who\r
+|  downloaded the software, his/her employer (which must be your employer) and\r
+|  Texas Instruments Incorporated (the "License"). You may not use this Software\r
+|  unless you agree to abide by the terms of the License. The License limits\r
+|  your use, and you acknowledge, that the Software may not be modified, copied\r
+|  or distributed unless embedded on a Texas Instruments microcontroller or used\r
+|  solely and exclusively in conjunction with a Texas Instruments radio\r
+|  frequency transceiver, which is integrated into your product. Other than for\r
+|  the foregoing purpose, you may not use, reproduce, copy, prepare derivative\r
+|  works of, modify, distribute, perform, display or sell this Software and/or\r
+|  its documentation for any purpose.\r
+|\r
+|  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE\r
+|  PROVIDED \93AS IS\94 WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED,\r
+|  INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE,\r
+|  NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL\r
+|  TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,\r
+|  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER\r
+|  LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING\r
+|  BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR\r
+|  CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT OF\r
+|  SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES\r
+|  (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.\r
+|\r
+|  Should you have any questions regarding your right to use this Software,\r
+|  contact Texas Instruments Incorporated at www.TI.com.\r
+|\r
++------------------------------------------------------------------------------\r
+*/\r
+\r
+#endif\r
diff --git a/chronos-ti/Software Projects/RF Access Point/IAR/usb/usb_driver.r51 b/chronos-ti/Software Projects/RF Access Point/IAR/usb/usb_driver.r51
new file mode 100755 (executable)
index 0000000..8a78fa5
Binary files /dev/null and b/chronos-ti/Software Projects/RF Access Point/IAR/usb/usb_driver.r51 differ
diff --git a/chronos-ti/Software Projects/RF Access Point/IAR/wbsl/ioCCxx10_bitdef.h b/chronos-ti/Software Projects/RF Access Point/IAR/wbsl/ioCCxx10_bitdef.h
new file mode 100755 (executable)
index 0000000..7c84a0a
--- /dev/null
@@ -0,0 +1,1284 @@
+/******************************************************************************\r
+    Filename: ioCCxx10_bitdef.h\r
+\r
+    This file contains the bit definitions of registers in CCxx10\r
+\r
+    Copyright 2008 Texas Instruments, Inc.\r
+******************************************************************************/\r
+#ifndef _IOCCXX10_BITDEF_H\r
+#define _IOCCXX10_BITDEF_H\r
+\r
+\r
+\r
+/* SEE DATA SHEET FOR DETAILS ABOUT THE FOLLOWING BIT MASKS */\r
+\r
+\r
+\r
+/*******************************************************************************\r
+ * Memory Control Registers\r
+ */\r
+\r
+// MPAGE (0x93) - Memory Page Select\r
+\r
+// MEMCTR (0xC7) - Memory Arbiter Control\r
+#define MEMCTR_CACHD                      0x02\r
+#define MEMCTR_PREFD                      0x01\r
+\r
+\r
+/*******************************************************************************\r
+ * CPU Registers\r
+ */\r
+\r
+// DPH0 (0x83) - Data Pointer 0 High Byte\r
+\r
+// DPL0 (0x82) - Data Pointer 0 Low Byte\r
+\r
+// DPH1 (0x85) - Data Pointer 1 High Byte\r
+\r
+// DPL1 (0x84) - Data Pointer 1 Low Byte\r
+\r
+// DPS (0x92) - Data Pointer Select\r
+#define DPS_VDPS                          0x01\r
+\r
+\r
+// PSW (0xD0) - Progrttus Word - bit accessible SFR register\r
+\r
+// ACC (0xE0) - Accumulator - bit accessible SFR register\r
+\r
+// B (0xF0) - B Register - bit accessible SFR register\r
+\r
+// SP (0x81) - Stack Pointer\r
+\r
+\r
+/*******************************************************************************\r
+ * Interrupt Control Registers\r
+ */\r
+\r
+// IEN0 (0xA8) - Interrupt Enable 0 Register - bit accessible SFR register\r
+\r
+// IEN1 (0xB8) - Interrupt Enable 1 Register - bit accessible SFR register\r
+\r
+// IEN2 (0x9A) - Interrupt Enable 2 Register\r
+#define IEN2_WDTIE                        0x20\r
+#define IEN2_P1IE                         0x10\r
+#define IEN2_UTX1IE                       0x08\r
+#define IEN2_I2STXIE                      0x08\r
+#define IEN2_UTX0IE                       0x04\r
+#define IEN2_P2IE                         0x02\r
+#define IEN2_USBIE                        0x02\r
+#define IEN2_RFIE                         0x01\r
+\r
+\r
+// TCON (0x88) - CPU Interrupt Flag 1 - bit accessible SFR register\r
+\r
+// S0CON (0x98) - CPU Interrupt Flag 2 - bit accessible SFR register\r
+\r
+// S1CON (0x9B) - CPU Interrupt Flag 3\r
+#define S1CON_RFIF_1                      0x02\r
+#define S1CON_RFIF_0                      0x01\r
+\r
+\r
+// IRCON (0xC0) - CPU Interrupt Flag 4 - bit accessible SFR register\r
+\r
+// IRCON2 (0xE8) - CPU Interrupt Flag 5 - bit accessible SFR register\r
+\r
+// IP1 (0xB9) - Interrupt Priority 1\r
+#define IP1_IPG5                          0x20\r
+#define IP1_IPG4                          0x10\r
+#define IP1_IPG3                          0x08\r
+#define IP1_IPG2                          0x04\r
+#define IP1_IPG1                          0x02\r
+#define IP1_IPG0                          0x01\r
+\r
+// IP0 (0xA9) - Interrupt Priority 0\r
+#define IP0_IPG5                          0x20\r
+#define IP0_IPG4                          0x10\r
+#define IP0_IPG3                          0x08\r
+#define IP0_IPG2                          0x04\r
+#define IP0_IPG1                          0x02\r
+#define IP0_IPG0                          0x01\r
+\r
+\r
+\r
+/*******************************************************************************\r
+ * Power Management and Clocks\r
+ */\r
+\r
+// PCON (0x87) - Power Mode Control\r
+#define PCON_IDLE                         0x01\r
+\r
+\r
+// SLEEP (0xBE) - Sleep Mode Control\r
+#define SLEEP_USB_EN                      0x80\r
+#define SLEEP_XOSC_S                      0x40\r
+#define SLEEP_HFRC_S                      0x20\r
+#define SLEEP_RST                         0x18\r
+#define SLEEP_RST0                        0x08\r
+#define SLEEP_RST1                        0x10\r
+#define SLEEP_OSC_PD                      0x04\r
+#define SLEEP_MODE                        0x03\r
+#define SLEEP_MODE1                       0x02\r
+#define SLEEP_MODE0                       0x01\r
+\r
+#define SLEEP_RST_POR_BOD                 (0x00 << 3)\r
+#define SLEEP_RST_EXT                     (0x01 << 3)\r
+#define SLEEP_RST_WDT                     (0x02 << 3)\r
+\r
+#define SLEEP_MODE_PM0                    (0x00)\r
+#define SLEEP_MODE_PM1                    (0x01)\r
+#define SLEEP_MODE_PM2                    (0x02)\r
+#define SLEEP_MODE_PM3                    (0x03)\r
+\r
+\r
+// CLKCON (0xC6) - Clock Control\r
+#define CLKCON_OSC32                      0x80  // bit mask, for the slow 32k clock oscillator\r
+#define CLKCON_OSC                        0x40  // bit mask, for the system clock oscillator\r
+#define CLKCON_TICKSPD                    0x38  // bit mask, for timer ticks output setting\r
+#define CLKCON_TICKSPD0                   0x08  // bit mask, for timer ticks output setting\r
+#define CLKCON_TICKSPD1                   0x10  // bit mask, for timer ticks output setting\r
+#define CLKCON_TICKSPD2                   0x20  // bit mask, for timer ticks output setting\r
+#define CLKCON_CLKSPD                     0x07  // bit mask, for the clock speed\r
+#define CLKCON_CLKSPD0                    0x01  // bit mask, for the clock speed\r
+#define CLKCON_CLKSPD1                    0x02  // bit mask, for the clock speed\r
+#define CLKCON_CLKSPD2                    0x04  // bit mask, for the clock speed\r
+\r
+#define TICKSPD_DIV_1                     (0x00 << 3)\r
+#define TICKSPD_DIV_2                     (0x01 << 3)\r
+#define TICKSPD_DIV_4                     (0x02 << 3)\r
+#define TICKSPD_DIV_8                     (0x03 << 3)\r
+#define TICKSPD_DIV_16                    (0x04 << 3)\r
+#define TICKSPD_DIV_32                    (0x05 << 3)\r
+#define TICKSPD_DIV_64                    (0x06 << 3)\r
+#define TICKSPD_DIV_128                   (0x07 << 3)\r
+\r
+#define CLKSPD_DIV_1                      (0x00)\r
+#define CLKSPD_DIV_2                      (0x01)\r
+#define CLKSPD_DIV_4                      (0x02)\r
+#define CLKSPD_DIV_8                      (0x03)\r
+#define CLKSPD_DIV_16                     (0x04)\r
+#define CLKSPD_DIV_32                     (0x05)\r
+#define CLKSPD_DIV_64                     (0x06)\r
+#define CLKSPD_DIV_128                    (0x07)\r
+\r
+\r
+\r
+/*******************************************************************************\r
+ *  Flash Controller\r
+ */\r
+\r
+// FCTL (0xAE) - Flash Control\r
+#define FCTL_BUSY                         0x80\r
+#define FCTL_SWBSY                        0x40\r
+#define FCTL_CONTRD                       0x10\r
+#define FCTL_WRITE                        0x02\r
+#define FCTL_ERASE                        0x01\r
+\r
+\r
+// FWDATA (0xAF) - Flash Write Data\r
+\r
+// FADDRH (0xAD) - Flash Address High Byte\r
+\r
+// FADDRL (0xAC) - Flash Address Low Byte\r
+\r
+// FWT (0xAB) - Flash Write Timing (Only bit 0-5 R/W)\r
+\r
+\r
+/*******************************************************************************\r
+ * I/O Ports\r
+ */\r
+\r
+// P0 (0x80) - Port 0 - bit accessible SFR register\r
+\r
+// P1 (0x90) - Port 1 - bit accessible SFR register\r
+\r
+// P2 (0xA0) - Port 2 - bit accessible SFR register\r
+\r
+// PERCFG (0xF1) - Peripheral Control\r
+#define PERCFG_T1CFG                      0x40\r
+#define PERCFG_T3CFG                      0x20\r
+#define PERCFG_T4CFG                      0x10\r
+#define PERCFG_U1CFG                      0x02\r
+#define PERCFG_U0CFG                      0x01\r
+\r
+\r
+\r
+// ADCCFG (0xF2) - ADC input Configuration\r
+#define ADCCFG_7                          0x80\r
+#define ADCCFG_6                          0x40\r
+#define ADCCFG_5                          0x20\r
+#define ADCCFG_4                          0x10\r
+#define ADCCFG_3                          0x08\r
+#define ADCCFG_2                          0x04\r
+#define ADCCFG_1                          0x02\r
+#define ADCCFG_0                          0x01\r
+\r
+\r
+// P0SEL (0xF3) - Port 0 Function Select (bit 7 not used)\r
+\r
+// P1SEL (0xF4) - Port 1 Function Select\r
+\r
+// P2SEL (0xF5) - Port 2 Function Select\r
+#define P2SEL_PRI3P1                      0x40\r
+#define P2SEL_PRI2P1                      0x20\r
+#define P2SEL_PRI1P1                      0x10\r
+#define P2SEL_PRI0P1                      0x08\r
+#define P2SEL_SELP2_4                     0x04\r
+#define P2SEL_SELP2_3                     0x02\r
+#define P2SEL_SELP2_0                     0x01\r
+\r
+\r
+// P0DIR (0xFD) - Port 0 Direction Select\r
+\r
+// P1DIR (0xFE) - Port 1 Direction Select\r
+\r
+// P2DIR (0xFF) - Port 2 Direction\r
+#define P2DIR_PRIP0                       0xC0\r
+#define P2DIR_0PRIP0                      0x40\r
+#define P2DIR_1PRIP0                      0x80\r
+#define P2DIR_DIRP2                       0x1F\r
+\r
+#define P2DIR_PRIP0_0                     (0x00 << 6)\r
+#define P2DIR_PRIP0_1                     (0x01 << 6)\r
+#define P2DIR_PRIP0_2                     (0x02 << 6)\r
+#define P2DIR_PRIP0_3                     (0x03 << 6)\r
+\r
+#define P2DIR_DIRP2_4                     (0x10)\r
+#define P2DIR_DIRP2_3                     (0x08)\r
+#define P2DIR_DIRP2_2                     (0x04)\r
+#define P2DIR_DIRP2_1                     (0x02)\r
+#define P2DIR_DIRP2_0                     (0x01)\r
+\r
+\r
+\r
+// P0INP (0x8F) - Port 0 Input Mode (bit 0 & 1 not used)\r
+\r
+// P1INP (0xF6) - Port 1 Input Mode (bit 0 & 1 not used)\r
+\r
+// P2INP (0xF7) - Port 2 Input Mode\r
+#define P2INP_PDUP2                       0x80\r
+#define P2INP_PDUP1                       0x40\r
+#define P2INP_PDUP0                       0x20\r
+#define P2INP_MDP2                        0x1F\r
+\r
+#define P2INP_MDP2_0                      (0x01)\r
+#define P2INP_MDP2_1                      (0x02)\r
+#define P2INP_MDP2_2                      (0x04)\r
+#define P2INP_MDP2_3                      (0x08)\r
+#define P2INP_MDP2_4                      (0x10)\r
+\r
+\r
+\r
+// P0IFG (0x89) - Port 0 Interrupt Status Flag\r
+\r
+// P1IFG (0x8A) - Port 1 Interrupt Status Flag\r
+\r
+// P2IFG (0x8B) - Port 2 Interrupt Status Flag (bit 7 - 5 not used)\r
+\r
+// PICTL (0x8C) - Port Interrupt Control\r
+#define PICTL_PADSC                       0x40\r
+#define PICTL_P2IEN                       0x20\r
+#define PICTL_P0IENH                      0x10\r
+#define PICTL_P0IENL                      0x08\r
+#define PICTL_P2ICON                      0x04\r
+#define PICTL_P1ICON                      0x02\r
+#define PICTL_P0ICON                      0x01\r
+\r
+\r
+// P1IEN (0x8D) - Port 1 Interrupt Mask\r
+\r
+\r
+\r
+/*******************************************************************************\r
+ * DMA Controller\r
+ */\r
+\r
+// DMAARM (0xD6) - DMA Channel Arm\r
+#define DMAARM_ABORT                      0x80\r
+#define DMAARM4                           0x10\r
+#define DMAARM3                           0x08\r
+#define DMAARM2                           0x04\r
+#define DMAARM1                           0x02\r
+#define DMAARM0                           0x01\r
+\r
+\r
+// DMAREQ (0xD7) - DMA Channel Start Request and Status\r
+#define DMAREQ4                           0x10\r
+#define DMAREQ3                           0x08\r
+#define DMAREQ2                           0x04\r
+#define DMAREQ1                           0x02\r
+#define DMAREQ0                           0x01\r
+\r
+\r
+// DMA0CFGH (0xD5) - DMA Channel 0 Configuration Address High Byte\r
+\r
+// DMA0CFGL (0xD4) - DMA Channel 0 Configuration Address Low Byte\r
+\r
+// DMA1CFGH (0xD3) - DMA Channel 1 - 4 Configuration Address High By\r
+\r
+// DMA1CFGL (0xD2) - DMA Channel 1 - 4 Configuration Address Low Byte\r
+\r
+// DMAIRQ (0xD1) - DMA Interrupt Flag\r
+#define DMAIRQ_DMAIF4                     0x10\r
+#define DMAIRQ_DMAIF3                     0x08\r
+#define DMAIRQ_DMAIF2                     0x04\r
+#define DMAIRQ_DMAIF1                     0x02\r
+#define DMAIRQ_DMAIF0                     0x01\r
+\r
+\r
+// T1CNTH (0xE3) - Timer 1 Counter High\r
+\r
+// T1CNTL (0xE2) - Timer 1 Counter Low\r
+\r
+// T1CTL (0xE4) - Timer 1 Control and Status\r
+#define T1CTL_CH2IF                       0x80 // Timer 1 channel 2 interrupt flag\r
+#define T1CTL_CH1IF                       0x40 // Timer 1 channel 1 interrupt flag\r
+#define T1CTL_CH0IF                       0x20 // Timer 1 channel 0 interrupt flag\r
+#define T1CTL_OVFIF                       0x10 // Timer 1 counter overflow interrupt flag\r
+#define T1CTL_DIV                         0x0C\r
+#define T1CTL_DIV0                        0x04\r
+#define T1CTL_DIV1                        0x08\r
+#define T1CTL_MODE                        0x03\r
+#define T1CTL_MODE0                       0x01\r
+#define T1CTL_MODE1                       0x02\r
+\r
+#define T1CTL_DIV_1                       (0x00 << 2) // Divide tick frequency by 1\r
+#define T1CTL_DIV_8                       (0x01 << 2) // Divide tick frequency by 8\r
+#define T1CTL_DIV_32                      (0x02 << 2) // Divide tick frequency by 32\r
+#define T1CTL_DIV_128                     (0x03 << 2) // Divide tick frequency by 128\r
+\r
+#define T1CTL_MODE_SUSPEND                (0x00)    // Operation is suspended (halt)\r
+#define T1CTL_MODE_FREERUN                (0x01)    // Free Running mode\r
+#define T1CTL_MODE_MODULO                 (0x02)    // Modulo\r
+#define T1CTL_MODE_UPDOWN                 (0x03)    // Up/down\r
+\r
+\r
+// T1CCTL0 (0xE5) - Timer 1 Channel 0 Capture/Compare Control\r
+#define T1CCTL0_CPSEL                     0x80    // Timer 1 channel 0 capture select\r
+#define T1CCTL0_IM                        0x40    // Channel 0 Interrupt mask\r
+#define T1CCTL0_CMP                       0x38\r
+#define T1CCTL0_CMP0                      0x08\r
+#define T1CCTL0_CMP1                      0x10\r
+#define T1CCTL0_CMP2                      0x20\r
+#define T1CCTL0_MODE                      0x04    // Capture or compare mode\r
+#define T1CCTL0_CAP                       0x03\r
+#define T1CCTL0_CAP0                      0x01\r
+#define T1CCTL0_CAP1                      0x02\r
+\r
+#define T1C0_SET_ON_CMP                   (0x00 << 3)    // Clear output on compare-up set on 0\r
+#define T1C0_CLR_ON_CMP                   (0x01 << 3)    // Set output on compare-up clear on 0\r
+#define T1C0_TOG_ON_CMP                   (0x02 << 3)    // Toggle output on compare\r
+#define T1C0_SET_CMP_UP_CLR_0             (0x03 << 3)    // Clear output on compare\r
+#define T1C0_CLR_CMP_UP_SET_0             (0x04 << 3)    // Set output on compare\r
+\r
+#define T1C0_NO_CAP                       (0x00)    // No capture\r
+#define T1C0_RISE_EDGE                    (0x01)    // Capture on rising edge\r
+#define T1C0_FALL_EDGE                    (0x02)    // Capture on falling edge\r
+#define T1C0_BOTH_EDGE                    (0x03)    // Capture on both edges\r
+\r
+\r
+// T1CC0H (0xDB) - Timer 1 Channel 0 Capture/Compare Value High\r
+\r
+// T1CC0L (0xDA) - Timer 1 Channel 0 Capture/Compare Value Low\r
+\r
+// T1CCTL1 (0xE6) - Timer 1 Channel 1 Capture/Compare Control\r
+#define T1CCTL1_CPSEL                     0x80    // Timer 1 channel 1 capture select\r
+#define T1CCTL1_IM                        0x40    // Channel 1 Interrupt mask\r
+#define T1CCTL1_CMP                       0x38\r
+#define T1CCTL1_CMP0                      0x08\r
+#define T1CCTL1_CMP1                      0x10\r
+#define T1CCTL1_CMP2                      0x20\r
+#define T1CCTL1_MODE                      0x04    // Capture or compare mode\r
+#define T1CCTL1_DSM_SPD                   0x04\r
+#define T1CCTL1_CAP                       0x03\r
+#define T1CCTL1_CAP0                      0x01\r
+#define T1CCTL1_CAP1                      0x02\r
+\r
+#define T1C1_SET_ON_CMP                   (0x00 << 3)  // Set output on compare\r
+#define T1C1_CLR_ON_CMP                   (0x01 << 3)  // Clear output on compare\r
+#define T1C1_TOG_ON_CMP                   (0x02 << 3)  // Toggle output on compare\r
+#define T1C1_SET_CMP_UP_CLR_0             (0x03 << 3)  // Set output on compare-up clear on 0\r
+#define T1C1_CLR_CMP_UP_SET_0             (0x04 << 3)  // Clear output on compare-up set on 0\r
+#define T1C1_SET_C1_CLR_C0                (0x05 << 3)  // Set when equal to T1CC1, clear when equal to T1CC0\r
+#define T1C1_CLR_C1_SET_C0                (0x06 << 3)  // Clear when equal to T1CC1, set when equal to T1CC0\r
+#define T1C1_DSM_MODE                     (0x07 << 3)  // DSM mode\r
+\r
+#define T1C1_NO_CAP                       (0x00)     // No capture\r
+#define T1C1_RISE_EDGE                    (0x01)    // Capture on rising edge\r
+#define T1C1_FALL_EDGE                    (0x02)    // Capture on falling edge\r
+#define T1C1_BOTH_EDGE                    (0x03)    // Capture on both edges\r
+\r
+#define DSM_IP_ON_OS_ON                   (0x00)    // Interpolator & output shaping enabled\r
+#define DSM_IP_ON_OS_OFF                  (0x01)    // Interpolator enabled & output shaping disabled\r
+#define DSM_IP_OFF_OS_ON                  (0x02)    // Interpolator disabled & output shaping enabled\r
+#define DSM_IP_OFF_OS_OFF                 (0x03)    // Interpolator & output shaping disabled\r
+\r
+\r
+\r
+// T1CC1H (0xDD) - Timer 1 Channel 1 Capture/Compare Value High\r
+\r
+// T1CC1L (0xDC) - Timer 1 Channel 1 Capture/Compare Value Low\r
+\r
+// T1CCTL2 (0xE7) - Timer 1 Channel 2 Capture/Compare Control\r
+#define T1CCTL2_CPSEL                     0x80    // Timer 1 channel 2 capture select\r
+#define T1CCTL2_IM                        0x40    // Channel 2 Interrupt mask\r
+#define T1CCTL2_CMP                       0x38\r
+#define T1CCTL2_CMP0                      0x08\r
+#define T1CCTL2_CMP1                      0x10\r
+#define T1CCTL2_CMP2                      0x20\r
+#define T1CCTL2_MODE                      0x04    // Capture or compare mode\r
+#define T1CCTL2_CAP                       0x03\r
+#define T1CCTL2_CAP0                      0x01\r
+#define T1CCTL2_CAP1                      0x02\r
+\r
+#define T1C2_SET_ON_CMP                   (0x00 << 3)  // Set output on compare\r
+#define T1C2_CLR_ON_CMP                   (0x01 << 3)  // Clear output on compare\r
+#define T1C2_TOG_ON_CMP                   (0x02 << 3)  // Toggle output on compare\r
+#define T1C2_SET_CMP_UP_CLR_0             (0x03 << 3)  // Set output on compare-up clear on 0\r
+#define T1C2_CLR_CMP_UP_SET_0             (0x04 << 3)  // Clear output on compare-up set on 0\r
+#define T1C2_SET_C2_CLR_C0                (0x05 << 3)  // Set when equal to T1CC2, clear when equal to T1CC0\r
+#define T1C2_CLR_C2_SET_C0                (0x06 << 3)  // Clear when equal to T1CC2, set when equal to T1CC0\r
+\r
+#define T1C2_NO_CAP                       (0x00)     // No capture\r
+#define T1C2_RISE_EDGE                    (0x01)    // Capture on rising edge\r
+#define T1C2_FALL_EDGE                    (0x02)    // Capture on falling edge\r
+#define T1C2_BOTH_EDGE                    (0x03)    // Capture on both edges\r
+\r
+\r
+// T1CC2H (0xDF) - Timer 1 Channel 2 Capture/Compare Value High\r
+\r
+// T1CC2L (0xDE) - Timer 1 Channel 2 Capture/Compare Value Low\r
+\r
+// T2CTL (0x9E) - Timer 2 Control\r
+#define T2CTL_TEX                         0x40\r
+#define T2CTL_INT                         0x10    // Enable Timer 2 interrupt\r
+#define T2CTL_TIG                         0x04    // Tick generator mode\r
+#define T2CTL_TIP                         0x03\r
+#define T2CTL_TIP0                        0x01\r
+#define T2CTL_TIP1                        0x02\r
+\r
+#define T2CTL_TIP_64                      (0x00)\r
+#define T2CTL_TIP_128                     (0x01)\r
+#define T2CTL_TIP_256                     (0x02)\r
+#define T2CTL_TIP_1024                    (0x03)\r
+\r
+\r
+// T2CT (0x9C) - Timer 2 Count\r
+\r
+// T2PR (0x9D) - Timer 2 Prescaler\r
+\r
+// WORTIME0 (0xA5) - Sleep Timer Low Byte\r
+\r
+// WORTIME1 (0xA6) - Sleep Timer High Byte\r
+\r
+// WOREVT1 (0xA4) - Sleep Timer Event0 Timeout High\r
+\r
+// WOREVT0 (0xA3) - Sleep Timer Event0 Timeout Low\r
+\r
+// WORCTL (0xA2) - Sleep Timer Control\r
+#define WORCTL_WOR_RESET                  0x04\r
+#define WORCTL_WOR_RES                    0x03\r
+#define WORCTL_WOR_RES0                   0x01\r
+#define WORCTL_WOR_RES1                   0x02\r
+\r
+#define WORCTL_WOR_RES_1                  (0x00)\r
+#define WORCTL_WOR_RES_32                 (0x01)\r
+#define WORCTL_WOR_RES_1024               (0x02)\r
+#define WORCTL_WOR_RES_32768              (0x03)\r
+\r
+\r
+// WORIRQ (0xA1) - Sleep Timer Interrupt Control\r
+#define WORIRQ_EVENT0_MASK                0x10\r
+#define WORIRQ_EVENT0_FLAG                0x01\r
+\r
+\r
+// T3CNT (0xCA) - Timer 3 Counter\r
+\r
+// T3CTL (0xCB) - Timer 3 Control\r
+#define T3CTL_DIV                         0xE0\r
+#define T3CTL_DIV0                        0x20\r
+#define T3CTL_DIV1                        0x40\r
+#define T3CTL_DIV2                        0x80\r
+#define T3CTL_START                       0x10\r
+#define T3CTL_OVFIM                       0x08\r
+#define T3CTL_CLR                         0x04\r
+#define T3CTL_MODE                        0x03\r
+#define T3CTL_MODE0                       0x01\r
+#define T3CTL_MODE1                       0x02\r
+\r
+#define T3CTL_DIV_1                       (0x00 << 5)\r
+#define T3CTL_DIV_2                       (0x01 << 5)\r
+#define T3CTL_DIV_4                       (0x02 << 5)\r
+#define T3CTL_DIV_8                       (0x03 << 5)\r
+#define T3CTL_DIV_16                      (0x04 << 5)\r
+#define T3CTL_DIV_32                      (0x05 << 5)\r
+#define T3CTL_DIV_64                      (0x06 << 5)\r
+#define T3CTL_DIV_128                     (0x07 << 5)\r
+\r
+#define T3CTL_MODE_FREERUN                (0x00)\r
+#define T3CTL_MODE_DOWN                   (0x01)\r
+#define T3CTL_MODE_MODULO                 (0x02)\r
+#define T3CTL_MODE_UPDOWN                 (0x03)\r
+\r
+\r
+\r
+// T3CCTL0 (0xCC) - Timer 3 Channel 0 Compare Control\r
+#define T3CCTL0_IM                        0x40\r
+#define T3CCTL0_MODE                      0x04\r
+#define T3CCTL0_CMP                       0x38\r
+#define T3CCTL0_CMP0                      0x08\r
+#define T3CCTL0_CMP1                      0x10\r
+#define T3CCTL0_CMP2                      0x20\r
+\r
+#define T3C0_SET_ON_CMP                   (0x00 << 3)  // Set output on compare\r
+#define T3C0_CLR_ON_CMP                   (0x01 << 3)  // Clear output on compare\r
+#define T3C0_TOG_ON_CMP                   (0x02 << 3)  // Toggle output on compare\r
+#define T3C0_SET_CMP_UP_CLR_0             (0x03 << 3)  // Set output on compare-up clear on 0\r
+#define T3C0_CLR_CMP_UP_SET_0             (0x04 << 3)  // Clear output on compare-up set on 0\r
+#define T3C0_SET_CMP_CLR_255              (0x05 << 3)  // Set when equal to T3CC0, clear on 255\r
+#define T3C0_CLR_CMP_SET_0                (0x06 << 3)  // Clear when equal to T3CC0, set on 0\r
+\r
+\r
+\r
+// T3CC0 (0xCD) - Timer 3 Channel 0 Compare Value\r
+\r
+// T3CCTL1 (0xCE) - Timer 3 Channel 1 Compare Control\r
+\r
+#define T3CCTL1_IM                        0x40\r
+#define T3CCTL1_MODE                      0x04\r
+#define T3CCTL1_CMP                       0x38\r
+#define T3CCTL1_CMP0                      0x08\r
+#define T3CCTL1_CMP1                      0x10\r
+#define T3CCTL1_CMP2                      0x20\r
+\r
+#define T3C1_SET_ON_CMP                   (0x00 << 3)  // Set output on compare\r
+#define T3C1_CLR_ON_CMP                   (0x01 << 3)  // Clear output on compare\r
+#define T3C1_TOG_ON_CMP                   (0x02 << 3)  // Toggle output on compare\r
+#define T3C1_SET_CMP_UP_CLR_0             (0x03 << 3)  // Set output on compare-up clear on 0\r
+#define T3C1_CLR_CMP_UP_SET_0             (0x04 << 3)  // Clear output on compare-up set on 0\r
+#define T3C1_SET_CMP_CLR_C0               (0x05 << 3)  // Set when equal to T3CC1, clear when equal to T3CC0\r
+#define T3C1_CLR_CMP_SET_C0               (0x06 << 3)  // Clear when equal to T3CC1, set when equal to T3CC0\r
+\r
+\r
+// T3CC1 (0xCF) - Timer 3 Channel 1 Compare Value\r
+\r
+// T4CNT (0xEA) - Timer 4 Counter\r
+\r
+// T4CTL (0xEB) - Timer 4 Control\r
+#define T4CTL_DIV                         0xE0\r
+#define T4CTL_DIV0                        0x20\r
+#define T4CTL_DIV1                        0x40\r
+#define T4CTL_DIV2                        0x80\r
+#define T4CTL_START                       0x10\r
+#define T4CTL_OVFIM                       0x08\r
+#define T4CTL_CLR                         0x04\r
+#define T4CTL_MODE                        0x03\r
+#define T4CTL_MODE0                       0x01\r
+#define T4CTL_MODE1                       0x02\r
+\r
+#define T4CTL_MODE_FREERUN                (0x00)\r
+#define T4CTL_MODE_DOWN                   (0x01)\r
+#define T4CTL_MODE_MODULO                 (0x02)\r
+#define T4CTL_MODE_UPDOWN                 (0x03)\r
+\r
+#define T4CTL_DIV_1                       (0x00 << 5)\r
+#define T4CTL_DIV_2                       (0x01 << 5)\r
+#define T4CTL_DIV_4                       (0x02 << 5)\r
+#define T4CTL_DIV_8                       (0x03 << 5)\r
+#define T4CTL_DIV_16                      (0x04 << 5)\r
+#define T4CTL_DIV_32                      (0x05 << 5)\r
+#define T4CTL_DIV_64                      (0x06 << 5)\r
+#define T4CTL_DIV_128                     (0x07 << 5)\r
+\r
+\r
+// T4CCTL0 (0xEC) - Timer 4 Channel 0 Compare Control\r
+#define T4CCTL0_IM                        0x40\r
+#define T4CCTL0_CMP                       0x38\r
+#define T4CCTL0_CMP0                      0x08\r
+#define T4CCTL0_CMP1                      0x10\r
+#define T4CCTL0_CMP2                      0x20\r
+#define T4CCTL0_MODE                      0x04\r
+\r
+#define T4CCTL0_SET_ON_CMP                (0x00 << 3)\r
+#define T4CCTL0_CLR_ON_CMP                (0x01 << 3)\r
+#define T4CCTL0_TOG_ON_CMP                (0x02 << 3)\r
+#define T4CCTL0_SET_CMP_UP_CLR_0          (0x03 << 3)\r
+#define T4CCTL0_CLR_CMP_UP_SET_0          (0x04 << 3)\r
+#define T4CCTL0_SET_CMP_CLR_255           (0x05 << 3)\r
+#define T4CCTL0_CLR_CMP_SET_0             (0x06 << 3)\r
+\r
+\r
+// T4CC0 (0xED) - Timer 4 Channel 0 Compare Value\r
+\r
+// T4CCTL1 (0xEE) - Timer 4 Channel 1 Compare Control\r
+#define T4CCTL1_IM                        0x40\r
+#define T4CCTL1_CMP                       0x38\r
+#define T4CCTL1_CMP0                      0x08\r
+#define T4CCTL1_CMP1                      0x10\r
+#define T4CCTL1_CMP2                      0x20\r
+#define T4CCTL1_MODE                      0x04\r
+\r
+#define T4CCTL1_SET_ON_CMP                (0x00 << 3)\r
+#define T4CCTL1_CLR_ON_CMP                (0x01 << 3)\r
+#define T4CCTL1_TOG_ON_CMP                (0x02 << 3)\r
+#define T4CCTL1_SET_CMP_UP_CLR_0          (0x03 << 3)\r
+#define T4CCTL1_CLR_CMP_UP_SET_0          (0x04 << 3)\r
+#define T4CCTL1_SET_CMP_CLR_C0            (0x05 << 3)\r
+#define T4CCTL1_CLR_CMP_SET_C0            (0x06 << 3)\r
+\r
+\r
+// TIMIF (0xD8) - Timers 1/3/4 Interrupt Mask/Flag - bit accessible SFR register\r
+\r
+\r
+/*******************************************************************************\r
+ * ADC\r
+ */\r
+\r
+// ADCL (0xBA) - ADC Data Low (only bit 7-4 used)\r
+\r
+// ADCH (0xBB) - ADC Data High\r
+\r
+// ADCCON1 (0xB4) - ADC Control 1\r
+#define ADCCON1_EOC                       0x80\r
+#define ADCCON1_ST                        0x40\r
+#define ADCCON1_STSEL                     0x30\r
+#define ADCCON1_STSEL0                    0x10\r
+#define ADCCON1_STSEL1                    0x20\r
+#define ADCCON1_RCTRL                     0x0C\r
+#define ADCCON1_RCTRL0                    0x04\r
+#define ADCCON1_RCTRL1                    0x08\r
+\r
+#define STSEL_P2_0                        (0x00 << 4)\r
+#define STSEL_FULL_SPEED                  (0x01 << 4)\r
+#define STSEL_T1C0_CMP_EVT                (0x02 << 4)\r
+#define STSEL_ST                          (0x03 << 4)\r
+\r
+#define ADCCON1_RCTRL_COMPL               (0x00 << 2)\r
+#define ADCCON1_RCTRL_LFSR13              (0x01 << 2)\r
+\r
+\r
+\r
+// ADCCON2 (0xB5) - ADC Control 2\r
+#define ADCCON2_SREF                      0xC0\r
+#define ADCCON2_SREF0                     0x40\r
+#define ADCCON2_SREF1                     0x80\r
+#define ADCCON2_SDIV                      0x30\r
+#define ADCCON2_SDIV0                     0x10\r
+#define ADCCON2_SDIV1                     0x20\r
+#define ADCCON2_SCH                       0x0F\r
+#define ADCCON2_SCH0                      0x01\r
+#define ADCCON2_SCH1                      0x02\r
+#define ADCCON2_SCH2                      0x04\r
+#define ADCCON2_SCH3                      0x08\r
+\r
+#define ADCCON2_SREF_1_25V                (0x00 << 6)\r
+#define ADCCON2_SREF_P0_7                 (0x01 << 6)\r
+#define ADCCON2_SREF_AVDD                 (0x02 << 6)\r
+#define ADCCON2_SREF_P0_6_P0_7            (0x03 << 6)\r
+\r
+#define ADCCON2_SDIV_64                   (0x00 << 4)\r
+#define ADCCON2_SDIV_128                  (0x01 << 4)\r
+#define ADCCON2_SDIV_256                  (0x02 << 4)\r
+#define ADCCON2_SDIV_512                  (0x03 << 4)\r
+\r
+#define ADCCON2_SCH_AIN0                  (0x00)\r
+#define ADCCON2_SCH_AIN1                  (0x01)\r
+#define ADCCON2_SCH_AIN2                  (0x02)\r
+#define ADCCON2_SCH_AIN3                  (0x03)\r
+#define ADCCON2_SCH_AIN4                  (0x04)\r
+#define ADCCON2_SCH_AIN5                  (0x05)\r
+#define ADCCON2_SCH_AIN6                  (0x06)\r
+#define ADCCON2_SCH_AIN7                  (0x07)\r
+#define ADCCON2_SCH_AIN0_1                (0x08)\r
+#define ADCCON2_SCH_AIN2_3                (0x09)\r
+#define ADCCON2_SCH_AIN4_5                (0x0A)\r
+#define ADCCON2_SCH_AIN6_7                (0x0B)\r
+#define ADCCON2_SCH_GND                   (0x0C)\r
+#define ADCCON2_SCH_POSVOL                (0x0D)\r
+#define ADCCON2_SCH_TEMPR                 (0x0E)\r
+#define ADCCON2_SCH_VDD_3                 (0x0F)\r
+\r
+\r
+// ADCCON3 (0xB6) - ADC Control 3\r
+#define ADCCON3_EREF                      0xC0\r
+#define ADCCON3_EREF0                     0x40\r
+#define ADCCON3_EREF1                     0x80\r
+#define ADCCON3_EDIV                      0x30\r
+#define ADCCON3_EDIV0                     0x10\r
+#define ADCCON3_EDIV1                     0x20\r
+#define ADCCON2_ECH                       0x0F\r
+#define ADCCON2_ECH0                      0x01\r
+#define ADCCON2_ECH1                      0x02\r
+#define ADCCON2_ECH2                      0x04\r
+#define ADCCON2_ECH3                      0x08\r
+\r
+#define ADCCON3_EREF_1_25V                (0x00 << 6)\r
+#define ADCCON3_EREF_P0_7                 (0x01 << 6)\r
+#define ADCCON3_EREF_AVDD                 (0x02 << 6)\r
+#define ADCCON3_EREF_P0_6_P0_7            (0x03 << 6)\r
+\r
+#define ADCCON3_EDIV_64                   (0x00 << 4)\r
+#define ADCCON3_EDIV_128                  (0x01 << 4)\r
+#define ADCCON3_EDIV_256                  (0x02 << 4)\r
+#define ADCCON3_EDIV_512                  (0x03 << 4)\r
+\r
+#define ADCCON3_ECH_AIN0                  (0x00)\r
+#define ADCCON3_ECH_AIN1                  (0x01)\r
+#define ADCCON3_ECH_AIN2                  (0x02)\r
+#define ADCCON3_ECH_AIN3                  (0x03)\r
+#define ADCCON3_ECH_AIN4                  (0x04)\r
+#define ADCCON3_ECH_AIN5                  (0x05)\r
+#define ADCCON3_ECH_AIN6                  (0x06)\r
+#define ADCCON3_ECH_AIN7                  (0x07)\r
+#define ADCCON3_ECH_AIN0_1                (0x08)\r
+#define ADCCON3_ECH_AIN2_3                (0x09)\r
+#define ADCCON3_ECH_AIN4_5                (0x0A)\r
+#define ADCCON3_ECH_AIN6_7                (0x0B)\r
+#define ADCCON3_ECH_GND                   (0x0C)\r
+#define ADCCON3_ECH_POSVOL                (0x0D)\r
+#define ADCCON3_ECH_TEMPR                 (0x0E)\r
+#define ADCCON3_ECH_VDD_3                 (0x0F)\r
+\r
+\r
+\r
+/*******************************************************************************\r
+ * Random Number Generator\r
+ */\r
+\r
+// RNDL (0xBC) - Random Number Generator Data Low Byte\r
+\r
+// RNDH (0xBD) - Random Number Generator Data High Byte\r
+\r
+\r
+/*******************************************************************************\r
+ * AES\r
+ */\r
+\r
+// ENCCS (0xB3) - Encryption Control and Status\r
+#define ENCCS_MODE                        0x70\r
+#define ENCCS_MODE0                       0x10\r
+#define ENCCS_MODE1                       0x20\r
+#define ENCCS_MODE2                       0x40\r
+#define ENCCS_RDY                         0x08\r
+#define ENCCS_CMD                         0x06\r
+#define ENCCS_CMD0                        0x02\r
+#define ENCCS_CMD1                        0x04\r
+#define ENCCS_ST                          0x01\r
+\r
+#define ENCCS_MODE_CBC                    (0x00 << 4)\r
+#define ENCCS_MODE_CFB                    (0x01 << 4)\r
+#define ENCCS_MODE_OFB                    (0x02 << 4)\r
+#define ENCCS_MODE_CTR                    (0x03 << 4)\r
+#define ENCCS_MODE_ECB                    (0x04 << 4)\r
+#define ENCCS_MODE_CBCMAC                 (0x05 << 4)\r
+\r
+#define ENCCS_CMD_ENC                     (0x00 << 1)\r
+#define ENCCS_CMD_DEC                     (0x01 << 1)\r
+#define ENCCS_CMD_LDKEY                   (0x02 << 1)\r
+#define ENCCS_CMD_LDIV                    (0x03 << 1)\r
+\r
+\r
+// ENCDI (0xB1) - Encryption Input Data\r
+\r
+// ENCDO (0xB2) - Encryption Output Data\r
+\r
+\r
+/*******************************************************************************\r
+ * Watchdog Timer\r
+ */\r
+\r
+// WDCTL (0xC9) - Watchdog Timer Control\r
+#define WDCTL_CLR                         0xF0\r
+#define WDCTL_CLR0                        0x10\r
+#define WDCTL_CLR1                        0x20\r
+#define WDCTL_CLR2                        0x40\r
+#define WDCTL_CLR3                        0x80\r
+#define WDCTL_EN                          0x08\r
+#define WDCTL_MODE                        0x04\r
+#define WDCTL_INT                         0x03\r
+#define WDCTL_INT0                        0x01\r
+#define WDCTL_INT1                        0x02\r
+\r
+\r
+#define WDCTL_INT_SEC_1                   (0x00)\r
+#define WDCTL_INT1_MSEC_250               (0x01)\r
+#define WDCTL_INT2_MSEC_15                (0x02)\r
+#define WDCTL_INT3_MSEC_2                 (0x03)\r
+\r
+\r
+\r
+/*******************************************************************************\r
+ * USART\r
+ */\r
+\r
+// U0CSR (0x86) - USART 0 Control and Status\r
+\r
+#define U0CSR_MODE                        0x80\r
+#define U0CSR_RE                          0x40\r
+#define U0CSR_SLAVE                       0x20\r
+#define U0CSR_FE                          0x10\r
+#define U0CSR_ERR                         0x08\r
+#define U0CSR_RX_BYTE                     0x04\r
+#define U0CSR_TX_BYTE                     0x02\r
+#define U0CSR_ACTIVE                      0x01\r
+\r
+\r
+// U0UCR (0xC4) - USART 0 UART Control\r
+#define U0UCR_FLUSH                       0x80\r
+#define U0UCR_FLOW                        0x40\r
+#define U0UCR_D9                          0x20\r
+#define U0UCR_BIT9                        0x10\r
+#define U0UCR_PARITY                      0x08\r
+#define U0UCR_SPB                         0x04\r
+#define U0UCR_STOP                        0x02\r
+#define U0UCR_START                       0x01\r
+\r
+\r
+// U0GCR (0xC5) - USART 0 Generic Control\r
+#define U0GCR_CPOL                        0x80\r
+#define U0GCR_CPHA                        0x40\r
+#define U0GCR_ORDER                       0x20\r
+#define U0GCR_BAUD_E                      0x1F\r
+#define U0GCR_BAUD_E0                     0x01\r
+#define U0GCR_BAUD_E1                     0x02\r
+#define U0GCR_BAUD_E2                     0x04\r
+#define U0GCR_BAUD_E3                     0x08\r
+#define U0GCR_BAUD_E4                     0x10\r
+\r
+\r
+// U0DBUF (0xC1) - USART 0 Receive/Transmit Data Buffer\r
+\r
+// U0BAUD (0xC2) - USART 0 Baud Rate Control\r
+\r
+// U1CSR (0xF8) - USART 1 Control and Status - bit accessible SFR register\r
+#define U1CSR_MODE                        0x80\r
+#define U1CSR_RE                          0x40\r
+#define U1CSR_SLAVE                       0x20\r
+#define U1CSR_FE                          0x10\r
+#define U1CSR_ERR                         0x08\r
+#define U1CSR_RX_BYTE                     0x04\r
+#define U1CSR_TX_BYTE                     0x02\r
+#define U1CSR_ACTIVE                      0x01\r
+\r
+\r
+// U1UCR (0xFB) - USART 1 UART Control\r
+#define U1UCR_FLUSH                       0x80\r
+#define U1UCR_FLOW                        0x40\r
+#define U1UCR_D9                          0x20\r
+#define U1UCR_BIT9                        0x10\r
+#define U1UCR_PARITY                      0x08\r
+#define U1UCR_SPB                         0x04\r
+#define U1UCR_STOP                        0x02\r
+#define U1UCR_START                       0x01\r
+\r
+\r
+// U1GCR (0xFC) - USART 1 Generic Control\r
+#define U1GCR_CPOL                        0x80\r
+#define U1GCR_CPHA                        0x40\r
+#define U1GCR_ORDER                       0x20\r
+#define U1GCR_BAUD_E                      0x1F\r
+#define U1GCR_BAUD_E0                     0x01\r
+#define U1GCR_BAUD_E1                     0x02\r
+#define U1GCR_BAUD_E2                     0x04\r
+#define U1GCR_BAUD_E3                     0x08\r
+#define U1GCR_BAUD_E4                     0x10\r
+\r
+\r
+// U1DBUF (0xF9) - USART 1 Receive/Transmit Data Buffer\r
+\r
+// U1BAUD (0xFA) - USART 1 Baud Rate Control\r
+\r
+\r
+/*******************************************************************************\r
+ * I2S\r
+ */\r
+\r
+// 0xDF40: I2SCFG0 - I2S Configuration Register 0\r
+#define I2SCFG0_TXIEN                     0x80\r
+#define I2SCFG0_RXIEN                     0x40\r
+#define I2SCFG0_ULAWE                     0x20\r
+#define I2SCFG0_ULAWC                     0x10\r
+#define I2SCFG0_TXMONO                    0x08\r
+#define I2SCFG0_RXMONO                    0x04\r
+#define I2SCFG0_MASTER                    0x02\r
+#define I2SCFG0_ENAB                      0x01\r
+\r
+\r
+// 0xDF41: I2SCFG1 - I2S Configuration Register 1\r
+#define I2SCFG1_WORDS                     0xF8\r
+#define I2SCFG1_WORDS0                    0x08\r
+#define I2SCFG1_WORDS1                    0x10\r
+#define I2SCFG1_WORDS2                    0x20\r
+#define I2SCFG1_WORDS3                    0x40\r
+#define I2SCFG1_WORDS4                    0x80\r
+#define I2SCFG1_TRIGNUM                   0x06\r
+#define I2SCFG1_TRIGNUM0                  0x02\r
+#define I2SCFG1_TRIGNUM1                  0x04\r
+#define I2SCFG1_IOLOC                     0x01\r
+\r
+#define I2SCFG1_TRIGNUM_NO_TRIG           (0x00 << 1)\r
+#define I2SCFG1_TRIGNUM_USB_SOF           (0x01 << 1)\r
+#define I2SCFG1_TRIGNUM_IOC_1             (0x02 << 1)\r
+#define I2SCFG1_TRIGNUM_T1_CH0            (0x03 << 1)\r
+\r
+\r
+\r
+// 0xDF42: I2SDATL - I2S Data Low Byte\r
+\r
+// 0xDF43: I2SDATH - I2S Data High Byte\r
+\r
+// 0xDF44: I2SWCNT - I2S Word Count Register\r
+\r
+// 0xDF45: I2SSTAT - I2S Status Register\r
+#define I2SSTAT_TXUNF                     0x80\r
+#define I2SSTAT_RXOVF                     0x40\r
+#define I2SSTAT_TXLR                      0x20\r
+#define I2SSTAT_RXLR                      0x10\r
+#define I2SSTAT_TXIRQ                     0x08\r
+#define I2SSTAT_RXIRQ                     0x04\r
+#define I2SSTAT_WCNT                      0x03\r
+#define I2SSTAT_WCNT0                     0x01\r
+#define I2SSTAT_WCNT1                     0x02\r
+\r
+#define I2SSTAT_WCNT_10BIT                (0x02)\r
+#define I2SSTAT_WCNT_9BIT                 (0x01)\r
+#define I2SSTAT_WCNT_9_10BIT              (0x02)\r
+\r
+\r
+// 0xDF46: I2SCLKF0 - I2S Clock Configuration Register 0\r
+\r
+// 0xDF47: I2SCLKF1 - I2S Clock Configuration Register 1\r
+\r
+// 0xDF48: I2SCLKF2 - I2S Clock Configuration Register 2\r
+\r
+\r
+\r
+\r
+/*******************************************************************************\r
+ * Radio Registers\r
+ */\r
+\r
+// RFIF (0xE9) - RF Interrupt Flags\r
+#define RFIF_IRQ_TXUNF                    0x80\r
+#define RFIF_IRQ_RXOVF                    0x40\r
+#define RFIF_IRQ_TIMEOUT                  0x20\r
+#define RFIF_IRQ_DONE                     0x10\r
+#define RFIF_IRQ_CS                       0x08\r
+#define RFIF_IRQ_PQT                      0x04\r
+#define RFIF_IRQ_CCA                      0x02\r
+#define RFIF_IRQ_SFD                      0x01\r
+\r
+\r
+// RFIM (0x91) - RF Interrupt Mask\r
+#define RFIM_IM_TXUNF                     0x80\r
+#define RFIM_IM_RXOVF                     0x40\r
+#define RFIM_IM_TIMEOUT                   0x20\r
+#define RFIM_IM_DONE                      0x10\r
+#define RFIM_IM_CS                        0x08\r
+#define RFIM_IM_PQT                       0x04\r
+#define RFIM_IM_CCA                       0x02\r
+#define RFIM_IM_SFD                       0x01\r
+\r
+\r
+// 0xDF2F: IOCFG2 - Radio Test Signal Configuration (P1_7)\r
+#define IOCFG2_GDO2_INV                   0x40\r
+#define IOCFG2_GDO2_CFG                   0x3F\r
+\r
+\r
+// 0xDF30: IOCFG1 - Radio Test Signal Configuration (P1_6)\r
+#define IOCFG1_GDO_DS                     0x80\r
+#define IOCFG1_GDO1_INV                   0x40\r
+#define IOCFG1_GDO1_CFG                   0x3F\r
+\r
+\r
+// 0xDF31: IOCFG0 - Radio Test Signal Configuration (P1_5)\r
+#define IOCFG0_GDO0_INV                   0x40\r
+#define IOCFG0_GDO0_CFG                   0x3F\r
+\r
+\r
+// 0xDF03: PKTCTRL1 - Packet Automation Control\r
+#define PKTCTRL1_PQT                      0xE0\r
+#define PKTCTRL1_PQT0                     0x20\r
+#define PKTCTRL1_PQT1                     0x40\r
+#define PKTCTRL1_PQT2                     0x80\r
+#define PKTCTRL1_APPEND_STATUS            0x04\r
+#define PKTCTRL1_ADR_CHK                  0x03\r
+#define PKTCTRL1_ADR_CHK0                 0x01\r
+#define PKTCTRL1_ADR_CHK1                 0x02\r
+\r
+#define ADR_CHK_NONE                      (0x00)\r
+#define ADR_CHK_NO_BRDCST                 (0x01)\r
+#define ADR_CHK_0_BRDCST                  (0x02)\r
+#define ADR_CHK_0_255_BRDCST              (0x03)\r
+\r
+\r
+// 0xDF04: PKTCTRL0 - Packet Automation Control\r
+#define PKTCTRL0_WHITE_DATA               0x40\r
+#define PKTCTRL0_PKT_FORMAT               0x30\r
+#define PKTCTRL0_PKT_FORMAT0              0x10\r
+#define PKTCTRL0_PKT_FORMAT1              0x20\r
+#define PKTCTRL0_CC2400_EN                0x08\r
+#define PKTCTRL0_CRC_EN                   0x04\r
+#define PKTCTRL0_LENGTH_CONFIG            0x03\r
+#define PKTCTRL0_LENGTH_CONFIG0           0x01\r
+\r
+#define PKT_FORMAT_NORM                   (0x00)\r
+#define PKT_FORMAT_RAND                   (0x02)\r
+\r
+#define PKTCTRL0_LENGTH_CONFIG_FIX        (0x00)\r
+#define PKTCTRL0_LENGTH_CONFIG_VAR        (0x01)\r
+\r
+\r
+// 0xDF05: ADDR - Device Address\r
+\r
+// 0xDF06: CHANNR - Channel Number\r
+\r
+// 0xDF07: FSCTRL1 - Frequency Synthesizer Control (only bit 0-4 used)\r
+\r
+// 0xDF08: FSCTRL0 - Frequency Synthesizer Control\r
+\r
+// 0xDF09: FREQ2 - Frequency Control Word, High Byte\r
+\r
+// 0xDF0A: FREQ1 - Frequency Control Word, Middle Byte\r
+\r
+// 0xDF0B: FREQ0 - Frequency Control Word, Low Byte\r
+\r
+// 0xDF0C: MDMCFG4 - Modem configuration\r
+\r
+// 0xDF0D: MDMCFG3 - Modem Configuration\r
+\r
+// 0xDF0E: MDMCFG2 - Modem Configuration\r
+#define MDMCFG2_DEM_DCFILT_OFF            0x80\r
+#define MDMCFG2_MOD_FORMAT                0x70\r
+#define MDMCFG2_MOD_FORMAT0               0x10\r
+#define MDMCFG2_MOD_FORMAT1               0x20\r
+#define MDMCFG2_MOD_FORMAT2               0x40\r
+#define MDMCFG2_MANCHESTER_EN             0x08\r
+#define MDMCFG2_SYNC_MODE                 0x07\r
+#define MDMCFG2_SYNC_MODE0                0x01\r
+#define MDMCFG2_SYNC_MODE1                0x02\r
+#define MDMCFG2_SYNC_MODE2                0x04\r
+\r
+#define MOD_FORMAT_2_FSK                  (0x00 << 4)\r
+#define MOD_FORMAT_GFSK                   (0x01 << 4)\r
+#define MOD_FORMAT_MSK                    (0x07 << 4)\r
+\r
+#define SYNC_MODE_NO_PRE                  (0x00)\r
+#define SYNC_MODE_15_16                   (0x01)\r
+#define SYNC_MODE_16_16                   (0x02)\r
+#define SYNC_MODE_30_32                   (0x03)\r
+#define SYNC_MODE_NO_PRE_CS               (0x04)    // CS = carrier-sense above threshold\r
+#define SYNC_MODE_15_16_CS                (0x05)\r
+#define SYNC_MODE_16_16_CS                (0x06)\r
+#define SYNC_MODE_30_32_CS                (0x07)\r
+\r
+\r
+// 0xDF0F: MDMCG1 - Modem Configuration\r
+#define MDMCG1_FEC_EN                     0x80\r
+#define MDMCG1_NUM_PREAMBLE               0x70\r
+#define MDMCG1_NUM_PREAMBLE0              0x10\r
+#define MDMCG1_NUM_PREAMBLE1              0x20\r
+#define MDMCG1_NUM_PREAMBLE2              0x40\r
+#define MDMCG1_CHANSPC_E                  0x03\r
+#define MDMCG1_CHANSPC_E0                 0x01\r
+#define MDMCG1_CHANSPC_E1                 0x02\r
+\r
+#define MDMCG1_NUM_PREAMBLE_2             (0x00 << 4)\r
+#define MDMCG1_NUM_PREAMBLE_3             (0x01 << 4)\r
+#define MDMCG1_NUM_PREAMBLE_4             (0x02 << 4)\r
+#define MDMCG1_NUM_PREAMBLE_6             (0x03 << 4)\r
+#define MDMCG1_NUM_PREAMBLE_8             (0x04 << 4)\r
+#define MDMCG1_NUM_PREAMBLE_12            (0x05 << 4)\r
+#define MDMCG1_NUM_PREAMBLE_16            (0x06 << 4)\r
+#define MDMCG1_NUM_PREAMBLE_24            (0x07 << 4)\r
+\r
+\r
+// 0xDF10: MDMCFG0 - Modem Configuration\r
+\r
+// 0xDF11: DEVIATN - Modem Deviation Setting\r
+#define DEVIATN_DEVIATION_E               0x70\r
+#define DEVIATN_DEVIATION_E0              0x10\r
+#define DEVIATN_DEVIATION_E1              0x20\r
+#define DEVIATN_DEVIATION_E2              0x40\r
+#define DEVIATN_DEVIATION_M               0x07\r
+#define DEVIATN_DEVIATION_M0              0x01\r
+#define DEVIATN_DEVIATION_M1              0x02\r
+#define DEVIATN_DEVIATION_M2              0x04\r
+\r
+\r
+// 0xDF12: MCSM2 - Main Radio Control State Machine Configuration\r
+#define MCSM2_RX_TIME_RSSI                0x10\r
+#define MCSM2_RX_TIME_QUAL                0x08\r
+#define MCSM2_RX_TIME                     0x07\r
+\r
+\r
+// 0xDF13: MCSM1 - Main Radio Control State Machine Configuration\r
+#define MCSM1_CCA_MODE                    0x30\r
+#define MCSM1_CCA_MODE0                   0x10\r
+#define MCSM1_CCA_MODE1                   0x20\r
+#define MCSM1_RXOFF_MODE                  0x0C\r
+#define MCSM1_RXOFF_MODE0                 0x04\r
+#define MCSM1_RXOFF_MODE1                 0x08\r
+#define MCSM1_TXOFF_MODE                  0x03\r
+#define MCSM1_TXOFF_MODE0                 0x01\r
+#define MCSM1_TXOFF_MODE1                 0x02\r
+\r
+#define MCSM1_CCA_MODE_ALWAYS             (0x00 << 4)\r
+#define MCSM1_CCA_MODE_RSSI0              (0x01 << 4)\r
+#define MCSM1_CCA_MODE_PACKET             (0x02 << 4)\r
+#define MCSM1_CCA_MODE_RSSI1              (0x03 << 4)\r
+\r
+#define MCSM1_RXOFF_MODE_IDLE             (0x00 << 2)\r
+#define MCSM1_RXOFF_MODE_FSTXON           (0x01 << 2)\r
+#define MCSM1_RXOFF_MODE_TX               (0x02 << 2)\r
+#define MCSM1_RXOFF_MODE_RX               (0x03 << 2)\r
+\r
+#define MCSM1_TXOFF_MODE_IDLE             (0x00 << 0)\r
+#define MCSM1_TXOFF_MODE_FSTXON           (0x01 << 0)\r
+#define MCSM1_TXOFF_MODE_TX               (0x02 << 0)\r
+#define MCSM1_TXOFF_MODE_RX               (0x03 << 0)\r
+\r
+\r
+// 0xDF14: MCSM0 - Main Radio Control State Machine Configuration\r
+#define MCSM0_FS_AUTOCAL                  0x30\r
+\r
+#define FS_AUTOCAL_NEVER                  (0x00 << 4)\r
+#define FS_AUTOCAL_FROM_IDLE              (0x01 << 4)\r
+#define FS_AUTOCAL_TO_IDLE                (0x02 << 4)\r
+#define FS_AUTOCAL_4TH_TO_IDLE            (0x03 << 4)\r
+\r
+\r
+// 0xDF15: FOCCFG - Frequency Offset Compensation Configuration\r
+#define FOCCFG_FOC_BS_CS_GATE             0x20\r
+#define FOCCFG_FOC_PRE_K                  0x18\r
+#define FOCCFG_FOC_PRE_K0                 0x08\r
+#define FOCCFG_FOC_PRE_K1                 0x10\r
+#define FOCCFG_FOC_POST_K                 0x04\r
+#define FOCCFG_FOC_LIMIT                  0x03\r
+#define FOCCFG_FOC_LIMIT0                 0x01\r
+#define FOCCFG_FOC_LIMIT1                 0x02\r
+\r
+#define FOC_PRE_K_1K                      (0x00 << 3)\r
+#define FOC_PRE_K_2K                      (0x02 << 3)\r
+#define FOC_PRE_K_3K                      (0x03 << 3)\r
+#define FOC_PRE_K_4K                      (0x04 << 3)\r
+\r
+#define FOC_LIMIT_0                       (0x00)\r
+#define FOC_LIMIT_DIV8                    (0x01)\r
+#define FOC_LIMIT_DIV4                    (0x02)\r
+#define FOC_LIMIT_DIV2                    (0x03)\r
+\r
+\r
+// 0xDF16: BSCFG - Bit Synchronization Configuration\r
+#define BSCFG_BS_PRE_KI                   0xC0\r
+#define BSCFG_BS_PRE_KI0                  0x40\r
+#define BSCFG_BS_PRE_KI1                  0x80\r
+#define BSCFG_BS_PRE_KP                   0x30\r
+#define BSCFG_BS_PRE_KP0                  0x10\r
+#define BSCFG_BS_PRE_KP1                  0x20\r
+#define BSCFG_BS_POST_KI                  0x08\r
+#define BSCFG_BS_POST_KP                  0x04\r
+#define BSCFG_BS_LIMIT                    0x03\r
+#define BSCFG_BS_LIMIT0                   0x01\r
+#define BSCFG_BS_LIMIT1                   0x02\r
+\r
+#define BSCFG_BS_PRE_KI_1K                (0x00 << 6)\r
+#define BSCFG_BS_PRE_KI_2K                (0x01 << 6)\r
+#define BSCFG_BS_PRE_KI_3K                (0x02 << 6)\r
+#define BSCFG_BS_PRE_KI_4K                (0x03 << 6)\r
+\r
+#define BSCFG_BS_PRE_KP_1K                (0x00 << 4)\r
+#define BSCFG_BS_PRE_KP_2K                (0x01 << 4)\r
+#define BSCFG_BS_PRE_KP_3K                (0x02 << 4)\r
+#define BSCFG_BS_PRE_KP_4K                (0x03 << 4)\r
+\r
+#define BSCFG_BS_LIMIT_0                  (0x00)\r
+#define BSCFG_BS_LIMIT_3                  (0x01)\r
+#define BSCFG_BS_LIMIT_6                  (0x02)\r
+#define BSCFG_BS_LIMIT_12                 (0x03)\r
+\r
+\r
+// 0xDF17: AGCCTRL2 - AGC Control\r
+#define AGCCTRL2_MAX_DVGA_GAIN            0xC0\r
+#define AGCCTRL2_MAX_LNA_GAIN             0x38\r
+#define AGCCTRL2_MAGN_TARGET              0x07\r
+\r
+\r
+// 0xDF18: AGCCTRL1 - AGC Control\r
+#define AGCCTRL1_AGC_LNA_PRIORITY         0x40\r
+#define AGCCTRL1_CARRIER_SENSE_REL_THR    0x30\r
+#define AGCCTRL1_CARRIER_SENSE_ABS_THR    0x0F\r
+\r
+\r
+// 0xDF19: AGCCTRL0 - AGC Control\r
+#define AGCCTRL0_HYST_LEVEL               0xC0\r
+#define AGCCTRL0_WAIT_TIME                0x30\r
+#define AGCCTRL0_AGC_FREEZE               0x0C\r
+#define AGCCTRL0_FILTER_LENGTH            0x03\r
+\r
+\r
+// 0xDF1A: FREND1 - Front End RX Configuration\r
+#define FREND1_LNA_CURRENT                0xC0\r
+#define FREND1_LNA2MIX_CURRENT            0x30\r
+#define FREND1_LODIV_BUF_CURRENT_RX       0x0C\r
+#define FREND1_MIX_CURRENT                0x03\r
+\r
+\r
+// 0xDF1B: FREND0 - Front End TX Configuration\r
+#define FREND0_LODIV_BUF_CURRENT_TX       0x30\r
+\r
+\r
+// 0xDF1C: FSCAL3 - Frequency Synthesizer Calibration\r
+#define FSCAL3_FSCAL3                     0xC0\r
+#define FSCAL3_CHP_CURR_CAL_EN            0x30\r
+\r
+\r
+// 0xDF1D: FSCAL2 - Frequency Synthesizer Calibration\r
+#define FSCAL2_VCO_CORE_H_EN              0x20\r
+#define FSCAL2_FSCAL2                     0x1F\r
+\r
+\r
+// 0xDF1E: FSCAL1 - Frequency Synthesizer Calibration\r
+\r
+// 0xDF1F: FSCAL0 - Frequency Synthesizer Calibration\r
+\r
+// 0xDF25: TEST0 - Various Test Settings\r
+\r
+\r
+// RFST (0xE1) - RF Strobe Commands\r
+#define RFST_SFSTXON                      0x00\r
+#define RFST_SCAL                         0x01\r
+#define RFST_SRX                          0x02\r
+#define RFST_STX                          0x03\r
+#define RFST_SIDLE                        0x04\r
+#define RFST_SNOP                         0x05\r
+\r
+// 0xDF3B: MARCSTATE - Main Radio Control State Machine State\r
+#define MARCSTATE_MARC_STATE              0x1F\r
+\r
+#define MARC_STATE_SLEEP                  0x00\r
+#define MARC_STATE_IDLE                   0x01\r
+#define MARC_STATE_VCOON_MC               0x03\r
+#define MARC_STATE_REGON_MC               0x04\r
+#define MARC_STATE_MANCAL                 0x05\r
+#define MARC_STATE_VCOON                  0x06\r
+#define MARC_STATE_REGON                  0x07\r
+#define MARC_STATE_STARTCAL               0x08\r
+#define MARC_STATE_BWBOOST                0x09\r
+#define MARC_STATE_FS_LOCK                0x0A\r
+#define MARC_STATE_IFADCON                0x0B\r
+#define MARC_STATE_ENDCAL                 0x0C\r
+#define MARC_STATE_RX                     0x0D\r
+#define MARC_STATE_RX_END                 0x0E\r
+#define MARC_STATE_RX_RST                 0x0F\r
+#define MARC_STATE_TXRX_SWITCH            0x10\r
+#define MARC_STATE_RX_OVERFLOW            0x11\r
+#define MARC_STATE_FSTXON                 0x12\r
+#define MARC_STATE_TX                     0x13\r
+#define MARC_STATE_TX_END                 0x14\r
+#define MARC_STATE_RXTX_SWITCH            0x15\r
+#define MARC_STATE_TX_UNDERFLOW           0x16\r
+\r
+\r
+\r
+/***********************************************************************/\r
+#endif\r
diff --git a/chronos-ti/Software Projects/RF Access Point/IAR/wbsl/wbsl.c b/chronos-ti/Software Projects/RF Access Point/IAR/wbsl/wbsl.c
new file mode 100755 (executable)
index 0000000..2539b29
--- /dev/null
@@ -0,0 +1,874 @@
+// *************************************************************************************************\r
+//\r
+//     Copyright (C) 2010 Texas Instruments Incorporated - http://www.ti.com/ \r
+//      \r
+//      \r
+//       Redistribution and use in source and binary forms, with or without \r
+//       modification, are permitted provided that the following conditions \r
+//       are met:\r
+//     \r
+//         Redistributions of source code must retain the above copyright \r
+//         notice, this list of conditions and the following disclaimer.\r
+//      \r
+//         Redistributions in binary form must reproduce the above copyright\r
+//         notice, this list of conditions and the following disclaimer in the \r
+//         documentation and/or other materials provided with the   \r
+//         distribution.\r
+//      \r
+//         Neither the name of Texas Instruments Incorporated nor the names of\r
+//         its contributors may be used to endorse or promote products derived\r
+//         from this software without specific prior written permission.\r
+//     \r
+//       THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \r
+//       "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT \r
+//       LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//       A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT \r
+//       OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, \r
+//       SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT \r
+//       LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//       DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//       THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT \r
+//       (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE \r
+//       OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+// Wireless Update function\r
+// *************************************************************************************************\r
+\r
+// *************************************************************************************************\r
+// Include section\r
+#include "wbsl.h"\r
+#include "hal.h"\r
+#include "ioCCxx10_bitdef.h"\r
+#include <string.h>\r
+\r
+\r
+// *************************************************************************************************\r
+// Local Functions Define\r
+u8 transmitDMA(unsigned char *src, u8 size);\r
+void rxModeOff(void);\r
+void rxModeOn(void);\r
+void sendDataPacket(void);\r
+void sendInitPacket(void);\r
+\r
+\r
+// *************************************************************************************************\r
+// Global Variable section\r
+\r
+/* reserve space for the maximum possible peer Link IDs */\r
+static unsigned char  wNumCurrentPeers;\r
+\r
+// extern defines\r
+volatile u8 wbsl_flag;\r
+volatile u8 wbsl_packet_flag;\r
+u8 wbsl_data[WBSL_MAX_PAYLOAD_LENGTH];\r
+u8 wbsl_data_length = 0;\r
+volatile u8 packet_ready_flag;\r
+u8 TxBuffer[TX_SIZE];\r
+\r
+u32 total_size_in_bytes;\r
+\r
+TIMER_TABLE_ENTRY timeout_table[MAX_TIMEOUT_TABLE_SIZE];\r
+\r
+volatile u8 rxtx_flag = 0;\r
+\r
+// Handle number of ACKs sent for an indivudual packet\r
+unsigned char wbsl_number_of_retries;\r
+\r
+unsigned char RxBuffer[255];\r
+unsigned char discoveryPayload[8] = {7,0,WBSL_AP_ADDRESS,0xBA,0x5E,0xBA,0x11,9};\r
+unsigned char discoveryAck[4] = {3, 0, WBSL_AP_ADDRESS, 0};\r
+unsigned char initPacket[] = {5,0,WBSL_AP_ADDRESS,0,0,0};\r
+unsigned char wbsl_status;\r
+unsigned char wbsl_rftxif = 0;\r
+unsigned char wbsl_irq_done = 0;\r
+unsigned char wbsl_txfifo_filled = 0;\r
+unsigned char update_complete       = 0;\r
+unsigned char wbsl_rxtxMode = 0;\r
+unsigned char ed_address;\r
+u16 watchVoltage;\r
+\r
+\r
+//Settings Structure for the RX/TX DMA Channel\r
+DMA_DESC dmachs;\r
+\r
+// Store the total number of packets to be sent to the Watch\r
+//u16 totalPackets = 0;\r
+unsigned int total_packets;\r
+// Keep track of which packet needs to be sent to the Watch\r
+u16 currentPacket = 0;\r
+// Variable to see if the Init Packet has been successfully sent\r
+u8  initOk = 0;\r
+\r
+\r
+\r
+// *************************************************************************************************\r
+// @fn          wbsl_config\r
+// @brief       Configures the Radio Settings for WBSL\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void wbsl_config(void)\r
+{\r
\r
+   // WBSL will set the ones needed\r
+   RFIM = 0;\r
+   RFIF = 0;                               // Clear Interrupts\r
+    \r
+   // OSC=XT, TICKSPD=fref/128, CLKSPD=24MHz\r
+   CLKCON = BIT7 | BIT5 | BIT4 | BIT3; \r
+\r
+   //Set the SYNC words to be used\r
+   SYNC1      =   0xD3; // SYNC1: high nyte of Sync Word\r
+   SYNC0      =   0x91;  // SYNC0: low nyte of Sync Word\r
+   //Setup radio\r
+   FSCTRL1     = 0x12;   // Frequency synthesizer control.\r
+   FSCTRL0     = 0x00;   // Frequency synthesizer control.\r
+#ifdef ISM_EU\r
+   // 869.525MHz\r
+   FREQ2       = 0x24;               //  Frequency control word, high byte\r
+   FREQ1       = 0x3A;               //  Frequency control word, middle byte\r
+   FREQ0       = 0xEE;               //  Frequency control word, low byte\r
+   CHANNR      = 0;                  // Channel number.\r
+   PA_TABLE0   = 0x8C;               // PA output power setting.\r
+#else\r
+#ifdef ISM_US\r
+   // 902MHz (CHANNR=20 --> 906MHz)\r
+   FREQ2       = 0x25;               //  Frequency control word, high byte\r
+   FREQ1       = 0x95;               //  Frequency control word, middle byte\r
+   FREQ0       = 0x55;               //  Frequency control word, low byte\r
+   CHANNR      = 20;                // Channel number.\r
+   PA_TABLE0   = 0x8B;              // PA output power setting.\r
+#else\r
+#ifdef ISM_LF\r
+  // 433.30MHz\r
+  FREQ2 = 0x12;                     //  Frequency control word, high byte\r
+  FREQ1 = 0x14;                     //  Frequency control word, middle byte\r
+  FREQ0 = 0x7A;                     //  Frequency control word, low byte\r
+  CHANNR = 0;                       // Channel number.\r
+  PA_TABLE0 = 0x8D;                 // PA output power setting.\r
+#else\r
+  #error "Wrong ISM band specified (valid are ISM_LF, ISM_EU and ISM_US)"\r
+#endif // ISM_LF\r
+#endif // ISM_US\r
+#endif // ISM_EU\r
+   MDMCFG4     = 0x1D;               // Modem configuration.\r
+   MDMCFG3     = 0x55;               // Modem configuration.\r
+   MDMCFG2     = 0x13;               // Modem configuration.\r
+   MDMCFG1     = 0x23;               // Modem configuration.\r
+   MDMCFG0     = 0x11;               // Modem configuration.\r
+   \r
+   DEVIATN   = 0x63;   // Modem deviation setting (when FSK modulation is enabled).\r
+   FREND1    = 0xB6;   // Front end RX configuration.\r
+   FREND0    = 0x10;   // Front end TX configuration.\r
+   MCSM0     = 0x18;   // Main Radio Control State Machine configuration.\r
+   MCSM1     = 0x3C;\r
+   MCSM2     = 0x07;\r
+   WOREVT1   = 0x87;\r
+   WOREVT0   = 0x6B;\r
+   WORCTL    = 0xF8;\r
+   FOCCFG    = 0x1D;   // Frequency Offset Compensation Configuration.\r
+   BSCFG     = 0x1C;   // Bit synchronization Configuration.\r
+   AGCCTRL2  = 0xC7;   // AGC control.\r
+   AGCCTRL1  = 0x00;   // AGC control.\r
+   AGCCTRL0  = 0xB0;   // AGC control.\r
+   FSCAL3    = 0xEA;   // Frequency synthesizer calibration.\r
+   FSCAL2    = 0x2A;   // Frequency synthesizer calibration.\r
+   FSCAL1    = 0x00;   // Frequency synthesizer calibration.\r
+   FSCAL0    = 0x1F;   // Frequency synthesizer calibration.\r
+   FSTEST    = 0x59;\r
+   TEST2     = 0x88;   // Various test settings.\r
+   TEST1     = 0x31;   // Various test settings.\r
+   TEST0     = 0x09;   // Various test settings.\r
+   PTEST     = 0x7F;\r
+   AGCTEST   = 0x88;\r
+   IOCFG2    = 0x29;\r
+   IOCFG1    = 0x1E;\r
+   IOCFG0    = 0x1B;\r
+   \r
+   PKTCTRL1  = 0x06;   // Packet automation control.\r
+   PKTCTRL0  = 0x45;   // Packet automation control.\r
+   ADDR      = WBSL_AP_ADDRESS;   // Device address.\r
+   PKTLEN    = 0xFE;   // Packet length.\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          wbsl_RfIsr\r
+// @brief       called when the a packet has been received, the actual packet handling is done\r
+//              by the DMA. In this function we check for RX Overflow and set the corresponding\r
+//              flags to inform the application a packet is ready on the RxBuffer\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void wbsl_RfIsr(void)\r
+{\r
+   u8 rfif_reg = RFIF;\r
+  \r
+   // We should only be here in RX mode, not in TX mode, nor if RX mode was turned on during CCA\r
+   if(wbsl_rxtxMode != WBSL_RX_MODE)\r
+   {\r
+      RFIF = 0;\r
+      return;\r
+   }\r
+\r
+   // Check for RX Overflow\r
+   if((rfif_reg & IRQ_DONE) && (rfif_reg & IRQ_RXOVF))\r
+   {\r
+      RFIF &= ~IRQ_DONE;\r
+      RFIF &= ~IRQ_RXOVF;\r
+      S1CON &= ~(0x03); /* Clear MCU interrupt flag */\r
+\r
+      // Go to IDLE state to get out of overflow\r
+      rxModeOff();\r
+\r
+      /* clean out buffer to help protect against spurious frames */\r
+      memset(RxBuffer, 0x00, sizeof(RxBuffer));\r
+\r
+      // Start again RX Mode\r
+      rxModeOn();\r
+\r
+      return;\r
+   }\r
+\r
+   RFIF &= IRQ_DONE;  // Clear the RF interrupt\r
+   S1CON &= ~(0x03); // Clear CPU int flag\r
+   \r
+   rxtx_flag = WBSL_RXTX_RECEIVED; //Signal the application that a packet is in RxBuffer\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          resetTimer\r
+// @brief       resets the timeout table, so that the timer interrupt does not check\r
+//              the timeout values\r
+// @param       u8 index        index of the timer in the timeout_table you want to use\r
+// @return      none\r
+// *************************************************************************************************\r
+void resetTimer(u8 index)\r
+{\r
+   // Check that the index doesn't exceed the number of timeouts we have\r
+   if(index >= MAX_TIMEOUT_TABLE_SIZE)\r
+      return;\r
+   \r
+   timeout_table[index].counter = 0;    // Reset counter\r
+   timeout_table[index].timeout = 0;    // Reset timeout (Disable)\r
+   timeout_table[index].flag = 0;       // Reset Flag\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          setTimer\r
+// @brief       sets the timeout table values, so that the timer interrupt checks\r
+//              these values and sets the timeout flag accordingly\r
+// @param       u8 index        index of the timer in the timeout_table you want to use\r
+//              u16 timeout     number of interrupts that have to happen before we set the timeout flag\r
+// @return      none\r
+// *************************************************************************************************\r
+void setTimer(unsigned char index, unsigned int timeout)\r
+{\r
+   // Check that the index doesn't exceed the number of timeouts we have\r
+   if(index >= MAX_TIMEOUT_TABLE_SIZE)\r
+      return;\r
+   \r
+   timeout_table[index].counter = 0;    // Reset counter\r
+   timeout_table[index].flag = 0;       // Reset Flag\r
+   timeout_table[index].timeout = timeout;   // Set timeout\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          rxModeOn\r
+// @brief       Puts the radio in RX Mode, sets all the needed values to activate the DMA\r
+//              and enables the needed interrupts\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void rxModeOn(void)\r
+{\r
+   u8 *dstAdd  = RxBuffer;\r
+   DMA_DESC *dmach;\r
+   dmach = (DMA_DESC *)(&dmachs);\r
+   \r
+   // Configure the DMA to move a packet from the RFD register to the RxBuffer\r
+   SET_WORD(dmach->DESTADDRH, dmach->DESTADDRL, (u16)dstAdd);\r
+   SET_WORD(dmach->SRCADDRH, dmach->SRCADDRL, (u16)&X_RFD);    // Set the source address to RFD to get Data from the RF\r
+   SET_WORD(dmach->LENH, dmach->LENL, 0x0100);\r
+   dmach->VLEN = VLEN_1_P_VALOFFIRST_P_2;                   // Use first byte for transfer count + 2 more status bytes\r
+   dmach->PRIORITY = PRI_HIGH;                              // High Priority.\r
+   dmach->M8 = M8_USE_8_BITS;                               // Transfer all 8 bits in each byte\r
+   dmach->IRQMASK = IRQMASK_DISABLE;                        // Don't generate an interrupt when DMA is done\r
+   dmach->DESTINC = DESTINC_1;                              // Increment the Destination address 1 byte each transfer\r
+   dmach->SRCINC = SRCINC_0;                                // source Address is constant\r
+   dmach->TRIG = DMATRIG_RADIO;                             // RF packet byte received/transmit\r
+   dmach->TMODE = TMODE_SINGLE;                              // Transfer block of data (length len) after each DMA trigger\r
+   dmach->WORDSIZE = WORDSIZE_BYTE;                         // Transfer a byte at a time\r
+\r
+   /* abort any DMA transfer that might be in progress */\r
+   DMAARM = DMA_ABORT | BM( WBSL_DMA_CHAN );\r
+\r
+   /* clean out buffer to help protect against spurious frames */\r
+   memset(RxBuffer, 0x00, sizeof(RxBuffer));\r
+\r
+   DMAARM |= BM( WBSL_DMA_CHAN );\r
+\r
+   /* Clear interrupts */\r
+   S1CON &= ~(0x03); /* Clear MCU interrupt flag */\r
+   RFIF &= ~IRQ_DONE;           /* Clear the interrupt at the source */\r
+\r
+   //Set Mode to RX\r
+   wbsl_rxtxMode = WBSL_RX_MODE;\r
+   SRX();  // Strobe RX Mode\r
+\r
+   /* enable "receive/transmit done" interrupts */\r
+   RFIM |= IRQ_DONE;\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          rxModeOff\r
+// @brief       Puts the radio in Idle Mode, disables the DMA and RF Interrupts\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void rxModeOff(void)\r
+{\r
+   /*disable RF receive interrupts */\r
+   RFIM &= ~IRQ_DONE;\r
+\r
+   //Go to RF Idle mode\r
+   wbsl_rxtxMode = WBSL_IDLE_MODE;\r
+   SIDLE();\r
+   while(MARCSTATE != MARC_STATE_IDLE);\r
+\r
+   /* Abort any ongoing DMA transfer */\r
+   DMAARM = DMA_ABORT | BM( WBSL_DMA_CHAN );\r
+\r
+   /* Clear any pending DMA interrupts */\r
+   DMAIRQ &= ~BM(WBSL_DMA_CHAN);\r
+\r
+   /* Clear interrupts */\r
+   S1CON &= ~(0x03);            /* Clear MCU interrupt flag */\r
+   RFIF &= ~IRQ_DONE;           /* Clear the interrupt at the source */\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          transmitDMA\r
+// @brief       Sets all the needed values to activate the DMA transfer and puts the Radio in Tx Mode\r
+//              to transmit the Buffer received, either in CCA Mode or in Force Mode.\r
+// @param       u8* src        The Buffer which is going to be sent through RF\r
+//              u8 size        The size of the buffer received\r
+// @return      none\r
+// *************************************************************************************************\r
+u8 transmitDMA(u8 *src, u8 size){\r
+  \r
+   u8 retValue = WBSL_TX_RES_SUCCESS;\r
+#ifdef CCA_MODE\r
+   u8 ccaRetries;\r
+  // u16 backOffDelay;\r
+#endif \r
+   \r
+   DMA_DESC *dmach;\r
+   dmach = (DMA_DESC *)(&dmachs);\r
+  \r
+   /* Turn off reciever. We can ignore/drop incoming packets during transmit. */\r
+   rxModeOff();\r
+   \r
+   // Configure DMA to transfer from the SOURCE to the RFD register\r
+   SET_WORD(dmach->DESTADDRH, dmach->DESTADDRL, (u16)&X_RFD);\r
+   SET_WORD(dmach->SRCADDRH, dmach->SRCADDRL, (u16)src);    // Set the source address to TxBuffer for testing\r
+   SET_WORD(dmach->LENH, dmach->LENL, 0x0100);\r
+   dmach->VLEN = VLEN_1_P_VALOFFIRST;                       // Use first byte for transfer count N + 1\r
+   dmach->PRIORITY = PRI_HIGH;                              // High Priority.\r
+   dmach->M8 = M8_USE_8_BITS;                               // Transfer all 8 bits in each byte\r
+   dmach->IRQMASK = IRQMASK_DISABLE;                        // Don't generate an interrupt when DMA is done\r
+   dmach->DESTINC = DESTINC_0;                              // Destination Address is constant\r
+   dmach->SRCINC = SRCINC_1;                                // Increment the source address 1 byte each transfer\r
+   dmach->TRIG = DMATRIG_RADIO;                             // RF packet byte received/transmit\r
+   dmach->TMODE = TMODE_SINGLE;                              // Transfer block of data (length len) after each DMA trigger\r
+   dmach->WORDSIZE = WORDSIZE_BYTE;                         // Transfer a byte at a time\r
+\r
+#ifdef CCA_MODE\r
+   ccaRetries = 4;\r
+  \r
+   /* ===============================================================================\r
+    *    CCA Loop\r
+    *  =============\r
+    */\r
+   while(1)\r
+   {\r
+      // Arm the DMA Channel used for the WBSL\r
+      DMAARM |= BM( WBSL_DMA_CHAN );\r
+       \r
+      //Strobe RX to sense air for CCA\r
+      SRX();\r
+        \r
+      /* Wait for radio to enter the RX mode */\r
+      while(MARCSTATE != MARC_STATE_RX);\r
+        \r
+      /* Check RSSI */\r
+      {\r
+         u16 delay = 30 * 16 * 12;\r
+         do{\r
+            if(PKTSTATUS & (CCA_FLAG | CS_FLAG))\r
+            {\r
+               break;\r
+            }\r
+            delay -= 16;\r
+         }while(delay > 0);\r
+      }\r
+      /*End of RSSI Check */\r
+        \r
+      // Strobe TX to send the message\r
+      STX();\r
+        \r
+      if(MARCSTATE != MARC_STATE_RX)\r
+      {\r
+         // Clear Channel Assessment Passed\r
+         /* wait for transmit to complete */\r
+         while(!(RFIF & IRQ_DONE));\r
+            \r
+         /* Clear the interrupt flag */\r
+         RFIF &= ~IRQ_DONE;\r
+            \r
+         break;\r
+      }\r
+      else\r
+      {\r
+         // Clear Channel Assessment Failed\r
+         if(ccaRetries != 0)\r
+         {\r
+            // Go to idle during Backoff\r
+            SIDLE();\r
+            while(MARCSTATE != MARC_STATE_IDLE);\r
+              \r
+            //backOffDelay = 10000;\r
+            //while(--backOffDelay > 0);\r
+            // Back off delay\r
+            setTimer(WBSL_TIMEOUT_INDEX,1);\r
+            // Wait for either the Timeout or packet received flag\r
+            while(!timeout_table[WBSL_TIMEOUT_INDEX].flag);\r
+            // Reset timer so that next time it starts fresh\r
+            resetTimer(WBSL_TIMEOUT_INDEX);\r
+              \r
+            ccaRetries--;         \r
+         }\r
+         else /* No CCA retries are left, abort */\r
+         {\r
+            /* set return value for failed transmit and break */\r
+            return;\r
+         }   \r
+            \r
+      }\r
+   }\r
+#else\r
+   // Arm the DMA Channel used for the WBSL\r
+   DMAARM |= BM( WBSL_DMA_CHAN );\r
+   //Set Mode to TX\r
+   wbsl_rxtxMode = WBSL_TX_MODE;\r
+\r
+   STX();  // Strobe TX Mode\r
+\r
+   /* wait for transmit to complete */\r
+   while(!(RFIF & IRQ_DONE));\r
+\r
+   /* Clear the interrupt flag */\r
+   RFIF &= ~IRQ_DONE;\r
+#endif\r
+   // Go to IDLE\r
+   rxModeOff();\r
+\r
+   return (retValue);\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          wbsl_link\r
+// @brief       Checks if a discovery packet has been received, checks the integrity of it\r
+//              and sends the discovery ACK\r
+// @param       none\r
+// @return      u8 status\r
+//              WBSL_LINK_FAIL    No discovery packet was received\r
+//              WBSL_LINK_SUCC    Discovery packet received and ACK sent\r
+// *************************************************************************************************\r
+u8 wbsl_link(void)\r
+{\r
+   u8 status = WBSL_LINK_FAIL;\r
+   u8 i = 0;\r
+   u8 validPacket = 0;\r
+   //u32 timeout = 0;\r
+   u8 crcOk = 0;\r
+\r
+   //Check if packet was received\r
+   if(rxtx_flag == WBSL_RXTX_RECEIVED)\r
+   {\r
+      // Clear RX Flag\r
+      rxtx_flag = 0;\r
+\r
+      // Get CRC Status, which is appended in the last bit of the 2nd byte of the status bytes\r
+      crcOk = RxBuffer[RxBuffer[0] + WBSL_CRC_STATUS_OFFSET] & CRC_STATUS;\r
+\r
+      //Check that packet was a broadcast packet and that the CRC Status is Ok\r
+      if((RxBuffer[AP_ADDRESS_OFFSET_RX] == 0x0) && crcOk)\r
+      {\r
+\r
+         // Check if packet has the discovery Payload\r
+         validPacket = 1;\r
+         for (i=0; i<DISCOVERY_PAYLOAD_LENGTH; i++)\r
+         {\r
+            if (RxBuffer[i+4] != discoveryPayload[i+3]) validPacket = 0;\r
+         }\r
+\r
+         //If packet O.K., save device address and send ACK\r
+         if(validPacket)\r
+         {\r
+            // Save Watch Address to later direct all packets to this watch\r
+            ed_address = RxBuffer[ED_ADDRESS_OFFSET_RX];\r
+\r
+            // Address the discovery packet to the Watch\r
+            discoveryAck[ED_ADDRESS_OFFSET_TX] = ed_address;\r
+\r
+            // Positive ACK of the discovery\r
+            discoveryAck[DISCOVERY_ACK_OFFSET] = WBSL_LINK_SUCC;\r
+\r
+            //timeout = 10000;\r
+            //while(timeout-- > 0);  \r
+            // Give time to watch to be on RX Mode\r
+            setTimer(WBSL_TIMEOUT_INDEX,1);\r
+            // Wait for either the Timeout or packet received flag\r
+            while(!timeout_table[WBSL_TIMEOUT_INDEX].flag);\r
+            // Reset timer so that next time it starts fresh\r
+            resetTimer(WBSL_TIMEOUT_INDEX);\r
+            \r
+\r
+            LED_ON;\r
+            transmitDMA(discoveryAck, sizeof(discoveryAck)); // Send discovery ACK to Watch\r
+            LED_OFF;\r
+\r
+            status = WBSL_LINK_SUCC;\r
+            wbsl_flag = WBSL_STATUS_LINKED;\r
+         }\r
+      }\r
+   }\r
+\r
+   return status;\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          sendInitPacket\r
+// @brief       Send the Init packet to the Watch, which contains the total packets to be received\r
+//              during the communication, it also waits for the ACK of the Init packet, if it is not\r
+//              received this function will be called again by the main process\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void sendInitPacket(void)\r
+{\r
+   u8 crcOk = 0;\r
+   // Initialize the INIT packet to be sent to the newly paired device\r
+   // initPacket[INIT_TOTAL_PACKETS_OFFSET] = totalPackets;\r
+   initPacket[ED_ADDRESS_OFFSET_TX] = ed_address;\r
+   // Test REMOVE\r
+   initPacket[5] = wbsl_number_of_retries;\r
+     \r
+   setTimer(WBSL_TIMEOUT_INDEX,TIMEOUT_FOR_ACK);\r
+   \r
+   //Wait until packet is ready to be sent or timeout\r
+   while(packet_ready_flag != WBSL_PACKET_FULL && !timeout_table[WBSL_TIMEOUT_INDEX].flag );\r
+    \r
+   /* Check if the timeout happened before the packet was full,\r
+    * if so, trigger the update to stop, there is an error in communication between \r
+    * GUI and Dongle has ocurred or a manual stop has been triggered\r
+    */\r
+   if(packet_ready_flag != WBSL_PACKET_FULL)\r
+   {\r
+      setFlag(wbsl_flag, WBSL_TRIGGER_STOP);\r
+      return;\r
+   }\r
+   // Reset timer so that next time it starts fresh\r
+   resetTimer(WBSL_TIMEOUT_INDEX);\r
+     \r
+   LED_ON;                                                  // Mark Initiate Transmit\r
+   transmitDMA(initPacket, sizeof( initPacket));\r
+   LED_OFF;                                               //Turn off led after packet sent\r
+   rxModeOn();              // Turn on RX Mode to wait for the Discovery ACK package\r
+\r
+   // Set timeout to receive\r
+   setTimer(WBSL_TIMEOUT_INDEX,TIMEOUT_FOR_ACK);\r
+   // Wait for either the Timeout or packet received flag\r
+   while(!timeout_table[WBSL_TIMEOUT_INDEX].flag && rxtx_flag != WBSL_RXTX_RECEIVED);\r
+\r
+   // Reset timer so that next time it starts fresh\r
+   resetTimer(WBSL_TIMEOUT_INDEX);\r
+\r
+   // Radio off during decoding\r
+   rxModeOff();\r
+\r
+    //Check if packet was received\r
+   if(rxtx_flag == WBSL_RXTX_RECEIVED)\r
+   {\r
+      // Get CRC Status, which is appended in the last bit of the 2nd byte of the status bytes\r
+      crcOk = RxBuffer[RxBuffer[0] + WBSL_CRC_STATUS_OFFSET] & CRC_STATUS;\r
+      // Clear RX Flag\r
+      rxtx_flag = 0;\r
+      if(RxBuffer[AP_ADDRESS_OFFSET_RX] == WBSL_AP_ADDRESS &&\r
+         RxBuffer[ED_ADDRESS_OFFSET_RX] == ed_address &&\r
+         RxBuffer[ED_ADDRESS_OFFSET_RX + 1] == WBSL_ACK_SUCC &&\r
+         crcOk)\r
+      {\r
+         // Reset the retry counter for ACKs\r
+         wbsl_number_of_retries = 0;\r
+         initOk = 1;\r
+            \r
+         // Flag that the buffer is ready to be filled again\r
+         packet_ready_flag = WBSL_PACKET_EMPTY;\r
+         // Trigger GUI to send first data packet\r
+         wbsl_packet_flag = WBSL_SEND_NEW_DATA_PACKET;\r
+      }\r
+   }\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          sendDataPacket\r
+// @brief       Send the next data packet to the watch and waits for the ACK, if received it triggers\r
+//              the GUI to send the next packet to be sent to the watch, if not, the same packet will\r
+//              be sent again the next time this function is called\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void sendDataPacket(void)\r
+{\r
+   u8 crcOk = 0;\r
+   // Change the needed fields for the TX Buffer\r
+   TxBuffer[CURRENT_PACKET_NR_OFFSET] = (currentPacket >> 8) & 0xFF;\r
+   TxBuffer[CURRENT_PACKET_NR_OFFSET + 1] = currentPacket & 0xFF;\r
+    \r
+   // Address the packet to the Watch we're synched to\r
+   TxBuffer[ED_ADDRESS_OFFSET_TX] = ed_address;\r
+   \r
+   setTimer(WBSL_TIMEOUT_INDEX,TIMEOUT_FOR_ACK);\r
+    \r
+   //Wait until packet is ready to be sent or timeout\r
+   while(packet_ready_flag != WBSL_PACKET_FULL && !timeout_table[WBSL_TIMEOUT_INDEX].flag );\r
+    \r
+   /* Check if the timeout happened before the packet was full,\r
+    * if so, trigger the update to stop, there is an error in communication between \r
+    * GUI and Dongle has ocurred or a manual stop has been triggered\r
+    */\r
+   if(packet_ready_flag != WBSL_PACKET_FULL)\r
+   {\r
+      setFlag(wbsl_flag, WBSL_TRIGGER_STOP);\r
+      return;\r
+   }\r
+   // Reset timer so that next time it starts fresh\r
+   resetTimer(WBSL_TIMEOUT_INDEX);\r
+   \r
+   // Send packet to ED\r
+   LED_ON;\r
+   transmitDMA(TxBuffer,TxBuffer[0]+1);\r
+   LED_OFF;     //Transmit Complete\r
+\r
+   rxModeOn();              // Turn on RX Mode to wait for the ACK package\r
+\r
+   // Set timeout to receive ACK\r
+   setTimer(WBSL_TIMEOUT_INDEX,TIMEOUT_FOR_ACK);\r
+   // Wait for either the Timeout or packet received flag\r
+   while(!timeout_table[WBSL_TIMEOUT_INDEX].flag && rxtx_flag != WBSL_RXTX_RECEIVED);\r
+\r
+   // Radio off during decoding\r
+   rxModeOff();\r
+\r
+   // Reset timer so that next time it starts fresh\r
+   resetTimer(WBSL_TIMEOUT_INDEX);\r
+\r
+   //Check if packet was received and check for status fields\r
+   if(rxtx_flag == WBSL_RXTX_RECEIVED)\r
+   {\r
+      // Get CRC Status, which is appended in the last bit of the 2nd byte of the status bytes\r
+      crcOk = RxBuffer[RxBuffer[0] + WBSL_CRC_STATUS_OFFSET] & CRC_STATUS;\r
+\r
+      // Clear RX Flag\r
+      rxtx_flag = 0;\r
+      if(RxBuffer[AP_ADDRESS_OFFSET_RX] == WBSL_AP_ADDRESS &&\r
+         RxBuffer[ED_ADDRESS_OFFSET_RX] == ed_address &&\r
+         RxBuffer[ED_ADDRESS_OFFSET_RX + 1] == WBSL_ACK_SUCC &&\r
+         RxBuffer[ED_ADDRESS_OFFSET_RX + 2] == ((currentPacket >> 8) &  0x7F) &&\r
+         RxBuffer[ED_ADDRESS_OFFSET_RX + 3] ==  (currentPacket & 0xFF) &&\r
+         crcOk)\r
+      {\r
+         // Reset the retry counter for ACKs\r
+         wbsl_number_of_retries = 0;\r
+         currentPacket++;\r
+         wbsl_status = (currentPacket*100)/total_packets;\r
+         // Trigger GUI to send next data packet\r
+         wbsl_packet_flag = WBSL_SEND_NEW_DATA_PACKET;\r
+\r
+         // Flag that the buffer is ready to be filled again\r
+         packet_ready_flag = WBSL_PACKET_EMPTY;\r
+      }\r
+   }\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          wbsl_sendPacket\r
+// @brief       This function handles the sending of the different packets that conform the whole\r
+//              firmware download, it checks if a packet is ready to be sent and sends it, it also waits\r
+//              for the ACK of the packet or a timeout, in the latter case when called again, it will send\r
+//              the same packet.\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void wbsl_sendPacket(void)\r
+{\r
+   // Increment the number of retries to send a packet\r
+   wbsl_number_of_retries++;\r
+    \r
+   // Check if too many retries for one packet have been already made\r
+   if(wbsl_number_of_retries > WBSL_MAXIMUM_RETRIES)\r
+   {\r
+      // Trigger the stop of the WBSL Update procedure\r
+      setFlag(wbsl_flag, WBSL_TRIGGER_STOP);\r
+      setFlag(wbsl_flag, WBSL_STATUS_ERROR);\r
+      return;\r
+   }\r
+   \r
+   if(!initOk)\r
+   {\r
+      // Send the init packet\r
+      sendInitPacket();\r
+   }\r
+   else if(currentPacket < total_packets)\r
+   {\r
+      // Send a regular data packet\r
+      sendDataPacket();\r
+   }\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          wbsl_reset\r
+// @brief       Reset variables needed for the WBSL\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void wbsl_reset(void)\r
+{\r
+   wbsl_number_of_retries = 0;\r
+   wbsl_status = 0;\r
+   wbsl_flag = WBSL_STATUS_LINKING;\r
+   // Initialize the packet status flag so that GUI knows when it needs to send next packet\r
+   wbsl_packet_flag = WBSL_DISABLED;  \r
+   currentPacket = 0;\r
+   total_packets = 0;\r
+   packet_ready_flag = WBSL_PACKET_EMPTY;\r
+   initOk = 0;\r
+   //Initialize the RX Flag\r
+   rxtx_flag = 0;\r
+}\r
+\r
+// *************************************************************************************************\r
+// @fn          wbsl_main\r
+// @brief       This is the main routine, which calls the Link function, if succesfull, it keeps calling\r
+//              the sendPacket function until all packages has been sent, it also checks for the wbsl_flag\r
+//              in case the procedure is stopped before completing the download, either manually or due to an \r
+//              error\r
+// @param       none\r
+// @return      none\r
+// *************************************************************************************************\r
+void wbsl_main(void)\r
+{\r
+   //u32 txDelay;\r
+\r
+   // Assign DMA Configuration Struct to the DMA Channel 0\r
+   DMA0CFGH = HIBYTE( &dmachs );\r
+   DMA0CFGL = LOBYTE( &dmachs );\r
+    \r
+   // Initialize used variables\r
+   wbsl_reset();\r
+    \r
+   //Init TX Buffer\r
+   TxBuffer[0] = sizeof(TxBuffer) - 1;  // Substract the length field (1 byte)\r
+   TxBuffer[AP_ADDRESS_OFFSET_TX] = WBSL_AP_ADDRESS; // Include my address in all packets\r
+\r
+   //Update WBSL Flag\r
+   wbsl_flag = WBSL_STATUS_LINKING;\r
+\r
+   //Enable/Disable all the needed RF interrupts\r
+   INT_ENABLE(INUM_RFTXRX, INT_OFF);        // Disable RXTX Interrupt\r
+   INT_ENABLE(INUM_RF, INT_ON);            // Enable General RF Interrupt\r
+\r
+   LED_OFF;\r
+\r
+   wNumCurrentPeers = 0;\r
+\r
+   wbsl_status = 0;\r
+    \r
+   // Make sure radio is in IDLE Mode before starting\r
+   rxModeOff();\r
+\r
+   while(1)\r
+   {\r
+      if(!wNumCurrentPeers)\r
+      {\r
+         rxModeOn();              // Turn on RX Mode to wait for the Discovery package\r
+         //First try pairing with an End Device\r
+         while(1)\r
+         {\r
+            // Try to link with an end device\r
+            if(wbsl_link() == WBSL_LINK_SUCC)\r
+            {\r
+               wbsl_flag = WBSL_STATUS_LINKED;\r
+               //Keep track of how many peers are connected\r
+               wNumCurrentPeers++;\r
+               // Trigger GUI to send first info packet (total bytes of file)\r
+               wbsl_packet_flag = WBSL_SEND_INFO_PACKET;\r
+               rxModeOff();              // Turn off RX Mode after succesfully linking with ED\r
+               break;\r
+            }\r
+\r
+            // If GUI has triggered to stop WBSL, do so\r
+            if(getFlag(wbsl_flag,WBSL_TRIGGER_STOP))\r
+            {\r
+               break;\r
+            }\r
+         }\r
+      }\r
+      \r
+      // If GUI or Watch has triggered to stop WBSL, do so, but leave everything\r
+      // in a workable state.\r
+      if(getFlag(wbsl_flag,WBSL_TRIGGER_STOP))\r
+      {\r
+         // Immediately turn off RF interrupts\r
+         INT_ENABLE(INUM_RFTXRX, INT_OFF);\r
+         INT_ENABLE(INUM_RF, INT_OFF);\r
+         RFIM &= ~IRQ_DONE;                       // Disable Packet Received/Transmitted Interrupt\r
+         RFIF = 0;                               // Clear Interrupts\r
+         //Put radio in Idle mode\r
+         rxModeOff();\r
+          \r
+         break;\r
+      }\r
+      \r
+      //Keep downloading update image\r
+      if (currentPacket < total_packets || !initOk)\r
+      {  \r
+        // txDelay = 6000;\r
+        // while(txDelay-->0);\r
+         wbsl_sendPacket();    // Send the packet\r
+         \r
+         // Delay to give time to watch to be in RX after sending ACK\r
+         setTimer(WBSL_TIMEOUT_INDEX,1);\r
+         // Wait for either the Timeout or packet received flag\r
+         while(!timeout_table[WBSL_TIMEOUT_INDEX].flag);\r
+         // Reset timer so that next time it starts fresh\r
+         resetTimer(WBSL_TIMEOUT_INDEX);  \r
+      }\r
+\r
+      //If the update has complete, finish the Transmission and turn off WBSL\r
+      if(update_complete || currentPacket >= total_packets)\r
+      {\r
+         setFlag(wbsl_flag, WBSL_TRIGGER_STOP);\r
+      }\r
+   }\r
+    \r
+   wNumCurrentPeers = 0;\r
+   // Set timeout to receive ACK\r
+   // This is to allow the GUI to read the last progress status in case it reached 100\r
+   setTimer(WBSL_TIMEOUT_INDEX,300);\r
+   while(!timeout_table[WBSL_TIMEOUT_INDEX].flag);\r
+   // Reset timer before exiting\r
+   resetTimer(WBSL_TIMEOUT_INDEX);\r
+}
\ No newline at end of file
diff --git a/chronos-ti/Software Projects/RF Access Point/IAR/wbsl/wbsl.h b/chronos-ti/Software Projects/RF Access Point/IAR/wbsl/wbsl.h
new file mode 100755 (executable)
index 0000000..97a7a72
--- /dev/null
@@ -0,0 +1,213 @@
+// *************************************************************************************************\r
+//\r
+//     Copyright (C) 2010 Texas Instruments Incorporated - http://www.ti.com/\r
+//     \r
+//     \r
+//       Redistribution and use in source and binary forms, with or without\r
+//       modification, are permitted provided that the following conditions\r
+//       are met:\r
+//     \r
+//         Redistributions of source code must retain the above copyright\r
+//         notice, this list of conditions and the following disclaimer.\r
+//     \r
+//         Redistributions in binary form must reproduce the above copyright\r
+//         notice, this list of conditions and the following disclaimer in the\r
+//         documentation and/or other materials provided with the\r
+//         distribution.\r
+//     \r
+//         Neither the name of Texas Instruments Incorporated nor the names of\r
+//         its contributors may be used to endorse or promote products derived\r
+//         from this software without specific prior written permission.\r
+//     \r
+//       THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+//       "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+//       LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+//       A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+//       OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+//       SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+//       LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+//       DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+//       THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+//       (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+//       OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+//\r
+// *************************************************************************************************\r
+\r
+#ifndef __WBSL_H\r
+#define __WBSL_H\r
+\r
+#include <ioCC1111.h>\r
+\r
+//#define CCA_MODE\r
+\r
+// *************************************************************************************************\r
+// Defines section\r
+#define BIT0                   (0x0001)\r
+#define BIT1                   (0x0002)\r
+#define BIT2                   (0x0004)\r
+#define BIT3                   (0x0008)\r
+#define BIT4                   (0x0010)\r
+#define BIT5                   (0x0020)\r
+#define BIT6                   (0x0040)\r
+#define BIT7                   (0x0080)\r
+#define BIT8                   (0x0100)\r
+#define BIT9                   (0x0200)\r
+#define BITA                   (0x0400)\r
+#define BITB                   (0x0800)\r
+#define BITC                   (0x1000)\r
+#define BITD                   (0x2000)\r
+#define BITE                   (0x4000)\r
+#define BITF                   (0x8000)\r
+\r
+\r
+// Macros\r
+#define getFlag(val, flag)                         ((val&flag)==flag)\r
+#define setFlag(val, flag)                         (val|=flag)\r
+#define clearFlag(val, flag)                       (val&=(~flag))\r
+#define toggleFlag(val, flag)                      (val^=flag)\r
+\r
+\r
+typedef struct {\r
+   unsigned int counter;\r
+   unsigned int timeout;\r
+   unsigned char flag;\r
+}TIMER_TABLE_ENTRY;\r
+\r
+/* bit value */\r
+#ifndef BV\r
+#define BV(n)      (1 << (n))\r
+#endif\r
+\r
+#define WBSL_AP_ADDRESS                             (0xCA)\r
+#define WBSL_MAX_PAYLOAD_LENGTH                     (247u)\r
+\r
+#if WBSL_MAX_PAYLOAD_LENGTH < 50\r
+#error "MAXIMUM PAYLOAD CANNOT BE LOWER TO 50 BYTES, DUE TO PROTOCOL TIMING CONSTRAINTS"\r
+#elif WBSL_MAX_PAYLOAD_LENGTH > 247\r
+#error "MAXIMUM PAYLOAD CANNOT BE HIGHER THAN 247 BYTES.\r
+#endif\r
+\r
+#define WBSL_OVERHEAD_LENGTH                        (6u)\r
+#define WBSL_TOTAL_LENGTH                           WBSL_MAX_PAYLOAD_LENGTH + WBSL_OVERHEAD_LENGTH\r
+#define DISCOVERY_PAYLOAD_LENGTH                    (4u)\r
+#define DISCOVERY_OVERHEAD_LENGTH                   (3u)\r
+#define AP_ADDRESS_OFFSET_RX                        (1u)\r
+#define ED_ADDRESS_OFFSET_RX                        (2u)\r
+#define BATTERY_VOLTAGE_OFFSET                      (3u)\r
+\r
+#define WBSL_CRC_STATUS_OFFSET                      (2)\r
+#define CRC_STATUS                                  (0x80)\r
+\r
+#define WBSL_OPCODE_OFFSET                          (5u)\r
+\r
+#define AP_ADDRESS_OFFSET_TX                        (2u)\r
+#define ED_ADDRESS_OFFSET_TX                        (1u)\r
+\r
+#define DISCOVERY_ACK_OFFSET                        (3u)\r
+#define INIT_TOTAL_PACKETS_OFFSET                   (3u)\r
+#define CURRENT_PACKET_NR_OFFSET                    (3u)\r
+\r
+#define WBSL_TX_RES_FAILED                          (0)\r
+#define WBSL_TX_RES_SUCCESS                         (1u)\r
+\r
+#define WBSL_ACK_PKT_SIZE                           (5u)\r
+\r
+/* DMA channel number */\r
+#define WBSL_DMA_CHAN                               0\r
+#define DMA_ABORT                                   (0x80)\r
+\r
+// Battery end of life voltage threshold -> do not accept connection\r
+#define BATTERY_LOW_THRESHOLD                  (240u)\r
+\r
+// Flag for status information and external control through USB driver\r
+extern volatile unsigned char wbsl_flag;\r
+#define WBSL_STATUS_LINKING                        (BIT0)      \r
+#define WBSL_STATUS_LINKED                         (BIT1)\r
+#define WBSL_STATUS_ERROR                          (BIT2)\r
+#define WBSL_TRIGGER_SEND_DATA                             (BIT3)\r
+#define WBSL_TRIGGER_RECEIVED_DATA                 (BIT4)\r
+#define WBSL_TRIGGER_STOP                          (BIT5)\r
+#define WBSL_TRIGGER_SEND_CMD                       (BIT6)\r
+#define WBSL_LOW_BATT                               (BIT7)\r
+\r
+// Flag to check if a new packet is needed from the GUI\r
+extern volatile unsigned char wbsl_packet_flag;\r
+#define WBSL_DISABLED                               (BIT0)\r
+#define WBSL_PROCESSING_PACKET                      (BIT1)\r
+#define WBSL_SEND_INFO_PACKET                       (BIT2)\r
+#define WBSL_SEND_NEW_DATA_PACKET                   (BIT3)\r
+#define WBSL_ERROR                                  (BIT7)\r
+\r
+// Flag for status information, to see if WBSL is in RX/TX/IDLE mode\r
+extern volatile unsigned char wbslMode_flag;\r
+#define WBSL_IDLE_MODE                              (BIT0)\r
+#define WBSL_RX_MODE                                (BIT1)\r
+#define WBSL_TX_MODE                                (BIT2)\r
+\r
+extern volatile unsigned char rxtx_flag;\r
+#define WBSL_RXTX_RECEIVED                          (BIT0)\r
+#define WBSL_RXTX_SEND                              (BIT1)\r
+\r
+// Values for linking failed or successful\r
+#define WBSL_LINK_FAIL                              0\r
+#define WBSL_LINK_SUCC                              1\r
+\r
+// Values for Packet ACK\r
+#define WBSL_ACK_FAIL                               (0)\r
+#define WBSL_ACK_SUCC                               (1u)\r
+\r
+#define TIMEOUT_FOR_ACK                             (440)\r
+\r
+#define WBSL_MAXIMUM_RETRIES                        (5u)\r
+\r
+extern volatile unsigned char packet_ready_flag;\r
+#define WBSL_PACKET_EMPTY                           (BIT0)\r
+#define WBSL_PACKET_FILLING                         (BIT1)\r
+#define WBSL_PACKET_FULL                            (BIT2)\r
+#define WBSL_PACKET_ADDRESS                         (BIT3)\r
+\r
+//WBSL OP Code Type\r
+#define WBSL_INIT_PACKET                            0x00\r
+#define WBSL_ADDRESS_PACKET                         0x01\r
+#define WBSL_NORMAL_PACKET                          0x02\r
+\r
+#define ADDRESS_FLAG_BIT                            0x80\r
+\r
+#define MAX_TIMEOUT_TABLE_SIZE                      (1u)\r
+#define WBSL_TIMEOUT_INDEX                          (0u)\r
+\r
+// 1 = data in buffer, 0 = buffer empty\r
+extern unsigned char wbsl_sync_buffer_status;\r
+extern unsigned char ed_address;\r
+\r
+\r
+extern unsigned char wbsl_data[WBSL_MAX_PAYLOAD_LENGTH];\r
+extern unsigned char wbsl_status;\r
+extern unsigned char wbsl_txfifo_filled;\r
+\r
+extern unsigned long total_size_in_bytes;\r
+extern unsigned int total_packets;\r
+\r
+#define TX_SIZE                                       WBSL_TOTAL_LENGTH\r
+extern unsigned char TxBuffer[TX_SIZE];\r
+extern unsigned char initPacket[6];\r
+\r
+// Table that stores the timeout value, this will be used by Timer4 and WBSL.c to detect timeout in ACK\r
+extern TIMER_TABLE_ENTRY timeout_table[MAX_TIMEOUT_TABLE_SIZE];\r
+\r
+\r
+// Function Prototypes\r
+extern void wbsl_main(void);\r
+extern void wbsl_config(void);\r
+extern void wbsl_RfIsr(void);\r
+extern void wbsl_RfTxRxIsr(void);\r
+extern void wbsl_sendPacket(void);\r
+extern void wbsl_stopRadio(void);\r
+extern void wbsl_enableRadio(void);\r
+extern unsigned char wbsl_link(void);\r
+extern void wbsl_reset(void);\r
+\r
+extern void resetTimer(unsigned char index);\r
+extern void setTimer(unsigned char index, unsigned int timeout);\r
+\r
+#endif\r
diff --git a/chronos-ti/uninstall b/chronos-ti/uninstall
new file mode 100755 (executable)
index 0000000..ee7eacb
Binary files /dev/null and b/chronos-ti/uninstall differ